|
CP2K 2.4 (Revision 12889)
|
00001 !-----------------------------------------------------------------------------! 00002 ! CP2K: A general program to perform molecular dynamics simulations ! 00003 ! Copyright (C) 2000 - 2013 CP2K developers group ! 00004 !-----------------------------------------------------------------------------! 00005 00006 ! ***************************************************************************** 00012 MODULE qs_density_mixing_types 00013 00014 USE input_section_types, ONLY: section_vals_type,& 00015 section_vals_val_get 00016 USE kinds, ONLY: dp 00017 USE qs_rho_atom_types, ONLY: rho_atom_coeff 00018 USE qs_util, ONLY: exp_radius 00019 #include "cp_common_uses.h" 00020 00021 IMPLICIT NONE 00022 PRIVATE 00023 00024 LOGICAL, PRIVATE, PARAMETER :: debug_this_module=.TRUE. 00025 00026 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_density_mixing_types' 00027 00028 INTEGER, PARAMETER, PUBLIC :: no_mixing_nr=0, direct_mixing_nr=1, 00029 gspace_mixing_nr=2, pulay_mixing_nr=3, 00030 broyden_mixing_nr=4, 00031 broyden_mixing_new_nr=5, 00032 multisecant_mixing_nr=6 00033 PUBLIC :: cp_1d_z_p_type, mixing_storage_create, mixing_storage_type, mixing_storage_release 00034 00035 TYPE cp_1d_z_p_type 00036 COMPLEX(dp), DIMENSION(:), POINTER :: cc 00037 END TYPE cp_1d_z_p_type 00038 00039 00040 TYPE mixing_storage_type 00041 INTEGER :: ref_count, ig_max, ncall, nbuffer, n_simple_mix, nskip_mixing, p_metric_method 00042 INTEGER, POINTER, DIMENSION(:) :: ig_global_index 00043 LOGICAL, POINTER, DIMENSION(:) :: paw 00044 CHARACTER (len=15) :: iter_method 00045 REAL(dp) :: alpha, bconst, beta, broy_w0, max_g2, max_gvec_exp, pulay_alpha, pulay_beta, r_step, 00046 reg_par, sigma_max, wc, wmax 00047 REAL(dp), DIMENSION(:), POINTER :: p_metric 00048 REAL(KIND=dp), DIMENSION(:), POINTER :: kerker_factor 00049 REAL(KIND=dp), DIMENSION(:), POINTER :: special_metric 00050 REAL(dp), DIMENSION(:,:), POINTER :: weight 00051 REAL(KIND = dp) , DIMENSION(:,:), POINTER :: norm_res_buffer,pulay_matrix 00052 REAL(dp), DIMENSION(:,:,:), POINTER :: fmat, gmat, smat 00053 TYPE(cp_1d_z_p_type), DIMENSION(:), POINTER :: last_res, rhoin, rhoin_old 00054 TYPE(cp_1d_z_p_type), DIMENSION(:,:), POINTER :: delta_res, u_vec, z_vec 00055 TYPE(cp_1d_z_p_type), DIMENSION(:,:), POINTER ::drho_buffer, rhoin_buffer, 00056 res_buffer 00057 TYPE(rho_atom_coeff), DIMENSION(:,:), POINTER :: cpc_h_lastres, cpc_s_lastres 00058 TYPE(rho_atom_coeff), DIMENSION(:,:), POINTER :: cpc_h_in, cpc_s_in 00059 TYPE(rho_atom_coeff), DIMENSION(:,:), POINTER :: cpc_h_old, cpc_s_old 00060 TYPE(rho_atom_coeff), DIMENSION(:,:,:), POINTER :: dcpc_h_in, dcpc_s_in 00061 END TYPE mixing_storage_type 00062 00063 CONTAINS 00064 00065 ! ***************************************************************************** 00071 SUBROUTINE mixing_storage_create(mixing_store, mixing_section, mixing_method, ecut, error) 00072 TYPE(mixing_storage_type), POINTER :: mixing_store 00073 TYPE(section_vals_type), POINTER :: mixing_section 00074 INTEGER, INTENT(IN) :: mixing_method 00075 REAL(dp), INTENT(IN) :: ecut 00076 TYPE(cp_error_type), INTENT(inout) :: error 00077 00078 CHARACTER(len=*), PARAMETER :: routineN = 'mixing_storage_create', 00079 routineP = moduleN//':'//routineN 00080 00081 INTEGER :: stat 00082 LOGICAL :: failure 00083 REAL(dp) :: alpha, eps, gcut 00084 00085 failure=.FALSE. 00086 00087 CPPrecondition(.NOT.ASSOCIATED(mixing_store),cp_failure_level,routineP,error,failure) 00088 IF(.NOT. failure) THEN 00089 ALLOCATE(mixing_store, stat=stat) 00090 CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error) 00091 IF (.NOT.failure) THEN 00092 00093 mixing_store%ref_count=1 00094 mixing_store%nbuffer=0 00095 mixing_store%n_simple_mix=0 00096 mixing_store%ncall=0 00097 mixing_store%alpha=1.0_dp 00098 mixing_store%pulay_beta=1.0_dp 00099 mixing_store%beta=1.0_dp 00100 mixing_store%iter_method = "NoMix" 00101 mixing_store%max_g2 = 2._dp*ecut 00102 00103 NULLIFY(mixing_store%p_metric) 00104 NULLIFY(mixing_store%kerker_factor) 00105 NULLIFY(mixing_store%special_metric) 00106 NULLIFY(mixing_store%pulay_matrix) 00107 NULLIFY(mixing_store%weight) 00108 NULLIFY(mixing_store%fmat) 00109 NULLIFY(mixing_store%gmat) 00110 NULLIFY(mixing_store%smat) 00111 NULLIFY(mixing_store%last_res) 00112 NULLIFY(mixing_store%rhoin) 00113 NULLIFY(mixing_store%rhoin_old) 00114 NULLIFY(mixing_store%delta_res) 00115 NULLIFY(mixing_store%u_vec) 00116 NULLIFY(mixing_store%z_vec) 00117 NULLIFY(mixing_store%drho_buffer) 00118 NULLIFY(mixing_store%rhoin_buffer) 00119 NULLIFY(mixing_store%res_buffer) 00120 NULLIFY(mixing_store%norm_res_buffer) 00121 NULLIFY(mixing_store%ig_global_index) 00122 NULLIFY(mixing_store%paw) 00123 NULLIFY(mixing_store%cpc_h_in) 00124 NULLIFY(mixing_store%cpc_s_in) 00125 NULLIFY(mixing_store%cpc_h_old) 00126 NULLIFY(mixing_store%cpc_s_old) 00127 NULLIFY(mixing_store%dcpc_h_in) 00128 NULLIFY(mixing_store%dcpc_s_in) 00129 NULLIFY(mixing_store%cpc_h_lastres) 00130 NULLIFY(mixing_store%cpc_s_lastres) 00131 00132 CALL section_vals_val_get(mixing_section,"ALPHA",r_val=mixing_store%alpha,error=error) 00133 CALL section_vals_val_get(mixing_section,"BETA",r_val=mixing_store%beta,error=error) 00134 CALL section_vals_val_get(mixing_section,"N_SIMPLE_MIX",i_val=mixing_store%n_simple_mix,error=error) 00135 CALL section_vals_val_get(mixing_section,"NBUFFER",i_val=mixing_store%nbuffer,error=error) 00136 CALL section_vals_val_get(mixing_section,"NSKIP",i_val=mixing_store%nskip_mixing,error=error) 00137 CALL section_vals_val_get(mixing_section,"MAX_GVEC_EXP",r_val=mixing_store%max_gvec_exp,error=error) 00138 00139 IF(mixing_store%max_gvec_exp > 0._dp) THEN 00140 alpha = 0.25_dp/mixing_store%max_gvec_exp 00141 eps = 1.e-4_dp 00142 gcut = exp_radius(3,alpha,eps,1.0_dp) 00143 mixing_store%max_g2 = gcut*gcut 00144 END IF 00145 00146 SELECT CASE(mixing_method) 00147 CASE(gspace_mixing_nr) 00148 mixing_store%nbuffer = 1 00149 CASE(pulay_mixing_nr) 00150 CALL section_vals_val_get(mixing_section,"PULAY_ALPHA",r_val=mixing_store%pulay_alpha,error=error) 00151 CALL section_vals_val_get(mixing_section,"PULAY_BETA",r_val=mixing_store%pulay_beta,error=error) 00152 CASE(broyden_mixing_nr) 00153 CALL section_vals_val_get(mixing_section,"BROY_W0",r_val=mixing_store%broy_w0,error=error) 00154 mixing_store%bconst = 20.0_dp 00155 CASE(broyden_mixing_new_nr) 00156 CALL section_vals_val_get(mixing_section,"BROY_WREF",r_val=mixing_store%wc,error=error) 00157 CALL section_vals_val_get(mixing_section,"BROY_WMAX",r_val=mixing_store%wmax,error=error) 00158 mixing_store%bconst = 20.0_dp 00159 mixing_store%p_metric_method=1 00160 CASE(multisecant_mixing_nr) 00161 CALL section_vals_val_get(mixing_section,"REGULARIZATION",r_val=mixing_store%reg_par,error=error) 00162 CALL section_vals_val_get(mixing_section,"MAX_STEP",r_val=mixing_store%sigma_max,error=error) 00163 CALL section_vals_val_get(mixing_section,"R_FACTOR",r_val=mixing_store%r_step,error=error) 00164 END SELECT 00165 END IF 00166 END IF 00167 00168 END SUBROUTINE mixing_storage_create 00169 00170 ! ***************************************************************************** 00176 SUBROUTINE mixing_storage_release(mixing_store,error) 00177 TYPE(mixing_storage_type), POINTER :: mixing_store 00178 TYPE(cp_error_type), INTENT(inout) :: error 00179 00180 CHARACTER(len=*), PARAMETER :: routineN = 'mixing_storage_release', 00181 routineP = moduleN//':'//routineN 00182 00183 INTEGER :: i, j, k, stat 00184 LOGICAL :: failure 00185 00186 failure=.FALSE. 00187 00188 IF (ASSOCIATED(mixing_store)) THEN 00189 CPPreconditionNoFail(mixing_store%ref_count>0,cp_failure_level,routineP,error) 00190 mixing_store%ref_count=mixing_store%ref_count-1 00191 IF (mixing_store%ref_count==0) THEN 00192 00193 IF (ASSOCIATED(mixing_store%kerker_factor)) THEN 00194 DEALLOCATE(mixing_store%kerker_factor,stat=stat) 00195 CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error) 00196 ENDIF 00197 00198 IF (ASSOCIATED(mixing_store%special_metric)) THEN 00199 DEALLOCATE(mixing_store%special_metric,stat=stat) 00200 CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error) 00201 ENDIF 00202 00203 IF (ASSOCIATED(mixing_store%pulay_matrix)) THEN 00204 DEALLOCATE(mixing_store%pulay_matrix,stat=stat) 00205 CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error) 00206 ENDIF 00207 00208 IF (ASSOCIATED(mixing_store%rhoin_buffer)) THEN 00209 DO i = 1,SIZE(mixing_store%rhoin_buffer,2) 00210 DO j = 1,SIZE(mixing_store%rhoin_buffer,1) 00211 DEALLOCATE(mixing_store%rhoin_buffer(j,i)%cc,STAT=stat) 00212 CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error) 00213 END DO 00214 END DO 00215 DEALLOCATE(mixing_store%rhoin_buffer,stat=stat) 00216 CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error) 00217 ENDIF 00218 00219 IF (ASSOCIATED(mixing_store%paw)) THEN 00220 DEALLOCATE(mixing_store%paw,STAT=stat) 00221 CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error) 00222 END IF 00223 IF (ASSOCIATED(mixing_store%cpc_h_in)) THEN 00224 DO j = 1,SIZE(mixing_store%cpc_h_in,2) 00225 DO k = 1,SIZE(mixing_store%cpc_h_in,1) 00226 IF(ASSOCIATED(mixing_store%cpc_h_in(k,j)%r_coef)) THEN 00227 DEALLOCATE(mixing_store%cpc_h_in(k,j)%r_coef,STAT=stat) 00228 CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error) 00229 DEALLOCATE(mixing_store%cpc_s_in(k,j)%r_coef,STAT=stat) 00230 CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error) 00231 END IF 00232 END DO 00233 END DO 00234 DEALLOCATE(mixing_store%cpc_h_in,STAT=stat) 00235 CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error) 00236 DEALLOCATE(mixing_store%cpc_s_in,STAT=stat) 00237 CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error) 00238 END IF 00239 IF (ASSOCIATED(mixing_store%cpc_h_old)) THEN 00240 DO j = 1,SIZE(mixing_store%cpc_h_old,2) 00241 DO k = 1,SIZE(mixing_store%cpc_h_old,1) 00242 IF(ASSOCIATED(mixing_store%cpc_h_old(k,j)%r_coef)) THEN 00243 DEALLOCATE(mixing_store%cpc_h_old(k,j)%r_coef,STAT=stat) 00244 CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error) 00245 DEALLOCATE(mixing_store%cpc_s_old(k,j)%r_coef,STAT=stat) 00246 CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error) 00247 END IF 00248 END DO 00249 END DO 00250 DEALLOCATE(mixing_store%cpc_h_old,STAT=stat) 00251 CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error) 00252 DEALLOCATE(mixing_store%cpc_s_old,STAT=stat) 00253 CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error) 00254 END IF 00255 IF (ASSOCIATED(mixing_store%dcpc_h_in)) THEN 00256 DO i = 1,SIZE(mixing_store%dcpc_h_in,3) 00257 DO j = 1,SIZE(mixing_store%dcpc_h_in,2) 00258 DO k = 1,SIZE(mixing_store%dcpc_h_in,1) 00259 IF(ASSOCIATED(mixing_store%dcpc_h_in(k,j,i)%r_coef)) THEN 00260 DEALLOCATE(mixing_store%dcpc_h_in(k,j,i)%r_coef,STAT=stat) 00261 CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error) 00262 DEALLOCATE(mixing_store%dcpc_s_in(k,j,i)%r_coef,STAT=stat) 00263 CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error) 00264 END IF 00265 END DO 00266 END DO 00267 END DO 00268 DEALLOCATE(mixing_store%dcpc_h_in,STAT=stat) 00269 CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error) 00270 DEALLOCATE(mixing_store%dcpc_s_in,STAT=stat) 00271 CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error) 00272 END IF 00273 IF (ASSOCIATED(mixing_store%cpc_h_lastres)) THEN 00274 DO j = 1,SIZE(mixing_store%cpc_h_lastres,2) 00275 DO k = 1,SIZE(mixing_store%cpc_h_lastres,1) 00276 IF(ASSOCIATED(mixing_store%cpc_h_lastres(k,j)%r_coef)) THEN 00277 DEALLOCATE(mixing_store%cpc_h_lastres(k,j)%r_coef,STAT=stat) 00278 CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error) 00279 DEALLOCATE(mixing_store%cpc_s_lastres(k,j)%r_coef,STAT=stat) 00280 CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error) 00281 END IF 00282 END DO 00283 END DO 00284 DEALLOCATE(mixing_store%cpc_h_lastres,STAT=stat) 00285 CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error) 00286 DEALLOCATE(mixing_store%cpc_s_lastres,STAT=stat) 00287 CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error) 00288 ENDIF 00289 00290 IF (ASSOCIATED(mixing_store%res_buffer)) THEN 00291 DO i = 1,SIZE(mixing_store%res_buffer,2) 00292 DO j = 1,SIZE(mixing_store%res_buffer,1) 00293 DEALLOCATE(mixing_store%res_buffer(j,i)%cc,STAT=stat) 00294 CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error) 00295 END DO 00296 END DO 00297 DEALLOCATE(mixing_store%res_buffer,stat=stat) 00298 CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error) 00299 ENDIF 00300 00301 IF (ASSOCIATED(mixing_store%norm_res_buffer)) THEN 00302 DEALLOCATE(mixing_store%norm_res_buffer,stat=stat) 00303 CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error) 00304 ENDIF 00305 00306 IF (ASSOCIATED(mixing_store%ig_global_index)) THEN 00307 DEALLOCATE(mixing_store%ig_global_index,stat=stat) 00308 CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error) 00309 ENDIF 00310 00311 IF (ASSOCIATED(mixing_store%drho_buffer)) THEN 00312 DO i = 1,SIZE(mixing_store%drho_buffer,2) 00313 DO j = 1,SIZE(mixing_store%drho_buffer,1) 00314 DEALLOCATE(mixing_store%drho_buffer(j,i)%cc,STAT=stat) 00315 CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error) 00316 END DO 00317 END DO 00318 DEALLOCATE(mixing_store%drho_buffer,stat=stat) 00319 CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error) 00320 ENDIF 00321 00322 IF (ASSOCIATED(mixing_store%last_res)) THEN 00323 DO i = 1,SIZE(mixing_store%last_res) 00324 DEALLOCATE(mixing_store%last_res(i)%cc,STAT=stat) 00325 CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error) 00326 END DO 00327 DEALLOCATE(mixing_store%last_res,STAT=stat) 00328 CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error) 00329 END IF 00330 00331 IF (ASSOCIATED(mixing_store%rhoin)) THEN 00332 DO i = 1,SIZE(mixing_store%rhoin) 00333 DEALLOCATE(mixing_store%rhoin(i)%cc,STAT=stat) 00334 CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error) 00335 END DO 00336 DEALLOCATE(mixing_store%rhoin,STAT=stat) 00337 CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error) 00338 END IF 00339 00340 IF (ASSOCIATED(mixing_store%rhoin_old)) THEN 00341 DO i = 1,SIZE(mixing_store%rhoin_old) 00342 DEALLOCATE(mixing_store%rhoin_old(i)%cc,STAT=stat) 00343 CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error) 00344 END DO 00345 DEALLOCATE(mixing_store%rhoin_old,STAT=stat) 00346 CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error) 00347 END IF 00348 00349 IF (ASSOCIATED(mixing_store%p_metric))THEN 00350 DEALLOCATE(mixing_store%p_metric, STAT=stat) 00351 CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error) 00352 END IF 00353 00354 IF (ASSOCIATED(mixing_store%weight))THEN 00355 DEALLOCATE(mixing_store%weight, STAT=stat) 00356 CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error) 00357 END IF 00358 00359 IF (ASSOCIATED(mixing_store%fmat))THEN 00360 DEALLOCATE(mixing_store%fmat, STAT=stat) 00361 CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error) 00362 END IF 00363 00364 IF (ASSOCIATED(mixing_store%delta_res))THEN 00365 DO i = 1,SIZE(mixing_store%delta_res,2) 00366 DO j = 1,SIZE(mixing_store%delta_res,1) 00367 DEALLOCATE(mixing_store%delta_res(j,i)%cc, STAT=stat) 00368 CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error) 00369 END DO 00370 END DO 00371 DEALLOCATE(mixing_store%delta_res,STAT=stat) 00372 CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error) 00373 END IF 00374 00375 IF (ASSOCIATED(mixing_store%u_vec))THEN 00376 DO i = 1,SIZE(mixing_store%u_vec,2) 00377 DO j = 1,SIZE(mixing_store%u_vec,1) 00378 DEALLOCATE(mixing_store%u_vec(j,i)%cc, STAT=stat) 00379 CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error) 00380 END DO 00381 END DO 00382 DEALLOCATE(mixing_store%u_vec,STAT=stat) 00383 CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error) 00384 END IF 00385 00386 IF (ASSOCIATED(mixing_store%z_vec))THEN 00387 DO i = 1,SIZE(mixing_store%z_vec,2) 00388 DO j = 1,SIZE(mixing_store%z_vec,1) 00389 DEALLOCATE(mixing_store%z_vec(j,i)%cc, STAT=stat) 00390 CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error) 00391 END DO 00392 END DO 00393 DEALLOCATE(mixing_store%z_vec,STAT=stat) 00394 CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error) 00395 END IF 00396 00397 DEALLOCATE(mixing_store, stat=stat) 00398 CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error) 00399 END IF 00400 NULLIFY(mixing_store) 00401 END IF 00402 00403 END SUBROUTINE mixing_storage_release 00404 00405 END MODULE qs_density_mixing_types
1.7.3