(git:4cf809f)
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,&
102 USE pw_env_types, ONLY: pw_env_get,&
104 USE pw_pool_types, ONLY: pw_pool_type
117 USE qs_diis, ONLY: qs_diis_b_clear,&
125 USE qs_integrate_potential, ONLY: integrate_v_rspace
126 USE qs_kind_types, ONLY: qs_kind_type
129 USE qs_ks_types, ONLY: get_ks_env,&
136 USE qs_mo_types, ONLY: deallocate_mo_set,&
138 get_mo_set,&
142 USE qs_ot_scf, ONLY: ot_scf_init,&
150 USE qs_rho_types, ONLY: qs_rho_get,&
168 USE qs_scf_types, ONLY: &
181#include "./base/base_uses.f90"
182
183 IMPLICIT NONE
184
185 PRIVATE
186
187 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_scf'
188 LOGICAL, PRIVATE :: reuse_precond = .false.
189 LOGICAL, PRIVATE :: used_history = .false.
190
192
193CONTAINS
194
195! **************************************************************************************************
196!> \brief perform an scf procedure in the given qs_env
197!> \param qs_env the qs_environment where to perform the scf procedure
198!> \param has_converged ...
199!> \param total_scf_steps ...
200!> \par History
201!> 02.2003 introduced scf_env, moved real work to scf_env_do_scf [fawzi]
202!> \author fawzi
203!> \note
204! **************************************************************************************************
205 SUBROUTINE scf(qs_env, has_converged, total_scf_steps)
206 TYPE(qs_environment_type), POINTER :: qs_env
207 LOGICAL, INTENT(OUT), OPTIONAL :: has_converged
208 INTEGER, INTENT(OUT), OPTIONAL :: total_scf_steps
209
210 INTEGER :: ihistory, max_scf_tmp, tsteps
211 LOGICAL :: converged, outer_scf_loop, should_stop
212 LOGICAL, SAVE :: first_step_flag = .true.
213 REAL(kind=dp), DIMENSION(:, :), POINTER :: gradient_history, variable_history
214 TYPE(cp_logger_type), POINTER :: logger
215 TYPE(dft_control_type), POINTER :: dft_control
216 TYPE(qs_scf_env_type), POINTER :: scf_env
217 TYPE(scf_control_type), POINTER :: scf_control
218 TYPE(section_vals_type), POINTER :: dft_section, input, scf_section
219
220 NULLIFY (scf_env)
221 logger => cp_get_default_logger()
222 cpassert(ASSOCIATED(qs_env))
223 IF (PRESENT(has_converged)) THEN
224 has_converged = .false.
225 END IF
226 IF (PRESENT(total_scf_steps)) THEN
227 total_scf_steps = 0
228 END IF
229 CALL get_qs_env(qs_env, scf_env=scf_env, input=input, &
230 dft_control=dft_control, scf_control=scf_control)
231 IF (scf_control%max_scf > 0) THEN
232
233 dft_section => section_vals_get_subs_vals(input, "DFT")
234 scf_section => section_vals_get_subs_vals(dft_section, "SCF")
235
236 IF (.NOT. ASSOCIATED(scf_env)) THEN
237 CALL qs_scf_env_initialize(qs_env, scf_env)
238 ! Moved here from qs_scf_env_initialize to be able to have more scf_env
239 CALL set_qs_env(qs_env, scf_env=scf_env)
240 ELSE
241 CALL qs_scf_env_initialize(qs_env, scf_env)
242 END IF
243
244 IF ((scf_control%density_guess == history_guess) .AND. (first_step_flag)) THEN
245 max_scf_tmp = scf_control%max_scf
246 scf_control%max_scf = 1
247 outer_scf_loop = scf_control%outer_scf%have_scf
248 scf_control%outer_scf%have_scf = .false.
249 END IF
250
251 IF (.NOT. dft_control%qs_control%cdft) THEN
252 CALL scf_env_do_scf(scf_env=scf_env, scf_control=scf_control, qs_env=qs_env, &
253 converged=converged, should_stop=should_stop, total_scf_steps=tsteps)
254 ELSE
255 ! Third SCF loop needed for CDFT with OT to properly restart OT inner loop
256 CALL cdft_scf(qs_env=qs_env, should_stop=should_stop)
257 END IF
258
259 ! If SCF has not converged, then we should not start MP2
260 IF (ASSOCIATED(qs_env%mp2_env)) qs_env%mp2_env%hf_fail = .NOT. converged
261
262 ! Add the converged outer_scf SCF gradient(s)/variable(s) to history
263 IF (scf_control%outer_scf%have_scf) THEN
264 ihistory = scf_env%outer_scf%iter_count
265 CALL get_qs_env(qs_env, gradient_history=gradient_history, &
266 variable_history=variable_history)
267 ! We only store the latest two values
268 gradient_history(:, 1) = gradient_history(:, 2)
269 gradient_history(:, 2) = scf_env%outer_scf%gradient(:, ihistory)
270 variable_history(:, 1) = variable_history(:, 2)
271 variable_history(:, 2) = scf_env%outer_scf%variables(:, ihistory)
272 ! Reset flag
273 IF (used_history) used_history = .false.
274 ! Update a counter and check if the Jacobian should be deallocated
275 IF (ASSOCIATED(scf_env%outer_scf%inv_jacobian)) THEN
276 scf_control%outer_scf%cdft_opt_control%ijacobian(2) = scf_control%outer_scf%cdft_opt_control%ijacobian(2) + 1
277 IF (scf_control%outer_scf%cdft_opt_control%ijacobian(2) >= &
278 scf_control%outer_scf%cdft_opt_control%jacobian_freq(2) .AND. &
279 scf_control%outer_scf%cdft_opt_control%jacobian_freq(2) > 0) &
280 scf_env%outer_scf%deallocate_jacobian = .true.
281 END IF
282 END IF
283 ! *** add the converged wavefunction to the wavefunction history
284 IF ((ASSOCIATED(qs_env%wf_history)) .AND. &
285 ((scf_control%density_guess /= history_guess) .OR. &
286 (.NOT. first_step_flag))) THEN
287 IF (.NOT. dft_control%qs_control%cdft) THEN
288 CALL wfi_update(qs_env%wf_history, qs_env=qs_env, dt=1.0_dp)
289 ELSE
290 IF (dft_control%qs_control%cdft_control%should_purge) THEN
291 CALL wfi_purge_history(qs_env)
292 CALL outer_loop_purge_history(qs_env)
293 dft_control%qs_control%cdft_control%should_purge = .false.
294 ELSE
295 CALL wfi_update(qs_env%wf_history, qs_env=qs_env, dt=1.0_dp)
296 END IF
297 END IF
298 ELSE IF ((scf_control%density_guess == history_guess) .AND. &
299 (first_step_flag)) THEN
300 scf_control%max_scf = max_scf_tmp
301 scf_control%outer_scf%have_scf = outer_scf_loop
302 first_step_flag = .false.
303 END IF
304
305 ! *** compute properties that depend on the converged wavefunction
306 IF (.NOT. (should_stop)) CALL qs_scf_compute_properties(qs_env)
307
308 ! *** SMEAGOL interface ***
309 IF (.NOT. (should_stop)) THEN
310 ! compute properties that depend on the converged wavefunction ..
311 CALL run_smeagol_emtrans(qs_env, last=.true., iter=0)
312 ! .. or save matrices related to bulk leads
313 CALL run_smeagol_bulktrans(qs_env)
314 END IF
315
316 ! *** cleanup
317 CALL scf_env_cleanup(scf_env)
318 IF (dft_control%qs_control%cdft) &
319 CALL cdft_control_cleanup(dft_control%qs_control%cdft_control)
320
321 IF (PRESENT(has_converged)) THEN
322 has_converged = converged
323 END IF
324 IF (PRESENT(total_scf_steps)) THEN
325 total_scf_steps = tsteps
326 END IF
327
328 END IF
329
330 END SUBROUTINE scf
331
332! **************************************************************************************************
333!> \brief perform an scf loop
334!> \param scf_env the scf_env where to perform the scf procedure
335!> \param scf_control ...
336!> \param qs_env the qs_env, the scf_env lives in
337!> \param converged will be true / false if converged is reached
338!> \param should_stop ...
339!> \param total_scf_steps ...
340!> \par History
341!> long history, see cvs and qs_scf module history
342!> 02.2003 introduced scf_env [fawzi]
343!> 09.2005 Frozen density approximation [TdK]
344!> 06.2007 Check for SCF iteration count early [jgh]
345!> 10.2019 switch_surf_dip [SGh]
346!> \author Matthias Krack
347!> \note
348! **************************************************************************************************
349 SUBROUTINE scf_env_do_scf(scf_env, scf_control, qs_env, converged, should_stop, total_scf_steps)
350
351 TYPE(qs_scf_env_type), POINTER :: scf_env
352 TYPE(scf_control_type), POINTER :: scf_control
353 TYPE(qs_environment_type), POINTER :: qs_env
354 LOGICAL, INTENT(OUT) :: converged, should_stop
355 INTEGER, INTENT(OUT) :: total_scf_steps
356
357 CHARACTER(LEN=*), PARAMETER :: routinen = 'scf_env_do_scf'
358
359 CHARACTER(LEN=default_string_length) :: description, name
360 INTEGER :: ext_master_id, handle, handle2, i_tmp, &
361 ic, ispin, iter_count, output_unit, &
362 scf_energy_message_tag, total_steps
363 LOGICAL :: density_full_step, diis_step, do_kpoints, energy_only, exit_inner_loop, &
364 exit_outer_loop, inner_loop_converged, internal_tblite_density_full_step, &
365 internal_tblite_mixer, just_energy, outer_loop_converged, tblite_native_mixer
366 REAL(kind=dp) :: t1, t2
367 REAL(kind=dp), DIMENSION(3) :: res_val_3
368 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
369 TYPE(cp_logger_type), POINTER :: logger
370 TYPE(cp_result_type), POINTER :: results
371 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_ks
372 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: rho_ao_kp
373 TYPE(dft_control_type), POINTER :: dft_control
374 TYPE(energy_correction_type), POINTER :: ec_env
375 TYPE(kpoint_type), POINTER :: kpoints
376 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos, mos_last_converged
377 TYPE(mp_comm_type) :: external_comm
378 TYPE(mp_para_env_type), POINTER :: para_env
379 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
380 TYPE(pw_env_type), POINTER :: pw_env
381 TYPE(qs_charges_type), POINTER :: qs_charges
382 TYPE(qs_energy_type), POINTER :: energy
383 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
384 TYPE(qs_ks_env_type), POINTER :: ks_env
385 TYPE(qs_rho_type), POINTER :: rho
386 TYPE(section_vals_type), POINTER :: dft_section, input, scf_section
387
388 CALL timeset(routinen, handle)
389
390 NULLIFY (dft_control, rho, energy, &
391 logger, qs_charges, ks_env, mos, atomic_kind_set, qs_kind_set, &
392 particle_set, dft_section, input, &
393 scf_section, para_env, results, kpoints, pw_env, rho_ao_kp, mos_last_converged)
394
395 cpassert(ASSOCIATED(scf_env))
396 cpassert(ASSOCIATED(qs_env))
397
398 logger => cp_get_default_logger()
399 t1 = m_walltime()
400
401 CALL get_qs_env(qs_env=qs_env, &
402 energy=energy, &
403 particle_set=particle_set, &
404 qs_charges=qs_charges, &
405 ks_env=ks_env, &
406 atomic_kind_set=atomic_kind_set, &
407 qs_kind_set=qs_kind_set, &
408 rho=rho, &
409 mos=mos, &
410 input=input, &
411 dft_control=dft_control, &
412 do_kpoints=do_kpoints, &
413 kpoints=kpoints, &
414 results=results, &
415 pw_env=pw_env, &
416 para_env=para_env)
417 tblite_native_mixer = dft_control%qs_control%xtb_control%do_tblite .AND. &
418 scf_env%method /= ot_method_nr .AND. &
419 tb_native_scc_mixer_active(dft_control)
420 internal_tblite_mixer = (dft_control%qs_control%dftb .AND. &
421 dft_control%qs_control%dftb_control%tblite_scc_mixer == tblite_scc_mixer_tblite) .OR. &
422 (dft_control%qs_control%xtb .AND. &
423 .NOT. dft_control%qs_control%xtb_control%do_tblite .AND. &
424 dft_control%qs_control%xtb_control%tblite_scc_mixer == tblite_scc_mixer_tblite)
425 internal_tblite_density_full_step = dft_control%qs_control%xtb .AND. &
426 .NOT. dft_control%qs_control%xtb_control%do_tblite .AND. &
427 dft_control%qs_control%xtb_control%tblite_scc_mixer == tblite_scc_mixer_tblite
428
429 CALL qs_rho_get(rho, rho_ao_kp=rho_ao_kp)
430
431 dft_section => section_vals_get_subs_vals(input, "DFT")
432 scf_section => section_vals_get_subs_vals(dft_section, "SCF")
433
434 output_unit = cp_print_key_unit_nr(logger, scf_section, "PRINT%PROGRAM_RUN_INFO", &
435 extension=".scfLog")
436
437 IF (output_unit > 0) WRITE (unit=output_unit, fmt="(/,/,T2,A)") &
438 "SCF WAVEFUNCTION OPTIMIZATION"
439
440 ! when switch_surf_dip is switched on, indicate storing mos from the last converged step
441 IF (dft_control%switch_surf_dip) THEN
442 CALL get_qs_env(qs_env, mos_last_converged=mos_last_converged)
443 DO ispin = 1, dft_control%nspins
444 CALL reassign_allocated_mos(mos(ispin), mos_last_converged(ispin))
445 END DO
446 IF (output_unit > 0) WRITE (unit=output_unit, fmt="(/,/,T2,A)") &
447 "COPIED mos_last_converged ---> mos"
448 END IF
449
450 IF ((output_unit > 0) .AND. (.NOT. scf_control%use_ot)) THEN
451 WRITE (unit=output_unit, &
452 fmt="(/,T3,A,T12,A,T31,A,T39,A,T59,A,T75,A,/,T3,A)") &
453 "Step", "Update method", "Time", "Convergence", "Total energy", "Change", &
454 repeat("-", 78)
455 END IF
456 CALL cp_add_iter_level(logger%iter_info, "QS_SCF")
457
458 ! check for external communicator and if the intermediate energy should be sent
459 res_val_3(:) = -1.0_dp
460 description = "[EXT_SCF_ENER_COMM]"
461 IF (test_for_result(results, description=description)) THEN
462 CALL get_results(results, description=description, &
463 values=res_val_3, n_entries=i_tmp)
464 cpassert(i_tmp == 3)
465 IF (all(res_val_3(:) <= 0.0)) &
466 CALL cp_abort(__location__, &
467 " Trying to access result ("//trim(description)// &
468 ") which is not correctly stored.")
469 CALL external_comm%set_handle(nint(res_val_3(1)))
470 END IF
471 ext_master_id = nint(res_val_3(2))
472 scf_energy_message_tag = nint(res_val_3(3))
473
474 ! *** outer loop of the scf, can treat other variables,
475 ! *** such as lagrangian multipliers
476 scf_env%outer_scf%iter_count = 0
477 iter_count = 0
478 total_steps = 0
479 energy%tot_old = 0.0_dp
480
481 scf_outer_loop: DO
482
483 CALL init_scf_loop(scf_env=scf_env, qs_env=qs_env, &
484 scf_section=scf_section)
485
486 CALL qs_scf_set_loop_flags(scf_env, diis_step, &
487 energy_only, just_energy, exit_inner_loop)
488
489 ! decide whether to switch off dipole correction for convergence purposes
490 dft_control%surf_dip_correct_switch = dft_control%correct_surf_dip
491 IF ((dft_control%correct_surf_dip) .AND. (scf_control%outer_scf%have_scf) .AND. &
492 (scf_env%outer_scf%iter_count > floor(scf_control%outer_scf%max_scf/2.0_dp))) THEN
493 IF (dft_control%switch_surf_dip) THEN
494 dft_control%surf_dip_correct_switch = .false.
495 IF (output_unit > 0) WRITE (unit=output_unit, fmt="(/,/,T2,A)") &
496 "SURFACE DIPOLE CORRECTION switched off"
497 END IF
498 END IF
499
500 scf_loop: DO
501
502 CALL timeset(routinen//"_inner_loop", handle2)
503
504 IF (.NOT. just_energy) scf_env%iter_count = scf_env%iter_count + 1
505 iter_count = iter_count + 1
506 CALL cp_iterate(logger%iter_info, last=.false., iter_nr=iter_count)
507
508 IF (output_unit > 0) CALL m_flush(output_unit)
509
510 total_steps = total_steps + 1
511 just_energy = energy_only
512
513 CALL qs_ks_update_qs_env(qs_env, just_energy=just_energy, &
514 calculate_forces=.false.)
515
516 ! print 'heavy weight' or relatively expensive quantities
517 CALL qs_scf_loop_print(qs_env, scf_env, para_env)
518
519 IF (do_kpoints) THEN
520 ! kpoints
521 IF (dft_control%hairy_probes .EQV. .true.) THEN
522 scf_control%smear%do_smear = .false.
523 CALL qs_scf_new_mos_kp(qs_env, scf_env, scf_control, diis_step, dft_control%probe)
524 ELSE
525 CALL qs_scf_new_mos_kp(qs_env, scf_env, scf_control, diis_step)
526 END IF
527 ELSE
528 ! Gamma points only
529 IF (dft_control%hairy_probes .EQV. .true.) THEN
530 scf_control%smear%do_smear = .false.
531 CALL qs_scf_new_mos(qs_env, scf_env, scf_control, scf_section, diis_step, energy_only, &
532 dft_control%probe)
533 ELSE
534 CALL qs_scf_new_mos(qs_env, scf_env, scf_control, scf_section, diis_step, energy_only)
535 END IF
536 END IF
537
538 ! Print requested MO information (can be computationally expensive with OT)
539 CALL qs_scf_write_mos(qs_env, scf_env, final_mos=.false.)
540
541 IF (dft_control%qs_control%xtb_control%do_tblite) THEN
542 IF (scf_env%method == ot_method_nr) THEN
543 CALL tb_update_charges(qs_env, dft_control, qs_env%tb_tblite, .false., .true.)
544 CALL evaluate_core_matrix_traces(qs_env)
545 ELSE
546 cpassert(scf_env%mixing_method > 0)
547 CALL tb_update_charges(qs_env, dft_control, qs_env%tb_tblite, .false., .false.)
548 CALL evaluate_core_matrix_traces(qs_env, rho_ao_ext=scf_env%p_mix_new)
549 END IF
550 CALL tb_get_energy(qs_env, qs_env%tb_tblite, energy)
551 END IF
552
553 density_full_step = diis_step .OR. tblite_native_mixer .OR. internal_tblite_density_full_step
554 CALL qs_scf_density_mixing(scf_env, rho, para_env, density_full_step)
555 IF (dft_control%qs_control%xtb_control%do_tblite .AND. &
556 .NOT. (dft_control%qs_control%do_ls_scf .OR. scf_control%use_ot)) THEN
557 scf_env%iter_delta = max(scf_env%iter_delta, &
558 tb_scf_mixer_error(dft_control, qs_env%tb_tblite, &
559 scf_control%eps_scf))
560 END IF
561 IF (dft_control%qs_control%dftb .OR. &
562 (dft_control%qs_control%xtb .AND. .NOT. dft_control%qs_control%xtb_control%do_tblite)) THEN
563 scf_env%iter_delta = max(scf_env%iter_delta, &
564 charge_mixing_scc_error(scf_env%mixing_store, scf_control%eps_scf))
565 END IF
566 IF (tblite_native_mixer) THEN
567 scf_env%iter_param = dft_control%qs_control%xtb_control%tblite_mixer_damping
568 scf_env%iter_method = "TBLite/Diag"
569 ELSEIF (internal_tblite_mixer) THEN
570 scf_env%iter_method = "TBLite/Diag"
571 IF (dft_control%qs_control%dftb) THEN
572 scf_env%iter_param = dft_control%qs_control%dftb_control%tblite_mixer_damping
573 ELSE
574 scf_env%iter_param = dft_control%qs_control%xtb_control%tblite_mixer_damping
575 END IF
576 END IF
577
578 t2 = m_walltime()
579
580 CALL qs_scf_loop_info(scf_env, output_unit, just_energy, t1, t2, energy)
581
582 IF (.NOT. just_energy) energy%tot_old = energy%total
583
584 ! check for external communicator and if the intermediate energy should be sent
585 IF (scf_energy_message_tag > 0) THEN
586 CALL external_comm%send(energy%total, ext_master_id, scf_energy_message_tag)
587 END IF
588
589 CALL qs_scf_check_inner_exit(qs_env, scf_env, scf_control, should_stop, just_energy, &
590 exit_inner_loop, inner_loop_converged, output_unit)
591
592 ! In case we decide to exit we perform few more check to see if this one
593 ! is really the last SCF step
594 IF (exit_inner_loop) THEN
595
596 CALL qs_scf_inner_finalize(scf_env, qs_env, density_full_step, output_unit)
597
598 CALL qs_scf_check_outer_exit(qs_env, scf_env, scf_control, should_stop, &
599 outer_loop_converged, exit_outer_loop)
600
601 ! Let's tag the last SCF cycle so we can print informations only of the last step
602 IF (exit_outer_loop) CALL cp_iterate(logger%iter_info, last=.true., iter_nr=iter_count)
603
604 END IF
605
606 IF (do_kpoints) THEN
607 CALL write_kpoints_restart(rho_ao_kp, kpoints, scf_env, dft_section, particle_set, qs_kind_set)
608 ELSE
609 ! Write wavefunction restart file
610 IF (scf_env%method == ot_method_nr) THEN
611 ! With OT: provide the Kohn-Sham matrix for the calculation of the MO eigenvalues
612 CALL get_ks_env(ks_env=ks_env, matrix_ks=matrix_ks)
613 CALL write_mo_set_to_restart(mos, particle_set, dft_section=dft_section, qs_kind_set=qs_kind_set, &
614 matrix_ks=matrix_ks)
615 ELSE
616 CALL write_mo_set_to_restart(mos, particle_set, dft_section=dft_section, qs_kind_set=qs_kind_set)
617 END IF
618
619 END IF
620
621 ! Exit if we have finished with the SCF inner loop
622 IF (exit_inner_loop) THEN
623 CALL timestop(handle2)
624 EXIT scf_loop
625 END IF
626
627 IF (.NOT. btest(cp_print_key_should_output(logger%iter_info, &
628 scf_section, "PRINT%ITERATION_INFO/TIME_CUMUL"), cp_p_file)) &
629 t1 = m_walltime()
630
631 ! mixing methods have the new density matrix in p_mix_new
632 IF (scf_env%mixing_method > 0) THEN
633 DO ic = 1, SIZE(rho_ao_kp, 2)
634 DO ispin = 1, dft_control%nspins
635 CALL dbcsr_get_info(rho_ao_kp(ispin, ic)%matrix, name=name) ! keep the name
636 CALL dbcsr_copy(rho_ao_kp(ispin, ic)%matrix, scf_env%p_mix_new(ispin, ic)%matrix, name=name)
637 END DO
638 END DO
639 END IF
640
641 CALL qs_scf_rho_update(rho, qs_env, scf_env, ks_env, &
642 mix_rho=scf_env%mixing_method >= gspace_mixing_nr)
643
644 CALL timestop(handle2)
645
646 END DO scf_loop
647
648 IF (.NOT. scf_control%outer_scf%have_scf) EXIT scf_outer_loop
649
650 ! In case we use the OUTER SCF loop let's print some info..
651 CALL qs_scf_outer_loop_info(output_unit, scf_control, scf_env, &
652 energy, total_steps, should_stop, outer_loop_converged)
653
654 ! Save MOs to converged MOs if outer_loop_converged and surf_dip_correct_switch is true
655 IF (exit_outer_loop) THEN
656 IF ((dft_control%switch_surf_dip) .AND. (outer_loop_converged) .AND. &
657 (dft_control%surf_dip_correct_switch)) THEN
658 DO ispin = 1, dft_control%nspins
659 CALL reassign_allocated_mos(mos_last_converged(ispin), mos(ispin))
660 END DO
661 IF (output_unit > 0) WRITE (unit=output_unit, fmt="(/,/,T2,A)") &
662 "COPIED mos ---> mos_last_converged"
663 END IF
664 END IF
665
666 IF (exit_outer_loop) EXIT scf_outer_loop
667
668 !
669 CALL outer_loop_optimize(scf_env, scf_control)
670 CALL outer_loop_update_qs_env(qs_env, scf_env)
671 CALL qs_ks_did_change(ks_env, potential_changed=.true.)
672
673 END DO scf_outer_loop
674
675 converged = inner_loop_converged .AND. outer_loop_converged
676 total_scf_steps = total_steps
677
678 IF (dft_control%qs_control%cdft) &
679 dft_control%qs_control%cdft_control%total_steps = &
680 dft_control%qs_control%cdft_control%total_steps + total_steps
681
682 IF (.NOT. converged) THEN
683 IF (scf_control%ignore_convergence_failure .OR. should_stop) THEN
684 CALL cp_warn(__location__, "SCF run NOT converged")
685 ELSE
686 CALL cp_abort(__location__, &
687 "SCF run NOT converged. To continue the calculation "// &
688 "regardless, please set the keyword IGNORE_CONVERGENCE_FAILURE.")
689 END IF
690 END IF
691
692 ! Skip Harris functional calculation if ground-state is NOT converged
693 IF (qs_env%energy_correction) THEN
694 CALL get_qs_env(qs_env, ec_env=ec_env)
695 ec_env%do_skip = .false.
696 IF (ec_env%skip_ec .AND. .NOT. converged) ec_env%do_skip = .true.
697 END IF
698
699 ! if needed copy mo_coeff dbcsr->fm for later use in post_scf!fm->dbcsr
700 DO ispin = 1, SIZE(mos) !fm -> dbcsr
701 IF (mos(ispin)%use_mo_coeff_b) THEN !fm->dbcsr
702 IF (.NOT. ASSOCIATED(mos(ispin)%mo_coeff_b)) & !fm->dbcsr
703 cpabort("mo_coeff_b is not allocated") !fm->dbcsr
704 CALL copy_dbcsr_to_fm(mos(ispin)%mo_coeff_b, & !fm->dbcsr
705 mos(ispin)%mo_coeff) !fm -> dbcsr
706 END IF !fm->dbcsr
707 END DO !fm -> dbcsr
708
709 CALL cp_rm_iter_level(logger%iter_info, level_name="QS_SCF")
710 CALL timestop(handle)
711
712 END SUBROUTINE scf_env_do_scf
713
714! **************************************************************************************************
715!> \brief inits those objects needed if you want to restart the scf with, say
716!> only a new initial guess, or different density functional or ...
717!> this will happen just before the scf loop starts
718!> \param scf_env ...
719!> \param qs_env ...
720!> \param scf_section ...
721!> \par History
722!> 03.2006 created [Joost VandeVondele]
723! **************************************************************************************************
724 SUBROUTINE init_scf_loop(scf_env, qs_env, scf_section)
725
726 TYPE(qs_scf_env_type), POINTER :: scf_env
727 TYPE(qs_environment_type), POINTER :: qs_env
728 TYPE(section_vals_type), POINTER :: scf_section
729
730 CHARACTER(LEN=*), PARAMETER :: routinen = 'init_scf_loop'
731
732 INTEGER :: handle, ispin, nmo, number_of_ot_envs
733 LOGICAL :: do_kpoints, do_rotation, &
734 has_unit_metric, is_full_all
735 TYPE(cp_fm_type), POINTER :: mo_coeff
736 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_ks, matrix_s
737 TYPE(dbcsr_type), POINTER :: orthogonality_metric
738 TYPE(dft_control_type), POINTER :: dft_control
739 TYPE(kpoint_type), POINTER :: kpoints
740 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
741 TYPE(scf_control_type), POINTER :: scf_control
742
743 CALL timeset(routinen, handle)
744
745 NULLIFY (scf_control, matrix_s, matrix_ks, dft_control, mos, mo_coeff, kpoints)
746
747 cpassert(ASSOCIATED(scf_env))
748 cpassert(ASSOCIATED(qs_env))
749
750 CALL get_qs_env(qs_env=qs_env, &
751 scf_control=scf_control, &
752 dft_control=dft_control, &
753 do_kpoints=do_kpoints, &
754 kpoints=kpoints, &
755 mos=mos)
756
757 ! if using mo_coeff_b then copy to fm
758 DO ispin = 1, SIZE(mos) !fm->dbcsr
759 IF (mos(1)%use_mo_coeff_b) THEN !fm->dbcsr
760 CALL copy_dbcsr_to_fm(mos(ispin)%mo_coeff_b, mos(ispin)%mo_coeff) !fm->dbcsr
761 END IF !fm->dbcsr
762 END DO !fm->dbcsr
763
764 ! this just guarantees that all mo_occupations match the eigenvalues, if smear
765 DO ispin = 1, dft_control%nspins
766 ! do not reset mo_occupations if the maximum overlap method is in use
767 IF (.NOT. scf_control%diagonalization%mom) THEN
768 !if the hair probes section is present, this sends hairy_probes to set_mo_occupation subroutine
769 !and switches off the standard smearing
770 IF (dft_control%hairy_probes .EQV. .true.) THEN
771 IF (scf_env%outer_scf%iter_count > 0) THEN
772 scf_control%smear%do_smear = .false.
773 CALL set_mo_occupation(mo_set=mos(ispin), &
774 smear=scf_control%smear, &
775 probe=dft_control%probe)
776 END IF
777 ELSE
778 CALL set_mo_occupation(mo_set=mos(ispin), &
779 smear=scf_control%smear)
780 END IF
781 END IF
782 END DO
783
784 SELECT CASE (scf_env%method)
785 CASE DEFAULT
786
787 cpabort("Unknown SCF method <"//trim(cp_to_string(scf_env%method))//"> found. Check the code!")
788
790
791 IF (.NOT. scf_env%skip_diis) THEN
792 IF (.NOT. ASSOCIATED(scf_env%scf_diis_buffer)) THEN
793 ALLOCATE (scf_env%scf_diis_buffer)
794 CALL qs_diis_b_create(scf_env%scf_diis_buffer, nbuffer=scf_control%max_diis)
795 END IF
796 CALL qs_diis_b_clear(scf_env%scf_diis_buffer)
797 END IF
798
800 IF (.NOT. scf_env%skip_diis) THEN
801 IF (do_kpoints) THEN
802 IF (.NOT. ASSOCIATED(kpoints%scf_diis_buffer)) THEN
803 ALLOCATE (kpoints%scf_diis_buffer)
804 CALL qs_diis_b_create_kp(kpoints%scf_diis_buffer, nbuffer=scf_control%max_diis)
805 END IF
806 CALL qs_diis_b_clear_kp(kpoints%scf_diis_buffer)
807 ELSE
808 IF (.NOT. ASSOCIATED(scf_env%scf_diis_buffer)) THEN
809 ALLOCATE (scf_env%scf_diis_buffer)
810 CALL qs_diis_b_create(scf_env%scf_diis_buffer, nbuffer=scf_control%max_diis)
811 END IF
812 CALL qs_diis_b_clear(scf_env%scf_diis_buffer)
813 END IF
814 END IF
815
816 CASE (ot_diag_method_nr)
817 CALL get_qs_env(qs_env, matrix_ks=matrix_ks, matrix_s=matrix_s)
818
819 IF (.NOT. scf_env%skip_diis) THEN
820 IF (.NOT. ASSOCIATED(scf_env%scf_diis_buffer)) THEN
821 ALLOCATE (scf_env%scf_diis_buffer)
822 CALL qs_diis_b_create(scf_env%scf_diis_buffer, nbuffer=scf_control%max_diis)
823 END IF
824 CALL qs_diis_b_clear(scf_env%scf_diis_buffer)
825 END IF
826
827 ! disable DFTB and SE for now
828 IF (dft_control%qs_control%dftb .OR. &
829 dft_control%qs_control%xtb .OR. &
830 dft_control%qs_control%semi_empirical) THEN
831 cpabort("DFTB and SE not available with OT/DIAG")
832 END IF
833
834 ! if an old preconditioner is still around (i.e. outer SCF is active),
835 ! remove it if this could be worthwhile
836 CALL restart_preconditioner(qs_env, scf_env%ot_preconditioner, &
837 scf_control%diagonalization%ot_settings%preconditioner_type, &
838 dft_control%nspins)
839
840 CALL prepare_preconditioner(qs_env, mos, matrix_ks, matrix_s, scf_env%ot_preconditioner, &
841 scf_control%diagonalization%ot_settings%preconditioner_type, &
842 scf_control%diagonalization%ot_settings%precond_solver_type, &
843 scf_control%diagonalization%ot_settings%energy_gap, dft_control%nspins)
844
846 ! Preconditioner initialized within the loop, when required
847 CASE (ot_method_nr)
848 CALL get_qs_env(qs_env, &
849 has_unit_metric=has_unit_metric, &
850 matrix_s=matrix_s, &
851 matrix_ks=matrix_ks)
852
853 ! reortho the wavefunctions if we are having an outer scf and
854 ! this is not the first iteration
855 ! this is useful to avoid the build-up of numerical noise
856 ! however, we can not play this trick if restricted (don't mix non-equivalent orbs)
857 IF (scf_control%do_outer_scf_reortho) THEN
858 IF (scf_control%outer_scf%have_scf .AND. .NOT. dft_control%restricted) THEN
859 IF (scf_env%outer_scf%iter_count > 0) THEN
860 DO ispin = 1, dft_control%nspins
861 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, nmo=nmo)
862 IF (has_unit_metric) THEN
863 CALL make_basis_simple(mo_coeff, nmo)
864 ELSE
865 CALL make_basis_sm(mo_coeff, nmo, matrix_s(1)%matrix)
866 END IF
867 END DO
868 END IF
869 END IF
870 ELSE
871 ! dont need any dirty trick for the numerically stable irac algorithm.
872 END IF
873
874 IF (.NOT. ASSOCIATED(scf_env%qs_ot_env)) THEN
875
876 ! restricted calculations require just one set of OT orbitals
877 number_of_ot_envs = dft_control%nspins
878 IF (dft_control%restricted) number_of_ot_envs = 1
879
880 ALLOCATE (scf_env%qs_ot_env(number_of_ot_envs))
881
882 ! XXX Joost XXX should disentangle reading input from this part
883 IF (scf_env%outer_scf%iter_count > 0) THEN
884 IF (scf_env%iter_delta < scf_control%eps_diis) THEN
885 scf_env%qs_ot_env(1)%settings%ot_state = 1
886 END IF
887 END IF
888 !
889 CALL ot_scf_read_input(scf_env%qs_ot_env, scf_section)
890 !
891 IF (scf_env%outer_scf%iter_count > 0) THEN
892 IF (scf_env%qs_ot_env(1)%settings%ot_state == 1) THEN
893 scf_control%max_scf = max(scf_env%qs_ot_env(1)%settings%max_scf_diis, &
894 scf_control%max_scf)
895 END IF
896 END IF
897
898 ! keep a note that we are restricted
899 IF (dft_control%restricted) THEN
900 scf_env%qs_ot_env(1)%restricted = .true.
901 ! requires rotation
902 IF (.NOT. scf_env%qs_ot_env(1)%settings%do_rotation) &
903 CALL cp_abort(__location__, &
904 "Restricted calculation with OT requires orbital rotation. Please "// &
905 "activate the OT%ROTATION keyword!")
906 ELSE
907 scf_env%qs_ot_env(:)%restricted = .false.
908 END IF
909
910 ! this will rotate the MOs to be eigen states, which is not compatible with rotation
911 ! e.g. mo_derivs here do not yet include potentially different occupations numbers
912 do_rotation = scf_env%qs_ot_env(1)%settings%do_rotation
913 ! only full all needs rotation
914 is_full_all = scf_env%qs_ot_env(1)%settings%preconditioner_type == ot_precond_full_all
915 IF (do_rotation .AND. is_full_all) &
916 cpabort('PRECONDITIONER FULL_ALL is not compatible with ROTATION.')
917
918 ! might need the KS matrix to init properly
919 CALL qs_ks_update_qs_env(qs_env, just_energy=.false., &
920 calculate_forces=.false.)
921
922 ! if an old preconditioner is still around (i.e. outer SCF is active),
923 ! remove it if this could be worthwhile
924 IF (.NOT. reuse_precond) &
925 CALL restart_preconditioner(qs_env, scf_env%ot_preconditioner, &
926 scf_env%qs_ot_env(1)%settings%preconditioner_type, &
927 dft_control%nspins)
928
929 !
930 ! preconditioning still needs to be done correctly with has_unit_metric
931 ! notice that a big part of the preconditioning (S^-1) is fine anyhow
932 !
933 IF (has_unit_metric) THEN
934 NULLIFY (orthogonality_metric)
935 ELSE
936 orthogonality_metric => matrix_s(1)%matrix
937 END IF
938
939 IF (.NOT. reuse_precond) &
940 CALL prepare_preconditioner(qs_env, mos, matrix_ks, matrix_s, scf_env%ot_preconditioner, &
941 scf_env%qs_ot_env(1)%settings%preconditioner_type, &
942 scf_env%qs_ot_env(1)%settings%precond_solver_type, &
943 scf_env%qs_ot_env(1)%settings%energy_gap, dft_control%nspins, &
944 has_unit_metric=has_unit_metric, &
945 chol_type=scf_env%qs_ot_env(1)%settings%cholesky_type)
946 IF (reuse_precond) reuse_precond = .false.
947
948 CALL ot_scf_init(mo_array=mos, matrix_s=orthogonality_metric, &
949 broyden_adaptive_sigma=qs_env%broyden_adaptive_sigma, &
950 qs_ot_env=scf_env%qs_ot_env, matrix_ks=matrix_ks(1)%matrix)
951
952 SELECT CASE (scf_env%qs_ot_env(1)%settings%preconditioner_type)
953 CASE (ot_precond_none)
955 DO ispin = 1, SIZE(scf_env%qs_ot_env)
956 CALL qs_ot_new_preconditioner(scf_env%qs_ot_env(ispin), &
957 scf_env%ot_preconditioner(ispin)%preconditioner)
958 END DO
960 DO ispin = 1, SIZE(scf_env%qs_ot_env)
961 CALL qs_ot_new_preconditioner(scf_env%qs_ot_env(ispin), &
962 scf_env%ot_preconditioner(1)%preconditioner)
963 END DO
964 CASE DEFAULT
965 DO ispin = 1, SIZE(scf_env%qs_ot_env)
966 CALL qs_ot_new_preconditioner(scf_env%qs_ot_env(ispin), &
967 scf_env%ot_preconditioner(1)%preconditioner)
968 END DO
969 END SELECT
970 END IF
971
972 ! if we have non-uniform occupations we should be using rotation
973 do_rotation = scf_env%qs_ot_env(1)%settings%do_rotation
974 DO ispin = 1, SIZE(mos)
975 IF (.NOT. mos(ispin)%uniform_occupation) THEN
976 cpassert(do_rotation)
977 END IF
978 END DO
979 END SELECT
980
981 ! another safety check
982 IF (dft_control%low_spin_roks) THEN
983 cpassert(scf_env%method == ot_method_nr)
984 do_rotation = scf_env%qs_ot_env(1)%settings%do_rotation
985 cpassert(do_rotation)
986 END IF
987
988 CALL timestop(handle)
989
990 END SUBROUTINE init_scf_loop
991
992! **************************************************************************************************
993!> \brief perform cleanup operations (like releasing temporary storage)
994!> at the end of the scf
995!> \param scf_env ...
996!> \par History
997!> 02.2003 created [fawzi]
998!> \author fawzi
999! **************************************************************************************************
1000 SUBROUTINE scf_env_cleanup(scf_env)
1001 TYPE(qs_scf_env_type), INTENT(INOUT) :: scf_env
1002
1003 CHARACTER(len=*), PARAMETER :: routinen = 'scf_env_cleanup'
1004
1005 INTEGER :: handle
1006
1007 CALL timeset(routinen, handle)
1008
1009 ! Release SCF work storage
1010 CALL cp_fm_release(scf_env%scf_work1)
1011
1012 IF (ASSOCIATED(scf_env%scf_work1_red)) THEN
1013 CALL cp_fm_release(scf_env%scf_work1_red)
1014 END IF
1015 IF (ASSOCIATED(scf_env%scf_work2)) THEN
1016 CALL cp_fm_release(scf_env%scf_work2)
1017 DEALLOCATE (scf_env%scf_work2)
1018 NULLIFY (scf_env%scf_work2)
1019 END IF
1020 IF (ASSOCIATED(scf_env%scf_work2_red)) THEN
1021 CALL cp_fm_release(scf_env%scf_work2_red)
1022 DEALLOCATE (scf_env%scf_work2_red)
1023 NULLIFY (scf_env%scf_work2_red)
1024 END IF
1025 IF (ASSOCIATED(scf_env%ortho)) THEN
1026 CALL cp_fm_release(scf_env%ortho)
1027 DEALLOCATE (scf_env%ortho)
1028 NULLIFY (scf_env%ortho)
1029 END IF
1030 IF (ASSOCIATED(scf_env%ortho_red)) THEN
1031 CALL cp_fm_release(scf_env%ortho_red)
1032 DEALLOCATE (scf_env%ortho_red)
1033 NULLIFY (scf_env%ortho_red)
1034 END IF
1035 IF (ASSOCIATED(scf_env%ortho_m1)) THEN
1036 CALL cp_fm_release(scf_env%ortho_m1)
1037 DEALLOCATE (scf_env%ortho_m1)
1038 NULLIFY (scf_env%ortho_m1)
1039 END IF
1040 IF (ASSOCIATED(scf_env%ortho_m1_red)) THEN
1041 CALL cp_fm_release(scf_env%ortho_m1_red)
1042 DEALLOCATE (scf_env%ortho_m1_red)
1043 NULLIFY (scf_env%ortho_m1_red)
1044 END IF
1045
1046 IF (ASSOCIATED(scf_env%ortho_dbcsr)) THEN
1047 CALL dbcsr_deallocate_matrix(scf_env%ortho_dbcsr)
1048 END IF
1049 IF (ASSOCIATED(scf_env%buf1_dbcsr)) THEN
1050 CALL dbcsr_deallocate_matrix(scf_env%buf1_dbcsr)
1051 END IF
1052 IF (ASSOCIATED(scf_env%buf2_dbcsr)) THEN
1053 CALL dbcsr_deallocate_matrix(scf_env%buf2_dbcsr)
1054 END IF
1055
1056 IF (ASSOCIATED(scf_env%p_mix_new)) THEN
1057 CALL dbcsr_deallocate_matrix_set(scf_env%p_mix_new)
1058 END IF
1059
1060 IF (ASSOCIATED(scf_env%p_delta)) THEN
1061 CALL dbcsr_deallocate_matrix_set(scf_env%p_delta)
1062 END IF
1063
1064 ! Method dependent cleanup
1065 SELECT CASE (scf_env%method)
1066 CASE (ot_method_nr)
1067 !
1068 CASE (ot_diag_method_nr)
1069 !
1071 !
1073 !
1076 CALL block_davidson_deallocate(scf_env%block_davidson_env)
1078 !
1079 CASE (smeagol_method_nr)
1080 !
1081 CASE DEFAULT
1082 cpabort("unknown scf method method:"//cp_to_string(scf_env%method))
1083 END SELECT
1084
1085 IF (ASSOCIATED(scf_env%outer_scf%variables)) THEN
1086 DEALLOCATE (scf_env%outer_scf%variables)
1087 END IF
1088 IF (ASSOCIATED(scf_env%outer_scf%count)) THEN
1089 DEALLOCATE (scf_env%outer_scf%count)
1090 END IF
1091 IF (ASSOCIATED(scf_env%outer_scf%gradient)) THEN
1092 DEALLOCATE (scf_env%outer_scf%gradient)
1093 END IF
1094 IF (ASSOCIATED(scf_env%outer_scf%energy)) THEN
1095 DEALLOCATE (scf_env%outer_scf%energy)
1096 END IF
1097 IF (ASSOCIATED(scf_env%outer_scf%inv_jacobian) .AND. &
1098 scf_env%outer_scf%deallocate_jacobian) THEN
1099 DEALLOCATE (scf_env%outer_scf%inv_jacobian)
1100 END IF
1101
1102 CALL timestop(handle)
1103
1104 END SUBROUTINE scf_env_cleanup
1105
1106! **************************************************************************************************
1107!> \brief perform a CDFT scf procedure in the given qs_env
1108!> \param qs_env the qs_environment where to perform the scf procedure
1109!> \param should_stop flag determining if calculation should stop
1110!> \par History
1111!> 12.2015 Created
1112!> \author Nico Holmberg
1113! **************************************************************************************************
1114 SUBROUTINE cdft_scf(qs_env, should_stop)
1115 TYPE(qs_environment_type), POINTER :: qs_env
1116 LOGICAL, INTENT(OUT) :: should_stop
1117
1118 CHARACTER(len=*), PARAMETER :: routinen = 'cdft_scf'
1119
1120 INTEGER :: handle, iatom, ispin, ivar, nmo, nvar, &
1121 output_unit, tsteps
1122 LOGICAL :: cdft_loop_converged, converged, &
1123 exit_cdft_loop, first_iteration, &
1124 my_uocc, uniform_occupation
1125 REAL(kind=dp), DIMENSION(:), POINTER :: mo_occupations
1126 TYPE(cdft_control_type), POINTER :: cdft_control
1127 TYPE(cp_logger_type), POINTER :: logger
1128 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_s, rho_ao
1129 TYPE(dft_control_type), POINTER :: dft_control
1130 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
1131 TYPE(pw_env_type), POINTER :: pw_env
1132 TYPE(pw_pool_type), POINTER :: auxbas_pw_pool
1133 TYPE(qs_energy_type), POINTER :: energy
1134 TYPE(qs_ks_env_type), POINTER :: ks_env
1135 TYPE(qs_rho_type), POINTER :: rho
1136 TYPE(qs_scf_env_type), POINTER :: scf_env
1137 TYPE(scf_control_type), POINTER :: scf_control
1138 TYPE(section_vals_type), POINTER :: dft_section, input, scf_section
1139
1140 NULLIFY (scf_env, ks_env, energy, rho, matrix_s, rho_ao, cdft_control, logger, &
1141 dft_control, pw_env, auxbas_pw_pool, energy, ks_env, scf_env, dft_section, &
1142 input, scf_section, scf_control, mos, mo_occupations)
1143 logger => cp_get_default_logger()
1144
1145 cpassert(ASSOCIATED(qs_env))
1146 CALL get_qs_env(qs_env, scf_env=scf_env, energy=energy, &
1147 dft_control=dft_control, scf_control=scf_control, &
1148 ks_env=ks_env, input=input)
1149
1150 CALL timeset(routinen//"_loop", handle)
1151 dft_section => section_vals_get_subs_vals(input, "DFT")
1152 scf_section => section_vals_get_subs_vals(dft_section, "SCF")
1153 output_unit = cp_print_key_unit_nr(logger, scf_section, "PRINT%PROGRAM_RUN_INFO", &
1154 extension=".scfLog")
1155 first_iteration = .true.
1156
1157 cdft_control => dft_control%qs_control%cdft_control
1158
1159 scf_env%outer_scf%iter_count = 0
1160 cdft_control%total_steps = 0
1161
1162 ! Write some info about the CDFT calculation
1163 IF (output_unit > 0) THEN
1164 WRITE (unit=output_unit, fmt="(/,/,T2,A)") &
1165 "CDFT EXTERNAL SCF WAVEFUNCTION OPTIMIZATION"
1166 CALL qs_scf_cdft_initial_info(output_unit, cdft_control)
1167 END IF
1168 IF (cdft_control%reuse_precond) THEN
1169 reuse_precond = .false.
1170 cdft_control%nreused = 0
1171 END IF
1172 cdft_outer_loop: DO
1173 ! Change outer_scf settings to OT settings
1174 CALL outer_loop_switch(scf_env, scf_control, cdft_control, cdft2ot)
1175 ! Solve electronic structure with fixed value of constraint
1176 CALL scf_env_do_scf(scf_env=scf_env, scf_control=scf_control, qs_env=qs_env, &
1177 converged=converged, should_stop=should_stop, total_scf_steps=tsteps)
1178 ! Decide whether to reuse the preconditioner on the next iteration
1179 IF (cdft_control%reuse_precond) THEN
1180 ! For convergence in exactly one step, the preconditioner is always reused (assuming max_reuse > 0)
1181 ! usually this means that the electronic structure has already converged to the correct state
1182 ! but the constraint optimizer keeps jumping over the optimal solution
1183 IF (scf_env%outer_scf%iter_count == 1 .AND. scf_env%iter_count == 1 &
1184 .AND. cdft_control%total_steps /= 1) &
1185 cdft_control%nreused = cdft_control%nreused - 1
1186 ! SCF converged in less than precond_freq steps
1187 IF (scf_env%outer_scf%iter_count == 1 .AND. scf_env%iter_count <= cdft_control%precond_freq .AND. &
1188 cdft_control%total_steps /= 1 .AND. cdft_control%nreused < cdft_control%max_reuse) THEN
1189 reuse_precond = .true.
1190 cdft_control%nreused = cdft_control%nreused + 1
1191 ELSE
1192 reuse_precond = .false.
1193 cdft_control%nreused = 0
1194 END IF
1195 END IF
1196 ! Update history purging counters
1197 IF (first_iteration .AND. cdft_control%purge_history) THEN
1198 cdft_control%istep = cdft_control%istep + 1
1199 IF (scf_env%outer_scf%iter_count > 1) THEN
1200 cdft_control%nbad_conv = cdft_control%nbad_conv + 1
1201 IF (cdft_control%nbad_conv >= cdft_control%purge_freq .AND. &
1202 cdft_control%istep >= cdft_control%purge_offset) THEN
1203 cdft_control%nbad_conv = 0
1204 cdft_control%istep = 0
1205 cdft_control%should_purge = .true.
1206 END IF
1207 END IF
1208 END IF
1209 first_iteration = .false.
1210 ! Change outer_scf settings to CDFT settings
1211 CALL outer_loop_switch(scf_env, scf_control, cdft_control, ot2cdft)
1212 CALL qs_scf_check_outer_exit(qs_env, scf_env, scf_control, should_stop, &
1213 cdft_loop_converged, exit_cdft_loop)
1214 CALL qs_scf_cdft_info(output_unit, scf_control, scf_env, cdft_control, &
1215 energy, cdft_control%total_steps, &
1216 should_stop, cdft_loop_converged, cdft_loop=.true.)
1217 IF (exit_cdft_loop) EXIT cdft_outer_loop
1218 ! Check if the inverse Jacobian needs to be calculated
1219 CALL qs_calculate_inverse_jacobian(qs_env)
1220 ! Check if a line search should be performed to find an optimal step size for the optimizer
1221 CALL qs_cdft_line_search(qs_env)
1222 ! Optimize constraint
1223 CALL outer_loop_optimize(scf_env, scf_control)
1224 CALL outer_loop_update_qs_env(qs_env, scf_env)
1225 CALL qs_ks_did_change(ks_env, potential_changed=.true.)
1226 END DO cdft_outer_loop
1227
1228 cdft_control%ienergy = cdft_control%ienergy + 1
1229
1230 ! Store needed arrays for ET coupling calculation
1231 IF (cdft_control%do_et) THEN
1232 CALL get_qs_env(qs_env=qs_env, matrix_s=matrix_s, mos=mos)
1233 nvar = SIZE(cdft_control%target)
1234 ! Matrix representation of weight function
1235 ALLOCATE (cdft_control%wmat(nvar))
1236 DO ivar = 1, nvar
1237 CALL dbcsr_init_p(cdft_control%wmat(ivar)%matrix)
1238 CALL dbcsr_copy(cdft_control%wmat(ivar)%matrix, matrix_s(1)%matrix, &
1239 name="ET_RESTRAINT_MATRIX")
1240 CALL dbcsr_set(cdft_control%wmat(ivar)%matrix, 0.0_dp)
1241 CALL integrate_v_rspace(cdft_control%group(ivar)%weight, &
1242 hmat=cdft_control%wmat(ivar), qs_env=qs_env, &
1243 calculate_forces=.false., &
1244 gapw=dft_control%qs_control%gapw)
1245 END DO
1246 ! Overlap matrix
1247 CALL dbcsr_init_p(cdft_control%matrix_s%matrix)
1248 CALL dbcsr_copy(cdft_control%matrix_s%matrix, matrix_s(1)%matrix, &
1249 name="OVERLAP")
1250 ! Molecular orbital coefficients
1251 NULLIFY (cdft_control%mo_coeff)
1252 ALLOCATE (cdft_control%mo_coeff(dft_control%nspins))
1253 DO ispin = 1, dft_control%nspins
1254 CALL cp_fm_create(matrix=cdft_control%mo_coeff(ispin), &
1255 matrix_struct=qs_env%mos(ispin)%mo_coeff%matrix_struct, &
1256 name="MO_COEFF_A"//trim(adjustl(cp_to_string(ispin)))//"MATRIX")
1257 CALL cp_fm_to_fm(qs_env%mos(ispin)%mo_coeff, &
1258 cdft_control%mo_coeff(ispin))
1259 END DO
1260 ! Density matrix
1261 IF (cdft_control%calculate_metric) THEN
1262 CALL get_qs_env(qs_env, rho=rho)
1263 CALL qs_rho_get(rho, rho_ao=rho_ao)
1264 ALLOCATE (cdft_control%matrix_p(dft_control%nspins))
1265 DO ispin = 1, dft_control%nspins
1266 NULLIFY (cdft_control%matrix_p(ispin)%matrix)
1267 CALL dbcsr_init_p(cdft_control%matrix_p(ispin)%matrix)
1268 CALL dbcsr_copy(cdft_control%matrix_p(ispin)%matrix, rho_ao(ispin)%matrix, &
1269 name="DENSITY MATRIX")
1270 END DO
1271 END IF
1272 ! Copy occupation numbers if non-uniform occupation
1273 uniform_occupation = .true.
1274 DO ispin = 1, dft_control%nspins
1275 CALL get_mo_set(mo_set=mos(ispin), uniform_occupation=my_uocc)
1276 uniform_occupation = uniform_occupation .AND. my_uocc
1277 END DO
1278 IF (.NOT. uniform_occupation) THEN
1279 ALLOCATE (cdft_control%occupations(dft_control%nspins))
1280 DO ispin = 1, dft_control%nspins
1281 CALL get_mo_set(mo_set=mos(ispin), &
1282 nmo=nmo, &
1283 occupation_numbers=mo_occupations)
1284 ALLOCATE (cdft_control%occupations(ispin)%array(nmo))
1285 cdft_control%occupations(ispin)%array(1:nmo) = mo_occupations(1:nmo)
1286 END DO
1287 END IF
1288 END IF
1289
1290 ! Deallocate constraint storage if forces are not needed
1291 ! In case of a simulation with multiple force_evals,
1292 ! deallocate only if weight function should not be copied to different force_evals
1293 IF (.NOT. (cdft_control%save_pot .OR. cdft_control%transfer_pot)) THEN
1294 CALL get_qs_env(qs_env, pw_env=pw_env)
1295 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
1296 DO iatom = 1, SIZE(cdft_control%group)
1297 CALL auxbas_pw_pool%give_back_pw(cdft_control%group(iatom)%weight)
1298 DEALLOCATE (cdft_control%group(iatom)%weight)
1299 END DO
1300 IF (cdft_control%atomic_charges) THEN
1301 DO iatom = 1, cdft_control%natoms
1302 CALL auxbas_pw_pool%give_back_pw(cdft_control%charge(iatom))
1303 END DO
1304 DEALLOCATE (cdft_control%charge)
1305 END IF
1306 IF (cdft_control%type == outer_scf_becke_constraint .AND. &
1307 cdft_control%becke_control%cavity_confine) THEN
1308 IF (.NOT. ASSOCIATED(cdft_control%becke_control%cavity_mat)) THEN
1309 CALL auxbas_pw_pool%give_back_pw(cdft_control%becke_control%cavity)
1310 ELSE
1311 DEALLOCATE (cdft_control%becke_control%cavity_mat)
1312 END IF
1313 ELSE IF (cdft_control%type == outer_scf_hirshfeld_constraint) THEN
1314 IF (ASSOCIATED(cdft_control%hirshfeld_control%hirshfeld_env%fnorm)) THEN
1315 CALL auxbas_pw_pool%give_back_pw(cdft_control%hirshfeld_control%hirshfeld_env%fnorm)
1316 END IF
1317 END IF
1318 IF (ASSOCIATED(cdft_control%charges_fragment)) DEALLOCATE (cdft_control%charges_fragment)
1319 cdft_control%need_pot = .true.
1320 cdft_control%external_control = .false.
1321 END IF
1322
1323 CALL timestop(handle)
1324
1325 END SUBROUTINE cdft_scf
1326
1327! **************************************************************************************************
1328!> \brief perform cleanup operations for cdft_control
1329!> \param cdft_control container for the external CDFT SCF loop variables
1330!> \par History
1331!> 12.2015 created [Nico Holmberg]
1332!> \author Nico Holmberg
1333! **************************************************************************************************
1334 SUBROUTINE cdft_control_cleanup(cdft_control)
1335 TYPE(cdft_control_type), POINTER :: cdft_control
1336
1337 IF (ASSOCIATED(cdft_control%constraint%variables)) &
1338 DEALLOCATE (cdft_control%constraint%variables)
1339 IF (ASSOCIATED(cdft_control%constraint%count)) &
1340 DEALLOCATE (cdft_control%constraint%count)
1341 IF (ASSOCIATED(cdft_control%constraint%gradient)) &
1342 DEALLOCATE (cdft_control%constraint%gradient)
1343 IF (ASSOCIATED(cdft_control%constraint%energy)) &
1344 DEALLOCATE (cdft_control%constraint%energy)
1345 IF (ASSOCIATED(cdft_control%constraint%inv_jacobian) .AND. &
1346 cdft_control%constraint%deallocate_jacobian) &
1347 DEALLOCATE (cdft_control%constraint%inv_jacobian)
1348
1349 END SUBROUTINE cdft_control_cleanup
1350
1351! **************************************************************************************************
1352!> \brief Calculates the finite difference inverse Jacobian
1353!> \param qs_env the qs_environment_type where to compute the Jacobian
1354!> \par History
1355!> 01.2017 created [Nico Holmberg]
1356! **************************************************************************************************
1357 SUBROUTINE qs_calculate_inverse_jacobian(qs_env)
1358 TYPE(qs_environment_type), POINTER :: qs_env
1359
1360 CHARACTER(LEN=*), PARAMETER :: routinen = 'qs_calculate_inverse_jacobian'
1361
1362 CHARACTER(len=default_path_length) :: project_name
1363 INTEGER :: counter, handle, i, ispin, iter_count, &
1364 iwork, j, max_scf, nspins, nsteps, &
1365 nvar, nwork, output_unit, pwork, &
1366 tsteps, twork
1367 LOGICAL :: converged, explicit_jacobian, &
1368 should_build, should_stop, &
1369 use_md_history
1370 REAL(kind=dp) :: inv_error, step_size
1371 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: coeff, dh, step_multiplier
1372 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :) :: jacobian
1373 REAL(kind=dp), DIMENSION(:), POINTER :: energy
1374 REAL(kind=dp), DIMENSION(:, :), POINTER :: gradient, inv_jacobian
1375 TYPE(cdft_control_type), POINTER :: cdft_control
1376 TYPE(cp_logger_type), POINTER :: logger, tmp_logger
1377 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: p_rmpv
1378 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: rho_ao_kp
1379 TYPE(dft_control_type), POINTER :: dft_control
1380 TYPE(mo_set_type), ALLOCATABLE, DIMENSION(:) :: mos_stashed
1381 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
1382 TYPE(mp_para_env_type), POINTER :: para_env
1383 TYPE(qs_energy_type), POINTER :: energy_qs
1384 TYPE(qs_ks_env_type), POINTER :: ks_env
1385 TYPE(qs_rho_type), POINTER :: rho
1386 TYPE(qs_scf_env_type), POINTER :: scf_env
1387 TYPE(scf_control_type), POINTER :: scf_control
1388
1389 NULLIFY (energy, gradient, p_rmpv, rho_ao_kp, mos, rho, &
1390 ks_env, scf_env, scf_control, dft_control, cdft_control, &
1391 inv_jacobian, para_env, tmp_logger, energy_qs)
1392 logger => cp_get_default_logger()
1393
1394 cpassert(ASSOCIATED(qs_env))
1395 CALL get_qs_env(qs_env, scf_env=scf_env, ks_env=ks_env, &
1396 scf_control=scf_control, mos=mos, rho=rho, &
1397 dft_control=dft_control, &
1398 para_env=para_env, energy=energy_qs)
1399 explicit_jacobian = .false.
1400 should_build = .false.
1401 use_md_history = .false.
1402 iter_count = scf_env%outer_scf%iter_count
1403 ! Quick exit if optimizer does not require Jacobian
1404 IF (.NOT. ASSOCIATED(scf_control%outer_scf%cdft_opt_control)) RETURN
1405 ! Check if Jacobian should be calculated and initialize
1406 CALL timeset(routinen, handle)
1407 CALL initialize_inverse_jacobian(scf_control, scf_env, explicit_jacobian, should_build, used_history)
1408 IF (scf_control%outer_scf%cdft_opt_control%jacobian_restart) THEN
1409 ! Restart from previously calculated inverse Jacobian
1410 should_build = .false.
1411 CALL restart_inverse_jacobian(qs_env)
1412 END IF
1413 IF (should_build) THEN
1414 scf_env%outer_scf%deallocate_jacobian = .false.
1415 ! Actually need to (re)build the Jacobian
1416 IF (explicit_jacobian) THEN
1417 ! Build Jacobian with finite differences
1418 cdft_control => dft_control%qs_control%cdft_control
1419 IF (.NOT. ASSOCIATED(cdft_control)) &
1420 CALL cp_abort(__location__, &
1421 "Optimizers that need the explicit Jacobian can"// &
1422 " only be used together with a valid CDFT constraint.")
1423 ! Redirect output from Jacobian calculation to a new file by creating a temporary logger
1424 project_name = logger%iter_info%project_name
1425 CALL create_tmp_logger(para_env, project_name, "-JacobianInfo.out", output_unit, tmp_logger)
1426 ! Save last converged state so we can roll back to it (mo_coeff and some outer_loop variables)
1427 nspins = dft_control%nspins
1428 ALLOCATE (mos_stashed(nspins))
1429 DO ispin = 1, nspins
1430 CALL duplicate_mo_set(mos_stashed(ispin), mos(ispin))
1431 END DO
1432 CALL qs_rho_get(rho, rho_ao_kp=rho_ao_kp)
1433 p_rmpv => rho_ao_kp(:, 1)
1434 ! Allocate work
1435 nvar = SIZE(scf_env%outer_scf%variables, 1)
1436 max_scf = scf_control%outer_scf%max_scf + 1
1437 ALLOCATE (gradient(nvar, max_scf))
1438 gradient = scf_env%outer_scf%gradient
1439 ALLOCATE (energy(max_scf))
1440 energy = scf_env%outer_scf%energy
1441 ALLOCATE (jacobian(nvar, nvar))
1442 jacobian = 0.0_dp
1443 nsteps = cdft_control%total_steps
1444 ! Setup finite difference scheme
1445 CALL prepare_jacobian_stencil(qs_env, output_unit, nwork, pwork, coeff, step_multiplier, dh)
1446 twork = pwork - nwork
1447 DO i = 1, nvar
1448 jacobian(i, :) = coeff(0)*scf_env%outer_scf%gradient(i, iter_count)
1449 END DO
1450 ! Calculate the Jacobian by perturbing each Lagrangian and recalculating the energy self-consistently
1451 CALL cp_add_default_logger(tmp_logger)
1452 DO i = 1, nvar
1453 IF (output_unit > 0) THEN
1454 WRITE (output_unit, fmt="(A)") " "
1455 WRITE (output_unit, fmt="(A)") " #####################################"
1456 WRITE (output_unit, '(A,I3,A,I3,A)') &
1457 " ### Constraint ", i, " of ", nvar, " ###"
1458 WRITE (output_unit, fmt="(A)") " #####################################"
1459 END IF
1460 counter = 0
1461 DO iwork = nwork, pwork
1462 IF (iwork == 0) cycle
1463 counter = counter + 1
1464 IF (output_unit > 0) THEN
1465 WRITE (output_unit, fmt="(A)") " #####################################"
1466 WRITE (output_unit, '(A,I3,A,I3,A)') &
1467 " ### Energy evaluation ", counter, " of ", twork, " ###"
1468 WRITE (output_unit, fmt="(A)") " #####################################"
1469 END IF
1470 IF (SIZE(scf_control%outer_scf%cdft_opt_control%jacobian_step) == 1) THEN
1471 step_size = scf_control%outer_scf%cdft_opt_control%jacobian_step(1)
1472 ELSE
1473 step_size = scf_control%outer_scf%cdft_opt_control%jacobian_step(i)
1474 END IF
1475 scf_env%outer_scf%variables(:, iter_count + 1) = scf_env%outer_scf%variables(:, iter_count)
1476 scf_env%outer_scf%variables(i, iter_count + 1) = scf_env%outer_scf%variables(i, iter_count) + &
1477 step_multiplier(iwork)*step_size
1478 CALL outer_loop_update_qs_env(qs_env, scf_env)
1479 CALL qs_ks_did_change(ks_env, potential_changed=.true.)
1480 CALL outer_loop_switch(scf_env, scf_control, cdft_control, cdft2ot)
1481 CALL scf_env_do_scf(scf_env=scf_env, scf_control=scf_control, qs_env=qs_env, &
1482 converged=converged, should_stop=should_stop, total_scf_steps=tsteps)
1483 CALL outer_loop_switch(scf_env, scf_control, cdft_control, ot2cdft)
1484 ! Update (iter_count + 1) element of gradient and print constraint info
1485 scf_env%outer_scf%iter_count = scf_env%outer_scf%iter_count + 1
1486 CALL outer_loop_gradient(qs_env, scf_env)
1487 CALL qs_scf_cdft_info(output_unit, scf_control, scf_env, cdft_control, &
1488 energy_qs, cdft_control%total_steps, &
1489 should_stop=.false., outer_loop_converged=.false., cdft_loop=.false.)
1490 scf_env%outer_scf%iter_count = scf_env%outer_scf%iter_count - 1
1491 ! Update Jacobian
1492 DO j = 1, nvar
1493 jacobian(j, i) = jacobian(j, i) + coeff(iwork)*scf_env%outer_scf%gradient(j, iter_count + 1)
1494 END DO
1495 ! Reset everything to last converged state
1496 scf_env%outer_scf%variables(:, iter_count + 1) = 0.0_dp
1497 scf_env%outer_scf%gradient = gradient
1498 scf_env%outer_scf%energy = energy
1499 cdft_control%total_steps = nsteps
1500 DO ispin = 1, nspins
1501 CALL deallocate_mo_set(mos(ispin))
1502 CALL duplicate_mo_set(mos(ispin), mos_stashed(ispin))
1503 CALL calculate_density_matrix(mos(ispin), &
1504 p_rmpv(ispin)%matrix)
1505 END DO
1506 CALL qs_rho_update_rho(rho, qs_env=qs_env)
1507 CALL qs_ks_did_change(qs_env%ks_env, rho_changed=.true.)
1508 END DO
1509 END DO
1511 CALL cp_logger_release(tmp_logger)
1512 ! Finalize and invert Jacobian
1513 DO j = 1, nvar
1514 DO i = 1, nvar
1515 jacobian(i, j) = jacobian(i, j)/dh(j)
1516 END DO
1517 END DO
1518 IF (.NOT. ASSOCIATED(scf_env%outer_scf%inv_jacobian)) &
1519 ALLOCATE (scf_env%outer_scf%inv_jacobian(nvar, nvar))
1520 inv_jacobian => scf_env%outer_scf%inv_jacobian
1521 CALL invert_matrix(jacobian, inv_jacobian, inv_error)
1522 scf_control%outer_scf%cdft_opt_control%broyden_update = .false.
1523 ! Release temporary storage
1524 DO ispin = 1, nspins
1525 CALL deallocate_mo_set(mos_stashed(ispin))
1526 END DO
1527 DEALLOCATE (mos_stashed, jacobian, gradient, energy, coeff, step_multiplier, dh)
1528 IF (output_unit > 0) THEN
1529 WRITE (output_unit, fmt="(/,A)") &
1530 " ================================== JACOBIAN CALCULATED =================================="
1531 CALL close_file(unit_number=output_unit)
1532 END IF
1533 ELSE
1534 ! Build a strictly diagonal Jacobian from history and invert it
1535 CALL build_diagonal_jacobian(qs_env, used_history)
1536 END IF
1537 END IF
1538 IF (ASSOCIATED(scf_env%outer_scf%inv_jacobian) .AND. para_env%is_source()) THEN
1539 ! Write restart file for inverse Jacobian
1540 CALL print_inverse_jacobian(logger, scf_env%outer_scf%inv_jacobian, iter_count)
1541 END IF
1542 ! Update counter
1543 scf_control%outer_scf%cdft_opt_control%ijacobian(1) = scf_control%outer_scf%cdft_opt_control%ijacobian(1) + 1
1544 CALL timestop(handle)
1545
1546 END SUBROUTINE qs_calculate_inverse_jacobian
1547
1548! **************************************************************************************************
1549!> \brief Perform backtracking line search to find the optimal step size for the CDFT constraint
1550!> optimizer. Assumes that the CDFT gradient function is a smooth function of the constraint
1551!> variables.
1552!> \param qs_env the qs_environment_type where to perform the line search
1553!> \par History
1554!> 02.2017 created [Nico Holmberg]
1555! **************************************************************************************************
1556 SUBROUTINE qs_cdft_line_search(qs_env)
1557 TYPE(qs_environment_type), POINTER :: qs_env
1558
1559 CHARACTER(LEN=*), PARAMETER :: routinen = 'qs_cdft_line_search'
1560
1561 CHARACTER(len=default_path_length) :: project_name
1562 INTEGER :: handle, i, ispin, iter_count, &
1563 max_linesearch, max_scf, nspins, &
1564 nsteps, nvar, output_unit, tsteps
1565 LOGICAL :: continue_ls, continue_ls_exit, converged, do_linesearch, found_solution, &
1566 reached_maxls, should_exit, should_stop, sign_changed
1567 LOGICAL, ALLOCATABLE, DIMENSION(:) :: positive_sign
1568 REAL(kind=dp) :: alpha, alpha_ls, factor, norm_ls
1569 REAL(kind=dp), DIMENSION(:), POINTER :: energy
1570 REAL(kind=dp), DIMENSION(:, :), POINTER :: gradient, inv_jacobian
1571 REAL(kind=dp), EXTERNAL :: dnrm2
1572 TYPE(cdft_control_type), POINTER :: cdft_control
1573 TYPE(cp_logger_type), POINTER :: logger, tmp_logger
1574 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: p_rmpv
1575 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: rho_ao_kp
1576 TYPE(dft_control_type), POINTER :: dft_control
1577 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
1578 TYPE(mp_para_env_type), POINTER :: para_env
1579 TYPE(qs_energy_type), POINTER :: energy_qs
1580 TYPE(qs_ks_env_type), POINTER :: ks_env
1581 TYPE(qs_rho_type), POINTER :: rho
1582 TYPE(qs_scf_env_type), POINTER :: scf_env
1583 TYPE(scf_control_type), POINTER :: scf_control
1584
1585 CALL timeset(routinen, handle)
1586
1587 NULLIFY (energy, gradient, p_rmpv, rho_ao_kp, mos, rho, &
1588 ks_env, scf_env, scf_control, dft_control, &
1589 cdft_control, inv_jacobian, para_env, &
1590 tmp_logger, energy_qs)
1591 logger => cp_get_default_logger()
1592
1593 cpassert(ASSOCIATED(qs_env))
1594 CALL get_qs_env(qs_env, scf_env=scf_env, ks_env=ks_env, &
1595 scf_control=scf_control, mos=mos, rho=rho, &
1596 dft_control=dft_control, &
1597 para_env=para_env, energy=energy_qs)
1598 do_linesearch = .false.
1599 SELECT CASE (scf_control%outer_scf%optimizer)
1600 CASE DEFAULT
1601 do_linesearch = .false.
1603 do_linesearch = .true.
1605 SELECT CASE (scf_control%outer_scf%cdft_opt_control%broyden_type)
1607 do_linesearch = .false.
1609 cdft_control => dft_control%qs_control%cdft_control
1610 IF (.NOT. ASSOCIATED(cdft_control)) &
1611 CALL cp_abort(__location__, &
1612 "Optimizers that perform a line search can"// &
1613 " only be used together with a valid CDFT constraint")
1614 IF (ASSOCIATED(scf_env%outer_scf%inv_jacobian)) &
1615 do_linesearch = .true.
1616 END SELECT
1617 END SELECT
1618 IF (do_linesearch) THEN
1619 block
1620 TYPE(mo_set_type), DIMENSION(:), ALLOCATABLE :: mos_ls, mos_stashed
1621 cdft_control => dft_control%qs_control%cdft_control
1622 IF (.NOT. ASSOCIATED(cdft_control)) &
1623 CALL cp_abort(__location__, &
1624 "Optimizers that perform a line search can"// &
1625 " only be used together with a valid CDFT constraint")
1626 cpassert(ASSOCIATED(scf_env%outer_scf%inv_jacobian))
1627 cpassert(ASSOCIATED(scf_control%outer_scf%cdft_opt_control))
1628 alpha = scf_control%outer_scf%cdft_opt_control%newton_step_save
1629 iter_count = scf_env%outer_scf%iter_count
1630 ! Redirect output from line search procedure to a new file by creating a temporary logger
1631 project_name = logger%iter_info%project_name
1632 CALL create_tmp_logger(para_env, project_name, "-LineSearch.out", output_unit, tmp_logger)
1633 ! Save last converged state so we can roll back to it (mo_coeff and some outer_loop variables)
1634 nspins = dft_control%nspins
1635 ALLOCATE (mos_stashed(nspins))
1636 DO ispin = 1, nspins
1637 CALL duplicate_mo_set(mos_stashed(ispin), mos(ispin))
1638 END DO
1639 CALL qs_rho_get(rho, rho_ao_kp=rho_ao_kp)
1640 p_rmpv => rho_ao_kp(:, 1)
1641 nsteps = cdft_control%total_steps
1642 ! Allocate work
1643 nvar = SIZE(scf_env%outer_scf%variables, 1)
1644 max_scf = scf_control%outer_scf%max_scf + 1
1645 max_linesearch = scf_control%outer_scf%cdft_opt_control%max_ls
1646 continue_ls = scf_control%outer_scf%cdft_opt_control%continue_ls
1647 factor = scf_control%outer_scf%cdft_opt_control%factor_ls
1648 continue_ls_exit = .false.
1649 found_solution = .false.
1650 ALLOCATE (gradient(nvar, max_scf))
1651 gradient = scf_env%outer_scf%gradient
1652 ALLOCATE (energy(max_scf))
1653 energy = scf_env%outer_scf%energy
1654 reached_maxls = .false.
1655 ! Broyden optimizers: perform update of inv_jacobian if necessary
1656 IF (scf_control%outer_scf%cdft_opt_control%broyden_update) THEN
1657 CALL outer_loop_optimize(scf_env, scf_control)
1658 ! Reset the variables and prevent a reupdate of inv_jacobian
1659 scf_env%outer_scf%variables(:, iter_count + 1) = 0
1660 scf_control%outer_scf%cdft_opt_control%broyden_update = .false.
1661 END IF
1662 ! Print some info
1663 IF (output_unit > 0) THEN
1664 WRITE (output_unit, fmt="(/,A)") &
1665 " ================================== LINE SEARCH STARTED =================================="
1666 WRITE (output_unit, fmt="(A,I5,A)") &
1667 " Evaluating optimal step size for optimizer using a maximum of", max_linesearch, " steps"
1668 IF (continue_ls) THEN
1669 WRITE (output_unit, fmt="(A)") &
1670 " Line search continues until best step size is found or max steps are reached"
1671 END IF
1672 WRITE (output_unit, '(/,A,F5.3)') &
1673 " Initial step size: ", alpha
1674 WRITE (output_unit, '(/,A,F5.3)') &
1675 " Step size update factor: ", factor
1676 WRITE (output_unit, '(/,A,I10,A,I10)') &
1677 " Energy evaluation: ", cdft_control%ienergy, ", CDFT SCF iteration: ", iter_count
1678 END IF
1679 ! Perform backtracking line search
1680 CALL cp_add_default_logger(tmp_logger)
1681 DO i = 1, max_linesearch
1682 IF (output_unit > 0) THEN
1683 WRITE (output_unit, fmt="(A)") " "
1684 WRITE (output_unit, fmt="(A)") " #####################################"
1685 WRITE (output_unit, '(A,I10,A)') &
1686 " ### Line search step: ", i, " ###"
1687 WRITE (output_unit, fmt="(A)") " #####################################"
1688 END IF
1689 inv_jacobian => scf_env%outer_scf%inv_jacobian
1690 ! Newton update of CDFT variables with a step size of alpha
1691 scf_env%outer_scf%variables(:, iter_count + 1) = scf_env%outer_scf%variables(:, iter_count) - alpha* &
1692 matmul(inv_jacobian, scf_env%outer_scf%gradient(:, iter_count))
1693 ! With updated CDFT variables, perform SCF
1694 CALL outer_loop_update_qs_env(qs_env, scf_env)
1695 CALL qs_ks_did_change(ks_env, potential_changed=.true.)
1696 CALL outer_loop_switch(scf_env, scf_control, cdft_control, cdft2ot)
1697 CALL scf_env_do_scf(scf_env=scf_env, scf_control=scf_control, qs_env=qs_env, &
1698 converged=converged, should_stop=should_stop, total_scf_steps=tsteps)
1699 CALL outer_loop_switch(scf_env, scf_control, cdft_control, ot2cdft)
1700 ! Update (iter_count + 1) element of gradient and print constraint info
1701 scf_env%outer_scf%iter_count = scf_env%outer_scf%iter_count + 1
1702 CALL outer_loop_gradient(qs_env, scf_env)
1703 CALL qs_scf_cdft_info(output_unit, scf_control, scf_env, cdft_control, &
1704 energy_qs, cdft_control%total_steps, &
1705 should_stop=.false., outer_loop_converged=.false., cdft_loop=.false.)
1706 scf_env%outer_scf%iter_count = scf_env%outer_scf%iter_count - 1
1707 ! Store sign of initial gradient for each variable for continue_ls
1708 IF (continue_ls .AND. .NOT. ALLOCATED(positive_sign)) THEN
1709 ALLOCATE (positive_sign(nvar))
1710 DO ispin = 1, nvar
1711 positive_sign(ispin) = scf_env%outer_scf%gradient(ispin, iter_count + 1) >= 0.0_dp
1712 END DO
1713 END IF
1714 ! Check if the L2 norm of the gradient decreased
1715 inv_jacobian => scf_env%outer_scf%inv_jacobian
1716 IF (dnrm2(nvar, scf_env%outer_scf%gradient(:, iter_count + 1), 1) < &
1717 dnrm2(nvar, scf_env%outer_scf%gradient(:, iter_count), 1)) THEN
1718 ! Optimal step size found
1719 IF (.NOT. continue_ls) THEN
1720 should_exit = .true.
1721 ELSE
1722 ! But line search continues for at least one more iteration in an attempt to find a better solution
1723 ! if max number of steps is not exceeded
1724 IF (found_solution) THEN
1725 ! Check if the norm also decreased w.r.t. to previously found solution
1726 IF (dnrm2(nvar, scf_env%outer_scf%gradient(:, iter_count + 1), 1) > norm_ls) THEN
1727 ! Norm increased => accept previous solution and exit
1728 continue_ls_exit = .true.
1729 END IF
1730 END IF
1731 ! Store current state and the value of alpha
1732 IF (.NOT. continue_ls_exit) THEN
1733 should_exit = .false.
1734 alpha_ls = alpha
1735 found_solution = .true.
1736 norm_ls = dnrm2(nvar, scf_env%outer_scf%gradient(:, iter_count + 1), 1)
1737 ! Check if the sign of the gradient has changed for all variables (w.r.t initial gradient)
1738 ! In this case we should exit because further line search steps will just increase the norm
1739 sign_changed = .true.
1740 DO ispin = 1, nvar
1741 sign_changed = sign_changed .AND. (positive_sign(ispin) .NEQV. &
1742 scf_env%outer_scf%gradient(ispin, iter_count + 1) >= 0.0_dp)
1743 END DO
1744 IF (.NOT. ALLOCATED(mos_ls)) THEN
1745 ALLOCATE (mos_ls(nspins))
1746 ELSE
1747 DO ispin = 1, nspins
1748 CALL deallocate_mo_set(mos_ls(ispin))
1749 END DO
1750 END IF
1751 DO ispin = 1, nspins
1752 CALL duplicate_mo_set(mos_ls(ispin), mos(ispin))
1753 END DO
1754 alpha = alpha*factor
1755 ! Exit on last iteration
1756 IF (i == max_linesearch) continue_ls_exit = .true.
1757 ! Exit if constraint target is satisfied to requested tolerance
1758 IF (sqrt(maxval(scf_env%outer_scf%gradient(:, scf_env%outer_scf%iter_count + 1)**2)) < &
1759 scf_control%outer_scf%eps_scf) &
1760 continue_ls_exit = .true.
1761 ! Exit if line search jumped over the optimal step length
1762 IF (sign_changed) continue_ls_exit = .true.
1763 END IF
1764 END IF
1765 ELSE
1766 ! Gradient increased => alpha is too large (if the gradient function is smooth)
1767 should_exit = .false.
1768 ! Update alpha using Armijo's scheme
1769 alpha = alpha*factor
1770 END IF
1771 IF (continue_ls_exit) THEN
1772 ! Continuation of line search did not yield a better alpha, use previously located solution and exit
1773 alpha = alpha_ls
1774 DO ispin = 1, nspins
1775 CALL deallocate_mo_set(mos(ispin))
1776 CALL duplicate_mo_set(mos(ispin), mos_ls(ispin))
1777 CALL calculate_density_matrix(mos(ispin), &
1778 p_rmpv(ispin)%matrix)
1779 CALL deallocate_mo_set(mos_ls(ispin))
1780 END DO
1781 CALL qs_rho_update_rho(rho, qs_env=qs_env)
1782 CALL qs_ks_did_change(qs_env%ks_env, rho_changed=.true.)
1783 DEALLOCATE (mos_ls)
1784 should_exit = .true.
1785 END IF
1786 ! Reached max steps and SCF converged: continue with last iterated step size
1787 IF (.NOT. should_exit .AND. &
1788 (i == max_linesearch .AND. converged .AND. .NOT. found_solution)) THEN
1789 should_exit = .true.
1790 reached_maxls = .true.
1791 alpha = alpha*(1.0_dp/factor)
1792 END IF
1793 ! Reset outer SCF environment to last converged state
1794 scf_env%outer_scf%variables(:, iter_count + 1) = 0.0_dp
1795 scf_env%outer_scf%gradient = gradient
1796 scf_env%outer_scf%energy = energy
1797 ! Exit line search if a suitable step size was found
1798 IF (should_exit) EXIT
1799 ! Reset the electronic structure
1800 cdft_control%total_steps = nsteps
1801 DO ispin = 1, nspins
1802 CALL deallocate_mo_set(mos(ispin))
1803 CALL duplicate_mo_set(mos(ispin), mos_stashed(ispin))
1804 CALL calculate_density_matrix(mos(ispin), &
1805 p_rmpv(ispin)%matrix)
1806 END DO
1807 CALL qs_rho_update_rho(rho, qs_env=qs_env)
1808 CALL qs_ks_did_change(qs_env%ks_env, rho_changed=.true.)
1809 END DO
1810 scf_control%outer_scf%cdft_opt_control%newton_step = alpha
1811 IF (.NOT. should_exit) THEN
1812 CALL cp_warn(__location__, &
1813 "Line search did not converge. CDFT SCF proceeds with fixed step size.")
1814 scf_control%outer_scf%cdft_opt_control%newton_step = scf_control%outer_scf%cdft_opt_control%newton_step_save
1815 END IF
1816 IF (reached_maxls) &
1817 CALL cp_warn(__location__, &
1818 "Line search did not converge. CDFT SCF proceeds with lasted iterated step size.")
1820 CALL cp_logger_release(tmp_logger)
1821 ! Release temporary storage
1822 DO ispin = 1, nspins
1823 CALL deallocate_mo_set(mos_stashed(ispin))
1824 END DO
1825 DEALLOCATE (mos_stashed, gradient, energy)
1826 IF (ALLOCATED(positive_sign)) DEALLOCATE (positive_sign)
1827 IF (output_unit > 0) THEN
1828 WRITE (output_unit, fmt="(/,A)") &
1829 " ================================== LINE SEARCH COMPLETE =================================="
1830 CALL close_file(unit_number=output_unit)
1831 END IF
1832 END block
1833 END IF
1834
1835 CALL timestop(handle)
1836
1837 END SUBROUTINE qs_cdft_line_search
1838
1839END 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, use_sp, 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.
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
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:725
subroutine, public scf(qs_env, has_converged, total_scf_steps)
perform an scf procedure in the given qs_env
Definition qs_scf.F:206
subroutine, public scf_env_cleanup(scf_env)
perform cleanup operations (like releasing temporary storage) at the end of the scf
Definition qs_scf.F:1001
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:350
subroutine, public cdft_scf(qs_env, should_stop)
perform a CDFT scf procedure in the given qs_env
Definition qs_scf.F:1115
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.