|
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 ! ***************************************************************************** 00015 MODULE scf_control_types 00016 00017 USE cp_output_handling, ONLY: cp_print_key_finished_output,& 00018 cp_print_key_unit_nr 00019 USE cp_units, ONLY: cp_unit_from_cp2k 00020 USE f77_blas 00021 USE input_constants, ONLY: & 00022 atomic_guess, core_guess, diag_ot, direct_p_mix, general_roks, & 00023 high_spin_roks, ot_algo_taylor_or_diag, outer_scf_becke_constraint, & 00024 outer_scf_ddapc_constraint, outer_scf_none, & 00025 outer_scf_optimizer_bisect, outer_scf_optimizer_diis, & 00026 outer_scf_optimizer_none, outer_scf_optimizer_sd, & 00027 outer_scf_s2_constraint, outer_scf_scp, smear_energy_window, & 00028 smear_fermi_dirac, smear_list 00029 USE input_cp2k_dft, ONLY: create_scf_section 00030 USE input_enumeration_types, ONLY: enum_i2c,& 00031 enumeration_type 00032 USE input_keyword_types, ONLY: keyword_get,& 00033 keyword_type 00034 USE input_section_types, ONLY: section_get_keyword,& 00035 section_release,& 00036 section_type,& 00037 section_vals_get,& 00038 section_vals_get_subs_vals,& 00039 section_vals_type,& 00040 section_vals_val_get 00041 USE kinds, ONLY: dp 00042 USE qs_ot_types, ONLY: ot_readwrite_input,& 00043 qs_ot_settings_init,& 00044 qs_ot_settings_type 00045 USE termination, ONLY: stop_program 00046 USE timings, ONLY: timeset,& 00047 timestop 00048 #include "cp_common_uses.h" 00049 00050 IMPLICIT NONE 00051 00052 PRIVATE 00053 00054 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'scf_control_types' 00055 LOGICAL, PRIVATE, PARAMETER :: debug_this_module = .TRUE. 00056 00057 INTEGER, SAVE :: last_scf_c_id_nr = 0 00058 00059 ! Public data types 00060 00061 PUBLIC :: outer_scf_control_type,& 00062 scf_control_type,& 00063 smear_type,& 00064 diagonalization_type 00065 00066 ! Public subroutines 00067 00068 PUBLIC :: scf_c_create,& 00069 scf_c_read_parameters,& 00070 scf_c_release,& 00071 scf_c_retain,& 00072 scf_c_write_parameters,& 00073 init_smear, read_smear_section 00074 00075 ! ***************************************************************************** 00096 00097 TYPE outer_scf_control_type 00098 LOGICAL :: have_scf 00099 INTEGER :: max_scf 00100 REAL(KIND=dp) :: eps_scf,step_size 00101 INTEGER :: TYPE 00102 INTEGER :: optimizer 00103 INTEGER :: diis_buffer_length 00104 INTEGER :: extrapolation_order 00105 INTEGER :: bisect_trust_count 00106 END TYPE outer_scf_control_type 00107 00108 TYPE smear_type 00109 LOGICAL :: do_smear 00110 LOGICAL :: common_mu 00111 INTEGER :: method 00112 REAL(KIND=dp) :: electronic_temperature, 00113 fixed_mag_mom, 00114 eps_fermi_dirac, 00115 window_size 00116 REAL(KIND=dp), DIMENSION(:), POINTER :: list 00117 END TYPE smear_type 00118 00119 TYPE diagonalization_type 00120 INTEGER :: method 00121 REAL(KIND=dp) :: eps_jacobi 00122 REAL(KIND=dp) :: jacobi_threshold 00123 INTEGER :: max_iter, nkrylov, nblock_krylov 00124 REAL(KIND=dp) :: eps_iter 00125 REAL(KIND=dp) :: eps_adapt 00126 TYPE(qs_ot_settings_type) :: ot_settings 00127 END TYPE diagonalization_type 00128 00129 TYPE scf_control_type 00130 TYPE(outer_scf_control_type) :: outer_scf 00131 TYPE(smear_type), POINTER :: smear 00132 TYPE(diagonalization_type) :: diagonalization 00133 INTEGER :: density_guess, mixing_method 00134 REAL(KIND=dp) :: eps_eigval,eps_scf,eps_scf_hist, 00135 level_shift, 00136 eps_lumos,eps_diis 00137 INTEGER :: max_iter_lumos, max_diis, nmixing 00138 INTEGER :: max_scf,nrow_block,max_scf_hist, 00139 ncol_block,maxl,nkind 00140 LOGICAL :: do_diag_sub,gradient_functional,gth_potential_present, 00141 use_cholesky,use_ot,use_diag,do_outer_scf_reortho 00142 INTEGER :: ref_count,id_nr 00143 INTEGER, DIMENSION(2) :: added_mos 00144 INTEGER :: roks_scheme 00145 REAL(KIND=dp) :: roks_f 00146 REAL(KIND=dp), DIMENSION(0:2,0:2,1:2) :: roks_parameter 00147 END TYPE scf_control_type 00148 00149 CONTAINS 00150 00151 ! ***************************************************************************** 00161 SUBROUTINE scf_c_create(scf_control,error) 00162 00163 TYPE(scf_control_type), POINTER :: scf_control 00164 TYPE(cp_error_type), INTENT(inout) :: error 00165 00166 CHARACTER(LEN=*), PARAMETER :: routineN = 'scf_c_create', 00167 routineP = moduleN//':'//routineN 00168 00169 INTEGER :: handle, stat 00170 LOGICAL :: failure 00171 00172 CALL timeset(routineN,handle) 00173 00174 failure = .FALSE. 00175 00176 ALLOCATE (scf_control,STAT=stat) 00177 CPPostcondition((stat == 0),cp_failure_level,routineP,error,failure) 00178 00179 IF (.NOT.failure) THEN 00180 00181 ! Load the default values 00182 00183 scf_control%density_guess = atomic_guess 00184 scf_control%eps_eigval = 1.0E-5_dp 00185 scf_control%eps_scf = 1.0E-5_dp 00186 scf_control%eps_scf_hist = 0.0_dp 00187 scf_control%eps_lumos = 1.0E-5_dp 00188 scf_control%max_iter_lumos = 2999 00189 scf_control%eps_diis = 0.1_dp 00190 scf_control%level_shift = 0.0_dp 00191 scf_control%max_diis = 4 00192 scf_control%max_scf = 50 00193 scf_control%nrow_block = 32 00194 scf_control%ncol_block = 32 00195 scf_control%nmixing = 2 00196 scf_control%use_cholesky = .TRUE. 00197 scf_control%use_diag = .TRUE. 00198 scf_control%do_diag_sub = .FALSE. 00199 scf_control%use_ot = .FALSE. 00200 scf_control%do_outer_scf_reortho = .TRUE. 00201 scf_control%max_diis = 4 00202 scf_control%eps_diis = 0.1_dp 00203 scf_control%ref_count=1 00204 scf_control%id_nr=last_scf_c_id_nr 00205 scf_control%added_mos(:) = 0 00206 scf_control%max_scf_hist = 0 00207 00208 !Mixing 00209 scf_control%mixing_method = direct_p_mix 00210 00211 ! Diagonalization 00212 scf_control%diagonalization%method = 0 00213 scf_control%diagonalization%eps_jacobi = 0.0_dp 00214 scf_control%diagonalization%jacobi_threshold = 1.0E-7_dp 00215 scf_control%diagonalization%max_iter = 0 00216 scf_control%diagonalization%eps_iter = 0.0_dp 00217 scf_control%diagonalization%eps_adapt = 0.0_dp 00218 scf_control%diagonalization%nkrylov = 0 00219 scf_control%diagonalization%nblock_krylov = 0 00220 CALL qs_ot_settings_init(scf_control%diagonalization%ot_settings) 00221 00222 ! ROKS 00223 00224 scf_control%roks_scheme = high_spin_roks 00225 scf_control%roks_f = 0.5_dp 00226 00227 ! Initialize the diagonal blocks with the default ROKS parameters 00228 ! 0 = v)irtual, 1 = o)pen shell, 2 = c)losed shell 00229 00230 scf_control%roks_parameter(0,0,1) = 1.5_dp ! avv 00231 scf_control%roks_parameter(0,0,2) = -0.5_dp ! bvv 00232 scf_control%roks_parameter(1,1,1) = 0.5_dp ! aoo 00233 scf_control%roks_parameter(1,1,2) = 0.5_dp ! boo 00234 scf_control%roks_parameter(2,2,1) = -0.5_dp ! acc 00235 scf_control%roks_parameter(2,2,2) = 1.5_dp ! bcc 00236 00237 ! Initialize off-diagonal blocks (fixed) 00238 00239 scf_control%roks_parameter(0,1,1) = 1.0_dp ! avo 00240 scf_control%roks_parameter(0,1,2) = 0.0_dp ! bvo 00241 scf_control%roks_parameter(0,2,1) = 0.5_dp ! avc 00242 scf_control%roks_parameter(0,2,2) = 0.5_dp ! bvc 00243 scf_control%roks_parameter(1,2,1) = 0.0_dp ! aoc 00244 scf_control%roks_parameter(1,2,2) = 1.0_dp ! boc 00245 00246 ! Symmetry enforces 00247 00248 scf_control%roks_parameter(1,0,1) = scf_control%roks_parameter(0,1,1) ! aov 00249 scf_control%roks_parameter(1,0,2) = scf_control%roks_parameter(0,1,2) ! bov 00250 scf_control%roks_parameter(2,0,1) = scf_control%roks_parameter(0,2,1) ! acv 00251 scf_control%roks_parameter(2,0,2) = scf_control%roks_parameter(0,2,2) ! bcv 00252 scf_control%roks_parameter(2,1,1) = scf_control%roks_parameter(1,2,1) ! aco 00253 scf_control%roks_parameter(2,1,2) = scf_control%roks_parameter(1,2,2) ! bco 00254 00255 ! Outer SCF default settings 00256 00257 scf_control%outer_scf%have_scf = .FALSE. 00258 scf_control%outer_scf%max_scf = 0 00259 scf_control%outer_scf%eps_scf = 0.0_dp 00260 scf_control%outer_scf%step_size = 0.0_dp 00261 scf_control%outer_scf%type = -1 00262 scf_control%outer_scf%optimizer = -1 00263 scf_control%outer_scf%diis_buffer_length = -1 00264 00265 ! Smearing of the MO occupations 00266 00267 NULLIFY(scf_control%smear) 00268 00269 last_scf_c_id_nr = last_scf_c_id_nr + 1 00270 00271 END IF 00272 00273 CALL timestop(handle) 00274 00275 END SUBROUTINE scf_c_create 00276 00277 ! ***************************************************************************** 00286 SUBROUTINE scf_c_retain(scf_control,error) 00287 00288 TYPE(scf_control_type), POINTER :: scf_control 00289 TYPE(cp_error_type), INTENT(inout) :: error 00290 00291 CHARACTER(LEN=*), PARAMETER :: routineN = 'scf_c_retain', 00292 routineP = moduleN//':'//routineN 00293 00294 LOGICAL :: failure 00295 00296 failure = .FALSE. 00297 00298 CPPrecondition(ASSOCIATED(scf_control),cp_failure_level,routineP,error,failure) 00299 00300 IF (.NOT.failure) THEN 00301 CPPrecondition(scf_control%ref_count > 0,cp_failure_level,routineP,error,failure) 00302 scf_control%ref_count = scf_control%ref_count + 1 00303 END IF 00304 00305 END SUBROUTINE scf_c_retain 00306 00307 ! ***************************************************************************** 00318 SUBROUTINE scf_c_release(scf_control,error) 00319 00320 TYPE(scf_control_type), POINTER :: scf_control 00321 TYPE(cp_error_type), INTENT(inout) :: error 00322 00323 CHARACTER(LEN=*), PARAMETER :: routineN = 'scf_c_release', 00324 routineP = moduleN//':'//routineN 00325 00326 INTEGER :: stat 00327 LOGICAL :: failure 00328 00329 failure = .FALSE. 00330 00331 IF (ASSOCIATED(scf_control)) THEN 00332 CPPrecondition(scf_control%ref_count>0,cp_failure_level,routineP,error,failure) 00333 scf_control%ref_count = scf_control%ref_count - 1 00334 IF (scf_control%ref_count < 1) THEN 00335 IF (ASSOCIATED(scf_control%smear%list)) THEN 00336 DEALLOCATE(scf_control%smear%list,stat=stat) 00337 CPPostcondition(stat==0,cp_warning_level,routineP,error,failure) 00338 ENDIF 00339 DEALLOCATE(scf_control%smear,stat=stat) 00340 CPPostcondition(stat==0,cp_warning_level,routineP,error,failure) 00341 DEALLOCATE(scf_control,stat=stat) 00342 CPPostcondition(stat==0,cp_warning_level,routineP,error,failure) 00343 END IF 00344 END IF 00345 00346 NULLIFY (scf_control) 00347 00348 END SUBROUTINE scf_c_release 00349 00350 ! ***************************************************************************** 00359 SUBROUTINE scf_c_read_parameters(scf_control,dft_section,error) 00360 00361 TYPE(scf_control_type), POINTER :: scf_control 00362 TYPE(section_vals_type), POINTER :: dft_section 00363 TYPE(cp_error_type), INTENT(inout) :: error 00364 00365 CHARACTER(LEN=*), PARAMETER :: routineN = 'scf_c_read_parameters', 00366 routineP = moduleN//':'//routineN 00367 00368 INTEGER :: cholesky_flag, handle, ialgo 00369 INTEGER, DIMENSION(:), POINTER :: added_mos 00370 LOGICAL :: do_mixing, failure 00371 REAL(KIND=dp), DIMENSION(:), POINTER :: roks_parameter 00372 TYPE(section_vals_type), POINTER :: mixing_section, 00373 outer_scf_section, 00374 scf_section, smear_section 00375 00376 CALL timeset(routineN,handle) 00377 00378 failure = .FALSE. 00379 CPPrecondition(ASSOCIATED(scf_control),cp_failure_level,routineP,error,failure) 00380 CPPrecondition((scf_control%ref_count > 0),cp_failure_level,routineP,error,failure) 00381 IF (.NOT.failure) THEN 00382 scf_section => section_vals_get_subs_vals(dft_section,"SCF",error=error) 00383 CALL section_vals_val_get(scf_section,"nrow_block",i_val=scf_control%nrow_block,error=error) 00384 CALL section_vals_val_get(scf_section,"ncol_block",i_val=scf_control%ncol_block,error=error) 00385 CALL section_vals_val_get(scf_section,"DIAGONALIZATION%_SECTION_PARAMETERS_",& 00386 l_val=scf_control%use_diag,error=error) 00387 IF(scf_control%use_diag) THEN 00388 CALL section_vals_val_get(scf_section,"DIAGONALIZATION%DIAG_SUB_SCF%_SECTION_PARAMETERS_",& 00389 l_val=scf_control%do_diag_sub,error=error) 00390 END IF 00391 CALL section_vals_val_get(scf_section,"OT%_SECTION_PARAMETERS_",l_val=scf_control%use_ot,error=error) 00392 IF ( scf_control%use_diag .AND. scf_control%use_ot ) THEN 00393 ! don't allow both options to be true 00394 CALL cp_assert(.FALSE.,cp_failure_level,cp_assertion_failed,& 00395 routineP,"Don't activate OT and Diagonaliztion together",error,failure) 00396 ELSEIF ( .NOT. (scf_control%use_diag .OR. scf_control%use_ot) ) THEN 00397 ! set default to diagonalization 00398 scf_control%use_diag = .TRUE. 00399 END IF 00400 CALL section_vals_val_get(scf_section,"OT%ALGORITHM",i_val=ialgo,error=error) 00401 scf_control%do_outer_scf_reortho = ialgo.EQ.ot_algo_taylor_or_diag 00402 CALL section_vals_val_get(scf_section,"SCF_GUESS",i_val=scf_control%density_guess,error=error) 00403 CALL section_vals_val_get(scf_section,"EPS_DIIS",r_val=scf_control%eps_diis,error=error) 00404 CALL section_vals_val_get(scf_section,"eps_eigval",r_val=scf_control%eps_eigval,error=error) 00405 CALL section_vals_val_get(scf_section,"cholesky",i_val=cholesky_flag,error=error) 00406 IF(cholesky_flag>0) THEN 00407 scf_control%use_cholesky = .TRUE. 00408 END IF 00409 CALL section_vals_val_get(scf_section,"eps_scf",r_val=scf_control%eps_scf,error=error) 00410 CALL section_vals_val_get(scf_section,"level_shift",r_val=scf_control%level_shift,error=error) 00411 CALL section_vals_val_get(scf_section,"max_diis",i_val=scf_control%max_diis,error=error) 00412 CALL section_vals_val_get(scf_section,"max_scf",i_val=scf_control%max_scf,error=error) 00413 00414 ! Diagonaliztion section 00415 IF ( scf_control%use_diag ) THEN 00416 CALL section_vals_val_get(scf_section,"DIAGONALIZATION%ALGORITHM",& 00417 i_val=scf_control%diagonalization%method,error=error) 00418 CALL section_vals_val_get(scf_section,"DIAGONALIZATION%EPS_JACOBI",& 00419 r_val=scf_control%diagonalization%eps_jacobi,error=error) 00420 CALL section_vals_val_get(scf_section,"DIAGONALIZATION%JACOBI_THRESHOLD",& 00421 r_val=scf_control%diagonalization%jacobi_threshold,error=error) 00422 CALL section_vals_val_get(scf_section,"DIAGONALIZATION%MAX_ITER",& 00423 i_val=scf_control%diagonalization%max_iter,error=error) 00424 CALL section_vals_val_get(scf_section,"DIAGONALIZATION%EPS_ITER",& 00425 r_val=scf_control%diagonalization%eps_iter,error=error) 00426 CALL section_vals_val_get(scf_section,"DIAGONALIZATION%EPS_ADAPT",& 00427 r_val=scf_control%diagonalization%eps_adapt,error=error) 00428 CALL section_vals_val_get(scf_section,"DIAGONALIZATION%KRYLOV%NKRYLOV",& 00429 i_val=scf_control%diagonalization%nkrylov,error=error) 00430 CALL section_vals_val_get(scf_section,"DIAGONALIZATION%KRYLOV%NBLOCK",& 00431 i_val=scf_control%diagonalization%nblock_krylov,error=error) 00432 IF ( scf_control%diagonalization%method == diag_ot ) THEN 00433 ! read OT section 00434 CALL ot_diag_read_input(scf_control%diagonalization%ot_settings,scf_section,error) 00435 END IF 00436 END IF 00437 00438 ! Read ROKS parameters 00439 CALL section_vals_val_get(scf_section,"ROKS_SCHEME",i_val=scf_control%roks_scheme,error=error) 00440 00441 SELECT CASE (scf_control%roks_scheme) 00442 CASE (general_roks) 00443 ! Read parameters for the general ROKS scheme 00444 CALL section_vals_val_get(scf_section,"ROKS_F",r_val=scf_control%roks_f,error=error) 00445 CASE (high_spin_roks) 00446 ! Read high-spin ROKS parameters for the diagonal block 00447 ! 0 = v)irtual, 1 = o)pen shell, 2 = c)losed shell 00448 NULLIFY (roks_parameter) 00449 CALL section_vals_val_get(scf_section,"ROKS_PARAMETERS",r_vals=roks_parameter,error=error) 00450 IF (ASSOCIATED(roks_parameter)) THEN 00451 scf_control%roks_parameter(2,2,1) = roks_parameter(1) ! acc 00452 scf_control%roks_parameter(2,2,2) = roks_parameter(2) ! bcc 00453 scf_control%roks_parameter(1,1,1) = roks_parameter(3) ! aoo 00454 scf_control%roks_parameter(1,1,2) = roks_parameter(4) ! boo 00455 scf_control%roks_parameter(0,0,1) = roks_parameter(5) ! avv 00456 scf_control%roks_parameter(0,0,2) = roks_parameter(6) ! bvv 00457 END IF 00458 END SELECT 00459 00460 ! should be moved to printkey 00461 CALL section_vals_val_get(scf_section,"eps_lumo",r_val=scf_control%eps_lumos,error=error) 00462 CALL section_vals_val_get(scf_section,"max_iter_lumo",i_val=scf_control%max_iter_lumos,error=error) 00463 00464 ! Extra MOs, e.g. for smearing 00465 CALL section_vals_val_get(scf_section,"added_mos",i_vals=added_mos,error=error) 00466 CPPrecondition(ASSOCIATED(added_mos),cp_failure_level,routineP,error,failure) 00467 IF (SIZE(added_mos) > 0) THEN 00468 scf_control%added_mos(1) = added_mos(1) 00469 IF (SIZE(added_mos) > 1) THEN 00470 scf_control%added_mos(2) = added_mos(2) 00471 END IF 00472 END IF 00473 00474 CALL section_vals_val_get(scf_section,"max_scf_history",i_val=scf_control%max_scf_hist,error=error) 00475 CALL section_vals_val_get(scf_section,"eps_scf_history",r_val=scf_control%eps_scf_hist,error=error) 00476 00477 IF (scf_control%level_shift /= 0.0_dp) scf_control%use_cholesky = .FALSE. 00478 IF (scf_control%use_ot.AND.(scf_control%density_guess == core_guess)) THEN 00479 CALL stop_program(routineN,moduleN,__LINE__,"Use GUESS {ATOMIC,RESTART,RANDOM} with OT") 00480 END IF 00481 00482 outer_scf_section => section_vals_get_subs_vals(scf_section,"OUTER_SCF",error=error) 00483 CALL section_vals_val_get(outer_scf_section,"_SECTION_PARAMETERS_",& 00484 l_val=scf_control%outer_scf%have_scf,error=error) 00485 IF (scf_control%outer_scf%have_scf) THEN 00486 CALL section_vals_val_get(outer_scf_section,"EPS_SCF",& 00487 r_val=scf_control%outer_scf%eps_scf,& 00488 error=error) 00489 CALL section_vals_val_get(outer_scf_section,"STEP_SIZE",& 00490 r_val=scf_control%outer_scf%step_size,& 00491 error=error) 00492 CALL section_vals_val_get(outer_scf_section,"DIIS_BUFFER_LENGTH",& 00493 i_val=scf_control%outer_scf%diis_buffer_length,& 00494 error=error) 00495 CALL section_vals_val_get(outer_scf_section,"BISECT_TRUST_COUNT",& 00496 i_val=scf_control%outer_scf%bisect_trust_count,& 00497 error=error) 00498 CALL section_vals_val_get(outer_scf_section,"TYPE",& 00499 i_val=scf_control%outer_scf%type,& 00500 error=error) 00501 CALL section_vals_val_get(outer_scf_section,"OPTIMIZER",& 00502 i_val=scf_control%outer_scf%optimizer,& 00503 error=error) 00504 CALL section_vals_val_get(outer_scf_section,"MAX_SCF",& 00505 i_val=scf_control%outer_scf%max_scf,& 00506 error=error) 00507 CALL section_vals_val_get(outer_scf_section,"EXTRAPOLATION_ORDER",& 00508 i_val=scf_control%outer_scf%extrapolation_order,& 00509 error=error) 00510 END IF 00511 00512 smear_section => section_vals_get_subs_vals(scf_section,"SMEAR",error=error) 00513 CALL init_smear(scf_control%smear,error) 00514 CALL read_smear_section(scf_control%smear, smear_section, error) 00515 00516 do_mixing = .FALSE. 00517 mixing_section => section_vals_get_subs_vals(scf_section,"MIXING",error=error) 00518 CALL section_vals_val_get(mixing_section,"_SECTION_PARAMETERS_",& 00519 l_val=do_mixing,& 00520 error=error) 00521 IF (do_mixing) THEN 00522 CALL section_vals_val_get(mixing_section,"METHOD",& 00523 i_val=scf_control%mixing_method,& 00524 error=error) 00525 CALL section_vals_val_get(mixing_section,"NMIXING",i_val=scf_control%nmixing,& 00526 error=error) 00527 END IF ! do mixing 00528 END IF ! failure 00529 00530 CALL timestop(handle) 00531 00532 END SUBROUTINE scf_c_read_parameters 00533 00534 SUBROUTINE init_smear(smear,error) 00535 TYPE(smear_type), POINTER :: smear 00536 TYPE(cp_error_type), INTENT(inout) :: error 00537 00538 CHARACTER(len=*), PARAMETER :: routineN = 'init_smear', 00539 routineP = moduleN//':'//routineN 00540 00541 INTEGER :: stat 00542 LOGICAL :: failure 00543 00544 failure=.FALSE. 00545 CPPrecondition(.NOT.ASSOCIATED(smear),cp_failure_level,routineP,error,failure) 00546 IF(.NOT. failure) THEN 00547 ALLOCATE(smear,stat=stat) 00548 CPPostcondition((stat == 0),cp_failure_level,routineP,error,failure) 00549 smear%do_smear = .FALSE. 00550 smear%method = smear_energy_window 00551 smear%electronic_temperature = 0.0_dp 00552 smear%eps_fermi_dirac = 1.0E-5_dp 00553 smear%fixed_mag_mom=-100.0_dp 00554 smear%window_size = 0.0_dp 00555 NULLIFY(smear%list) 00556 END IF 00557 END SUBROUTINE init_smear 00558 00559 SUBROUTINE read_smear_section(smear,smear_section,error) 00560 TYPE(smear_type), POINTER :: smear 00561 TYPE(section_vals_type), POINTER :: smear_section 00562 TYPE(cp_error_type), INTENT(inout) :: error 00563 00564 CHARACTER(len=*), PARAMETER :: routineN = 'read_smear_section', 00565 routineP = moduleN//':'//routineN 00566 00567 INTEGER :: stat 00568 LOGICAL :: failure 00569 REAL(KIND=dp), DIMENSION(:), POINTER :: r_vals 00570 00571 failure=.FALSE. 00572 NULLIFY(r_vals) 00573 00574 IF (.NOT.failure) THEN 00575 CALL section_vals_val_get(smear_section,"_SECTION_PARAMETERS_",& 00576 l_val=smear%do_smear,& 00577 error=error) 00578 IF (smear%do_smear) THEN 00579 CALL section_vals_val_get(smear_section,"METHOD",& 00580 i_val=smear%method,& 00581 error=error) 00582 CALL section_vals_val_get(smear_section,"ELECTRONIC_TEMPERATURE",& 00583 r_val=smear%electronic_temperature,& 00584 error=error) 00585 CALL section_vals_val_get(smear_section,"EPS_FERMI_DIRAC",& 00586 r_val=smear%eps_fermi_dirac,& 00587 error=error) 00588 CALL section_vals_val_get(smear_section,"WINDOW_SIZE",& 00589 r_val=smear%window_size,& 00590 error=error) 00591 IF (smear%method==smear_list) THEN 00592 CALL section_vals_val_get(smear_section,"LIST",& 00593 r_vals=r_vals,& 00594 error=error) 00595 CPPrecondition(ASSOCIATED(r_vals),cp_failure_level,routineP,error,failure) 00596 ALLOCATE(smear%list(SIZE(r_vals)),stat=stat) 00597 CPPostcondition(stat==0,cp_warning_level,routineP,error,failure) 00598 smear%list=r_vals 00599 END IF 00600 CALL section_vals_val_get(smear_section,"FIXED_MAGNETIC_MOMENT",& 00601 r_val=smear%fixed_mag_mom,& 00602 error=error) 00603 END IF ! do smear 00604 END IF 00605 END SUBROUTINE read_smear_section 00606 00607 ! ***************************************************************************** 00616 SUBROUTINE scf_c_write_parameters(scf_control,dft_section,error) 00617 00618 TYPE(scf_control_type), POINTER :: scf_control 00619 TYPE(section_vals_type), POINTER :: dft_section 00620 TYPE(cp_error_type), INTENT(inout) :: error 00621 00622 CHARACTER(LEN=*), PARAMETER :: routineN = 'scf_c_write_parameters', 00623 routineP = moduleN//':'//routineN 00624 00625 INTEGER :: handle, output_unit, 00626 roks_scheme 00627 LOGICAL :: failure, roks 00628 REAL(KIND=dp) :: elec_temp 00629 TYPE(cp_logger_type), POINTER :: logger 00630 TYPE(enumeration_type), POINTER :: enum 00631 TYPE(keyword_type), POINTER :: keyword 00632 TYPE(section_type), POINTER :: section 00633 TYPE(section_vals_type), POINTER :: scf_section 00634 00635 CALL timeset(routineN,handle) 00636 00637 failure = .FALSE. 00638 00639 NULLIFY (logger) 00640 logger => cp_error_get_logger(error) 00641 00642 NULLIFY (scf_section) 00643 NULLIFY (section) 00644 00645 CPPrecondition(ASSOCIATED(scf_control),cp_failure_level,routineP,error,failure) 00646 CPPrecondition(scf_control%ref_count>0,cp_failure_level,routineP,error,failure) 00647 00648 IF (.NOT.failure) THEN 00649 00650 scf_section => section_vals_get_subs_vals(dft_section,"SCF",error=error) 00651 output_unit = cp_print_key_unit_nr(logger,scf_section,"PRINT%PROGRAM_RUN_INFO",& 00652 extension=".scfLog",error=error) 00653 00654 IF (output_unit > 0) THEN 00655 00656 IF (scf_control%max_scf > 0) THEN 00657 00658 CALL create_scf_section(section,error=error) 00659 00660 keyword => section_get_keyword(section,"SCF_GUESS",error=error) 00661 CALL keyword_get(keyword,enum=enum,error=error) 00662 00663 WRITE (UNIT=output_unit,& 00664 FMT="(/,/,T2,A,T25,A,T51,A30,/,T25,56('-'),3(/,T25,A,T76,I5),/,"//& 00665 "T25,56('-'),4(/,T25,A,T72,ES9.2),/,T25,56('-'),"//& 00666 "1(/,T25,A,T76,F5.2))")& 00667 "SCF PARAMETERS",& 00668 "Density guess: ",ADJUSTR(TRIM(enum_i2c(enum,scf_control%density_guess,error=error))),& 00669 "max_scf: ",scf_control%max_scf,& 00670 "max_scf_history: ",scf_control%max_scf_hist,& 00671 "max_diis: ",scf_control%max_diis,& 00672 "eps_scf: ",scf_control%eps_scf,& 00673 "eps_scf_history: ",scf_control%eps_scf_hist,& 00674 "eps_diis: ",scf_control%eps_diis,& 00675 "eps_eigval: ",scf_control%eps_eigval,& 00676 "level_shift [a.u.]:",scf_control%level_shift 00677 IF ( SUM(scf_control%added_mos) > 0 ) THEN 00678 WRITE (UNIT=output_unit,FMT="(T25,A,T71,2I5)")& 00679 "added MOs ",scf_control%added_mos 00680 END IF 00681 00682 IF (scf_control%mixing_method>0 .AND. .NOT. scf_control%use_ot) THEN 00683 keyword => section_get_keyword(section,"MIXING%METHOD",error=error) 00684 CALL keyword_get(keyword,enum=enum,error=error) 00685 WRITE (UNIT=output_unit,FMT="(T25,A,/,T25,A,T51,A30)")& 00686 REPEAT("-",56),& 00687 "Mixing method: ",ADJUSTR(TRIM(enum_i2c(enum,scf_control%mixing_method,error=error))) 00688 IF(scf_control%mixing_method>1) THEN 00689 WRITE (UNIT=output_unit,FMT="(T47,A34)") "charge density mixing in g-space" 00690 END IF 00691 END IF 00692 IF (scf_control%smear%do_smear) THEN 00693 keyword => section_get_keyword(section,"SMEAR%METHOD",error=error) 00694 CALL keyword_get(keyword,enum=enum,error=error) 00695 WRITE (UNIT=output_unit,FMT="(T25,A,/,T25,A,T51,A30)")& 00696 REPEAT("-",56),& 00697 "Smear method: ",ADJUSTR(TRIM(enum_i2c(enum,scf_control%smear%method,error=error))) 00698 SELECT CASE (scf_control%smear%method) 00699 CASE (smear_fermi_dirac) 00700 elec_temp = cp_unit_from_cp2k(scf_control%smear%electronic_temperature,& 00701 "K",error=error) 00702 WRITE (UNIT=output_unit,FMT="(T25,A,T61,F20.1)")& 00703 "Electronic temperature [K]:",elec_temp 00704 WRITE (UNIT=output_unit,FMT="(T25,A,T71,ES10.2)")& 00705 "Electronic temperature [a.u.]:",scf_control%smear%electronic_temperature,& 00706 "Accuracy threshold:",scf_control%smear%eps_fermi_dirac 00707 IF(scf_control%smear%fixed_mag_mom>0.0_dp) WRITE (UNIT=output_unit,FMT="(T25,A,F10.5)")& 00708 "Spin channel alpha and spin channel beta are smeared independently, keeping "//& 00709 " fixed difference in number of electrons equal to ",scf_control%smear%fixed_mag_mom 00710 CASE (smear_energy_window) 00711 WRITE (UNIT=output_unit,FMT="(T25,A,T71,F10.6)")& 00712 "Smear window [a.u.]: ",scf_control%smear%window_size 00713 END SELECT 00714 END IF 00715 00716 CALL section_vals_val_get(dft_section,"ROKS",l_val=roks,error=error) 00717 IF (roks.AND.(.NOT.scf_control%use_ot)) THEN 00718 CALL section_vals_val_get(scf_section,"ROKS_SCHEME",& 00719 i_val=roks_scheme,error=error) 00720 keyword => section_get_keyword(section,"ROKS_SCHEME",error=error) 00721 CALL keyword_get(keyword,enum=enum,error=error) 00722 WRITE (UNIT=output_unit,FMT="(T25,A,/,T25,A,T51,A30)")& 00723 REPEAT("-",56),& 00724 "ROKS scheme:",ADJUSTR(TRIM(enum_i2c(enum,roks_scheme,error=error))) 00725 SELECT CASE (roks_scheme) 00726 CASE (general_roks) 00727 WRITE (UNIT=output_unit,FMT="(T25,A,T71,F10.6)")& 00728 "ROKS parameter f:",scf_control%roks_f 00729 CASE (high_spin_roks) 00730 WRITE (UNIT=output_unit,& 00731 FMT="(T25,A,6(/,T25,A,T71,F10.6))")& 00732 "ROKS parameters: a)lpha, b)eta; c)losed, o)pen, v)irtual",& 00733 "acc",scf_control%roks_parameter(2,2,1),& 00734 "bcc",scf_control%roks_parameter(2,2,2),& 00735 "aoo",scf_control%roks_parameter(1,1,1),& 00736 "boo",scf_control%roks_parameter(1,1,2),& 00737 "avv",scf_control%roks_parameter(0,0,1),& 00738 "bvv",scf_control%roks_parameter(0,0,2) 00739 END SELECT 00740 END IF 00741 CALL section_release(section,error=error) 00742 00743 IF (scf_control%outer_scf%have_scf) THEN 00744 WRITE (output_unit,"(T25,56('-'),/,T25,A)") "Outer loop SCF in use " 00745 SELECT CASE(scf_control%outer_scf%type) 00746 CASE (outer_scf_none) 00747 WRITE (output_unit,'(T25,A)') "No variables optimised in outer loop" 00748 CASE (outer_scf_ddapc_constraint) 00749 WRITE (output_unit,'(T25,A)') "DDAPC constraint enforced" 00750 CASE (outer_scf_s2_constraint) 00751 WRITE (output_unit,'(T25,A)') "S2 constraint enforced" 00752 CASE (outer_scf_becke_constraint) 00753 WRITE (output_unit,'(T25,A)') "Becke weight population constraint enforced" 00754 CASE (outer_scf_scp) 00755 WRITE (output_unit,'(T25,A)') "SCP optimization with outer loop enforced" 00756 CASE DEFAULT 00757 CPPrecondition(.FALSE.,cp_failure_level,routineP,error,failure) 00758 END SELECT 00759 WRITE (output_unit,'(T25,A,T72,ES9.2)') "eps_scf",scf_control%outer_scf%eps_scf 00760 WRITE (output_unit,'(T25,A,T72,I9)') "max_scf",scf_control%outer_scf%max_scf 00761 SELECT CASE(scf_control%outer_scf%optimizer) 00762 CASE (outer_scf_optimizer_none) 00763 WRITE (output_unit,'(T25,A)') "No outer loop optimization" 00764 CASE (outer_scf_optimizer_sd) 00765 WRITE (output_unit,'(T25,A)') "Steepest descent optimization" 00766 CASE (outer_scf_optimizer_bisect) 00767 WRITE (output_unit,'(T25,A)') "Gradient bisection" 00768 WRITE (output_unit,'(T25,A,T72,I9)') "bisect_trust_count",scf_control%outer_scf%bisect_trust_count 00769 CASE (outer_scf_optimizer_diis) 00770 WRITE (output_unit,'(T25,A)') "DIIS optimization" 00771 WRITE (output_unit,'(T25,A,T72,I9)') "DIIS buffer length", & 00772 scf_control%outer_scf%diis_buffer_length 00773 CASE DEFAULT 00774 CPPrecondition(.FALSE.,cp_failure_level,routineP,error,failure) 00775 END SELECT 00776 WRITE (output_unit,'(T25,A,T72,ES9.2)') "step_size",scf_control%outer_scf%step_size 00777 ELSE 00778 WRITE (output_unit,"(T25,56('-'),/,T25,A)") "No outer SCF" 00779 END IF 00780 00781 END IF ! max_scf > 0 00782 00783 END IF ! output_unit > 0 00784 00785 CALL cp_print_key_finished_output(output_unit,logger,scf_section,& 00786 "PRINT%PROGRAM_RUN_INFO",error=error) 00787 00788 END IF ! not failure 00789 00790 CALL timestop(handle) 00791 00792 END SUBROUTINE scf_c_write_parameters 00793 00794 ! ***************************************************************************** 00795 00796 SUBROUTINE ot_diag_read_input(settings,scf_section,error) 00797 TYPE(qs_ot_settings_type) :: settings 00798 TYPE(section_vals_type), POINTER :: scf_section 00799 TYPE(cp_error_type), INTENT(inout) :: error 00800 00801 CHARACTER(len=*), PARAMETER :: routineN = 'ot_diag_read_input', 00802 routineP = moduleN//':'//routineN 00803 00804 INTEGER :: handle, output_unit 00805 LOGICAL :: explicit, failure 00806 TYPE(cp_logger_type), POINTER :: logger 00807 TYPE(section_vals_type), POINTER :: ot_section 00808 00809 failure=.FALSE. 00810 00811 CALL timeset(routineN,handle) 00812 00813 logger => cp_error_get_logger(error) 00814 output_unit=cp_print_key_unit_nr(logger,scf_section,"PRINT%PROGRAM_RUN_INFO",& 00815 extension=".log",error=error) 00816 00817 ! decide default settings 00818 CALL qs_ot_settings_init(settings) 00819 00820 ! use ot input new style 00821 ot_section=>section_vals_get_subs_vals(scf_section,"DIAGONALIZATION%OT",error=error) 00822 CALL section_vals_get(ot_section,explicit=explicit,error=error) 00823 00824 CALL ot_readwrite_input(settings,ot_section,output_unit,error) 00825 00826 CALL cp_print_key_finished_output(output_unit,logger,scf_section,& 00827 "PRINT%PROGRAM_RUN_INFO", error=error) 00828 00829 CALL timestop(handle) 00830 00831 END SUBROUTINE ot_diag_read_input 00832 00833 ! ***************************************************************************** 00834 00835 END MODULE scf_control_types
1.7.3