(git:1f9fd2c)
Loading...
Searching...
No Matches
qs_scf.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! **************************************************************************************************
9!> \brief Routines for the Quickstep SCF run.
10!> \par History
11!> - Joost VandeVondele (02.2002)
12!> added code for: incremental (pab and gvg) update
13!> initialisation (init_cube, l_info)
14!> - Joost VandeVondele (02.2002)
15!> called the poisson code of the classical part
16!> this takes into account the spherical cutoff and allows for
17!> isolated systems
18!> - Joost VandeVondele (02.2002)
19!> added multiple grid feature
20!> changed to spherical cutoff consistently (?)
21!> therefore removed the gradient correct functionals
22!> - updated with the new QS data structures (10.04.02,MK)
23!> - copy_matrix replaced by transfer_matrix (11.04.02,MK)
24!> - nrebuild_rho and nrebuild_gvg unified (12.04.02,MK)
25!> - set_mo_occupation for smearing of the MO occupation numbers
26!> (17.04.02,MK)
27!> - MO level shifting added (22.04.02,MK)
28!> - Usage of TYPE mo_set_p_type
29!> - Joost VandeVondele (05.2002)
30!> added cholesky based diagonalisation
31!> - 05.2002 added pao method [fawzi]
32!> - parallel FFT (JGH 22.05.2002)
33!> - 06.2002 moved KS matrix construction to qs_build_KS_matrix.F [fawzi]
34!> - started to include more LSD (01.2003,Joost VandeVondele)
35!> - 02.2003 scf_env [fawzi]
36!> - got rid of nrebuild (01.2004, Joost VandeVondele)
37!> - 10.2004 removed pao [fawzi]
38!> - 03.2006 large cleaning action [Joost VandeVondele]
39!> - High-spin ROKS added (05.04.06,MK)
40!> - Mandes (10.2013)
41!> intermediate energy communication with external communicator added
42!> - kpoints (08.2014, JGH)
43!> - unified k-point and gamma-point code (2014.11) [Ole Schuett]
44!> - added extra SCF loop for CDFT constraints (12.2015) [Nico Holmberg]
45!> \author Matthias Krack (30.04.2001)
46! **************************************************************************************************
47MODULE qs_scf
50 USE cp_dbcsr_api, ONLY: dbcsr_copy,&
55 dbcsr_set,&
59 USE cp_files, ONLY: close_file
60 USE cp_fm_types, ONLY: cp_fm_create,&
72 cp_p_file,&
80 USE input_constants, ONLY: &
89 USE kinds, ONLY: default_path_length,&
91 dp
93 USE kpoint_types, ONLY: kpoint_type
94 USE machine, ONLY: m_flush,&
96 USE mathlib, ONLY: invert_matrix
97 USE message_passing, ONLY: mp_comm_type,&
100 USE physcon, ONLY: evolt
103 USE pw_env_types, ONLY: pw_env_get,&
105 USE pw_pool_types, ONLY: pw_pool_type
118 USE qs_diis, ONLY: qs_diis_b_clear,&
126 USE qs_integrate_potential, ONLY: integrate_v_rspace
127 USE qs_kind_types, ONLY: qs_kind_type
130 USE qs_ks_types, ONLY: get_ks_env,&
137 USE qs_mo_types, ONLY: deallocate_mo_set,&
139 get_mo_set,&
143 USE qs_ot_scf, ONLY: ot_scf_init,&
151 USE qs_rho_types, ONLY: qs_rho_get,&
170 USE qs_scf_types, ONLY: &
183#include "./base/base_uses.f90"
184
185 IMPLICIT NONE
186
187 PRIVATE
188
189 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_scf'
190 LOGICAL, PRIVATE :: reuse_precond = .false.
191 LOGICAL, PRIVATE :: used_history = .false.
192
194
195CONTAINS
196
197! **************************************************************************************************
198!> \brief perform an scf procedure in the given qs_env
199!> \param qs_env the qs_environment where to perform the scf procedure
200!> \param has_converged ...
201!> \param total_scf_steps ...
202!> \par History
203!> 02.2003 introduced scf_env, moved real work to scf_env_do_scf [fawzi]
204!> \author fawzi
205!> \note
206! **************************************************************************************************
207 SUBROUTINE scf(qs_env, has_converged, total_scf_steps)
208 TYPE(qs_environment_type), POINTER :: qs_env
209 LOGICAL, INTENT(OUT), OPTIONAL :: has_converged
210 INTEGER, INTENT(OUT), OPTIONAL :: total_scf_steps
211
212 INTEGER :: ihistory, max_scf_tmp, tsteps
213 LOGICAL :: converged, outer_scf_loop, should_stop
214 LOGICAL, SAVE :: first_step_flag = .true.
215 REAL(kind=dp), DIMENSION(:, :), POINTER :: gradient_history, variable_history
216 TYPE(cp_logger_type), POINTER :: logger
217 TYPE(dft_control_type), POINTER :: dft_control
218 TYPE(qs_scf_env_type), POINTER :: scf_env
219 TYPE(scf_control_type), POINTER :: scf_control
220 TYPE(section_vals_type), POINTER :: dft_section, input, scf_section
221
222 NULLIFY (scf_env)
223 logger => cp_get_default_logger()
224 cpassert(ASSOCIATED(qs_env))
225 IF (PRESENT(has_converged)) THEN
226 has_converged = .false.
227 END IF
228 IF (PRESENT(total_scf_steps)) THEN
229 total_scf_steps = 0
230 END IF
231 CALL get_qs_env(qs_env, scf_env=scf_env, input=input, &
232 dft_control=dft_control, scf_control=scf_control)
233 IF (scf_control%max_scf > 0) THEN
234
235 dft_section => section_vals_get_subs_vals(input, "DFT")
236 scf_section => section_vals_get_subs_vals(dft_section, "SCF")
237
238 IF (.NOT. ASSOCIATED(scf_env)) THEN
239 CALL qs_scf_env_initialize(qs_env, scf_env)
240 ! Moved here from qs_scf_env_initialize to be able to have more scf_env
241 CALL set_qs_env(qs_env, scf_env=scf_env)
242 ELSE
243 CALL qs_scf_env_initialize(qs_env, scf_env)
244 END IF
245
246 IF ((scf_control%density_guess == history_guess) .AND. (first_step_flag)) THEN
247 max_scf_tmp = scf_control%max_scf
248 scf_control%max_scf = 1
249 outer_scf_loop = scf_control%outer_scf%have_scf
250 scf_control%outer_scf%have_scf = .false.
251 END IF
252
253 IF (.NOT. dft_control%qs_control%cdft) THEN
254 CALL scf_env_do_scf(scf_env=scf_env, scf_control=scf_control, qs_env=qs_env, &
255 converged=converged, should_stop=should_stop, total_scf_steps=tsteps)
256 ELSE
257 ! Third SCF loop needed for CDFT with OT to properly restart OT inner loop
258 CALL cdft_scf(qs_env=qs_env, should_stop=should_stop)
259 END IF
260
261 ! If SCF has not converged, then we should not start MP2
262 IF (ASSOCIATED(qs_env%mp2_env)) qs_env%mp2_env%hf_fail = .NOT. converged
263
264 ! Add the converged outer_scf SCF gradient(s)/variable(s) to history
265 IF (scf_control%outer_scf%have_scf) THEN
266 ihistory = scf_env%outer_scf%iter_count
267 CALL get_qs_env(qs_env, gradient_history=gradient_history, &
268 variable_history=variable_history)
269 ! We only store the latest two values
270 gradient_history(:, 1) = gradient_history(:, 2)
271 gradient_history(:, 2) = scf_env%outer_scf%gradient(:, ihistory)
272 variable_history(:, 1) = variable_history(:, 2)
273 variable_history(:, 2) = scf_env%outer_scf%variables(:, ihistory)
274 ! Reset flag
275 IF (used_history) used_history = .false.
276 ! Update a counter and check if the Jacobian should be deallocated
277 IF (ASSOCIATED(scf_env%outer_scf%inv_jacobian)) THEN
278 scf_control%outer_scf%cdft_opt_control%ijacobian(2) = scf_control%outer_scf%cdft_opt_control%ijacobian(2) + 1
279 IF (scf_control%outer_scf%cdft_opt_control%ijacobian(2) >= &
280 scf_control%outer_scf%cdft_opt_control%jacobian_freq(2) .AND. &
281 scf_control%outer_scf%cdft_opt_control%jacobian_freq(2) > 0) &
282 scf_env%outer_scf%deallocate_jacobian = .true.
283 END IF
284 END IF
285 ! *** add the converged wavefunction to the wavefunction history
286 IF ((ASSOCIATED(qs_env%wf_history)) .AND. &
287 ((scf_control%density_guess /= history_guess) .OR. &
288 (.NOT. first_step_flag))) THEN
289 IF (.NOT. dft_control%qs_control%cdft) THEN
290 CALL wfi_update(qs_env%wf_history, qs_env=qs_env, dt=1.0_dp)
291 ELSE
292 IF (dft_control%qs_control%cdft_control%should_purge) THEN
293 CALL wfi_purge_history(qs_env)
294 CALL outer_loop_purge_history(qs_env)
295 dft_control%qs_control%cdft_control%should_purge = .false.
296 ELSE
297 CALL wfi_update(qs_env%wf_history, qs_env=qs_env, dt=1.0_dp)
298 END IF
299 END IF
300 ELSE IF ((scf_control%density_guess == history_guess) .AND. &
301 (first_step_flag)) THEN
302 scf_control%max_scf = max_scf_tmp
303 scf_control%outer_scf%have_scf = outer_scf_loop
304 first_step_flag = .false.
305 END IF
306
307 ! *** compute properties that depend on the converged wavefunction
308 IF (.NOT. (should_stop)) CALL qs_scf_compute_properties(qs_env)
309
310 ! *** SMEAGOL interface ***
311 IF (.NOT. (should_stop)) THEN
312 ! compute properties that depend on the converged wavefunction ..
313 CALL run_smeagol_emtrans(qs_env, last=.true., iter=0)
314 ! .. or save matrices related to bulk leads
315 CALL run_smeagol_bulktrans(qs_env)
316 END IF
317
318 ! *** cleanup
319 CALL scf_env_cleanup(scf_env)
320 IF (dft_control%qs_control%cdft) &
321 CALL cdft_control_cleanup(dft_control%qs_control%cdft_control)
322
323 IF (PRESENT(has_converged)) THEN
324 has_converged = converged
325 END IF
326 IF (PRESENT(total_scf_steps)) THEN
327 total_scf_steps = tsteps
328 END IF
329
330 END IF
331
332 END SUBROUTINE scf
333
334! **************************************************************************************************
335!> \brief perform an scf loop
336!> \param scf_env the scf_env where to perform the scf procedure
337!> \param scf_control ...
338!> \param qs_env the qs_env, the scf_env lives in
339!> \param converged will be true / false if converged is reached
340!> \param should_stop ...
341!> \param total_scf_steps ...
342!> \par History
343!> long history, see cvs and qs_scf module history
344!> 02.2003 introduced scf_env [fawzi]
345!> 09.2005 Frozen density approximation [TdK]
346!> 06.2007 Check for SCF iteration count early [jgh]
347!> 10.2019 switch_surf_dip [SGh]
348!> \author Matthias Krack
349!> \note
350! **************************************************************************************************
351 SUBROUTINE scf_env_do_scf(scf_env, scf_control, qs_env, converged, should_stop, total_scf_steps)
352
353 TYPE(qs_scf_env_type), POINTER :: scf_env
354 TYPE(scf_control_type), POINTER :: scf_control
355 TYPE(qs_environment_type), POINTER :: qs_env
356 LOGICAL, INTENT(OUT) :: converged, should_stop
357 INTEGER, INTENT(OUT) :: total_scf_steps
358
359 CHARACTER(LEN=*), PARAMETER :: routinen = 'scf_env_do_scf'
360
361 CHARACTER(LEN=default_string_length) :: description, name
362 INTEGER :: ext_master_id, handle, handle2, i_tmp, &
363 ic, ispin, iter_count, output_unit, &
364 scf_energy_message_tag, total_steps
365 LOGICAL :: density_full_step, diis_step, do_kpoints, energy_only, exit_inner_loop, &
366 exit_outer_loop, inner_loop_converged, internal_tblite_density_full_step, &
367 internal_tblite_mixer, just_energy, outer_loop_converged, tblite_native_mixer
368 REAL(kind=dp) :: t1, t2
369 REAL(kind=dp), DIMENSION(3) :: res_val_3
370 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
371 TYPE(cp_logger_type), POINTER :: logger
372 TYPE(cp_result_type), POINTER :: results
373 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_ks
374 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: rho_ao_kp
375 TYPE(dft_control_type), POINTER :: dft_control
376 TYPE(energy_correction_type), POINTER :: ec_env
377 TYPE(kpoint_type), POINTER :: kpoints
378 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos, mos_last_converged
379 TYPE(mp_comm_type) :: external_comm
380 TYPE(mp_para_env_type), POINTER :: para_env
381 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
382 TYPE(pw_env_type), POINTER :: pw_env
383 TYPE(qs_charges_type), POINTER :: qs_charges
384 TYPE(qs_energy_type), POINTER :: energy
385 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
386 TYPE(qs_ks_env_type), POINTER :: ks_env
387 TYPE(qs_rho_type), POINTER :: rho
388 TYPE(section_vals_type), POINTER :: dft_section, input, scf_section
389
390 CALL timeset(routinen, handle)
391
392 NULLIFY (dft_control, rho, energy, &
393 logger, qs_charges, ks_env, mos, atomic_kind_set, qs_kind_set, &
394 particle_set, dft_section, input, &
395 scf_section, para_env, results, kpoints, pw_env, rho_ao_kp, mos_last_converged)
396
397 cpassert(ASSOCIATED(scf_env))
398 cpassert(ASSOCIATED(qs_env))
399
400 logger => cp_get_default_logger()
401 t1 = m_walltime()
402
403 CALL get_qs_env(qs_env=qs_env, &
404 energy=energy, &
405 particle_set=particle_set, &
406 qs_charges=qs_charges, &
407 ks_env=ks_env, &
408 atomic_kind_set=atomic_kind_set, &
409 qs_kind_set=qs_kind_set, &
410 rho=rho, &
411 mos=mos, &
412 input=input, &
413 dft_control=dft_control, &
414 do_kpoints=do_kpoints, &
415 kpoints=kpoints, &
416 results=results, &
417 pw_env=pw_env, &
418 para_env=para_env)
419 tblite_native_mixer = dft_control%qs_control%xtb_control%do_tblite .AND. &
420 scf_env%method /= ot_method_nr .AND. &
421 tb_native_scc_mixer_active(dft_control)
422 internal_tblite_mixer = (dft_control%qs_control%dftb .AND. &
423 dft_control%qs_control%dftb_control%tblite_scc_mixer == tblite_scc_mixer_tblite) .OR. &
424 (dft_control%qs_control%xtb .AND. &
425 .NOT. dft_control%qs_control%xtb_control%do_tblite .AND. &
426 dft_control%qs_control%xtb_control%tblite_scc_mixer == tblite_scc_mixer_tblite)
427 internal_tblite_density_full_step = dft_control%qs_control%xtb .AND. &
428 .NOT. dft_control%qs_control%xtb_control%do_tblite .AND. &
429 dft_control%qs_control%xtb_control%tblite_scc_mixer == tblite_scc_mixer_tblite
430
431 CALL qs_rho_get(rho, rho_ao_kp=rho_ao_kp)
432
433 dft_section => section_vals_get_subs_vals(input, "DFT")
434 scf_section => section_vals_get_subs_vals(dft_section, "SCF")
435
436 output_unit = cp_print_key_unit_nr(logger, scf_section, "PRINT%PROGRAM_RUN_INFO", &
437 extension=".scfLog")
438
439 IF (scf_control%gce%do_gce .AND. output_unit > 0) THEN
440 WRITE (unit=output_unit, fmt="(/,T2,78('-'))")
441 WRITE (unit=output_unit, fmt="(T31,A)") &
442 "GRAND-CANONICAL SCF"
443 WRITE (unit=output_unit, fmt="(T20,A,F12.6,A)") &
444 "Target work function (TWF):", &
445 evolt*scf_control%gce%target_workfunction, " eV"
446 WRITE (unit=output_unit, fmt="(T2,78('-'))")
447 END IF
448
449 IF (output_unit > 0) WRITE (unit=output_unit, fmt="(/,/,T2,A)") &
450 "SCF WAVEFUNCTION OPTIMIZATION"
451
452 ! when switch_surf_dip is switched on, indicate storing mos from the last converged step
453 IF (dft_control%switch_surf_dip) THEN
454 CALL get_qs_env(qs_env, mos_last_converged=mos_last_converged)
455 DO ispin = 1, dft_control%nspins
456 CALL reassign_allocated_mos(mos(ispin), mos_last_converged(ispin))
457 END DO
458 IF (output_unit > 0) WRITE (unit=output_unit, fmt="(/,/,T2,A)") &
459 "COPIED mos_last_converged ---> mos"
460 END IF
461
462 IF ((output_unit > 0) .AND. (.NOT. scf_control%use_ot)) THEN
463 WRITE (unit=output_unit, &
464 fmt="(/,T3,A,T12,A,T31,A,T39,A,T59,A,T75,A,/,T3,A)") &
465 "Step", "Update method", "Time", "Convergence", "Total energy", "Change", &
466 repeat("-", 78)
467 END IF
468 CALL cp_add_iter_level(logger%iter_info, "QS_SCF")
469
470 ! check for external communicator and if the intermediate energy should be sent
471 res_val_3(:) = -1.0_dp
472 description = "[EXT_SCF_ENER_COMM]"
473 IF (test_for_result(results, description=description)) THEN
474 CALL get_results(results, description=description, &
475 values=res_val_3, n_entries=i_tmp)
476 cpassert(i_tmp == 3)
477 IF (all(res_val_3(:) <= 0.0)) &
478 CALL cp_abort(__location__, &
479 " Trying to access result ("//trim(description)// &
480 ") which is not correctly stored.")
481 CALL external_comm%set_handle(nint(res_val_3(1)))
482 END IF
483 ext_master_id = nint(res_val_3(2))
484 scf_energy_message_tag = nint(res_val_3(3))
485
486 ! *** outer loop of the scf, can treat other variables,
487 ! *** such as lagrangian multipliers
488 scf_env%outer_scf%iter_count = 0
489 iter_count = 0
490 total_steps = 0
491 energy%tot_old = 0.0_dp
492
493 scf_outer_loop: DO
494
495 CALL init_scf_loop(scf_env=scf_env, qs_env=qs_env, &
496 scf_section=scf_section)
497
498 CALL qs_scf_set_loop_flags(scf_env, diis_step, &
499 energy_only, just_energy, exit_inner_loop)
500
501 ! decide whether to switch off dipole correction for convergence purposes
502 dft_control%surf_dip_correct_switch = dft_control%correct_surf_dip
503 IF ((dft_control%correct_surf_dip) .AND. (scf_control%outer_scf%have_scf) .AND. &
504 (scf_env%outer_scf%iter_count > floor(scf_control%outer_scf%max_scf/2.0_dp))) THEN
505 IF (dft_control%switch_surf_dip) THEN
506 dft_control%surf_dip_correct_switch = .false.
507 IF (output_unit > 0) WRITE (unit=output_unit, fmt="(/,/,T2,A)") &
508 "SURFACE DIPOLE CORRECTION switched off"
509 END IF
510 END IF
511
512 scf_loop: DO
513
514 CALL timeset(routinen//"_inner_loop", handle2)
515
516 IF (.NOT. just_energy) scf_env%iter_count = scf_env%iter_count + 1
517 iter_count = iter_count + 1
518 CALL cp_iterate(logger%iter_info, last=.false., iter_nr=iter_count)
519
520 IF (output_unit > 0) CALL m_flush(output_unit)
521
522 total_steps = total_steps + 1
523 just_energy = energy_only
524
525 CALL qs_ks_update_qs_env(qs_env, just_energy=just_energy, &
526 calculate_forces=.false.)
527
528 ! print 'heavy weight' or relatively expensive quantities
529 CALL qs_scf_loop_print(qs_env, scf_env, para_env)
530
531 IF (do_kpoints) THEN
532 ! kpoints
533 IF (dft_control%hairy_probes .EQV. .true.) THEN
534 scf_control%smear%do_smear = .false.
535 CALL qs_scf_new_mos_kp(qs_env, scf_env, scf_control, diis_step, dft_control%probe)
536 ELSE
537 CALL qs_scf_new_mos_kp(qs_env, scf_env, scf_control, diis_step)
538 END IF
539 ELSE
540 ! Gamma points only
541 IF (dft_control%hairy_probes .EQV. .true.) THEN
542 scf_control%smear%do_smear = .false.
543 CALL qs_scf_new_mos(qs_env, scf_env, scf_control, scf_section, diis_step, energy_only, &
544 dft_control%probe)
545 ELSE
546 CALL qs_scf_new_mos(qs_env, scf_env, scf_control, scf_section, diis_step, energy_only)
547 END IF
548 END IF
549
550 ! Print requested MO information (can be computationally expensive with OT)
551 CALL qs_scf_write_mos(qs_env, scf_env, final_mos=.false.)
552
553 IF (dft_control%qs_control%xtb_control%do_tblite) THEN
554 IF (scf_env%method == ot_method_nr) THEN
555 CALL tb_update_charges(qs_env, dft_control, qs_env%tb_tblite, .false., .true.)
556 CALL evaluate_core_matrix_traces(qs_env)
557 ELSE
558 cpassert(scf_env%mixing_method > 0)
559 CALL tb_update_charges(qs_env, dft_control, qs_env%tb_tblite, .false., .false.)
560 CALL evaluate_core_matrix_traces(qs_env, rho_ao_ext=scf_env%p_mix_new)
561 END IF
562 CALL tb_get_energy(qs_env, qs_env%tb_tblite, energy)
563 END IF
564
565 density_full_step = diis_step .OR. tblite_native_mixer .OR. internal_tblite_density_full_step
566 CALL qs_scf_density_mixing(scf_env, rho, para_env, density_full_step)
567 IF (dft_control%qs_control%xtb_control%do_tblite .AND. &
568 .NOT. (dft_control%qs_control%do_ls_scf .OR. scf_control%use_ot)) THEN
569 scf_env%iter_delta = max(scf_env%iter_delta, &
570 tb_scf_mixer_error(dft_control, qs_env%tb_tblite, &
571 scf_control%eps_scf))
572 END IF
573 IF (dft_control%qs_control%dftb .OR. &
574 (dft_control%qs_control%xtb .AND. .NOT. dft_control%qs_control%xtb_control%do_tblite)) THEN
575 scf_env%iter_delta = max(scf_env%iter_delta, &
576 charge_mixing_scc_error(scf_env%mixing_store, scf_control%eps_scf))
577 END IF
578 IF (tblite_native_mixer) THEN
579 scf_env%iter_param = dft_control%qs_control%xtb_control%tblite_mixer_damping
580 scf_env%iter_method = "TBLite/Diag"
581 ELSEIF (internal_tblite_mixer) THEN
582 scf_env%iter_method = "TBLite/Diag"
583 IF (dft_control%qs_control%dftb) THEN
584 scf_env%iter_param = dft_control%qs_control%dftb_control%tblite_mixer_damping
585 ELSE
586 scf_env%iter_param = dft_control%qs_control%xtb_control%tblite_mixer_damping
587 END IF
588 END IF
589
590 t2 = m_walltime()
591
592 CALL qs_scf_loop_info(scf_env, output_unit, just_energy, t1, t2, energy)
593
594 IF (scf_control%gce%do_gce) THEN
595 CALL qs_scf_gce_info(output_unit, qs_env, just_energy)
596 END IF
597
598 IF (.NOT. just_energy) energy%tot_old = energy%total
599
600 ! check for external communicator and if the intermediate energy should be sent
601 IF (scf_energy_message_tag > 0) THEN
602 CALL external_comm%send(energy%total, ext_master_id, scf_energy_message_tag)
603 END IF
604
605 CALL qs_scf_check_inner_exit(qs_env, scf_env, scf_control, should_stop, just_energy, &
606 exit_inner_loop, inner_loop_converged, output_unit)
607
608 ! In case we decide to exit we perform few more check to see if this one
609 ! is really the last SCF step
610 IF (exit_inner_loop) THEN
611
612 CALL qs_scf_inner_finalize(scf_env, qs_env, density_full_step, output_unit)
613
614 CALL qs_scf_check_outer_exit(qs_env, scf_env, scf_control, should_stop, &
615 outer_loop_converged, exit_outer_loop)
616
617 ! Let's tag the last SCF cycle so we can print informations only of the last step
618 IF (exit_outer_loop) CALL cp_iterate(logger%iter_info, last=.true., iter_nr=iter_count)
619
620 END IF
621
622 IF (do_kpoints) THEN
623 CALL write_kpoints_restart(rho_ao_kp, kpoints, scf_env, dft_section, particle_set, qs_kind_set)
624 ELSE
625 ! Write wavefunction restart file
626 IF (scf_env%method == ot_method_nr) THEN
627 ! With OT: provide the Kohn-Sham matrix for the calculation of the MO eigenvalues
628 CALL get_ks_env(ks_env=ks_env, matrix_ks=matrix_ks)
629 CALL write_mo_set_to_restart(mos, particle_set, dft_section=dft_section, qs_kind_set=qs_kind_set, &
630 matrix_ks=matrix_ks)
631 ELSE
632 CALL write_mo_set_to_restart(mos, particle_set, dft_section=dft_section, qs_kind_set=qs_kind_set)
633 END IF
634
635 END IF
636
637 ! Exit if we have finished with the SCF inner loop
638 IF (exit_inner_loop) THEN
639 CALL timestop(handle2)
640 EXIT scf_loop
641 END IF
642
643 IF (.NOT. btest(cp_print_key_should_output(logger%iter_info, &
644 scf_section, "PRINT%ITERATION_INFO/TIME_CUMUL"), cp_p_file)) &
645 t1 = m_walltime()
646
647 ! mixing methods have the new density matrix in p_mix_new
648 IF (scf_env%mixing_method > 0) THEN
649 DO ic = 1, SIZE(rho_ao_kp, 2)
650 DO ispin = 1, dft_control%nspins
651 CALL dbcsr_get_info(rho_ao_kp(ispin, ic)%matrix, name=name) ! keep the name
652 CALL dbcsr_copy(rho_ao_kp(ispin, ic)%matrix, scf_env%p_mix_new(ispin, ic)%matrix, name=name)
653 END DO
654 END DO
655 END IF
656
657 CALL qs_scf_rho_update(rho, qs_env, scf_env, ks_env, &
658 mix_rho=scf_env%mixing_method >= gspace_mixing_nr)
659
660 CALL timestop(handle2)
661
662 END DO scf_loop
663
664 IF (.NOT. scf_control%outer_scf%have_scf) EXIT scf_outer_loop
665
666 ! In case we use the OUTER SCF loop let's print some info..
667 CALL qs_scf_outer_loop_info(output_unit, scf_control, scf_env, &
668 energy, total_steps, should_stop, outer_loop_converged)
669
670 ! Save MOs to converged MOs if outer_loop_converged and surf_dip_correct_switch is true
671 IF (exit_outer_loop) THEN
672 IF ((dft_control%switch_surf_dip) .AND. (outer_loop_converged) .AND. &
673 (dft_control%surf_dip_correct_switch)) THEN
674 DO ispin = 1, dft_control%nspins
675 CALL reassign_allocated_mos(mos_last_converged(ispin), mos(ispin))
676 END DO
677 IF (output_unit > 0) WRITE (unit=output_unit, fmt="(/,/,T2,A)") &
678 "COPIED mos ---> mos_last_converged"
679 END IF
680 END IF
681
682 IF (exit_outer_loop) EXIT scf_outer_loop
683
684 !
685 CALL outer_loop_optimize(scf_env, scf_control)
686 CALL outer_loop_update_qs_env(qs_env, scf_env)
687 CALL qs_ks_did_change(ks_env, potential_changed=.true.)
688
689 END DO scf_outer_loop
690
691 converged = inner_loop_converged .AND. outer_loop_converged
692 total_scf_steps = total_steps
693
694 IF (dft_control%qs_control%cdft) &
695 dft_control%qs_control%cdft_control%total_steps = &
696 dft_control%qs_control%cdft_control%total_steps + total_steps
697
698 IF (.NOT. converged) THEN
699 IF (scf_control%ignore_convergence_failure .OR. should_stop) THEN
700 CALL cp_warn(__location__, "SCF run NOT converged")
701 ELSE
702 CALL cp_abort(__location__, &
703 "SCF run NOT converged. To continue the calculation "// &
704 "regardless, please set the keyword IGNORE_CONVERGENCE_FAILURE.")
705 END IF
706 END IF
707
708 ! Skip Harris functional calculation if ground-state is NOT converged
709 IF (qs_env%energy_correction) THEN
710 CALL get_qs_env(qs_env, ec_env=ec_env)
711 ec_env%do_skip = .false.
712 IF (ec_env%skip_ec .AND. .NOT. converged) ec_env%do_skip = .true.
713 END IF
714
715 ! if needed copy mo_coeff dbcsr->fm for later use in post_scf!fm->dbcsr
716 DO ispin = 1, SIZE(mos) !fm -> dbcsr
717 IF (mos(ispin)%use_mo_coeff_b) THEN !fm->dbcsr
718 IF (.NOT. ASSOCIATED(mos(ispin)%mo_coeff_b)) & !fm->dbcsr
719 cpabort("mo_coeff_b is not allocated") !fm->dbcsr
720 CALL copy_dbcsr_to_fm(mos(ispin)%mo_coeff_b, & !fm->dbcsr
721 mos(ispin)%mo_coeff) !fm -> dbcsr
722 END IF !fm->dbcsr
723 END DO !fm -> dbcsr
724
725 CALL cp_rm_iter_level(logger%iter_info, level_name="QS_SCF")
726 CALL timestop(handle)
727
728 END SUBROUTINE scf_env_do_scf
729
730! **************************************************************************************************
731!> \brief inits those objects needed if you want to restart the scf with, say
732!> only a new initial guess, or different density functional or ...
733!> this will happen just before the scf loop starts
734!> \param scf_env ...
735!> \param qs_env ...
736!> \param scf_section ...
737!> \par History
738!> 03.2006 created [Joost VandeVondele]
739! **************************************************************************************************
740 SUBROUTINE init_scf_loop(scf_env, qs_env, scf_section)
741
742 TYPE(qs_scf_env_type), POINTER :: scf_env
743 TYPE(qs_environment_type), POINTER :: qs_env
744 TYPE(section_vals_type), POINTER :: scf_section
745
746 CHARACTER(LEN=*), PARAMETER :: routinen = 'init_scf_loop'
747
748 INTEGER :: handle, ispin, nmo, number_of_ot_envs
749 LOGICAL :: do_kpoints, do_rotation, &
750 has_unit_metric, is_full_all
751 TYPE(cp_fm_type), POINTER :: mo_coeff
752 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_ks, matrix_s
753 TYPE(dbcsr_type), POINTER :: orthogonality_metric
754 TYPE(dft_control_type), POINTER :: dft_control
755 TYPE(kpoint_type), POINTER :: kpoints
756 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
757 TYPE(scf_control_type), POINTER :: scf_control
758
759 CALL timeset(routinen, handle)
760
761 NULLIFY (scf_control, matrix_s, matrix_ks, dft_control, mos, mo_coeff, kpoints)
762
763 cpassert(ASSOCIATED(scf_env))
764 cpassert(ASSOCIATED(qs_env))
765
766 CALL get_qs_env(qs_env=qs_env, &
767 scf_control=scf_control, &
768 dft_control=dft_control, &
769 do_kpoints=do_kpoints, &
770 kpoints=kpoints, &
771 mos=mos)
772
773 ! if using mo_coeff_b then copy to fm
774 DO ispin = 1, SIZE(mos) !fm->dbcsr
775 IF (mos(1)%use_mo_coeff_b) THEN !fm->dbcsr
776 CALL copy_dbcsr_to_fm(mos(ispin)%mo_coeff_b, mos(ispin)%mo_coeff) !fm->dbcsr
777 END IF !fm->dbcsr
778 END DO !fm->dbcsr
779
780 ! this just guarantees that all mo_occupations match the eigenvalues, if smear
781 DO ispin = 1, dft_control%nspins
782 ! do not reset mo_occupations if the maximum overlap method is in use
783 IF (.NOT. scf_control%diagonalization%mom) THEN
784 !if the hair probes section is present, this sends hairy_probes to set_mo_occupation subroutine
785 !and switches off the standard smearing
786 IF (dft_control%hairy_probes .EQV. .true.) THEN
787 IF (scf_env%outer_scf%iter_count > 0) THEN
788 scf_control%smear%do_smear = .false.
789 CALL set_mo_occupation(mo_set=mos(ispin), &
790 smear=scf_control%smear, &
791 probe=dft_control%probe)
792 END IF
793 ELSE
794 IF (.NOT. scf_control%gce%do_gce) THEN
795 CALL set_mo_occupation(mo_set=mos(ispin), &
796 smear=scf_control%smear)
797 ELSE
798 CALL set_mo_occupation(mo_set=mos(ispin), &
799 smear=scf_control%smear, &
800 gce=scf_control%gce)
801 END IF
802 END IF
803 END IF
804 END DO
805
806 SELECT CASE (scf_env%method)
807 CASE DEFAULT
808
809 cpabort("Unknown SCF method <"//trim(cp_to_string(scf_env%method))//"> found. Check the code!")
810
812
813 IF (.NOT. scf_env%skip_diis) THEN
814 IF (.NOT. ASSOCIATED(scf_env%scf_diis_buffer)) THEN
815 ALLOCATE (scf_env%scf_diis_buffer)
816 CALL qs_diis_b_create(scf_env%scf_diis_buffer, nbuffer=scf_control%max_diis)
817 END IF
818 CALL qs_diis_b_clear(scf_env%scf_diis_buffer)
819 END IF
820
822 IF (.NOT. scf_env%skip_diis) THEN
823 IF (do_kpoints) THEN
824 IF (.NOT. ASSOCIATED(kpoints%scf_diis_buffer)) THEN
825 ALLOCATE (kpoints%scf_diis_buffer)
826 CALL qs_diis_b_create_kp(kpoints%scf_diis_buffer, nbuffer=scf_control%max_diis)
827 END IF
828 CALL qs_diis_b_clear_kp(kpoints%scf_diis_buffer)
829 ELSE
830 IF (.NOT. ASSOCIATED(scf_env%scf_diis_buffer)) THEN
831 ALLOCATE (scf_env%scf_diis_buffer)
832 CALL qs_diis_b_create(scf_env%scf_diis_buffer, nbuffer=scf_control%max_diis)
833 END IF
834 CALL qs_diis_b_clear(scf_env%scf_diis_buffer)
835 END IF
836 END IF
837
838 CASE (ot_diag_method_nr)
839 CALL get_qs_env(qs_env, matrix_ks=matrix_ks, matrix_s=matrix_s)
840
841 IF (.NOT. scf_env%skip_diis) THEN
842 IF (.NOT. ASSOCIATED(scf_env%scf_diis_buffer)) THEN
843 ALLOCATE (scf_env%scf_diis_buffer)
844 CALL qs_diis_b_create(scf_env%scf_diis_buffer, nbuffer=scf_control%max_diis)
845 END IF
846 CALL qs_diis_b_clear(scf_env%scf_diis_buffer)
847 END IF
848
849 ! disable DFTB and SE for now
850 IF (dft_control%qs_control%dftb .OR. &
851 dft_control%qs_control%xtb .OR. &
852 dft_control%qs_control%semi_empirical) THEN
853 cpabort("DFTB and SE not available with OT/DIAG")
854 END IF
855
856 ! if an old preconditioner is still around (i.e. outer SCF is active),
857 ! remove it if this could be worthwhile
858 CALL restart_preconditioner(qs_env, scf_env%ot_preconditioner, &
859 scf_control%diagonalization%ot_settings%preconditioner_type, &
860 dft_control%nspins)
861
862 CALL prepare_preconditioner(qs_env, mos, matrix_ks, matrix_s, scf_env%ot_preconditioner, &
863 scf_control%diagonalization%ot_settings%preconditioner_type, &
864 scf_control%diagonalization%ot_settings%precond_solver_type, &
865 scf_control%diagonalization%ot_settings%energy_gap, dft_control%nspins)
866
868 ! Preconditioner initialized within the loop, when required
869 CASE (ot_method_nr)
870 CALL get_qs_env(qs_env, &
871 has_unit_metric=has_unit_metric, &
872 matrix_s=matrix_s, &
873 matrix_ks=matrix_ks)
874
875 ! reortho the wavefunctions if we are having an outer scf and
876 ! this is not the first iteration
877 ! this is useful to avoid the build-up of numerical noise
878 ! however, we can not play this trick if restricted (don't mix non-equivalent orbs)
879 IF (scf_control%do_outer_scf_reortho) THEN
880 IF (scf_control%outer_scf%have_scf .AND. .NOT. dft_control%restricted) THEN
881 IF (scf_env%outer_scf%iter_count > 0) THEN
882 DO ispin = 1, dft_control%nspins
883 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, nmo=nmo)
884 IF (has_unit_metric) THEN
885 CALL make_basis_simple(mo_coeff, nmo)
886 ELSE
887 CALL make_basis_sm(mo_coeff, nmo, matrix_s(1)%matrix)
888 END IF
889 END DO
890 END IF
891 END IF
892 ELSE
893 ! dont need any dirty trick for the numerically stable irac algorithm.
894 END IF
895
896 IF (.NOT. ASSOCIATED(scf_env%qs_ot_env)) THEN
897
898 ! restricted calculations require just one set of OT orbitals
899 number_of_ot_envs = dft_control%nspins
900 IF (dft_control%restricted) number_of_ot_envs = 1
901
902 ALLOCATE (scf_env%qs_ot_env(number_of_ot_envs))
903
904 ! XXX Joost XXX should disentangle reading input from this part
905 IF (scf_env%outer_scf%iter_count > 0) THEN
906 IF (scf_env%iter_delta < scf_control%eps_diis) THEN
907 scf_env%qs_ot_env(1)%settings%ot_state = 1
908 END IF
909 END IF
910 !
911 CALL ot_scf_read_input(scf_env%qs_ot_env, scf_section)
912 !
913 IF (scf_env%outer_scf%iter_count > 0) THEN
914 IF (scf_env%qs_ot_env(1)%settings%ot_state == 1) THEN
915 scf_control%max_scf = max(scf_env%qs_ot_env(1)%settings%max_scf_diis, &
916 scf_control%max_scf)
917 END IF
918 END IF
919
920 ! keep a note that we are restricted
921 IF (dft_control%restricted) THEN
922 scf_env%qs_ot_env(1)%restricted = .true.
923 ! requires rotation
924 IF (.NOT. scf_env%qs_ot_env(1)%settings%do_rotation) &
925 CALL cp_abort(__location__, &
926 "Restricted calculation with OT requires orbital rotation. Please "// &
927 "activate the OT%ROTATION keyword!")
928 ELSE
929 scf_env%qs_ot_env(:)%restricted = .false.
930 END IF
931
932 ! this will rotate the MOs to be eigen states, which is not compatible with rotation
933 ! e.g. mo_derivs here do not yet include potentially different occupations numbers
934 do_rotation = scf_env%qs_ot_env(1)%settings%do_rotation
935 ! only full all needs rotation
936 is_full_all = scf_env%qs_ot_env(1)%settings%preconditioner_type == ot_precond_full_all
937 IF (do_rotation .AND. is_full_all) &
938 cpabort('PRECONDITIONER FULL_ALL is not compatible with ROTATION.')
939
940 ! might need the KS matrix to init properly
941 CALL qs_ks_update_qs_env(qs_env, just_energy=.false., &
942 calculate_forces=.false.)
943
944 ! if an old preconditioner is still around (i.e. outer SCF is active),
945 ! remove it if this could be worthwhile
946 IF (.NOT. reuse_precond) &
947 CALL restart_preconditioner(qs_env, scf_env%ot_preconditioner, &
948 scf_env%qs_ot_env(1)%settings%preconditioner_type, &
949 dft_control%nspins)
950
951 !
952 ! preconditioning still needs to be done correctly with has_unit_metric
953 ! notice that a big part of the preconditioning (S^-1) is fine anyhow
954 !
955 IF (has_unit_metric) THEN
956 NULLIFY (orthogonality_metric)
957 ELSE
958 orthogonality_metric => matrix_s(1)%matrix
959 END IF
960
961 IF (.NOT. reuse_precond) &
962 CALL prepare_preconditioner(qs_env, mos, matrix_ks, matrix_s, scf_env%ot_preconditioner, &
963 scf_env%qs_ot_env(1)%settings%preconditioner_type, &
964 scf_env%qs_ot_env(1)%settings%precond_solver_type, &
965 scf_env%qs_ot_env(1)%settings%energy_gap, dft_control%nspins, &
966 has_unit_metric=has_unit_metric, &
967 chol_type=scf_env%qs_ot_env(1)%settings%cholesky_type)
968 IF (reuse_precond) reuse_precond = .false.
969
970 CALL ot_scf_init(mo_array=mos, matrix_s=orthogonality_metric, &
971 broyden_adaptive_sigma=qs_env%broyden_adaptive_sigma, &
972 qs_ot_env=scf_env%qs_ot_env, matrix_ks=matrix_ks(1)%matrix)
973
974 SELECT CASE (scf_env%qs_ot_env(1)%settings%preconditioner_type)
975 CASE (ot_precond_none)
977 DO ispin = 1, SIZE(scf_env%qs_ot_env)
978 CALL qs_ot_new_preconditioner(scf_env%qs_ot_env(ispin), &
979 scf_env%ot_preconditioner(ispin)%preconditioner)
980 END DO
982 DO ispin = 1, SIZE(scf_env%qs_ot_env)
983 CALL qs_ot_new_preconditioner(scf_env%qs_ot_env(ispin), &
984 scf_env%ot_preconditioner(1)%preconditioner)
985 END DO
986 CASE DEFAULT
987 DO ispin = 1, SIZE(scf_env%qs_ot_env)
988 CALL qs_ot_new_preconditioner(scf_env%qs_ot_env(ispin), &
989 scf_env%ot_preconditioner(1)%preconditioner)
990 END DO
991 END SELECT
992 END IF
993
994 ! if we have non-uniform occupations we should be using rotation
995 do_rotation = scf_env%qs_ot_env(1)%settings%do_rotation
996 DO ispin = 1, SIZE(mos)
997 IF (.NOT. mos(ispin)%uniform_occupation) THEN
998 cpassert(do_rotation)
999 END IF
1000 END DO
1001 END SELECT
1002
1003 ! another safety check
1004 IF (dft_control%low_spin_roks) THEN
1005 cpassert(scf_env%method == ot_method_nr)
1006 do_rotation = scf_env%qs_ot_env(1)%settings%do_rotation
1007 cpassert(do_rotation)
1008 END IF
1009
1010 CALL timestop(handle)
1011
1012 END SUBROUTINE init_scf_loop
1013
1014! **************************************************************************************************
1015!> \brief perform cleanup operations (like releasing temporary storage)
1016!> at the end of the scf
1017!> \param scf_env ...
1018!> \par History
1019!> 02.2003 created [fawzi]
1020!> \author fawzi
1021! **************************************************************************************************
1022 SUBROUTINE scf_env_cleanup(scf_env)
1023 TYPE(qs_scf_env_type), INTENT(INOUT) :: scf_env
1024
1025 CHARACTER(len=*), PARAMETER :: routinen = 'scf_env_cleanup'
1026
1027 INTEGER :: handle
1028
1029 CALL timeset(routinen, handle)
1030
1031 ! Release SCF work storage
1032 CALL cp_fm_release(scf_env%scf_work1)
1033
1034 IF (ASSOCIATED(scf_env%scf_work1_red)) THEN
1035 CALL cp_fm_release(scf_env%scf_work1_red)
1036 END IF
1037 IF (ASSOCIATED(scf_env%scf_work2)) THEN
1038 CALL cp_fm_release(scf_env%scf_work2)
1039 DEALLOCATE (scf_env%scf_work2)
1040 NULLIFY (scf_env%scf_work2)
1041 END IF
1042 IF (ASSOCIATED(scf_env%scf_work2_red)) THEN
1043 CALL cp_fm_release(scf_env%scf_work2_red)
1044 DEALLOCATE (scf_env%scf_work2_red)
1045 NULLIFY (scf_env%scf_work2_red)
1046 END IF
1047 IF (ASSOCIATED(scf_env%ortho)) THEN
1048 CALL cp_fm_release(scf_env%ortho)
1049 DEALLOCATE (scf_env%ortho)
1050 NULLIFY (scf_env%ortho)
1051 END IF
1052 IF (ASSOCIATED(scf_env%ortho_red)) THEN
1053 CALL cp_fm_release(scf_env%ortho_red)
1054 DEALLOCATE (scf_env%ortho_red)
1055 NULLIFY (scf_env%ortho_red)
1056 END IF
1057 IF (ASSOCIATED(scf_env%ortho_m1)) THEN
1058 CALL cp_fm_release(scf_env%ortho_m1)
1059 DEALLOCATE (scf_env%ortho_m1)
1060 NULLIFY (scf_env%ortho_m1)
1061 END IF
1062 IF (ASSOCIATED(scf_env%ortho_m1_red)) THEN
1063 CALL cp_fm_release(scf_env%ortho_m1_red)
1064 DEALLOCATE (scf_env%ortho_m1_red)
1065 NULLIFY (scf_env%ortho_m1_red)
1066 END IF
1067
1068 IF (ASSOCIATED(scf_env%ortho_dbcsr)) THEN
1069 CALL dbcsr_deallocate_matrix(scf_env%ortho_dbcsr)
1070 END IF
1071 IF (ASSOCIATED(scf_env%buf1_dbcsr)) THEN
1072 CALL dbcsr_deallocate_matrix(scf_env%buf1_dbcsr)
1073 END IF
1074 IF (ASSOCIATED(scf_env%buf2_dbcsr)) THEN
1075 CALL dbcsr_deallocate_matrix(scf_env%buf2_dbcsr)
1076 END IF
1077
1078 IF (ASSOCIATED(scf_env%p_mix_new)) THEN
1079 CALL dbcsr_deallocate_matrix_set(scf_env%p_mix_new)
1080 END IF
1081
1082 IF (ASSOCIATED(scf_env%p_delta)) THEN
1083 CALL dbcsr_deallocate_matrix_set(scf_env%p_delta)
1084 END IF
1085
1086 ! Method dependent cleanup
1087 SELECT CASE (scf_env%method)
1088 CASE (ot_method_nr)
1089 !
1090 CASE (ot_diag_method_nr)
1091 !
1093 !
1095 !
1098 CALL block_davidson_deallocate(scf_env%block_davidson_env)
1100 !
1101 CASE (smeagol_method_nr)
1102 !
1103 CASE DEFAULT
1104 cpabort("unknown scf method method:"//cp_to_string(scf_env%method))
1105 END SELECT
1106
1107 IF (ASSOCIATED(scf_env%outer_scf%variables)) THEN
1108 DEALLOCATE (scf_env%outer_scf%variables)
1109 END IF
1110 IF (ASSOCIATED(scf_env%outer_scf%count)) THEN
1111 DEALLOCATE (scf_env%outer_scf%count)
1112 END IF
1113 IF (ASSOCIATED(scf_env%outer_scf%gradient)) THEN
1114 DEALLOCATE (scf_env%outer_scf%gradient)
1115 END IF
1116 IF (ASSOCIATED(scf_env%outer_scf%energy)) THEN
1117 DEALLOCATE (scf_env%outer_scf%energy)
1118 END IF
1119 IF (ASSOCIATED(scf_env%outer_scf%inv_jacobian) .AND. &
1120 scf_env%outer_scf%deallocate_jacobian) THEN
1121 DEALLOCATE (scf_env%outer_scf%inv_jacobian)
1122 END IF
1123
1124 CALL timestop(handle)
1125
1126 END SUBROUTINE scf_env_cleanup
1127
1128! **************************************************************************************************
1129!> \brief perform a CDFT scf procedure in the given qs_env
1130!> \param qs_env the qs_environment where to perform the scf procedure
1131!> \param should_stop flag determining if calculation should stop
1132!> \par History
1133!> 12.2015 Created
1134!> \author Nico Holmberg
1135! **************************************************************************************************
1136 SUBROUTINE cdft_scf(qs_env, should_stop)
1137 TYPE(qs_environment_type), POINTER :: qs_env
1138 LOGICAL, INTENT(OUT) :: should_stop
1139
1140 CHARACTER(len=*), PARAMETER :: routinen = 'cdft_scf'
1141
1142 INTEGER :: handle, iatom, ispin, ivar, nmo, nvar, &
1143 output_unit, tsteps
1144 LOGICAL :: cdft_loop_converged, converged, &
1145 exit_cdft_loop, first_iteration, &
1146 my_uocc, uniform_occupation
1147 REAL(kind=dp), DIMENSION(:), POINTER :: mo_occupations
1148 TYPE(cdft_control_type), POINTER :: cdft_control
1149 TYPE(cp_logger_type), POINTER :: logger
1150 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_s, rho_ao
1151 TYPE(dft_control_type), POINTER :: dft_control
1152 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
1153 TYPE(pw_env_type), POINTER :: pw_env
1154 TYPE(pw_pool_type), POINTER :: auxbas_pw_pool
1155 TYPE(qs_energy_type), POINTER :: energy
1156 TYPE(qs_ks_env_type), POINTER :: ks_env
1157 TYPE(qs_rho_type), POINTER :: rho
1158 TYPE(qs_scf_env_type), POINTER :: scf_env
1159 TYPE(scf_control_type), POINTER :: scf_control
1160 TYPE(section_vals_type), POINTER :: dft_section, input, scf_section
1161
1162 NULLIFY (scf_env, ks_env, energy, rho, matrix_s, rho_ao, cdft_control, logger, &
1163 dft_control, pw_env, auxbas_pw_pool, energy, ks_env, scf_env, dft_section, &
1164 input, scf_section, scf_control, mos, mo_occupations)
1165 logger => cp_get_default_logger()
1166
1167 cpassert(ASSOCIATED(qs_env))
1168 CALL get_qs_env(qs_env, scf_env=scf_env, energy=energy, &
1169 dft_control=dft_control, scf_control=scf_control, &
1170 ks_env=ks_env, input=input)
1171
1172 CALL timeset(routinen//"_loop", handle)
1173 dft_section => section_vals_get_subs_vals(input, "DFT")
1174 scf_section => section_vals_get_subs_vals(dft_section, "SCF")
1175 output_unit = cp_print_key_unit_nr(logger, scf_section, "PRINT%PROGRAM_RUN_INFO", &
1176 extension=".scfLog")
1177 first_iteration = .true.
1178
1179 cdft_control => dft_control%qs_control%cdft_control
1180
1181 scf_env%outer_scf%iter_count = 0
1182 cdft_control%total_steps = 0
1183
1184 ! Write some info about the CDFT calculation
1185 IF (output_unit > 0) THEN
1186 WRITE (unit=output_unit, fmt="(/,/,T2,A)") &
1187 "CDFT EXTERNAL SCF WAVEFUNCTION OPTIMIZATION"
1188 CALL qs_scf_cdft_initial_info(output_unit, cdft_control)
1189 END IF
1190 IF (cdft_control%reuse_precond) THEN
1191 reuse_precond = .false.
1192 cdft_control%nreused = 0
1193 END IF
1194 cdft_outer_loop: DO
1195 ! Change outer_scf settings to OT settings
1196 CALL outer_loop_switch(scf_env, scf_control, cdft_control, cdft2ot)
1197 ! Solve electronic structure with fixed value of constraint
1198 CALL scf_env_do_scf(scf_env=scf_env, scf_control=scf_control, qs_env=qs_env, &
1199 converged=converged, should_stop=should_stop, total_scf_steps=tsteps)
1200 ! Decide whether to reuse the preconditioner on the next iteration
1201 IF (cdft_control%reuse_precond) THEN
1202 ! For convergence in exactly one step, the preconditioner is always reused (assuming max_reuse > 0)
1203 ! usually this means that the electronic structure has already converged to the correct state
1204 ! but the constraint optimizer keeps jumping over the optimal solution
1205 IF (scf_env%outer_scf%iter_count == 1 .AND. scf_env%iter_count == 1 &
1206 .AND. cdft_control%total_steps /= 1) &
1207 cdft_control%nreused = cdft_control%nreused - 1
1208 ! SCF converged in less than precond_freq steps
1209 IF (scf_env%outer_scf%iter_count == 1 .AND. scf_env%iter_count <= cdft_control%precond_freq .AND. &
1210 cdft_control%total_steps /= 1 .AND. cdft_control%nreused < cdft_control%max_reuse) THEN
1211 reuse_precond = .true.
1212 cdft_control%nreused = cdft_control%nreused + 1
1213 ELSE
1214 reuse_precond = .false.
1215 cdft_control%nreused = 0
1216 END IF
1217 END IF
1218 ! Update history purging counters
1219 IF (first_iteration .AND. cdft_control%purge_history) THEN
1220 cdft_control%istep = cdft_control%istep + 1
1221 IF (scf_env%outer_scf%iter_count > 1) THEN
1222 cdft_control%nbad_conv = cdft_control%nbad_conv + 1
1223 IF (cdft_control%nbad_conv >= cdft_control%purge_freq .AND. &
1224 cdft_control%istep >= cdft_control%purge_offset) THEN
1225 cdft_control%nbad_conv = 0
1226 cdft_control%istep = 0
1227 cdft_control%should_purge = .true.
1228 END IF
1229 END IF
1230 END IF
1231 first_iteration = .false.
1232 ! Change outer_scf settings to CDFT settings
1233 CALL outer_loop_switch(scf_env, scf_control, cdft_control, ot2cdft)
1234 CALL qs_scf_check_outer_exit(qs_env, scf_env, scf_control, should_stop, &
1235 cdft_loop_converged, exit_cdft_loop)
1236 CALL qs_scf_cdft_info(output_unit, scf_control, scf_env, cdft_control, &
1237 energy, cdft_control%total_steps, &
1238 should_stop, cdft_loop_converged, cdft_loop=.true.)
1239 IF (exit_cdft_loop) EXIT cdft_outer_loop
1240 ! Check if the inverse Jacobian needs to be calculated
1241 CALL qs_calculate_inverse_jacobian(qs_env)
1242 ! Check if a line search should be performed to find an optimal step size for the optimizer
1243 CALL qs_cdft_line_search(qs_env)
1244 ! Optimize constraint
1245 CALL outer_loop_optimize(scf_env, scf_control)
1246 CALL outer_loop_update_qs_env(qs_env, scf_env)
1247 CALL qs_ks_did_change(ks_env, potential_changed=.true.)
1248 END DO cdft_outer_loop
1249
1250 cdft_control%ienergy = cdft_control%ienergy + 1
1251
1252 ! Store needed arrays for ET coupling calculation
1253 IF (cdft_control%do_et) THEN
1254 CALL get_qs_env(qs_env=qs_env, matrix_s=matrix_s, mos=mos)
1255 nvar = SIZE(cdft_control%target)
1256 ! Matrix representation of weight function
1257 ALLOCATE (cdft_control%wmat(nvar))
1258 DO ivar = 1, nvar
1259 CALL dbcsr_init_p(cdft_control%wmat(ivar)%matrix)
1260 CALL dbcsr_copy(cdft_control%wmat(ivar)%matrix, matrix_s(1)%matrix, &
1261 name="ET_RESTRAINT_MATRIX")
1262 CALL dbcsr_set(cdft_control%wmat(ivar)%matrix, 0.0_dp)
1263 CALL integrate_v_rspace(cdft_control%group(ivar)%weight, &
1264 hmat=cdft_control%wmat(ivar), qs_env=qs_env, &
1265 calculate_forces=.false., &
1266 gapw=dft_control%qs_control%gapw)
1267 END DO
1268 ! Overlap matrix
1269 CALL dbcsr_init_p(cdft_control%matrix_s%matrix)
1270 CALL dbcsr_copy(cdft_control%matrix_s%matrix, matrix_s(1)%matrix, &
1271 name="OVERLAP")
1272 ! Molecular orbital coefficients
1273 NULLIFY (cdft_control%mo_coeff)
1274 ALLOCATE (cdft_control%mo_coeff(dft_control%nspins))
1275 DO ispin = 1, dft_control%nspins
1276 CALL cp_fm_create(matrix=cdft_control%mo_coeff(ispin), &
1277 matrix_struct=qs_env%mos(ispin)%mo_coeff%matrix_struct, &
1278 name="MO_COEFF_A"//trim(adjustl(cp_to_string(ispin)))//"MATRIX")
1279 CALL cp_fm_to_fm(qs_env%mos(ispin)%mo_coeff, &
1280 cdft_control%mo_coeff(ispin))
1281 END DO
1282 ! Density matrix
1283 IF (cdft_control%calculate_metric) THEN
1284 CALL get_qs_env(qs_env, rho=rho)
1285 CALL qs_rho_get(rho, rho_ao=rho_ao)
1286 ALLOCATE (cdft_control%matrix_p(dft_control%nspins))
1287 DO ispin = 1, dft_control%nspins
1288 NULLIFY (cdft_control%matrix_p(ispin)%matrix)
1289 CALL dbcsr_init_p(cdft_control%matrix_p(ispin)%matrix)
1290 CALL dbcsr_copy(cdft_control%matrix_p(ispin)%matrix, rho_ao(ispin)%matrix, &
1291 name="DENSITY MATRIX")
1292 END DO
1293 END IF
1294 ! Copy occupation numbers if non-uniform occupation
1295 uniform_occupation = .true.
1296 DO ispin = 1, dft_control%nspins
1297 CALL get_mo_set(mo_set=mos(ispin), uniform_occupation=my_uocc)
1298 uniform_occupation = uniform_occupation .AND. my_uocc
1299 END DO
1300 IF (.NOT. uniform_occupation) THEN
1301 ALLOCATE (cdft_control%occupations(dft_control%nspins))
1302 DO ispin = 1, dft_control%nspins
1303 CALL get_mo_set(mo_set=mos(ispin), &
1304 nmo=nmo, &
1305 occupation_numbers=mo_occupations)
1306 ALLOCATE (cdft_control%occupations(ispin)%array(nmo))
1307 cdft_control%occupations(ispin)%array(1:nmo) = mo_occupations(1:nmo)
1308 END DO
1309 END IF
1310 END IF
1311
1312 ! Deallocate constraint storage if forces are not needed
1313 ! In case of a simulation with multiple force_evals,
1314 ! deallocate only if weight function should not be copied to different force_evals
1315 IF (.NOT. (cdft_control%save_pot .OR. cdft_control%transfer_pot)) THEN
1316 CALL get_qs_env(qs_env, pw_env=pw_env)
1317 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
1318 DO iatom = 1, SIZE(cdft_control%group)
1319 CALL auxbas_pw_pool%give_back_pw(cdft_control%group(iatom)%weight)
1320 DEALLOCATE (cdft_control%group(iatom)%weight)
1321 END DO
1322 IF (cdft_control%atomic_charges) THEN
1323 DO iatom = 1, cdft_control%natoms
1324 CALL auxbas_pw_pool%give_back_pw(cdft_control%charge(iatom))
1325 END DO
1326 DEALLOCATE (cdft_control%charge)
1327 END IF
1328 IF (cdft_control%type == outer_scf_becke_constraint .AND. &
1329 cdft_control%becke_control%cavity_confine) THEN
1330 IF (.NOT. ASSOCIATED(cdft_control%becke_control%cavity_mat)) THEN
1331 CALL auxbas_pw_pool%give_back_pw(cdft_control%becke_control%cavity)
1332 ELSE
1333 DEALLOCATE (cdft_control%becke_control%cavity_mat)
1334 END IF
1335 ELSE IF (cdft_control%type == outer_scf_hirshfeld_constraint) THEN
1336 IF (ASSOCIATED(cdft_control%hirshfeld_control%hirshfeld_env%fnorm)) THEN
1337 CALL auxbas_pw_pool%give_back_pw(cdft_control%hirshfeld_control%hirshfeld_env%fnorm)
1338 END IF
1339 END IF
1340 IF (ASSOCIATED(cdft_control%charges_fragment)) DEALLOCATE (cdft_control%charges_fragment)
1341 cdft_control%need_pot = .true.
1342 cdft_control%external_control = .false.
1343 END IF
1344
1345 CALL timestop(handle)
1346
1347 END SUBROUTINE cdft_scf
1348
1349! **************************************************************************************************
1350!> \brief perform cleanup operations for cdft_control
1351!> \param cdft_control container for the external CDFT SCF loop variables
1352!> \par History
1353!> 12.2015 created [Nico Holmberg]
1354!> \author Nico Holmberg
1355! **************************************************************************************************
1356 SUBROUTINE cdft_control_cleanup(cdft_control)
1357 TYPE(cdft_control_type), POINTER :: cdft_control
1358
1359 IF (ASSOCIATED(cdft_control%constraint%variables)) &
1360 DEALLOCATE (cdft_control%constraint%variables)
1361 IF (ASSOCIATED(cdft_control%constraint%count)) &
1362 DEALLOCATE (cdft_control%constraint%count)
1363 IF (ASSOCIATED(cdft_control%constraint%gradient)) &
1364 DEALLOCATE (cdft_control%constraint%gradient)
1365 IF (ASSOCIATED(cdft_control%constraint%energy)) &
1366 DEALLOCATE (cdft_control%constraint%energy)
1367 IF (ASSOCIATED(cdft_control%constraint%inv_jacobian) .AND. &
1368 cdft_control%constraint%deallocate_jacobian) &
1369 DEALLOCATE (cdft_control%constraint%inv_jacobian)
1370
1371 END SUBROUTINE cdft_control_cleanup
1372
1373! **************************************************************************************************
1374!> \brief Calculates the finite difference inverse Jacobian
1375!> \param qs_env the qs_environment_type where to compute the Jacobian
1376!> \par History
1377!> 01.2017 created [Nico Holmberg]
1378! **************************************************************************************************
1379 SUBROUTINE qs_calculate_inverse_jacobian(qs_env)
1380 TYPE(qs_environment_type), POINTER :: qs_env
1381
1382 CHARACTER(LEN=*), PARAMETER :: routinen = 'qs_calculate_inverse_jacobian'
1383
1384 CHARACTER(len=default_path_length) :: project_name
1385 INTEGER :: counter, handle, i, ispin, iter_count, &
1386 iwork, j, max_scf, nspins, nsteps, &
1387 nvar, nwork, output_unit, pwork, &
1388 tsteps, twork
1389 LOGICAL :: converged, explicit_jacobian, &
1390 should_build, should_stop, &
1391 use_md_history
1392 REAL(kind=dp) :: inv_error, step_size
1393 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: coeff, dh, step_multiplier
1394 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :) :: jacobian
1395 REAL(kind=dp), DIMENSION(:), POINTER :: energy
1396 REAL(kind=dp), DIMENSION(:, :), POINTER :: gradient, inv_jacobian
1397 TYPE(cdft_control_type), POINTER :: cdft_control
1398 TYPE(cp_logger_type), POINTER :: logger, tmp_logger
1399 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: p_rmpv
1400 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: rho_ao_kp
1401 TYPE(dft_control_type), POINTER :: dft_control
1402 TYPE(mo_set_type), ALLOCATABLE, DIMENSION(:) :: mos_stashed
1403 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
1404 TYPE(mp_para_env_type), POINTER :: para_env
1405 TYPE(qs_energy_type), POINTER :: energy_qs
1406 TYPE(qs_ks_env_type), POINTER :: ks_env
1407 TYPE(qs_rho_type), POINTER :: rho
1408 TYPE(qs_scf_env_type), POINTER :: scf_env
1409 TYPE(scf_control_type), POINTER :: scf_control
1410
1411 NULLIFY (energy, gradient, p_rmpv, rho_ao_kp, mos, rho, &
1412 ks_env, scf_env, scf_control, dft_control, cdft_control, &
1413 inv_jacobian, para_env, tmp_logger, energy_qs)
1414 logger => cp_get_default_logger()
1415
1416 cpassert(ASSOCIATED(qs_env))
1417 CALL get_qs_env(qs_env, scf_env=scf_env, ks_env=ks_env, &
1418 scf_control=scf_control, mos=mos, rho=rho, &
1419 dft_control=dft_control, &
1420 para_env=para_env, energy=energy_qs)
1421 explicit_jacobian = .false.
1422 should_build = .false.
1423 use_md_history = .false.
1424 iter_count = scf_env%outer_scf%iter_count
1425 ! Quick exit if optimizer does not require Jacobian
1426 IF (.NOT. ASSOCIATED(scf_control%outer_scf%cdft_opt_control)) RETURN
1427 ! Check if Jacobian should be calculated and initialize
1428 CALL timeset(routinen, handle)
1429 CALL initialize_inverse_jacobian(scf_control, scf_env, explicit_jacobian, should_build, used_history)
1430 IF (scf_control%outer_scf%cdft_opt_control%jacobian_restart) THEN
1431 ! Restart from previously calculated inverse Jacobian
1432 should_build = .false.
1433 CALL restart_inverse_jacobian(qs_env)
1434 END IF
1435 IF (should_build) THEN
1436 scf_env%outer_scf%deallocate_jacobian = .false.
1437 ! Actually need to (re)build the Jacobian
1438 IF (explicit_jacobian) THEN
1439 ! Build Jacobian with finite differences
1440 cdft_control => dft_control%qs_control%cdft_control
1441 IF (.NOT. ASSOCIATED(cdft_control)) &
1442 CALL cp_abort(__location__, &
1443 "Optimizers that need the explicit Jacobian can"// &
1444 " only be used together with a valid CDFT constraint.")
1445 ! Redirect output from Jacobian calculation to a new file by creating a temporary logger
1446 project_name = logger%iter_info%project_name
1447 CALL create_tmp_logger(para_env, project_name, "-JacobianInfo.out", output_unit, tmp_logger)
1448 ! Save last converged state so we can roll back to it (mo_coeff and some outer_loop variables)
1449 nspins = dft_control%nspins
1450 ALLOCATE (mos_stashed(nspins))
1451 DO ispin = 1, nspins
1452 CALL duplicate_mo_set(mos_stashed(ispin), mos(ispin))
1453 END DO
1454 CALL qs_rho_get(rho, rho_ao_kp=rho_ao_kp)
1455 p_rmpv => rho_ao_kp(:, 1)
1456 ! Allocate work
1457 nvar = SIZE(scf_env%outer_scf%variables, 1)
1458 max_scf = scf_control%outer_scf%max_scf + 1
1459 ALLOCATE (gradient(nvar, max_scf))
1460 gradient = scf_env%outer_scf%gradient
1461 ALLOCATE (energy(max_scf))
1462 energy = scf_env%outer_scf%energy
1463 ALLOCATE (jacobian(nvar, nvar))
1464 jacobian = 0.0_dp
1465 nsteps = cdft_control%total_steps
1466 ! Setup finite difference scheme
1467 CALL prepare_jacobian_stencil(qs_env, output_unit, nwork, pwork, coeff, step_multiplier, dh)
1468 twork = pwork - nwork
1469 DO i = 1, nvar
1470 jacobian(i, :) = coeff(0)*scf_env%outer_scf%gradient(i, iter_count)
1471 END DO
1472 ! Calculate the Jacobian by perturbing each Lagrangian and recalculating the energy self-consistently
1473 CALL cp_add_default_logger(tmp_logger)
1474 DO i = 1, nvar
1475 IF (output_unit > 0) THEN
1476 WRITE (output_unit, fmt="(A)") " "
1477 WRITE (output_unit, fmt="(A)") " #####################################"
1478 WRITE (output_unit, '(A,I3,A,I3,A)') &
1479 " ### Constraint ", i, " of ", nvar, " ###"
1480 WRITE (output_unit, fmt="(A)") " #####################################"
1481 END IF
1482 counter = 0
1483 DO iwork = nwork, pwork
1484 IF (iwork == 0) cycle
1485 counter = counter + 1
1486 IF (output_unit > 0) THEN
1487 WRITE (output_unit, fmt="(A)") " #####################################"
1488 WRITE (output_unit, '(A,I3,A,I3,A)') &
1489 " ### Energy evaluation ", counter, " of ", twork, " ###"
1490 WRITE (output_unit, fmt="(A)") " #####################################"
1491 END IF
1492 IF (SIZE(scf_control%outer_scf%cdft_opt_control%jacobian_step) == 1) THEN
1493 step_size = scf_control%outer_scf%cdft_opt_control%jacobian_step(1)
1494 ELSE
1495 step_size = scf_control%outer_scf%cdft_opt_control%jacobian_step(i)
1496 END IF
1497 scf_env%outer_scf%variables(:, iter_count + 1) = scf_env%outer_scf%variables(:, iter_count)
1498 scf_env%outer_scf%variables(i, iter_count + 1) = scf_env%outer_scf%variables(i, iter_count) + &
1499 step_multiplier(iwork)*step_size
1500 CALL outer_loop_update_qs_env(qs_env, scf_env)
1501 CALL qs_ks_did_change(ks_env, potential_changed=.true.)
1502 CALL outer_loop_switch(scf_env, scf_control, cdft_control, cdft2ot)
1503 CALL scf_env_do_scf(scf_env=scf_env, scf_control=scf_control, qs_env=qs_env, &
1504 converged=converged, should_stop=should_stop, total_scf_steps=tsteps)
1505 CALL outer_loop_switch(scf_env, scf_control, cdft_control, ot2cdft)
1506 ! Update (iter_count + 1) element of gradient and print constraint info
1507 scf_env%outer_scf%iter_count = scf_env%outer_scf%iter_count + 1
1508 CALL outer_loop_gradient(qs_env, scf_env)
1509 CALL qs_scf_cdft_info(output_unit, scf_control, scf_env, cdft_control, &
1510 energy_qs, cdft_control%total_steps, &
1511 should_stop=.false., outer_loop_converged=.false., cdft_loop=.false.)
1512 scf_env%outer_scf%iter_count = scf_env%outer_scf%iter_count - 1
1513 ! Update Jacobian
1514 DO j = 1, nvar
1515 jacobian(j, i) = jacobian(j, i) + coeff(iwork)*scf_env%outer_scf%gradient(j, iter_count + 1)
1516 END DO
1517 ! Reset everything to last converged state
1518 scf_env%outer_scf%variables(:, iter_count + 1) = 0.0_dp
1519 scf_env%outer_scf%gradient = gradient
1520 scf_env%outer_scf%energy = energy
1521 cdft_control%total_steps = nsteps
1522 DO ispin = 1, nspins
1523 CALL deallocate_mo_set(mos(ispin))
1524 CALL duplicate_mo_set(mos(ispin), mos_stashed(ispin))
1525 CALL calculate_density_matrix(mos(ispin), &
1526 p_rmpv(ispin)%matrix)
1527 END DO
1528 CALL qs_rho_update_rho(rho, qs_env=qs_env)
1529 CALL qs_ks_did_change(qs_env%ks_env, rho_changed=.true.)
1530 END DO
1531 END DO
1533 CALL cp_logger_release(tmp_logger)
1534 ! Finalize and invert Jacobian
1535 DO j = 1, nvar
1536 DO i = 1, nvar
1537 jacobian(i, j) = jacobian(i, j)/dh(j)
1538 END DO
1539 END DO
1540 IF (.NOT. ASSOCIATED(scf_env%outer_scf%inv_jacobian)) &
1541 ALLOCATE (scf_env%outer_scf%inv_jacobian(nvar, nvar))
1542 inv_jacobian => scf_env%outer_scf%inv_jacobian
1543 CALL invert_matrix(jacobian, inv_jacobian, inv_error)
1544 scf_control%outer_scf%cdft_opt_control%broyden_update = .false.
1545 ! Release temporary storage
1546 DO ispin = 1, nspins
1547 CALL deallocate_mo_set(mos_stashed(ispin))
1548 END DO
1549 DEALLOCATE (mos_stashed, jacobian, gradient, energy, coeff, step_multiplier, dh)
1550 IF (output_unit > 0) THEN
1551 WRITE (output_unit, fmt="(/,A)") &
1552 " ================================== JACOBIAN CALCULATED =================================="
1553 CALL close_file(unit_number=output_unit)
1554 END IF
1555 ELSE
1556 ! Build a strictly diagonal Jacobian from history and invert it
1557 CALL build_diagonal_jacobian(qs_env, used_history)
1558 END IF
1559 END IF
1560 IF (ASSOCIATED(scf_env%outer_scf%inv_jacobian) .AND. para_env%is_source()) THEN
1561 ! Write restart file for inverse Jacobian
1562 CALL print_inverse_jacobian(logger, scf_env%outer_scf%inv_jacobian, iter_count)
1563 END IF
1564 ! Update counter
1565 scf_control%outer_scf%cdft_opt_control%ijacobian(1) = scf_control%outer_scf%cdft_opt_control%ijacobian(1) + 1
1566 CALL timestop(handle)
1567
1568 END SUBROUTINE qs_calculate_inverse_jacobian
1569
1570! **************************************************************************************************
1571!> \brief Perform backtracking line search to find the optimal step size for the CDFT constraint
1572!> optimizer. Assumes that the CDFT gradient function is a smooth function of the constraint
1573!> variables.
1574!> \param qs_env the qs_environment_type where to perform the line search
1575!> \par History
1576!> 02.2017 created [Nico Holmberg]
1577! **************************************************************************************************
1578 SUBROUTINE qs_cdft_line_search(qs_env)
1579 TYPE(qs_environment_type), POINTER :: qs_env
1580
1581 CHARACTER(LEN=*), PARAMETER :: routinen = 'qs_cdft_line_search'
1582
1583 CHARACTER(len=default_path_length) :: project_name
1584 INTEGER :: handle, i, ispin, iter_count, &
1585 max_linesearch, max_scf, nspins, &
1586 nsteps, nvar, output_unit, tsteps
1587 LOGICAL :: continue_ls, continue_ls_exit, converged, do_linesearch, found_solution, &
1588 reached_maxls, should_exit, should_stop, sign_changed
1589 LOGICAL, ALLOCATABLE, DIMENSION(:) :: positive_sign
1590 REAL(kind=dp) :: alpha, alpha_ls, factor, norm_ls
1591 REAL(kind=dp), DIMENSION(:), POINTER :: energy
1592 REAL(kind=dp), DIMENSION(:, :), POINTER :: gradient, inv_jacobian
1593 REAL(kind=dp), EXTERNAL :: dnrm2
1594 TYPE(cdft_control_type), POINTER :: cdft_control
1595 TYPE(cp_logger_type), POINTER :: logger, tmp_logger
1596 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: p_rmpv
1597 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: rho_ao_kp
1598 TYPE(dft_control_type), POINTER :: dft_control
1599 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
1600 TYPE(mp_para_env_type), POINTER :: para_env
1601 TYPE(qs_energy_type), POINTER :: energy_qs
1602 TYPE(qs_ks_env_type), POINTER :: ks_env
1603 TYPE(qs_rho_type), POINTER :: rho
1604 TYPE(qs_scf_env_type), POINTER :: scf_env
1605 TYPE(scf_control_type), POINTER :: scf_control
1606
1607 CALL timeset(routinen, handle)
1608
1609 NULLIFY (energy, gradient, p_rmpv, rho_ao_kp, mos, rho, &
1610 ks_env, scf_env, scf_control, dft_control, &
1611 cdft_control, inv_jacobian, para_env, &
1612 tmp_logger, energy_qs)
1613 logger => cp_get_default_logger()
1614
1615 cpassert(ASSOCIATED(qs_env))
1616 CALL get_qs_env(qs_env, scf_env=scf_env, ks_env=ks_env, &
1617 scf_control=scf_control, mos=mos, rho=rho, &
1618 dft_control=dft_control, &
1619 para_env=para_env, energy=energy_qs)
1620 do_linesearch = .false.
1621 SELECT CASE (scf_control%outer_scf%optimizer)
1622 CASE DEFAULT
1623 do_linesearch = .false.
1625 do_linesearch = .true.
1627 SELECT CASE (scf_control%outer_scf%cdft_opt_control%broyden_type)
1629 do_linesearch = .false.
1631 cdft_control => dft_control%qs_control%cdft_control
1632 IF (.NOT. ASSOCIATED(cdft_control)) &
1633 CALL cp_abort(__location__, &
1634 "Optimizers that perform a line search can"// &
1635 " only be used together with a valid CDFT constraint")
1636 IF (ASSOCIATED(scf_env%outer_scf%inv_jacobian)) &
1637 do_linesearch = .true.
1638 END SELECT
1639 END SELECT
1640 IF (do_linesearch) THEN
1641 block
1642 TYPE(mo_set_type), DIMENSION(:), ALLOCATABLE :: mos_ls, mos_stashed
1643 cdft_control => dft_control%qs_control%cdft_control
1644 IF (.NOT. ASSOCIATED(cdft_control)) &
1645 CALL cp_abort(__location__, &
1646 "Optimizers that perform a line search can"// &
1647 " only be used together with a valid CDFT constraint")
1648 cpassert(ASSOCIATED(scf_env%outer_scf%inv_jacobian))
1649 cpassert(ASSOCIATED(scf_control%outer_scf%cdft_opt_control))
1650 alpha = scf_control%outer_scf%cdft_opt_control%newton_step_save
1651 iter_count = scf_env%outer_scf%iter_count
1652 ! Redirect output from line search procedure to a new file by creating a temporary logger
1653 project_name = logger%iter_info%project_name
1654 CALL create_tmp_logger(para_env, project_name, "-LineSearch.out", output_unit, tmp_logger)
1655 ! Save last converged state so we can roll back to it (mo_coeff and some outer_loop variables)
1656 nspins = dft_control%nspins
1657 ALLOCATE (mos_stashed(nspins))
1658 DO ispin = 1, nspins
1659 CALL duplicate_mo_set(mos_stashed(ispin), mos(ispin))
1660 END DO
1661 CALL qs_rho_get(rho, rho_ao_kp=rho_ao_kp)
1662 p_rmpv => rho_ao_kp(:, 1)
1663 nsteps = cdft_control%total_steps
1664 ! Allocate work
1665 nvar = SIZE(scf_env%outer_scf%variables, 1)
1666 max_scf = scf_control%outer_scf%max_scf + 1
1667 max_linesearch = scf_control%outer_scf%cdft_opt_control%max_ls
1668 continue_ls = scf_control%outer_scf%cdft_opt_control%continue_ls
1669 factor = scf_control%outer_scf%cdft_opt_control%factor_ls
1670 continue_ls_exit = .false.
1671 found_solution = .false.
1672 ALLOCATE (gradient(nvar, max_scf))
1673 gradient = scf_env%outer_scf%gradient
1674 ALLOCATE (energy(max_scf))
1675 energy = scf_env%outer_scf%energy
1676 reached_maxls = .false.
1677 ! Broyden optimizers: perform update of inv_jacobian if necessary
1678 IF (scf_control%outer_scf%cdft_opt_control%broyden_update) THEN
1679 CALL outer_loop_optimize(scf_env, scf_control)
1680 ! Reset the variables and prevent a reupdate of inv_jacobian
1681 scf_env%outer_scf%variables(:, iter_count + 1) = 0
1682 scf_control%outer_scf%cdft_opt_control%broyden_update = .false.
1683 END IF
1684 ! Print some info
1685 IF (output_unit > 0) THEN
1686 WRITE (output_unit, fmt="(/,A)") &
1687 " ================================== LINE SEARCH STARTED =================================="
1688 WRITE (output_unit, fmt="(A,I5,A)") &
1689 " Evaluating optimal step size for optimizer using a maximum of", max_linesearch, " steps"
1690 IF (continue_ls) THEN
1691 WRITE (output_unit, fmt="(A)") &
1692 " Line search continues until best step size is found or max steps are reached"
1693 END IF
1694 WRITE (output_unit, '(/,A,F5.3)') &
1695 " Initial step size: ", alpha
1696 WRITE (output_unit, '(/,A,F5.3)') &
1697 " Step size update factor: ", factor
1698 WRITE (output_unit, '(/,A,I10,A,I10)') &
1699 " Energy evaluation: ", cdft_control%ienergy, ", CDFT SCF iteration: ", iter_count
1700 END IF
1701 ! Perform backtracking line search
1702 CALL cp_add_default_logger(tmp_logger)
1703 DO i = 1, max_linesearch
1704 IF (output_unit > 0) THEN
1705 WRITE (output_unit, fmt="(A)") " "
1706 WRITE (output_unit, fmt="(A)") " #####################################"
1707 WRITE (output_unit, '(A,I10,A)') &
1708 " ### Line search step: ", i, " ###"
1709 WRITE (output_unit, fmt="(A)") " #####################################"
1710 END IF
1711 inv_jacobian => scf_env%outer_scf%inv_jacobian
1712 ! Newton update of CDFT variables with a step size of alpha
1713 scf_env%outer_scf%variables(:, iter_count + 1) = scf_env%outer_scf%variables(:, iter_count) - alpha* &
1714 matmul(inv_jacobian, scf_env%outer_scf%gradient(:, iter_count))
1715 ! With updated CDFT variables, perform SCF
1716 CALL outer_loop_update_qs_env(qs_env, scf_env)
1717 CALL qs_ks_did_change(ks_env, potential_changed=.true.)
1718 CALL outer_loop_switch(scf_env, scf_control, cdft_control, cdft2ot)
1719 CALL scf_env_do_scf(scf_env=scf_env, scf_control=scf_control, qs_env=qs_env, &
1720 converged=converged, should_stop=should_stop, total_scf_steps=tsteps)
1721 CALL outer_loop_switch(scf_env, scf_control, cdft_control, ot2cdft)
1722 ! Update (iter_count + 1) element of gradient and print constraint info
1723 scf_env%outer_scf%iter_count = scf_env%outer_scf%iter_count + 1
1724 CALL outer_loop_gradient(qs_env, scf_env)
1725 CALL qs_scf_cdft_info(output_unit, scf_control, scf_env, cdft_control, &
1726 energy_qs, cdft_control%total_steps, &
1727 should_stop=.false., outer_loop_converged=.false., cdft_loop=.false.)
1728 scf_env%outer_scf%iter_count = scf_env%outer_scf%iter_count - 1
1729 ! Store sign of initial gradient for each variable for continue_ls
1730 IF (continue_ls .AND. .NOT. ALLOCATED(positive_sign)) THEN
1731 ALLOCATE (positive_sign(nvar))
1732 DO ispin = 1, nvar
1733 positive_sign(ispin) = scf_env%outer_scf%gradient(ispin, iter_count + 1) >= 0.0_dp
1734 END DO
1735 END IF
1736 ! Check if the L2 norm of the gradient decreased
1737 inv_jacobian => scf_env%outer_scf%inv_jacobian
1738 IF (dnrm2(nvar, scf_env%outer_scf%gradient(:, iter_count + 1), 1) < &
1739 dnrm2(nvar, scf_env%outer_scf%gradient(:, iter_count), 1)) THEN
1740 ! Optimal step size found
1741 IF (.NOT. continue_ls) THEN
1742 should_exit = .true.
1743 ELSE
1744 ! But line search continues for at least one more iteration in an attempt to find a better solution
1745 ! if max number of steps is not exceeded
1746 IF (found_solution) THEN
1747 ! Check if the norm also decreased w.r.t. to previously found solution
1748 IF (dnrm2(nvar, scf_env%outer_scf%gradient(:, iter_count + 1), 1) > norm_ls) THEN
1749 ! Norm increased => accept previous solution and exit
1750 continue_ls_exit = .true.
1751 END IF
1752 END IF
1753 ! Store current state and the value of alpha
1754 IF (.NOT. continue_ls_exit) THEN
1755 should_exit = .false.
1756 alpha_ls = alpha
1757 found_solution = .true.
1758 norm_ls = dnrm2(nvar, scf_env%outer_scf%gradient(:, iter_count + 1), 1)
1759 ! Check if the sign of the gradient has changed for all variables (w.r.t initial gradient)
1760 ! In this case we should exit because further line search steps will just increase the norm
1761 sign_changed = .true.
1762 DO ispin = 1, nvar
1763 sign_changed = sign_changed .AND. (positive_sign(ispin) .NEQV. &
1764 scf_env%outer_scf%gradient(ispin, iter_count + 1) >= 0.0_dp)
1765 END DO
1766 IF (.NOT. ALLOCATED(mos_ls)) THEN
1767 ALLOCATE (mos_ls(nspins))
1768 ELSE
1769 DO ispin = 1, nspins
1770 CALL deallocate_mo_set(mos_ls(ispin))
1771 END DO
1772 END IF
1773 DO ispin = 1, nspins
1774 CALL duplicate_mo_set(mos_ls(ispin), mos(ispin))
1775 END DO
1776 alpha = alpha*factor
1777 ! Exit on last iteration
1778 IF (i == max_linesearch) continue_ls_exit = .true.
1779 ! Exit if constraint target is satisfied to requested tolerance
1780 IF (sqrt(maxval(scf_env%outer_scf%gradient(:, scf_env%outer_scf%iter_count + 1)**2)) < &
1781 scf_control%outer_scf%eps_scf) &
1782 continue_ls_exit = .true.
1783 ! Exit if line search jumped over the optimal step length
1784 IF (sign_changed) continue_ls_exit = .true.
1785 END IF
1786 END IF
1787 ELSE
1788 ! Gradient increased => alpha is too large (if the gradient function is smooth)
1789 should_exit = .false.
1790 ! Update alpha using Armijo's scheme
1791 alpha = alpha*factor
1792 END IF
1793 IF (continue_ls_exit) THEN
1794 ! Continuation of line search did not yield a better alpha, use previously located solution and exit
1795 alpha = alpha_ls
1796 DO ispin = 1, nspins
1797 CALL deallocate_mo_set(mos(ispin))
1798 CALL duplicate_mo_set(mos(ispin), mos_ls(ispin))
1799 CALL calculate_density_matrix(mos(ispin), &
1800 p_rmpv(ispin)%matrix)
1801 CALL deallocate_mo_set(mos_ls(ispin))
1802 END DO
1803 CALL qs_rho_update_rho(rho, qs_env=qs_env)
1804 CALL qs_ks_did_change(qs_env%ks_env, rho_changed=.true.)
1805 DEALLOCATE (mos_ls)
1806 should_exit = .true.
1807 END IF
1808 ! Reached max steps and SCF converged: continue with last iterated step size
1809 IF (.NOT. should_exit .AND. &
1810 (i == max_linesearch .AND. converged .AND. .NOT. found_solution)) THEN
1811 should_exit = .true.
1812 reached_maxls = .true.
1813 alpha = alpha*(1.0_dp/factor)
1814 END IF
1815 ! Reset outer SCF environment to last converged state
1816 scf_env%outer_scf%variables(:, iter_count + 1) = 0.0_dp
1817 scf_env%outer_scf%gradient = gradient
1818 scf_env%outer_scf%energy = energy
1819 ! Exit line search if a suitable step size was found
1820 IF (should_exit) EXIT
1821 ! Reset the electronic structure
1822 cdft_control%total_steps = nsteps
1823 DO ispin = 1, nspins
1824 CALL deallocate_mo_set(mos(ispin))
1825 CALL duplicate_mo_set(mos(ispin), mos_stashed(ispin))
1826 CALL calculate_density_matrix(mos(ispin), &
1827 p_rmpv(ispin)%matrix)
1828 END DO
1829 CALL qs_rho_update_rho(rho, qs_env=qs_env)
1830 CALL qs_ks_did_change(qs_env%ks_env, rho_changed=.true.)
1831 END DO
1832 scf_control%outer_scf%cdft_opt_control%newton_step = alpha
1833 IF (.NOT. should_exit) THEN
1834 CALL cp_warn(__location__, &
1835 "Line search did not converge. CDFT SCF proceeds with fixed step size.")
1836 scf_control%outer_scf%cdft_opt_control%newton_step = scf_control%outer_scf%cdft_opt_control%newton_step_save
1837 END IF
1838 IF (reached_maxls) &
1839 CALL cp_warn(__location__, &
1840 "Line search did not converge. CDFT SCF proceeds with lasted iterated step size.")
1842 CALL cp_logger_release(tmp_logger)
1843 ! Release temporary storage
1844 DO ispin = 1, nspins
1845 CALL deallocate_mo_set(mos_stashed(ispin))
1846 END DO
1847 DEALLOCATE (mos_stashed, gradient, energy)
1848 IF (ALLOCATED(positive_sign)) DEALLOCATE (positive_sign)
1849 IF (output_unit > 0) THEN
1850 WRITE (output_unit, fmt="(/,A)") &
1851 " ================================== LINE SEARCH COMPLETE =================================="
1852 CALL close_file(unit_number=output_unit)
1853 END IF
1854 END block
1855 END IF
1856
1857 CALL timestop(handle)
1858
1859 END SUBROUTINE qs_cdft_line_search
1860
1861END MODULE qs_scf
Define the atomic kind types and their sub types.
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
subroutine, public dbcsr_deallocate_matrix(matrix)
...
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)
...
subroutine, public dbcsr_init_p(matrix)
...
subroutine, public dbcsr_set(matrix, alpha)
...
DBCSR operations in CP2K.
subroutine, public copy_dbcsr_to_fm(matrix, fm)
Copy a DBCSR matrix to a BLACS matrix.
Utility routines to open and close files. Tracking of preconnections.
Definition cp_files.F:16
subroutine, public close_file(unit_number, file_status, keep_preconnection)
Close an open file given by its logical unit number. Optionally, keep the file and unit preconnected.
Definition cp_files.F:122
represent a full matrix distributed on many processors
Definition cp_fm_types.F:15
subroutine, public cp_fm_create(matrix, matrix_struct, name, nrow, ncol, set_zero)
creates a new full matrix with the given structure
various routines to log and control the output. The idea is that decisions about where to log should ...
subroutine, public cp_rm_default_logger()
the cousin of cp_add_default_logger, decrements the stack, so that the default logger is what it has ...
subroutine, public cp_logger_release(logger)
releases this logger
subroutine, public cp_add_default_logger(logger)
adds a default logger. MUST be called before logging occours
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)
...
integer, parameter, public cp_p_file
subroutine, public cp_iterate(iteration_info, last, iter_nr, increment, iter_nr_out)
adds one to the actual iteration
subroutine, public cp_rm_iter_level(iteration_info, level_name, n_rlevel_att)
Removes an iteration level.
integer function, public cp_print_key_should_output(iteration_info, basis_section, print_key_path, used_print_key, first_time)
returns what should be done with the given property if btest(res,cp_p_store) then the property should...
subroutine, public cp_add_iter_level(iteration_info, level_name, n_rlevel_new)
Adds an iteration level.
set of type/routines to handle the storage of results in force_envs
logical function, public test_for_result(results, description)
test for a certain result in the result_list
set of type/routines to handle the storage of results in force_envs
Types needed for a for a Energy Correction.
collects all constants needed in input so that they can be used without circular dependencies
integer, parameter, public broyden_type_2_explicit_ls
integer, parameter, public broyden_type_1_explicit
integer, parameter, public broyden_type_2_ls
integer, parameter, public broyden_type_1
integer, parameter, public outer_scf_optimizer_broyden
integer, parameter, public broyden_type_1_explicit_ls
integer, parameter, public broyden_type_2_explicit
integer, parameter, public history_guess
integer, parameter, public broyden_type_2
integer, parameter, public cdft2ot
integer, parameter, public tblite_scc_mixer_tblite
integer, parameter, public outer_scf_becke_constraint
integer, parameter, public ot_precond_full_single
integer, parameter, public outer_scf_hirshfeld_constraint
integer, parameter, public ot_precond_none
integer, parameter, public ot_precond_full_single_inverse
integer, parameter, public outer_scf_optimizer_newton_ls
integer, parameter, public broyden_type_1_ls
integer, parameter, public ot_precond_s_inverse
integer, parameter, public ot_precond_full_all
integer, parameter, public ot2cdft
objects that represent the structure of input sections and the data contained in an input section
recursive type(section_vals_type) function, pointer, public section_vals_get_subs_vals(section_vals, subsection_name, i_rep_section, can_return_null)
returns the values of the requested subsection
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
integer, parameter, public default_path_length
Definition kinds.F:58
Restart file for k point calculations.
Definition kpoint_io.F:13
subroutine, public write_kpoints_restart(denmat, kpoints, scf_env, dft_section, particle_set, qs_kind_set)
...
Definition kpoint_io.F:77
Types and basic routines needed for a kpoint calculation.
Machine interface based on Fortran 2003 and POSIX.
Definition machine.F:17
subroutine, public m_flush(lunit)
flushes units if the &GLOBAL flag is set accordingly
Definition machine.F:124
real(kind=dp) function, public m_walltime()
returns time from a real-time clock, protected against rolling early/easily
Definition machine.F:141
Collection of simple mathematical functions and subroutines.
Definition mathlib.F:15
Interface to the message passing library MPI.
Define the data structure for the particle information.
Definition of physical constants:
Definition physcon.F:68
real(kind=dp), parameter, public evolt
Definition physcon.F:183
computes preconditioners, and implements methods to apply them currently used in qs_ot
subroutine, public restart_preconditioner(qs_env, preconditioner, prec_type, nspins)
Allows for a restart of the preconditioner depending on the method it purges all arrays or keeps them...
subroutine, public prepare_preconditioner(qs_env, mos, matrix_ks, matrix_s, ot_preconditioner, prec_type, solver_type, energy_gap, nspins, has_unit_metric, convert_to_dbcsr, chol_type, full_mo_set)
...
container for various plainwaves related things
subroutine, public pw_env_get(pw_env, pw_pools, cube_info, gridlevel_info, auxbas_pw_pool, auxbas_grid, auxbas_rs_desc, auxbas_rs_grid, rs_descs, rs_grids, xc_pw_pool, vdw_pw_pool, poisson_env, interp_section)
returns the various attributes of the pw env
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
module that contains the algorithms to perform an iterative diagonalization by the block-Davidson app...
subroutine, public block_davidson_deallocate(bdav_env)
...
Auxiliary routines for performing a constrained DFT SCF run with Quickstep.
subroutine, public prepare_jacobian_stencil(qs_env, output_unit, nwork, pwork, coeff, step_multiplier, dh)
Prepares the finite difference stencil for computing the Jacobian. The constraints are re-evaluated b...
subroutine, public build_diagonal_jacobian(qs_env, used_history)
Builds a strictly diagonal inverse Jacobian from MD/SCF history.
subroutine, public print_inverse_jacobian(logger, inv_jacobian, iter_count)
Prints the finite difference inverse Jacobian to file.
subroutine, public create_tmp_logger(para_env, project_name, suffix, output_unit, tmp_logger)
Creates a temporary logger for redirecting output to a new file.
subroutine, public restart_inverse_jacobian(qs_env)
Restarts the finite difference inverse Jacobian.
subroutine, public initialize_inverse_jacobian(scf_control, scf_env, explicit_jacobian, should_build, used_history)
Checks if the inverse Jacobian should be calculated and initializes the calculation.
Defines CDFT control structures.
real(kind=dp) function, public charge_mixing_scc_error(mixing_store, eps_scf)
Return the CP2K-side tblite SCC-mixer residual on the CP2K EPS_SCF scale.
container for information about total charges on the grids
collects routines that calculate density matrices
module that contains the definitions of the scf types
integer, parameter, public gspace_mixing_nr
Apply the direct inversion in the iterative subspace (DIIS) of Pulay in the framework of an SCF itera...
Definition qs_diis.F:21
pure subroutine, public qs_diis_b_clear(diis_buffer)
clears the buffer
Definition qs_diis.F:519
subroutine, public qs_diis_b_create(diis_buffer, nbuffer)
Allocates an SCF DIIS buffer.
Definition qs_diis.F:103
subroutine, public qs_diis_b_create_kp(diis_buffer, nbuffer)
Allocates an SCF DIIS buffer for k-points.
Definition qs_diis.F:867
pure subroutine, public qs_diis_b_clear_kp(diis_buffer)
clears the buffer
Definition qs_diis.F:975
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 set_qs_env(qs_env, super_cell, mos, qmmm, qmmm_periodic, mimic, ewald_env, ewald_pw, mpools, rho_external, external_vxc, mask, scf_control, rel_control, qs_charges, ks_env, ks_qmmm_env, wf_history, scf_env, active_space, input, oce, rho_atom_set, rho0_atom_set, rho0_mpole, run_rtp, rtp, rhoz_set, rhoz_tot, ecoul_1c, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, efield, rhoz_cneo_set, linres_control, xas_env, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, ls_scf_env, do_transport, transport_env, lri_env, lri_density, exstate_env, ec_env, dispersion_env, harris_env, gcp_env, mp2_env, bs_env, kg_env, force, kpoints, wanniercentres, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs, do_rixs, tb_tblite)
Set the QUICKSTEP environment.
Integrate single or product functions over a potential on a RS grid.
Define the quickstep kind type and their sub types.
routines that build the Kohn-Sham matrix (i.e calculate the coulomb and xc parts
subroutine, public evaluate_core_matrix_traces(qs_env, rho_ao_ext)
Calculates the traces of the core matrices and the density matrix.
subroutine, public qs_ks_update_qs_env(qs_env, calculate_forces, just_energy, print_active)
updates the Kohn Sham matrix of the given qs_env (facility 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 get_ks_env(ks_env, v_hartree_rspace, s_mstruct_changed, rho_changed, exc_accint, potential_changed, forces_up_to_date, complex_ks, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, kinetic, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_ks_im_kp, rho, rho_xc, vppl, xcint_weights, rho_core, rho_nlcc, rho_nlcc_g, vee, neighbor_list_id, sab_orb, sab_all, sac_ae, sac_ppl, sac_lri, sap_ppnl, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_vdw, sab_scp, sab_almo, sab_kp, sab_kp_nosym, sab_cneo, task_list, task_list_soft, kpoints, do_kpoints, atomic_kind_set, qs_kind_set, cell, cell_ref, use_ref_cell, particle_set, energy, force, local_particles, local_molecules, molecule_kind_set, molecule_set, subsys, cp_subsys, virial, results, atprop, nkind, natom, dft_control, dbcsr_dist, distribution_2d, pw_env, para_env, blacs_env, nelectron_total, nelectron_spin)
...
Definition and initialisation of the mo data type.
Definition qs_mo_io.F:21
subroutine, public write_mo_set_to_restart(mo_array, particle_set, dft_section, qs_kind_set, matrix_ks)
...
Definition qs_mo_io.F:117
collects routines that perform operations directly related to MOs
subroutine, public make_basis_simple(vmatrix, ncol)
given a set of vectors, return an orthogonal (C^T C == 1) set spanning the same space (notice,...
subroutine, public make_basis_sm(vmatrix, ncol, matrix_s)
returns an S-orthonormal basis v (v^T S v ==1)
Set occupation of molecular orbitals.
Definition and initialisation of the mo data type.
Definition qs_mo_types.F:22
subroutine, public duplicate_mo_set(mo_set_new, mo_set_old)
allocate a new mo_set, and copy the old data
subroutine, public deallocate_mo_set(mo_set)
Deallocate a wavefunction data structure.
subroutine, public get_mo_set(mo_set, maxocc, homo, lfomo, nao, nelectron, n_el_f, nmo, eigenvalues, occupation_numbers, mo_coeff, mo_coeff_b, uniform_occupation, kts, mu, flexible_electron_count)
Get the components of a MO set data structure.
subroutine, public reassign_allocated_mos(mo_set_new, mo_set_old)
reassign an already allocated mo_set
basic functionality for using ot in the scf routines.
Definition qs_ot_scf.F:14
subroutine, public ot_scf_read_input(qs_ot_env, scf_section)
...
Definition qs_ot_scf.F:71
subroutine, public ot_scf_init(mo_array, matrix_s, qs_ot_env, matrix_ks, broyden_adaptive_sigma)
initialises qs_ot_env so that mo_coeff is the current point and that the minization can be started.
Definition qs_ot_scf.F:349
orbital transformations
Definition qs_ot.F:15
subroutine, public qs_ot_new_preconditioner(qs_ot_env, preconditioner)
gets ready to use the preconditioner/ or renew the preconditioner only keeps a pointer to the precond...
Definition qs_ot.F:73
Routines for performing an outer scf loop.
subroutine, public outer_loop_purge_history(qs_env)
purges outer_scf_history zeroing everything except the latest value of the outer_scf variable stored ...
subroutine, public outer_loop_switch(scf_env, scf_control, cdft_control, dir)
switch between two outer_scf envs stored in cdft_control
subroutine, public outer_loop_optimize(scf_env, scf_control)
optimizes the parameters of the outer_scf
subroutine, public outer_loop_update_qs_env(qs_env, scf_env)
propagates the updated variables to wherever they need to be set in qs_env
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...
Utility routines for qs_scf.
subroutine, public qs_scf_env_initialize(qs_env, scf_env, scf_control, scf_section)
initializes input parameters if needed or restores values from previous runs to fill scf_env with the...
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
subroutine, public qs_scf_loop_print(qs_env, scf_env, para_env)
collects the 'heavy duty' printing tasks out of the SCF loop
subroutine, public qs_scf_outer_loop_info(output_unit, scf_control, scf_env, energy, total_steps, should_stop, outer_loop_converged)
writes basic information obtained in a scf outer loop step
subroutine, public qs_scf_write_mos(qs_env, scf_env, final_mos)
Write the MO eigenvector, eigenvalues, and occupation numbers to the output unit.
subroutine, public qs_scf_loop_info(scf_env, output_unit, just_energy, t1, t2, energy)
writes basic information obtained in a scf step
subroutine, public qs_scf_cdft_info(output_unit, scf_control, scf_env, cdft_control, energy, total_steps, should_stop, outer_loop_converged, cdft_loop)
writes CDFT constraint information and optionally CDFT scf loop info
subroutine, public qs_scf_cdft_initial_info(output_unit, cdft_control)
writes information about the CDFT env
subroutine, public qs_scf_gce_info(output_unit, qs_env, just_energy)
Print grand canonical SCF information for the current SCF iteration.
Utility routines for qs_scf.
subroutine, public qs_scf_compute_properties(qs_env, wf_type, do_mp2)
computes properties for a given hamilonian using the current wfn
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
Routines for the Quickstep SCF run.
Definition qs_scf.F:47
subroutine, public init_scf_loop(scf_env, qs_env, scf_section)
inits those objects needed if you want to restart the scf with, say only a new initial guess,...
Definition qs_scf.F:741
subroutine, public scf(qs_env, has_converged, total_scf_steps)
perform an scf procedure in the given qs_env
Definition qs_scf.F:208
subroutine, public scf_env_cleanup(scf_env)
perform cleanup operations (like releasing temporary storage) at the end of the scf
Definition qs_scf.F:1023
subroutine, public scf_env_do_scf(scf_env, scf_control, qs_env, converged, should_stop, total_scf_steps)
perform an scf loop
Definition qs_scf.F:352
subroutine, public cdft_scf(qs_env, should_stop)
perform a CDFT scf procedure in the given qs_env
Definition qs_scf.F:1137
Storage of past states of the qs_env. Methods to interpolate (or actually normally extrapolate) the n...
subroutine, public wfi_purge_history(qs_env)
purges wf_history retaining only the latest snapshot
subroutine, public wfi_update(wf_history, qs_env, dt)
updates the snapshot buffer, taking a new snapshot
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.
subroutine, public run_smeagol_bulktrans(qs_env)
Save overlap, Kohn-Sham, electron density, and energy-density matrices of semi-infinite electrodes in...
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.
subroutine, public tb_update_charges(qs_env, dft_control, tb, calculate_forces, use_rho)
...
subroutine, public tb_get_energy(qs_env, tb, energy)
...
real(kind=dp) function, public tb_scf_mixer_error(dft_control, tb, eps_scf)
Return the native tblite SCC mixer residual on the CP2K iter_delta scale.
Provides all information about an atomic kind.
represent a full matrix
type of a logger, at the moment it contains just a print level starting at which level it should be l...
contains arbitrary information which need to be stored
Contains information on the energy correction functional for KG.
Contains information about kpoints.
stores all the informations relevant to an mpi environment
contained for different pw related things
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
Container for information about total charges on the grids.
Provides all information about a quickstep kind.
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.