174#include "./base/base_uses.f90"
180 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_scf'
181 LOGICAL,
PRIVATE :: reuse_precond = .false.
182 LOGICAL,
PRIVATE :: used_history = .false.
198 SUBROUTINE scf(qs_env, has_converged, total_scf_steps)
200 LOGICAL,
INTENT(OUT),
OPTIONAL :: has_converged
201 INTEGER,
INTENT(OUT),
OPTIONAL :: total_scf_steps
203 INTEGER :: ihistory, max_scf_tmp, tsteps
204 LOGICAL :: converged, outer_scf_loop, should_stop
205 LOGICAL,
SAVE :: first_step_flag = .true.
206 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: gradient_history, variable_history
215 cpassert(
ASSOCIATED(qs_env))
216 IF (
PRESENT(has_converged))
THEN
217 has_converged = .false.
219 IF (
PRESENT(total_scf_steps))
THEN
222 CALL get_qs_env(qs_env, scf_env=scf_env, input=input, &
223 dft_control=dft_control, scf_control=scf_control)
224 IF (scf_control%max_scf > 0)
THEN
229 IF (.NOT.
ASSOCIATED(scf_env))
THEN
237 IF ((scf_control%density_guess .EQ.
history_guess) .AND. (first_step_flag))
THEN
238 max_scf_tmp = scf_control%max_scf
239 scf_control%max_scf = 1
240 outer_scf_loop = scf_control%outer_scf%have_scf
241 scf_control%outer_scf%have_scf = .false.
244 IF (.NOT. dft_control%qs_control%cdft)
THEN
245 CALL scf_env_do_scf(scf_env=scf_env, scf_control=scf_control, qs_env=qs_env, &
246 converged=converged, should_stop=should_stop, total_scf_steps=tsteps)
249 CALL cdft_scf(qs_env=qs_env, should_stop=should_stop)
253 IF (
ASSOCIATED(qs_env%mp2_env)) qs_env%mp2_env%hf_fail = .NOT. converged
256 IF (scf_control%outer_scf%have_scf)
THEN
257 ihistory = scf_env%outer_scf%iter_count
258 CALL get_qs_env(qs_env, gradient_history=gradient_history, &
259 variable_history=variable_history)
261 gradient_history(:, 1) = gradient_history(:, 2)
262 gradient_history(:, 2) = scf_env%outer_scf%gradient(:, ihistory)
263 variable_history(:, 1) = variable_history(:, 2)
264 variable_history(:, 2) = scf_env%outer_scf%variables(:, ihistory)
266 IF (used_history) used_history = .false.
268 IF (
ASSOCIATED(scf_env%outer_scf%inv_jacobian))
THEN
269 scf_control%outer_scf%cdft_opt_control%ijacobian(2) = scf_control%outer_scf%cdft_opt_control%ijacobian(2) + 1
270 IF (scf_control%outer_scf%cdft_opt_control%ijacobian(2) .GE. &
271 scf_control%outer_scf%cdft_opt_control%jacobian_freq(2) .AND. &
272 scf_control%outer_scf%cdft_opt_control%jacobian_freq(2) > 0) &
273 scf_env%outer_scf%deallocate_jacobian = .true.
277 IF ((
ASSOCIATED(qs_env%wf_history)) .AND. &
279 (.NOT. first_step_flag)))
THEN
280 IF (.NOT. dft_control%qs_control%cdft)
THEN
281 CALL wfi_update(qs_env%wf_history, qs_env=qs_env, dt=1.0_dp)
283 IF (dft_control%qs_control%cdft_control%should_purge)
THEN
286 dft_control%qs_control%cdft_control%should_purge = .false.
288 CALL wfi_update(qs_env%wf_history, qs_env=qs_env, dt=1.0_dp)
291 ELSE IF ((scf_control%density_guess .EQ.
history_guess) .AND. &
292 (first_step_flag))
THEN
293 scf_control%max_scf = max_scf_tmp
294 scf_control%outer_scf%have_scf = outer_scf_loop
295 first_step_flag = .false.
302 IF (.NOT. (should_stop))
THEN
311 IF (dft_control%qs_control%cdft) &
312 CALL cdft_control_cleanup(dft_control%qs_control%cdft_control)
314 IF (
PRESENT(has_converged))
THEN
315 has_converged = converged
317 IF (
PRESENT(total_scf_steps))
THEN
318 total_scf_steps = tsteps
342 SUBROUTINE scf_env_do_scf(scf_env, scf_control, qs_env, converged, should_stop, total_scf_steps)
347 LOGICAL,
INTENT(OUT) :: converged, should_stop
348 INTEGER,
INTENT(OUT) :: total_scf_steps
350 CHARACTER(LEN=*),
PARAMETER :: routinen =
'scf_env_do_scf'
352 CHARACTER(LEN=default_string_length) :: description, name
353 INTEGER :: ext_master_id, handle, handle2, i_tmp, &
354 ic, ispin, iter_count, output_unit, &
355 scf_energy_message_tag, total_steps
356 LOGICAL :: diis_step, do_kpoints, energy_only, exit_inner_loop, exit_outer_loop, &
357 inner_loop_converged, just_energy, outer_loop_converged
358 REAL(kind=
dp) :: t1, t2
359 REAL(kind=
dp),
DIMENSION(3) :: res_val_3
363 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: rho_ao_kp
367 TYPE(
mo_set_type),
DIMENSION(:),
POINTER :: mos, mos_last_converged
374 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
379 CALL timeset(routinen, handle)
381 NULLIFY (dft_control, rho, energy, &
382 logger, qs_charges, ks_env, mos, atomic_kind_set, qs_kind_set, &
383 particle_set, dft_section, input, &
384 scf_section, para_env, results, kpoints, pw_env, rho_ao_kp, mos_last_converged)
386 cpassert(
ASSOCIATED(scf_env))
387 cpassert(
ASSOCIATED(qs_env))
394 particle_set=particle_set, &
395 qs_charges=qs_charges, &
397 atomic_kind_set=atomic_kind_set, &
398 qs_kind_set=qs_kind_set, &
402 dft_control=dft_control, &
403 do_kpoints=do_kpoints, &
417 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
"(/,/,T2,A)") &
418 "SCF WAVEFUNCTION OPTIMIZATION"
421 IF (dft_control%switch_surf_dip)
THEN
422 CALL get_qs_env(qs_env, mos_last_converged=mos_last_converged)
423 DO ispin = 1, dft_control%nspins
426 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
"(/,/,T2,A)") &
427 "COPIED mos_last_converged ---> mos"
430 IF ((output_unit > 0) .AND. (.NOT. scf_control%use_ot))
THEN
431 WRITE (unit=output_unit, &
432 fmt=
"(/,T3,A,T12,A,T31,A,T39,A,T59,A,T75,A,/,T3,A)") &
433 "Step",
"Update method",
"Time",
"Convergence",
"Total energy",
"Change", &
439 res_val_3(:) = -1.0_dp
440 description =
"[EXT_SCF_ENER_COMM]"
442 CALL get_results(results, description=description, &
443 values=res_val_3, n_entries=i_tmp)
444 cpassert(i_tmp .EQ. 3)
445 IF (all(res_val_3(:) .LE. 0.0)) &
446 CALL cp_abort(__location__, &
447 " Trying to access result ("//trim(description)// &
448 ") which is not correctly stored.")
449 CALL external_comm%set_handle(nint(res_val_3(1)))
451 ext_master_id = nint(res_val_3(2))
452 scf_energy_message_tag = nint(res_val_3(3))
456 scf_env%outer_scf%iter_count = 0
459 energy%tot_old = 0.0_dp
464 scf_section=scf_section)
467 energy_only, just_energy, exit_inner_loop)
470 dft_control%surf_dip_correct_switch = dft_control%correct_surf_dip
471 IF ((dft_control%correct_surf_dip) .AND. (scf_control%outer_scf%have_scf) .AND. &
472 (scf_env%outer_scf%iter_count > floor(scf_control%outer_scf%max_scf/2.0_dp)))
THEN
473 IF (dft_control%switch_surf_dip)
THEN
474 dft_control%surf_dip_correct_switch = .false.
475 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
"(/,/,T2,A)") &
476 "SURFACE DIPOLE CORRECTION switched off"
482 CALL timeset(routinen//
"_inner_loop", handle2)
484 IF (.NOT. just_energy) scf_env%iter_count = scf_env%iter_count + 1
485 iter_count = iter_count + 1
486 CALL cp_iterate(logger%iter_info, last=.false., iter_nr=iter_count)
488 IF (output_unit > 0)
CALL m_flush(output_unit)
490 total_steps = total_steps + 1
491 just_energy = energy_only
494 calculate_forces=.false.)
504 CALL qs_scf_new_mos(qs_env, scf_env, scf_control, scf_section, diis_step, energy_only)
516 IF (.NOT. just_energy) energy%tot_old = energy%total
519 IF (scf_energy_message_tag .GT. 0)
THEN
520 CALL external_comm%send(energy%total, ext_master_id, scf_energy_message_tag)
524 exit_inner_loop, inner_loop_converged, output_unit)
528 IF (exit_inner_loop)
THEN
533 outer_loop_converged, exit_outer_loop)
536 IF (exit_outer_loop)
CALL cp_iterate(logger%iter_info, last=.true., iter_nr=iter_count)
548 IF (exit_inner_loop)
THEN
549 CALL timestop(handle2)
554 scf_section,
"PRINT%ITERATION_INFO/TIME_CUMUL"),
cp_p_file)) &
558 IF (scf_env%mixing_method > 0)
THEN
559 DO ic = 1,
SIZE(rho_ao_kp, 2)
560 DO ispin = 1, dft_control%nspins
562 CALL dbcsr_copy(rho_ao_kp(ispin, ic)%matrix, scf_env%p_mix_new(ispin, ic)%matrix, name=name)
570 CALL timestop(handle2)
574 IF (.NOT. scf_control%outer_scf%have_scf)
EXIT scf_outer_loop
578 energy, total_steps, should_stop, outer_loop_converged)
581 IF (exit_outer_loop)
THEN
582 IF ((dft_control%switch_surf_dip) .AND. (outer_loop_converged) .AND. &
583 (dft_control%surf_dip_correct_switch))
THEN
584 DO ispin = 1, dft_control%nspins
587 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
"(/,/,T2,A)") &
588 "COPIED mos ---> mos_last_converged"
592 IF (exit_outer_loop)
EXIT scf_outer_loop
599 END DO scf_outer_loop
601 converged = inner_loop_converged .AND. outer_loop_converged
602 total_scf_steps = total_steps
604 IF (dft_control%qs_control%cdft) &
605 dft_control%qs_control%cdft_control%total_steps = &
606 dft_control%qs_control%cdft_control%total_steps + total_steps
608 IF (.NOT. converged)
THEN
609 IF (scf_control%ignore_convergence_failure .OR. should_stop)
THEN
610 CALL cp_warn(__location__,
"SCF run NOT converged")
612 CALL cp_abort(__location__, &
613 "SCF run NOT converged. To continue the calculation "// &
614 "regardless, please set the keyword IGNORE_CONVERGENCE_FAILURE.")
619 IF (qs_env%energy_correction)
THEN
621 ec_env%do_skip = .false.
622 IF (ec_env%skip_ec .AND. .NOT. converged) ec_env%do_skip = .true.
626 DO ispin = 1,
SIZE(mos)
627 IF (mos(ispin)%use_mo_coeff_b)
THEN
628 IF (.NOT.
ASSOCIATED(mos(ispin)%mo_coeff_b)) &
629 cpabort(
"mo_coeff_b is not allocated")
636 CALL timestop(handle)
656 CHARACTER(LEN=*),
PARAMETER :: routinen =
'init_scf_loop'
658 INTEGER :: handle, ispin, nmo, number_of_ot_envs
659 LOGICAL :: do_kpoints, do_rotation, &
660 has_unit_metric, is_full_all
662 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks, matrix_s
663 TYPE(
dbcsr_type),
POINTER :: orthogonality_metric
669 CALL timeset(routinen, handle)
671 NULLIFY (scf_control, matrix_s, matrix_ks, dft_control, mos, mo_coeff, kpoints)
673 cpassert(
ASSOCIATED(scf_env))
674 cpassert(
ASSOCIATED(qs_env))
677 scf_control=scf_control, &
678 dft_control=dft_control, &
679 do_kpoints=do_kpoints, &
684 DO ispin = 1,
SIZE(mos)
685 IF (mos(1)%use_mo_coeff_b)
THEN
691 DO ispin = 1, dft_control%nspins
693 IF (.NOT. scf_control%diagonalization%mom) &
695 smear=scf_control%smear)
698 SELECT CASE (scf_env%method)
701 cpabort(
"unknown scf method method:"//
cp_to_string(scf_env%method))
705 IF (.NOT. scf_env%skip_diis)
THEN
706 IF (.NOT.
ASSOCIATED(scf_env%scf_diis_buffer))
THEN
707 ALLOCATE (scf_env%scf_diis_buffer)
708 CALL qs_diis_b_create(scf_env%scf_diis_buffer, nbuffer=scf_control%max_diis)
714 IF (.NOT. scf_env%skip_diis)
THEN
716 IF (.NOT.
ASSOCIATED(kpoints%scf_diis_buffer))
THEN
717 ALLOCATE (kpoints%scf_diis_buffer)
722 IF (.NOT.
ASSOCIATED(scf_env%scf_diis_buffer))
THEN
723 ALLOCATE (scf_env%scf_diis_buffer)
724 CALL qs_diis_b_create(scf_env%scf_diis_buffer, nbuffer=scf_control%max_diis)
731 CALL get_qs_env(qs_env, matrix_ks=matrix_ks, matrix_s=matrix_s)
733 IF (.NOT. scf_env%skip_diis)
THEN
734 IF (.NOT.
ASSOCIATED(scf_env%scf_diis_buffer))
THEN
735 ALLOCATE (scf_env%scf_diis_buffer)
736 CALL qs_diis_b_create(scf_env%scf_diis_buffer, nbuffer=scf_control%max_diis)
742 IF (dft_control%qs_control%dftb .OR. &
743 dft_control%qs_control%xtb .OR. &
744 dft_control%qs_control%semi_empirical)
THEN
745 cpabort(
"DFTB and SE not available with OT/DIAG")
751 scf_control%diagonalization%ot_settings%preconditioner_type, &
755 scf_control%diagonalization%ot_settings%preconditioner_type, &
756 scf_control%diagonalization%ot_settings%precond_solver_type, &
757 scf_control%diagonalization%ot_settings%energy_gap, dft_control%nspins)
763 has_unit_metric=has_unit_metric, &
771 IF (scf_control%do_outer_scf_reortho)
THEN
772 IF (scf_control%outer_scf%have_scf .AND. .NOT. dft_control%restricted)
THEN
773 IF (scf_env%outer_scf%iter_count > 0)
THEN
774 DO ispin = 1, dft_control%nspins
775 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, nmo=nmo)
776 IF (has_unit_metric)
THEN
788 IF (.NOT.
ASSOCIATED(scf_env%qs_ot_env))
THEN
791 number_of_ot_envs = dft_control%nspins
792 IF (dft_control%restricted) number_of_ot_envs = 1
794 ALLOCATE (scf_env%qs_ot_env(number_of_ot_envs))
797 IF (scf_env%outer_scf%iter_count > 0)
THEN
798 IF (scf_env%iter_delta < scf_control%eps_diis)
THEN
799 scf_env%qs_ot_env(1)%settings%ot_state = 1
805 IF (scf_env%outer_scf%iter_count > 0)
THEN
806 IF (scf_env%qs_ot_env(1)%settings%ot_state == 1)
THEN
807 scf_control%max_scf = max(scf_env%qs_ot_env(1)%settings%max_scf_diis, &
813 IF (dft_control%restricted)
THEN
814 scf_env%qs_ot_env(1)%restricted = .true.
816 IF (.NOT. scf_env%qs_ot_env(1)%settings%do_rotation) &
817 CALL cp_abort(__location__, &
818 "Restricted calculation with OT requires orbital rotation. Please "// &
819 "activate the OT%ROTATION keyword!")
821 scf_env%qs_ot_env(:)%restricted = .false.
826 do_rotation = scf_env%qs_ot_env(1)%settings%do_rotation
829 IF (do_rotation .AND. is_full_all) &
830 cpabort(
'PRECONDITIONER FULL_ALL is not compatible with ROTATION.')
834 calculate_forces=.false.)
838 IF (.NOT. reuse_precond) &
840 scf_env%qs_ot_env(1)%settings%preconditioner_type, &
847 IF (has_unit_metric)
THEN
848 NULLIFY (orthogonality_metric)
850 orthogonality_metric => matrix_s(1)%matrix
853 IF (.NOT. reuse_precond) &
855 scf_env%qs_ot_env(1)%settings%preconditioner_type, &
856 scf_env%qs_ot_env(1)%settings%precond_solver_type, &
857 scf_env%qs_ot_env(1)%settings%energy_gap, dft_control%nspins, &
858 has_unit_metric=has_unit_metric, &
859 chol_type=scf_env%qs_ot_env(1)%settings%cholesky_type)
860 IF (reuse_precond) reuse_precond = .false.
862 CALL ot_scf_init(mo_array=mos, matrix_s=orthogonality_metric, &
863 broyden_adaptive_sigma=qs_env%broyden_adaptive_sigma, &
864 qs_ot_env=scf_env%qs_ot_env, matrix_ks=matrix_ks(1)%matrix)
866 SELECT CASE (scf_env%qs_ot_env(1)%settings%preconditioner_type)
869 DO ispin = 1,
SIZE(scf_env%qs_ot_env)
871 scf_env%ot_preconditioner(ispin)%preconditioner)
874 DO ispin = 1,
SIZE(scf_env%qs_ot_env)
876 scf_env%ot_preconditioner(1)%preconditioner)
879 DO ispin = 1,
SIZE(scf_env%qs_ot_env)
881 scf_env%ot_preconditioner(1)%preconditioner)
887 do_rotation = scf_env%qs_ot_env(1)%settings%do_rotation
888 DO ispin = 1,
SIZE(mos)
889 IF (.NOT. mos(ispin)%uniform_occupation)
THEN
890 cpassert(do_rotation)
896 IF (dft_control%low_spin_roks)
THEN
898 do_rotation = scf_env%qs_ot_env(1)%settings%do_rotation
899 cpassert(do_rotation)
902 CALL timestop(handle)
917 CHARACTER(len=*),
PARAMETER :: routinen =
'scf_env_cleanup'
921 CALL timeset(routinen, handle)
926 IF (
ASSOCIATED(scf_env%scf_work1_red))
THEN
929 IF (
ASSOCIATED(scf_env%scf_work2))
THEN
931 DEALLOCATE (scf_env%scf_work2)
932 NULLIFY (scf_env%scf_work2)
934 IF (
ASSOCIATED(scf_env%scf_work2_red))
THEN
936 DEALLOCATE (scf_env%scf_work2_red)
937 NULLIFY (scf_env%scf_work2_red)
939 IF (
ASSOCIATED(scf_env%ortho))
THEN
941 DEALLOCATE (scf_env%ortho)
942 NULLIFY (scf_env%ortho)
944 IF (
ASSOCIATED(scf_env%ortho_red))
THEN
946 DEALLOCATE (scf_env%ortho_red)
947 NULLIFY (scf_env%ortho_red)
949 IF (
ASSOCIATED(scf_env%ortho_m1))
THEN
951 DEALLOCATE (scf_env%ortho_m1)
952 NULLIFY (scf_env%ortho_m1)
954 IF (
ASSOCIATED(scf_env%ortho_m1_red))
THEN
956 DEALLOCATE (scf_env%ortho_m1_red)
957 NULLIFY (scf_env%ortho_m1_red)
960 IF (
ASSOCIATED(scf_env%ortho_dbcsr))
THEN
963 IF (
ASSOCIATED(scf_env%buf1_dbcsr))
THEN
966 IF (
ASSOCIATED(scf_env%buf2_dbcsr))
THEN
970 IF (
ASSOCIATED(scf_env%p_mix_new))
THEN
974 IF (
ASSOCIATED(scf_env%p_delta))
THEN
979 SELECT CASE (scf_env%method)
996 cpabort(
"unknown scf method method:"//
cp_to_string(scf_env%method))
999 IF (
ASSOCIATED(scf_env%outer_scf%variables))
THEN
1000 DEALLOCATE (scf_env%outer_scf%variables)
1002 IF (
ASSOCIATED(scf_env%outer_scf%count))
THEN
1003 DEALLOCATE (scf_env%outer_scf%count)
1005 IF (
ASSOCIATED(scf_env%outer_scf%gradient))
THEN
1006 DEALLOCATE (scf_env%outer_scf%gradient)
1008 IF (
ASSOCIATED(scf_env%outer_scf%energy))
THEN
1009 DEALLOCATE (scf_env%outer_scf%energy)
1011 IF (
ASSOCIATED(scf_env%outer_scf%inv_jacobian) .AND. &
1012 scf_env%outer_scf%deallocate_jacobian)
THEN
1013 DEALLOCATE (scf_env%outer_scf%inv_jacobian)
1016 CALL timestop(handle)
1030 LOGICAL,
INTENT(OUT) :: should_stop
1032 CHARACTER(len=*),
PARAMETER :: routinen =
'cdft_scf'
1034 INTEGER :: handle, iatom, ispin, ivar, nmo, nvar, &
1036 LOGICAL :: cdft_loop_converged, converged, &
1037 exit_cdft_loop, first_iteration, &
1038 my_uocc, uniform_occupation
1039 REAL(kind=
dp),
DIMENSION(:),
POINTER :: mo_occupations
1042 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_s, rho_ao
1054 NULLIFY (scf_env, ks_env, energy, rho, matrix_s, rho_ao, cdft_control, logger, &
1055 dft_control, pw_env, auxbas_pw_pool, energy, ks_env, scf_env, dft_section, &
1056 input, scf_section, scf_control, mos, mo_occupations)
1059 cpassert(
ASSOCIATED(qs_env))
1060 CALL get_qs_env(qs_env, scf_env=scf_env, energy=energy, &
1061 dft_control=dft_control, scf_control=scf_control, &
1062 ks_env=ks_env, input=input)
1064 CALL timeset(routinen//
"_loop", handle)
1068 extension=
".scfLog")
1069 first_iteration = .true.
1071 cdft_control => dft_control%qs_control%cdft_control
1073 scf_env%outer_scf%iter_count = 0
1074 cdft_control%total_steps = 0
1077 IF (output_unit > 0)
THEN
1078 WRITE (unit=output_unit, fmt=
"(/,/,T2,A)") &
1079 "CDFT EXTERNAL SCF WAVEFUNCTION OPTIMIZATION"
1082 IF (cdft_control%reuse_precond)
THEN
1083 reuse_precond = .false.
1084 cdft_control%nreused = 0
1090 CALL scf_env_do_scf(scf_env=scf_env, scf_control=scf_control, qs_env=qs_env, &
1091 converged=converged, should_stop=should_stop, total_scf_steps=tsteps)
1093 IF (cdft_control%reuse_precond)
THEN
1097 IF (scf_env%outer_scf%iter_count == 1 .AND. scf_env%iter_count == 1 &
1098 .AND. cdft_control%total_steps /= 1) &
1099 cdft_control%nreused = cdft_control%nreused - 1
1101 IF (scf_env%outer_scf%iter_count == 1 .AND. scf_env%iter_count .LE. cdft_control%precond_freq .AND. &
1102 cdft_control%total_steps /= 1 .AND. cdft_control%nreused .LT. cdft_control%max_reuse)
THEN
1103 reuse_precond = .true.
1104 cdft_control%nreused = cdft_control%nreused + 1
1106 reuse_precond = .false.
1107 cdft_control%nreused = 0
1111 IF (first_iteration .AND. cdft_control%purge_history)
THEN
1112 cdft_control%istep = cdft_control%istep + 1
1113 IF (scf_env%outer_scf%iter_count .GT. 1)
THEN
1114 cdft_control%nbad_conv = cdft_control%nbad_conv + 1
1115 IF (cdft_control%nbad_conv .GE. cdft_control%purge_freq .AND. &
1116 cdft_control%istep .GE. cdft_control%purge_offset)
THEN
1117 cdft_control%nbad_conv = 0
1118 cdft_control%istep = 0
1119 cdft_control%should_purge = .true.
1123 first_iteration = .false.
1127 cdft_loop_converged, exit_cdft_loop)
1129 energy, cdft_control%total_steps, &
1130 should_stop, cdft_loop_converged, cdft_loop=.true.)
1131 IF (exit_cdft_loop)
EXIT cdft_outer_loop
1133 CALL qs_calculate_inverse_jacobian(qs_env)
1135 CALL qs_cdft_line_search(qs_env)
1140 END DO cdft_outer_loop
1142 cdft_control%ienergy = cdft_control%ienergy + 1
1145 IF (cdft_control%do_et)
THEN
1146 CALL get_qs_env(qs_env=qs_env, matrix_s=matrix_s, mos=mos)
1147 nvar =
SIZE(cdft_control%target)
1149 ALLOCATE (cdft_control%wmat(nvar))
1152 CALL dbcsr_copy(cdft_control%wmat(ivar)%matrix, matrix_s(1)%matrix, &
1153 name=
"ET_RESTRAINT_MATRIX")
1154 CALL dbcsr_set(cdft_control%wmat(ivar)%matrix, 0.0_dp)
1155 CALL integrate_v_rspace(cdft_control%group(ivar)%weight, &
1156 hmat=cdft_control%wmat(ivar), qs_env=qs_env, &
1157 calculate_forces=.false., &
1158 gapw=dft_control%qs_control%gapw)
1162 CALL dbcsr_copy(cdft_control%matrix_s%matrix, matrix_s(1)%matrix, &
1165 NULLIFY (cdft_control%mo_coeff)
1166 ALLOCATE (cdft_control%mo_coeff(dft_control%nspins))
1167 DO ispin = 1, dft_control%nspins
1168 CALL cp_fm_create(matrix=cdft_control%mo_coeff(ispin), &
1169 matrix_struct=qs_env%mos(ispin)%mo_coeff%matrix_struct, &
1170 name=
"MO_COEFF_A"//trim(adjustl(
cp_to_string(ispin)))//
"MATRIX")
1172 cdft_control%mo_coeff(ispin))
1175 IF (cdft_control%calculate_metric)
THEN
1178 ALLOCATE (cdft_control%matrix_p(dft_control%nspins))
1179 DO ispin = 1, dft_control%nspins
1180 NULLIFY (cdft_control%matrix_p(ispin)%matrix)
1182 CALL dbcsr_copy(cdft_control%matrix_p(ispin)%matrix, rho_ao(ispin)%matrix, &
1183 name=
"DENSITY MATRIX")
1187 uniform_occupation = .true.
1188 DO ispin = 1, dft_control%nspins
1189 CALL get_mo_set(mo_set=mos(ispin), uniform_occupation=my_uocc)
1190 uniform_occupation = uniform_occupation .AND. my_uocc
1192 IF (.NOT. uniform_occupation)
THEN
1193 ALLOCATE (cdft_control%occupations(dft_control%nspins))
1194 DO ispin = 1, dft_control%nspins
1197 occupation_numbers=mo_occupations)
1198 ALLOCATE (cdft_control%occupations(ispin)%array(nmo))
1199 cdft_control%occupations(ispin)%array(1:nmo) = mo_occupations(1:nmo)
1207 IF (.NOT. (cdft_control%save_pot .OR. cdft_control%transfer_pot))
THEN
1209 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
1210 DO iatom = 1,
SIZE(cdft_control%group)
1211 CALL auxbas_pw_pool%give_back_pw(cdft_control%group(iatom)%weight)
1212 DEALLOCATE (cdft_control%group(iatom)%weight)
1214 IF (cdft_control%atomic_charges)
THEN
1215 DO iatom = 1, cdft_control%natoms
1216 CALL auxbas_pw_pool%give_back_pw(cdft_control%charge(iatom))
1218 DEALLOCATE (cdft_control%charge)
1221 cdft_control%becke_control%cavity_confine)
THEN
1222 IF (.NOT.
ASSOCIATED(cdft_control%becke_control%cavity_mat))
THEN
1223 CALL auxbas_pw_pool%give_back_pw(cdft_control%becke_control%cavity)
1225 DEALLOCATE (cdft_control%becke_control%cavity_mat)
1228 IF (
ASSOCIATED(cdft_control%hirshfeld_control%hirshfeld_env%fnorm))
THEN
1229 CALL auxbas_pw_pool%give_back_pw(cdft_control%hirshfeld_control%hirshfeld_env%fnorm)
1232 IF (
ASSOCIATED(cdft_control%charges_fragment))
DEALLOCATE (cdft_control%charges_fragment)
1233 cdft_control%need_pot = .true.
1234 cdft_control%external_control = .false.
1237 CALL timestop(handle)
1248 SUBROUTINE cdft_control_cleanup(cdft_control)
1251 IF (
ASSOCIATED(cdft_control%constraint%variables)) &
1252 DEALLOCATE (cdft_control%constraint%variables)
1253 IF (
ASSOCIATED(cdft_control%constraint%count)) &
1254 DEALLOCATE (cdft_control%constraint%count)
1255 IF (
ASSOCIATED(cdft_control%constraint%gradient)) &
1256 DEALLOCATE (cdft_control%constraint%gradient)
1257 IF (
ASSOCIATED(cdft_control%constraint%energy)) &
1258 DEALLOCATE (cdft_control%constraint%energy)
1259 IF (
ASSOCIATED(cdft_control%constraint%inv_jacobian) .AND. &
1260 cdft_control%constraint%deallocate_jacobian) &
1261 DEALLOCATE (cdft_control%constraint%inv_jacobian)
1263 END SUBROUTINE cdft_control_cleanup
1271 SUBROUTINE qs_calculate_inverse_jacobian(qs_env)
1274 CHARACTER(LEN=*),
PARAMETER :: routinen =
'qs_calculate_inverse_jacobian'
1276 CHARACTER(len=default_path_length) :: project_name
1277 INTEGER :: counter, handle, i, ispin, iter_count, &
1278 iwork, j, max_scf, nspins, nsteps, &
1279 nvar, nwork, output_unit, pwork, &
1281 LOGICAL :: converged, explicit_jacobian, &
1282 should_build, should_stop, &
1284 REAL(kind=
dp) :: inv_error, step_size
1285 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: coeff, dh, step_multiplier
1286 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: jacobian
1287 REAL(kind=
dp),
DIMENSION(:),
POINTER :: energy
1288 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: gradient, inv_jacobian
1292 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: rho_ao_kp
1294 TYPE(
mo_set_type),
ALLOCATABLE,
DIMENSION(:) :: mos_stashed
1303 NULLIFY (energy, gradient, p_rmpv, rho_ao_kp, mos, rho, &
1304 ks_env, scf_env, scf_control, dft_control, cdft_control, &
1305 inv_jacobian, para_env, tmp_logger, energy_qs)
1308 cpassert(
ASSOCIATED(qs_env))
1309 CALL get_qs_env(qs_env, scf_env=scf_env, ks_env=ks_env, &
1310 scf_control=scf_control, mos=mos, rho=rho, &
1311 dft_control=dft_control, &
1312 para_env=para_env, energy=energy_qs)
1313 explicit_jacobian = .false.
1314 should_build = .false.
1315 use_md_history = .false.
1316 iter_count = scf_env%outer_scf%iter_count
1318 IF (.NOT.
ASSOCIATED(scf_control%outer_scf%cdft_opt_control))
RETURN
1320 CALL timeset(routinen, handle)
1322 IF (scf_control%outer_scf%cdft_opt_control%jacobian_restart)
THEN
1324 should_build = .false.
1327 IF (should_build)
THEN
1328 scf_env%outer_scf%deallocate_jacobian = .false.
1330 IF (explicit_jacobian)
THEN
1332 cdft_control => dft_control%qs_control%cdft_control
1333 IF (.NOT.
ASSOCIATED(cdft_control)) &
1334 CALL cp_abort(__location__, &
1335 "Optimizers that need the explicit Jacobian can"// &
1336 " only be used together with a valid CDFT constraint.")
1338 project_name = logger%iter_info%project_name
1339 CALL create_tmp_logger(para_env, project_name,
"-JacobianInfo.out", output_unit, tmp_logger)
1341 nspins = dft_control%nspins
1342 ALLOCATE (mos_stashed(nspins))
1343 DO ispin = 1, nspins
1347 p_rmpv => rho_ao_kp(:, 1)
1349 nvar =
SIZE(scf_env%outer_scf%variables, 1)
1350 max_scf = scf_control%outer_scf%max_scf + 1
1351 ALLOCATE (gradient(nvar, max_scf))
1352 gradient = scf_env%outer_scf%gradient
1353 ALLOCATE (energy(max_scf))
1354 energy = scf_env%outer_scf%energy
1355 ALLOCATE (jacobian(nvar, nvar))
1357 nsteps = cdft_control%total_steps
1360 twork = pwork - nwork
1362 jacobian(i, :) = coeff(0)*scf_env%outer_scf%gradient(i, iter_count)
1367 IF (output_unit > 0)
THEN
1368 WRITE (output_unit, fmt=
"(A)")
" "
1369 WRITE (output_unit, fmt=
"(A)")
" #####################################"
1370 WRITE (output_unit,
'(A,I3,A,I3,A)') &
1371 " ### Constraint ", i,
" of ", nvar,
" ###"
1372 WRITE (output_unit, fmt=
"(A)")
" #####################################"
1375 DO iwork = nwork, pwork
1376 IF (iwork == 0) cycle
1377 counter = counter + 1
1378 IF (output_unit > 0)
THEN
1379 WRITE (output_unit, fmt=
"(A)")
" #####################################"
1380 WRITE (output_unit,
'(A,I3,A,I3,A)') &
1381 " ### Energy evaluation ", counter,
" of ", twork,
" ###"
1382 WRITE (output_unit, fmt=
"(A)")
" #####################################"
1384 IF (
SIZE(scf_control%outer_scf%cdft_opt_control%jacobian_step) == 1)
THEN
1385 step_size = scf_control%outer_scf%cdft_opt_control%jacobian_step(1)
1387 step_size = scf_control%outer_scf%cdft_opt_control%jacobian_step(i)
1389 scf_env%outer_scf%variables(:, iter_count + 1) = scf_env%outer_scf%variables(:, iter_count)
1390 scf_env%outer_scf%variables(i, iter_count + 1) = scf_env%outer_scf%variables(i, iter_count) + &
1391 step_multiplier(iwork)*step_size
1395 CALL scf_env_do_scf(scf_env=scf_env, scf_control=scf_control, qs_env=qs_env, &
1396 converged=converged, should_stop=should_stop, total_scf_steps=tsteps)
1399 scf_env%outer_scf%iter_count = scf_env%outer_scf%iter_count + 1
1402 energy_qs, cdft_control%total_steps, &
1403 should_stop=.false., outer_loop_converged=.false., cdft_loop=.false.)
1404 scf_env%outer_scf%iter_count = scf_env%outer_scf%iter_count - 1
1407 jacobian(j, i) = jacobian(j, i) + coeff(iwork)*scf_env%outer_scf%gradient(j, iter_count + 1)
1410 scf_env%outer_scf%variables(:, iter_count + 1) = 0.0_dp
1411 scf_env%outer_scf%gradient = gradient
1412 scf_env%outer_scf%energy = energy
1413 cdft_control%total_steps = nsteps
1414 DO ispin = 1, nspins
1418 p_rmpv(ispin)%matrix)
1429 jacobian(i, j) = jacobian(i, j)/dh(j)
1432 IF (.NOT.
ASSOCIATED(scf_env%outer_scf%inv_jacobian)) &
1433 ALLOCATE (scf_env%outer_scf%inv_jacobian(nvar, nvar))
1434 inv_jacobian => scf_env%outer_scf%inv_jacobian
1436 scf_control%outer_scf%cdft_opt_control%broyden_update = .false.
1438 DO ispin = 1, nspins
1441 DEALLOCATE (mos_stashed, jacobian, gradient, energy, coeff, step_multiplier, dh)
1442 IF (output_unit > 0)
THEN
1443 WRITE (output_unit, fmt=
"(/,A)") &
1444 " ================================== JACOBIAN CALCULATED =================================="
1452 IF (
ASSOCIATED(scf_env%outer_scf%inv_jacobian) .AND. para_env%is_source())
THEN
1457 scf_control%outer_scf%cdft_opt_control%ijacobian(1) = scf_control%outer_scf%cdft_opt_control%ijacobian(1) + 1
1458 CALL timestop(handle)
1460 END SUBROUTINE qs_calculate_inverse_jacobian
1470 SUBROUTINE qs_cdft_line_search(qs_env)
1473 CHARACTER(LEN=*),
PARAMETER :: routinen =
'qs_cdft_line_search'
1475 CHARACTER(len=default_path_length) :: project_name
1476 INTEGER :: handle, i, ispin, iter_count, &
1477 max_linesearch, max_scf, nspins, &
1478 nsteps, nvar, output_unit, tsteps
1479 LOGICAL :: continue_ls, continue_ls_exit, converged, do_linesearch, found_solution, &
1480 reached_maxls, should_exit, should_stop, sign_changed
1481 LOGICAL,
ALLOCATABLE,
DIMENSION(:) :: positive_sign
1482 REAL(kind=
dp) :: alpha, alpha_ls, factor, norm_ls
1483 REAL(kind=
dp),
DIMENSION(:),
POINTER :: energy
1484 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: gradient, inv_jacobian
1485 REAL(kind=
dp),
EXTERNAL :: dnrm2
1489 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: rho_ao_kp
1499 CALL timeset(routinen, handle)
1501 NULLIFY (energy, gradient, p_rmpv, rho_ao_kp, mos, rho, &
1502 ks_env, scf_env, scf_control, dft_control, &
1503 cdft_control, inv_jacobian, para_env, &
1504 tmp_logger, energy_qs)
1507 cpassert(
ASSOCIATED(qs_env))
1508 CALL get_qs_env(qs_env, scf_env=scf_env, ks_env=ks_env, &
1509 scf_control=scf_control, mos=mos, rho=rho, &
1510 dft_control=dft_control, &
1511 para_env=para_env, energy=energy_qs)
1512 do_linesearch = .false.
1513 SELECT CASE (scf_control%outer_scf%optimizer)
1515 do_linesearch = .false.
1517 do_linesearch = .true.
1519 SELECT CASE (scf_control%outer_scf%cdft_opt_control%broyden_type)
1521 do_linesearch = .false.
1523 cdft_control => dft_control%qs_control%cdft_control
1524 IF (.NOT.
ASSOCIATED(cdft_control)) &
1525 CALL cp_abort(__location__, &
1526 "Optimizers that perform a line search can"// &
1527 " only be used together with a valid CDFT constraint")
1528 IF (
ASSOCIATED(scf_env%outer_scf%inv_jacobian)) &
1529 do_linesearch = .true.
1532 IF (do_linesearch)
THEN
1534 TYPE(
mo_set_type),
DIMENSION(:),
ALLOCATABLE :: mos_ls, mos_stashed
1535 cdft_control => dft_control%qs_control%cdft_control
1536 IF (.NOT.
ASSOCIATED(cdft_control)) &
1537 CALL cp_abort(__location__, &
1538 "Optimizers that perform a line search can"// &
1539 " only be used together with a valid CDFT constraint")
1540 cpassert(
ASSOCIATED(scf_env%outer_scf%inv_jacobian))
1541 cpassert(
ASSOCIATED(scf_control%outer_scf%cdft_opt_control))
1542 alpha = scf_control%outer_scf%cdft_opt_control%newton_step_save
1543 iter_count = scf_env%outer_scf%iter_count
1545 project_name = logger%iter_info%project_name
1546 CALL create_tmp_logger(para_env, project_name,
"-LineSearch.out", output_unit, tmp_logger)
1548 nspins = dft_control%nspins
1549 ALLOCATE (mos_stashed(nspins))
1550 DO ispin = 1, nspins
1554 p_rmpv => rho_ao_kp(:, 1)
1555 nsteps = cdft_control%total_steps
1557 nvar =
SIZE(scf_env%outer_scf%variables, 1)
1558 max_scf = scf_control%outer_scf%max_scf + 1
1559 max_linesearch = scf_control%outer_scf%cdft_opt_control%max_ls
1560 continue_ls = scf_control%outer_scf%cdft_opt_control%continue_ls
1561 factor = scf_control%outer_scf%cdft_opt_control%factor_ls
1562 continue_ls_exit = .false.
1563 found_solution = .false.
1564 ALLOCATE (gradient(nvar, max_scf))
1565 gradient = scf_env%outer_scf%gradient
1566 ALLOCATE (energy(max_scf))
1567 energy = scf_env%outer_scf%energy
1568 reached_maxls = .false.
1570 IF (scf_control%outer_scf%cdft_opt_control%broyden_update)
THEN
1573 scf_env%outer_scf%variables(:, iter_count + 1) = 0
1574 scf_control%outer_scf%cdft_opt_control%broyden_update = .false.
1577 IF (output_unit > 0)
THEN
1578 WRITE (output_unit, fmt=
"(/,A)") &
1579 " ================================== LINE SEARCH STARTED =================================="
1580 WRITE (output_unit, fmt=
"(A,I5,A)") &
1581 " Evaluating optimal step size for optimizer using a maximum of", max_linesearch,
" steps"
1582 IF (continue_ls)
THEN
1583 WRITE (output_unit, fmt=
"(A)") &
1584 " Line search continues until best step size is found or max steps are reached"
1586 WRITE (output_unit,
'(/,A,F5.3)') &
1587 " Initial step size: ", alpha
1588 WRITE (output_unit,
'(/,A,F5.3)') &
1589 " Step size update factor: ", factor
1590 WRITE (output_unit,
'(/,A,I10,A,I10)') &
1591 " Energy evaluation: ", cdft_control%ienergy,
", CDFT SCF iteration: ", iter_count
1595 DO i = 1, max_linesearch
1596 IF (output_unit > 0)
THEN
1597 WRITE (output_unit, fmt=
"(A)")
" "
1598 WRITE (output_unit, fmt=
"(A)")
" #####################################"
1599 WRITE (output_unit,
'(A,I10,A)') &
1600 " ### Line search step: ", i,
" ###"
1601 WRITE (output_unit, fmt=
"(A)")
" #####################################"
1603 inv_jacobian => scf_env%outer_scf%inv_jacobian
1605 scf_env%outer_scf%variables(:, iter_count + 1) = scf_env%outer_scf%variables(:, iter_count) - alpha* &
1606 matmul(inv_jacobian, scf_env%outer_scf%gradient(:, iter_count))
1611 CALL scf_env_do_scf(scf_env=scf_env, scf_control=scf_control, qs_env=qs_env, &
1612 converged=converged, should_stop=should_stop, total_scf_steps=tsteps)
1615 scf_env%outer_scf%iter_count = scf_env%outer_scf%iter_count + 1
1618 energy_qs, cdft_control%total_steps, &
1619 should_stop=.false., outer_loop_converged=.false., cdft_loop=.false.)
1620 scf_env%outer_scf%iter_count = scf_env%outer_scf%iter_count - 1
1622 IF (continue_ls .AND. .NOT.
ALLOCATED(positive_sign))
THEN
1623 ALLOCATE (positive_sign(nvar))
1625 positive_sign(ispin) = scf_env%outer_scf%gradient(ispin, iter_count + 1) .GE. 0.0_dp
1629 inv_jacobian => scf_env%outer_scf%inv_jacobian
1630 IF (dnrm2(nvar, scf_env%outer_scf%gradient(:, iter_count + 1), 1) .LT. &
1631 dnrm2(nvar, scf_env%outer_scf%gradient(:, iter_count), 1))
THEN
1633 IF (.NOT. continue_ls)
THEN
1634 should_exit = .true.
1638 IF (found_solution)
THEN
1640 IF (dnrm2(nvar, scf_env%outer_scf%gradient(:, iter_count + 1), 1) .GT. norm_ls)
THEN
1642 continue_ls_exit = .true.
1646 IF (.NOT. continue_ls_exit)
THEN
1647 should_exit = .false.
1649 found_solution = .true.
1650 norm_ls = dnrm2(nvar, scf_env%outer_scf%gradient(:, iter_count + 1), 1)
1653 sign_changed = .true.
1655 sign_changed = sign_changed .AND. (positive_sign(ispin) .NEQV. &
1656 scf_env%outer_scf%gradient(ispin, iter_count + 1) .GE. 0.0_dp)
1658 IF (.NOT.
ALLOCATED(mos_ls))
THEN
1659 ALLOCATE (mos_ls(nspins))
1661 DO ispin = 1, nspins
1665 DO ispin = 1, nspins
1668 alpha = alpha*factor
1670 IF (i == max_linesearch) continue_ls_exit = .true.
1672 IF (sqrt(maxval(scf_env%outer_scf%gradient(:, scf_env%outer_scf%iter_count + 1)**2)) .LT. &
1673 scf_control%outer_scf%eps_scf) &
1674 continue_ls_exit = .true.
1676 IF (sign_changed) continue_ls_exit = .true.
1681 should_exit = .false.
1683 alpha = alpha*factor
1685 IF (continue_ls_exit)
THEN
1688 DO ispin = 1, nspins
1692 p_rmpv(ispin)%matrix)
1698 should_exit = .true.
1701 IF (.NOT. should_exit .AND. &
1702 (i == max_linesearch .AND. converged .AND. .NOT. found_solution))
THEN
1703 should_exit = .true.
1704 reached_maxls = .true.
1705 alpha = alpha*(1.0_dp/factor)
1708 scf_env%outer_scf%variables(:, iter_count + 1) = 0.0_dp
1709 scf_env%outer_scf%gradient = gradient
1710 scf_env%outer_scf%energy = energy
1712 IF (should_exit)
EXIT
1714 cdft_control%total_steps = nsteps
1715 DO ispin = 1, nspins
1719 p_rmpv(ispin)%matrix)
1724 scf_control%outer_scf%cdft_opt_control%newton_step = alpha
1725 IF (.NOT. should_exit)
THEN
1726 CALL cp_warn(__location__, &
1727 "Line search did not converge. CDFT SCF proceeds with fixed step size.")
1728 scf_control%outer_scf%cdft_opt_control%newton_step = scf_control%outer_scf%cdft_opt_control%newton_step_save
1730 IF (reached_maxls) &
1731 CALL cp_warn(__location__, &
1732 "Line search did not converge. CDFT SCF proceeds with lasted iterated step size.")
1736 DO ispin = 1, nspins
1739 DEALLOCATE (mos_stashed, gradient, energy)
1740 IF (
ALLOCATED(positive_sign))
DEALLOCATE (positive_sign)
1741 IF (output_unit > 0)
THEN
1742 WRITE (output_unit, fmt=
"(/,A)") &
1743 " ================================== LINE SEARCH COMPLETE =================================="
1749 CALL timestop(handle)
1751 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 itrative diagonalization by the block-Davidson appr...
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, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, ecoul_1c, rho0_s_rs, rho0_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, harris_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, wanniercentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs)
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, 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)
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 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...
Definition and initialisation of the mo data type.
subroutine, public write_mo_set_to_restart(mo_array, particle_set, dft_section, qs_kind_set)
...
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_new_mos(qs_env, scf_env, scf_control, scf_section, diis_step, energy_only)
takes known energy and derivatives and produces new wfns and or density matrix
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)
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_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...
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.