(git:e5b1968)
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-2025 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
36 USE qs_ks_types, ONLY: qs_ks_did_change,&
40 USE qs_mo_types, ONLY: mo_set_type
42 USE qs_ot_scf, ONLY: ot_scf_destroy,&
46 USE qs_rho_types, ONLY: qs_rho_get,&
58 USE qs_scf_types, ONLY: &
65#include "./base/base_uses.f90"
66
67 IMPLICIT NONE
68
69 PRIVATE
70
71 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_scf_loop_utils'
72
73 PUBLIC :: qs_scf_set_loop_flags, &
77
78CONTAINS
79
80! **************************************************************************************************
81!> \brief computes properties for a given hamiltonian using the current wfn
82!> \param scf_env ...
83!> \param diis_step ...
84!> \param energy_only ...
85!> \param just_energy ...
86!> \param exit_inner_loop ...
87! **************************************************************************************************
88 SUBROUTINE qs_scf_set_loop_flags(scf_env, diis_step, &
89 energy_only, just_energy, exit_inner_loop)
90
91 TYPE(qs_scf_env_type), POINTER :: scf_env
92 LOGICAL :: diis_step, energy_only, just_energy, &
93 exit_inner_loop
94
95! Some flags needed to be set at the beginning of the loop
96
97 diis_step = .false.
98 energy_only = .false.
99 just_energy = .false.
100
101 ! SCF loop, optimisation of the wfn coefficients
102 ! qs_env%rho%rho_r and qs_env%rho%rho_g should be up to date here
103
104 scf_env%iter_count = 0
105 exit_inner_loop = .false.
106
107 END SUBROUTINE qs_scf_set_loop_flags
108
109! **************************************************************************************************
110!> \brief takes known energy and derivatives and produces new wfns
111!> and or density matrix
112!> \param qs_env ...
113!> \param scf_env ...
114!> \param scf_control ...
115!> \param scf_section ...
116!> \param diis_step ...
117!> \param energy_only ...
118!> \param probe ...
119! **************************************************************************************************
120 SUBROUTINE qs_scf_new_mos(qs_env, scf_env, scf_control, scf_section, diis_step, &
121 energy_only, probe)
122 TYPE(qs_environment_type), POINTER :: qs_env
123 TYPE(qs_scf_env_type), POINTER :: scf_env
124 TYPE(scf_control_type), POINTER :: scf_control
125 TYPE(section_vals_type), POINTER :: scf_section
126 LOGICAL :: diis_step, energy_only
127 TYPE(hairy_probes_type), DIMENSION(:), OPTIONAL, &
128 POINTER :: probe
129
130 CHARACTER(LEN=*), PARAMETER :: routinen = 'qs_scf_new_mos'
131
132 INTEGER :: handle, ispin
133 LOGICAL :: has_unit_metric, skip_diag_sub
134 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_ks, matrix_s
135 TYPE(dft_control_type), POINTER :: dft_control
136 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
137 TYPE(qs_energy_type), POINTER :: energy
138 TYPE(qs_ks_env_type), POINTER :: ks_env
139 TYPE(qs_rho_type), POINTER :: rho
140
141 CALL timeset(routinen, handle)
142
143 NULLIFY (energy, ks_env, matrix_ks, matrix_s, rho, mos, dft_control)
144
145 CALL get_qs_env(qs_env=qs_env, &
146 matrix_s=matrix_s, energy=energy, &
147 ks_env=ks_env, &
148 matrix_ks=matrix_ks, rho=rho, mos=mos, &
149 dft_control=dft_control, &
150 has_unit_metric=has_unit_metric)
151 scf_env%iter_param = 0.0_dp
152
153 ! transfer total_zeff_corr from qs_env to scf_env only if
154 ! correct_el_density_dip is switched on [SGh]
155 IF (dft_control%correct_el_density_dip) THEN
156 scf_env%sum_zeff_corr = qs_env%total_zeff_corr
157 IF (abs(qs_env%total_zeff_corr) > 0.0_dp) THEN
158 IF (scf_env%method /= general_diag_method_nr) THEN
159 CALL cp_abort(__location__, &
160 "Please use ALGORITHM STANDARD in "// &
161 "SCF%DIAGONALIZATION if "// &
162 "CORE_CORRECTION /= 0.0 and "// &
163 "SURFACE_DIPOLE_CORRECTION TRUE ")
164 ELSEIF (dft_control%roks) THEN
165 CALL cp_abort(__location__, &
166 "Combination of "// &
167 "CORE_CORRECTION /= 0.0 and "// &
168 "SURFACE_DIPOLE_CORRECTION TRUE "// &
169 "is not implemented with ROKS")
170 ELSEIF (scf_control%diagonalization%mom) THEN
171 CALL cp_abort(__location__, &
172 "Combination of "// &
173 "CORE_CORRECTION /= 0.0 and "// &
174 "SURFACE_DIPOLE_CORRECTION TRUE "// &
175 "is not implemented with SCF%MOM")
176 END IF
177 END IF
178 END IF
179
180 SELECT CASE (scf_env%method)
181 CASE DEFAULT
182 CALL cp_abort(__location__, &
183 "unknown scf method: "// &
184 cp_to_string(scf_env%method))
185
186 ! *************************************************************************
187 ! Filter matrix diagonalisation: ugly implementation at this point of time
188 ! *************************************************************************
190
191 IF (abs(qs_env%total_zeff_corr) > 0.0_dp) THEN
192 CALL cp_abort(__location__, &
193 "CORE_CORRECTION /= 0.0 plus SURFACE_DIPOLE_CORRECTION TRUE "// &
194 "requires SCF%DIAGONALIZATION: ALGORITHM STANDARD")
195 END IF
196 CALL fb_env_do_diag(scf_env%filter_matrix_env, qs_env, &
197 matrix_ks, matrix_s, scf_section, diis_step)
198
199 ! Diagonlization in non orthonormal case
201 IF (dft_control%roks) THEN
202 CALL do_roks_diag(scf_env, mos, matrix_ks, matrix_s, &
203 scf_control, scf_section, diis_step, &
204 has_unit_metric)
205 ELSE
206 IF (scf_control%diagonalization%mom) THEN
207 CALL do_mom_diag(scf_env, mos, matrix_ks, &
208 matrix_s, scf_control, scf_section, &
209 diis_step)
210 ELSE
211 IF (dft_control%hairy_probes .EQV. .true.) THEN
212 CALL do_general_diag(scf_env, mos, matrix_ks, &
213 matrix_s, scf_control, scf_section, &
214 diis_step, &
215 probe)
216 ELSE
217 CALL do_general_diag(scf_env, mos, matrix_ks, &
218 matrix_s, scf_control, scf_section, &
219 diis_step)
220 END IF
221 END IF
222 IF (scf_control%do_diag_sub) THEN
223 skip_diag_sub = (scf_env%subspace_env%eps_diag_sub > 0.0_dp) .AND. &
224 (scf_env%iter_count == 1 .OR. scf_env%iter_delta > scf_env%subspace_env%eps_diag_sub)
225 IF (.NOT. skip_diag_sub) THEN
226 CALL do_scf_diag_subspace(qs_env, scf_env, scf_env%subspace_env, mos, rho, &
227 ks_env, scf_section, scf_control)
228 END IF
229 END IF
230 END IF
231 ! Diagonlization in orthonormal case
233 IF (dft_control%roks) THEN
234 CALL do_roks_diag(scf_env, mos, matrix_ks, matrix_s, &
235 scf_control, scf_section, diis_step, &
236 has_unit_metric)
237 ELSE
238 CALL do_special_diag(scf_env, mos, matrix_ks, &
239 scf_control, scf_section, &
240 diis_step)
241 END IF
242 ! OT diagonalization
243 CASE (ot_diag_method_nr)
244 CALL do_ot_diag(scf_env, mos, matrix_ks, matrix_s, &
245 scf_control, scf_section, diis_step)
246 ! Block Krylov diagonlization
248 IF ((scf_env%krylov_space%eps_std_diag > 0.0_dp) .AND. &
249 (scf_env%iter_count == 1 .OR. scf_env%iter_delta > scf_env%krylov_space%eps_std_diag)) THEN
250 IF (scf_env%krylov_space%always_check_conv) THEN
251 CALL do_block_krylov_diag(scf_env, mos, matrix_ks, &
252 scf_control, scf_section, check_moconv_only=.true.)
253 END IF
254 CALL do_general_diag(scf_env, mos, matrix_ks, &
255 matrix_s, scf_control, scf_section, diis_step)
256 ELSE
257 CALL do_block_krylov_diag(scf_env, mos, matrix_ks, &
258 scf_control, scf_section)
259 END IF
260 IF (scf_control%do_diag_sub) THEN
261 skip_diag_sub = (scf_env%subspace_env%eps_diag_sub > 0.0_dp) .AND. &
262 (scf_env%iter_count == 1 .OR. scf_env%iter_delta > scf_env%subspace_env%eps_diag_sub)
263 IF (.NOT. skip_diag_sub) THEN
264 CALL do_scf_diag_subspace(qs_env, scf_env, scf_env%subspace_env, mos, rho, &
265 ks_env, scf_section, scf_control)
266 END IF
267 END IF
268 ! Block Davidson diagonlization
270 CALL do_block_davidson_diag(qs_env, scf_env, mos, matrix_ks, matrix_s, scf_control, &
271 scf_section, .false.)
272 ! OT without diagonlization. Needs special treatment for SCP runs
273 CASE (ot_method_nr)
274 CALL qs_scf_loop_do_ot(qs_env, scf_env, scf_control%smear, mos, rho, &
275 qs_env%mo_derivs, energy%total, &
276 matrix_s, energy_only=energy_only, has_unit_metric=has_unit_metric)
277 END SELECT
278
279 energy%kTS = 0.0_dp
280 energy%efermi = 0.0_dp
281 CALL get_qs_env(qs_env, mos=mos)
282 DO ispin = 1, SIZE(mos)
283 energy%kTS = energy%kTS + mos(ispin)%kTS
284 energy%efermi = energy%efermi + mos(ispin)%mu
285 END DO
286 energy%efermi = energy%efermi/real(SIZE(mos), kind=dp)
287
288 CALL timestop(handle)
289
290 END SUBROUTINE qs_scf_new_mos
291
292! **************************************************************************************************
293!> \brief Updates MOs and density matrix using diagonalization
294!> Kpoint code
295!> \param qs_env ...
296!> \param scf_env ...
297!> \param scf_control ...
298!> \param diis_step ...
299!> \param probe ...
300! **************************************************************************************************
301 SUBROUTINE qs_scf_new_mos_kp(qs_env, scf_env, scf_control, diis_step, probe)
302 TYPE(qs_environment_type), POINTER :: qs_env
303 TYPE(qs_scf_env_type), POINTER :: scf_env
304 TYPE(scf_control_type), POINTER :: scf_control
305 LOGICAL :: diis_step
306 TYPE(hairy_probes_type), DIMENSION(:), OPTIONAL, &
307 POINTER :: probe
308
309 CHARACTER(LEN=*), PARAMETER :: routinen = 'qs_scf_new_mos_kp'
310
311 INTEGER :: handle, ispin
312 LOGICAL :: has_unit_metric
313 REAL(dp) :: diis_error
314 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: matrix_ks, matrix_s
315 TYPE(dft_control_type), POINTER :: dft_control
316 TYPE(kpoint_type), POINTER :: kpoints
317 TYPE(mo_set_type), DIMENSION(:, :), POINTER :: mos
318 TYPE(qs_energy_type), POINTER :: energy
319
320 CALL timeset(routinen, handle)
321
322 NULLIFY (dft_control, kpoints, matrix_ks, matrix_s)
323
324 CALL get_qs_env(qs_env=qs_env, dft_control=dft_control, kpoints=kpoints)
325 scf_env%iter_param = 0.0_dp
326
327 IF (dft_control%roks) &
328 cpabort("KP code: ROKS method not available: ")
329
330 SELECT CASE (scf_env%method)
331 CASE DEFAULT
332 CALL cp_abort(__location__, &
333 "KP code: Unknown scf method: "// &
334 cp_to_string(scf_env%method))
336 ! Diagonlization in non orthonormal case
337 CALL get_qs_env(qs_env, matrix_ks_kp=matrix_ks, matrix_s_kp=matrix_s)
338 IF (dft_control%hairy_probes .EQV. .true.) THEN
339 scf_control%smear%do_smear = .false.
340 CALL do_general_diag_kp(matrix_ks, matrix_s, kpoints, scf_env, scf_control, .true., &
341 diis_step, diis_error, qs_env, probe)
342 ELSE
343 CALL do_general_diag_kp(matrix_ks, matrix_s, kpoints, scf_env, scf_control, .true., &
344 diis_step, diis_error, qs_env)
345 END IF
346 IF (diis_step) THEN
347 scf_env%iter_param = diis_error
348 scf_env%iter_method = "DIIS/Diag."
349 ELSE
350 IF (scf_env%mixing_method == 0) THEN
351 scf_env%iter_method = "NoMix/Diag."
352 ELSE IF (scf_env%mixing_method == 1) THEN
353 scf_env%iter_param = scf_env%p_mix_alpha
354 scf_env%iter_method = "P_Mix/Diag."
355 ELSEIF (scf_env%mixing_method > 1) THEN
356 scf_env%iter_param = scf_env%mixing_store%alpha
357 scf_env%iter_method = trim(scf_env%mixing_store%iter_method)//"/Diag."
358 END IF
359 END IF
361 CALL get_qs_env(qs_env=qs_env, has_unit_metric=has_unit_metric)
362 cpassert(has_unit_metric)
363 ! Diagonlization in orthonormal case
364 CALL cp_abort(__location__, &
365 "KP code: Scf method not available: "// &
366 cp_to_string(scf_env%method))
367 CASE (ot_diag_method_nr, &
371 CALL cp_abort(__location__, &
372 "KP code: Scf method not available: "// &
373 cp_to_string(scf_env%method))
374 CASE (smeagol_method_nr)
375 ! SMEAGOL interface
376 diis_step = .false.
377 IF (scf_env%mixing_method == 0) THEN
378 scf_env%iter_method = "NoMix/SMGL"
379 ELSE IF (scf_env%mixing_method == 1) THEN
380 scf_env%iter_param = scf_env%p_mix_alpha
381 scf_env%iter_method = "P_Mix/SMGL"
382 ELSE IF (scf_env%mixing_method > 1) THEN
383 scf_env%iter_param = scf_env%mixing_store%alpha
384 scf_env%iter_method = trim(scf_env%mixing_store%iter_method)//"/SMGL"
385 END IF
386 CALL run_smeagol_emtrans(qs_env, last=.false., iter=scf_env%iter_count, rho_ao_kp=scf_env%p_mix_new)
387 END SELECT
388
389 CALL get_qs_env(qs_env=qs_env, energy=energy)
390 energy%kTS = 0.0_dp
391 energy%efermi = 0.0_dp
392 mos => kpoints%kp_env(1)%kpoint_env%mos
393 DO ispin = 1, SIZE(mos, 2)
394 energy%kTS = energy%kTS + mos(1, ispin)%kTS
395 energy%efermi = energy%efermi + mos(1, ispin)%mu
396 END DO
397 energy%efermi = energy%efermi/real(SIZE(mos, 2), kind=dp)
398
399 CALL timestop(handle)
400
401 END SUBROUTINE qs_scf_new_mos_kp
402
403! **************************************************************************************************
404!> \brief the inner loop of scf, specific to using to the orbital transformation method
405!> basically, in goes the ks matrix out goes a new p matrix
406!> \param qs_env ...
407!> \param scf_env ...
408!> \param smear ...
409!> \param mos ...
410!> \param rho ...
411!> \param mo_derivs ...
412!> \param total_energy ...
413!> \param matrix_s ...
414!> \param energy_only ...
415!> \param has_unit_metric ...
416!> \par History
417!> 03.2006 created [Joost VandeVondele]
418!> 2013 moved from qs_scf [Florian Schiffmann]
419! **************************************************************************************************
420 SUBROUTINE qs_scf_loop_do_ot(qs_env, scf_env, smear, mos, rho, mo_derivs, total_energy, &
421 matrix_s, energy_only, has_unit_metric)
422
423 TYPE(qs_environment_type), POINTER :: qs_env
424 TYPE(qs_scf_env_type), POINTER :: scf_env
425 TYPE(smear_type), POINTER :: smear
426 TYPE(mo_set_type), DIMENSION(:), INTENT(INOUT) :: mos
427 TYPE(qs_rho_type), POINTER :: rho
428 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: mo_derivs
429 REAL(kind=dp), INTENT(IN) :: total_energy
430 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_s
431 LOGICAL, INTENT(INOUT) :: energy_only
432 LOGICAL, INTENT(IN) :: has_unit_metric
433
434 CHARACTER(LEN=*), PARAMETER :: routinen = 'qs_scf_loop_do_ot'
435
436 INTEGER :: handle, ispin
437 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: rho_ao
438 TYPE(dbcsr_type), POINTER :: orthogonality_metric
439
440 CALL timeset(routinen, handle)
441 NULLIFY (rho_ao)
442
443 CALL qs_rho_get(rho, rho_ao=rho_ao)
444
445 IF (has_unit_metric) THEN
446 NULLIFY (orthogonality_metric)
447 ELSE
448 orthogonality_metric => matrix_s(1)%matrix
449 END IF
450
451 ! in case of LSD the first spin qs_ot_env will drive the minimization
452 ! in the case of a restricted calculation, it will make sure the spin orbitals are equal
453
454 CALL ot_scf_mini(mos, mo_derivs, smear, orthogonality_metric, &
455 total_energy, energy_only, scf_env%iter_delta, &
456 scf_env%qs_ot_env)
457
458 DO ispin = 1, SIZE(mos)
459 CALL set_mo_occupation(mo_set=mos(ispin), smear=smear)
460 END DO
461
462 DO ispin = 1, SIZE(mos)
463 CALL calculate_density_matrix(mos(ispin), &
464 rho_ao(ispin)%matrix, &
465 use_dbcsr=.true.)
466 END DO
467
468 scf_env%iter_method = scf_env%qs_ot_env(1)%OT_METHOD_FULL
469 scf_env%iter_param = scf_env%qs_ot_env(1)%ds_min
470 qs_env%broyden_adaptive_sigma = scf_env%qs_ot_env(1)%broyden_adaptive_sigma
471
472 CALL timestop(handle)
473
474 END SUBROUTINE qs_scf_loop_do_ot
475
476! **************************************************************************************************
477!> \brief Performs the requested density mixing if any needed
478!> \param scf_env Holds SCF environment information
479!> \param rho All data for the electron density
480!> \param para_env Parallel environment
481!> \param diis_step Did we do a DIIS step?
482! **************************************************************************************************
483 SUBROUTINE qs_scf_density_mixing(scf_env, rho, para_env, diis_step)
484 TYPE(qs_scf_env_type), POINTER :: scf_env
485 TYPE(qs_rho_type), POINTER :: rho
486 TYPE(mp_para_env_type), POINTER :: para_env
487 LOGICAL :: diis_step
488
489 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: rho_ao_kp
490
491 NULLIFY (rho_ao_kp)
492
493 CALL qs_rho_get(rho, rho_ao_kp=rho_ao_kp)
494
495 SELECT CASE (scf_env%mixing_method)
496 CASE (direct_mixing_nr)
497 CALL scf_env_density_mixing(scf_env%p_mix_new, &
498 scf_env%mixing_store, rho_ao_kp, para_env, scf_env%iter_delta, scf_env%iter_count, &
499 diis=diis_step)
502 ! Compute the difference p_out-p_in
503 CALL self_consistency_check(rho_ao_kp, scf_env%p_delta, para_env, scf_env%p_mix_new, &
504 delta=scf_env%iter_delta)
505 CASE (no_mixing_nr)
506 CASE DEFAULT
507 CALL cp_abort(__location__, &
508 "unknown scf mixing method: "// &
509 cp_to_string(scf_env%mixing_method))
510 END SELECT
511
512 END SUBROUTINE qs_scf_density_mixing
513
514! **************************************************************************************************
515!> \brief checks whether exit conditions for outer loop are satisfied
516!> \param qs_env ...
517!> \param scf_env ...
518!> \param scf_control ...
519!> \param should_stop ...
520!> \param outer_loop_converged ...
521!> \param exit_outer_loop ...
522! **************************************************************************************************
523 SUBROUTINE qs_scf_check_outer_exit(qs_env, scf_env, scf_control, should_stop, &
524 outer_loop_converged, exit_outer_loop)
525 TYPE(qs_environment_type), POINTER :: qs_env
526 TYPE(qs_scf_env_type), POINTER :: scf_env
527 TYPE(scf_control_type), POINTER :: scf_control
528 LOGICAL :: should_stop, outer_loop_converged, &
529 exit_outer_loop
530
531 REAL(kind=dp) :: outer_loop_eps
532
533 outer_loop_converged = .true.
534 IF (scf_control%outer_scf%have_scf) THEN
535 ! We have an outer SCF loop...
536 scf_env%outer_scf%iter_count = scf_env%outer_scf%iter_count + 1
537 outer_loop_converged = .false.
538
539 CALL outer_loop_gradient(qs_env, scf_env)
540 ! Multiple constraints: get largest deviation
541 outer_loop_eps = sqrt(maxval(scf_env%outer_scf%gradient(:, scf_env%outer_scf%iter_count)**2))
542
543 IF (outer_loop_eps < scf_control%outer_scf%eps_scf) outer_loop_converged = .true.
544 END IF
545
546 exit_outer_loop = should_stop .OR. outer_loop_converged .OR. &
547 scf_env%outer_scf%iter_count > scf_control%outer_scf%max_scf
548
549 END SUBROUTINE qs_scf_check_outer_exit
550
551! **************************************************************************************************
552!> \brief checks whether exit conditions for inner loop are satisfied
553!> \param qs_env ...
554!> \param scf_env ...
555!> \param scf_control ...
556!> \param should_stop ...
557!> \param just_energy ...
558!> \param exit_inner_loop ...
559!> \param inner_loop_converged ...
560!> \param output_unit ...
561! **************************************************************************************************
562 SUBROUTINE qs_scf_check_inner_exit(qs_env, scf_env, scf_control, should_stop, just_energy, &
563 exit_inner_loop, inner_loop_converged, output_unit)
564 TYPE(qs_environment_type), POINTER :: qs_env
565 TYPE(qs_scf_env_type), POINTER :: scf_env
566 TYPE(scf_control_type), POINTER :: scf_control
567 LOGICAL :: should_stop, just_energy, &
568 exit_inner_loop, inner_loop_converged
569 INTEGER :: output_unit
570
571 inner_loop_converged = .false.
572 exit_inner_loop = .false.
573
574 CALL external_control(should_stop, "SCF", target_time=qs_env%target_time, &
575 start_time=qs_env%start_time)
576 IF (scf_env%iter_delta < scf_control%eps_scf) THEN
577 IF (output_unit > 0) THEN
578 WRITE (unit=output_unit, fmt="(/,T3,A,I5,A/)") &
579 "*** SCF run converged in ", scf_env%iter_count, " steps ***"
580 END IF
581 inner_loop_converged = .true.
582 exit_inner_loop = .true.
583 ELSE IF (should_stop .OR. scf_env%iter_count >= scf_control%max_scf) THEN
584 inner_loop_converged = .false.
585 IF (just_energy) THEN
586 exit_inner_loop = .false.
587 ELSE
588 exit_inner_loop = .true.
589 IF (output_unit > 0) THEN
590 WRITE (unit=output_unit, fmt="(/,T3,A,I5,A/)") &
591 "Leaving inner SCF loop after reaching ", scf_env%iter_count, " steps."
592 END IF
593 END IF
594 END IF
595
596 END SUBROUTINE qs_scf_check_inner_exit
597
598! **************************************************************************************************
599!> \brief undoing density mixing. Important upon convergence
600!> \param scf_env ...
601!> \param rho ...
602!> \param dft_control ...
603!> \param para_env ...
604!> \param diis_step ...
605! **************************************************************************************************
606 SUBROUTINE qs_scf_undo_mixing(scf_env, rho, dft_control, para_env, diis_step)
607 TYPE(qs_scf_env_type), POINTER :: scf_env
608 TYPE(qs_rho_type), POINTER :: rho
609 TYPE(dft_control_type), POINTER :: dft_control
610 TYPE(mp_para_env_type), POINTER :: para_env
611 LOGICAL :: diis_step
612
613 CHARACTER(len=default_string_length) :: name
614 INTEGER :: ic, ispin, nc
615 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: rho_ao_kp
616
617 NULLIFY (rho_ao_kp)
618
619 IF (scf_env%mixing_method > 0) THEN
620 CALL qs_rho_get(rho, rho_ao_kp=rho_ao_kp)
621 nc = SIZE(scf_env%p_mix_new, 2)
622 SELECT CASE (scf_env%mixing_method)
623 CASE (direct_mixing_nr)
624 CALL scf_env_density_mixing(scf_env%p_mix_new, scf_env%mixing_store, &
625 rho_ao_kp, para_env, scf_env%iter_delta, &
626 scf_env%iter_count, diis=diis_step, &
627 invert=.true.)
628 DO ic = 1, nc
629 DO ispin = 1, dft_control%nspins
630 CALL dbcsr_get_info(rho_ao_kp(ispin, ic)%matrix, name=name) ! keep the name
631 CALL dbcsr_copy(rho_ao_kp(ispin, ic)%matrix, scf_env%p_mix_new(ispin, ic)%matrix, name=name)
632 END DO
633 END DO
636 DO ic = 1, nc
637 DO ispin = 1, dft_control%nspins
638 CALL dbcsr_get_info(rho_ao_kp(ispin, ic)%matrix, name=name) ! keep the name
639 CALL dbcsr_copy(rho_ao_kp(ispin, ic)%matrix, scf_env%p_mix_new(ispin, ic)%matrix, name=name)
640 END DO
641 END DO
642 END SELECT
643 END IF
644 END SUBROUTINE qs_scf_undo_mixing
645
646! **************************************************************************************************
647!> \brief Performs the updates rho (takes care of mixing as well)
648!> \param rho ...
649!> \param qs_env ...
650!> \param scf_env ...
651!> \param ks_env ...
652!> \param mix_rho ...
653! **************************************************************************************************
654 SUBROUTINE qs_scf_rho_update(rho, qs_env, scf_env, ks_env, mix_rho)
655 TYPE(qs_rho_type), POINTER :: rho
656 TYPE(qs_environment_type), POINTER :: qs_env
657 TYPE(qs_scf_env_type), POINTER :: scf_env
658 TYPE(qs_ks_env_type), POINTER :: ks_env
659 LOGICAL, INTENT(IN) :: mix_rho
660
661 TYPE(mp_para_env_type), POINTER :: para_env
662
663 NULLIFY (para_env)
664 CALL get_qs_env(qs_env, para_env=para_env)
665 ! ** update qs_env%rho
666 CALL qs_rho_update_rho(rho, qs_env=qs_env)
667 ! ** Density mixing through density matrix or on the reciprocal space grid (exclusive)
668 IF (mix_rho) THEN
669 CALL gspace_mixing(qs_env, scf_env%mixing_method, scf_env%mixing_store, rho, &
670 para_env, scf_env%iter_count)
671
672 END IF
673 CALL qs_ks_did_change(ks_env, rho_changed=.true.)
674
675 END SUBROUTINE qs_scf_rho_update
676
677! **************************************************************************************************
678!> \brief Performs the necessary steps before leaving innner scf loop
679!> \param scf_env ...
680!> \param qs_env ...
681!> \param diis_step ...
682!> \param output_unit ...
683! **************************************************************************************************
684 SUBROUTINE qs_scf_inner_finalize(scf_env, qs_env, diis_step, output_unit)
685 TYPE(qs_scf_env_type), POINTER :: scf_env
686 TYPE(qs_environment_type), POINTER :: qs_env
687 LOGICAL :: diis_step
688 INTEGER, INTENT(IN) :: output_unit
689
690 LOGICAL :: do_kpoints
691 TYPE(dft_control_type), POINTER :: dft_control
692 TYPE(mp_para_env_type), POINTER :: para_env
693 TYPE(qs_energy_type), POINTER :: energy
694 TYPE(qs_ks_env_type), POINTER :: ks_env
695 TYPE(qs_rho_type), POINTER :: rho
696
697 NULLIFY (energy, rho, dft_control, ks_env)
698
699 CALL get_qs_env(qs_env=qs_env, energy=energy, ks_env=ks_env, &
700 rho=rho, dft_control=dft_control, para_env=para_env, &
701 do_kpoints=do_kpoints)
702
703 CALL cleanup_scf_loop(scf_env)
704
705 ! now, print out energies and charges corresponding to the obtained wfn
706 ! (this actually is not 100% consistent at this point)!
707 CALL qs_scf_print_summary(output_unit, qs_env)
708
709 CALL qs_scf_undo_mixing(scf_env, rho, dft_control, para_env, diis_step)
710
711 ! *** update rspace rho since the mo changed
712 ! *** this might not always be needed (i.e. no post calculation / no forces )
713 ! *** but guarantees that rho and wfn are consistent at this point
714 CALL qs_scf_rho_update(rho, qs_env, scf_env, ks_env, mix_rho=.false.)
715
716 END SUBROUTINE qs_scf_inner_finalize
717
718! **************************************************************************************************
719!> \brief perform cleanup operations at the end of an scf loop
720!> \param scf_env ...
721!> \par History
722!> 03.2006 created [Joost VandeVondele]
723! **************************************************************************************************
724 SUBROUTINE cleanup_scf_loop(scf_env)
725 TYPE(qs_scf_env_type), INTENT(INOUT) :: scf_env
726
727 CHARACTER(len=*), PARAMETER :: routinen = 'cleanup_scf_loop'
728
729 INTEGER :: handle, ispin
730
731 CALL timeset(routinen, handle)
732
733 SELECT CASE (scf_env%method)
734 CASE (ot_method_nr)
735 DO ispin = 1, SIZE(scf_env%qs_ot_env)
736 CALL ot_scf_destroy(scf_env%qs_ot_env(ispin))
737 END DO
738 DEALLOCATE (scf_env%qs_ot_env)
739 CASE (ot_diag_method_nr)
740 !
742 !
744 !
746 !
748 !
749 CASE (smeagol_method_nr)
750 !
751 CASE DEFAULT
752 CALL cp_abort(__location__, &
753 "unknown scf method method:"// &
754 cp_to_string(scf_env%method))
755 END SELECT
756
757 CALL timestop(handle)
758
759 END SUBROUTINE cleanup_scf_loop
760
761END 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 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, 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, 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, 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, ecoul_1c, rho0_s_rs, rho0_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, 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)
...
Definition qs_ot_scf.F:129
subroutine, public ot_scf_destroy(qs_ot_env)
...
Definition qs_ot_scf.F:450
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.
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