143 LOGICAL :: restricted = .false.
144 INTEGER :: spin_index = 0, kpoint_index = 0, local_kpoint_index = 0
145 REAL(kind=
dp) :: kpoint_weight = 1.0_dp
146 LOGICAL :: has_kpoint_context = .false.
147 LOGICAL :: state_allocated = .false.
148 LOGICAL :: has_complex_kpoint_state = .false.
159 TYPE(
dbcsr_type),
POINTER :: matrix_p => null(), matrix_p_im => null()
160 TYPE(
dbcsr_type),
POINTER :: matrix_r => null(), matrix_r_im => null()
161 TYPE(
dbcsr_type),
POINTER :: matrix_sinp => null(), matrix_sinp_im => null()
162 TYPE(
dbcsr_type),
POINTER :: matrix_cosp => null(), matrix_cosp_im => null()
165 TYPE(
dbcsr_type),
POINTER :: matrix_buf1 => null(), matrix_buf1_im => null()
166 TYPE(
dbcsr_type),
POINTER :: matrix_buf2 => null(), matrix_buf2_im => null()
167 TYPE(
dbcsr_type),
POINTER :: matrix_buf3 => null(), matrix_buf3_im => null()
168 TYPE(
dbcsr_type),
POINTER :: matrix_buf4 => null(), matrix_buf4_im => null()
169 TYPE(
dbcsr_type),
POINTER :: matrix_os => null(), matrix_os_im => null()
170 TYPE(
dbcsr_type),
POINTER :: matrix_buf1_ortho => null(), matrix_buf1_ortho_im => null()
171 TYPE(
dbcsr_type),
POINTER :: matrix_buf2_ortho => null(), matrix_buf2_ortho_im => null()
173 TYPE(
dbcsr_type),
POINTER :: matrix_buf_nk => null(), matrix_buf_nk_im => null(), &
174 matrix_tmp_nk => null()
176 REAL(kind=
dp),
DIMENSION(:),
POINTER :: evals => null()
177 REAL(kind=
dp),
DIMENSION(:),
POINTER :: dum => null()
180 LOGICAL :: os_valid = .false.
182 LOGICAL :: preconditioner_changed = .false.
189 TYPE(
dbcsr_type),
POINTER :: matrix_c0 => null(), matrix_sc0 => null(), matrix_psc0 => null()
190 TYPE(
dbcsr_type),
POINTER :: matrix_c0_im => null(), matrix_sc0_im => null(), matrix_psc0_im => null()
193 TYPE(
dbcsr_type),
POINTER :: buf1_k_k_nosym => null(), buf2_k_k_nosym => null(), &
194 buf3_k_k_nosym => null(), buf4_k_k_nosym => null(), &
195 buf1_k_k_sym => null(), buf2_k_k_sym => null(), &
196 buf3_k_k_sym => null(), buf4_k_k_sym => null(), &
197 p_k_k_sym => null(), buf1_n_k => null(), buf1_n_k_dp => null()
201 TYPE(
dbcsr_type),
POINTER :: matrix_x => null(), matrix_sx => null(), matrix_gx => null()
202 TYPE(
dbcsr_type),
POINTER :: matrix_x_im => null(), matrix_sx_im => null(), matrix_gx_im => null()
203 TYPE(
dbcsr_type),
POINTER :: matrix_preconditioned_gx => null(), &
204 matrix_preconditioned_gx_im => null()
205 TYPE(
dbcsr_type),
POINTER :: matrix_response_gx => null(), matrix_response_gx_im => null()
206 TYPE(
dbcsr_type),
POINTER :: matrix_mermin_g0 => null(), matrix_mermin_g0_im => null()
207 TYPE(
dbcsr_type),
POINTER :: matrix_ref_inv_sqrt => null(), matrix_ref_inv_sqrt_im => null()
210 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: ener_mermin_g0
211 LOGICAL :: mermin_gradient_ref_valid = .false.
212 TYPE(
dbcsr_type),
POINTER :: matrix_dx => null(), matrix_gx_old => null()
213 TYPE(
dbcsr_type),
POINTER :: matrix_dx_im => null(), matrix_gx_old_im => null()
215 LOGICAL :: use_gx_old = .false., use_dx = .false.
217 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_h_e => null(), matrix_h_x => null()
218 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_h_e_im => null(), matrix_h_x_im => null()
219 REAL(kind=
dp),
DIMENSION(:),
POINTER :: lbfgs_rho => null(), lbfgs_yy => null()
220 REAL(kind=
dp),
DIMENSION(:),
POINTER :: lbfgs_sy_rotation => null(), &
221 lbfgs_yy_rotation => null()
223 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: ls_diis => null()
224 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: lss_diis => null()
225 REAL(kind=
dp),
DIMENSION(:),
POINTER :: c_diis => null()
226 REAL(kind=
dp),
DIMENSION(:),
POINTER :: c_broy => null()
227 REAL(kind=
dp),
DIMENSION(:),
POINTER :: energy_h => null()
228 INTEGER,
DIMENSION(:),
POINTER :: ipivot => null()
230 REAL(kind=
dp) :: ot_pos(53) = -1.0_dp, ot_energy(53) = -1.0_dp, ot_grad(53) = -1.0_dp
231 INTEGER :: line_search_left = -1, line_search_right = -1, line_search_mid = -1
232 INTEGER :: line_search_count = -1
233 LOGICAL :: line_search_might_be_done = .false.
234 REAL(kind=
dp) :: delta = -1.0_dp, gnorm = -1.0_dp, gnorm_old = -1.0_dp, etotal = -1.0_dp, gradient = -1.0_dp
235 LOGICAL :: energy_only = .false.
236 INTEGER :: diis_iter = -1
237 CHARACTER(LEN=8) :: ot_method_full =
""
238 INTEGER :: ot_count = -1
239 REAL(kind=
dp) :: ds_min = -1.0_dp
240 REAL(kind=
dp) :: broyden_adaptive_sigma = -1.0_dp
243 INTEGER :: taylor_order = -1
244 REAL(kind=
dp) :: largest_eval_upper_bound = -1.0_dp
263 TYPE(
dbcsr_type),
POINTER :: rot_mat_response_gx_im => null()
271 REAL(kind=
dp),
DIMENSION(:),
POINTER :: rot_mat_evals => null()
274 LOGICAL :: rotation_response_valid = .false.
275 LOGICAL :: response_candidate_pending = .false.
276 LOGICAL :: response_shadow_pending = .false.
277 INTEGER :: response_candidate_directions = 0
278 INTEGER :: response_candidate_good_samples = 0
279 INTEGER :: response_candidate_cooldown = 0
280 INTEGER :: response_shadow_good_samples = 0
281 REAL(kind=
dp) :: response_model_curvature = 0.0_dp
282 REAL(kind=
dp) :: response_shadow_curvature = 0.0_dp
283 LOGICAL :: response_hxc_direction_valid = .false.
284 REAL(kind=
dp) :: response_reference_energy = 0.0_dp
285 REAL(kind=
dp) :: response_reference_residual = 0.0_dp
286 REAL(kind=
dp) :: response_predicted_slope = 0.0_dp
287 REAL(kind=
dp) :: response_predicted_curvature = 0.0_dp
290 REAL(kind=
dp),
POINTER,
DIMENSION(:) :: ener_x => null()
291 REAL(kind=
dp),
POINTER,
DIMENSION(:) :: ener_rayleigh => null()
292 REAL(kind=
dp),
POINTER,
DIMENSION(:) :: ener_dx => null()
293 REAL(kind=
dp),
POINTER,
DIMENSION(:) :: ener_gx => null()
294 REAL(kind=
dp),
POINTER,
DIMENSION(:) :: ener_preconditioned_gx => null()
295 REAL(kind=
dp),
POINTER,
DIMENSION(:) :: ener_response_gx => null()
296 REAL(kind=
dp),
POINTER,
DIMENSION(:) :: ener_gx_old => null()
297 REAL(kind=
dp),
POINTER,
DIMENSION(:, :) :: ener_h_e => null()
298 REAL(kind=
dp),
POINTER,
DIMENSION(:, :) :: ener_h_x => null()
733 SUBROUTINE qs_ot_allocate(qs_ot_env, matrix_s, fm_struct_ref, ortho_k, energy_dimension)
737 INTEGER,
OPTIONAL :: ortho_k, energy_dimension
739 INTEGER :: i, k, m_diis, my_energy_dimension, &
740 my_ortho_k, n, ncoef, nhistory
746 cpassert(.NOT. qs_ot_env%state_allocated)
747 qs_ot_env%has_complex_kpoint_state = .false.
748 NULLIFY (qs_ot_env%preconditioner)
749 NULLIFY (qs_ot_env%matrix_psc0)
750 NULLIFY (qs_ot_env%matrix_psc0_im)
751 NULLIFY (qs_ot_env%para_env)
752 NULLIFY (qs_ot_env%blacs_env)
755 para_env=para_env, context=context)
757 qs_ot_env%para_env => para_env
758 qs_ot_env%blacs_env => context
759 CALL para_env%retain()
760 CALL context%retain()
762 IF (
PRESENT(ortho_k))
THEN
767 my_energy_dimension = k
768 IF (
PRESENT(energy_dimension)) my_energy_dimension = energy_dimension
769 IF (qs_ot_env%settings%do_ener)
THEN
770 cpassert(my_energy_dimension > 0)
773 m_diis = qs_ot_env%settings%diis_m
775 qs_ot_env%use_gx_old = .false.
776 qs_ot_env%use_dx = .false.
778 SELECT CASE (qs_ot_env%settings%ot_method)
782 qs_ot_env%use_gx_old = .true.
783 qs_ot_env%use_dx = .true.
784 IF (qs_ot_env%settings%ot_method ==
"LBFG" .AND. m_diis < 1) cpabort(
"m_diis less than one")
785 CASE (
"DIIS",
"BROY")
786 IF (m_diis < 1) cpabort(
"m_diis less than one")
788 cpabort(
"Unknown option")
791 IF (qs_ot_env%settings%ot_method ==
"DIIS" .OR. &
792 qs_ot_env%settings%ot_method ==
"BROY")
THEN
793 ALLOCATE (qs_ot_env%ls_diis(m_diis + 1, m_diis + 1))
794 qs_ot_env%ls_diis = 0.0_dp
795 ALLOCATE (qs_ot_env%lss_diis(m_diis + 1, m_diis + 1))
796 ALLOCATE (qs_ot_env%c_diis(m_diis + 1))
797 ALLOCATE (qs_ot_env%c_broy(m_diis))
798 ALLOCATE (qs_ot_env%energy_h(m_diis))
799 ALLOCATE (qs_ot_env%ipivot(m_diis + 1))
801 IF (qs_ot_env%settings%ot_method ==
"LBFG")
THEN
802 ALLOCATE (qs_ot_env%lbfgs_rho(m_diis), qs_ot_env%lbfgs_yy(m_diis), &
803 qs_ot_env%lbfgs_sy_rotation(m_diis), qs_ot_env%lbfgs_yy_rotation(m_diis))
804 qs_ot_env%lbfgs_rho = 0.0_dp
805 qs_ot_env%lbfgs_yy = 0.0_dp
806 qs_ot_env%lbfgs_sy_rotation = 0.0_dp
807 qs_ot_env%lbfgs_yy_rotation = 0.0_dp
810 ALLOCATE (qs_ot_env%evals(k))
811 ALLOCATE (qs_ot_env%dum(k))
813 NULLIFY (qs_ot_env%matrix_os)
814 NULLIFY (qs_ot_env%matrix_os_im)
815 NULLIFY (qs_ot_env%matrix_buf1_ortho)
816 NULLIFY (qs_ot_env%matrix_buf1_ortho_im)
817 NULLIFY (qs_ot_env%matrix_buf2_ortho)
818 NULLIFY (qs_ot_env%matrix_buf2_ortho_im)
819 NULLIFY (qs_ot_env%matrix_tmp_ortho)
820 NULLIFY (qs_ot_env%matrix_buf_nk)
821 NULLIFY (qs_ot_env%matrix_buf_nk_im)
822 NULLIFY (qs_ot_env%matrix_tmp_nk)
823 NULLIFY (qs_ot_env%matrix_p)
824 NULLIFY (qs_ot_env%matrix_p_im)
825 NULLIFY (qs_ot_env%matrix_r)
826 NULLIFY (qs_ot_env%matrix_r_im)
827 NULLIFY (qs_ot_env%matrix_sinp)
828 NULLIFY (qs_ot_env%matrix_sinp_im)
829 NULLIFY (qs_ot_env%matrix_cosp)
830 NULLIFY (qs_ot_env%matrix_cosp_im)
831 NULLIFY (qs_ot_env%matrix_sinp_b)
832 NULLIFY (qs_ot_env%matrix_cosp_b)
833 NULLIFY (qs_ot_env%matrix_buf1)
834 NULLIFY (qs_ot_env%matrix_buf1_im)
835 NULLIFY (qs_ot_env%matrix_buf2)
836 NULLIFY (qs_ot_env%matrix_buf2_im)
837 NULLIFY (qs_ot_env%matrix_buf3)
838 NULLIFY (qs_ot_env%matrix_buf3_im)
839 NULLIFY (qs_ot_env%matrix_buf4)
840 NULLIFY (qs_ot_env%matrix_buf4_im)
841 NULLIFY (qs_ot_env%matrix_c0)
842 NULLIFY (qs_ot_env%matrix_sc0)
843 NULLIFY (qs_ot_env%matrix_c0_im)
844 NULLIFY (qs_ot_env%matrix_sc0_im)
845 NULLIFY (qs_ot_env%matrix_x)
846 NULLIFY (qs_ot_env%matrix_sx)
847 NULLIFY (qs_ot_env%matrix_x_im)
848 NULLIFY (qs_ot_env%matrix_sx_im)
849 NULLIFY (qs_ot_env%matrix_gx)
850 NULLIFY (qs_ot_env%matrix_gx_im)
851 NULLIFY (qs_ot_env%matrix_preconditioned_gx)
852 NULLIFY (qs_ot_env%matrix_preconditioned_gx_im)
853 NULLIFY (qs_ot_env%matrix_response_gx)
854 NULLIFY (qs_ot_env%matrix_response_gx_im)
855 NULLIFY (qs_ot_env%matrix_mermin_g0)
856 NULLIFY (qs_ot_env%matrix_mermin_g0_im)
857 NULLIFY (qs_ot_env%matrix_ref_inv_sqrt)
858 NULLIFY (qs_ot_env%matrix_ref_inv_sqrt_im)
859 DO i = 1,
SIZE(qs_ot_env%mermin_physical)
860 NULLIFY (qs_ot_env%mermin_physical(i)%c0)
861 NULLIFY (qs_ot_env%mermin_physical(i)%c0_im)
862 NULLIFY (qs_ot_env%mermin_physical(i)%h0)
863 NULLIFY (qs_ot_env%mermin_physical(i)%h0_im)
864 NULLIFY (qs_ot_env%mermin_physical(i)%c_previous)
865 NULLIFY (qs_ot_env%mermin_physical(i)%c_previous_im)
866 NULLIFY (qs_ot_env%mermin_physical(i)%y_previous)
867 NULLIFY (qs_ot_env%mermin_physical(i)%y_previous_im)
868 qs_ot_env%mermin_physical(i)%reference_valid = .false.
869 qs_ot_env%mermin_physical(i)%secant_valid = .false.
871 qs_ot_env%mermin_gradient_ref_valid = .false.
872 NULLIFY (qs_ot_env%matrix_gx_old)
873 NULLIFY (qs_ot_env%matrix_gx_old_im)
874 NULLIFY (qs_ot_env%matrix_dx)
875 NULLIFY (qs_ot_env%matrix_dx_im)
876 NULLIFY (qs_ot_env%buf1_k_k_nosym)
877 NULLIFY (qs_ot_env%buf2_k_k_nosym)
878 NULLIFY (qs_ot_env%buf3_k_k_nosym)
879 NULLIFY (qs_ot_env%buf4_k_k_nosym)
880 NULLIFY (qs_ot_env%buf1_k_k_sym)
881 NULLIFY (qs_ot_env%buf2_k_k_sym)
882 NULLIFY (qs_ot_env%buf3_k_k_sym)
883 NULLIFY (qs_ot_env%buf4_k_k_sym)
884 NULLIFY (qs_ot_env%buf1_n_k)
885 NULLIFY (qs_ot_env%buf1_n_k_dp)
886 NULLIFY (qs_ot_env%p_k_k_sym)
891 sym=dbcsr_type_no_symmetry)
895 sym=dbcsr_type_no_symmetry)
899 sym=dbcsr_type_no_symmetry)
903 sym=dbcsr_type_no_symmetry)
907 sym=dbcsr_type_no_symmetry)
909 IF (qs_ot_env%settings%occupation_preconditioner)
THEN
912 template=matrix_s, n=k, &
913 sym=dbcsr_type_no_symmetry)
916 IF (qs_ot_env%use_dx)
THEN
919 sym=dbcsr_type_no_symmetry)
922 IF (qs_ot_env%use_gx_old)
THEN
925 sym=dbcsr_type_no_symmetry)
928 SELECT CASE (qs_ot_env%settings%ot_algorithm)
932 sym=dbcsr_type_no_symmetry)
936 sym=dbcsr_type_no_symmetry)
940 sym=dbcsr_type_no_symmetry)
944 sym=dbcsr_type_no_symmetry)
948 sym=dbcsr_type_no_symmetry)
952 sym=dbcsr_type_no_symmetry)
956 sym=dbcsr_type_no_symmetry)
960 sym=dbcsr_type_no_symmetry)
964 sym=dbcsr_type_no_symmetry)
968 sym=dbcsr_type_no_symmetry)
972 sym=dbcsr_type_no_symmetry)
976 sym=dbcsr_type_no_symmetry)
980 sym=dbcsr_type_no_symmetry)
985 sym=dbcsr_type_no_symmetry)
989 sym=dbcsr_type_no_symmetry)
993 sym=dbcsr_type_no_symmetry)
997 sym=dbcsr_type_no_symmetry)
1002 sym=dbcsr_type_no_symmetry)
1006 sym=dbcsr_type_no_symmetry)
1010 sym=dbcsr_type_no_symmetry)
1014 sym=dbcsr_type_no_symmetry)
1018 sym=dbcsr_type_no_symmetry)
1022 sym=dbcsr_type_no_symmetry)
1026 sym=dbcsr_type_no_symmetry)
1030 IF (qs_ot_env%settings%ot_method ==
"DIIS" .OR. &
1031 qs_ot_env%settings%ot_method ==
"BROY" .OR. &
1032 qs_ot_env%settings%ot_method ==
"LBFG")
THEN
1033 NULLIFY (qs_ot_env%matrix_h_e)
1034 NULLIFY (qs_ot_env%matrix_h_x)
1035 NULLIFY (qs_ot_env%matrix_h_e_im)
1036 NULLIFY (qs_ot_env%matrix_h_x_im)
1038 IF (qs_ot_env%settings%ot_method ==
"LBFG") ncoef = m_diis + 1
1044 sym=dbcsr_type_no_symmetry)
1048 sym=dbcsr_type_no_symmetry)
1052 NULLIFY (qs_ot_env%rot_mat_u, qs_ot_env%rot_mat_u_im, &
1053 qs_ot_env%rot_mat_x, qs_ot_env%rot_mat_x_im, &
1054 qs_ot_env%rot_mat_h_e, qs_ot_env%rot_mat_h_x, &
1055 qs_ot_env%rot_mat_h_e_im, qs_ot_env%rot_mat_h_x_im, qs_ot_env%rot_mat_gx, &
1056 qs_ot_env%rot_mat_gx_im, qs_ot_env%rot_mat_response_gx, &
1057 qs_ot_env%rot_mat_response_gx_im, qs_ot_env%rot_mat_mermin_g0, &
1058 qs_ot_env%rot_mat_mermin_g0_im, qs_ot_env%rot_mat_gx_old, &
1059 qs_ot_env%rot_mat_gx_old_im, qs_ot_env%rot_mat_dx, qs_ot_env%rot_mat_dx_im, &
1060 qs_ot_env%rot_mat_evals, qs_ot_env%rot_mat_dedu, qs_ot_env%rot_mat_dedu_im, &
1061 qs_ot_env%rot_mat_chc, qs_ot_env%rot_mat_chc_im, &
1062 qs_ot_env%rot_mat_evec_re, qs_ot_env%rot_mat_evec_im)
1064 IF (qs_ot_env%settings%do_rotation)
THEN
1067 sym=dbcsr_type_no_symmetry)
1071 sym=dbcsr_type_no_symmetry)
1075 sym=dbcsr_type_no_symmetry)
1079 sym=dbcsr_type_no_symmetry)
1081 IF (qs_ot_env%settings%ot_method ==
"DIIS" .OR. &
1082 qs_ot_env%settings%ot_method ==
"BROY" .OR. &
1083 qs_ot_env%settings%ot_method ==
"LBFG")
THEN
1085 IF (qs_ot_env%settings%ot_method ==
"LBFG") ncoef = m_diis + 1
1091 sym=dbcsr_type_no_symmetry)
1095 sym=dbcsr_type_no_symmetry)
1099 ALLOCATE (qs_ot_env%rot_mat_evals(k))
1102 sym=dbcsr_type_no_symmetry)
1105 sym=dbcsr_type_no_symmetry)
1109 sym=dbcsr_type_no_symmetry)
1111 IF (qs_ot_env%settings%occupation_preconditioner)
THEN
1114 template=matrix_s, m=k, n=k, &
1115 sym=dbcsr_type_no_symmetry)
1118 IF (qs_ot_env%use_gx_old)
THEN
1121 sym=dbcsr_type_no_symmetry)
1124 IF (qs_ot_env%use_dx)
THEN
1127 sym=dbcsr_type_no_symmetry)
1132 IF (qs_ot_env%settings%do_ener)
THEN
1133 ncoef = my_energy_dimension
1134 ALLOCATE (qs_ot_env%ener_x(ncoef))
1135 ALLOCATE (qs_ot_env%ener_rayleigh(ncoef))
1137 IF (qs_ot_env%settings%ot_method ==
"DIIS" .OR. &
1138 qs_ot_env%settings%ot_method ==
"BROY" .OR. &
1139 qs_ot_env%settings%ot_method ==
"LBFG")
THEN
1141 IF (qs_ot_env%settings%ot_method ==
"LBFG") nhistory = m_diis + 1
1142 ALLOCATE (qs_ot_env%ener_h_e(nhistory, ncoef))
1143 ALLOCATE (qs_ot_env%ener_h_x(nhistory, ncoef))
1144 qs_ot_env%ener_h_e = 0.0_dp
1145 qs_ot_env%ener_h_x = 0.0_dp
1148 ALLOCATE (qs_ot_env%ener_gx(ncoef))
1149 IF (qs_ot_env%settings%occupation_preconditioner)
THEN
1150 ALLOCATE (qs_ot_env%ener_preconditioned_gx(ncoef))
1151 ALLOCATE (qs_ot_env%ener_response_gx(ncoef))
1154 IF (qs_ot_env%use_gx_old)
THEN
1155 ALLOCATE (qs_ot_env%ener_gx_old(ncoef))
1158 IF (qs_ot_env%use_dx)
THEN
1159 ALLOCATE (qs_ot_env%ener_dx(ncoef))
1160 qs_ot_env%ener_dx = 0.0_dp
1164 qs_ot_env%state_allocated = .true.
1177 INTEGER :: i, ncoef, nmo, nmo_ortho
1179 cpassert(qs_ot_env%state_allocated)
1180 cpassert(.NOT. qs_ot_env%has_complex_kpoint_state)
1181 cpassert(
ASSOCIATED(matrix_s))
1184 CALL dbcsr_get_info(qs_ot_env%matrix_sc0, nfullcols_total=nmo_ortho)
1188 sym=dbcsr_type_no_symmetry)
1191 sym=dbcsr_type_no_symmetry)
1194 sym=dbcsr_type_no_symmetry)
1197 sym=dbcsr_type_no_symmetry)
1200 sym=dbcsr_type_no_symmetry)
1201 IF (qs_ot_env%settings%occupation_preconditioner)
THEN
1202 CALL dbcsr_init_p(qs_ot_env%matrix_preconditioned_gx_im)
1204 template=matrix_s, n=nmo, &
1205 sym=dbcsr_type_no_symmetry)
1206 IF (qs_ot_env%use_dx)
THEN
1209 template=matrix_s, n=nmo, &
1210 sym=dbcsr_type_no_symmetry)
1213 template=matrix_s, n=nmo, &
1214 sym=dbcsr_type_no_symmetry)
1217 template=matrix_s, n=nmo, &
1218 sym=dbcsr_type_no_symmetry)
1221 template=matrix_s, n=nmo, &
1222 sym=dbcsr_type_no_symmetry)
1223 IF (qs_ot_env%settings%do_ener)
THEN
1224 cpassert(
ASSOCIATED(qs_ot_env%ener_x))
1225 ALLOCATE (qs_ot_env%ener_mermin_g0(
SIZE(qs_ot_env%ener_x)))
1229 SELECT CASE (qs_ot_env%settings%ot_algorithm)
1231 cpassert(nmo_ortho == nmo)
1232 CALL allocate_complex_copy(qs_ot_env%matrix_p_im, qs_ot_env%matrix_p,
"matrix_p_im")
1233 CALL allocate_complex_copy(qs_ot_env%matrix_r_im, qs_ot_env%matrix_r,
"matrix_r_im")
1234 CALL allocate_complex_copy(qs_ot_env%matrix_sinp_im, qs_ot_env%matrix_sinp,
"matrix_sinp_im")
1235 CALL allocate_complex_copy(qs_ot_env%matrix_cosp_im, qs_ot_env%matrix_cosp,
"matrix_cosp_im")
1236 CALL allocate_complex_copy(qs_ot_env%matrix_buf1_im, qs_ot_env%matrix_buf1,
"matrix_buf1_im")
1237 CALL allocate_complex_copy(qs_ot_env%matrix_buf2_im, qs_ot_env%matrix_buf2,
"matrix_buf2_im")
1238 CALL allocate_complex_copy(qs_ot_env%matrix_buf3_im, qs_ot_env%matrix_buf3,
"matrix_buf3_im")
1239 CALL allocate_complex_copy(qs_ot_env%matrix_buf4_im, qs_ot_env%matrix_buf4,
"matrix_buf4_im")
1240 CALL allocate_complex_copy(qs_ot_env%matrix_os_im, qs_ot_env%matrix_os,
"matrix_os_im")
1241 CALL allocate_complex_copy(qs_ot_env%matrix_buf1_ortho_im, qs_ot_env%matrix_buf1_ortho, &
1242 "matrix_buf1_ortho_im")
1243 CALL allocate_complex_copy(qs_ot_env%matrix_buf2_ortho_im, qs_ot_env%matrix_buf2_ortho, &
1244 "matrix_buf2_ortho_im")
1245 CALL allocate_complex_copy(qs_ot_env%matrix_tmp_ortho, qs_ot_env%matrix_buf1_ortho, &
1247 CALL allocate_complex_copy(qs_ot_env%matrix_buf_nk, qs_ot_env%matrix_x,
"matrix_buf_nk")
1248 CALL allocate_complex_copy(qs_ot_env%matrix_buf_nk_im, qs_ot_env%matrix_x,
"matrix_buf_nk_im")
1249 CALL allocate_complex_copy(qs_ot_env%matrix_tmp_nk, qs_ot_env%matrix_x,
"matrix_tmp_nk")
1253 sym=dbcsr_type_no_symmetry)
1256 sym=dbcsr_type_no_symmetry)
1259 sym=dbcsr_type_no_symmetry)
1261 cpabort(
"Complex K-point OT state requires ALGORITHM STRICT or IRAC")
1263 IF (qs_ot_env%use_dx)
THEN
1266 sym=dbcsr_type_no_symmetry)
1268 IF (qs_ot_env%use_gx_old)
THEN
1271 sym=dbcsr_type_no_symmetry)
1273 IF (qs_ot_env%settings%ot_method ==
"DIIS" .OR. &
1274 qs_ot_env%settings%ot_method ==
"BROY" .OR. &
1275 qs_ot_env%settings%ot_method ==
"LBFG")
THEN
1276 ncoef = qs_ot_env%settings%diis_m
1277 IF (qs_ot_env%settings%ot_method ==
"LBFG") ncoef = ncoef + 1
1283 template=matrix_s, n=nmo, &
1284 sym=dbcsr_type_no_symmetry)
1287 template=matrix_s, n=nmo, &
1288 sym=dbcsr_type_no_symmetry)
1292 IF (qs_ot_env%settings%do_rotation)
THEN
1295 sym=dbcsr_type_no_symmetry)
1298 sym=dbcsr_type_no_symmetry)
1301 sym=dbcsr_type_no_symmetry)
1304 sym=dbcsr_type_no_symmetry)
1307 sym=dbcsr_type_no_symmetry)
1308 IF (qs_ot_env%settings%occupation_preconditioner)
THEN
1311 template=matrix_s, m=nmo, n=nmo, &
1312 sym=dbcsr_type_no_symmetry)
1313 IF (qs_ot_env%use_dx)
THEN
1316 template=matrix_s, m=nmo, n=nmo, &
1317 sym=dbcsr_type_no_symmetry)
1320 template=matrix_s, m=nmo, n=nmo, &
1321 sym=dbcsr_type_no_symmetry)
1324 IF (qs_ot_env%use_dx)
THEN
1327 sym=dbcsr_type_no_symmetry)
1329 IF (qs_ot_env%use_gx_old)
THEN
1332 sym=dbcsr_type_no_symmetry)
1334 IF (qs_ot_env%settings%ot_method ==
"DIIS" .OR. &
1335 qs_ot_env%settings%ot_method ==
"BROY" .OR. &
1336 qs_ot_env%settings%ot_method ==
"LBFG")
THEN
1337 ncoef = qs_ot_env%settings%diis_m
1338 IF (qs_ot_env%settings%ot_method ==
"LBFG") ncoef = ncoef + 1
1344 template=matrix_s, m=nmo, n=nmo, &
1345 sym=dbcsr_type_no_symmetry)
1348 template=matrix_s, m=nmo, n=nmo, &
1349 sym=dbcsr_type_no_symmetry)
1354 qs_ot_env%has_complex_kpoint_state = .true.
1364 SUBROUTINE allocate_complex_copy(matrix, template, name)
1365 TYPE(
dbcsr_type),
POINTER :: matrix, template
1366 CHARACTER(LEN=*),
INTENT(IN) :: name
1371 END SUBROUTINE allocate_complex_copy
1382 INTEGER :: physical_spin
1384 IF (.NOT. qs_ot_env%state_allocated)
RETURN
1389 IF (
ASSOCIATED(qs_ot_env%evals))
DEALLOCATE (qs_ot_env%evals)
1390 IF (
ASSOCIATED(qs_ot_env%dum))
DEALLOCATE (qs_ot_env%dum)
1392 IF (
ASSOCIATED(qs_ot_env%matrix_os))
CALL dbcsr_release_p(qs_ot_env%matrix_os)
1393 IF (
ASSOCIATED(qs_ot_env%matrix_os_im))
CALL dbcsr_release_p(qs_ot_env%matrix_os_im)
1394 IF (
ASSOCIATED(qs_ot_env%matrix_p))
CALL dbcsr_release_p(qs_ot_env%matrix_p)
1395 IF (
ASSOCIATED(qs_ot_env%matrix_p_im))
CALL dbcsr_release_p(qs_ot_env%matrix_p_im)
1396 IF (
ASSOCIATED(qs_ot_env%matrix_cosp))
CALL dbcsr_release_p(qs_ot_env%matrix_cosp)
1397 IF (
ASSOCIATED(qs_ot_env%matrix_cosp_im))
CALL dbcsr_release_p(qs_ot_env%matrix_cosp_im)
1398 IF (
ASSOCIATED(qs_ot_env%matrix_sinp))
CALL dbcsr_release_p(qs_ot_env%matrix_sinp)
1399 IF (
ASSOCIATED(qs_ot_env%matrix_sinp_im))
CALL dbcsr_release_p(qs_ot_env%matrix_sinp_im)
1400 IF (
ASSOCIATED(qs_ot_env%matrix_r))
CALL dbcsr_release_p(qs_ot_env%matrix_r)
1401 IF (
ASSOCIATED(qs_ot_env%matrix_r_im))
CALL dbcsr_release_p(qs_ot_env%matrix_r_im)
1402 IF (
ASSOCIATED(qs_ot_env%matrix_cosp_b))
CALL dbcsr_release_p(qs_ot_env%matrix_cosp_b)
1403 IF (
ASSOCIATED(qs_ot_env%matrix_sinp_b))
CALL dbcsr_release_p(qs_ot_env%matrix_sinp_b)
1404 IF (
ASSOCIATED(qs_ot_env%matrix_buf1))
CALL dbcsr_release_p(qs_ot_env%matrix_buf1)
1405 IF (
ASSOCIATED(qs_ot_env%matrix_buf1_im))
CALL dbcsr_release_p(qs_ot_env%matrix_buf1_im)
1406 IF (
ASSOCIATED(qs_ot_env%matrix_buf2))
CALL dbcsr_release_p(qs_ot_env%matrix_buf2)
1407 IF (
ASSOCIATED(qs_ot_env%matrix_buf2_im))
CALL dbcsr_release_p(qs_ot_env%matrix_buf2_im)
1408 IF (
ASSOCIATED(qs_ot_env%matrix_buf3))
CALL dbcsr_release_p(qs_ot_env%matrix_buf3)
1409 IF (
ASSOCIATED(qs_ot_env%matrix_buf3_im))
CALL dbcsr_release_p(qs_ot_env%matrix_buf3_im)
1410 IF (
ASSOCIATED(qs_ot_env%matrix_buf4))
CALL dbcsr_release_p(qs_ot_env%matrix_buf4)
1411 IF (
ASSOCIATED(qs_ot_env%matrix_buf4_im))
CALL dbcsr_release_p(qs_ot_env%matrix_buf4_im)
1412 IF (
ASSOCIATED(qs_ot_env%matrix_buf1_ortho))
CALL dbcsr_release_p(qs_ot_env%matrix_buf1_ortho)
1413 IF (
ASSOCIATED(qs_ot_env%matrix_buf1_ortho_im))
CALL dbcsr_release_p(qs_ot_env%matrix_buf1_ortho_im)
1414 IF (
ASSOCIATED(qs_ot_env%matrix_buf2_ortho))
CALL dbcsr_release_p(qs_ot_env%matrix_buf2_ortho)
1415 IF (
ASSOCIATED(qs_ot_env%matrix_buf2_ortho_im))
CALL dbcsr_release_p(qs_ot_env%matrix_buf2_ortho_im)
1416 IF (
ASSOCIATED(qs_ot_env%matrix_tmp_ortho))
CALL dbcsr_release_p(qs_ot_env%matrix_tmp_ortho)
1417 IF (
ASSOCIATED(qs_ot_env%matrix_buf_nk))
CALL dbcsr_release_p(qs_ot_env%matrix_buf_nk)
1418 IF (
ASSOCIATED(qs_ot_env%matrix_buf_nk_im))
CALL dbcsr_release_p(qs_ot_env%matrix_buf_nk_im)
1419 IF (
ASSOCIATED(qs_ot_env%matrix_tmp_nk))
CALL dbcsr_release_p(qs_ot_env%matrix_tmp_nk)
1420 IF (
ASSOCIATED(qs_ot_env%matrix_c0))
CALL dbcsr_release_p(qs_ot_env%matrix_c0)
1421 IF (
ASSOCIATED(qs_ot_env%matrix_sc0))
CALL dbcsr_release_p(qs_ot_env%matrix_sc0)
1422 IF (
ASSOCIATED(qs_ot_env%matrix_psc0))
CALL dbcsr_release_p(qs_ot_env%matrix_psc0)
1423 IF (
ASSOCIATED(qs_ot_env%matrix_psc0_im))
CALL dbcsr_release_p(qs_ot_env%matrix_psc0_im)
1424 IF (
ASSOCIATED(qs_ot_env%matrix_c0_im))
CALL dbcsr_release_p(qs_ot_env%matrix_c0_im)
1425 IF (
ASSOCIATED(qs_ot_env%matrix_sc0_im))
CALL dbcsr_release_p(qs_ot_env%matrix_sc0_im)
1426 IF (
ASSOCIATED(qs_ot_env%matrix_x))
CALL dbcsr_release_p(qs_ot_env%matrix_x)
1427 IF (
ASSOCIATED(qs_ot_env%matrix_sx))
CALL dbcsr_release_p(qs_ot_env%matrix_sx)
1428 IF (
ASSOCIATED(qs_ot_env%matrix_x_im))
CALL dbcsr_release_p(qs_ot_env%matrix_x_im)
1429 IF (
ASSOCIATED(qs_ot_env%matrix_sx_im))
CALL dbcsr_release_p(qs_ot_env%matrix_sx_im)
1430 IF (
ASSOCIATED(qs_ot_env%matrix_gx))
CALL dbcsr_release_p(qs_ot_env%matrix_gx)
1431 IF (
ASSOCIATED(qs_ot_env%matrix_gx_im))
CALL dbcsr_release_p(qs_ot_env%matrix_gx_im)
1432 IF (
ASSOCIATED(qs_ot_env%matrix_preconditioned_gx))
THEN
1435 IF (
ASSOCIATED(qs_ot_env%matrix_preconditioned_gx_im))
THEN
1438 IF (
ASSOCIATED(qs_ot_env%matrix_response_gx))
CALL dbcsr_release_p(qs_ot_env%matrix_response_gx)
1439 IF (
ASSOCIATED(qs_ot_env%matrix_response_gx_im))
THEN
1442 IF (
ASSOCIATED(qs_ot_env%matrix_mermin_g0))
CALL dbcsr_release_p(qs_ot_env%matrix_mermin_g0)
1443 IF (
ASSOCIATED(qs_ot_env%matrix_mermin_g0_im))
THEN
1446 IF (
ASSOCIATED(qs_ot_env%matrix_ref_inv_sqrt))
CALL dbcsr_release_p(qs_ot_env%matrix_ref_inv_sqrt)
1447 IF (
ASSOCIATED(qs_ot_env%matrix_ref_inv_sqrt_im))
CALL dbcsr_release_p(qs_ot_env%matrix_ref_inv_sqrt_im)
1448 DO physical_spin = 1,
SIZE(qs_ot_env%mermin_physical)
1449 IF (
ASSOCIATED(qs_ot_env%mermin_physical(physical_spin)%c0))
THEN
1450 CALL cp_fm_release(qs_ot_env%mermin_physical(physical_spin)%c0)
1451 DEALLOCATE (qs_ot_env%mermin_physical(physical_spin)%c0)
1453 IF (
ASSOCIATED(qs_ot_env%mermin_physical(physical_spin)%c0_im))
THEN
1454 CALL cp_fm_release(qs_ot_env%mermin_physical(physical_spin)%c0_im)
1455 DEALLOCATE (qs_ot_env%mermin_physical(physical_spin)%c0_im)
1457 IF (
ASSOCIATED(qs_ot_env%mermin_physical(physical_spin)%h0))
THEN
1458 CALL cp_fm_release(qs_ot_env%mermin_physical(physical_spin)%h0)
1459 DEALLOCATE (qs_ot_env%mermin_physical(physical_spin)%h0)
1461 IF (
ASSOCIATED(qs_ot_env%mermin_physical(physical_spin)%h0_im))
THEN
1462 CALL cp_fm_release(qs_ot_env%mermin_physical(physical_spin)%h0_im)
1463 DEALLOCATE (qs_ot_env%mermin_physical(physical_spin)%h0_im)
1465 IF (
ASSOCIATED(qs_ot_env%mermin_physical(physical_spin)%c_previous))
THEN
1466 CALL cp_fm_release(qs_ot_env%mermin_physical(physical_spin)%c_previous)
1467 DEALLOCATE (qs_ot_env%mermin_physical(physical_spin)%c_previous)
1469 IF (
ASSOCIATED(qs_ot_env%mermin_physical(physical_spin)%c_previous_im))
THEN
1470 CALL cp_fm_release(qs_ot_env%mermin_physical(physical_spin)%c_previous_im)
1471 DEALLOCATE (qs_ot_env%mermin_physical(physical_spin)%c_previous_im)
1473 IF (
ASSOCIATED(qs_ot_env%mermin_physical(physical_spin)%y_previous))
THEN
1474 CALL cp_fm_release(qs_ot_env%mermin_physical(physical_spin)%y_previous)
1475 DEALLOCATE (qs_ot_env%mermin_physical(physical_spin)%y_previous)
1477 IF (
ASSOCIATED(qs_ot_env%mermin_physical(physical_spin)%y_previous_im))
THEN
1478 CALL cp_fm_release(qs_ot_env%mermin_physical(physical_spin)%y_previous_im)
1479 DEALLOCATE (qs_ot_env%mermin_physical(physical_spin)%y_previous_im)
1481 IF (
ALLOCATED(qs_ot_env%mermin_physical(physical_spin)%occupation0))
THEN
1482 DEALLOCATE (qs_ot_env%mermin_physical(physical_spin)%occupation0)
1484 IF (
ALLOCATED(qs_ot_env%mermin_physical(physical_spin)%occupation_previous))
THEN
1485 DEALLOCATE (qs_ot_env%mermin_physical(physical_spin)%occupation_previous)
1487 qs_ot_env%mermin_physical(physical_spin)%reference_valid = .false.
1488 qs_ot_env%mermin_physical(physical_spin)%secant_valid = .false.
1490 IF (
ALLOCATED(qs_ot_env%ener_mermin_g0))
DEALLOCATE (qs_ot_env%ener_mermin_g0)
1491 qs_ot_env%mermin_gradient_ref_valid = .false.
1492 IF (
ASSOCIATED(qs_ot_env%matrix_dx))
CALL dbcsr_release_p(qs_ot_env%matrix_dx)
1493 IF (
ASSOCIATED(qs_ot_env%matrix_dx_im))
CALL dbcsr_release_p(qs_ot_env%matrix_dx_im)
1494 IF (
ASSOCIATED(qs_ot_env%matrix_gx_old))
CALL dbcsr_release_p(qs_ot_env%matrix_gx_old)
1495 IF (
ASSOCIATED(qs_ot_env%matrix_gx_old_im))
CALL dbcsr_release_p(qs_ot_env%matrix_gx_old_im)
1496 IF (
ASSOCIATED(qs_ot_env%buf1_k_k_nosym))
CALL dbcsr_release_p(qs_ot_env%buf1_k_k_nosym)
1497 IF (
ASSOCIATED(qs_ot_env%buf2_k_k_nosym))
CALL dbcsr_release_p(qs_ot_env%buf2_k_k_nosym)
1498 IF (
ASSOCIATED(qs_ot_env%buf3_k_k_nosym))
CALL dbcsr_release_p(qs_ot_env%buf3_k_k_nosym)
1499 IF (
ASSOCIATED(qs_ot_env%buf4_k_k_nosym))
CALL dbcsr_release_p(qs_ot_env%buf4_k_k_nosym)
1500 IF (
ASSOCIATED(qs_ot_env%p_k_k_sym))
CALL dbcsr_release_p(qs_ot_env%p_k_k_sym)
1501 IF (
ASSOCIATED(qs_ot_env%buf1_k_k_sym))
CALL dbcsr_release_p(qs_ot_env%buf1_k_k_sym)
1502 IF (
ASSOCIATED(qs_ot_env%buf2_k_k_sym))
CALL dbcsr_release_p(qs_ot_env%buf2_k_k_sym)
1503 IF (
ASSOCIATED(qs_ot_env%buf3_k_k_sym))
CALL dbcsr_release_p(qs_ot_env%buf3_k_k_sym)
1504 IF (
ASSOCIATED(qs_ot_env%buf4_k_k_sym))
CALL dbcsr_release_p(qs_ot_env%buf4_k_k_sym)
1505 IF (
ASSOCIATED(qs_ot_env%buf1_n_k))
CALL dbcsr_release_p(qs_ot_env%buf1_n_k)
1506 IF (
ASSOCIATED(qs_ot_env%buf1_n_k_dp))
CALL dbcsr_release_p(qs_ot_env%buf1_n_k_dp)
1508 IF (qs_ot_env%settings%ot_method ==
"DIIS" .OR. &
1509 qs_ot_env%settings%ot_method ==
"BROY" .OR. &
1510 qs_ot_env%settings%ot_method ==
"LBFG")
THEN
1513 IF (
ASSOCIATED(qs_ot_env%matrix_h_x_im))
THEN
1516 IF (
ASSOCIATED(qs_ot_env%matrix_h_e_im))
THEN
1520 IF (qs_ot_env%settings%ot_method ==
"DIIS" .OR. &
1521 qs_ot_env%settings%ot_method ==
"BROY")
THEN
1522 DEALLOCATE (qs_ot_env%ls_diis)
1523 DEALLOCATE (qs_ot_env%lss_diis)
1524 DEALLOCATE (qs_ot_env%c_diis)
1525 DEALLOCATE (qs_ot_env%c_broy)
1526 DEALLOCATE (qs_ot_env%energy_h)
1527 DEALLOCATE (qs_ot_env%ipivot)
1529 IF (qs_ot_env%settings%ot_method ==
"LBFG")
THEN
1530 DEALLOCATE (qs_ot_env%lbfgs_rho, qs_ot_env%lbfgs_yy, &
1531 qs_ot_env%lbfgs_sy_rotation, qs_ot_env%lbfgs_yy_rotation)
1534 IF (qs_ot_env%settings%do_rotation)
THEN
1536 IF (
ASSOCIATED(qs_ot_env%rot_mat_u))
CALL dbcsr_release_p(qs_ot_env%rot_mat_u)
1537 IF (
ASSOCIATED(qs_ot_env%rot_mat_u_im))
CALL dbcsr_release_p(qs_ot_env%rot_mat_u_im)
1538 IF (
ASSOCIATED(qs_ot_env%rot_mat_x))
CALL dbcsr_release_p(qs_ot_env%rot_mat_x)
1539 IF (
ASSOCIATED(qs_ot_env%rot_mat_x_im))
CALL dbcsr_release_p(qs_ot_env%rot_mat_x_im)
1540 IF (
ASSOCIATED(qs_ot_env%rot_mat_dedu))
CALL dbcsr_release_p(qs_ot_env%rot_mat_dedu)
1541 IF (
ASSOCIATED(qs_ot_env%rot_mat_dedu_im))
CALL dbcsr_release_p(qs_ot_env%rot_mat_dedu_im)
1542 IF (
ASSOCIATED(qs_ot_env%rot_mat_chc))
CALL dbcsr_release_p(qs_ot_env%rot_mat_chc)
1543 IF (
ASSOCIATED(qs_ot_env%rot_mat_chc_im))
CALL dbcsr_release_p(qs_ot_env%rot_mat_chc_im)
1545 IF (qs_ot_env%settings%ot_method ==
"DIIS" .OR. &
1546 qs_ot_env%settings%ot_method ==
"BROY" .OR. &
1547 qs_ot_env%settings%ot_method ==
"LBFG")
THEN
1550 IF (
ASSOCIATED(qs_ot_env%rot_mat_h_x_im))
THEN
1553 IF (
ASSOCIATED(qs_ot_env%rot_mat_h_e_im))
THEN
1558 IF (
ASSOCIATED(qs_ot_env%rot_mat_evals))
DEALLOCATE (qs_ot_env%rot_mat_evals)
1559 IF (
ASSOCIATED(qs_ot_env%rot_mat_evec_re))
CALL dbcsr_release_p(qs_ot_env%rot_mat_evec_re)
1560 IF (
ASSOCIATED(qs_ot_env%rot_mat_evec_im))
CALL dbcsr_release_p(qs_ot_env%rot_mat_evec_im)
1561 IF (
ASSOCIATED(qs_ot_env%rot_mat_gx))
CALL dbcsr_release_p(qs_ot_env%rot_mat_gx)
1562 IF (
ASSOCIATED(qs_ot_env%rot_mat_gx_im))
CALL dbcsr_release_p(qs_ot_env%rot_mat_gx_im)
1563 IF (
ASSOCIATED(qs_ot_env%rot_mat_response_gx))
THEN
1566 IF (
ASSOCIATED(qs_ot_env%rot_mat_response_gx_im))
THEN
1569 IF (
ASSOCIATED(qs_ot_env%rot_mat_mermin_g0))
THEN
1572 IF (
ASSOCIATED(qs_ot_env%rot_mat_mermin_g0_im))
THEN
1575 IF (
ASSOCIATED(qs_ot_env%rot_mat_gx_old))
CALL dbcsr_release_p(qs_ot_env%rot_mat_gx_old)
1576 IF (
ASSOCIATED(qs_ot_env%rot_mat_gx_old_im))
CALL dbcsr_release_p(qs_ot_env%rot_mat_gx_old_im)
1577 IF (
ASSOCIATED(qs_ot_env%rot_mat_dx))
CALL dbcsr_release_p(qs_ot_env%rot_mat_dx)
1578 IF (
ASSOCIATED(qs_ot_env%rot_mat_dx_im))
CALL dbcsr_release_p(qs_ot_env%rot_mat_dx_im)
1581 IF (qs_ot_env%settings%do_ener)
THEN
1582 IF (
ASSOCIATED(qs_ot_env%ener_x))
DEALLOCATE (qs_ot_env%ener_x)
1583 IF (
ASSOCIATED(qs_ot_env%ener_rayleigh))
DEALLOCATE (qs_ot_env%ener_rayleigh)
1584 IF (
ASSOCIATED(qs_ot_env%ener_gx))
DEALLOCATE (qs_ot_env%ener_gx)
1585 IF (
ASSOCIATED(qs_ot_env%ener_preconditioned_gx))
THEN
1586 DEALLOCATE (qs_ot_env%ener_preconditioned_gx)
1588 IF (
ASSOCIATED(qs_ot_env%ener_response_gx))
DEALLOCATE (qs_ot_env%ener_response_gx)
1589 IF (qs_ot_env%settings%ot_method ==
"DIIS" .OR. &
1590 qs_ot_env%settings%ot_method ==
"BROY" .OR. &
1591 qs_ot_env%settings%ot_method ==
"LBFG")
THEN
1592 IF (
ASSOCIATED(qs_ot_env%ener_h_x))
DEALLOCATE (qs_ot_env%ener_h_x)
1593 IF (
ASSOCIATED(qs_ot_env%ener_h_e))
DEALLOCATE (qs_ot_env%ener_h_e)
1595 IF (qs_ot_env%use_dx)
THEN
1596 IF (
ASSOCIATED(qs_ot_env%ener_dx))
DEALLOCATE (qs_ot_env%ener_dx)
1598 IF (qs_ot_env%use_gx_old)
THEN
1599 IF (
ASSOCIATED(qs_ot_env%ener_gx_old))
DEALLOCATE (qs_ot_env%ener_gx_old)
1603 qs_ot_env%state_allocated = .false.
1604 qs_ot_env%has_complex_kpoint_state = .false.
1619 INTEGER,
INTENT(IN) :: output_unit
1620 LOGICAL,
INTENT(IN),
OPTIONAL :: complex_kpoints, eigensolver
1622 CHARACTER(len=*),
PARAMETER :: routinen =
'ot_readwrite_input'
1624 INTEGER :: handle, ls_method, ot_algorithm, &
1625 ot_method, ot_ortho_irac
1626 LOGICAL :: energy_gap_explicit, &
1627 lattice_fft_explicit, &
1628 low_rank_base_explicit, &
1629 use_complex_kpoints, use_eigensolver
1631 CALL timeset(routinen, handle)
1633 use_complex_kpoints = .false.
1634 IF (
PRESENT(complex_kpoints)) use_complex_kpoints = complex_kpoints
1635 use_eigensolver = .false.
1636 IF (
PRESENT(eigensolver)) use_eigensolver = eigensolver
1640 SELECT CASE (ot_algorithm)
1642 settings%ot_algorithm =
"TOD"
1645 settings%ot_algorithm =
"REF"
1647 cpabort(
"Value unknown")
1652 IF (settings%irac_degree < 2 .OR. settings%irac_degree > 4)
THEN
1653 cpabort(
"READ OT IRAC_DEGREE: Value unknown")
1656 IF (settings%max_irac < 1)
THEN
1657 cpabort(
"READ OT MAX_IRAC: VALUE MUST BE GREATER THAN ZERO")
1659 CALL section_vals_val_get(ot_section,
"EPS_IRAC_FILTER_MATRIX", r_val=settings%eps_irac_filter_matrix)
1661 IF (settings%eps_irac < 0.0_dp)
THEN
1662 cpabort(
"READ OT EPS_IRAC: VALUE MUST BE GREATER THAN ZERO")
1664 CALL section_vals_val_get(ot_section,
"EPS_IRAC_QUICK_EXIT", r_val=settings%eps_irac_quick_exit)
1665 IF (settings%eps_irac_quick_exit < 0.0_dp)
THEN
1666 cpabort(
"READ OT EPS_IRAC_QUICK_EXIT: VALUE MUST BE GREATER THAN ZERO")
1670 IF (settings%eps_irac_switch < 0.0_dp)
THEN
1671 cpabort(
"READ OT EPS_IRAC_SWITCH: VALUE MUST BE GREATER THAN ZERO")
1675 SELECT CASE (ot_ortho_irac)
1677 settings%ortho_irac =
"CHOL"
1679 settings%ortho_irac =
"POLY"
1681 settings%ortho_irac =
"LWDN"
1683 cpabort(
"READ OT ORTHO_IRAC: Value unknown")
1690 IF (settings%ot_state == 1)
THEN
1694 SELECT CASE (ot_method)
1696 settings%ot_method =
"SD"
1698 settings%ot_method =
"CG"
1700 settings%ot_method =
"DIIS"
1709 CALL section_vals_val_get(ot_section,
"BROYDEN_SIGMA_DECREASE", r_val=settings%broyden_sigma_decrease)
1711 CALL section_vals_val_get(ot_section,
"BROYDEN_FORGET_HISTORY", l_val=settings%broyden_forget_history)
1712 CALL section_vals_val_get(ot_section,
"BROYDEN_ADAPTIVE_SIGMA", l_val=settings%broyden_adaptive_sigma)
1713 CALL section_vals_val_get(ot_section,
"BROYDEN_ENABLE_FLIP", l_val=settings%broyden_enable_flip)
1714 settings%ot_method =
"BROY"
1718 r_val=settings%lbfgs_curvature_tol)
1720 l_val=settings%lbfgs_damping)
1721 IF (settings%lbfgs_curvature_tol < 0.0_dp .OR. &
1722 settings%lbfgs_curvature_tol >= 1.0_dp)
THEN
1723 cpabort(
"READ OT LBFGS_CURVATURE_TOL: Value must be in [0, 1)")
1725 settings%ot_method =
"LBFG"
1727 cpabort(
"READ OTSCF MINIMIZER: Value unknown")
1731 SELECT CASE (ls_method)
1733 settings%line_search_method =
"NONE"
1735 settings%line_search_method =
"2PNT"
1737 settings%line_search_method =
"3PNT"
1739 settings%line_search_method =
"ADPT"
1741 settings%line_search_method =
"GOLD"
1744 cpabort(
"READ OTSCF LS: Value unknown")
1748 SELECT CASE (settings%precond_solver_type)
1750 settings%precond_solver_name =
"DEFAULT"
1752 settings%precond_solver_name =
"INVERSE_CHOLESKY"
1754 settings%precond_solver_name =
"DIRECT"
1756 settings%precond_solver_name =
"INVERSE_UPDATE"
1758 settings%precond_solver_name =
"CHEBYSHEV"
1760 cpabort(
"READ OTSCF SOLVER: Value unknown")
1763 IF (settings%chebyshev_degree < 1 .OR. settings%chebyshev_degree > 100)
THEN
1764 cpabort(
"READ OT CHEBYSHEV_DEGREE: Value must be between 1 and 100")
1767 i_val=settings%fermi_low_rank_max_rank)
1768 IF (settings%fermi_low_rank_max_rank == 0 .OR. &
1769 settings%fermi_low_rank_max_rank < -1)
THEN
1770 cpabort(
"READ OT FERMI_LOW_RANK_MAX_RANK: Value must be -1 or a positive integer")
1778 explicit=energy_gap_explicit)
1781 SELECT CASE (settings%preconditioner_type)
1783 settings%preconditioner_name =
"NONE"
1784 IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.15_dp
1785 IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.2_dp
1787 settings%preconditioner_name =
"FULL_SINGLE"
1788 IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.15_dp
1789 IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.2_dp
1791 settings%preconditioner_name =
"FULL_SINGLE_INVERSE"
1792 IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.08_dp
1793 IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.08_dp
1795 settings%preconditioner_name =
"FULL_ALL"
1796 IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.15_dp
1797 IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.08_dp
1799 settings%preconditioner_name =
"FERMI_LOW_RANK"
1800 IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.12_dp
1801 IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.08_dp
1803 settings%preconditioner_name =
"FULL_ALL_COVARIANT"
1804 IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.15_dp
1805 IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.08_dp
1807 settings%preconditioner_name =
"FULL_KINETIC"
1808 IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.15_dp
1809 IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.2_dp
1811 settings%preconditioner_name =
"FULL_S_INVERSE"
1812 IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.15_dp
1813 IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.2_dp
1815 cpabort(
"READ OTSCF PRECONDITIONER: Value unknown")
1817 IF (use_complex_kpoints .AND. &
1819 .NOT. energy_gap_explicit) settings%energy_gap = 0.20_dp
1821 i_val=settings%low_rank_base, explicit=low_rank_base_explicit)
1822 SELECT CASE (settings%low_rank_base)
1824 settings%low_rank_base_name =
"OVERLAP_INVERSE"
1826 settings%low_rank_base_name =
"LATTICE_FFT"
1828 cpabort(
"READ OT FERMI_LOW_RANK_BASE: Value unknown")
1831 i_val=settings%lattice_fft, explicit=lattice_fft_explicit)
1832 SELECT CASE (settings%lattice_fft)
1834 settings%lattice_fft_name =
"OFF"
1836 settings%lattice_fft_name =
"ON"
1838 settings%lattice_fft_name =
"AUTO"
1840 cpabort(
"READ OT LATTICE_FFT: Value unknown")
1843 i_val=settings%lattice_fft_local_cells)
1844 IF (settings%lattice_fft_local_cells < 0)
THEN
1845 cpabort(
"READ OT LATTICE_FFT_LOCAL_CELLS: Value must not be negative")
1849 cpabort(
"FERMI_LOW_RANK_BASE LATTICE_FFT requires PRECONDITIONER FERMI_LOW_RANK")
1852 cpabort(
"FERMI_LOW_RANK_BASE LATTICE_FFT conflicts with LATTICE_FFT OFF or AUTO")
1855 settings%lattice_fft_name =
"ON"
1856 ELSE IF (low_rank_base_explicit)
THEN
1858 cpwarn(
"FERMI_LOW_RANK_BASE is ignored unless PRECONDITIONER FERMI_LOW_RANK is selected")
1860 cpabort(
"FERMI_LOW_RANK_BASE OVERLAP_INVERSE conflicts with LATTICE_FFT ON or AUTO")
1863 IF (settings%lattice_fft_local_cells > 0 .AND. &
1865 cpabort(
"LATTICE_FFT_LOCAL_CELLS requires LATTICE_FFT ON")
1867 IF (use_complex_kpoints .AND. settings%lattice_fft_local_cells > 0)
THEN
1868 CALL cp_abort(__location__, &
1869 "LATTICE_FFT_LOCAL_CELLS is a Gamma-point supercell approximation; "// &
1870 "explicit K points already use native Bloch blocks")
1878 l_val=settings%occupation_preconditioner)
1881 r_val=settings%nondiag_energy_strength)
1882 IF (settings%ot_method ==
"LBFG")
THEN
1883 IF (settings%ot_algorithm /=
"TOD" .AND. settings%ot_algorithm /=
"REF")
THEN
1884 cpabort(
"MINIMIZER LBFGS requires ALGORITHM STRICT or IRAC")
1887 IF (settings%do_ener .AND. .NOT. use_complex_kpoints .AND. .NOT. use_eigensolver)
THEN
1888 cpabort(
"OT%ENERGIES is currently supported only by the complex K-point Mermin path.")
1890 IF (use_eigensolver .AND. &
1891 (settings%do_rotation .OR. settings%do_ener .OR. &
1892 settings%occupation_preconditioner .OR. settings%add_nondiag_energy))
THEN
1893 CALL cp_warn(__location__, &
1894 "DIAGONALIZATION%OT ignores ROTATION, ENERGIES, "// &
1895 "OCCUPATION_PRECONDITIONER, and NONDIAG_ENERGY because occupations "// &
1896 "are assigned after eigenspace minimization.")
1897 settings%do_rotation = .false.
1898 settings%do_ener = .false.
1899 settings%occupation_preconditioner = .false.
1900 settings%add_nondiag_energy = .false.
1905 IF (output_unit > 0)
THEN
1906 WRITE (output_unit,
'(/,A)')
" ----------------------------------- OT ---------------------------------------"
1907 IF (settings%do_rotation)
THEN
1908 WRITE (output_unit,
'(A)')
" Allowing for rotations "
1910 IF (settings%do_ener)
THEN
1911 WRITE (output_unit,
'(A,L2)')
" Optimizing orbital energies "
1913 SELECT CASE (settings%OT_METHOD)
1915 WRITE (output_unit,
'(A)')
" Minimizer : SD : steepest descent"
1917 WRITE (output_unit,
'(A)')
" Minimizer : CG : conjugate gradient"
1919 WRITE (output_unit,
'(A)')
" Minimizer : DIIS : direct inversion"
1920 WRITE (output_unit,
'(A)')
" in the iterative subspace"
1921 WRITE (output_unit,
'(A,I3,A)')
" using ", settings%diis_m,
" DIIS vectors"
1922 IF (settings%safer_diis)
THEN
1923 WRITE (output_unit,
'(A,I3,A)')
" safer DIIS on"
1925 WRITE (output_unit,
'(A,I3,A)')
" safer DIIS off"
1928 WRITE (output_unit,
'(A)')
" Minimizer : BROYDEN : Broyden "
1929 WRITE (output_unit,
'(A,F16.8)')
" BETA : ", settings%broyden_beta
1930 WRITE (output_unit,
'(A,F16.8)')
" GAMMA : ", settings%broyden_gamma
1931 WRITE (output_unit,
'(A,F16.8)')
" SIGMA : ", settings%broyden_sigma
1932 WRITE (output_unit,
'(A,I3,A)')
" using : - ", &
1933 settings%diis_m,
" BROYDEN vectors"
1935 WRITE (output_unit,
'(A)')
" Minimizer : LBFGS : limited-memory BFGS"
1936 WRITE (output_unit,
'(A,I3,A)')
" using : ", &
1937 settings%diis_m,
" secant pairs"
1938 WRITE (output_unit,
'(A,ES12.4)')
" curvature tolerance : ", &
1939 settings%lbfgs_curvature_tol
1940 WRITE (output_unit,
'(A,L7)')
" damp weak curvature : ", &
1941 settings%lbfgs_damping
1943 WRITE (output_unit,
'(3A)')
" Minimizer : ", settings%OT_METHOD,
" : UNKNOWN"
1945 SELECT CASE (settings%preconditioner_name)
1946 CASE (
"FULL_SINGLE")
1947 WRITE (output_unit,
'(A)')
" Preconditioner : FULL_SINGLE : diagonalization based"
1948 CASE (
"FULL_SINGLE_INVERSE")
1949 WRITE (output_unit,
'(A,/,A)')
" Preconditioner : FULL_SINGLE_INVERSE : inversion of ", &
1950 " H + eS - 2*(Sc)(c^T*H*c+const)(Sc)^T"
1952 WRITE (output_unit,
'(A)')
" Preconditioner : FULL_ALL : diagonalization, state selective"
1953 CASE (
"FERMI_LOW_RANK")
1954 WRITE (output_unit,
'(A)') &
1955 " Preconditioner : FERMI_LOW_RANK : rotationally covariant low-rank correction"
1956 CASE (
"FULL_ALL_COVARIANT")
1957 WRITE (output_unit,
'(A)') &
1958 " Preconditioner : FULL_ALL_COVARIANT : rotation-covariant Sylvester inverse"
1959 CASE (
"FULL_KINETIC")
1960 WRITE (output_unit,
'(A)')
" Preconditioner : FULL_KINETIC : inversion of T + eS"
1961 CASE (
"FULL_S_INVERSE")
1962 WRITE (output_unit,
'(A)')
" Preconditioner : FULL_S_INVERSE : cholesky inversion of S"
1963 CASE (
"SPARSE_DIAG")
1964 WRITE (output_unit,
'(A)') &
1965 " Preconditioner : SPARSE_DIAG : diagonal atomic block diagonalization"
1966 CASE (
"SPARSE_KINETIC")
1967 WRITE (output_unit,
'(A)')
" Preconditioner : SPARSE_KINETIC : sparse linear solver for T + eS"
1969 WRITE (output_unit,
'(A)')
" Preconditioner : NONE"
1971 WRITE (output_unit,
'(3A)')
" Preconditioner : ", settings%preconditioner_name,
" : UNKNOWN"
1976 WRITE (output_unit,
'(A)')
" Low-rank base : native K-point inverse of S(k)"
1978 WRITE (output_unit,
'(A)')
" Low-rank base : LATTICE_FFT (AUTO)"
1980 WRITE (output_unit,
'(A)')
" Low-rank base : LATTICE_FFT"
1982 WRITE (output_unit,
'(A,A)')
" Low-rank base : ", trim(settings%low_rank_base_name)
1986 WRITE (output_unit,
'(A)')
" Lattice FFT : native Bloch blocks (no additional FFT)"
1988 WRITE (output_unit,
'(A,A)')
" Lattice FFT : ", trim(settings%lattice_fft_name)
1990 IF (settings%lattice_fft_local_cells > 0)
THEN
1991 WRITE (output_unit,
'(A,I0)')
" Local FFT cells: ", settings%lattice_fft_local_cells
1994 WRITE (output_unit,
'(A)')
" Precond_solver : "//trim(settings%precond_solver_name)
1996 WRITE (output_unit,
'(A,I14)')
" Chebyshev degree:", settings%chebyshev_degree
1999 WRITE (output_unit,
'(A,I14)')
" Low-rank cap :", settings%fermi_low_rank_max_rank
2002 IF (settings%OT_METHOD ==
"SD" .OR. settings%OT_METHOD ==
"CG" .OR. &
2003 settings%OT_METHOD ==
"LBFG")
THEN
2004 SELECT CASE (settings%line_search_method)
2006 WRITE (output_unit,
'(A)')
" Line search : 2PNT : 2 energies, one gradient"
2008 WRITE (output_unit,
'(A)')
" Line search : 3PNT : 3 energies"
2010 WRITE (output_unit,
'(A)')
" Line search : GOLD : bracketing and golden section search"
2011 WRITE (output_unit,
'(A,F14.8)')
" target rel accuracy : ", settings%gold_target
2013 WRITE (output_unit,
'(A)')
" Line search : NONE"
2015 WRITE (output_unit,
'(3A)')
" Line search : ", settings%line_search_method,
" : UNKNOWN"
2018 WRITE (output_unit,
'(A,F14.8,T49,A,F14.8)')
" stepsize :", settings%ds_min, &
2019 " energy_gap :", settings%energy_gap
2020 IF (settings%ot_algorithm ==
'TOD')
THEN
2021 WRITE (output_unit,
'(A,E14.5,T49,A,I14)')
" eps_taylor :", settings%eps_taylor, &
2022 " max_taylor :", settings%max_taylor
2024 IF (settings%ot_algorithm ==
'REF')
THEN
2025 WRITE (output_unit,
'(A,1X,A,T49,A,I14)')
" ortho_irac :", settings%ortho_irac, &
2026 " irac_degree :", settings%irac_degree
2027 WRITE (output_unit,
'(A,I14,T49,A,E14.5)')
" max_irac :", settings%max_irac, &
2028 " eps_irac :", settings%eps_irac
2029 WRITE (output_unit,
'(A,E14.5,T49,A,E10.3)')
" eps_irac_switch:", settings%eps_irac_switch, &
2030 " eps_irac_quick_exit:", settings%eps_irac_quick_exit
2031 WRITE (output_unit,
'(A,L2)')
" on_the_fly_loc :", settings%on_the_fly_loc
2033 WRITE (output_unit,
'(A)')
" ----------------------------------- OT ---------------------------------------"
2034 WRITE (unit=output_unit, &
2035 fmt=
"(/,T3,A,T12,A,T31,A,T39,A,T59,A,T75,A,/,T3,A)") &
2036 "Step",
"Update method",
"Time",
"Convergence",
"Total energy",
"Change", &
2040 CALL timestop(handle)