51#include "./base/base_uses.f90"
57 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'scf_control_types'
58 LOGICAL,
PRIVATE,
PARAMETER :: debug_this_module = .true.
92 LOGICAL :: do_smear = .false.
93 LOGICAL :: common_mu = .false.
94 INTEGER :: method = -1
95 REAL(kind=
dp) :: electronic_temperature = -1.0_dp, &
96 fixed_mag_mom = -1.0_dp, &
97 eps_fermi_dirac = -1.0_dp, &
98 window_size = -1.0_dp, &
99 smearing_width = -1.0_dp
100 REAL(kind=
dp),
DIMENSION(:),
POINTER ::
list => null()
103 TYPE diagonalization_type
104 INTEGER :: method = -1
105 REAL(kind=
dp) :: eps_jacobi = -1.0_dp
106 REAL(kind=
dp) :: jacobi_threshold = -1.0_dp
107 INTEGER :: max_iter = -1, nkrylov = -1, nblock_krylov = -1
109 LOGICAL :: mom = .false., mom_didguess = .false.
110 INTEGER :: mom_proj_formula = -1
112 INTEGER,
DIMENSION(:),
POINTER :: mom_deocca => null(), mom_deoccb => null(), &
113 mom_occa => null(), mom_occb => null()
118 INTEGER :: mom_start = -1
119 INTEGER :: mom_type = -1
120 REAL(kind=
dp) :: eps_iter = -1.0_dp
121 REAL(kind=
dp) :: eps_adapt = -1.0_dp
123 END TYPE diagonalization_type
128 TYPE(diagonalization_type) :: diagonalization = diagonalization_type()
129 INTEGER :: density_guess = -1, mixing_method = -1
130 REAL(kind=
dp) :: eps_eigval = -1.0_dp, eps_scf = -1.0_dp, eps_scf_hist = -1.0_dp, &
131 level_shift = -1.0_dp, &
132 eps_lumos = -1.0_dp, eps_diis = -1.0_dp
133 INTEGER :: max_iter_lumos = -1, max_diis = -1, nmixing = -1
134 INTEGER :: max_scf = -1, max_scf_hist = -1, &
135 maxl = -1, nkind = -1
136 LOGICAL :: do_diag_sub = .false., &
137 use_cholesky = .false., use_ot = .false., &
138 use_diag = .false., do_outer_scf_reortho = .false., &
139 ignore_convergence_failure = .false.
140 LOGICAL :: force_scf_calculation = .false.
141 LOGICAL :: non_selfconsistent = .false.
142 INTEGER,
DIMENSION(2) :: added_mos = -1
143 INTEGER :: roks_scheme = -1
144 REAL(kind=
dp) :: roks_f = -1.0_dp
145 REAL(kind=
dp),
DIMENSION(0:2, 0:2, 1:2) :: roks_parameter = -1.0_dp
162 CHARACTER(LEN=*),
PARAMETER :: routinen =
'scf_c_create'
166 CALL timeset(routinen, handle)
170 IF (scf_control%non_selfconsistent)
THEN
171 scf_control%density_guess =
no_guess
175 scf_control%eps_eigval = 1.0e-5_dp
176 scf_control%eps_scf = 1.0e-5_dp
177 scf_control%eps_scf_hist = 0.0_dp
178 scf_control%eps_lumos = 1.0e-5_dp
179 scf_control%max_iter_lumos = 2999
180 scf_control%eps_diis = 0.1_dp
181 scf_control%level_shift = 0.0_dp
182 scf_control%max_diis = 4
183 scf_control%max_scf = 50
184 scf_control%nmixing = 2
185 scf_control%use_cholesky = .true.
186 scf_control%use_diag = .true.
187 scf_control%do_diag_sub = .false.
188 scf_control%use_ot = .false.
189 scf_control%ignore_convergence_failure = .false.
190 scf_control%force_scf_calculation = .false.
191 scf_control%do_outer_scf_reortho = .true.
192 scf_control%max_diis = 4
193 scf_control%eps_diis = 0.1_dp
194 scf_control%added_mos(:) = 0
195 scf_control%max_scf_hist = 0
198 IF (scf_control%non_selfconsistent)
THEN
199 scf_control%mixing_method =
no_mix
205 scf_control%diagonalization%method = 0
206 scf_control%diagonalization%eps_jacobi = 0.0_dp
207 scf_control%diagonalization%jacobi_threshold = 1.0e-7_dp
208 scf_control%diagonalization%max_iter = 0
209 scf_control%diagonalization%eps_iter = 0.0_dp
210 scf_control%diagonalization%eps_adapt = 0.0_dp
211 scf_control%diagonalization%nkrylov = 0
212 scf_control%diagonalization%nblock_krylov = 0
215 scf_control%diagonalization%mom = .false.
216 scf_control%diagonalization%mom_didguess = .false.
217 scf_control%diagonalization%mom_proj_formula = 0
218 NULLIFY (scf_control%diagonalization%mom_deoccA)
219 NULLIFY (scf_control%diagonalization%mom_deoccB)
220 NULLIFY (scf_control%diagonalization%mom_occA)
221 NULLIFY (scf_control%diagonalization%mom_occB)
222 scf_control%diagonalization%mom_start = 0
227 scf_control%roks_f = 0.5_dp
232 scf_control%roks_parameter(0, 0, 1) = 1.5_dp
233 scf_control%roks_parameter(0, 0, 2) = -0.5_dp
234 scf_control%roks_parameter(1, 1, 1) = 0.5_dp
235 scf_control%roks_parameter(1, 1, 2) = 0.5_dp
236 scf_control%roks_parameter(2, 2, 1) = -0.5_dp
237 scf_control%roks_parameter(2, 2, 2) = 1.5_dp
241 scf_control%roks_parameter(0, 1, 1) = 1.0_dp
242 scf_control%roks_parameter(0, 1, 2) = 0.0_dp
243 scf_control%roks_parameter(0, 2, 1) = 0.5_dp
244 scf_control%roks_parameter(0, 2, 2) = 0.5_dp
245 scf_control%roks_parameter(1, 2, 1) = 0.0_dp
246 scf_control%roks_parameter(1, 2, 2) = 1.0_dp
250 scf_control%roks_parameter(1, 0, 1) = scf_control%roks_parameter(0, 1, 1)
251 scf_control%roks_parameter(1, 0, 2) = scf_control%roks_parameter(0, 1, 2)
252 scf_control%roks_parameter(2, 0, 1) = scf_control%roks_parameter(0, 2, 1)
253 scf_control%roks_parameter(2, 0, 2) = scf_control%roks_parameter(0, 2, 2)
254 scf_control%roks_parameter(2, 1, 1) = scf_control%roks_parameter(1, 2, 1)
255 scf_control%roks_parameter(2, 1, 2) = scf_control%roks_parameter(1, 2, 2)
259 scf_control%outer_scf%have_scf = .false.
260 scf_control%outer_scf%max_scf = 0
261 scf_control%outer_scf%eps_scf = 0.0_dp
262 scf_control%outer_scf%step_size = 0.0_dp
263 scf_control%outer_scf%type = -1
264 scf_control%outer_scf%optimizer = -1
265 scf_control%outer_scf%diis_buffer_length = -1
266 NULLIFY (scf_control%outer_scf%cdft_opt_control)
270 NULLIFY (scf_control%smear)
272 CALL timestop(handle)
289 IF (
ASSOCIATED(scf_control%smear%list))
THEN
290 DEALLOCATE (scf_control%smear%list)
292 DEALLOCATE (scf_control%smear)
294 IF (
ASSOCIATED(scf_control%outer_scf%cdft_opt_control)) &
318 CHARACTER(LEN=*),
PARAMETER :: routinen =
'scf_c_read_parameters'
320 INTEGER :: cholesky_flag, handle, ialgo
321 INTEGER,
DIMENSION(:),
POINTER :: added_mos
322 LOGICAL :: do_mixing, explicit
323 REAL(kind=
dp),
DIMENSION(:),
POINTER :: roks_parameter
325 scf_section, smear_section
327 CALL timeset(routinen, handle)
331 l_val=scf_control%use_diag)
332 IF (scf_control%use_diag)
THEN
334 l_val=scf_control%do_diag_sub)
337 IF (scf_control%use_diag .AND. scf_control%use_ot)
THEN
339 cpabort(
"Don't activate OT and Diagonaliztion together")
340 ELSEIF (.NOT. (scf_control%use_diag .OR. scf_control%use_ot))
THEN
342 scf_control%use_diag = .true.
349 IF (scf_control%use_ot)
THEN
351 scf_control%eps_diis = 0.0_dp
359 IF (cholesky_flag > 0)
THEN
360 scf_control%use_cholesky = .true.
362 CALL section_vals_val_get(scf_section,
"IGNORE_CONVERGENCE_FAILURE", l_val=scf_control%ignore_convergence_failure)
363 CALL section_vals_val_get(scf_section,
"FORCE_SCF_CALCULATION", l_val=scf_control%force_scf_calculation)
370 IF (scf_control%use_diag)
THEN
372 i_val=scf_control%diagonalization%method)
374 r_val=scf_control%diagonalization%eps_jacobi)
376 r_val=scf_control%diagonalization%jacobi_threshold)
378 i_val=scf_control%diagonalization%max_iter)
380 r_val=scf_control%diagonalization%eps_iter)
382 r_val=scf_control%diagonalization%eps_adapt)
384 i_val=scf_control%diagonalization%nkrylov)
386 i_val=scf_control%diagonalization%nblock_krylov)
387 IF (scf_control%diagonalization%method ==
diag_ot)
THEN
389 CALL ot_diag_read_input(scf_control%diagonalization%ot_settings, scf_section)
393 l_val=scf_control%diagonalization%MOM)
394 IF (scf_control%diagonalization%mom)
THEN
396 i_val=scf_control%diagonalization%mom_type)
399 i_val=scf_control%diagonalization%mom_start)
402 i_vals=scf_control%diagonalization%mom_deoccA)
405 i_vals=scf_control%diagonalization%mom_deoccB)
408 i_vals=scf_control%diagonalization%mom_occA)
411 i_vals=scf_control%diagonalization%mom_occB)
414 i_val=scf_control%diagonalization%mom_proj_formula)
421 SELECT CASE (scf_control%roks_scheme)
428 NULLIFY (roks_parameter)
430 IF (
ASSOCIATED(roks_parameter))
THEN
431 scf_control%roks_parameter(2, 2, 1) = roks_parameter(1)
432 scf_control%roks_parameter(2, 2, 2) = roks_parameter(2)
433 scf_control%roks_parameter(1, 1, 1) = roks_parameter(3)
434 scf_control%roks_parameter(1, 1, 2) = roks_parameter(4)
435 scf_control%roks_parameter(0, 0, 1) = roks_parameter(5)
436 scf_control%roks_parameter(0, 0, 2) = roks_parameter(6)
446 cpassert(
ASSOCIATED(added_mos))
447 IF (
SIZE(added_mos) > 0)
THEN
448 scf_control%added_mos(1) = added_mos(1)
449 IF (
SIZE(added_mos) > 1)
THEN
450 scf_control%added_mos(2) = added_mos(2)
457 IF (scf_control%level_shift /= 0.0_dp) scf_control%use_cholesky = .false.
464 CALL init_smear(scf_control%smear)
465 CALL read_smear_section(scf_control%smear, smear_section)
473 i_val=scf_control%mixing_method)
477 CALL timestop(handle)
485 SUBROUTINE init_smear(smear)
488 cpassert(.NOT.
ASSOCIATED(smear))
490 smear%do_smear = .false.
492 smear%electronic_temperature = 0.0_dp
493 smear%eps_fermi_dirac = 1.0e-5_dp
494 smear%fixed_mag_mom = -100.0_dp
495 smear%window_size = 0.0_dp
496 smear%smearing_width = 0.0_dp
498 END SUBROUTINE init_smear
505 SUBROUTINE read_smear_section(smear, smear_section)
509 REAL(kind=
dp),
DIMENSION(:),
POINTER :: r_vals
514 l_val=smear%do_smear)
515 IF (smear%do_smear)
THEN
519 r_val=smear%electronic_temperature)
521 r_val=smear%eps_fermi_dirac)
523 r_val=smear%window_size)
528 r_val=smear%smearing_width)
533 cpassert(
ASSOCIATED(r_vals))
534 ALLOCATE (smear%list(
SIZE(r_vals)))
538 r_val=smear%fixed_mag_mom)
540 END SUBROUTINE read_smear_section
556 CHARACTER(LEN=*),
PARAMETER :: routinen =
'scf_c_write_parameters'
558 INTEGER :: handle, output_unit, roks_scheme
560 REAL(kind=
dp) :: elec_temp
567 CALL timeset(routinen, handle)
572 NULLIFY (scf_section)
579 IF (output_unit > 0)
THEN
581 IF (scf_control%max_scf > 0)
THEN
588 IF (.NOT. scf_control%non_selfconsistent .OR. scf_control%force_scf_calculation)
THEN
589 WRITE (unit=output_unit, &
590 fmt=
"(/,/,T2,A,T25,A,T51,A30,/,T25,56('-'),3(/,T25,A,T76,I5),/, "// &
591 "T25,56('-'),4(/,T25,A,T72,ES9.2),/,T25,56('-'), "// &
592 "1(/,T25,A,T71,F10.6))") &
594 "Density guess: ", adjustr(trim(
enum_i2c(enum, scf_control%density_guess))), &
595 "max_scf: ", scf_control%max_scf, &
596 "max_scf_history: ", scf_control%max_scf_hist, &
597 "max_diis: ", scf_control%max_diis, &
598 "eps_scf: ", scf_control%eps_scf, &
599 "eps_scf_history: ", scf_control%eps_scf_hist, &
600 "eps_diis: ", scf_control%eps_diis, &
601 "eps_eigval: ", scf_control%eps_eigval, &
602 "level_shift [a.u.]:", scf_control%level_shift
605 IF (sum(abs(scf_control%added_mos)) > 0)
THEN
606 WRITE (unit=output_unit, fmt=
"(T25,A,T71,2I5)") &
607 "added MOs ", scf_control%added_mos
610 IF (scf_control%diagonalization%mom)
THEN
612 WRITE (unit=output_unit, fmt=
"(T25,A)")
"MOM enabled"
615 IF (scf_control%mixing_method > 0 .AND. .NOT. scf_control%use_ot .AND. &
616 .NOT. scf_control%non_selfconsistent)
THEN
619 WRITE (unit=output_unit, fmt=
"(T25,A,/,T25,A,T51,A30)") &
621 "Mixing method: ", adjustr(trim(
enum_i2c(enum, scf_control%mixing_method)))
622 IF (scf_control%mixing_method > 1)
THEN
623 WRITE (unit=output_unit, fmt=
"(T47,A34)")
"charge density mixing in g-space"
626 IF (scf_control%smear%do_smear)
THEN
629 WRITE (unit=output_unit, fmt=
"(T25,A,/,T25,A,T51,A30)") &
631 "Smear method: ", adjustr(trim(
enum_i2c(enum, scf_control%smear%method)))
632 SELECT CASE (scf_control%smear%method)
636 WRITE (unit=output_unit, fmt=
"(T25,A,T61,F20.1)") &
637 "Electronic temperature [K]:", elec_temp
638 WRITE (unit=output_unit, fmt=
"(T25,A,T71,ES10.2)") &
639 "Electronic temperature [a.u.]:", scf_control%smear%electronic_temperature, &
640 "Accuracy threshold:", scf_control%smear%eps_fermi_dirac
641 IF (scf_control%smear%fixed_mag_mom > 0.0_dp)
WRITE (unit=output_unit, fmt=
"(T25,A,T61,F20.1)") &
642 "Fixed magnetic moment set to:", scf_control%smear%fixed_mag_mom
644 WRITE (unit=output_unit, fmt=
"(T25,A,T71,ES10.2)") &
645 "Smearing width (sigma) [a.u.]:", scf_control%smear%smearing_width, &
646 "Accuracy threshold:", scf_control%smear%eps_fermi_dirac
647 IF (scf_control%smear%fixed_mag_mom > 0.0_dp) &
648 WRITE (unit=output_unit, fmt=
"(T25,A,T61,F20.1)") &
649 "Fixed magnetic moment set to:", scf_control%smear%fixed_mag_mom
651 WRITE (unit=output_unit, fmt=
"(T25,A,T71,F10.6)") &
652 "Smear window [a.u.]: ", scf_control%smear%window_size
657 IF (roks .AND. (.NOT. scf_control%use_ot))
THEN
662 WRITE (unit=output_unit, fmt=
"(T25,A,/,T25,A,T51,A30)") &
664 "ROKS scheme:", adjustr(trim(
enum_i2c(enum, roks_scheme)))
665 SELECT CASE (roks_scheme)
667 WRITE (unit=output_unit, fmt=
"(T25,A,T71,F10.6)") &
668 "ROKS parameter f:", scf_control%roks_f
670 WRITE (unit=output_unit, &
671 fmt=
"(T25,A,6(/,T25,A,T71,F10.6))") &
672 "ROKS parameters: a)lpha, b)eta; c)losed, o)pen, v)irtual", &
673 "acc", scf_control%roks_parameter(2, 2, 1), &
674 "bcc", scf_control%roks_parameter(2, 2, 2), &
675 "aoo", scf_control%roks_parameter(1, 1, 1), &
676 "boo", scf_control%roks_parameter(1, 1, 2), &
677 "avv", scf_control%roks_parameter(0, 0, 1), &
678 "bvv", scf_control%roks_parameter(0, 0, 2)
683 IF (scf_control%outer_scf%have_scf)
THEN
684 WRITE (output_unit,
"(T25,56('-'),/,T25,A)")
"Outer loop SCF in use "
685 SELECT CASE (scf_control%outer_scf%type)
687 WRITE (output_unit,
'(T25,A)')
"No variables optimised in outer loop"
689 WRITE (output_unit,
'(T25,A)')
"DDAPC constraint enforced"
691 WRITE (output_unit,
'(T25,A)')
"S2 constraint enforced"
693 WRITE (output_unit,
'(T25,A)')
"Floating basis function optimization enforced"
695 cpabort(
"CDFT constraints must be defined in QS&CDFT")
699 WRITE (output_unit,
'(T25,A,T72,ES9.2)')
"eps_scf", scf_control%outer_scf%eps_scf
700 WRITE (output_unit,
'(T25,A,T72,I9)')
"max_scf", scf_control%outer_scf%max_scf
701 SELECT CASE (scf_control%outer_scf%optimizer)
703 WRITE (output_unit,
'(T25,A)')
"No outer loop optimization"
705 WRITE (output_unit,
'(T25,A)')
"Steepest descent optimization"
707 WRITE (output_unit,
'(T25,A)')
"Gradient bisection"
708 WRITE (output_unit,
'(T25,A,T72,I9)')
"bisect_trust_count", scf_control%outer_scf%bisect_trust_count
710 WRITE (output_unit,
'(T25,A)')
"DIIS optimization"
711 WRITE (output_unit,
'(T25,A,T72,I9)')
"DIIS buffer length", &
712 scf_control%outer_scf%diis_buffer_length
715 cpabort(
"Selected optimizer only compatible with CDFT")
717 WRITE (output_unit,
'(T25,A)')
"Optimization with the secant method"
721 WRITE (output_unit,
'(T25,A,T72,ES9.2)')
"step_size", scf_control%outer_scf%step_size
723 WRITE (output_unit,
"(T25,56('-'),/,T25,A)")
"No outer SCF"
731 "PRINT%PROGRAM_RUN_INFO")
733 CALL timestop(handle)
744 SUBROUTINE ot_diag_read_input(settings, scf_section)
748 CHARACTER(len=*),
PARAMETER :: routinen =
'ot_diag_read_input'
750 INTEGER :: handle, output_unit
755 CALL timeset(routinen, handle)
771 "PRINT%PROGRAM_RUN_INFO")
773 CALL timestop(handle)
775 END SUBROUTINE ot_diag_read_input
various routines to log and control the output. The idea is that decisions about where to log should ...
type(cp_logger_type) function, pointer, public cp_get_default_logger()
returns the default logger
routines to handle the output, The idea is to remove the decision of wheter to output and what to out...
integer function, public cp_print_key_unit_nr(logger, basis_section, print_key_path, extension, middle_name, local, log_filename, ignore_should_output, file_form, file_position, file_action, file_status, do_backup, on_file, is_new_file, mpi_io, fout)
...
subroutine, public cp_print_key_finished_output(unit_nr, logger, basis_section, print_key_path, local, ignore_should_output, on_file, mpi_io)
should be called after you finish working with a unit obtained with cp_print_key_unit_nr,...
real(kind=dp) function, public cp_unit_from_cp2k(value, unit_str, defaults, power)
converts from the internal cp2k units to the given unit
Defines the basic variable types.
integer, parameter, public dp
An array-based list which grows on demand. When the internal array is full, a new array of twice the ...
parameters that control the outer loop of an SCF iteration
subroutine, public outer_scf_read_parameters(outer_scf, outer_scf_section)
reads the parameters of the outer_scf section into the given outer_scf
Control parameters for optimizers that work with CDFT constraints.
subroutine, public cdft_opt_type_release(cdft_opt_control)
releases the CDFT optimizer control object
subroutine, public qs_ot_settings_init(settings)
sets default values for the settings type
subroutine, public ot_readwrite_input(settings, ot_section, output_unit)
...
parameters that control an scf iteration
subroutine, public scf_c_read_parameters(scf_control, inp_section)
reads the parameters of the scf section into the given scf_control
subroutine, public scf_c_release(scf_control)
releases the given scf_control (see cp2k/doc/ReferenceCounting.html)
subroutine, public scf_c_write_parameters(scf_control, dft_section)
writes out the scf parameters
subroutine, public scf_c_create(scf_control)
allocates and initializes an scf control object with the default values
type of a logger, at the moment it contains just a print level starting at which level it should be l...
contains the parameters needed by a scf run
notice, this variable needs to be copyable, needed for spins as e.g. in qs_ot_scf
contains the parameters needed by a scf run