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, &
99 REAL(kind=
dp),
DIMENSION(:),
POINTER ::
list => null()
102 TYPE diagonalization_type
103 INTEGER :: method = -1
104 REAL(kind=
dp) :: eps_jacobi = -1.0_dp
105 REAL(kind=
dp) :: jacobi_threshold = -1.0_dp
106 INTEGER :: max_iter = -1, nkrylov = -1, nblock_krylov = -1
108 LOGICAL :: mom = .false., mom_didguess = .false.
109 INTEGER :: mom_proj_formula = -1
111 INTEGER,
DIMENSION(:),
POINTER :: mom_deocca => null(), mom_deoccb => null(), &
112 mom_occa => null(), mom_occb => null()
117 INTEGER :: mom_start = -1
118 INTEGER :: mom_type = -1
119 REAL(kind=
dp) :: eps_iter = -1.0_dp
120 REAL(kind=
dp) :: eps_adapt = -1.0_dp
122 END TYPE diagonalization_type
127 TYPE(diagonalization_type) :: diagonalization = diagonalization_type()
128 INTEGER :: density_guess = -1, mixing_method = -1
129 REAL(kind=
dp) :: eps_eigval = -1.0_dp, eps_scf = -1.0_dp, eps_scf_hist = -1.0_dp, &
130 level_shift = -1.0_dp, &
131 eps_lumos = -1.0_dp, eps_diis = -1.0_dp
132 INTEGER :: max_iter_lumos = -1, max_diis = -1, nmixing = -1
133 INTEGER :: max_scf = -1, max_scf_hist = -1, &
134 maxl = -1, nkind = -1
135 LOGICAL :: do_diag_sub = .false., &
136 use_cholesky = .false., use_ot = .false., &
137 use_diag = .false., do_outer_scf_reortho = .false., &
138 ignore_convergence_failure = .false.
139 LOGICAL :: force_scf_calculation = .false.
140 LOGICAL :: non_selfconsistent = .false.
141 INTEGER,
DIMENSION(2) :: added_mos = -1
142 INTEGER :: roks_scheme = -1
143 REAL(kind=
dp) :: roks_f = -1.0_dp
144 REAL(kind=
dp),
DIMENSION(0:2, 0:2, 1:2) :: roks_parameter = -1.0_dp
161 CHARACTER(LEN=*),
PARAMETER :: routinen =
'scf_c_create'
165 CALL timeset(routinen, handle)
169 IF (scf_control%non_selfconsistent)
THEN
170 scf_control%density_guess =
no_guess
174 scf_control%eps_eigval = 1.0e-5_dp
175 scf_control%eps_scf = 1.0e-5_dp
176 scf_control%eps_scf_hist = 0.0_dp
177 scf_control%eps_lumos = 1.0e-5_dp
178 scf_control%max_iter_lumos = 2999
179 scf_control%eps_diis = 0.1_dp
180 scf_control%level_shift = 0.0_dp
181 scf_control%max_diis = 4
182 scf_control%max_scf = 50
183 scf_control%nmixing = 2
184 scf_control%use_cholesky = .true.
185 scf_control%use_diag = .true.
186 scf_control%do_diag_sub = .false.
187 scf_control%use_ot = .false.
188 scf_control%ignore_convergence_failure = .false.
189 scf_control%force_scf_calculation = .false.
190 scf_control%do_outer_scf_reortho = .true.
191 scf_control%max_diis = 4
192 scf_control%eps_diis = 0.1_dp
193 scf_control%added_mos(:) = 0
194 scf_control%max_scf_hist = 0
197 IF (scf_control%non_selfconsistent)
THEN
198 scf_control%mixing_method =
no_mix
204 scf_control%diagonalization%method = 0
205 scf_control%diagonalization%eps_jacobi = 0.0_dp
206 scf_control%diagonalization%jacobi_threshold = 1.0e-7_dp
207 scf_control%diagonalization%max_iter = 0
208 scf_control%diagonalization%eps_iter = 0.0_dp
209 scf_control%diagonalization%eps_adapt = 0.0_dp
210 scf_control%diagonalization%nkrylov = 0
211 scf_control%diagonalization%nblock_krylov = 0
214 scf_control%diagonalization%mom = .false.
215 scf_control%diagonalization%mom_didguess = .false.
216 scf_control%diagonalization%mom_proj_formula = 0
217 NULLIFY (scf_control%diagonalization%mom_deoccA)
218 NULLIFY (scf_control%diagonalization%mom_deoccB)
219 NULLIFY (scf_control%diagonalization%mom_occA)
220 NULLIFY (scf_control%diagonalization%mom_occB)
221 scf_control%diagonalization%mom_start = 0
226 scf_control%roks_f = 0.5_dp
231 scf_control%roks_parameter(0, 0, 1) = 1.5_dp
232 scf_control%roks_parameter(0, 0, 2) = -0.5_dp
233 scf_control%roks_parameter(1, 1, 1) = 0.5_dp
234 scf_control%roks_parameter(1, 1, 2) = 0.5_dp
235 scf_control%roks_parameter(2, 2, 1) = -0.5_dp
236 scf_control%roks_parameter(2, 2, 2) = 1.5_dp
240 scf_control%roks_parameter(0, 1, 1) = 1.0_dp
241 scf_control%roks_parameter(0, 1, 2) = 0.0_dp
242 scf_control%roks_parameter(0, 2, 1) = 0.5_dp
243 scf_control%roks_parameter(0, 2, 2) = 0.5_dp
244 scf_control%roks_parameter(1, 2, 1) = 0.0_dp
245 scf_control%roks_parameter(1, 2, 2) = 1.0_dp
249 scf_control%roks_parameter(1, 0, 1) = scf_control%roks_parameter(0, 1, 1)
250 scf_control%roks_parameter(1, 0, 2) = scf_control%roks_parameter(0, 1, 2)
251 scf_control%roks_parameter(2, 0, 1) = scf_control%roks_parameter(0, 2, 1)
252 scf_control%roks_parameter(2, 0, 2) = scf_control%roks_parameter(0, 2, 2)
253 scf_control%roks_parameter(2, 1, 1) = scf_control%roks_parameter(1, 2, 1)
254 scf_control%roks_parameter(2, 1, 2) = scf_control%roks_parameter(1, 2, 2)
258 scf_control%outer_scf%have_scf = .false.
259 scf_control%outer_scf%max_scf = 0
260 scf_control%outer_scf%eps_scf = 0.0_dp
261 scf_control%outer_scf%step_size = 0.0_dp
262 scf_control%outer_scf%type = -1
263 scf_control%outer_scf%optimizer = -1
264 scf_control%outer_scf%diis_buffer_length = -1
265 NULLIFY (scf_control%outer_scf%cdft_opt_control)
269 NULLIFY (scf_control%smear)
271 CALL timestop(handle)
288 IF (
ASSOCIATED(scf_control%smear%list))
THEN
289 DEALLOCATE (scf_control%smear%list)
291 DEALLOCATE (scf_control%smear)
293 IF (
ASSOCIATED(scf_control%outer_scf%cdft_opt_control)) &
317 CHARACTER(LEN=*),
PARAMETER :: routinen =
'scf_c_read_parameters'
319 INTEGER :: cholesky_flag, handle, ialgo
320 INTEGER,
DIMENSION(:),
POINTER :: added_mos
322 REAL(kind=
dp),
DIMENSION(:),
POINTER :: roks_parameter
324 scf_section, smear_section
326 CALL timeset(routinen, handle)
330 l_val=scf_control%use_diag)
331 IF (scf_control%use_diag)
THEN
333 l_val=scf_control%do_diag_sub)
336 IF (scf_control%use_diag .AND. scf_control%use_ot)
THEN
338 cpabort(
"Don't activate OT and Diagonaliztion together")
339 ELSEIF (.NOT. (scf_control%use_diag .OR. scf_control%use_ot))
THEN
341 scf_control%use_diag = .true.
349 IF (cholesky_flag > 0)
THEN
350 scf_control%use_cholesky = .true.
352 CALL section_vals_val_get(scf_section,
"IGNORE_CONVERGENCE_FAILURE", l_val=scf_control%ignore_convergence_failure)
353 CALL section_vals_val_get(scf_section,
"FORCE_SCF_CALCULATION", l_val=scf_control%force_scf_calculation)
360 IF (scf_control%use_diag)
THEN
362 i_val=scf_control%diagonalization%method)
364 r_val=scf_control%diagonalization%eps_jacobi)
366 r_val=scf_control%diagonalization%jacobi_threshold)
368 i_val=scf_control%diagonalization%max_iter)
370 r_val=scf_control%diagonalization%eps_iter)
372 r_val=scf_control%diagonalization%eps_adapt)
374 i_val=scf_control%diagonalization%nkrylov)
376 i_val=scf_control%diagonalization%nblock_krylov)
377 IF (scf_control%diagonalization%method ==
diag_ot)
THEN
379 CALL ot_diag_read_input(scf_control%diagonalization%ot_settings, scf_section)
383 l_val=scf_control%diagonalization%MOM)
384 IF (scf_control%diagonalization%mom)
THEN
386 i_val=scf_control%diagonalization%mom_type)
389 i_val=scf_control%diagonalization%mom_start)
392 i_vals=scf_control%diagonalization%mom_deoccA)
395 i_vals=scf_control%diagonalization%mom_deoccB)
398 i_vals=scf_control%diagonalization%mom_occA)
401 i_vals=scf_control%diagonalization%mom_occB)
404 i_val=scf_control%diagonalization%mom_proj_formula)
411 SELECT CASE (scf_control%roks_scheme)
418 NULLIFY (roks_parameter)
420 IF (
ASSOCIATED(roks_parameter))
THEN
421 scf_control%roks_parameter(2, 2, 1) = roks_parameter(1)
422 scf_control%roks_parameter(2, 2, 2) = roks_parameter(2)
423 scf_control%roks_parameter(1, 1, 1) = roks_parameter(3)
424 scf_control%roks_parameter(1, 1, 2) = roks_parameter(4)
425 scf_control%roks_parameter(0, 0, 1) = roks_parameter(5)
426 scf_control%roks_parameter(0, 0, 2) = roks_parameter(6)
436 cpassert(
ASSOCIATED(added_mos))
437 IF (
SIZE(added_mos) > 0)
THEN
438 scf_control%added_mos(1) = added_mos(1)
439 IF (
SIZE(added_mos) > 1)
THEN
440 scf_control%added_mos(2) = added_mos(2)
447 IF (scf_control%level_shift /= 0.0_dp) scf_control%use_cholesky = .false.
454 CALL init_smear(scf_control%smear)
455 CALL read_smear_section(scf_control%smear, smear_section)
463 i_val=scf_control%mixing_method)
467 CALL timestop(handle)
475 SUBROUTINE init_smear(smear)
478 cpassert(.NOT.
ASSOCIATED(smear))
480 smear%do_smear = .false.
482 smear%electronic_temperature = 0.0_dp
483 smear%eps_fermi_dirac = 1.0e-5_dp
484 smear%fixed_mag_mom = -100.0_dp
485 smear%window_size = 0.0_dp
487 END SUBROUTINE init_smear
494 SUBROUTINE read_smear_section(smear, smear_section)
498 REAL(kind=
dp),
DIMENSION(:),
POINTER :: r_vals
503 l_val=smear%do_smear)
504 IF (smear%do_smear)
THEN
508 r_val=smear%electronic_temperature)
510 r_val=smear%eps_fermi_dirac)
512 r_val=smear%window_size)
516 cpassert(
ASSOCIATED(r_vals))
517 ALLOCATE (smear%list(
SIZE(r_vals)))
521 r_val=smear%fixed_mag_mom)
523 END SUBROUTINE read_smear_section
539 CHARACTER(LEN=*),
PARAMETER :: routinen =
'scf_c_write_parameters'
541 INTEGER :: handle, output_unit, roks_scheme
543 REAL(kind=
dp) :: elec_temp
550 CALL timeset(routinen, handle)
555 NULLIFY (scf_section)
562 IF (output_unit > 0)
THEN
564 IF (scf_control%max_scf > 0)
THEN
571 IF (.NOT. scf_control%non_selfconsistent .OR. scf_control%force_scf_calculation)
THEN
572 WRITE (unit=output_unit, &
573 fmt=
"(/,/,T2,A,T25,A,T51,A30,/,T25,56('-'),3(/,T25,A,T76,I5),/, "// &
574 "T25,56('-'),4(/,T25,A,T72,ES9.2),/,T25,56('-'), "// &
575 "1(/,T25,A,T71,F10.6))") &
577 "Density guess: ", adjustr(trim(
enum_i2c(enum, scf_control%density_guess))), &
578 "max_scf: ", scf_control%max_scf, &
579 "max_scf_history: ", scf_control%max_scf_hist, &
580 "max_diis: ", scf_control%max_diis, &
581 "eps_scf: ", scf_control%eps_scf, &
582 "eps_scf_history: ", scf_control%eps_scf_hist, &
583 "eps_diis: ", scf_control%eps_diis, &
584 "eps_eigval: ", scf_control%eps_eigval, &
585 "level_shift [a.u.]:", scf_control%level_shift
588 IF (sum(abs(scf_control%added_mos)) > 0)
THEN
589 WRITE (unit=output_unit, fmt=
"(T25,A,T71,2I5)") &
590 "added MOs ", scf_control%added_mos
593 IF (scf_control%diagonalization%mom)
THEN
595 WRITE (unit=output_unit, fmt=
"(T25,A)")
"MOM enabled"
598 IF (scf_control%mixing_method > 0 .AND. .NOT. scf_control%use_ot .AND. &
599 .NOT. scf_control%non_selfconsistent)
THEN
602 WRITE (unit=output_unit, fmt=
"(T25,A,/,T25,A,T51,A30)") &
604 "Mixing method: ", adjustr(trim(
enum_i2c(enum, scf_control%mixing_method)))
605 IF (scf_control%mixing_method > 1)
THEN
606 WRITE (unit=output_unit, fmt=
"(T47,A34)")
"charge density mixing in g-space"
609 IF (scf_control%smear%do_smear)
THEN
612 WRITE (unit=output_unit, fmt=
"(T25,A,/,T25,A,T51,A30)") &
614 "Smear method: ", adjustr(trim(
enum_i2c(enum, scf_control%smear%method)))
615 SELECT CASE (scf_control%smear%method)
619 WRITE (unit=output_unit, fmt=
"(T25,A,T61,F20.1)") &
620 "Electronic temperature [K]:", elec_temp
621 WRITE (unit=output_unit, fmt=
"(T25,A,T71,ES10.2)") &
622 "Electronic temperature [a.u.]:", scf_control%smear%electronic_temperature, &
623 "Accuracy threshold:", scf_control%smear%eps_fermi_dirac
624 IF (scf_control%smear%fixed_mag_mom > 0.0_dp)
WRITE (unit=output_unit, fmt=
"(T25,A,F10.5)") &
625 "Spin channel alpha and spin channel beta are smeared independently, keeping"// &
626 " fixed difference in number of electrons equal to ", scf_control%smear%fixed_mag_mom
628 WRITE (unit=output_unit, fmt=
"(T25,A,T71,F10.6)") &
629 "Smear window [a.u.]: ", scf_control%smear%window_size
634 IF (roks .AND. (.NOT. scf_control%use_ot))
THEN
639 WRITE (unit=output_unit, fmt=
"(T25,A,/,T25,A,T51,A30)") &
641 "ROKS scheme:", adjustr(trim(
enum_i2c(enum, roks_scheme)))
642 SELECT CASE (roks_scheme)
644 WRITE (unit=output_unit, fmt=
"(T25,A,T71,F10.6)") &
645 "ROKS parameter f:", scf_control%roks_f
647 WRITE (unit=output_unit, &
648 fmt=
"(T25,A,6(/,T25,A,T71,F10.6))") &
649 "ROKS parameters: a)lpha, b)eta; c)losed, o)pen, v)irtual", &
650 "acc", scf_control%roks_parameter(2, 2, 1), &
651 "bcc", scf_control%roks_parameter(2, 2, 2), &
652 "aoo", scf_control%roks_parameter(1, 1, 1), &
653 "boo", scf_control%roks_parameter(1, 1, 2), &
654 "avv", scf_control%roks_parameter(0, 0, 1), &
655 "bvv", scf_control%roks_parameter(0, 0, 2)
660 IF (scf_control%outer_scf%have_scf)
THEN
661 WRITE (output_unit,
"(T25,56('-'),/,T25,A)")
"Outer loop SCF in use "
662 SELECT CASE (scf_control%outer_scf%type)
664 WRITE (output_unit,
'(T25,A)')
"No variables optimised in outer loop"
666 WRITE (output_unit,
'(T25,A)')
"DDAPC constraint enforced"
668 WRITE (output_unit,
'(T25,A)')
"S2 constraint enforced"
670 WRITE (output_unit,
'(T25,A)')
"Floating basis function optimization enforced"
672 cpabort(
"CDFT constraints must be defined in QS&CDFT")
676 WRITE (output_unit,
'(T25,A,T72,ES9.2)')
"eps_scf", scf_control%outer_scf%eps_scf
677 WRITE (output_unit,
'(T25,A,T72,I9)')
"max_scf", scf_control%outer_scf%max_scf
678 SELECT CASE (scf_control%outer_scf%optimizer)
680 WRITE (output_unit,
'(T25,A)')
"No outer loop optimization"
682 WRITE (output_unit,
'(T25,A)')
"Steepest descent optimization"
684 WRITE (output_unit,
'(T25,A)')
"Gradient bisection"
685 WRITE (output_unit,
'(T25,A,T72,I9)')
"bisect_trust_count", scf_control%outer_scf%bisect_trust_count
687 WRITE (output_unit,
'(T25,A)')
"DIIS optimization"
688 WRITE (output_unit,
'(T25,A,T72,I9)')
"DIIS buffer length", &
689 scf_control%outer_scf%diis_buffer_length
692 cpabort(
"Selected optimizer only compatible with CDFT")
694 WRITE (output_unit,
'(T25,A)')
"Optimization with the secant method"
698 WRITE (output_unit,
'(T25,A,T72,ES9.2)')
"step_size", scf_control%outer_scf%step_size
700 WRITE (output_unit,
"(T25,56('-'),/,T25,A)")
"No outer SCF"
708 "PRINT%PROGRAM_RUN_INFO")
710 CALL timestop(handle)
721 SUBROUTINE ot_diag_read_input(settings, scf_section)
725 CHARACTER(len=*),
PARAMETER :: routinen =
'ot_diag_read_input'
727 INTEGER :: handle, output_unit
732 CALL timeset(routinen, handle)
748 "PRINT%PROGRAM_RUN_INFO")
750 CALL timestop(handle)
752 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