181#include "./base/base_uses.f90"
187 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_scf'
188 LOGICAL,
PRIVATE :: reuse_precond = .false.
189 LOGICAL,
PRIVATE :: used_history = .false.
205 SUBROUTINE scf(qs_env, has_converged, total_scf_steps)
207 LOGICAL,
INTENT(OUT),
OPTIONAL :: has_converged
208 INTEGER,
INTENT(OUT),
OPTIONAL :: total_scf_steps
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
222 cpassert(
ASSOCIATED(qs_env))
223 IF (
PRESENT(has_converged))
THEN
224 has_converged = .false.
226 IF (
PRESENT(total_scf_steps))
THEN
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
236 IF (.NOT.
ASSOCIATED(scf_env))
THEN
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.
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)
256 CALL cdft_scf(qs_env=qs_env, should_stop=should_stop)
260 IF (
ASSOCIATED(qs_env%mp2_env)) qs_env%mp2_env%hf_fail = .NOT. converged
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)
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)
273 IF (used_history) used_history = .false.
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.
284 IF ((
ASSOCIATED(qs_env%wf_history)) .AND. &
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)
290 IF (dft_control%qs_control%cdft_control%should_purge)
THEN
293 dft_control%qs_control%cdft_control%should_purge = .false.
295 CALL wfi_update(qs_env%wf_history, qs_env=qs_env, dt=1.0_dp)
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.
309 IF (.NOT. (should_stop))
THEN
318 IF (dft_control%qs_control%cdft) &
319 CALL cdft_control_cleanup(dft_control%qs_control%cdft_control)
321 IF (
PRESENT(has_converged))
THEN
322 has_converged = converged
324 IF (
PRESENT(total_scf_steps))
THEN
325 total_scf_steps = tsteps
349 SUBROUTINE scf_env_do_scf(scf_env, scf_control, qs_env, converged, should_stop, total_scf_steps)
354 LOGICAL,
INTENT(OUT) :: converged, should_stop
355 INTEGER,
INTENT(OUT) :: total_scf_steps
357 CHARACTER(LEN=*),
PARAMETER :: routinen =
'scf_env_do_scf'
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
372 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: rho_ao_kp
376 TYPE(
mo_set_type),
DIMENSION(:),
POINTER :: mos, mos_last_converged
383 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
388 CALL timeset(routinen, handle)
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)
395 cpassert(
ASSOCIATED(scf_env))
396 cpassert(
ASSOCIATED(qs_env))
403 particle_set=particle_set, &
404 qs_charges=qs_charges, &
406 atomic_kind_set=atomic_kind_set, &
407 qs_kind_set=qs_kind_set, &
411 dft_control=dft_control, &
412 do_kpoints=do_kpoints, &
417 tblite_native_mixer = dft_control%qs_control%xtb_control%do_tblite .AND. &
420 internal_tblite_mixer = (dft_control%qs_control%dftb .AND. &
422 (dft_control%qs_control%xtb .AND. &
423 .NOT. dft_control%qs_control%xtb_control%do_tblite .AND. &
425 internal_tblite_density_full_step = dft_control%qs_control%xtb .AND. &
426 .NOT. dft_control%qs_control%xtb_control%do_tblite .AND. &
437 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
"(/,/,T2,A)") &
438 "SCF WAVEFUNCTION OPTIMIZATION"
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
446 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
"(/,/,T2,A)") &
447 "COPIED mos_last_converged ---> mos"
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", &
459 res_val_3(:) = -1.0_dp
460 description =
"[EXT_SCF_ENER_COMM]"
462 CALL get_results(results, description=description, &
463 values=res_val_3, n_entries=i_tmp)
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)))
471 ext_master_id = nint(res_val_3(2))
472 scf_energy_message_tag = nint(res_val_3(3))
476 scf_env%outer_scf%iter_count = 0
479 energy%tot_old = 0.0_dp
484 scf_section=scf_section)
487 energy_only, just_energy, exit_inner_loop)
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"
502 CALL timeset(routinen//
"_inner_loop", handle2)
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)
508 IF (output_unit > 0)
CALL m_flush(output_unit)
510 total_steps = total_steps + 1
511 just_energy = energy_only
514 calculate_forces=.false.)
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)
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, &
534 CALL qs_scf_new_mos(qs_env, scf_env, scf_control, scf_section, diis_step, energy_only)
541 IF (dft_control%qs_control%xtb_control%do_tblite)
THEN
546 cpassert(scf_env%mixing_method > 0)
553 density_full_step = diis_step .OR. tblite_native_mixer .OR. internal_tblite_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, &
559 scf_control%eps_scf))
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, &
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
574 scf_env%iter_param = dft_control%qs_control%xtb_control%tblite_mixer_damping
582 IF (.NOT. just_energy) energy%tot_old = energy%total
585 IF (scf_energy_message_tag > 0)
THEN
586 CALL external_comm%send(energy%total, ext_master_id, scf_energy_message_tag)
590 exit_inner_loop, inner_loop_converged, output_unit)
594 IF (exit_inner_loop)
THEN
599 outer_loop_converged, exit_outer_loop)
602 IF (exit_outer_loop)
CALL cp_iterate(logger%iter_info, last=.true., iter_nr=iter_count)
612 CALL get_ks_env(ks_env=ks_env, matrix_ks=matrix_ks)
622 IF (exit_inner_loop)
THEN
623 CALL timestop(handle2)
628 scf_section,
"PRINT%ITERATION_INFO/TIME_CUMUL"),
cp_p_file)) &
632 IF (scf_env%mixing_method > 0)
THEN
633 DO ic = 1,
SIZE(rho_ao_kp, 2)
634 DO ispin = 1, dft_control%nspins
636 CALL dbcsr_copy(rho_ao_kp(ispin, ic)%matrix, scf_env%p_mix_new(ispin, ic)%matrix, name=name)
644 CALL timestop(handle2)
648 IF (.NOT. scf_control%outer_scf%have_scf)
EXIT scf_outer_loop
652 energy, total_steps, should_stop, outer_loop_converged)
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
661 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
"(/,/,T2,A)") &
662 "COPIED mos ---> mos_last_converged"
666 IF (exit_outer_loop)
EXIT scf_outer_loop
673 END DO scf_outer_loop
675 converged = inner_loop_converged .AND. outer_loop_converged
676 total_scf_steps = total_steps
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
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")
686 CALL cp_abort(__location__, &
687 "SCF run NOT converged. To continue the calculation "// &
688 "regardless, please set the keyword IGNORE_CONVERGENCE_FAILURE.")
693 IF (qs_env%energy_correction)
THEN
695 ec_env%do_skip = .false.
696 IF (ec_env%skip_ec .AND. .NOT. converged) ec_env%do_skip = .true.
700 DO ispin = 1,
SIZE(mos)
701 IF (mos(ispin)%use_mo_coeff_b)
THEN
702 IF (.NOT.
ASSOCIATED(mos(ispin)%mo_coeff_b)) &
703 cpabort(
"mo_coeff_b is not allocated")
710 CALL timestop(handle)
730 CHARACTER(LEN=*),
PARAMETER :: routinen =
'init_scf_loop'
732 INTEGER :: handle, ispin, nmo, number_of_ot_envs
733 LOGICAL :: do_kpoints, do_rotation, &
734 has_unit_metric, is_full_all
736 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks, matrix_s
737 TYPE(
dbcsr_type),
POINTER :: orthogonality_metric
743 CALL timeset(routinen, handle)
745 NULLIFY (scf_control, matrix_s, matrix_ks, dft_control, mos, mo_coeff, kpoints)
747 cpassert(
ASSOCIATED(scf_env))
748 cpassert(
ASSOCIATED(qs_env))
751 scf_control=scf_control, &
752 dft_control=dft_control, &
753 do_kpoints=do_kpoints, &
758 DO ispin = 1,
SIZE(mos)
759 IF (mos(1)%use_mo_coeff_b)
THEN
765 DO ispin = 1, dft_control%nspins
767 IF (.NOT. scf_control%diagonalization%mom)
THEN
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.
774 smear=scf_control%smear, &
775 probe=dft_control%probe)
779 smear=scf_control%smear)
784 SELECT CASE (scf_env%method)
787 cpabort(
"Unknown SCF method <"//trim(
cp_to_string(scf_env%method))//
"> found. Check the code!")
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)
800 IF (.NOT. scf_env%skip_diis)
THEN
802 IF (.NOT.
ASSOCIATED(kpoints%scf_diis_buffer))
THEN
803 ALLOCATE (kpoints%scf_diis_buffer)
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)
817 CALL get_qs_env(qs_env, matrix_ks=matrix_ks, matrix_s=matrix_s)
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)
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")
837 scf_control%diagonalization%ot_settings%preconditioner_type, &
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)
849 has_unit_metric=has_unit_metric, &
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
874 IF (.NOT.
ASSOCIATED(scf_env%qs_ot_env))
THEN
877 number_of_ot_envs = dft_control%nspins
878 IF (dft_control%restricted) number_of_ot_envs = 1
880 ALLOCATE (scf_env%qs_ot_env(number_of_ot_envs))
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
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, &
899 IF (dft_control%restricted)
THEN
900 scf_env%qs_ot_env(1)%restricted = .true.
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!")
907 scf_env%qs_ot_env(:)%restricted = .false.
912 do_rotation = scf_env%qs_ot_env(1)%settings%do_rotation
915 IF (do_rotation .AND. is_full_all) &
916 cpabort(
'PRECONDITIONER FULL_ALL is not compatible with ROTATION.')
920 calculate_forces=.false.)
924 IF (.NOT. reuse_precond) &
926 scf_env%qs_ot_env(1)%settings%preconditioner_type, &
933 IF (has_unit_metric)
THEN
934 NULLIFY (orthogonality_metric)
936 orthogonality_metric => matrix_s(1)%matrix
939 IF (.NOT. reuse_precond) &
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.
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)
952 SELECT CASE (scf_env%qs_ot_env(1)%settings%preconditioner_type)
955 DO ispin = 1,
SIZE(scf_env%qs_ot_env)
957 scf_env%ot_preconditioner(ispin)%preconditioner)
960 DO ispin = 1,
SIZE(scf_env%qs_ot_env)
962 scf_env%ot_preconditioner(1)%preconditioner)
965 DO ispin = 1,
SIZE(scf_env%qs_ot_env)
967 scf_env%ot_preconditioner(1)%preconditioner)
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)
982 IF (dft_control%low_spin_roks)
THEN
984 do_rotation = scf_env%qs_ot_env(1)%settings%do_rotation
985 cpassert(do_rotation)
988 CALL timestop(handle)
1003 CHARACTER(len=*),
PARAMETER :: routinen =
'scf_env_cleanup'
1007 CALL timeset(routinen, handle)
1012 IF (
ASSOCIATED(scf_env%scf_work1_red))
THEN
1015 IF (
ASSOCIATED(scf_env%scf_work2))
THEN
1017 DEALLOCATE (scf_env%scf_work2)
1018 NULLIFY (scf_env%scf_work2)
1020 IF (
ASSOCIATED(scf_env%scf_work2_red))
THEN
1022 DEALLOCATE (scf_env%scf_work2_red)
1023 NULLIFY (scf_env%scf_work2_red)
1025 IF (
ASSOCIATED(scf_env%ortho))
THEN
1027 DEALLOCATE (scf_env%ortho)
1028 NULLIFY (scf_env%ortho)
1030 IF (
ASSOCIATED(scf_env%ortho_red))
THEN
1032 DEALLOCATE (scf_env%ortho_red)
1033 NULLIFY (scf_env%ortho_red)
1035 IF (
ASSOCIATED(scf_env%ortho_m1))
THEN
1037 DEALLOCATE (scf_env%ortho_m1)
1038 NULLIFY (scf_env%ortho_m1)
1040 IF (
ASSOCIATED(scf_env%ortho_m1_red))
THEN
1042 DEALLOCATE (scf_env%ortho_m1_red)
1043 NULLIFY (scf_env%ortho_m1_red)
1046 IF (
ASSOCIATED(scf_env%ortho_dbcsr))
THEN
1049 IF (
ASSOCIATED(scf_env%buf1_dbcsr))
THEN
1052 IF (
ASSOCIATED(scf_env%buf2_dbcsr))
THEN
1056 IF (
ASSOCIATED(scf_env%p_mix_new))
THEN
1060 IF (
ASSOCIATED(scf_env%p_delta))
THEN
1065 SELECT CASE (scf_env%method)
1082 cpabort(
"unknown scf method method:"//
cp_to_string(scf_env%method))
1085 IF (
ASSOCIATED(scf_env%outer_scf%variables))
THEN
1086 DEALLOCATE (scf_env%outer_scf%variables)
1088 IF (
ASSOCIATED(scf_env%outer_scf%count))
THEN
1089 DEALLOCATE (scf_env%outer_scf%count)
1091 IF (
ASSOCIATED(scf_env%outer_scf%gradient))
THEN
1092 DEALLOCATE (scf_env%outer_scf%gradient)
1094 IF (
ASSOCIATED(scf_env%outer_scf%energy))
THEN
1095 DEALLOCATE (scf_env%outer_scf%energy)
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)
1102 CALL timestop(handle)
1116 LOGICAL,
INTENT(OUT) :: should_stop
1118 CHARACTER(len=*),
PARAMETER :: routinen =
'cdft_scf'
1120 INTEGER :: handle, iatom, ispin, ivar, nmo, nvar, &
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
1128 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_s, rho_ao
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)
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)
1150 CALL timeset(routinen//
"_loop", handle)
1154 extension=
".scfLog")
1155 first_iteration = .true.
1157 cdft_control => dft_control%qs_control%cdft_control
1159 scf_env%outer_scf%iter_count = 0
1160 cdft_control%total_steps = 0
1163 IF (output_unit > 0)
THEN
1164 WRITE (unit=output_unit, fmt=
"(/,/,T2,A)") &
1165 "CDFT EXTERNAL SCF WAVEFUNCTION OPTIMIZATION"
1168 IF (cdft_control%reuse_precond)
THEN
1169 reuse_precond = .false.
1170 cdft_control%nreused = 0
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)
1179 IF (cdft_control%reuse_precond)
THEN
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
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
1192 reuse_precond = .false.
1193 cdft_control%nreused = 0
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.
1209 first_iteration = .false.
1213 cdft_loop_converged, exit_cdft_loop)
1215 energy, cdft_control%total_steps, &
1216 should_stop, cdft_loop_converged, cdft_loop=.true.)
1217 IF (exit_cdft_loop)
EXIT cdft_outer_loop
1219 CALL qs_calculate_inverse_jacobian(qs_env)
1221 CALL qs_cdft_line_search(qs_env)
1226 END DO cdft_outer_loop
1228 cdft_control%ienergy = cdft_control%ienergy + 1
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)
1235 ALLOCATE (cdft_control%wmat(nvar))
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)
1248 CALL dbcsr_copy(cdft_control%matrix_s%matrix, matrix_s(1)%matrix, &
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")
1258 cdft_control%mo_coeff(ispin))
1261 IF (cdft_control%calculate_metric)
THEN
1264 ALLOCATE (cdft_control%matrix_p(dft_control%nspins))
1265 DO ispin = 1, dft_control%nspins
1266 NULLIFY (cdft_control%matrix_p(ispin)%matrix)
1268 CALL dbcsr_copy(cdft_control%matrix_p(ispin)%matrix, rho_ao(ispin)%matrix, &
1269 name=
"DENSITY MATRIX")
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
1278 IF (.NOT. uniform_occupation)
THEN
1279 ALLOCATE (cdft_control%occupations(dft_control%nspins))
1280 DO ispin = 1, dft_control%nspins
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)
1293 IF (.NOT. (cdft_control%save_pot .OR. cdft_control%transfer_pot))
THEN
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)
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))
1304 DEALLOCATE (cdft_control%charge)
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)
1311 DEALLOCATE (cdft_control%becke_control%cavity_mat)
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)
1318 IF (
ASSOCIATED(cdft_control%charges_fragment))
DEALLOCATE (cdft_control%charges_fragment)
1319 cdft_control%need_pot = .true.
1320 cdft_control%external_control = .false.
1323 CALL timestop(handle)
1334 SUBROUTINE cdft_control_cleanup(cdft_control)
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)
1349 END SUBROUTINE cdft_control_cleanup
1357 SUBROUTINE qs_calculate_inverse_jacobian(qs_env)
1360 CHARACTER(LEN=*),
PARAMETER :: routinen =
'qs_calculate_inverse_jacobian'
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, &
1367 LOGICAL :: converged, explicit_jacobian, &
1368 should_build, should_stop, &
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
1378 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: rho_ao_kp
1380 TYPE(
mo_set_type),
ALLOCATABLE,
DIMENSION(:) :: mos_stashed
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)
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
1404 IF (.NOT.
ASSOCIATED(scf_control%outer_scf%cdft_opt_control))
RETURN
1406 CALL timeset(routinen, handle)
1408 IF (scf_control%outer_scf%cdft_opt_control%jacobian_restart)
THEN
1410 should_build = .false.
1413 IF (should_build)
THEN
1414 scf_env%outer_scf%deallocate_jacobian = .false.
1416 IF (explicit_jacobian)
THEN
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.")
1424 project_name = logger%iter_info%project_name
1425 CALL create_tmp_logger(para_env, project_name,
"-JacobianInfo.out", output_unit, tmp_logger)
1427 nspins = dft_control%nspins
1428 ALLOCATE (mos_stashed(nspins))
1429 DO ispin = 1, nspins
1433 p_rmpv => rho_ao_kp(:, 1)
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))
1443 nsteps = cdft_control%total_steps
1446 twork = pwork - nwork
1448 jacobian(i, :) = coeff(0)*scf_env%outer_scf%gradient(i, iter_count)
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)")
" #####################################"
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)")
" #####################################"
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)
1473 step_size = scf_control%outer_scf%cdft_opt_control%jacobian_step(i)
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
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)
1485 scf_env%outer_scf%iter_count = scf_env%outer_scf%iter_count + 1
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
1493 jacobian(j, i) = jacobian(j, i) + coeff(iwork)*scf_env%outer_scf%gradient(j, iter_count + 1)
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
1504 p_rmpv(ispin)%matrix)
1515 jacobian(i, j) = jacobian(i, j)/dh(j)
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
1522 scf_control%outer_scf%cdft_opt_control%broyden_update = .false.
1524 DO ispin = 1, nspins
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 =================================="
1538 IF (
ASSOCIATED(scf_env%outer_scf%inv_jacobian) .AND. para_env%is_source())
THEN
1543 scf_control%outer_scf%cdft_opt_control%ijacobian(1) = scf_control%outer_scf%cdft_opt_control%ijacobian(1) + 1
1544 CALL timestop(handle)
1546 END SUBROUTINE qs_calculate_inverse_jacobian
1556 SUBROUTINE qs_cdft_line_search(qs_env)
1559 CHARACTER(LEN=*),
PARAMETER :: routinen =
'qs_cdft_line_search'
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
1575 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: rho_ao_kp
1585 CALL timeset(routinen, handle)
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)
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)
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.
1618 IF (do_linesearch)
THEN
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
1631 project_name = logger%iter_info%project_name
1632 CALL create_tmp_logger(para_env, project_name,
"-LineSearch.out", output_unit, tmp_logger)
1634 nspins = dft_control%nspins
1635 ALLOCATE (mos_stashed(nspins))
1636 DO ispin = 1, nspins
1640 p_rmpv => rho_ao_kp(:, 1)
1641 nsteps = cdft_control%total_steps
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.
1656 IF (scf_control%outer_scf%cdft_opt_control%broyden_update)
THEN
1659 scf_env%outer_scf%variables(:, iter_count + 1) = 0
1660 scf_control%outer_scf%cdft_opt_control%broyden_update = .false.
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"
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
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)")
" #####################################"
1689 inv_jacobian => scf_env%outer_scf%inv_jacobian
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))
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)
1701 scf_env%outer_scf%iter_count = scf_env%outer_scf%iter_count + 1
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
1708 IF (continue_ls .AND. .NOT.
ALLOCATED(positive_sign))
THEN
1709 ALLOCATE (positive_sign(nvar))
1711 positive_sign(ispin) = scf_env%outer_scf%gradient(ispin, iter_count + 1) >= 0.0_dp
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
1719 IF (.NOT. continue_ls)
THEN
1720 should_exit = .true.
1724 IF (found_solution)
THEN
1726 IF (dnrm2(nvar, scf_env%outer_scf%gradient(:, iter_count + 1), 1) > norm_ls)
THEN
1728 continue_ls_exit = .true.
1732 IF (.NOT. continue_ls_exit)
THEN
1733 should_exit = .false.
1735 found_solution = .true.
1736 norm_ls = dnrm2(nvar, scf_env%outer_scf%gradient(:, iter_count + 1), 1)
1739 sign_changed = .true.
1741 sign_changed = sign_changed .AND. (positive_sign(ispin) .NEQV. &
1742 scf_env%outer_scf%gradient(ispin, iter_count + 1) >= 0.0_dp)
1744 IF (.NOT.
ALLOCATED(mos_ls))
THEN
1745 ALLOCATE (mos_ls(nspins))
1747 DO ispin = 1, nspins
1751 DO ispin = 1, nspins
1754 alpha = alpha*factor
1756 IF (i == max_linesearch) continue_ls_exit = .true.
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.
1762 IF (sign_changed) continue_ls_exit = .true.
1767 should_exit = .false.
1769 alpha = alpha*factor
1771 IF (continue_ls_exit)
THEN
1774 DO ispin = 1, nspins
1778 p_rmpv(ispin)%matrix)
1784 should_exit = .true.
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)
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
1798 IF (should_exit)
EXIT
1800 cdft_control%total_steps = nsteps
1801 DO ispin = 1, nspins
1805 p_rmpv(ispin)%matrix)
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
1816 IF (reached_maxls) &
1817 CALL cp_warn(__location__, &
1818 "Line search did not converge. CDFT SCF proceeds with lasted iterated step size.")
1822 DO ispin = 1, nspins
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 =================================="
1835 CALL timestop(handle)
1837 END SUBROUTINE qs_cdft_line_search
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.
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.
represent a full matrix distributed on many processors
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.
Defines the basic variable types.
integer, parameter, public dp
integer, parameter, public default_string_length
integer, parameter, public default_path_length
Restart file for k point calculations.
subroutine, public write_kpoints_restart(denmat, kpoints, scf_env, dft_section, particle_set, qs_kind_set)
...
Types and basic routines needed for a kpoint calculation.
Machine interface based on Fortran 2003 and POSIX.
subroutine, public m_flush(lunit)
flushes units if the &GLOBAL flag is set accordingly
real(kind=dp) function, public m_walltime()
returns time from a real-time clock, protected against rolling early/easily
Collection of simple mathematical functions and subroutines.
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...
pure subroutine, public qs_diis_b_clear(diis_buffer)
clears the buffer
subroutine, public qs_diis_b_create(diis_buffer, nbuffer)
Allocates an SCF DIIS buffer.
subroutine, public qs_diis_b_create_kp(diis_buffer, nbuffer)
Allocates an SCF DIIS buffer for k-points.
pure subroutine, public qs_diis_b_clear_kp(diis_buffer)
clears the buffer
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.
subroutine, public write_mo_set_to_restart(mo_array, particle_set, dft_section, qs_kind_set, matrix_ks)
...
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.
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.
subroutine, public ot_scf_read_input(qs_ot_env, scf_section)
...
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.
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...
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.
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,...
subroutine, public scf(qs_env, has_converged, total_scf_steps)
perform an scf procedure in the given qs_env
subroutine, public scf_env_cleanup(scf_env)
perform cleanup operations (like releasing temporary storage) at the end of the scf
subroutine, public scf_env_do_scf(scf_env, scf_control, qs_env, converged, should_stop, total_scf_steps)
perform an scf loop
subroutine, public cdft_scf(qs_env, should_stop)
perform a CDFT scf procedure in the given qs_env
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
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...
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.
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.