177#include "./base/base_uses.f90"
183 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_scf'
184 LOGICAL,
PRIVATE :: reuse_precond = .false.
185 LOGICAL,
PRIVATE :: used_history = .false.
201 SUBROUTINE scf(qs_env, has_converged, total_scf_steps)
203 LOGICAL,
INTENT(OUT),
OPTIONAL :: has_converged
204 INTEGER,
INTENT(OUT),
OPTIONAL :: total_scf_steps
206 INTEGER :: ihistory, max_scf_tmp, tsteps
207 LOGICAL :: converged, outer_scf_loop, should_stop
208 LOGICAL,
SAVE :: first_step_flag = .true.
209 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: gradient_history, variable_history
218 cpassert(
ASSOCIATED(qs_env))
219 IF (
PRESENT(has_converged))
THEN
220 has_converged = .false.
222 IF (
PRESENT(total_scf_steps))
THEN
225 CALL get_qs_env(qs_env, scf_env=scf_env, input=input, &
226 dft_control=dft_control, scf_control=scf_control)
227 IF (scf_control%max_scf > 0)
THEN
232 IF (.NOT.
ASSOCIATED(scf_env))
THEN
240 IF ((scf_control%density_guess .EQ.
history_guess) .AND. (first_step_flag))
THEN
241 max_scf_tmp = scf_control%max_scf
242 scf_control%max_scf = 1
243 outer_scf_loop = scf_control%outer_scf%have_scf
244 scf_control%outer_scf%have_scf = .false.
247 IF (.NOT. dft_control%qs_control%cdft)
THEN
248 CALL scf_env_do_scf(scf_env=scf_env, scf_control=scf_control, qs_env=qs_env, &
249 converged=converged, should_stop=should_stop, total_scf_steps=tsteps)
252 CALL cdft_scf(qs_env=qs_env, should_stop=should_stop)
256 IF (
ASSOCIATED(qs_env%mp2_env)) qs_env%mp2_env%hf_fail = .NOT. converged
259 IF (scf_control%outer_scf%have_scf)
THEN
260 ihistory = scf_env%outer_scf%iter_count
261 CALL get_qs_env(qs_env, gradient_history=gradient_history, &
262 variable_history=variable_history)
264 gradient_history(:, 1) = gradient_history(:, 2)
265 gradient_history(:, 2) = scf_env%outer_scf%gradient(:, ihistory)
266 variable_history(:, 1) = variable_history(:, 2)
267 variable_history(:, 2) = scf_env%outer_scf%variables(:, ihistory)
269 IF (used_history) used_history = .false.
271 IF (
ASSOCIATED(scf_env%outer_scf%inv_jacobian))
THEN
272 scf_control%outer_scf%cdft_opt_control%ijacobian(2) = scf_control%outer_scf%cdft_opt_control%ijacobian(2) + 1
273 IF (scf_control%outer_scf%cdft_opt_control%ijacobian(2) .GE. &
274 scf_control%outer_scf%cdft_opt_control%jacobian_freq(2) .AND. &
275 scf_control%outer_scf%cdft_opt_control%jacobian_freq(2) > 0) &
276 scf_env%outer_scf%deallocate_jacobian = .true.
280 IF ((
ASSOCIATED(qs_env%wf_history)) .AND. &
282 (.NOT. first_step_flag)))
THEN
283 IF (.NOT. dft_control%qs_control%cdft)
THEN
284 CALL wfi_update(qs_env%wf_history, qs_env=qs_env, dt=1.0_dp)
286 IF (dft_control%qs_control%cdft_control%should_purge)
THEN
289 dft_control%qs_control%cdft_control%should_purge = .false.
291 CALL wfi_update(qs_env%wf_history, qs_env=qs_env, dt=1.0_dp)
294 ELSE IF ((scf_control%density_guess .EQ.
history_guess) .AND. &
295 (first_step_flag))
THEN
296 scf_control%max_scf = max_scf_tmp
297 scf_control%outer_scf%have_scf = outer_scf_loop
298 first_step_flag = .false.
305 IF (.NOT. (should_stop))
THEN
314 IF (dft_control%qs_control%cdft) &
315 CALL cdft_control_cleanup(dft_control%qs_control%cdft_control)
317 IF (
PRESENT(has_converged))
THEN
318 has_converged = converged
320 IF (
PRESENT(total_scf_steps))
THEN
321 total_scf_steps = tsteps
345 SUBROUTINE scf_env_do_scf(scf_env, scf_control, qs_env, converged, should_stop, total_scf_steps)
350 LOGICAL,
INTENT(OUT) :: converged, should_stop
351 INTEGER,
INTENT(OUT) :: total_scf_steps
353 CHARACTER(LEN=*),
PARAMETER :: routinen =
'scf_env_do_scf'
355 CHARACTER(LEN=default_string_length) :: description, name
356 INTEGER :: ext_master_id, handle, handle2, i_tmp, &
357 ic, ispin, iter_count, output_unit, &
358 scf_energy_message_tag, total_steps
359 LOGICAL :: diis_step, do_kpoints, energy_only, exit_inner_loop, exit_outer_loop, &
360 inner_loop_converged, just_energy, outer_loop_converged
361 REAL(kind=
dp) :: t1, t2
362 REAL(kind=
dp),
DIMENSION(3) :: res_val_3
366 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: rho_ao_kp
370 TYPE(
mo_set_type),
DIMENSION(:),
POINTER :: mos, mos_last_converged
377 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
382 CALL timeset(routinen, handle)
384 NULLIFY (dft_control, rho, energy, &
385 logger, qs_charges, ks_env, mos, atomic_kind_set, qs_kind_set, &
386 particle_set, dft_section, input, &
387 scf_section, para_env, results, kpoints, pw_env, rho_ao_kp, mos_last_converged)
389 cpassert(
ASSOCIATED(scf_env))
390 cpassert(
ASSOCIATED(qs_env))
397 particle_set=particle_set, &
398 qs_charges=qs_charges, &
400 atomic_kind_set=atomic_kind_set, &
401 qs_kind_set=qs_kind_set, &
405 dft_control=dft_control, &
406 do_kpoints=do_kpoints, &
420 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
"(/,/,T2,A)") &
421 "SCF WAVEFUNCTION OPTIMIZATION"
424 IF (dft_control%switch_surf_dip)
THEN
425 CALL get_qs_env(qs_env, mos_last_converged=mos_last_converged)
426 DO ispin = 1, dft_control%nspins
429 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
"(/,/,T2,A)") &
430 "COPIED mos_last_converged ---> mos"
433 IF ((output_unit > 0) .AND. (.NOT. scf_control%use_ot))
THEN
434 WRITE (unit=output_unit, &
435 fmt=
"(/,T3,A,T12,A,T31,A,T39,A,T59,A,T75,A,/,T3,A)") &
436 "Step",
"Update method",
"Time",
"Convergence",
"Total energy",
"Change", &
442 res_val_3(:) = -1.0_dp
443 description =
"[EXT_SCF_ENER_COMM]"
445 CALL get_results(results, description=description, &
446 values=res_val_3, n_entries=i_tmp)
447 cpassert(i_tmp .EQ. 3)
448 IF (all(res_val_3(:) .LE. 0.0)) &
449 CALL cp_abort(__location__, &
450 " Trying to access result ("//trim(description)// &
451 ") which is not correctly stored.")
452 CALL external_comm%set_handle(nint(res_val_3(1)))
454 ext_master_id = nint(res_val_3(2))
455 scf_energy_message_tag = nint(res_val_3(3))
459 scf_env%outer_scf%iter_count = 0
462 energy%tot_old = 0.0_dp
467 scf_section=scf_section)
470 energy_only, just_energy, exit_inner_loop)
473 dft_control%surf_dip_correct_switch = dft_control%correct_surf_dip
474 IF ((dft_control%correct_surf_dip) .AND. (scf_control%outer_scf%have_scf) .AND. &
475 (scf_env%outer_scf%iter_count > floor(scf_control%outer_scf%max_scf/2.0_dp)))
THEN
476 IF (dft_control%switch_surf_dip)
THEN
477 dft_control%surf_dip_correct_switch = .false.
478 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
"(/,/,T2,A)") &
479 "SURFACE DIPOLE CORRECTION switched off"
485 CALL timeset(routinen//
"_inner_loop", handle2)
487 IF (.NOT. just_energy) scf_env%iter_count = scf_env%iter_count + 1
488 iter_count = iter_count + 1
489 CALL cp_iterate(logger%iter_info, last=.false., iter_nr=iter_count)
491 IF (output_unit > 0)
CALL m_flush(output_unit)
493 total_steps = total_steps + 1
494 just_energy = energy_only
497 calculate_forces=.false.)
504 IF (dft_control%hairy_probes .EQV. .true.)
THEN
505 scf_control%smear%do_smear = .false.
506 CALL qs_scf_new_mos_kp(qs_env, scf_env, scf_control, diis_step, dft_control%probe)
512 IF (dft_control%hairy_probes .EQV. .true.)
THEN
513 scf_control%smear%do_smear = .false.
514 CALL qs_scf_new_mos(qs_env, scf_env, scf_control, scf_section, diis_step, energy_only, &
517 CALL qs_scf_new_mos(qs_env, scf_env, scf_control, scf_section, diis_step, energy_only)
524 IF (dft_control%qs_control%xtb_control%do_tblite)
THEN
536 IF (.NOT. just_energy) energy%tot_old = energy%total
539 IF (scf_energy_message_tag .GT. 0)
THEN
540 CALL external_comm%send(energy%total, ext_master_id, scf_energy_message_tag)
544 exit_inner_loop, inner_loop_converged, output_unit)
548 IF (exit_inner_loop)
THEN
553 outer_loop_converged, exit_outer_loop)
556 IF (exit_outer_loop)
CALL cp_iterate(logger%iter_info, last=.true., iter_nr=iter_count)
568 IF (exit_inner_loop)
THEN
569 CALL timestop(handle2)
574 scf_section,
"PRINT%ITERATION_INFO/TIME_CUMUL"),
cp_p_file)) &
578 IF (scf_env%mixing_method > 0)
THEN
579 DO ic = 1,
SIZE(rho_ao_kp, 2)
580 DO ispin = 1, dft_control%nspins
582 CALL dbcsr_copy(rho_ao_kp(ispin, ic)%matrix, scf_env%p_mix_new(ispin, ic)%matrix, name=name)
590 CALL timestop(handle2)
594 IF (.NOT. scf_control%outer_scf%have_scf)
EXIT scf_outer_loop
598 energy, total_steps, should_stop, outer_loop_converged)
601 IF (exit_outer_loop)
THEN
602 IF ((dft_control%switch_surf_dip) .AND. (outer_loop_converged) .AND. &
603 (dft_control%surf_dip_correct_switch))
THEN
604 DO ispin = 1, dft_control%nspins
607 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
"(/,/,T2,A)") &
608 "COPIED mos ---> mos_last_converged"
612 IF (exit_outer_loop)
EXIT scf_outer_loop
619 END DO scf_outer_loop
621 converged = inner_loop_converged .AND. outer_loop_converged
622 total_scf_steps = total_steps
624 IF (dft_control%qs_control%cdft) &
625 dft_control%qs_control%cdft_control%total_steps = &
626 dft_control%qs_control%cdft_control%total_steps + total_steps
628 IF (.NOT. converged)
THEN
629 IF (scf_control%ignore_convergence_failure .OR. should_stop)
THEN
630 CALL cp_warn(__location__,
"SCF run NOT converged")
632 CALL cp_abort(__location__, &
633 "SCF run NOT converged. To continue the calculation "// &
634 "regardless, please set the keyword IGNORE_CONVERGENCE_FAILURE.")
639 IF (qs_env%energy_correction)
THEN
641 ec_env%do_skip = .false.
642 IF (ec_env%skip_ec .AND. .NOT. converged) ec_env%do_skip = .true.
646 DO ispin = 1,
SIZE(mos)
647 IF (mos(ispin)%use_mo_coeff_b)
THEN
648 IF (.NOT.
ASSOCIATED(mos(ispin)%mo_coeff_b)) &
649 cpabort(
"mo_coeff_b is not allocated")
656 CALL timestop(handle)
676 CHARACTER(LEN=*),
PARAMETER :: routinen =
'init_scf_loop'
678 INTEGER :: handle, ispin, nmo, number_of_ot_envs
679 LOGICAL :: do_kpoints, do_rotation, &
680 has_unit_metric, is_full_all
682 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks, matrix_s
683 TYPE(
dbcsr_type),
POINTER :: orthogonality_metric
689 CALL timeset(routinen, handle)
691 NULLIFY (scf_control, matrix_s, matrix_ks, dft_control, mos, mo_coeff, kpoints)
693 cpassert(
ASSOCIATED(scf_env))
694 cpassert(
ASSOCIATED(qs_env))
697 scf_control=scf_control, &
698 dft_control=dft_control, &
699 do_kpoints=do_kpoints, &
704 DO ispin = 1,
SIZE(mos)
705 IF (mos(1)%use_mo_coeff_b)
THEN
711 DO ispin = 1, dft_control%nspins
713 IF (.NOT. scf_control%diagonalization%mom)
THEN
716 IF (dft_control%hairy_probes .EQV. .true.)
THEN
717 IF (scf_env%outer_scf%iter_count > 0)
THEN
718 scf_control%smear%do_smear = .false.
720 smear=scf_control%smear, &
721 probe=dft_control%probe)
725 smear=scf_control%smear)
730 SELECT CASE (scf_env%method)
733 cpabort(
"unknown scf method method:"//
cp_to_string(scf_env%method))
737 IF (.NOT. scf_env%skip_diis)
THEN
738 IF (.NOT.
ASSOCIATED(scf_env%scf_diis_buffer))
THEN
739 ALLOCATE (scf_env%scf_diis_buffer)
740 CALL qs_diis_b_create(scf_env%scf_diis_buffer, nbuffer=scf_control%max_diis)
746 IF (.NOT. scf_env%skip_diis)
THEN
748 IF (.NOT.
ASSOCIATED(kpoints%scf_diis_buffer))
THEN
749 ALLOCATE (kpoints%scf_diis_buffer)
754 IF (.NOT.
ASSOCIATED(scf_env%scf_diis_buffer))
THEN
755 ALLOCATE (scf_env%scf_diis_buffer)
756 CALL qs_diis_b_create(scf_env%scf_diis_buffer, nbuffer=scf_control%max_diis)
763 CALL get_qs_env(qs_env, matrix_ks=matrix_ks, matrix_s=matrix_s)
765 IF (.NOT. scf_env%skip_diis)
THEN
766 IF (.NOT.
ASSOCIATED(scf_env%scf_diis_buffer))
THEN
767 ALLOCATE (scf_env%scf_diis_buffer)
768 CALL qs_diis_b_create(scf_env%scf_diis_buffer, nbuffer=scf_control%max_diis)
774 IF (dft_control%qs_control%dftb .OR. &
775 dft_control%qs_control%xtb .OR. &
776 dft_control%qs_control%semi_empirical)
THEN
777 cpabort(
"DFTB and SE not available with OT/DIAG")
783 scf_control%diagonalization%ot_settings%preconditioner_type, &
787 scf_control%diagonalization%ot_settings%preconditioner_type, &
788 scf_control%diagonalization%ot_settings%precond_solver_type, &
789 scf_control%diagonalization%ot_settings%energy_gap, dft_control%nspins)
795 has_unit_metric=has_unit_metric, &
803 IF (scf_control%do_outer_scf_reortho)
THEN
804 IF (scf_control%outer_scf%have_scf .AND. .NOT. dft_control%restricted)
THEN
805 IF (scf_env%outer_scf%iter_count > 0)
THEN
806 DO ispin = 1, dft_control%nspins
807 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, nmo=nmo)
808 IF (has_unit_metric)
THEN
820 IF (.NOT.
ASSOCIATED(scf_env%qs_ot_env))
THEN
823 number_of_ot_envs = dft_control%nspins
824 IF (dft_control%restricted) number_of_ot_envs = 1
826 ALLOCATE (scf_env%qs_ot_env(number_of_ot_envs))
829 IF (scf_env%outer_scf%iter_count > 0)
THEN
830 IF (scf_env%iter_delta < scf_control%eps_diis)
THEN
831 scf_env%qs_ot_env(1)%settings%ot_state = 1
837 IF (scf_env%outer_scf%iter_count > 0)
THEN
838 IF (scf_env%qs_ot_env(1)%settings%ot_state == 1)
THEN
839 scf_control%max_scf = max(scf_env%qs_ot_env(1)%settings%max_scf_diis, &
845 IF (dft_control%restricted)
THEN
846 scf_env%qs_ot_env(1)%restricted = .true.
848 IF (.NOT. scf_env%qs_ot_env(1)%settings%do_rotation) &
849 CALL cp_abort(__location__, &
850 "Restricted calculation with OT requires orbital rotation. Please "// &
851 "activate the OT%ROTATION keyword!")
853 scf_env%qs_ot_env(:)%restricted = .false.
858 do_rotation = scf_env%qs_ot_env(1)%settings%do_rotation
861 IF (do_rotation .AND. is_full_all) &
862 cpabort(
'PRECONDITIONER FULL_ALL is not compatible with ROTATION.')
866 calculate_forces=.false.)
870 IF (.NOT. reuse_precond) &
872 scf_env%qs_ot_env(1)%settings%preconditioner_type, &
879 IF (has_unit_metric)
THEN
880 NULLIFY (orthogonality_metric)
882 orthogonality_metric => matrix_s(1)%matrix
885 IF (.NOT. reuse_precond) &
887 scf_env%qs_ot_env(1)%settings%preconditioner_type, &
888 scf_env%qs_ot_env(1)%settings%precond_solver_type, &
889 scf_env%qs_ot_env(1)%settings%energy_gap, dft_control%nspins, &
890 has_unit_metric=has_unit_metric, &
891 chol_type=scf_env%qs_ot_env(1)%settings%cholesky_type)
892 IF (reuse_precond) reuse_precond = .false.
894 CALL ot_scf_init(mo_array=mos, matrix_s=orthogonality_metric, &
895 broyden_adaptive_sigma=qs_env%broyden_adaptive_sigma, &
896 qs_ot_env=scf_env%qs_ot_env, matrix_ks=matrix_ks(1)%matrix)
898 SELECT CASE (scf_env%qs_ot_env(1)%settings%preconditioner_type)
901 DO ispin = 1,
SIZE(scf_env%qs_ot_env)
903 scf_env%ot_preconditioner(ispin)%preconditioner)
906 DO ispin = 1,
SIZE(scf_env%qs_ot_env)
908 scf_env%ot_preconditioner(1)%preconditioner)
911 DO ispin = 1,
SIZE(scf_env%qs_ot_env)
913 scf_env%ot_preconditioner(1)%preconditioner)
919 do_rotation = scf_env%qs_ot_env(1)%settings%do_rotation
920 DO ispin = 1,
SIZE(mos)
921 IF (.NOT. mos(ispin)%uniform_occupation)
THEN
922 cpassert(do_rotation)
928 IF (dft_control%low_spin_roks)
THEN
930 do_rotation = scf_env%qs_ot_env(1)%settings%do_rotation
931 cpassert(do_rotation)
934 CALL timestop(handle)
949 CHARACTER(len=*),
PARAMETER :: routinen =
'scf_env_cleanup'
953 CALL timeset(routinen, handle)
958 IF (
ASSOCIATED(scf_env%scf_work1_red))
THEN
961 IF (
ASSOCIATED(scf_env%scf_work2))
THEN
963 DEALLOCATE (scf_env%scf_work2)
964 NULLIFY (scf_env%scf_work2)
966 IF (
ASSOCIATED(scf_env%scf_work2_red))
THEN
968 DEALLOCATE (scf_env%scf_work2_red)
969 NULLIFY (scf_env%scf_work2_red)
971 IF (
ASSOCIATED(scf_env%ortho))
THEN
973 DEALLOCATE (scf_env%ortho)
974 NULLIFY (scf_env%ortho)
976 IF (
ASSOCIATED(scf_env%ortho_red))
THEN
978 DEALLOCATE (scf_env%ortho_red)
979 NULLIFY (scf_env%ortho_red)
981 IF (
ASSOCIATED(scf_env%ortho_m1))
THEN
983 DEALLOCATE (scf_env%ortho_m1)
984 NULLIFY (scf_env%ortho_m1)
986 IF (
ASSOCIATED(scf_env%ortho_m1_red))
THEN
988 DEALLOCATE (scf_env%ortho_m1_red)
989 NULLIFY (scf_env%ortho_m1_red)
992 IF (
ASSOCIATED(scf_env%ortho_dbcsr))
THEN
995 IF (
ASSOCIATED(scf_env%buf1_dbcsr))
THEN
998 IF (
ASSOCIATED(scf_env%buf2_dbcsr))
THEN
1002 IF (
ASSOCIATED(scf_env%p_mix_new))
THEN
1006 IF (
ASSOCIATED(scf_env%p_delta))
THEN
1011 SELECT CASE (scf_env%method)
1028 cpabort(
"unknown scf method method:"//
cp_to_string(scf_env%method))
1031 IF (
ASSOCIATED(scf_env%outer_scf%variables))
THEN
1032 DEALLOCATE (scf_env%outer_scf%variables)
1034 IF (
ASSOCIATED(scf_env%outer_scf%count))
THEN
1035 DEALLOCATE (scf_env%outer_scf%count)
1037 IF (
ASSOCIATED(scf_env%outer_scf%gradient))
THEN
1038 DEALLOCATE (scf_env%outer_scf%gradient)
1040 IF (
ASSOCIATED(scf_env%outer_scf%energy))
THEN
1041 DEALLOCATE (scf_env%outer_scf%energy)
1043 IF (
ASSOCIATED(scf_env%outer_scf%inv_jacobian) .AND. &
1044 scf_env%outer_scf%deallocate_jacobian)
THEN
1045 DEALLOCATE (scf_env%outer_scf%inv_jacobian)
1048 CALL timestop(handle)
1062 LOGICAL,
INTENT(OUT) :: should_stop
1064 CHARACTER(len=*),
PARAMETER :: routinen =
'cdft_scf'
1066 INTEGER :: handle, iatom, ispin, ivar, nmo, nvar, &
1068 LOGICAL :: cdft_loop_converged, converged, &
1069 exit_cdft_loop, first_iteration, &
1070 my_uocc, uniform_occupation
1071 REAL(kind=
dp),
DIMENSION(:),
POINTER :: mo_occupations
1074 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_s, rho_ao
1086 NULLIFY (scf_env, ks_env, energy, rho, matrix_s, rho_ao, cdft_control, logger, &
1087 dft_control, pw_env, auxbas_pw_pool, energy, ks_env, scf_env, dft_section, &
1088 input, scf_section, scf_control, mos, mo_occupations)
1091 cpassert(
ASSOCIATED(qs_env))
1092 CALL get_qs_env(qs_env, scf_env=scf_env, energy=energy, &
1093 dft_control=dft_control, scf_control=scf_control, &
1094 ks_env=ks_env, input=input)
1096 CALL timeset(routinen//
"_loop", handle)
1100 extension=
".scfLog")
1101 first_iteration = .true.
1103 cdft_control => dft_control%qs_control%cdft_control
1105 scf_env%outer_scf%iter_count = 0
1106 cdft_control%total_steps = 0
1109 IF (output_unit > 0)
THEN
1110 WRITE (unit=output_unit, fmt=
"(/,/,T2,A)") &
1111 "CDFT EXTERNAL SCF WAVEFUNCTION OPTIMIZATION"
1114 IF (cdft_control%reuse_precond)
THEN
1115 reuse_precond = .false.
1116 cdft_control%nreused = 0
1122 CALL scf_env_do_scf(scf_env=scf_env, scf_control=scf_control, qs_env=qs_env, &
1123 converged=converged, should_stop=should_stop, total_scf_steps=tsteps)
1125 IF (cdft_control%reuse_precond)
THEN
1129 IF (scf_env%outer_scf%iter_count == 1 .AND. scf_env%iter_count == 1 &
1130 .AND. cdft_control%total_steps /= 1) &
1131 cdft_control%nreused = cdft_control%nreused - 1
1133 IF (scf_env%outer_scf%iter_count == 1 .AND. scf_env%iter_count .LE. cdft_control%precond_freq .AND. &
1134 cdft_control%total_steps /= 1 .AND. cdft_control%nreused .LT. cdft_control%max_reuse)
THEN
1135 reuse_precond = .true.
1136 cdft_control%nreused = cdft_control%nreused + 1
1138 reuse_precond = .false.
1139 cdft_control%nreused = 0
1143 IF (first_iteration .AND. cdft_control%purge_history)
THEN
1144 cdft_control%istep = cdft_control%istep + 1
1145 IF (scf_env%outer_scf%iter_count .GT. 1)
THEN
1146 cdft_control%nbad_conv = cdft_control%nbad_conv + 1
1147 IF (cdft_control%nbad_conv .GE. cdft_control%purge_freq .AND. &
1148 cdft_control%istep .GE. cdft_control%purge_offset)
THEN
1149 cdft_control%nbad_conv = 0
1150 cdft_control%istep = 0
1151 cdft_control%should_purge = .true.
1155 first_iteration = .false.
1159 cdft_loop_converged, exit_cdft_loop)
1161 energy, cdft_control%total_steps, &
1162 should_stop, cdft_loop_converged, cdft_loop=.true.)
1163 IF (exit_cdft_loop)
EXIT cdft_outer_loop
1165 CALL qs_calculate_inverse_jacobian(qs_env)
1167 CALL qs_cdft_line_search(qs_env)
1172 END DO cdft_outer_loop
1174 cdft_control%ienergy = cdft_control%ienergy + 1
1177 IF (cdft_control%do_et)
THEN
1178 CALL get_qs_env(qs_env=qs_env, matrix_s=matrix_s, mos=mos)
1179 nvar =
SIZE(cdft_control%target)
1181 ALLOCATE (cdft_control%wmat(nvar))
1184 CALL dbcsr_copy(cdft_control%wmat(ivar)%matrix, matrix_s(1)%matrix, &
1185 name=
"ET_RESTRAINT_MATRIX")
1186 CALL dbcsr_set(cdft_control%wmat(ivar)%matrix, 0.0_dp)
1187 CALL integrate_v_rspace(cdft_control%group(ivar)%weight, &
1188 hmat=cdft_control%wmat(ivar), qs_env=qs_env, &
1189 calculate_forces=.false., &
1190 gapw=dft_control%qs_control%gapw)
1194 CALL dbcsr_copy(cdft_control%matrix_s%matrix, matrix_s(1)%matrix, &
1197 NULLIFY (cdft_control%mo_coeff)
1198 ALLOCATE (cdft_control%mo_coeff(dft_control%nspins))
1199 DO ispin = 1, dft_control%nspins
1200 CALL cp_fm_create(matrix=cdft_control%mo_coeff(ispin), &
1201 matrix_struct=qs_env%mos(ispin)%mo_coeff%matrix_struct, &
1202 name=
"MO_COEFF_A"//trim(adjustl(
cp_to_string(ispin)))//
"MATRIX")
1204 cdft_control%mo_coeff(ispin))
1207 IF (cdft_control%calculate_metric)
THEN
1210 ALLOCATE (cdft_control%matrix_p(dft_control%nspins))
1211 DO ispin = 1, dft_control%nspins
1212 NULLIFY (cdft_control%matrix_p(ispin)%matrix)
1214 CALL dbcsr_copy(cdft_control%matrix_p(ispin)%matrix, rho_ao(ispin)%matrix, &
1215 name=
"DENSITY MATRIX")
1219 uniform_occupation = .true.
1220 DO ispin = 1, dft_control%nspins
1221 CALL get_mo_set(mo_set=mos(ispin), uniform_occupation=my_uocc)
1222 uniform_occupation = uniform_occupation .AND. my_uocc
1224 IF (.NOT. uniform_occupation)
THEN
1225 ALLOCATE (cdft_control%occupations(dft_control%nspins))
1226 DO ispin = 1, dft_control%nspins
1229 occupation_numbers=mo_occupations)
1230 ALLOCATE (cdft_control%occupations(ispin)%array(nmo))
1231 cdft_control%occupations(ispin)%array(1:nmo) = mo_occupations(1:nmo)
1239 IF (.NOT. (cdft_control%save_pot .OR. cdft_control%transfer_pot))
THEN
1241 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
1242 DO iatom = 1,
SIZE(cdft_control%group)
1243 CALL auxbas_pw_pool%give_back_pw(cdft_control%group(iatom)%weight)
1244 DEALLOCATE (cdft_control%group(iatom)%weight)
1246 IF (cdft_control%atomic_charges)
THEN
1247 DO iatom = 1, cdft_control%natoms
1248 CALL auxbas_pw_pool%give_back_pw(cdft_control%charge(iatom))
1250 DEALLOCATE (cdft_control%charge)
1253 cdft_control%becke_control%cavity_confine)
THEN
1254 IF (.NOT.
ASSOCIATED(cdft_control%becke_control%cavity_mat))
THEN
1255 CALL auxbas_pw_pool%give_back_pw(cdft_control%becke_control%cavity)
1257 DEALLOCATE (cdft_control%becke_control%cavity_mat)
1260 IF (
ASSOCIATED(cdft_control%hirshfeld_control%hirshfeld_env%fnorm))
THEN
1261 CALL auxbas_pw_pool%give_back_pw(cdft_control%hirshfeld_control%hirshfeld_env%fnorm)
1264 IF (
ASSOCIATED(cdft_control%charges_fragment))
DEALLOCATE (cdft_control%charges_fragment)
1265 cdft_control%need_pot = .true.
1266 cdft_control%external_control = .false.
1269 CALL timestop(handle)
1280 SUBROUTINE cdft_control_cleanup(cdft_control)
1283 IF (
ASSOCIATED(cdft_control%constraint%variables)) &
1284 DEALLOCATE (cdft_control%constraint%variables)
1285 IF (
ASSOCIATED(cdft_control%constraint%count)) &
1286 DEALLOCATE (cdft_control%constraint%count)
1287 IF (
ASSOCIATED(cdft_control%constraint%gradient)) &
1288 DEALLOCATE (cdft_control%constraint%gradient)
1289 IF (
ASSOCIATED(cdft_control%constraint%energy)) &
1290 DEALLOCATE (cdft_control%constraint%energy)
1291 IF (
ASSOCIATED(cdft_control%constraint%inv_jacobian) .AND. &
1292 cdft_control%constraint%deallocate_jacobian) &
1293 DEALLOCATE (cdft_control%constraint%inv_jacobian)
1295 END SUBROUTINE cdft_control_cleanup
1303 SUBROUTINE qs_calculate_inverse_jacobian(qs_env)
1306 CHARACTER(LEN=*),
PARAMETER :: routinen =
'qs_calculate_inverse_jacobian'
1308 CHARACTER(len=default_path_length) :: project_name
1309 INTEGER :: counter, handle, i, ispin, iter_count, &
1310 iwork, j, max_scf, nspins, nsteps, &
1311 nvar, nwork, output_unit, pwork, &
1313 LOGICAL :: converged, explicit_jacobian, &
1314 should_build, should_stop, &
1316 REAL(kind=
dp) :: inv_error, step_size
1317 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: coeff, dh, step_multiplier
1318 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: jacobian
1319 REAL(kind=
dp),
DIMENSION(:),
POINTER :: energy
1320 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: gradient, inv_jacobian
1324 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: rho_ao_kp
1326 TYPE(
mo_set_type),
ALLOCATABLE,
DIMENSION(:) :: mos_stashed
1335 NULLIFY (energy, gradient, p_rmpv, rho_ao_kp, mos, rho, &
1336 ks_env, scf_env, scf_control, dft_control, cdft_control, &
1337 inv_jacobian, para_env, tmp_logger, energy_qs)
1340 cpassert(
ASSOCIATED(qs_env))
1341 CALL get_qs_env(qs_env, scf_env=scf_env, ks_env=ks_env, &
1342 scf_control=scf_control, mos=mos, rho=rho, &
1343 dft_control=dft_control, &
1344 para_env=para_env, energy=energy_qs)
1345 explicit_jacobian = .false.
1346 should_build = .false.
1347 use_md_history = .false.
1348 iter_count = scf_env%outer_scf%iter_count
1350 IF (.NOT.
ASSOCIATED(scf_control%outer_scf%cdft_opt_control))
RETURN
1352 CALL timeset(routinen, handle)
1354 IF (scf_control%outer_scf%cdft_opt_control%jacobian_restart)
THEN
1356 should_build = .false.
1359 IF (should_build)
THEN
1360 scf_env%outer_scf%deallocate_jacobian = .false.
1362 IF (explicit_jacobian)
THEN
1364 cdft_control => dft_control%qs_control%cdft_control
1365 IF (.NOT.
ASSOCIATED(cdft_control)) &
1366 CALL cp_abort(__location__, &
1367 "Optimizers that need the explicit Jacobian can"// &
1368 " only be used together with a valid CDFT constraint.")
1370 project_name = logger%iter_info%project_name
1371 CALL create_tmp_logger(para_env, project_name,
"-JacobianInfo.out", output_unit, tmp_logger)
1373 nspins = dft_control%nspins
1374 ALLOCATE (mos_stashed(nspins))
1375 DO ispin = 1, nspins
1379 p_rmpv => rho_ao_kp(:, 1)
1381 nvar =
SIZE(scf_env%outer_scf%variables, 1)
1382 max_scf = scf_control%outer_scf%max_scf + 1
1383 ALLOCATE (gradient(nvar, max_scf))
1384 gradient = scf_env%outer_scf%gradient
1385 ALLOCATE (energy(max_scf))
1386 energy = scf_env%outer_scf%energy
1387 ALLOCATE (jacobian(nvar, nvar))
1389 nsteps = cdft_control%total_steps
1392 twork = pwork - nwork
1394 jacobian(i, :) = coeff(0)*scf_env%outer_scf%gradient(i, iter_count)
1399 IF (output_unit > 0)
THEN
1400 WRITE (output_unit, fmt=
"(A)")
" "
1401 WRITE (output_unit, fmt=
"(A)")
" #####################################"
1402 WRITE (output_unit,
'(A,I3,A,I3,A)') &
1403 " ### Constraint ", i,
" of ", nvar,
" ###"
1404 WRITE (output_unit, fmt=
"(A)")
" #####################################"
1407 DO iwork = nwork, pwork
1408 IF (iwork == 0) cycle
1409 counter = counter + 1
1410 IF (output_unit > 0)
THEN
1411 WRITE (output_unit, fmt=
"(A)")
" #####################################"
1412 WRITE (output_unit,
'(A,I3,A,I3,A)') &
1413 " ### Energy evaluation ", counter,
" of ", twork,
" ###"
1414 WRITE (output_unit, fmt=
"(A)")
" #####################################"
1416 IF (
SIZE(scf_control%outer_scf%cdft_opt_control%jacobian_step) == 1)
THEN
1417 step_size = scf_control%outer_scf%cdft_opt_control%jacobian_step(1)
1419 step_size = scf_control%outer_scf%cdft_opt_control%jacobian_step(i)
1421 scf_env%outer_scf%variables(:, iter_count + 1) = scf_env%outer_scf%variables(:, iter_count)
1422 scf_env%outer_scf%variables(i, iter_count + 1) = scf_env%outer_scf%variables(i, iter_count) + &
1423 step_multiplier(iwork)*step_size
1427 CALL scf_env_do_scf(scf_env=scf_env, scf_control=scf_control, qs_env=qs_env, &
1428 converged=converged, should_stop=should_stop, total_scf_steps=tsteps)
1431 scf_env%outer_scf%iter_count = scf_env%outer_scf%iter_count + 1
1434 energy_qs, cdft_control%total_steps, &
1435 should_stop=.false., outer_loop_converged=.false., cdft_loop=.false.)
1436 scf_env%outer_scf%iter_count = scf_env%outer_scf%iter_count - 1
1439 jacobian(j, i) = jacobian(j, i) + coeff(iwork)*scf_env%outer_scf%gradient(j, iter_count + 1)
1442 scf_env%outer_scf%variables(:, iter_count + 1) = 0.0_dp
1443 scf_env%outer_scf%gradient = gradient
1444 scf_env%outer_scf%energy = energy
1445 cdft_control%total_steps = nsteps
1446 DO ispin = 1, nspins
1450 p_rmpv(ispin)%matrix)
1461 jacobian(i, j) = jacobian(i, j)/dh(j)
1464 IF (.NOT.
ASSOCIATED(scf_env%outer_scf%inv_jacobian)) &
1465 ALLOCATE (scf_env%outer_scf%inv_jacobian(nvar, nvar))
1466 inv_jacobian => scf_env%outer_scf%inv_jacobian
1468 scf_control%outer_scf%cdft_opt_control%broyden_update = .false.
1470 DO ispin = 1, nspins
1473 DEALLOCATE (mos_stashed, jacobian, gradient, energy, coeff, step_multiplier, dh)
1474 IF (output_unit > 0)
THEN
1475 WRITE (output_unit, fmt=
"(/,A)") &
1476 " ================================== JACOBIAN CALCULATED =================================="
1484 IF (
ASSOCIATED(scf_env%outer_scf%inv_jacobian) .AND. para_env%is_source())
THEN
1489 scf_control%outer_scf%cdft_opt_control%ijacobian(1) = scf_control%outer_scf%cdft_opt_control%ijacobian(1) + 1
1490 CALL timestop(handle)
1492 END SUBROUTINE qs_calculate_inverse_jacobian
1502 SUBROUTINE qs_cdft_line_search(qs_env)
1505 CHARACTER(LEN=*),
PARAMETER :: routinen =
'qs_cdft_line_search'
1507 CHARACTER(len=default_path_length) :: project_name
1508 INTEGER :: handle, i, ispin, iter_count, &
1509 max_linesearch, max_scf, nspins, &
1510 nsteps, nvar, output_unit, tsteps
1511 LOGICAL :: continue_ls, continue_ls_exit, converged, do_linesearch, found_solution, &
1512 reached_maxls, should_exit, should_stop, sign_changed
1513 LOGICAL,
ALLOCATABLE,
DIMENSION(:) :: positive_sign
1514 REAL(kind=
dp) :: alpha, alpha_ls, factor, norm_ls
1515 REAL(kind=
dp),
DIMENSION(:),
POINTER :: energy
1516 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: gradient, inv_jacobian
1517 REAL(kind=
dp),
EXTERNAL :: dnrm2
1521 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: rho_ao_kp
1531 CALL timeset(routinen, handle)
1533 NULLIFY (energy, gradient, p_rmpv, rho_ao_kp, mos, rho, &
1534 ks_env, scf_env, scf_control, dft_control, &
1535 cdft_control, inv_jacobian, para_env, &
1536 tmp_logger, energy_qs)
1539 cpassert(
ASSOCIATED(qs_env))
1540 CALL get_qs_env(qs_env, scf_env=scf_env, ks_env=ks_env, &
1541 scf_control=scf_control, mos=mos, rho=rho, &
1542 dft_control=dft_control, &
1543 para_env=para_env, energy=energy_qs)
1544 do_linesearch = .false.
1545 SELECT CASE (scf_control%outer_scf%optimizer)
1547 do_linesearch = .false.
1549 do_linesearch = .true.
1551 SELECT CASE (scf_control%outer_scf%cdft_opt_control%broyden_type)
1553 do_linesearch = .false.
1555 cdft_control => dft_control%qs_control%cdft_control
1556 IF (.NOT.
ASSOCIATED(cdft_control)) &
1557 CALL cp_abort(__location__, &
1558 "Optimizers that perform a line search can"// &
1559 " only be used together with a valid CDFT constraint")
1560 IF (
ASSOCIATED(scf_env%outer_scf%inv_jacobian)) &
1561 do_linesearch = .true.
1564 IF (do_linesearch)
THEN
1566 TYPE(
mo_set_type),
DIMENSION(:),
ALLOCATABLE :: mos_ls, mos_stashed
1567 cdft_control => dft_control%qs_control%cdft_control
1568 IF (.NOT.
ASSOCIATED(cdft_control)) &
1569 CALL cp_abort(__location__, &
1570 "Optimizers that perform a line search can"// &
1571 " only be used together with a valid CDFT constraint")
1572 cpassert(
ASSOCIATED(scf_env%outer_scf%inv_jacobian))
1573 cpassert(
ASSOCIATED(scf_control%outer_scf%cdft_opt_control))
1574 alpha = scf_control%outer_scf%cdft_opt_control%newton_step_save
1575 iter_count = scf_env%outer_scf%iter_count
1577 project_name = logger%iter_info%project_name
1578 CALL create_tmp_logger(para_env, project_name,
"-LineSearch.out", output_unit, tmp_logger)
1580 nspins = dft_control%nspins
1581 ALLOCATE (mos_stashed(nspins))
1582 DO ispin = 1, nspins
1586 p_rmpv => rho_ao_kp(:, 1)
1587 nsteps = cdft_control%total_steps
1589 nvar =
SIZE(scf_env%outer_scf%variables, 1)
1590 max_scf = scf_control%outer_scf%max_scf + 1
1591 max_linesearch = scf_control%outer_scf%cdft_opt_control%max_ls
1592 continue_ls = scf_control%outer_scf%cdft_opt_control%continue_ls
1593 factor = scf_control%outer_scf%cdft_opt_control%factor_ls
1594 continue_ls_exit = .false.
1595 found_solution = .false.
1596 ALLOCATE (gradient(nvar, max_scf))
1597 gradient = scf_env%outer_scf%gradient
1598 ALLOCATE (energy(max_scf))
1599 energy = scf_env%outer_scf%energy
1600 reached_maxls = .false.
1602 IF (scf_control%outer_scf%cdft_opt_control%broyden_update)
THEN
1605 scf_env%outer_scf%variables(:, iter_count + 1) = 0
1606 scf_control%outer_scf%cdft_opt_control%broyden_update = .false.
1609 IF (output_unit > 0)
THEN
1610 WRITE (output_unit, fmt=
"(/,A)") &
1611 " ================================== LINE SEARCH STARTED =================================="
1612 WRITE (output_unit, fmt=
"(A,I5,A)") &
1613 " Evaluating optimal step size for optimizer using a maximum of", max_linesearch,
" steps"
1614 IF (continue_ls)
THEN
1615 WRITE (output_unit, fmt=
"(A)") &
1616 " Line search continues until best step size is found or max steps are reached"
1618 WRITE (output_unit,
'(/,A,F5.3)') &
1619 " Initial step size: ", alpha
1620 WRITE (output_unit,
'(/,A,F5.3)') &
1621 " Step size update factor: ", factor
1622 WRITE (output_unit,
'(/,A,I10,A,I10)') &
1623 " Energy evaluation: ", cdft_control%ienergy,
", CDFT SCF iteration: ", iter_count
1627 DO i = 1, max_linesearch
1628 IF (output_unit > 0)
THEN
1629 WRITE (output_unit, fmt=
"(A)")
" "
1630 WRITE (output_unit, fmt=
"(A)")
" #####################################"
1631 WRITE (output_unit,
'(A,I10,A)') &
1632 " ### Line search step: ", i,
" ###"
1633 WRITE (output_unit, fmt=
"(A)")
" #####################################"
1635 inv_jacobian => scf_env%outer_scf%inv_jacobian
1637 scf_env%outer_scf%variables(:, iter_count + 1) = scf_env%outer_scf%variables(:, iter_count) - alpha* &
1638 matmul(inv_jacobian, scf_env%outer_scf%gradient(:, iter_count))
1643 CALL scf_env_do_scf(scf_env=scf_env, scf_control=scf_control, qs_env=qs_env, &
1644 converged=converged, should_stop=should_stop, total_scf_steps=tsteps)
1647 scf_env%outer_scf%iter_count = scf_env%outer_scf%iter_count + 1
1650 energy_qs, cdft_control%total_steps, &
1651 should_stop=.false., outer_loop_converged=.false., cdft_loop=.false.)
1652 scf_env%outer_scf%iter_count = scf_env%outer_scf%iter_count - 1
1654 IF (continue_ls .AND. .NOT.
ALLOCATED(positive_sign))
THEN
1655 ALLOCATE (positive_sign(nvar))
1657 positive_sign(ispin) = scf_env%outer_scf%gradient(ispin, iter_count + 1) .GE. 0.0_dp
1661 inv_jacobian => scf_env%outer_scf%inv_jacobian
1662 IF (dnrm2(nvar, scf_env%outer_scf%gradient(:, iter_count + 1), 1) .LT. &
1663 dnrm2(nvar, scf_env%outer_scf%gradient(:, iter_count), 1))
THEN
1665 IF (.NOT. continue_ls)
THEN
1666 should_exit = .true.
1670 IF (found_solution)
THEN
1672 IF (dnrm2(nvar, scf_env%outer_scf%gradient(:, iter_count + 1), 1) .GT. norm_ls)
THEN
1674 continue_ls_exit = .true.
1678 IF (.NOT. continue_ls_exit)
THEN
1679 should_exit = .false.
1681 found_solution = .true.
1682 norm_ls = dnrm2(nvar, scf_env%outer_scf%gradient(:, iter_count + 1), 1)
1685 sign_changed = .true.
1687 sign_changed = sign_changed .AND. (positive_sign(ispin) .NEQV. &
1688 scf_env%outer_scf%gradient(ispin, iter_count + 1) .GE. 0.0_dp)
1690 IF (.NOT.
ALLOCATED(mos_ls))
THEN
1691 ALLOCATE (mos_ls(nspins))
1693 DO ispin = 1, nspins
1697 DO ispin = 1, nspins
1700 alpha = alpha*factor
1702 IF (i == max_linesearch) continue_ls_exit = .true.
1704 IF (sqrt(maxval(scf_env%outer_scf%gradient(:, scf_env%outer_scf%iter_count + 1)**2)) .LT. &
1705 scf_control%outer_scf%eps_scf) &
1706 continue_ls_exit = .true.
1708 IF (sign_changed) continue_ls_exit = .true.
1713 should_exit = .false.
1715 alpha = alpha*factor
1717 IF (continue_ls_exit)
THEN
1720 DO ispin = 1, nspins
1724 p_rmpv(ispin)%matrix)
1730 should_exit = .true.
1733 IF (.NOT. should_exit .AND. &
1734 (i == max_linesearch .AND. converged .AND. .NOT. found_solution))
THEN
1735 should_exit = .true.
1736 reached_maxls = .true.
1737 alpha = alpha*(1.0_dp/factor)
1740 scf_env%outer_scf%variables(:, iter_count + 1) = 0.0_dp
1741 scf_env%outer_scf%gradient = gradient
1742 scf_env%outer_scf%energy = energy
1744 IF (should_exit)
EXIT
1746 cdft_control%total_steps = nsteps
1747 DO ispin = 1, nspins
1751 p_rmpv(ispin)%matrix)
1756 scf_control%outer_scf%cdft_opt_control%newton_step = alpha
1757 IF (.NOT. should_exit)
THEN
1758 CALL cp_warn(__location__, &
1759 "Line search did not converge. CDFT SCF proceeds with fixed step size.")
1760 scf_control%outer_scf%cdft_opt_control%newton_step = scf_control%outer_scf%cdft_opt_control%newton_step_save
1762 IF (reached_maxls) &
1763 CALL cp_warn(__location__, &
1764 "Line search did not converge. CDFT SCF proceeds with lasted iterated step size.")
1768 DO ispin = 1, nspins
1771 DEALLOCATE (mos_stashed, gradient, energy)
1772 IF (
ALLOCATED(positive_sign))
DEALLOCATE (positive_sign)
1773 IF (output_unit > 0)
THEN
1774 WRITE (output_unit, fmt=
"(/,A)") &
1775 " ================================== LINE SEARCH COMPLETE =================================="
1781 CALL timestop(handle)
1783 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 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, tb_tblite)
Set the QUICKSTEP environment.
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, tb_tblite)
Get 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 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_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.