(git:41cb813)
Loading...
Searching...
No Matches
qs_scf_loop_utils.F
Go to the documentation of this file.
1!--------------------------------------------------------------------------------------------------!
2! CP2K: A general program to perform molecular dynamics simulations !
3! Copyright 2000-2026 CP2K developers group <https://cp2k.org> !
4! !
5! SPDX-License-Identifier: GPL-2.0-or-later !
6!--------------------------------------------------------------------------------------------------!
7! **************************************************************************************************
8!> \brief Utility routines for qs_scf
9! **************************************************************************************************
13 USE cp_dbcsr_api, ONLY: dbcsr_copy,&
20 USE kinds, ONLY: default_string_length,&
21 dp
22 USE kpoint_types, ONLY: kpoint_type
37 USE qs_ks_types, ONLY: qs_ks_did_change,&
41 USE qs_mo_types, ONLY: mo_set_type
43 USE qs_ot_scf, ONLY: ot_scf_destroy,&
47 USE qs_rho_types, ONLY: qs_rho_get,&
59 USE qs_scf_types, ONLY: &
67#include "./base/base_uses.f90"
68
69 IMPLICIT NONE
70
71 PRIVATE
72
73 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_scf_loop_utils'
74
75 PUBLIC :: qs_scf_set_loop_flags, &
79
80CONTAINS
81
82! **************************************************************************************************
83!> \brief computes properties for a given hamiltonian using the current wfn
84!> \param scf_env ...
85!> \param diis_step ...
86!> \param energy_only ...
87!> \param just_energy ...
88!> \param exit_inner_loop ...
89! **************************************************************************************************
90 SUBROUTINE qs_scf_set_loop_flags(scf_env, diis_step, &
91 energy_only, just_energy, exit_inner_loop)
92
93 TYPE(qs_scf_env_type), POINTER :: scf_env
94 LOGICAL :: diis_step, energy_only, just_energy, &
95 exit_inner_loop
96
97! Some flags needed to be set at the beginning of the loop
98
99 diis_step = .false.
100 energy_only = .false.
101 just_energy = .false.
102
103 ! SCF loop, optimisation of the wfn coefficients
104 ! qs_env%rho%rho_r and qs_env%rho%rho_g should be up to date here
105
106 scf_env%iter_count = 0
107 exit_inner_loop = .false.
108
109 END SUBROUTINE qs_scf_set_loop_flags
110
111! **************************************************************************************************
112!> \brief takes known energy and derivatives and produces new wfns
113!> and or density matrix
114!> \param qs_env ...
115!> \param scf_env ...
116!> \param scf_control ...
117!> \param scf_section ...
118!> \param diis_step ...
119!> \param energy_only ...
120!> \param probe ...
121! **************************************************************************************************
122 SUBROUTINE qs_scf_new_mos(qs_env, scf_env, scf_control, scf_section, diis_step, &
123 energy_only, probe)
124 TYPE(qs_environment_type), POINTER :: qs_env
125 TYPE(qs_scf_env_type), POINTER :: scf_env
126 TYPE(scf_control_type), POINTER :: scf_control
127 TYPE(section_vals_type), POINTER :: scf_section
128 LOGICAL :: diis_step, energy_only
129 TYPE(hairy_probes_type), DIMENSION(:), OPTIONAL, &
130 POINTER :: probe
131
132 CHARACTER(LEN=*), PARAMETER :: routinen = 'qs_scf_new_mos'
133
134 INTEGER :: handle, ispin
135 LOGICAL :: disable_diis, has_unit_metric, &
136 skip_diag_sub
137 REAL(kind=dp) :: saved_eps_diis
138 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_ks, matrix_s
139 TYPE(dft_control_type), POINTER :: dft_control
140 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
141 TYPE(qs_energy_type), POINTER :: energy
142 TYPE(qs_ks_env_type), POINTER :: ks_env
143 TYPE(qs_rho_type), POINTER :: rho
144
145 CALL timeset(routinen, handle)
146
147 NULLIFY (energy, ks_env, matrix_ks, matrix_s, rho, mos, dft_control)
148
149 CALL get_qs_env(qs_env=qs_env, &
150 matrix_s=matrix_s, energy=energy, &
151 ks_env=ks_env, &
152 matrix_ks=matrix_ks, rho=rho, mos=mos, &
153 dft_control=dft_control, &
154 has_unit_metric=has_unit_metric)
155 scf_env%iter_param = 0.0_dp
156 disable_diis = dft_control%qs_control%xtb_control%do_tblite .AND. &
157 tb_native_scc_mixer_active(dft_control)
158 IF (disable_diis) THEN
159 saved_eps_diis = scf_control%eps_diis
160 scf_control%eps_diis = 0.0_dp
161 END IF
162
163 ! transfer total_zeff_corr from qs_env to scf_env only if
164 ! correct_el_density_dip is switched on [SGh]
165 IF (dft_control%correct_el_density_dip) THEN
166 scf_env%sum_zeff_corr = qs_env%total_zeff_corr
167 IF (abs(qs_env%total_zeff_corr) > 0.0_dp) THEN
168 IF (scf_env%method /= general_diag_method_nr) THEN
169 CALL cp_abort(__location__, &
170 "Please use ALGORITHM STANDARD in "// &
171 "SCF%DIAGONALIZATION if "// &
172 "CORE_CORRECTION /= 0.0 and "// &
173 "SURFACE_DIPOLE_CORRECTION TRUE ")
174 ELSEIF (dft_control%roks) THEN
175 CALL cp_abort(__location__, &
176 "Combination of "// &
177 "CORE_CORRECTION /= 0.0 and "// &
178 "SURFACE_DIPOLE_CORRECTION TRUE "// &
179 "is not implemented with ROKS")
180 ELSEIF (scf_control%diagonalization%mom) THEN
181 CALL cp_abort(__location__, &
182 "Combination of "// &
183 "CORE_CORRECTION /= 0.0 and "// &
184 "SURFACE_DIPOLE_CORRECTION TRUE "// &
185 "is not implemented with SCF%MOM")
186 END IF
187 END IF
188 END IF
189
190 SELECT CASE (scf_env%method)
191 CASE DEFAULT
192 CALL cp_abort(__location__, &
193 "unknown scf method: "// &
194 cp_to_string(scf_env%method))
195
196 ! *************************************************************************
197 ! Filter matrix diagonalisation: ugly implementation at this point of time
198 ! *************************************************************************
200
201 IF (abs(qs_env%total_zeff_corr) > 0.0_dp) THEN
202 CALL cp_abort(__location__, &
203 "CORE_CORRECTION /= 0.0 plus SURFACE_DIPOLE_CORRECTION TRUE "// &
204 "requires SCF%DIAGONALIZATION: ALGORITHM STANDARD")
205 END IF
206 CALL fb_env_do_diag(scf_env%filter_matrix_env, qs_env, &
207 matrix_ks, matrix_s, scf_section, diis_step)
208
209 ! Diagonlization in non orthonormal case
211 IF (dft_control%roks) THEN
212 CALL do_roks_diag(scf_env, mos, matrix_ks, matrix_s, &
213 scf_control, scf_section, diis_step, &
214 has_unit_metric)
215 ELSE
216 IF (scf_control%diagonalization%mom) THEN
217 CALL do_mom_diag(scf_env, mos, matrix_ks, &
218 matrix_s, scf_control, scf_section, &
219 diis_step)
220 ELSE
221 IF (dft_control%hairy_probes .EQV. .true.) THEN
222 CALL do_general_diag(scf_env, mos, matrix_ks, &
223 matrix_s, scf_control, scf_section, &
224 diis_step, &
225 probe)
226 ELSE
227 CALL do_general_diag(scf_env, mos, matrix_ks, &
228 matrix_s, scf_control, scf_section, &
229 diis_step)
230 END IF
231 END IF
232 IF (scf_control%do_diag_sub) THEN
233 skip_diag_sub = (scf_env%subspace_env%eps_diag_sub > 0.0_dp) .AND. &
234 (scf_env%iter_count == 1 .OR. scf_env%iter_delta > scf_env%subspace_env%eps_diag_sub)
235 IF (.NOT. skip_diag_sub) THEN
236 CALL do_scf_diag_subspace(qs_env, scf_env, scf_env%subspace_env, mos, rho, &
237 ks_env, scf_section, scf_control)
238 END IF
239 END IF
240 END IF
241 ! Diagonlization in orthonormal case
243 IF (dft_control%roks) THEN
244 CALL do_roks_diag(scf_env, mos, matrix_ks, matrix_s, &
245 scf_control, scf_section, diis_step, &
246 has_unit_metric)
247 ELSE
248 CALL do_special_diag(scf_env, mos, matrix_ks, &
249 scf_control, scf_section, &
250 diis_step)
251 END IF
252 ! OT diagonalization
253 CASE (ot_diag_method_nr)
254 CALL do_ot_diag(scf_env, mos, matrix_ks, matrix_s, &
255 scf_control, scf_section, diis_step)
256 ! Block Krylov diagonlization
258 IF ((scf_env%krylov_space%eps_std_diag > 0.0_dp) .AND. &
259 (scf_env%iter_count == 1 .OR. scf_env%iter_delta > scf_env%krylov_space%eps_std_diag)) THEN
260 IF (scf_env%krylov_space%always_check_conv) THEN
261 CALL do_block_krylov_diag(scf_env, mos, matrix_ks, &
262 scf_control, scf_section, check_moconv_only=.true.)
263 END IF
264 CALL do_general_diag(scf_env, mos, matrix_ks, &
265 matrix_s, scf_control, scf_section, diis_step)
266 ELSE
267 CALL do_block_krylov_diag(scf_env, mos, matrix_ks, &
268 scf_control, scf_section)
269 END IF
270 IF (scf_control%do_diag_sub) THEN
271 skip_diag_sub = (scf_env%subspace_env%eps_diag_sub > 0.0_dp) .AND. &
272 (scf_env%iter_count == 1 .OR. scf_env%iter_delta > scf_env%subspace_env%eps_diag_sub)
273 IF (.NOT. skip_diag_sub) THEN
274 CALL do_scf_diag_subspace(qs_env, scf_env, scf_env%subspace_env, mos, rho, &
275 ks_env, scf_section, scf_control)
276 END IF
277 END IF
278 ! Block Davidson diagonlization
280 CALL do_block_davidson_diag(qs_env, scf_env, mos, matrix_ks, matrix_s, scf_control, &
281 scf_section, .false.)
282 ! OT without diagonlization. Needs special treatment for SCP runs
283 CASE (ot_method_nr)
284 CALL qs_scf_loop_do_ot(qs_env, scf_env, scf_control%smear, mos, rho, &
285 qs_env%mo_derivs, energy%total, &
286 matrix_s, energy_only=energy_only, has_unit_metric=has_unit_metric)
287 END SELECT
288 IF (disable_diis) scf_control%eps_diis = saved_eps_diis
289
290 energy%kTS = 0.0_dp
291 energy%efermi = 0.0_dp
292 CALL get_qs_env(qs_env, mos=mos)
293 DO ispin = 1, SIZE(mos)
294 energy%kTS = energy%kTS + mos(ispin)%kTS
295 energy%efermi = energy%efermi + mos(ispin)%mu
296 END DO
297 energy%efermi = energy%efermi/real(SIZE(mos), kind=dp)
298
299 CALL timestop(handle)
300
301 END SUBROUTINE qs_scf_new_mos
302
303! **************************************************************************************************
304!> \brief Updates MOs and density matrix using diagonalization
305!> Kpoint code
306!> \param qs_env ...
307!> \param scf_env ...
308!> \param scf_control ...
309!> \param diis_step ...
310!> \param probe ...
311! **************************************************************************************************
312 SUBROUTINE qs_scf_new_mos_kp(qs_env, scf_env, scf_control, diis_step, probe)
313 TYPE(qs_environment_type), POINTER :: qs_env
314 TYPE(qs_scf_env_type), POINTER :: scf_env
315 TYPE(scf_control_type), POINTER :: scf_control
316 LOGICAL :: diis_step
317 TYPE(hairy_probes_type), DIMENSION(:), OPTIONAL, &
318 POINTER :: probe
319
320 CHARACTER(LEN=*), PARAMETER :: routinen = 'qs_scf_new_mos_kp'
321
322 INTEGER :: handle, ispin
323 LOGICAL :: disable_diis, has_unit_metric
324 REAL(dp) :: diis_error, saved_eps_diis
325 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: matrix_ks, matrix_s
326 TYPE(dft_control_type), POINTER :: dft_control
327 TYPE(kpoint_type), POINTER :: kpoints
328 TYPE(mo_set_type), DIMENSION(:, :), POINTER :: mos
329 TYPE(qs_energy_type), POINTER :: energy
330
331 CALL timeset(routinen, handle)
332
333 NULLIFY (dft_control, kpoints, matrix_ks, matrix_s)
334
335 CALL get_qs_env(qs_env=qs_env, dft_control=dft_control, kpoints=kpoints)
336 scf_env%iter_param = 0.0_dp
337 disable_diis = dft_control%qs_control%xtb_control%do_tblite .AND. &
338 tb_native_scc_mixer_active(dft_control)
339 IF (disable_diis) THEN
340 saved_eps_diis = scf_control%eps_diis
341 scf_control%eps_diis = 0.0_dp
342 END IF
343
344 IF (dft_control%roks) &
345 cpabort("KP code: ROKS method not available: ")
346
347 SELECT CASE (scf_env%method)
348 CASE DEFAULT
349 CALL cp_abort(__location__, &
350 "KP code: Unknown scf method: "// &
351 cp_to_string(scf_env%method))
353 ! Diagonlization in non orthonormal case
354 CALL get_qs_env(qs_env, matrix_ks_kp=matrix_ks, matrix_s_kp=matrix_s)
355 IF (dft_control%hairy_probes .EQV. .true.) THEN
356 scf_control%smear%do_smear = .false.
357 CALL do_general_diag_kp(matrix_ks, matrix_s, kpoints, scf_env, scf_control, .true., &
358 diis_step, diis_error, qs_env, probe)
359 ELSE
360 CALL do_general_diag_kp(matrix_ks, matrix_s, kpoints, scf_env, scf_control, .true., &
361 diis_step, diis_error, qs_env)
362 END IF
363 IF (diis_step) THEN
364 scf_env%iter_param = diis_error
365 scf_env%iter_method = "DIIS/Diag."
366 ELSE
367 IF (scf_env%mixing_method == 0) THEN
368 scf_env%iter_method = "NoMix/Diag."
369 ELSE IF (scf_env%mixing_method == 1) THEN
370 scf_env%iter_param = scf_env%p_mix_alpha
371 scf_env%iter_method = "P_Mix/Diag."
372 ELSEIF (scf_env%mixing_method > 1) THEN
373 scf_env%iter_param = scf_env%mixing_store%alpha
374 scf_env%iter_method = trim(scf_env%mixing_store%iter_method)//"/Diag."
375 END IF
376 END IF
378 CALL get_qs_env(qs_env=qs_env, has_unit_metric=has_unit_metric)
379 cpassert(has_unit_metric)
380 ! Diagonlization in orthonormal case
381 CALL cp_abort(__location__, &
382 "KP code: Scf method not available: "// &
383 cp_to_string(scf_env%method))
384 CASE (ot_diag_method_nr, &
388 CALL cp_abort(__location__, &
389 "KP code: Scf method not available: "// &
390 cp_to_string(scf_env%method))
391 CASE (smeagol_method_nr)
392 ! SMEAGOL interface
393 diis_step = .false.
394 IF (scf_env%mixing_method == 0) THEN
395 scf_env%iter_method = "NoMix/SMGL"
396 ELSE IF (scf_env%mixing_method == 1) THEN
397 scf_env%iter_param = scf_env%p_mix_alpha
398 scf_env%iter_method = "P_Mix/SMGL"
399 ELSE IF (scf_env%mixing_method > 1) THEN
400 scf_env%iter_param = scf_env%mixing_store%alpha
401 scf_env%iter_method = trim(scf_env%mixing_store%iter_method)//"/SMGL"
402 END IF
403 CALL run_smeagol_emtrans(qs_env, last=.false., iter=scf_env%iter_count, rho_ao_kp=scf_env%p_mix_new)
404 END SELECT
405 IF (disable_diis) scf_control%eps_diis = saved_eps_diis
406
407 CALL get_qs_env(qs_env=qs_env, energy=energy)
408 energy%kTS = 0.0_dp
409 energy%efermi = 0.0_dp
410 mos => kpoints%kp_env(1)%kpoint_env%mos
411 DO ispin = 1, SIZE(mos, 2)
412 energy%kTS = energy%kTS + mos(1, ispin)%kTS
413 energy%efermi = energy%efermi + mos(1, ispin)%mu
414 END DO
415 energy%efermi = energy%efermi/real(SIZE(mos, 2), kind=dp)
416
417 CALL timestop(handle)
418
419 END SUBROUTINE qs_scf_new_mos_kp
420
421! **************************************************************************************************
422!> \brief the inner loop of scf, specific to using to the orbital transformation method
423!> basically, in goes the ks matrix out goes a new p matrix
424!> \param qs_env ...
425!> \param scf_env ...
426!> \param smear ...
427!> \param mos ...
428!> \param rho ...
429!> \param mo_derivs ...
430!> \param total_energy ...
431!> \param matrix_s ...
432!> \param energy_only ...
433!> \param has_unit_metric ...
434!> \par History
435!> 03.2006 created [Joost VandeVondele]
436!> 2013 moved from qs_scf [Florian Schiffmann]
437! **************************************************************************************************
438 SUBROUTINE qs_scf_loop_do_ot(qs_env, scf_env, smear, mos, rho, mo_derivs, total_energy, &
439 matrix_s, energy_only, has_unit_metric)
440
441 TYPE(qs_environment_type), POINTER :: qs_env
442 TYPE(qs_scf_env_type), POINTER :: scf_env
443 TYPE(smear_type), POINTER :: smear
444 TYPE(mo_set_type), DIMENSION(:), INTENT(INOUT) :: mos
445 TYPE(qs_rho_type), POINTER :: rho
446 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: mo_derivs
447 REAL(kind=dp), INTENT(IN) :: total_energy
448 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_s
449 LOGICAL, INTENT(INOUT) :: energy_only
450 LOGICAL, INTENT(IN) :: has_unit_metric
451
452 CHARACTER(LEN=*), PARAMETER :: routinen = 'qs_scf_loop_do_ot'
453
454 INTEGER :: handle, ispin
455 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: rho_ao
456 TYPE(dbcsr_type), POINTER :: orthogonality_metric
457
458 CALL timeset(routinen, handle)
459 NULLIFY (rho_ao)
460
461 CALL qs_rho_get(rho, rho_ao=rho_ao)
462
463 IF (has_unit_metric) THEN
464 NULLIFY (orthogonality_metric)
465 ELSE
466 orthogonality_metric => matrix_s(1)%matrix
467 END IF
468
469 ! in case of LSD the first spin qs_ot_env will drive the minimization
470 ! in the case of a restricted calculation, it will make sure the spin orbitals are equal
471
472 CALL ot_scf_mini(mos, mo_derivs, smear, orthogonality_metric, &
473 total_energy, energy_only, scf_env%iter_delta, &
474 scf_env%qs_ot_env)
475
476 DO ispin = 1, SIZE(mos)
477 CALL set_mo_occupation(mo_set=mos(ispin), smear=smear)
478 END DO
479
480 DO ispin = 1, SIZE(mos)
481 CALL calculate_density_matrix(mos(ispin), &
482 rho_ao(ispin)%matrix, &
483 use_dbcsr=.true.)
484 END DO
485
486 scf_env%iter_method = scf_env%qs_ot_env(1)%OT_METHOD_FULL
487 scf_env%iter_param = scf_env%qs_ot_env(1)%ds_min
488 qs_env%broyden_adaptive_sigma = scf_env%qs_ot_env(1)%broyden_adaptive_sigma
489
490 CALL timestop(handle)
491
492 END SUBROUTINE qs_scf_loop_do_ot
493
494! **************************************************************************************************
495!> \brief Performs the requested density mixing if any needed
496!> \param scf_env Holds SCF environment information
497!> \param rho All data for the electron density
498!> \param para_env Parallel environment
499!> \param diis_step Did we do a DIIS step?
500! **************************************************************************************************
501 SUBROUTINE qs_scf_density_mixing(scf_env, rho, para_env, diis_step)
502 TYPE(qs_scf_env_type), POINTER :: scf_env
503 TYPE(qs_rho_type), POINTER :: rho
504 TYPE(mp_para_env_type), POINTER :: para_env
505 LOGICAL :: diis_step
506
507 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: rho_ao_kp
508
509 NULLIFY (rho_ao_kp)
510
511 CALL qs_rho_get(rho, rho_ao_kp=rho_ao_kp)
512
513 SELECT CASE (scf_env%mixing_method)
514 CASE (direct_mixing_nr)
515 CALL scf_env_density_mixing(scf_env%p_mix_new, &
516 scf_env%mixing_store, rho_ao_kp, para_env, scf_env%iter_delta, scf_env%iter_count, &
517 diis=diis_step)
520 ! Compute the difference p_out-p_in
521 CALL self_consistency_check(rho_ao_kp, scf_env%p_delta, para_env, scf_env%p_mix_new, &
522 delta=scf_env%iter_delta)
523 CASE (no_mixing_nr)
524 CASE DEFAULT
525 CALL cp_abort(__location__, &
526 "unknown scf mixing method: "// &
527 cp_to_string(scf_env%mixing_method))
528 END SELECT
529
530 END SUBROUTINE qs_scf_density_mixing
531
532! **************************************************************************************************
533!> \brief checks whether exit conditions for outer loop are satisfied
534!> \param qs_env ...
535!> \param scf_env ...
536!> \param scf_control ...
537!> \param should_stop ...
538!> \param outer_loop_converged ...
539!> \param exit_outer_loop ...
540! **************************************************************************************************
541 SUBROUTINE qs_scf_check_outer_exit(qs_env, scf_env, scf_control, should_stop, &
542 outer_loop_converged, exit_outer_loop)
543 TYPE(qs_environment_type), POINTER :: qs_env
544 TYPE(qs_scf_env_type), POINTER :: scf_env
545 TYPE(scf_control_type), POINTER :: scf_control
546 LOGICAL :: should_stop, outer_loop_converged, &
547 exit_outer_loop
548
549 REAL(kind=dp) :: outer_loop_eps
550
551 outer_loop_converged = .true.
552 IF (scf_control%outer_scf%have_scf) THEN
553 ! We have an outer SCF loop...
554 scf_env%outer_scf%iter_count = scf_env%outer_scf%iter_count + 1
555 outer_loop_converged = .false.
556
557 CALL outer_loop_gradient(qs_env, scf_env)
558 ! Multiple constraints: get largest deviation
559 outer_loop_eps = sqrt(maxval(scf_env%outer_scf%gradient(:, scf_env%outer_scf%iter_count)**2))
560
561 IF (outer_loop_eps < scf_control%outer_scf%eps_scf) outer_loop_converged = .true.
562 END IF
563
564 exit_outer_loop = should_stop .OR. outer_loop_converged .OR. &
565 scf_env%outer_scf%iter_count > scf_control%outer_scf%max_scf
566
567 END SUBROUTINE qs_scf_check_outer_exit
568
569! **************************************************************************************************
570!> \brief checks whether exit conditions for inner loop are satisfied
571!> \param qs_env ...
572!> \param scf_env ...
573!> \param scf_control ...
574!> \param should_stop ...
575!> \param just_energy ...
576!> \param exit_inner_loop ...
577!> \param inner_loop_converged ...
578!> \param output_unit ...
579! **************************************************************************************************
580 SUBROUTINE qs_scf_check_inner_exit(qs_env, scf_env, scf_control, should_stop, just_energy, &
581 exit_inner_loop, inner_loop_converged, output_unit)
582 TYPE(qs_environment_type), POINTER :: qs_env
583 TYPE(qs_scf_env_type), POINTER :: scf_env
584 TYPE(scf_control_type), POINTER :: scf_control
585 LOGICAL :: should_stop, just_energy, &
586 exit_inner_loop, inner_loop_converged
587 INTEGER :: output_unit
588
589 inner_loop_converged = .false.
590 exit_inner_loop = .false.
591
592 CALL external_control(should_stop, "SCF", target_time=qs_env%target_time, &
593 start_time=qs_env%start_time)
594 IF (scf_env%iter_delta < scf_control%eps_scf) THEN
595 IF (output_unit > 0) THEN
596 WRITE (unit=output_unit, fmt="(/,T3,A,I5,A/)") &
597 "*** SCF run converged in ", scf_env%iter_count, " steps ***"
598 END IF
599 inner_loop_converged = .true.
600 exit_inner_loop = .true.
601 ELSE IF (should_stop .OR. scf_env%iter_count >= scf_control%max_scf) THEN
602 inner_loop_converged = .false.
603 IF (just_energy) THEN
604 exit_inner_loop = .false.
605 ELSE
606 exit_inner_loop = .true.
607 IF (output_unit > 0) THEN
608 WRITE (unit=output_unit, fmt="(/,T3,A,I5,A/)") &
609 "Leaving inner SCF loop after reaching ", scf_env%iter_count, " steps."
610 END IF
611 END IF
612 END IF
613
614 END SUBROUTINE qs_scf_check_inner_exit
615
616! **************************************************************************************************
617!> \brief undoing density mixing. Important upon convergence
618!> \param scf_env ...
619!> \param rho ...
620!> \param dft_control ...
621!> \param para_env ...
622!> \param diis_step ...
623! **************************************************************************************************
624 SUBROUTINE qs_scf_undo_mixing(scf_env, rho, dft_control, para_env, diis_step)
625 TYPE(qs_scf_env_type), POINTER :: scf_env
626 TYPE(qs_rho_type), POINTER :: rho
627 TYPE(dft_control_type), POINTER :: dft_control
628 TYPE(mp_para_env_type), POINTER :: para_env
629 LOGICAL :: diis_step
630
631 CHARACTER(len=default_string_length) :: name
632 INTEGER :: ic, ispin, nc
633 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: rho_ao_kp
634
635 NULLIFY (rho_ao_kp)
636
637 IF (scf_env%mixing_method > 0) THEN
638 CALL qs_rho_get(rho, rho_ao_kp=rho_ao_kp)
639 nc = SIZE(scf_env%p_mix_new, 2)
640 SELECT CASE (scf_env%mixing_method)
641 CASE (direct_mixing_nr)
642 CALL scf_env_density_mixing(scf_env%p_mix_new, scf_env%mixing_store, &
643 rho_ao_kp, para_env, scf_env%iter_delta, &
644 scf_env%iter_count, diis=diis_step, &
645 invert=.true.)
646 DO ic = 1, nc
647 DO ispin = 1, dft_control%nspins
648 CALL dbcsr_get_info(rho_ao_kp(ispin, ic)%matrix, name=name) ! keep the name
649 CALL dbcsr_copy(rho_ao_kp(ispin, ic)%matrix, scf_env%p_mix_new(ispin, ic)%matrix, name=name)
650 END DO
651 END DO
654 DO ic = 1, nc
655 DO ispin = 1, dft_control%nspins
656 CALL dbcsr_get_info(rho_ao_kp(ispin, ic)%matrix, name=name) ! keep the name
657 CALL dbcsr_copy(rho_ao_kp(ispin, ic)%matrix, scf_env%p_mix_new(ispin, ic)%matrix, name=name)
658 END DO
659 END DO
660 END SELECT
661 END IF
662 END SUBROUTINE qs_scf_undo_mixing
663
664! **************************************************************************************************
665!> \brief Performs the updates rho (takes care of mixing as well)
666!> \param rho ...
667!> \param qs_env ...
668!> \param scf_env ...
669!> \param ks_env ...
670!> \param mix_rho ...
671! **************************************************************************************************
672 SUBROUTINE qs_scf_rho_update(rho, qs_env, scf_env, ks_env, mix_rho)
673 TYPE(qs_rho_type), POINTER :: rho
674 TYPE(qs_environment_type), POINTER :: qs_env
675 TYPE(qs_scf_env_type), POINTER :: scf_env
676 TYPE(qs_ks_env_type), POINTER :: ks_env
677 LOGICAL, INTENT(IN) :: mix_rho
678
679 TYPE(mp_para_env_type), POINTER :: para_env
680
681 NULLIFY (para_env)
682 CALL get_qs_env(qs_env, para_env=para_env)
683 ! ** update qs_env%rho
684 CALL qs_rho_update_rho(rho, qs_env=qs_env)
685 ! ** Density mixing through density matrix or on the reciprocal space grid (exclusive)
686 IF (mix_rho) THEN
687 CALL gspace_mixing(qs_env, scf_env%mixing_method, scf_env%mixing_store, rho, &
688 para_env, scf_env%iter_count)
689
690 END IF
691 CALL qs_ks_did_change(ks_env, rho_changed=.true.)
692
693 END SUBROUTINE qs_scf_rho_update
694
695! **************************************************************************************************
696!> \brief Performs the necessary steps before leaving innner scf loop
697!> \param scf_env ...
698!> \param qs_env ...
699!> \param diis_step ...
700!> \param output_unit ...
701! **************************************************************************************************
702 SUBROUTINE qs_scf_inner_finalize(scf_env, qs_env, diis_step, output_unit)
703 TYPE(qs_scf_env_type), POINTER :: scf_env
704 TYPE(qs_environment_type), POINTER :: qs_env
705 LOGICAL :: diis_step
706 INTEGER, INTENT(IN) :: output_unit
707
708 LOGICAL :: do_kpoints
709 TYPE(dft_control_type), POINTER :: dft_control
710 TYPE(mp_para_env_type), POINTER :: para_env
711 TYPE(qs_energy_type), POINTER :: energy
712 TYPE(qs_ks_env_type), POINTER :: ks_env
713 TYPE(qs_rho_type), POINTER :: rho
714
715 NULLIFY (energy, rho, dft_control, ks_env)
716
717 CALL get_qs_env(qs_env=qs_env, energy=energy, ks_env=ks_env, &
718 rho=rho, dft_control=dft_control, para_env=para_env, &
719 do_kpoints=do_kpoints)
720
721 CALL cleanup_scf_loop(scf_env)
722
723 ! now, print out energies and charges corresponding to the obtained wfn
724 ! (this actually is not 100% consistent at this point)!
725 CALL qs_scf_print_summary(output_unit, qs_env)
726
727 CALL qs_scf_undo_mixing(scf_env, rho, dft_control, para_env, diis_step)
728
729 ! *** update rspace rho since the mo changed
730 ! *** this might not always be needed (i.e. no post calculation / no forces )
731 ! *** but guarantees that rho and wfn are consistent at this point
732 CALL qs_scf_rho_update(rho, qs_env, scf_env, ks_env, mix_rho=.false.)
733
734 END SUBROUTINE qs_scf_inner_finalize
735
736! **************************************************************************************************
737!> \brief perform cleanup operations at the end of an scf loop
738!> \param scf_env ...
739!> \par History
740!> 03.2006 created [Joost VandeVondele]
741! **************************************************************************************************
742 SUBROUTINE cleanup_scf_loop(scf_env)
743 TYPE(qs_scf_env_type), INTENT(INOUT) :: scf_env
744
745 CHARACTER(len=*), PARAMETER :: routinen = 'cleanup_scf_loop'
746
747 INTEGER :: handle, ispin
748
749 CALL timeset(routinen, handle)
750
751 SELECT CASE (scf_env%method)
752 CASE (ot_method_nr)
753 DO ispin = 1, SIZE(scf_env%qs_ot_env)
754 CALL ot_scf_destroy(scf_env%qs_ot_env(ispin))
755 END DO
756 DEALLOCATE (scf_env%qs_ot_env)
757 CASE (ot_diag_method_nr)
758 !
760 !
762 !
764 !
766 !
767 CASE (smeagol_method_nr)
768 !
769 CASE DEFAULT
770 CALL cp_abort(__location__, &
771 "unknown scf method method:"// &
772 cp_to_string(scf_env%method))
773 END SELECT
774
775 CALL timestop(handle)
776
777 END SUBROUTINE cleanup_scf_loop
778
779END MODULE qs_scf_loop_utils
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
subroutine, public dbcsr_copy(matrix_b, matrix_a, name, keep_sparsity, keep_imaginary)
...
subroutine, public dbcsr_get_info(matrix, nblkrows_total, nblkcols_total, nfullrows_total, nfullcols_total, nblkrows_local, nblkcols_local, nfullrows_local, nfullcols_local, my_prow, my_pcol, local_rows, local_cols, proc_row_dist, proc_col_dist, row_blk_size, col_blk_size, row_blk_offset, col_blk_offset, distribution, name, matrix_type, group)
...
Routines to handle the external control of CP2K.
subroutine, public external_control(should_stop, flag, globenv, target_time, start_time, force_check)
External manipulations during a run : when the <PROJECT_NAME>.EXIT_$runtype command is sent the progr...
various routines to log and control the output. The idea is that decisions about where to log should ...
objects that represent the structure of input sections and the data contained in an input section
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
integer, parameter, public default_string_length
Definition kinds.F:57
Types and basic routines needed for a kpoint calculation.
Interface to the message passing library MPI.
collects routines that calculate density matrices
module that contains the definitions of the scf types
integer, parameter, public broyden_mixing_nr
integer, parameter, public modified_broyden_mixing_nr
integer, parameter, public no_mixing_nr
integer, parameter, public direct_mixing_nr
integer, parameter, public multisecant_mixing_nr
integer, parameter, public pulay_mixing_nr
integer, parameter, public gspace_mixing_nr
subroutine, public get_qs_env(qs_env, atomic_kind_set, qs_kind_set, cell, super_cell, cell_ref, use_ref_cell, kpoints, dft_control, mos, sab_orb, sab_all, qmmm, qmmm_periodic, mimic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, sab_cneo, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, xcint_weights, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, rhoz_cneo_set, ecoul_1c, rho0_s_rs, rho0_s_gs, rhoz_cneo_s_rs, rhoz_cneo_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, harris_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, wanniercentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs, do_rixs, tb_tblite)
Get the QUICKSTEP environment.
subroutine, public fb_env_do_diag(fb_env, qs_env, matrix_ks, matrix_s, scf_section, diis_step)
Do filtered matrix method diagonalisation.
subroutine, public gspace_mixing(qs_env, mixing_method, mixing_store, rho, para_env, iter_count)
Driver for the g-space mixing, calls the proper routine given the requested method.
subroutine, public qs_ks_did_change(ks_env, s_mstruct_changed, rho_changed, potential_changed, full_reset)
tells that some of the things relevant to the ks calculation did change. has to be called when change...
subroutine, public self_consistency_check(rho_ao, p_delta, para_env, p_out, delta)
...
Set occupation of molecular orbitals.
Definition and initialisation of the mo data type.
Definition qs_mo_types.F:22
methods for deltaSCF calculations
subroutine, public do_mom_diag(scf_env, mos, matrix_ks, matrix_s, scf_control, scf_section, diis_step)
do an SCF iteration, then compute occupation numbers of the new molecular orbitals according to their...
basic functionality for using ot in the scf routines.
Definition qs_ot_scf.F:14
subroutine, public ot_scf_mini(mo_array, matrix_dedc, smear, matrix_s, energy, energy_only, delta, qs_ot_env)
performs the actual minimisation, needs only limited info updated for restricted calculations matrix_...
Definition qs_ot_scf.F:125
subroutine, public ot_scf_destroy(qs_ot_env)
...
Definition qs_ot_scf.F:444
Routines for performing an outer scf loop.
subroutine, public outer_loop_gradient(qs_env, scf_env)
computes the gradient wrt to the outer loop variables
methods of the rho structure (defined in qs_rho_types)
subroutine, public qs_rho_update_rho(rho_struct, qs_env, rho_xc_external, local_rho_set, task_list_external, task_list_external_soft, pw_env_external, para_env_external)
updates rho_r and rho_g to the rhorho_ao. if use_kinetic_energy_density also computes tau_r and tau_g...
superstucture that hold various representations of the density and keeps track of which ones are vali...
subroutine, public qs_rho_get(rho_struct, rho_ao, rho_ao_im, rho_ao_kp, rho_ao_im_kp, rho_r, drho_r, rho_g, drho_g, tau_r, tau_g, rho_r_valid, drho_r_valid, rho_g_valid, drho_g_valid, tau_r_valid, tau_g_valid, tot_rho_r, tot_rho_g, rho_r_sccs, soft_valid, complex_rho_ao)
returns info about the density described by this object. If some representation is not available an e...
Different diagonalization schemes that can be used for the iterative solution of the eigenvalue probl...
subroutine, public do_ot_diag(scf_env, mos, matrix_ks, matrix_s, scf_control, scf_section, diis_step)
the inner loop of scf, specific to iterative diagonalization using OT with S matrix; basically,...
subroutine, public do_block_davidson_diag(qs_env, scf_env, mos, matrix_ks, matrix_s, scf_control, scf_section, check_moconv_only)
iterative diagonalization using the block davidson space approach
subroutine, public do_roks_diag(scf_env, mos, matrix_ks, matrix_s, scf_control, scf_section, diis_step, orthogonal_basis)
Solve a set restricted open Kohn-Sham (ROKS) equations based on the alpha and beta Kohn-Sham matrices...
subroutine, public do_scf_diag_subspace(qs_env, scf_env, subspace_env, mos, rho, ks_env, scf_section, scf_control)
inner loop within MOS subspace, to refine occupation and density, before next diagonalization of the ...
subroutine, public do_block_krylov_diag(scf_env, mos, matrix_ks, scf_control, scf_section, check_moconv_only)
iterative diagonalization using the block Krylov-space approach
subroutine, public do_special_diag(scf_env, mos, matrix_ks, scf_control, scf_section, diis_step)
the inner loop of scf, specific to diagonalization without S matrix basically, in goes the ks matrix ...
subroutine, public do_general_diag(scf_env, mos, matrix_ks, matrix_s, scf_control, scf_section, diis_step, probe)
...
subroutine, public do_general_diag_kp(matrix_ks, matrix_s, kpoints, scf_env, scf_control, update_p, diis_step, diis_error, qs_env, probe)
Kpoint diagonalization routine Transforms matrices to kpoint, distributes kpoint groups,...
Utility routines for qs_scf.
subroutine, public qs_scf_check_inner_exit(qs_env, scf_env, scf_control, should_stop, just_energy, exit_inner_loop, inner_loop_converged, output_unit)
checks whether exit conditions for inner loop are satisfied
subroutine, public qs_scf_inner_finalize(scf_env, qs_env, diis_step, output_unit)
Performs the necessary steps before leaving innner scf loop.
subroutine, public qs_scf_set_loop_flags(scf_env, diis_step, energy_only, just_energy, exit_inner_loop)
computes properties for a given hamiltonian using the current wfn
subroutine, public qs_scf_rho_update(rho, qs_env, scf_env, ks_env, mix_rho)
Performs the updates rho (takes care of mixing as well)
subroutine, public qs_scf_new_mos_kp(qs_env, scf_env, scf_control, diis_step, probe)
Updates MOs and density matrix using diagonalization Kpoint code.
subroutine, public qs_scf_check_outer_exit(qs_env, scf_env, scf_control, should_stop, outer_loop_converged, exit_outer_loop)
checks whether exit conditions for outer loop are satisfied
subroutine, public qs_scf_density_mixing(scf_env, rho, para_env, diis_step)
Performs the requested density mixing if any needed.
subroutine, public qs_scf_new_mos(qs_env, scf_env, scf_control, scf_section, diis_step, energy_only, probe)
takes known energy and derivatives and produces new wfns and or density matrix
groups fairly general SCF methods, so that modules other than qs_scf can use them too split off from ...
subroutine, public scf_env_density_mixing(p_mix_new, mixing_store, rho_ao, para_env, iter_delta, iter_count, diis, invert)
perform (if requested) a density mixing
subroutine, public qs_scf_print_summary(output_unit, qs_env)
writes a summary of information after scf
module that contains the definitions of the scf types
integer, parameter, public ot_diag_method_nr
integer, parameter, public filter_matrix_diag_method_nr
integer, parameter, public block_davidson_diag_method_nr
integer, parameter, public smeagol_method_nr
integer, parameter, public ot_method_nr
integer, parameter, public special_diag_method_nr
integer, parameter, public block_krylov_diag_method_nr
integer, parameter, public general_diag_method_nr
parameters that control an scf iteration
CP2K+SMEAGOL interface.
subroutine, public run_smeagol_emtrans(qs_env, last, iter, rho_ao_kp)
Run NEGF/SMEAGOL transport calculation.
interface to tblite
logical function, public tb_native_scc_mixer_active(dft_control)
Return whether the tblite native SCC mixer is active for this run.
Contains information about kpoints.
stores all the informations relevant to an mpi environment
calculation environment to calculate the ks matrix, holds all the needed vars. assumes that the core ...
keeps the density in various representations, keeping track of which ones are valid.
contains the parameters needed by a scf run