178#include "./base/base_uses.f90"
184 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_scf'
185 LOGICAL,
PRIVATE :: reuse_precond = .false.
186 LOGICAL,
PRIVATE :: used_history = .false.
202 SUBROUTINE scf(qs_env, has_converged, total_scf_steps)
204 LOGICAL,
INTENT(OUT),
OPTIONAL :: has_converged
205 INTEGER,
INTENT(OUT),
OPTIONAL :: total_scf_steps
207 INTEGER :: ihistory, max_scf_tmp, tsteps
208 LOGICAL :: converged, outer_scf_loop, should_stop
209 LOGICAL,
SAVE :: first_step_flag = .true.
210 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: gradient_history, variable_history
219 cpassert(
ASSOCIATED(qs_env))
220 IF (
PRESENT(has_converged))
THEN
221 has_converged = .false.
223 IF (
PRESENT(total_scf_steps))
THEN
226 CALL get_qs_env(qs_env, scf_env=scf_env, input=input, &
227 dft_control=dft_control, scf_control=scf_control)
228 IF (scf_control%max_scf > 0)
THEN
233 IF (.NOT.
ASSOCIATED(scf_env))
THEN
241 IF ((scf_control%density_guess .EQ.
history_guess) .AND. (first_step_flag))
THEN
242 max_scf_tmp = scf_control%max_scf
243 scf_control%max_scf = 1
244 outer_scf_loop = scf_control%outer_scf%have_scf
245 scf_control%outer_scf%have_scf = .false.
248 IF (.NOT. dft_control%qs_control%cdft)
THEN
249 CALL scf_env_do_scf(scf_env=scf_env, scf_control=scf_control, qs_env=qs_env, &
250 converged=converged, should_stop=should_stop, total_scf_steps=tsteps)
253 CALL cdft_scf(qs_env=qs_env, should_stop=should_stop)
257 IF (
ASSOCIATED(qs_env%mp2_env)) qs_env%mp2_env%hf_fail = .NOT. converged
260 IF (scf_control%outer_scf%have_scf)
THEN
261 ihistory = scf_env%outer_scf%iter_count
262 CALL get_qs_env(qs_env, gradient_history=gradient_history, &
263 variable_history=variable_history)
265 gradient_history(:, 1) = gradient_history(:, 2)
266 gradient_history(:, 2) = scf_env%outer_scf%gradient(:, ihistory)
267 variable_history(:, 1) = variable_history(:, 2)
268 variable_history(:, 2) = scf_env%outer_scf%variables(:, ihistory)
270 IF (used_history) used_history = .false.
272 IF (
ASSOCIATED(scf_env%outer_scf%inv_jacobian))
THEN
273 scf_control%outer_scf%cdft_opt_control%ijacobian(2) = scf_control%outer_scf%cdft_opt_control%ijacobian(2) + 1
274 IF (scf_control%outer_scf%cdft_opt_control%ijacobian(2) .GE. &
275 scf_control%outer_scf%cdft_opt_control%jacobian_freq(2) .AND. &
276 scf_control%outer_scf%cdft_opt_control%jacobian_freq(2) > 0) &
277 scf_env%outer_scf%deallocate_jacobian = .true.
281 IF ((
ASSOCIATED(qs_env%wf_history)) .AND. &
283 (.NOT. first_step_flag)))
THEN
284 IF (.NOT. dft_control%qs_control%cdft)
THEN
285 CALL wfi_update(qs_env%wf_history, qs_env=qs_env, dt=1.0_dp)
287 IF (dft_control%qs_control%cdft_control%should_purge)
THEN
290 dft_control%qs_control%cdft_control%should_purge = .false.
292 CALL wfi_update(qs_env%wf_history, qs_env=qs_env, dt=1.0_dp)
295 ELSE IF ((scf_control%density_guess .EQ.
history_guess) .AND. &
296 (first_step_flag))
THEN
297 scf_control%max_scf = max_scf_tmp
298 scf_control%outer_scf%have_scf = outer_scf_loop
299 first_step_flag = .false.
306 IF (.NOT. (should_stop))
THEN
315 IF (dft_control%qs_control%cdft) &
316 CALL cdft_control_cleanup(dft_control%qs_control%cdft_control)
318 IF (
PRESENT(has_converged))
THEN
319 has_converged = converged
321 IF (
PRESENT(total_scf_steps))
THEN
322 total_scf_steps = tsteps
346 SUBROUTINE scf_env_do_scf(scf_env, scf_control, qs_env, converged, should_stop, total_scf_steps)
351 LOGICAL,
INTENT(OUT) :: converged, should_stop
352 INTEGER,
INTENT(OUT) :: total_scf_steps
354 CHARACTER(LEN=*),
PARAMETER :: routinen =
'scf_env_do_scf'
356 CHARACTER(LEN=default_string_length) :: description, name
357 INTEGER :: ext_master_id, handle, handle2, i_tmp, &
358 ic, ispin, iter_count, output_unit, &
359 scf_energy_message_tag, total_steps
360 LOGICAL :: diis_step, do_kpoints, energy_only, exit_inner_loop, exit_outer_loop, &
361 inner_loop_converged, just_energy, outer_loop_converged
362 REAL(kind=
dp) :: t1, t2
363 REAL(kind=
dp),
DIMENSION(3) :: res_val_3
368 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: rho_ao_kp
372 TYPE(
mo_set_type),
DIMENSION(:),
POINTER :: mos, mos_last_converged
379 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
384 CALL timeset(routinen, handle)
386 NULLIFY (dft_control, rho, energy, &
387 logger, qs_charges, ks_env, mos, atomic_kind_set, qs_kind_set, &
388 particle_set, dft_section, input, &
389 scf_section, para_env, results, kpoints, pw_env, rho_ao_kp, mos_last_converged)
391 cpassert(
ASSOCIATED(scf_env))
392 cpassert(
ASSOCIATED(qs_env))
399 particle_set=particle_set, &
400 qs_charges=qs_charges, &
402 atomic_kind_set=atomic_kind_set, &
403 qs_kind_set=qs_kind_set, &
407 dft_control=dft_control, &
408 do_kpoints=do_kpoints, &
422 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
"(/,/,T2,A)") &
423 "SCF WAVEFUNCTION OPTIMIZATION"
426 IF (dft_control%switch_surf_dip)
THEN
427 CALL get_qs_env(qs_env, mos_last_converged=mos_last_converged)
428 DO ispin = 1, dft_control%nspins
431 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
"(/,/,T2,A)") &
432 "COPIED mos_last_converged ---> mos"
435 IF ((output_unit > 0) .AND. (.NOT. scf_control%use_ot))
THEN
436 WRITE (unit=output_unit, &
437 fmt=
"(/,T3,A,T12,A,T31,A,T39,A,T59,A,T75,A,/,T3,A)") &
438 "Step",
"Update method",
"Time",
"Convergence",
"Total energy",
"Change", &
444 res_val_3(:) = -1.0_dp
445 description =
"[EXT_SCF_ENER_COMM]"
447 CALL get_results(results, description=description, &
448 values=res_val_3, n_entries=i_tmp)
449 cpassert(i_tmp .EQ. 3)
450 IF (all(res_val_3(:) .LE. 0.0)) &
451 CALL cp_abort(__location__, &
452 " Trying to access result ("//trim(description)// &
453 ") which is not correctly stored.")
454 CALL external_comm%set_handle(nint(res_val_3(1)))
456 ext_master_id = nint(res_val_3(2))
457 scf_energy_message_tag = nint(res_val_3(3))
461 scf_env%outer_scf%iter_count = 0
464 energy%tot_old = 0.0_dp
469 scf_section=scf_section)
472 energy_only, just_energy, exit_inner_loop)
475 dft_control%surf_dip_correct_switch = dft_control%correct_surf_dip
476 IF ((dft_control%correct_surf_dip) .AND. (scf_control%outer_scf%have_scf) .AND. &
477 (scf_env%outer_scf%iter_count > floor(scf_control%outer_scf%max_scf/2.0_dp)))
THEN
478 IF (dft_control%switch_surf_dip)
THEN
479 dft_control%surf_dip_correct_switch = .false.
480 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
"(/,/,T2,A)") &
481 "SURFACE DIPOLE CORRECTION switched off"
487 CALL timeset(routinen//
"_inner_loop", handle2)
489 IF (.NOT. just_energy) scf_env%iter_count = scf_env%iter_count + 1
490 iter_count = iter_count + 1
491 CALL cp_iterate(logger%iter_info, last=.false., iter_nr=iter_count)
493 IF (output_unit > 0)
CALL m_flush(output_unit)
495 total_steps = total_steps + 1
496 just_energy = energy_only
499 calculate_forces=.false.)
506 IF (dft_control%hairy_probes .EQV. .true.)
THEN
507 scf_control%smear%do_smear = .false.
508 CALL qs_scf_new_mos_kp(qs_env, scf_env, scf_control, diis_step, dft_control%probe)
514 IF (dft_control%hairy_probes .EQV. .true.)
THEN
515 scf_control%smear%do_smear = .false.
516 CALL qs_scf_new_mos(qs_env, scf_env, scf_control, scf_section, diis_step, energy_only, &
519 CALL qs_scf_new_mos(qs_env, scf_env, scf_control, scf_section, diis_step, energy_only)
526 IF (dft_control%qs_control%xtb_control%do_tblite)
THEN
538 IF (.NOT. just_energy) energy%tot_old = energy%total
541 IF (scf_energy_message_tag .GT. 0)
THEN
542 CALL external_comm%send(energy%total, ext_master_id, scf_energy_message_tag)
546 exit_inner_loop, inner_loop_converged, output_unit)
550 IF (exit_inner_loop)
THEN
555 outer_loop_converged, exit_outer_loop)
558 IF (exit_outer_loop)
CALL cp_iterate(logger%iter_info, last=.true., iter_nr=iter_count)
568 CALL get_ks_env(ks_env=ks_env, matrix_ks=matrix_ks)
578 IF (exit_inner_loop)
THEN
579 CALL timestop(handle2)
584 scf_section,
"PRINT%ITERATION_INFO/TIME_CUMUL"),
cp_p_file)) &
588 IF (scf_env%mixing_method > 0)
THEN
589 DO ic = 1,
SIZE(rho_ao_kp, 2)
590 DO ispin = 1, dft_control%nspins
592 CALL dbcsr_copy(rho_ao_kp(ispin, ic)%matrix, scf_env%p_mix_new(ispin, ic)%matrix, name=name)
600 CALL timestop(handle2)
604 IF (.NOT. scf_control%outer_scf%have_scf)
EXIT scf_outer_loop
608 energy, total_steps, should_stop, outer_loop_converged)
611 IF (exit_outer_loop)
THEN
612 IF ((dft_control%switch_surf_dip) .AND. (outer_loop_converged) .AND. &
613 (dft_control%surf_dip_correct_switch))
THEN
614 DO ispin = 1, dft_control%nspins
617 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
"(/,/,T2,A)") &
618 "COPIED mos ---> mos_last_converged"
622 IF (exit_outer_loop)
EXIT scf_outer_loop
629 END DO scf_outer_loop
631 converged = inner_loop_converged .AND. outer_loop_converged
632 total_scf_steps = total_steps
634 IF (dft_control%qs_control%cdft) &
635 dft_control%qs_control%cdft_control%total_steps = &
636 dft_control%qs_control%cdft_control%total_steps + total_steps
638 IF (.NOT. converged)
THEN
639 IF (scf_control%ignore_convergence_failure .OR. should_stop)
THEN
640 CALL cp_warn(__location__,
"SCF run NOT converged")
642 CALL cp_abort(__location__, &
643 "SCF run NOT converged. To continue the calculation "// &
644 "regardless, please set the keyword IGNORE_CONVERGENCE_FAILURE.")
649 IF (qs_env%energy_correction)
THEN
651 ec_env%do_skip = .false.
652 IF (ec_env%skip_ec .AND. .NOT. converged) ec_env%do_skip = .true.
656 DO ispin = 1,
SIZE(mos)
657 IF (mos(ispin)%use_mo_coeff_b)
THEN
658 IF (.NOT.
ASSOCIATED(mos(ispin)%mo_coeff_b)) &
659 cpabort(
"mo_coeff_b is not allocated")
666 CALL timestop(handle)
686 CHARACTER(LEN=*),
PARAMETER :: routinen =
'init_scf_loop'
688 INTEGER :: handle, ispin, nmo, number_of_ot_envs
689 LOGICAL :: do_kpoints, do_rotation, &
690 has_unit_metric, is_full_all
692 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks, matrix_s
693 TYPE(
dbcsr_type),
POINTER :: orthogonality_metric
699 CALL timeset(routinen, handle)
701 NULLIFY (scf_control, matrix_s, matrix_ks, dft_control, mos, mo_coeff, kpoints)
703 cpassert(
ASSOCIATED(scf_env))
704 cpassert(
ASSOCIATED(qs_env))
707 scf_control=scf_control, &
708 dft_control=dft_control, &
709 do_kpoints=do_kpoints, &
714 DO ispin = 1,
SIZE(mos)
715 IF (mos(1)%use_mo_coeff_b)
THEN
721 DO ispin = 1, dft_control%nspins
723 IF (.NOT. scf_control%diagonalization%mom)
THEN
726 IF (dft_control%hairy_probes .EQV. .true.)
THEN
727 IF (scf_env%outer_scf%iter_count > 0)
THEN
728 scf_control%smear%do_smear = .false.
730 smear=scf_control%smear, &
731 probe=dft_control%probe)
735 smear=scf_control%smear)
740 SELECT CASE (scf_env%method)
743 cpabort(
"unknown scf method method:"//
cp_to_string(scf_env%method))
747 IF (.NOT. scf_env%skip_diis)
THEN
748 IF (.NOT.
ASSOCIATED(scf_env%scf_diis_buffer))
THEN
749 ALLOCATE (scf_env%scf_diis_buffer)
750 CALL qs_diis_b_create(scf_env%scf_diis_buffer, nbuffer=scf_control%max_diis)
756 IF (.NOT. scf_env%skip_diis)
THEN
758 IF (.NOT.
ASSOCIATED(kpoints%scf_diis_buffer))
THEN
759 ALLOCATE (kpoints%scf_diis_buffer)
764 IF (.NOT.
ASSOCIATED(scf_env%scf_diis_buffer))
THEN
765 ALLOCATE (scf_env%scf_diis_buffer)
766 CALL qs_diis_b_create(scf_env%scf_diis_buffer, nbuffer=scf_control%max_diis)
773 CALL get_qs_env(qs_env, matrix_ks=matrix_ks, matrix_s=matrix_s)
775 IF (.NOT. scf_env%skip_diis)
THEN
776 IF (.NOT.
ASSOCIATED(scf_env%scf_diis_buffer))
THEN
777 ALLOCATE (scf_env%scf_diis_buffer)
778 CALL qs_diis_b_create(scf_env%scf_diis_buffer, nbuffer=scf_control%max_diis)
784 IF (dft_control%qs_control%dftb .OR. &
785 dft_control%qs_control%xtb .OR. &
786 dft_control%qs_control%semi_empirical)
THEN
787 cpabort(
"DFTB and SE not available with OT/DIAG")
793 scf_control%diagonalization%ot_settings%preconditioner_type, &
797 scf_control%diagonalization%ot_settings%preconditioner_type, &
798 scf_control%diagonalization%ot_settings%precond_solver_type, &
799 scf_control%diagonalization%ot_settings%energy_gap, dft_control%nspins)
805 has_unit_metric=has_unit_metric, &
813 IF (scf_control%do_outer_scf_reortho)
THEN
814 IF (scf_control%outer_scf%have_scf .AND. .NOT. dft_control%restricted)
THEN
815 IF (scf_env%outer_scf%iter_count > 0)
THEN
816 DO ispin = 1, dft_control%nspins
817 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, nmo=nmo)
818 IF (has_unit_metric)
THEN
830 IF (.NOT.
ASSOCIATED(scf_env%qs_ot_env))
THEN
833 number_of_ot_envs = dft_control%nspins
834 IF (dft_control%restricted) number_of_ot_envs = 1
836 ALLOCATE (scf_env%qs_ot_env(number_of_ot_envs))
839 IF (scf_env%outer_scf%iter_count > 0)
THEN
840 IF (scf_env%iter_delta < scf_control%eps_diis)
THEN
841 scf_env%qs_ot_env(1)%settings%ot_state = 1
847 IF (scf_env%outer_scf%iter_count > 0)
THEN
848 IF (scf_env%qs_ot_env(1)%settings%ot_state == 1)
THEN
849 scf_control%max_scf = max(scf_env%qs_ot_env(1)%settings%max_scf_diis, &
855 IF (dft_control%restricted)
THEN
856 scf_env%qs_ot_env(1)%restricted = .true.
858 IF (.NOT. scf_env%qs_ot_env(1)%settings%do_rotation) &
859 CALL cp_abort(__location__, &
860 "Restricted calculation with OT requires orbital rotation. Please "// &
861 "activate the OT%ROTATION keyword!")
863 scf_env%qs_ot_env(:)%restricted = .false.
868 do_rotation = scf_env%qs_ot_env(1)%settings%do_rotation
871 IF (do_rotation .AND. is_full_all) &
872 cpabort(
'PRECONDITIONER FULL_ALL is not compatible with ROTATION.')
876 calculate_forces=.false.)
880 IF (.NOT. reuse_precond) &
882 scf_env%qs_ot_env(1)%settings%preconditioner_type, &
889 IF (has_unit_metric)
THEN
890 NULLIFY (orthogonality_metric)
892 orthogonality_metric => matrix_s(1)%matrix
895 IF (.NOT. reuse_precond) &
897 scf_env%qs_ot_env(1)%settings%preconditioner_type, &
898 scf_env%qs_ot_env(1)%settings%precond_solver_type, &
899 scf_env%qs_ot_env(1)%settings%energy_gap, dft_control%nspins, &
900 has_unit_metric=has_unit_metric, &
901 chol_type=scf_env%qs_ot_env(1)%settings%cholesky_type)
902 IF (reuse_precond) reuse_precond = .false.
904 CALL ot_scf_init(mo_array=mos, matrix_s=orthogonality_metric, &
905 broyden_adaptive_sigma=qs_env%broyden_adaptive_sigma, &
906 qs_ot_env=scf_env%qs_ot_env, matrix_ks=matrix_ks(1)%matrix)
908 SELECT CASE (scf_env%qs_ot_env(1)%settings%preconditioner_type)
911 DO ispin = 1,
SIZE(scf_env%qs_ot_env)
913 scf_env%ot_preconditioner(ispin)%preconditioner)
916 DO ispin = 1,
SIZE(scf_env%qs_ot_env)
918 scf_env%ot_preconditioner(1)%preconditioner)
921 DO ispin = 1,
SIZE(scf_env%qs_ot_env)
923 scf_env%ot_preconditioner(1)%preconditioner)
929 do_rotation = scf_env%qs_ot_env(1)%settings%do_rotation
930 DO ispin = 1,
SIZE(mos)
931 IF (.NOT. mos(ispin)%uniform_occupation)
THEN
932 cpassert(do_rotation)
938 IF (dft_control%low_spin_roks)
THEN
940 do_rotation = scf_env%qs_ot_env(1)%settings%do_rotation
941 cpassert(do_rotation)
944 CALL timestop(handle)
959 CHARACTER(len=*),
PARAMETER :: routinen =
'scf_env_cleanup'
963 CALL timeset(routinen, handle)
968 IF (
ASSOCIATED(scf_env%scf_work1_red))
THEN
971 IF (
ASSOCIATED(scf_env%scf_work2))
THEN
973 DEALLOCATE (scf_env%scf_work2)
974 NULLIFY (scf_env%scf_work2)
976 IF (
ASSOCIATED(scf_env%scf_work2_red))
THEN
978 DEALLOCATE (scf_env%scf_work2_red)
979 NULLIFY (scf_env%scf_work2_red)
981 IF (
ASSOCIATED(scf_env%ortho))
THEN
983 DEALLOCATE (scf_env%ortho)
984 NULLIFY (scf_env%ortho)
986 IF (
ASSOCIATED(scf_env%ortho_red))
THEN
988 DEALLOCATE (scf_env%ortho_red)
989 NULLIFY (scf_env%ortho_red)
991 IF (
ASSOCIATED(scf_env%ortho_m1))
THEN
993 DEALLOCATE (scf_env%ortho_m1)
994 NULLIFY (scf_env%ortho_m1)
996 IF (
ASSOCIATED(scf_env%ortho_m1_red))
THEN
998 DEALLOCATE (scf_env%ortho_m1_red)
999 NULLIFY (scf_env%ortho_m1_red)
1002 IF (
ASSOCIATED(scf_env%ortho_dbcsr))
THEN
1005 IF (
ASSOCIATED(scf_env%buf1_dbcsr))
THEN
1008 IF (
ASSOCIATED(scf_env%buf2_dbcsr))
THEN
1012 IF (
ASSOCIATED(scf_env%p_mix_new))
THEN
1016 IF (
ASSOCIATED(scf_env%p_delta))
THEN
1021 SELECT CASE (scf_env%method)
1038 cpabort(
"unknown scf method method:"//
cp_to_string(scf_env%method))
1041 IF (
ASSOCIATED(scf_env%outer_scf%variables))
THEN
1042 DEALLOCATE (scf_env%outer_scf%variables)
1044 IF (
ASSOCIATED(scf_env%outer_scf%count))
THEN
1045 DEALLOCATE (scf_env%outer_scf%count)
1047 IF (
ASSOCIATED(scf_env%outer_scf%gradient))
THEN
1048 DEALLOCATE (scf_env%outer_scf%gradient)
1050 IF (
ASSOCIATED(scf_env%outer_scf%energy))
THEN
1051 DEALLOCATE (scf_env%outer_scf%energy)
1053 IF (
ASSOCIATED(scf_env%outer_scf%inv_jacobian) .AND. &
1054 scf_env%outer_scf%deallocate_jacobian)
THEN
1055 DEALLOCATE (scf_env%outer_scf%inv_jacobian)
1058 CALL timestop(handle)
1072 LOGICAL,
INTENT(OUT) :: should_stop
1074 CHARACTER(len=*),
PARAMETER :: routinen =
'cdft_scf'
1076 INTEGER :: handle, iatom, ispin, ivar, nmo, nvar, &
1078 LOGICAL :: cdft_loop_converged, converged, &
1079 exit_cdft_loop, first_iteration, &
1080 my_uocc, uniform_occupation
1081 REAL(kind=
dp),
DIMENSION(:),
POINTER :: mo_occupations
1084 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_s, rho_ao
1096 NULLIFY (scf_env, ks_env, energy, rho, matrix_s, rho_ao, cdft_control, logger, &
1097 dft_control, pw_env, auxbas_pw_pool, energy, ks_env, scf_env, dft_section, &
1098 input, scf_section, scf_control, mos, mo_occupations)
1101 cpassert(
ASSOCIATED(qs_env))
1102 CALL get_qs_env(qs_env, scf_env=scf_env, energy=energy, &
1103 dft_control=dft_control, scf_control=scf_control, &
1104 ks_env=ks_env, input=input)
1106 CALL timeset(routinen//
"_loop", handle)
1110 extension=
".scfLog")
1111 first_iteration = .true.
1113 cdft_control => dft_control%qs_control%cdft_control
1115 scf_env%outer_scf%iter_count = 0
1116 cdft_control%total_steps = 0
1119 IF (output_unit > 0)
THEN
1120 WRITE (unit=output_unit, fmt=
"(/,/,T2,A)") &
1121 "CDFT EXTERNAL SCF WAVEFUNCTION OPTIMIZATION"
1124 IF (cdft_control%reuse_precond)
THEN
1125 reuse_precond = .false.
1126 cdft_control%nreused = 0
1132 CALL scf_env_do_scf(scf_env=scf_env, scf_control=scf_control, qs_env=qs_env, &
1133 converged=converged, should_stop=should_stop, total_scf_steps=tsteps)
1135 IF (cdft_control%reuse_precond)
THEN
1139 IF (scf_env%outer_scf%iter_count == 1 .AND. scf_env%iter_count == 1 &
1140 .AND. cdft_control%total_steps /= 1) &
1141 cdft_control%nreused = cdft_control%nreused - 1
1143 IF (scf_env%outer_scf%iter_count == 1 .AND. scf_env%iter_count .LE. cdft_control%precond_freq .AND. &
1144 cdft_control%total_steps /= 1 .AND. cdft_control%nreused .LT. cdft_control%max_reuse)
THEN
1145 reuse_precond = .true.
1146 cdft_control%nreused = cdft_control%nreused + 1
1148 reuse_precond = .false.
1149 cdft_control%nreused = 0
1153 IF (first_iteration .AND. cdft_control%purge_history)
THEN
1154 cdft_control%istep = cdft_control%istep + 1
1155 IF (scf_env%outer_scf%iter_count .GT. 1)
THEN
1156 cdft_control%nbad_conv = cdft_control%nbad_conv + 1
1157 IF (cdft_control%nbad_conv .GE. cdft_control%purge_freq .AND. &
1158 cdft_control%istep .GE. cdft_control%purge_offset)
THEN
1159 cdft_control%nbad_conv = 0
1160 cdft_control%istep = 0
1161 cdft_control%should_purge = .true.
1165 first_iteration = .false.
1169 cdft_loop_converged, exit_cdft_loop)
1171 energy, cdft_control%total_steps, &
1172 should_stop, cdft_loop_converged, cdft_loop=.true.)
1173 IF (exit_cdft_loop)
EXIT cdft_outer_loop
1175 CALL qs_calculate_inverse_jacobian(qs_env)
1177 CALL qs_cdft_line_search(qs_env)
1182 END DO cdft_outer_loop
1184 cdft_control%ienergy = cdft_control%ienergy + 1
1187 IF (cdft_control%do_et)
THEN
1188 CALL get_qs_env(qs_env=qs_env, matrix_s=matrix_s, mos=mos)
1189 nvar =
SIZE(cdft_control%target)
1191 ALLOCATE (cdft_control%wmat(nvar))
1194 CALL dbcsr_copy(cdft_control%wmat(ivar)%matrix, matrix_s(1)%matrix, &
1195 name=
"ET_RESTRAINT_MATRIX")
1196 CALL dbcsr_set(cdft_control%wmat(ivar)%matrix, 0.0_dp)
1197 CALL integrate_v_rspace(cdft_control%group(ivar)%weight, &
1198 hmat=cdft_control%wmat(ivar), qs_env=qs_env, &
1199 calculate_forces=.false., &
1200 gapw=dft_control%qs_control%gapw)
1204 CALL dbcsr_copy(cdft_control%matrix_s%matrix, matrix_s(1)%matrix, &
1207 NULLIFY (cdft_control%mo_coeff)
1208 ALLOCATE (cdft_control%mo_coeff(dft_control%nspins))
1209 DO ispin = 1, dft_control%nspins
1210 CALL cp_fm_create(matrix=cdft_control%mo_coeff(ispin), &
1211 matrix_struct=qs_env%mos(ispin)%mo_coeff%matrix_struct, &
1212 name=
"MO_COEFF_A"//trim(adjustl(
cp_to_string(ispin)))//
"MATRIX")
1214 cdft_control%mo_coeff(ispin))
1217 IF (cdft_control%calculate_metric)
THEN
1220 ALLOCATE (cdft_control%matrix_p(dft_control%nspins))
1221 DO ispin = 1, dft_control%nspins
1222 NULLIFY (cdft_control%matrix_p(ispin)%matrix)
1224 CALL dbcsr_copy(cdft_control%matrix_p(ispin)%matrix, rho_ao(ispin)%matrix, &
1225 name=
"DENSITY MATRIX")
1229 uniform_occupation = .true.
1230 DO ispin = 1, dft_control%nspins
1231 CALL get_mo_set(mo_set=mos(ispin), uniform_occupation=my_uocc)
1232 uniform_occupation = uniform_occupation .AND. my_uocc
1234 IF (.NOT. uniform_occupation)
THEN
1235 ALLOCATE (cdft_control%occupations(dft_control%nspins))
1236 DO ispin = 1, dft_control%nspins
1239 occupation_numbers=mo_occupations)
1240 ALLOCATE (cdft_control%occupations(ispin)%array(nmo))
1241 cdft_control%occupations(ispin)%array(1:nmo) = mo_occupations(1:nmo)
1249 IF (.NOT. (cdft_control%save_pot .OR. cdft_control%transfer_pot))
THEN
1251 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
1252 DO iatom = 1,
SIZE(cdft_control%group)
1253 CALL auxbas_pw_pool%give_back_pw(cdft_control%group(iatom)%weight)
1254 DEALLOCATE (cdft_control%group(iatom)%weight)
1256 IF (cdft_control%atomic_charges)
THEN
1257 DO iatom = 1, cdft_control%natoms
1258 CALL auxbas_pw_pool%give_back_pw(cdft_control%charge(iatom))
1260 DEALLOCATE (cdft_control%charge)
1263 cdft_control%becke_control%cavity_confine)
THEN
1264 IF (.NOT.
ASSOCIATED(cdft_control%becke_control%cavity_mat))
THEN
1265 CALL auxbas_pw_pool%give_back_pw(cdft_control%becke_control%cavity)
1267 DEALLOCATE (cdft_control%becke_control%cavity_mat)
1270 IF (
ASSOCIATED(cdft_control%hirshfeld_control%hirshfeld_env%fnorm))
THEN
1271 CALL auxbas_pw_pool%give_back_pw(cdft_control%hirshfeld_control%hirshfeld_env%fnorm)
1274 IF (
ASSOCIATED(cdft_control%charges_fragment))
DEALLOCATE (cdft_control%charges_fragment)
1275 cdft_control%need_pot = .true.
1276 cdft_control%external_control = .false.
1279 CALL timestop(handle)
1290 SUBROUTINE cdft_control_cleanup(cdft_control)
1293 IF (
ASSOCIATED(cdft_control%constraint%variables)) &
1294 DEALLOCATE (cdft_control%constraint%variables)
1295 IF (
ASSOCIATED(cdft_control%constraint%count)) &
1296 DEALLOCATE (cdft_control%constraint%count)
1297 IF (
ASSOCIATED(cdft_control%constraint%gradient)) &
1298 DEALLOCATE (cdft_control%constraint%gradient)
1299 IF (
ASSOCIATED(cdft_control%constraint%energy)) &
1300 DEALLOCATE (cdft_control%constraint%energy)
1301 IF (
ASSOCIATED(cdft_control%constraint%inv_jacobian) .AND. &
1302 cdft_control%constraint%deallocate_jacobian) &
1303 DEALLOCATE (cdft_control%constraint%inv_jacobian)
1305 END SUBROUTINE cdft_control_cleanup
1313 SUBROUTINE qs_calculate_inverse_jacobian(qs_env)
1316 CHARACTER(LEN=*),
PARAMETER :: routinen =
'qs_calculate_inverse_jacobian'
1318 CHARACTER(len=default_path_length) :: project_name
1319 INTEGER :: counter, handle, i, ispin, iter_count, &
1320 iwork, j, max_scf, nspins, nsteps, &
1321 nvar, nwork, output_unit, pwork, &
1323 LOGICAL :: converged, explicit_jacobian, &
1324 should_build, should_stop, &
1326 REAL(kind=
dp) :: inv_error, step_size
1327 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: coeff, dh, step_multiplier
1328 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: jacobian
1329 REAL(kind=
dp),
DIMENSION(:),
POINTER :: energy
1330 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: gradient, inv_jacobian
1334 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: rho_ao_kp
1336 TYPE(
mo_set_type),
ALLOCATABLE,
DIMENSION(:) :: mos_stashed
1345 NULLIFY (energy, gradient, p_rmpv, rho_ao_kp, mos, rho, &
1346 ks_env, scf_env, scf_control, dft_control, cdft_control, &
1347 inv_jacobian, para_env, tmp_logger, energy_qs)
1350 cpassert(
ASSOCIATED(qs_env))
1351 CALL get_qs_env(qs_env, scf_env=scf_env, ks_env=ks_env, &
1352 scf_control=scf_control, mos=mos, rho=rho, &
1353 dft_control=dft_control, &
1354 para_env=para_env, energy=energy_qs)
1355 explicit_jacobian = .false.
1356 should_build = .false.
1357 use_md_history = .false.
1358 iter_count = scf_env%outer_scf%iter_count
1360 IF (.NOT.
ASSOCIATED(scf_control%outer_scf%cdft_opt_control))
RETURN
1362 CALL timeset(routinen, handle)
1364 IF (scf_control%outer_scf%cdft_opt_control%jacobian_restart)
THEN
1366 should_build = .false.
1369 IF (should_build)
THEN
1370 scf_env%outer_scf%deallocate_jacobian = .false.
1372 IF (explicit_jacobian)
THEN
1374 cdft_control => dft_control%qs_control%cdft_control
1375 IF (.NOT.
ASSOCIATED(cdft_control)) &
1376 CALL cp_abort(__location__, &
1377 "Optimizers that need the explicit Jacobian can"// &
1378 " only be used together with a valid CDFT constraint.")
1380 project_name = logger%iter_info%project_name
1381 CALL create_tmp_logger(para_env, project_name,
"-JacobianInfo.out", output_unit, tmp_logger)
1383 nspins = dft_control%nspins
1384 ALLOCATE (mos_stashed(nspins))
1385 DO ispin = 1, nspins
1389 p_rmpv => rho_ao_kp(:, 1)
1391 nvar =
SIZE(scf_env%outer_scf%variables, 1)
1392 max_scf = scf_control%outer_scf%max_scf + 1
1393 ALLOCATE (gradient(nvar, max_scf))
1394 gradient = scf_env%outer_scf%gradient
1395 ALLOCATE (energy(max_scf))
1396 energy = scf_env%outer_scf%energy
1397 ALLOCATE (jacobian(nvar, nvar))
1399 nsteps = cdft_control%total_steps
1402 twork = pwork - nwork
1404 jacobian(i, :) = coeff(0)*scf_env%outer_scf%gradient(i, iter_count)
1409 IF (output_unit > 0)
THEN
1410 WRITE (output_unit, fmt=
"(A)")
" "
1411 WRITE (output_unit, fmt=
"(A)")
" #####################################"
1412 WRITE (output_unit,
'(A,I3,A,I3,A)') &
1413 " ### Constraint ", i,
" of ", nvar,
" ###"
1414 WRITE (output_unit, fmt=
"(A)")
" #####################################"
1417 DO iwork = nwork, pwork
1418 IF (iwork == 0) cycle
1419 counter = counter + 1
1420 IF (output_unit > 0)
THEN
1421 WRITE (output_unit, fmt=
"(A)")
" #####################################"
1422 WRITE (output_unit,
'(A,I3,A,I3,A)') &
1423 " ### Energy evaluation ", counter,
" of ", twork,
" ###"
1424 WRITE (output_unit, fmt=
"(A)")
" #####################################"
1426 IF (
SIZE(scf_control%outer_scf%cdft_opt_control%jacobian_step) == 1)
THEN
1427 step_size = scf_control%outer_scf%cdft_opt_control%jacobian_step(1)
1429 step_size = scf_control%outer_scf%cdft_opt_control%jacobian_step(i)
1431 scf_env%outer_scf%variables(:, iter_count + 1) = scf_env%outer_scf%variables(:, iter_count)
1432 scf_env%outer_scf%variables(i, iter_count + 1) = scf_env%outer_scf%variables(i, iter_count) + &
1433 step_multiplier(iwork)*step_size
1437 CALL scf_env_do_scf(scf_env=scf_env, scf_control=scf_control, qs_env=qs_env, &
1438 converged=converged, should_stop=should_stop, total_scf_steps=tsteps)
1441 scf_env%outer_scf%iter_count = scf_env%outer_scf%iter_count + 1
1444 energy_qs, cdft_control%total_steps, &
1445 should_stop=.false., outer_loop_converged=.false., cdft_loop=.false.)
1446 scf_env%outer_scf%iter_count = scf_env%outer_scf%iter_count - 1
1449 jacobian(j, i) = jacobian(j, i) + coeff(iwork)*scf_env%outer_scf%gradient(j, iter_count + 1)
1452 scf_env%outer_scf%variables(:, iter_count + 1) = 0.0_dp
1453 scf_env%outer_scf%gradient = gradient
1454 scf_env%outer_scf%energy = energy
1455 cdft_control%total_steps = nsteps
1456 DO ispin = 1, nspins
1460 p_rmpv(ispin)%matrix)
1471 jacobian(i, j) = jacobian(i, j)/dh(j)
1474 IF (.NOT.
ASSOCIATED(scf_env%outer_scf%inv_jacobian)) &
1475 ALLOCATE (scf_env%outer_scf%inv_jacobian(nvar, nvar))
1476 inv_jacobian => scf_env%outer_scf%inv_jacobian
1478 scf_control%outer_scf%cdft_opt_control%broyden_update = .false.
1480 DO ispin = 1, nspins
1483 DEALLOCATE (mos_stashed, jacobian, gradient, energy, coeff, step_multiplier, dh)
1484 IF (output_unit > 0)
THEN
1485 WRITE (output_unit, fmt=
"(/,A)") &
1486 " ================================== JACOBIAN CALCULATED =================================="
1494 IF (
ASSOCIATED(scf_env%outer_scf%inv_jacobian) .AND. para_env%is_source())
THEN
1499 scf_control%outer_scf%cdft_opt_control%ijacobian(1) = scf_control%outer_scf%cdft_opt_control%ijacobian(1) + 1
1500 CALL timestop(handle)
1502 END SUBROUTINE qs_calculate_inverse_jacobian
1512 SUBROUTINE qs_cdft_line_search(qs_env)
1515 CHARACTER(LEN=*),
PARAMETER :: routinen =
'qs_cdft_line_search'
1517 CHARACTER(len=default_path_length) :: project_name
1518 INTEGER :: handle, i, ispin, iter_count, &
1519 max_linesearch, max_scf, nspins, &
1520 nsteps, nvar, output_unit, tsteps
1521 LOGICAL :: continue_ls, continue_ls_exit, converged, do_linesearch, found_solution, &
1522 reached_maxls, should_exit, should_stop, sign_changed
1523 LOGICAL,
ALLOCATABLE,
DIMENSION(:) :: positive_sign
1524 REAL(kind=
dp) :: alpha, alpha_ls, factor, norm_ls
1525 REAL(kind=
dp),
DIMENSION(:),
POINTER :: energy
1526 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: gradient, inv_jacobian
1527 REAL(kind=
dp),
EXTERNAL :: dnrm2
1531 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: rho_ao_kp
1541 CALL timeset(routinen, handle)
1543 NULLIFY (energy, gradient, p_rmpv, rho_ao_kp, mos, rho, &
1544 ks_env, scf_env, scf_control, dft_control, &
1545 cdft_control, inv_jacobian, para_env, &
1546 tmp_logger, energy_qs)
1549 cpassert(
ASSOCIATED(qs_env))
1550 CALL get_qs_env(qs_env, scf_env=scf_env, ks_env=ks_env, &
1551 scf_control=scf_control, mos=mos, rho=rho, &
1552 dft_control=dft_control, &
1553 para_env=para_env, energy=energy_qs)
1554 do_linesearch = .false.
1555 SELECT CASE (scf_control%outer_scf%optimizer)
1557 do_linesearch = .false.
1559 do_linesearch = .true.
1561 SELECT CASE (scf_control%outer_scf%cdft_opt_control%broyden_type)
1563 do_linesearch = .false.
1565 cdft_control => dft_control%qs_control%cdft_control
1566 IF (.NOT.
ASSOCIATED(cdft_control)) &
1567 CALL cp_abort(__location__, &
1568 "Optimizers that perform a line search can"// &
1569 " only be used together with a valid CDFT constraint")
1570 IF (
ASSOCIATED(scf_env%outer_scf%inv_jacobian)) &
1571 do_linesearch = .true.
1574 IF (do_linesearch)
THEN
1576 TYPE(
mo_set_type),
DIMENSION(:),
ALLOCATABLE :: mos_ls, mos_stashed
1577 cdft_control => dft_control%qs_control%cdft_control
1578 IF (.NOT.
ASSOCIATED(cdft_control)) &
1579 CALL cp_abort(__location__, &
1580 "Optimizers that perform a line search can"// &
1581 " only be used together with a valid CDFT constraint")
1582 cpassert(
ASSOCIATED(scf_env%outer_scf%inv_jacobian))
1583 cpassert(
ASSOCIATED(scf_control%outer_scf%cdft_opt_control))
1584 alpha = scf_control%outer_scf%cdft_opt_control%newton_step_save
1585 iter_count = scf_env%outer_scf%iter_count
1587 project_name = logger%iter_info%project_name
1588 CALL create_tmp_logger(para_env, project_name,
"-LineSearch.out", output_unit, tmp_logger)
1590 nspins = dft_control%nspins
1591 ALLOCATE (mos_stashed(nspins))
1592 DO ispin = 1, nspins
1596 p_rmpv => rho_ao_kp(:, 1)
1597 nsteps = cdft_control%total_steps
1599 nvar =
SIZE(scf_env%outer_scf%variables, 1)
1600 max_scf = scf_control%outer_scf%max_scf + 1
1601 max_linesearch = scf_control%outer_scf%cdft_opt_control%max_ls
1602 continue_ls = scf_control%outer_scf%cdft_opt_control%continue_ls
1603 factor = scf_control%outer_scf%cdft_opt_control%factor_ls
1604 continue_ls_exit = .false.
1605 found_solution = .false.
1606 ALLOCATE (gradient(nvar, max_scf))
1607 gradient = scf_env%outer_scf%gradient
1608 ALLOCATE (energy(max_scf))
1609 energy = scf_env%outer_scf%energy
1610 reached_maxls = .false.
1612 IF (scf_control%outer_scf%cdft_opt_control%broyden_update)
THEN
1615 scf_env%outer_scf%variables(:, iter_count + 1) = 0
1616 scf_control%outer_scf%cdft_opt_control%broyden_update = .false.
1619 IF (output_unit > 0)
THEN
1620 WRITE (output_unit, fmt=
"(/,A)") &
1621 " ================================== LINE SEARCH STARTED =================================="
1622 WRITE (output_unit, fmt=
"(A,I5,A)") &
1623 " Evaluating optimal step size for optimizer using a maximum of", max_linesearch,
" steps"
1624 IF (continue_ls)
THEN
1625 WRITE (output_unit, fmt=
"(A)") &
1626 " Line search continues until best step size is found or max steps are reached"
1628 WRITE (output_unit,
'(/,A,F5.3)') &
1629 " Initial step size: ", alpha
1630 WRITE (output_unit,
'(/,A,F5.3)') &
1631 " Step size update factor: ", factor
1632 WRITE (output_unit,
'(/,A,I10,A,I10)') &
1633 " Energy evaluation: ", cdft_control%ienergy,
", CDFT SCF iteration: ", iter_count
1637 DO i = 1, max_linesearch
1638 IF (output_unit > 0)
THEN
1639 WRITE (output_unit, fmt=
"(A)")
" "
1640 WRITE (output_unit, fmt=
"(A)")
" #####################################"
1641 WRITE (output_unit,
'(A,I10,A)') &
1642 " ### Line search step: ", i,
" ###"
1643 WRITE (output_unit, fmt=
"(A)")
" #####################################"
1645 inv_jacobian => scf_env%outer_scf%inv_jacobian
1647 scf_env%outer_scf%variables(:, iter_count + 1) = scf_env%outer_scf%variables(:, iter_count) - alpha* &
1648 matmul(inv_jacobian, scf_env%outer_scf%gradient(:, iter_count))
1653 CALL scf_env_do_scf(scf_env=scf_env, scf_control=scf_control, qs_env=qs_env, &
1654 converged=converged, should_stop=should_stop, total_scf_steps=tsteps)
1657 scf_env%outer_scf%iter_count = scf_env%outer_scf%iter_count + 1
1660 energy_qs, cdft_control%total_steps, &
1661 should_stop=.false., outer_loop_converged=.false., cdft_loop=.false.)
1662 scf_env%outer_scf%iter_count = scf_env%outer_scf%iter_count - 1
1664 IF (continue_ls .AND. .NOT.
ALLOCATED(positive_sign))
THEN
1665 ALLOCATE (positive_sign(nvar))
1667 positive_sign(ispin) = scf_env%outer_scf%gradient(ispin, iter_count + 1) .GE. 0.0_dp
1671 inv_jacobian => scf_env%outer_scf%inv_jacobian
1672 IF (dnrm2(nvar, scf_env%outer_scf%gradient(:, iter_count + 1), 1) .LT. &
1673 dnrm2(nvar, scf_env%outer_scf%gradient(:, iter_count), 1))
THEN
1675 IF (.NOT. continue_ls)
THEN
1676 should_exit = .true.
1680 IF (found_solution)
THEN
1682 IF (dnrm2(nvar, scf_env%outer_scf%gradient(:, iter_count + 1), 1) .GT. norm_ls)
THEN
1684 continue_ls_exit = .true.
1688 IF (.NOT. continue_ls_exit)
THEN
1689 should_exit = .false.
1691 found_solution = .true.
1692 norm_ls = dnrm2(nvar, scf_env%outer_scf%gradient(:, iter_count + 1), 1)
1695 sign_changed = .true.
1697 sign_changed = sign_changed .AND. (positive_sign(ispin) .NEQV. &
1698 scf_env%outer_scf%gradient(ispin, iter_count + 1) .GE. 0.0_dp)
1700 IF (.NOT.
ALLOCATED(mos_ls))
THEN
1701 ALLOCATE (mos_ls(nspins))
1703 DO ispin = 1, nspins
1707 DO ispin = 1, nspins
1710 alpha = alpha*factor
1712 IF (i == max_linesearch) continue_ls_exit = .true.
1714 IF (sqrt(maxval(scf_env%outer_scf%gradient(:, scf_env%outer_scf%iter_count + 1)**2)) .LT. &
1715 scf_control%outer_scf%eps_scf) &
1716 continue_ls_exit = .true.
1718 IF (sign_changed) continue_ls_exit = .true.
1723 should_exit = .false.
1725 alpha = alpha*factor
1727 IF (continue_ls_exit)
THEN
1730 DO ispin = 1, nspins
1734 p_rmpv(ispin)%matrix)
1740 should_exit = .true.
1743 IF (.NOT. should_exit .AND. &
1744 (i == max_linesearch .AND. converged .AND. .NOT. found_solution))
THEN
1745 should_exit = .true.
1746 reached_maxls = .true.
1747 alpha = alpha*(1.0_dp/factor)
1750 scf_env%outer_scf%variables(:, iter_count + 1) = 0.0_dp
1751 scf_env%outer_scf%gradient = gradient
1752 scf_env%outer_scf%energy = energy
1754 IF (should_exit)
EXIT
1756 cdft_control%total_steps = nsteps
1757 DO ispin = 1, nspins
1761 p_rmpv(ispin)%matrix)
1766 scf_control%outer_scf%cdft_opt_control%newton_step = alpha
1767 IF (.NOT. should_exit)
THEN
1768 CALL cp_warn(__location__, &
1769 "Line search did not converge. CDFT SCF proceeds with fixed step size.")
1770 scf_control%outer_scf%cdft_opt_control%newton_step = scf_control%outer_scf%cdft_opt_control%newton_step_save
1772 IF (reached_maxls) &
1773 CALL cp_warn(__location__, &
1774 "Line search did not converge. CDFT SCF proceeds with lasted iterated step size.")
1778 DO ispin = 1, nspins
1781 DEALLOCATE (mos_stashed, gradient, energy)
1782 IF (
ALLOCATED(positive_sign))
DEALLOCATE (positive_sign)
1783 IF (output_unit > 0)
THEN
1784 WRITE (output_unit, fmt=
"(/,A)") &
1785 " ================================== LINE SEARCH COMPLETE =================================="
1791 CALL timestop(handle)
1793 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)
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.
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, 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, 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, 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_p_mix_new(qs_env)
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 get_ks_env(ks_env, v_hartree_rspace, s_mstruct_changed, rho_changed, 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, 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)
...
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...
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)
...
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...
subroutine, public tb_update_charges(qs_env, dft_control, tb, calculate_forces, use_rho)
...
subroutine, public tb_get_energy(qs_env, tb, energy)
...
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.