121 LOGICAL :: restricted = .false.
122 INTEGER :: spin_index = 0, kpoint_index = 0, local_kpoint_index = 0
123 REAL(kind=
dp) :: kpoint_weight = 1.0_dp
124 LOGICAL :: has_kpoint_context = .false.
125 LOGICAL :: state_allocated = .false.
126 LOGICAL :: has_complex_kpoint_state = .false.
127 LOGICAL :: initial_density_sync_pending = .false.
128 LOGICAL :: initial_gradient_sync_pending = .false.
129 LOGICAL :: prepared_direction_pending = .false.
140 TYPE(
dbcsr_type),
POINTER :: matrix_p => null(), matrix_p_im => null()
141 TYPE(
dbcsr_type),
POINTER :: matrix_r => null(), matrix_r_im => null()
142 TYPE(
dbcsr_type),
POINTER :: matrix_sinp => null(), matrix_sinp_im => null()
143 TYPE(
dbcsr_type),
POINTER :: matrix_cosp => null(), matrix_cosp_im => null()
146 TYPE(
dbcsr_type),
POINTER :: matrix_buf1 => null(), matrix_buf1_im => null()
147 TYPE(
dbcsr_type),
POINTER :: matrix_buf2 => null(), matrix_buf2_im => null()
148 TYPE(
dbcsr_type),
POINTER :: matrix_buf3 => null(), matrix_buf3_im => null()
149 TYPE(
dbcsr_type),
POINTER :: matrix_buf4 => null(), matrix_buf4_im => null()
150 TYPE(
dbcsr_type),
POINTER :: matrix_os => null(), matrix_os_im => null()
151 TYPE(
dbcsr_type),
POINTER :: matrix_buf1_ortho => null(), matrix_buf1_ortho_im => null()
152 TYPE(
dbcsr_type),
POINTER :: matrix_buf2_ortho => null(), matrix_buf2_ortho_im => null()
154 TYPE(
dbcsr_type),
POINTER :: matrix_buf_nk => null(), matrix_buf_nk_im => null(), &
155 matrix_tmp_nk => null()
157 REAL(kind=
dp),
DIMENSION(:),
POINTER :: evals => null()
158 REAL(kind=
dp),
DIMENSION(:),
POINTER :: dum => null()
161 LOGICAL :: os_valid = .false.
168 TYPE(
dbcsr_type),
POINTER :: matrix_c0 => null(), matrix_sc0 => null(), matrix_psc0 => null()
169 TYPE(
dbcsr_type),
POINTER :: matrix_c0_im => null(), matrix_sc0_im => null(), matrix_psc0_im => null()
172 TYPE(
dbcsr_type),
POINTER :: buf1_k_k_nosym => null(), buf2_k_k_nosym => null(), &
173 buf3_k_k_nosym => null(), buf4_k_k_nosym => null(), &
174 buf1_k_k_sym => null(), buf2_k_k_sym => null(), &
175 buf3_k_k_sym => null(), buf4_k_k_sym => null(), &
176 p_k_k_sym => null(), buf1_n_k => null(), buf1_n_k_dp => null()
180 TYPE(
dbcsr_type),
POINTER :: matrix_x => null(), matrix_sx => null(), matrix_gx => null()
181 TYPE(
dbcsr_type),
POINTER :: matrix_x_im => null(), matrix_sx_im => null(), matrix_gx_im => null()
182 TYPE(
dbcsr_type),
POINTER :: matrix_preconditioned_gx => null(), &
183 matrix_preconditioned_gx_im => null()
184 TYPE(
dbcsr_type),
POINTER :: matrix_response_gx => null(), matrix_response_gx_im => null()
185 TYPE(
dbcsr_type),
POINTER :: matrix_mermin_g0 => null(), matrix_mermin_g0_im => null()
186 TYPE(
dbcsr_type),
POINTER :: matrix_ref_inv_sqrt => null(), matrix_ref_inv_sqrt_im => null()
188 TYPE(
cp_fm_type),
POINTER :: fm_mermin_c0 => null(), fm_mermin_c0_im => null()
189 TYPE(
cp_fm_type),
POINTER :: fm_mermin_h0 => null(), fm_mermin_h0_im => null()
190 TYPE(
cp_fm_type),
POINTER :: fm_mermin_c_previous => null(), &
191 fm_mermin_c_previous_im => null()
192 TYPE(
cp_fm_type),
POINTER :: fm_mermin_y_previous => null(), &
193 fm_mermin_y_previous_im => null()
194 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: mermin_occupation0, &
195 mermin_occupation_previous, &
197 LOGICAL :: mermin_physical_ref_valid = .false., mermin_physical_secant_valid = .false.
198 LOGICAL :: mermin_gradient_ref_valid = .false.
199 TYPE(
dbcsr_type),
POINTER :: matrix_dx => null(), matrix_gx_old => null()
200 TYPE(
dbcsr_type),
POINTER :: matrix_dx_im => null(), matrix_gx_old_im => null()
202 LOGICAL :: use_gx_old = .false., use_dx = .false.
204 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_h_e => null(), matrix_h_x => null()
205 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_h_e_im => null(), matrix_h_x_im => null()
206 REAL(kind=
dp),
DIMENSION(:),
POINTER :: lbfgs_rho => null(), lbfgs_yy => null()
207 REAL(kind=
dp),
DIMENSION(:),
POINTER :: lbfgs_sy_rotation => null(), &
208 lbfgs_yy_rotation => null()
210 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: ls_diis => null()
211 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: lss_diis => null()
212 REAL(kind=
dp),
DIMENSION(:),
POINTER :: c_diis => null()
213 REAL(kind=
dp),
DIMENSION(:),
POINTER :: c_broy => null()
214 REAL(kind=
dp),
DIMENSION(:),
POINTER :: energy_h => null()
215 INTEGER,
DIMENSION(:),
POINTER :: ipivot => null()
217 REAL(kind=
dp) :: ot_pos(53) = -1.0_dp, ot_energy(53) = -1.0_dp, ot_grad(53) = -1.0_dp
218 INTEGER :: line_search_left = -1, line_search_right = -1, line_search_mid = -1
219 INTEGER :: line_search_count = -1
220 LOGICAL :: line_search_might_be_done = .false.
221 REAL(kind=
dp) :: delta = -1.0_dp, gnorm = -1.0_dp, gnorm_old = -1.0_dp, etotal = -1.0_dp, gradient = -1.0_dp
222 LOGICAL :: energy_only = .false.
223 INTEGER :: diis_iter = -1
224 CHARACTER(LEN=8) :: ot_method_full =
""
225 INTEGER :: ot_count = -1
226 REAL(kind=
dp) :: ds_min = -1.0_dp
227 REAL(kind=
dp) :: broyden_adaptive_sigma = -1.0_dp
230 INTEGER :: taylor_order = -1
231 REAL(kind=
dp) :: largest_eval_upper_bound = -1.0_dp
250 TYPE(
dbcsr_type),
POINTER :: rot_mat_response_gx_im => null()
258 REAL(kind=
dp),
DIMENSION(:),
POINTER :: rot_mat_evals => null()
261 LOGICAL :: rotation_response_valid = .false.
262 LOGICAL :: response_candidate_pending = .false.
263 LOGICAL :: response_shadow_pending = .false.
264 INTEGER :: response_candidate_directions = 0
265 INTEGER :: response_candidate_good_samples = 0
266 INTEGER :: response_candidate_cooldown = 0
267 INTEGER :: response_shadow_good_samples = 0
268 REAL(kind=
dp) :: response_model_curvature = 0.0_dp
269 REAL(kind=
dp) :: response_shadow_curvature = 0.0_dp
270 LOGICAL :: response_hxc_direction_valid = .false.
271 REAL(kind=
dp) :: response_reference_energy = 0.0_dp
272 REAL(kind=
dp) :: response_reference_residual = 0.0_dp
273 REAL(kind=
dp) :: response_predicted_slope = 0.0_dp
274 REAL(kind=
dp) :: response_predicted_curvature = 0.0_dp
277 REAL(kind=
dp),
POINTER,
DIMENSION(:) :: ener_x => null()
278 REAL(kind=
dp),
POINTER,
DIMENSION(:) :: ener_rayleigh => null()
279 REAL(kind=
dp),
POINTER,
DIMENSION(:) :: ener_dx => null()
280 REAL(kind=
dp),
POINTER,
DIMENSION(:) :: ener_gx => null()
281 REAL(kind=
dp),
POINTER,
DIMENSION(:) :: ener_preconditioned_gx => null()
282 REAL(kind=
dp),
POINTER,
DIMENSION(:) :: ener_response_gx => null()
283 REAL(kind=
dp),
POINTER,
DIMENSION(:) :: ener_gx_old => null()
284 REAL(kind=
dp),
POINTER,
DIMENSION(:, :) :: ener_h_e => null()
285 REAL(kind=
dp),
POINTER,
DIMENSION(:, :) :: ener_h_x => null()
565 qs_ot_env%OT_energy(:) = 0.0_dp
566 qs_ot_env%OT_pos(:) = 0.0_dp
567 qs_ot_env%OT_grad(:) = 0.0_dp
568 qs_ot_env%line_search_count = 0
570 qs_ot_env%energy_only = .false.
571 qs_ot_env%initial_gradient_sync_pending = .false.
572 qs_ot_env%prepared_direction_pending = .false.
573 qs_ot_env%gnorm_old = 1.0_dp
574 qs_ot_env%diis_iter = 0
575 qs_ot_env%ds_min = qs_ot_env%settings%ds_min
576 qs_ot_env%os_valid = .false.
578 CALL dbcsr_set(qs_ot_env%matrix_gx, 0.0_dp)
579 IF (
ASSOCIATED(qs_ot_env%matrix_gx_im))
THEN
580 CALL dbcsr_set(qs_ot_env%matrix_gx_im, 0.0_dp)
582 IF (
ASSOCIATED(qs_ot_env%matrix_preconditioned_gx))
THEN
583 CALL dbcsr_set(qs_ot_env%matrix_preconditioned_gx, 0.0_dp)
585 IF (
ASSOCIATED(qs_ot_env%matrix_preconditioned_gx_im))
THEN
586 CALL dbcsr_set(qs_ot_env%matrix_preconditioned_gx_im, 0.0_dp)
588 IF (
ASSOCIATED(qs_ot_env%matrix_response_gx))
CALL dbcsr_set(qs_ot_env%matrix_response_gx, 0.0_dp)
589 IF (
ASSOCIATED(qs_ot_env%matrix_response_gx_im))
THEN
590 CALL dbcsr_set(qs_ot_env%matrix_response_gx_im, 0.0_dp)
592 IF (
ASSOCIATED(qs_ot_env%matrix_mermin_g0))
CALL dbcsr_set(qs_ot_env%matrix_mermin_g0, 0.0_dp)
593 IF (
ASSOCIATED(qs_ot_env%matrix_mermin_g0_im))
THEN
594 CALL dbcsr_set(qs_ot_env%matrix_mermin_g0_im, 0.0_dp)
596 qs_ot_env%mermin_gradient_ref_valid = .false.
598 IF (qs_ot_env%use_dx)
THEN
599 CALL dbcsr_set(qs_ot_env%matrix_dx, 0.0_dp)
601 IF (qs_ot_env%use_dx .AND.
ASSOCIATED(qs_ot_env%matrix_dx_im))
THEN
602 CALL dbcsr_set(qs_ot_env%matrix_dx_im, 0.0_dp)
605 IF (qs_ot_env%use_gx_old)
THEN
606 CALL dbcsr_set(qs_ot_env%matrix_gx_old, 0.0_dp)
608 IF (qs_ot_env%use_gx_old .AND.
ASSOCIATED(qs_ot_env%matrix_gx_old_im))
THEN
609 CALL dbcsr_set(qs_ot_env%matrix_gx_old_im, 0.0_dp)
612 IF (qs_ot_env%settings%ot_method ==
"LBFG")
THEN
613 qs_ot_env%lbfgs_rho = 0.0_dp
614 qs_ot_env%lbfgs_yy = 0.0_dp
615 qs_ot_env%lbfgs_sy_rotation = 0.0_dp
616 qs_ot_env%lbfgs_yy_rotation = 0.0_dp
619 IF (qs_ot_env%settings%do_rotation)
THEN
620 CALL dbcsr_set(qs_ot_env%rot_mat_u, 0.0_dp)
622 CALL dbcsr_set(qs_ot_env%rot_mat_x, 0.0_dp)
623 CALL dbcsr_set(qs_ot_env%rot_mat_dedu, 0.0_dp)
624 CALL dbcsr_set(qs_ot_env%rot_mat_chc, 0.0_dp)
625 CALL dbcsr_set(qs_ot_env%rot_mat_gx, 0.0_dp)
626 IF (
ASSOCIATED(qs_ot_env%rot_mat_response_gx))
THEN
627 CALL dbcsr_set(qs_ot_env%rot_mat_response_gx, 0.0_dp)
629 IF (
ASSOCIATED(qs_ot_env%rot_mat_u_im))
CALL dbcsr_set(qs_ot_env%rot_mat_u_im, 0.0_dp)
630 IF (
ASSOCIATED(qs_ot_env%rot_mat_x_im))
CALL dbcsr_set(qs_ot_env%rot_mat_x_im, 0.0_dp)
631 IF (
ASSOCIATED(qs_ot_env%rot_mat_dedu_im))
CALL dbcsr_set(qs_ot_env%rot_mat_dedu_im, 0.0_dp)
632 IF (
ASSOCIATED(qs_ot_env%rot_mat_chc_im))
CALL dbcsr_set(qs_ot_env%rot_mat_chc_im, 0.0_dp)
633 IF (
ASSOCIATED(qs_ot_env%rot_mat_gx_im))
CALL dbcsr_set(qs_ot_env%rot_mat_gx_im, 0.0_dp)
634 IF (
ASSOCIATED(qs_ot_env%rot_mat_response_gx_im))
THEN
635 CALL dbcsr_set(qs_ot_env%rot_mat_response_gx_im, 0.0_dp)
637 IF (
ASSOCIATED(qs_ot_env%rot_mat_mermin_g0))
THEN
638 CALL dbcsr_set(qs_ot_env%rot_mat_mermin_g0, 0.0_dp)
640 IF (
ASSOCIATED(qs_ot_env%rot_mat_mermin_g0_im))
THEN
641 CALL dbcsr_set(qs_ot_env%rot_mat_mermin_g0_im, 0.0_dp)
643 qs_ot_env%rotation_response_valid = .false.
644 qs_ot_env%response_candidate_pending = .false.
645 qs_ot_env%response_shadow_pending = .false.
646 qs_ot_env%response_candidate_directions = 0
647 qs_ot_env%response_candidate_good_samples = 0
648 qs_ot_env%response_candidate_cooldown = 0
649 qs_ot_env%response_shadow_good_samples = 0
650 qs_ot_env%response_model_curvature = 0.0_dp
651 qs_ot_env%response_shadow_curvature = 0.0_dp
652 qs_ot_env%response_hxc_direction_valid = .false.
653 qs_ot_env%response_reference_energy = 0.0_dp
654 qs_ot_env%response_reference_residual = 0.0_dp
655 qs_ot_env%response_predicted_slope = 0.0_dp
656 qs_ot_env%response_predicted_curvature = 0.0_dp
657 IF (qs_ot_env%use_dx)
THEN
658 CALL dbcsr_set(qs_ot_env%rot_mat_dx, 0.0_dp)
659 IF (
ASSOCIATED(qs_ot_env%rot_mat_dx_im))
CALL dbcsr_set(qs_ot_env%rot_mat_dx_im, 0.0_dp)
661 IF (qs_ot_env%use_gx_old)
THEN
662 CALL dbcsr_set(qs_ot_env%rot_mat_gx_old, 0.0_dp)
663 IF (
ASSOCIATED(qs_ot_env%rot_mat_gx_old_im))
CALL dbcsr_set(qs_ot_env%rot_mat_gx_old_im, 0.0_dp)
666 IF (qs_ot_env%settings%do_ener)
THEN
667 qs_ot_env%ener_rayleigh(:) = 0.0_dp
668 qs_ot_env%ener_gx(:) = 0.0_dp
669 IF (
ASSOCIATED(qs_ot_env%ener_preconditioned_gx))
THEN
670 qs_ot_env%ener_preconditioned_gx(:) = 0.0_dp
672 IF (
ASSOCIATED(qs_ot_env%ener_response_gx)) qs_ot_env%ener_response_gx(:) = 0.0_dp
673 IF (
ALLOCATED(qs_ot_env%ener_mermin_g0)) qs_ot_env%ener_mermin_g0(:) = 0.0_dp
674 IF (qs_ot_env%use_dx)
THEN
675 qs_ot_env%ener_dx(:) = 0.0_dp
677 IF (qs_ot_env%use_gx_old)
THEN
678 qs_ot_env%ener_gx_old(:) = 0.0_dp
694 SUBROUTINE qs_ot_allocate(qs_ot_env, matrix_s, fm_struct_ref, ortho_k, energy_dimension)
698 INTEGER,
OPTIONAL :: ortho_k, energy_dimension
700 INTEGER :: i, k, m_diis, my_energy_dimension, &
701 my_ortho_k, n, ncoef, nhistory
707 cpassert(.NOT. qs_ot_env%state_allocated)
708 qs_ot_env%has_complex_kpoint_state = .false.
709 NULLIFY (qs_ot_env%preconditioner)
710 NULLIFY (qs_ot_env%matrix_psc0)
711 NULLIFY (qs_ot_env%matrix_psc0_im)
712 NULLIFY (qs_ot_env%para_env)
713 NULLIFY (qs_ot_env%blacs_env)
716 para_env=para_env, context=context)
718 qs_ot_env%para_env => para_env
719 qs_ot_env%blacs_env => context
720 CALL para_env%retain()
721 CALL context%retain()
723 IF (
PRESENT(ortho_k))
THEN
728 my_energy_dimension = k
729 IF (
PRESENT(energy_dimension)) my_energy_dimension = energy_dimension
730 IF (qs_ot_env%settings%do_ener)
THEN
731 cpassert(my_energy_dimension > 0)
734 m_diis = qs_ot_env%settings%diis_m
736 qs_ot_env%use_gx_old = .false.
737 qs_ot_env%use_dx = .false.
739 SELECT CASE (qs_ot_env%settings%ot_method)
743 qs_ot_env%use_gx_old = .true.
744 qs_ot_env%use_dx = .true.
745 IF (qs_ot_env%settings%ot_method ==
"LBFG" .AND. m_diis < 1) cpabort(
"m_diis less than one")
746 CASE (
"DIIS",
"BROY")
747 IF (m_diis < 1) cpabort(
"m_diis less than one")
749 cpabort(
"Unknown option")
752 IF (qs_ot_env%settings%ot_method ==
"DIIS" .OR. &
753 qs_ot_env%settings%ot_method ==
"BROY")
THEN
754 ALLOCATE (qs_ot_env%ls_diis(m_diis + 1, m_diis + 1))
755 qs_ot_env%ls_diis = 0.0_dp
756 ALLOCATE (qs_ot_env%lss_diis(m_diis + 1, m_diis + 1))
757 ALLOCATE (qs_ot_env%c_diis(m_diis + 1))
758 ALLOCATE (qs_ot_env%c_broy(m_diis))
759 ALLOCATE (qs_ot_env%energy_h(m_diis))
760 ALLOCATE (qs_ot_env%ipivot(m_diis + 1))
762 IF (qs_ot_env%settings%ot_method ==
"LBFG")
THEN
763 ALLOCATE (qs_ot_env%lbfgs_rho(m_diis), qs_ot_env%lbfgs_yy(m_diis), &
764 qs_ot_env%lbfgs_sy_rotation(m_diis), qs_ot_env%lbfgs_yy_rotation(m_diis))
765 qs_ot_env%lbfgs_rho = 0.0_dp
766 qs_ot_env%lbfgs_yy = 0.0_dp
767 qs_ot_env%lbfgs_sy_rotation = 0.0_dp
768 qs_ot_env%lbfgs_yy_rotation = 0.0_dp
771 ALLOCATE (qs_ot_env%evals(k))
772 ALLOCATE (qs_ot_env%dum(k))
774 NULLIFY (qs_ot_env%matrix_os)
775 NULLIFY (qs_ot_env%matrix_os_im)
776 NULLIFY (qs_ot_env%matrix_buf1_ortho)
777 NULLIFY (qs_ot_env%matrix_buf1_ortho_im)
778 NULLIFY (qs_ot_env%matrix_buf2_ortho)
779 NULLIFY (qs_ot_env%matrix_buf2_ortho_im)
780 NULLIFY (qs_ot_env%matrix_tmp_ortho)
781 NULLIFY (qs_ot_env%matrix_buf_nk)
782 NULLIFY (qs_ot_env%matrix_buf_nk_im)
783 NULLIFY (qs_ot_env%matrix_tmp_nk)
784 NULLIFY (qs_ot_env%matrix_p)
785 NULLIFY (qs_ot_env%matrix_p_im)
786 NULLIFY (qs_ot_env%matrix_r)
787 NULLIFY (qs_ot_env%matrix_r_im)
788 NULLIFY (qs_ot_env%matrix_sinp)
789 NULLIFY (qs_ot_env%matrix_sinp_im)
790 NULLIFY (qs_ot_env%matrix_cosp)
791 NULLIFY (qs_ot_env%matrix_cosp_im)
792 NULLIFY (qs_ot_env%matrix_sinp_b)
793 NULLIFY (qs_ot_env%matrix_cosp_b)
794 NULLIFY (qs_ot_env%matrix_buf1)
795 NULLIFY (qs_ot_env%matrix_buf1_im)
796 NULLIFY (qs_ot_env%matrix_buf2)
797 NULLIFY (qs_ot_env%matrix_buf2_im)
798 NULLIFY (qs_ot_env%matrix_buf3)
799 NULLIFY (qs_ot_env%matrix_buf3_im)
800 NULLIFY (qs_ot_env%matrix_buf4)
801 NULLIFY (qs_ot_env%matrix_buf4_im)
802 NULLIFY (qs_ot_env%matrix_c0)
803 NULLIFY (qs_ot_env%matrix_sc0)
804 NULLIFY (qs_ot_env%matrix_c0_im)
805 NULLIFY (qs_ot_env%matrix_sc0_im)
806 NULLIFY (qs_ot_env%matrix_x)
807 NULLIFY (qs_ot_env%matrix_sx)
808 NULLIFY (qs_ot_env%matrix_x_im)
809 NULLIFY (qs_ot_env%matrix_sx_im)
810 NULLIFY (qs_ot_env%matrix_gx)
811 NULLIFY (qs_ot_env%matrix_gx_im)
812 NULLIFY (qs_ot_env%matrix_preconditioned_gx)
813 NULLIFY (qs_ot_env%matrix_preconditioned_gx_im)
814 NULLIFY (qs_ot_env%matrix_response_gx)
815 NULLIFY (qs_ot_env%matrix_response_gx_im)
816 NULLIFY (qs_ot_env%matrix_mermin_g0)
817 NULLIFY (qs_ot_env%matrix_mermin_g0_im)
818 NULLIFY (qs_ot_env%matrix_ref_inv_sqrt)
819 NULLIFY (qs_ot_env%matrix_ref_inv_sqrt_im)
820 NULLIFY (qs_ot_env%fm_mermin_c0)
821 NULLIFY (qs_ot_env%fm_mermin_c0_im)
822 NULLIFY (qs_ot_env%fm_mermin_h0)
823 NULLIFY (qs_ot_env%fm_mermin_h0_im)
824 NULLIFY (qs_ot_env%fm_mermin_c_previous)
825 NULLIFY (qs_ot_env%fm_mermin_c_previous_im)
826 NULLIFY (qs_ot_env%fm_mermin_y_previous)
827 NULLIFY (qs_ot_env%fm_mermin_y_previous_im)
828 qs_ot_env%mermin_physical_ref_valid = .false.
829 qs_ot_env%mermin_physical_secant_valid = .false.
830 qs_ot_env%mermin_gradient_ref_valid = .false.
831 NULLIFY (qs_ot_env%matrix_gx_old)
832 NULLIFY (qs_ot_env%matrix_gx_old_im)
833 NULLIFY (qs_ot_env%matrix_dx)
834 NULLIFY (qs_ot_env%matrix_dx_im)
835 NULLIFY (qs_ot_env%buf1_k_k_nosym)
836 NULLIFY (qs_ot_env%buf2_k_k_nosym)
837 NULLIFY (qs_ot_env%buf3_k_k_nosym)
838 NULLIFY (qs_ot_env%buf4_k_k_nosym)
839 NULLIFY (qs_ot_env%buf1_k_k_sym)
840 NULLIFY (qs_ot_env%buf2_k_k_sym)
841 NULLIFY (qs_ot_env%buf3_k_k_sym)
842 NULLIFY (qs_ot_env%buf4_k_k_sym)
843 NULLIFY (qs_ot_env%buf1_n_k)
844 NULLIFY (qs_ot_env%buf1_n_k_dp)
845 NULLIFY (qs_ot_env%p_k_k_sym)
850 sym=dbcsr_type_no_symmetry)
854 sym=dbcsr_type_no_symmetry)
858 sym=dbcsr_type_no_symmetry)
862 sym=dbcsr_type_no_symmetry)
866 sym=dbcsr_type_no_symmetry)
868 IF (qs_ot_env%settings%occupation_preconditioner)
THEN
871 template=matrix_s, n=k, &
872 sym=dbcsr_type_no_symmetry)
875 IF (qs_ot_env%use_dx)
THEN
878 sym=dbcsr_type_no_symmetry)
881 IF (qs_ot_env%use_gx_old)
THEN
884 sym=dbcsr_type_no_symmetry)
887 SELECT CASE (qs_ot_env%settings%ot_algorithm)
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)
911 sym=dbcsr_type_no_symmetry)
915 sym=dbcsr_type_no_symmetry)
919 sym=dbcsr_type_no_symmetry)
923 sym=dbcsr_type_no_symmetry)
927 sym=dbcsr_type_no_symmetry)
931 sym=dbcsr_type_no_symmetry)
935 sym=dbcsr_type_no_symmetry)
939 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)
961 sym=dbcsr_type_no_symmetry)
965 sym=dbcsr_type_no_symmetry)
969 sym=dbcsr_type_no_symmetry)
973 sym=dbcsr_type_no_symmetry)
977 sym=dbcsr_type_no_symmetry)
981 sym=dbcsr_type_no_symmetry)
985 sym=dbcsr_type_no_symmetry)
989 IF (qs_ot_env%settings%ot_method ==
"DIIS" .OR. &
990 qs_ot_env%settings%ot_method ==
"BROY" .OR. &
991 qs_ot_env%settings%ot_method ==
"LBFG")
THEN
992 NULLIFY (qs_ot_env%matrix_h_e)
993 NULLIFY (qs_ot_env%matrix_h_x)
994 NULLIFY (qs_ot_env%matrix_h_e_im)
995 NULLIFY (qs_ot_env%matrix_h_x_im)
997 IF (qs_ot_env%settings%ot_method ==
"LBFG") ncoef = m_diis + 1
1003 sym=dbcsr_type_no_symmetry)
1007 sym=dbcsr_type_no_symmetry)
1011 NULLIFY (qs_ot_env%rot_mat_u, qs_ot_env%rot_mat_u_im, &
1012 qs_ot_env%rot_mat_x, qs_ot_env%rot_mat_x_im, &
1013 qs_ot_env%rot_mat_h_e, qs_ot_env%rot_mat_h_x, &
1014 qs_ot_env%rot_mat_h_e_im, qs_ot_env%rot_mat_h_x_im, qs_ot_env%rot_mat_gx, &
1015 qs_ot_env%rot_mat_gx_im, qs_ot_env%rot_mat_response_gx, &
1016 qs_ot_env%rot_mat_response_gx_im, qs_ot_env%rot_mat_mermin_g0, &
1017 qs_ot_env%rot_mat_mermin_g0_im, qs_ot_env%rot_mat_gx_old, &
1018 qs_ot_env%rot_mat_gx_old_im, qs_ot_env%rot_mat_dx, qs_ot_env%rot_mat_dx_im, &
1019 qs_ot_env%rot_mat_evals, qs_ot_env%rot_mat_dedu, qs_ot_env%rot_mat_dedu_im, &
1020 qs_ot_env%rot_mat_chc, qs_ot_env%rot_mat_chc_im, &
1021 qs_ot_env%rot_mat_evec_re, qs_ot_env%rot_mat_evec_im)
1023 IF (qs_ot_env%settings%do_rotation)
THEN
1026 sym=dbcsr_type_no_symmetry)
1030 sym=dbcsr_type_no_symmetry)
1034 sym=dbcsr_type_no_symmetry)
1038 sym=dbcsr_type_no_symmetry)
1040 IF (qs_ot_env%settings%ot_method ==
"DIIS" .OR. &
1041 qs_ot_env%settings%ot_method ==
"BROY" .OR. &
1042 qs_ot_env%settings%ot_method ==
"LBFG")
THEN
1044 IF (qs_ot_env%settings%ot_method ==
"LBFG") ncoef = m_diis + 1
1050 sym=dbcsr_type_no_symmetry)
1054 sym=dbcsr_type_no_symmetry)
1058 ALLOCATE (qs_ot_env%rot_mat_evals(k))
1061 sym=dbcsr_type_no_symmetry)
1064 sym=dbcsr_type_no_symmetry)
1068 sym=dbcsr_type_no_symmetry)
1070 IF (qs_ot_env%settings%occupation_preconditioner)
THEN
1073 template=matrix_s, m=k, n=k, &
1074 sym=dbcsr_type_no_symmetry)
1077 IF (qs_ot_env%use_gx_old)
THEN
1080 sym=dbcsr_type_no_symmetry)
1083 IF (qs_ot_env%use_dx)
THEN
1086 sym=dbcsr_type_no_symmetry)
1091 IF (qs_ot_env%settings%do_ener)
THEN
1092 ncoef = my_energy_dimension
1093 ALLOCATE (qs_ot_env%ener_x(ncoef))
1094 ALLOCATE (qs_ot_env%ener_rayleigh(ncoef))
1096 IF (qs_ot_env%settings%ot_method ==
"DIIS" .OR. &
1097 qs_ot_env%settings%ot_method ==
"BROY" .OR. &
1098 qs_ot_env%settings%ot_method ==
"LBFG")
THEN
1100 IF (qs_ot_env%settings%ot_method ==
"LBFG") nhistory = m_diis + 1
1101 ALLOCATE (qs_ot_env%ener_h_e(nhistory, ncoef))
1102 ALLOCATE (qs_ot_env%ener_h_x(nhistory, ncoef))
1103 qs_ot_env%ener_h_e = 0.0_dp
1104 qs_ot_env%ener_h_x = 0.0_dp
1107 ALLOCATE (qs_ot_env%ener_gx(ncoef))
1108 IF (qs_ot_env%settings%occupation_preconditioner)
THEN
1109 ALLOCATE (qs_ot_env%ener_preconditioned_gx(ncoef))
1110 ALLOCATE (qs_ot_env%ener_response_gx(ncoef))
1113 IF (qs_ot_env%use_gx_old)
THEN
1114 ALLOCATE (qs_ot_env%ener_gx_old(ncoef))
1117 IF (qs_ot_env%use_dx)
THEN
1118 ALLOCATE (qs_ot_env%ener_dx(ncoef))
1119 qs_ot_env%ener_dx = 0.0_dp
1123 qs_ot_env%state_allocated = .true.
1136 INTEGER :: i, ncoef, nmo, nmo_ortho
1138 cpassert(qs_ot_env%state_allocated)
1139 cpassert(.NOT. qs_ot_env%has_complex_kpoint_state)
1140 cpassert(
ASSOCIATED(matrix_s))
1143 CALL dbcsr_get_info(qs_ot_env%matrix_sc0, nfullcols_total=nmo_ortho)
1147 sym=dbcsr_type_no_symmetry)
1150 sym=dbcsr_type_no_symmetry)
1153 sym=dbcsr_type_no_symmetry)
1156 sym=dbcsr_type_no_symmetry)
1159 sym=dbcsr_type_no_symmetry)
1160 IF (qs_ot_env%settings%occupation_preconditioner)
THEN
1161 CALL dbcsr_init_p(qs_ot_env%matrix_preconditioned_gx_im)
1163 template=matrix_s, n=nmo, &
1164 sym=dbcsr_type_no_symmetry)
1165 IF (qs_ot_env%use_dx)
THEN
1168 template=matrix_s, n=nmo, &
1169 sym=dbcsr_type_no_symmetry)
1172 template=matrix_s, n=nmo, &
1173 sym=dbcsr_type_no_symmetry)
1176 template=matrix_s, n=nmo, &
1177 sym=dbcsr_type_no_symmetry)
1180 template=matrix_s, n=nmo, &
1181 sym=dbcsr_type_no_symmetry)
1182 IF (qs_ot_env%settings%do_ener)
THEN
1183 cpassert(
ASSOCIATED(qs_ot_env%ener_x))
1184 ALLOCATE (qs_ot_env%ener_mermin_g0(
SIZE(qs_ot_env%ener_x)))
1188 SELECT CASE (qs_ot_env%settings%ot_algorithm)
1190 cpassert(nmo_ortho == nmo)
1191 CALL allocate_complex_copy(qs_ot_env%matrix_p_im, qs_ot_env%matrix_p,
"matrix_p_im")
1192 CALL allocate_complex_copy(qs_ot_env%matrix_r_im, qs_ot_env%matrix_r,
"matrix_r_im")
1193 CALL allocate_complex_copy(qs_ot_env%matrix_sinp_im, qs_ot_env%matrix_sinp,
"matrix_sinp_im")
1194 CALL allocate_complex_copy(qs_ot_env%matrix_cosp_im, qs_ot_env%matrix_cosp,
"matrix_cosp_im")
1195 CALL allocate_complex_copy(qs_ot_env%matrix_buf1_im, qs_ot_env%matrix_buf1,
"matrix_buf1_im")
1196 CALL allocate_complex_copy(qs_ot_env%matrix_buf2_im, qs_ot_env%matrix_buf2,
"matrix_buf2_im")
1197 CALL allocate_complex_copy(qs_ot_env%matrix_buf3_im, qs_ot_env%matrix_buf3,
"matrix_buf3_im")
1198 CALL allocate_complex_copy(qs_ot_env%matrix_buf4_im, qs_ot_env%matrix_buf4,
"matrix_buf4_im")
1199 CALL allocate_complex_copy(qs_ot_env%matrix_os_im, qs_ot_env%matrix_os,
"matrix_os_im")
1200 CALL allocate_complex_copy(qs_ot_env%matrix_buf1_ortho_im, qs_ot_env%matrix_buf1_ortho, &
1201 "matrix_buf1_ortho_im")
1202 CALL allocate_complex_copy(qs_ot_env%matrix_buf2_ortho_im, qs_ot_env%matrix_buf2_ortho, &
1203 "matrix_buf2_ortho_im")
1204 CALL allocate_complex_copy(qs_ot_env%matrix_tmp_ortho, qs_ot_env%matrix_buf1_ortho, &
1206 CALL allocate_complex_copy(qs_ot_env%matrix_buf_nk, qs_ot_env%matrix_x,
"matrix_buf_nk")
1207 CALL allocate_complex_copy(qs_ot_env%matrix_buf_nk_im, qs_ot_env%matrix_x,
"matrix_buf_nk_im")
1208 CALL allocate_complex_copy(qs_ot_env%matrix_tmp_nk, qs_ot_env%matrix_x,
"matrix_tmp_nk")
1212 sym=dbcsr_type_no_symmetry)
1215 sym=dbcsr_type_no_symmetry)
1218 sym=dbcsr_type_no_symmetry)
1220 cpabort(
"Complex K-point OT state requires ALGORITHM STRICT or IRAC")
1222 IF (qs_ot_env%use_dx)
THEN
1225 sym=dbcsr_type_no_symmetry)
1227 IF (qs_ot_env%use_gx_old)
THEN
1230 sym=dbcsr_type_no_symmetry)
1232 IF (qs_ot_env%settings%ot_method ==
"DIIS" .OR. &
1233 qs_ot_env%settings%ot_method ==
"BROY" .OR. &
1234 qs_ot_env%settings%ot_method ==
"LBFG")
THEN
1235 ncoef = qs_ot_env%settings%diis_m
1236 IF (qs_ot_env%settings%ot_method ==
"LBFG") ncoef = ncoef + 1
1242 template=matrix_s, n=nmo, &
1243 sym=dbcsr_type_no_symmetry)
1246 template=matrix_s, n=nmo, &
1247 sym=dbcsr_type_no_symmetry)
1251 IF (qs_ot_env%settings%do_rotation)
THEN
1254 sym=dbcsr_type_no_symmetry)
1257 sym=dbcsr_type_no_symmetry)
1260 sym=dbcsr_type_no_symmetry)
1263 sym=dbcsr_type_no_symmetry)
1266 sym=dbcsr_type_no_symmetry)
1267 IF (qs_ot_env%settings%occupation_preconditioner)
THEN
1270 template=matrix_s, m=nmo, n=nmo, &
1271 sym=dbcsr_type_no_symmetry)
1272 IF (qs_ot_env%use_dx)
THEN
1275 template=matrix_s, m=nmo, n=nmo, &
1276 sym=dbcsr_type_no_symmetry)
1279 template=matrix_s, m=nmo, n=nmo, &
1280 sym=dbcsr_type_no_symmetry)
1283 IF (qs_ot_env%use_dx)
THEN
1286 sym=dbcsr_type_no_symmetry)
1288 IF (qs_ot_env%use_gx_old)
THEN
1291 sym=dbcsr_type_no_symmetry)
1293 IF (qs_ot_env%settings%ot_method ==
"DIIS" .OR. &
1294 qs_ot_env%settings%ot_method ==
"BROY" .OR. &
1295 qs_ot_env%settings%ot_method ==
"LBFG")
THEN
1296 ncoef = qs_ot_env%settings%diis_m
1297 IF (qs_ot_env%settings%ot_method ==
"LBFG") ncoef = ncoef + 1
1303 template=matrix_s, m=nmo, n=nmo, &
1304 sym=dbcsr_type_no_symmetry)
1307 template=matrix_s, m=nmo, n=nmo, &
1308 sym=dbcsr_type_no_symmetry)
1313 qs_ot_env%has_complex_kpoint_state = .true.
1323 SUBROUTINE allocate_complex_copy(matrix, template, name)
1324 TYPE(
dbcsr_type),
POINTER :: matrix, template
1325 CHARACTER(LEN=*),
INTENT(IN) :: name
1330 END SUBROUTINE allocate_complex_copy
1341 IF (.NOT. qs_ot_env%state_allocated)
RETURN
1346 IF (
ASSOCIATED(qs_ot_env%evals))
DEALLOCATE (qs_ot_env%evals)
1347 IF (
ASSOCIATED(qs_ot_env%dum))
DEALLOCATE (qs_ot_env%dum)
1349 IF (
ASSOCIATED(qs_ot_env%matrix_os))
CALL dbcsr_release_p(qs_ot_env%matrix_os)
1350 IF (
ASSOCIATED(qs_ot_env%matrix_os_im))
CALL dbcsr_release_p(qs_ot_env%matrix_os_im)
1351 IF (
ASSOCIATED(qs_ot_env%matrix_p))
CALL dbcsr_release_p(qs_ot_env%matrix_p)
1352 IF (
ASSOCIATED(qs_ot_env%matrix_p_im))
CALL dbcsr_release_p(qs_ot_env%matrix_p_im)
1353 IF (
ASSOCIATED(qs_ot_env%matrix_cosp))
CALL dbcsr_release_p(qs_ot_env%matrix_cosp)
1354 IF (
ASSOCIATED(qs_ot_env%matrix_cosp_im))
CALL dbcsr_release_p(qs_ot_env%matrix_cosp_im)
1355 IF (
ASSOCIATED(qs_ot_env%matrix_sinp))
CALL dbcsr_release_p(qs_ot_env%matrix_sinp)
1356 IF (
ASSOCIATED(qs_ot_env%matrix_sinp_im))
CALL dbcsr_release_p(qs_ot_env%matrix_sinp_im)
1357 IF (
ASSOCIATED(qs_ot_env%matrix_r))
CALL dbcsr_release_p(qs_ot_env%matrix_r)
1358 IF (
ASSOCIATED(qs_ot_env%matrix_r_im))
CALL dbcsr_release_p(qs_ot_env%matrix_r_im)
1359 IF (
ASSOCIATED(qs_ot_env%matrix_cosp_b))
CALL dbcsr_release_p(qs_ot_env%matrix_cosp_b)
1360 IF (
ASSOCIATED(qs_ot_env%matrix_sinp_b))
CALL dbcsr_release_p(qs_ot_env%matrix_sinp_b)
1361 IF (
ASSOCIATED(qs_ot_env%matrix_buf1))
CALL dbcsr_release_p(qs_ot_env%matrix_buf1)
1362 IF (
ASSOCIATED(qs_ot_env%matrix_buf1_im))
CALL dbcsr_release_p(qs_ot_env%matrix_buf1_im)
1363 IF (
ASSOCIATED(qs_ot_env%matrix_buf2))
CALL dbcsr_release_p(qs_ot_env%matrix_buf2)
1364 IF (
ASSOCIATED(qs_ot_env%matrix_buf2_im))
CALL dbcsr_release_p(qs_ot_env%matrix_buf2_im)
1365 IF (
ASSOCIATED(qs_ot_env%matrix_buf3))
CALL dbcsr_release_p(qs_ot_env%matrix_buf3)
1366 IF (
ASSOCIATED(qs_ot_env%matrix_buf3_im))
CALL dbcsr_release_p(qs_ot_env%matrix_buf3_im)
1367 IF (
ASSOCIATED(qs_ot_env%matrix_buf4))
CALL dbcsr_release_p(qs_ot_env%matrix_buf4)
1368 IF (
ASSOCIATED(qs_ot_env%matrix_buf4_im))
CALL dbcsr_release_p(qs_ot_env%matrix_buf4_im)
1369 IF (
ASSOCIATED(qs_ot_env%matrix_buf1_ortho))
CALL dbcsr_release_p(qs_ot_env%matrix_buf1_ortho)
1370 IF (
ASSOCIATED(qs_ot_env%matrix_buf1_ortho_im))
CALL dbcsr_release_p(qs_ot_env%matrix_buf1_ortho_im)
1371 IF (
ASSOCIATED(qs_ot_env%matrix_buf2_ortho))
CALL dbcsr_release_p(qs_ot_env%matrix_buf2_ortho)
1372 IF (
ASSOCIATED(qs_ot_env%matrix_buf2_ortho_im))
CALL dbcsr_release_p(qs_ot_env%matrix_buf2_ortho_im)
1373 IF (
ASSOCIATED(qs_ot_env%matrix_tmp_ortho))
CALL dbcsr_release_p(qs_ot_env%matrix_tmp_ortho)
1374 IF (
ASSOCIATED(qs_ot_env%matrix_buf_nk))
CALL dbcsr_release_p(qs_ot_env%matrix_buf_nk)
1375 IF (
ASSOCIATED(qs_ot_env%matrix_buf_nk_im))
CALL dbcsr_release_p(qs_ot_env%matrix_buf_nk_im)
1376 IF (
ASSOCIATED(qs_ot_env%matrix_tmp_nk))
CALL dbcsr_release_p(qs_ot_env%matrix_tmp_nk)
1377 IF (
ASSOCIATED(qs_ot_env%matrix_c0))
CALL dbcsr_release_p(qs_ot_env%matrix_c0)
1378 IF (
ASSOCIATED(qs_ot_env%matrix_sc0))
CALL dbcsr_release_p(qs_ot_env%matrix_sc0)
1379 IF (
ASSOCIATED(qs_ot_env%matrix_psc0))
CALL dbcsr_release_p(qs_ot_env%matrix_psc0)
1380 IF (
ASSOCIATED(qs_ot_env%matrix_psc0_im))
CALL dbcsr_release_p(qs_ot_env%matrix_psc0_im)
1381 IF (
ASSOCIATED(qs_ot_env%matrix_c0_im))
CALL dbcsr_release_p(qs_ot_env%matrix_c0_im)
1382 IF (
ASSOCIATED(qs_ot_env%matrix_sc0_im))
CALL dbcsr_release_p(qs_ot_env%matrix_sc0_im)
1383 IF (
ASSOCIATED(qs_ot_env%matrix_x))
CALL dbcsr_release_p(qs_ot_env%matrix_x)
1384 IF (
ASSOCIATED(qs_ot_env%matrix_sx))
CALL dbcsr_release_p(qs_ot_env%matrix_sx)
1385 IF (
ASSOCIATED(qs_ot_env%matrix_x_im))
CALL dbcsr_release_p(qs_ot_env%matrix_x_im)
1386 IF (
ASSOCIATED(qs_ot_env%matrix_sx_im))
CALL dbcsr_release_p(qs_ot_env%matrix_sx_im)
1387 IF (
ASSOCIATED(qs_ot_env%matrix_gx))
CALL dbcsr_release_p(qs_ot_env%matrix_gx)
1388 IF (
ASSOCIATED(qs_ot_env%matrix_gx_im))
CALL dbcsr_release_p(qs_ot_env%matrix_gx_im)
1389 IF (
ASSOCIATED(qs_ot_env%matrix_preconditioned_gx))
THEN
1392 IF (
ASSOCIATED(qs_ot_env%matrix_preconditioned_gx_im))
THEN
1395 IF (
ASSOCIATED(qs_ot_env%matrix_response_gx))
CALL dbcsr_release_p(qs_ot_env%matrix_response_gx)
1396 IF (
ASSOCIATED(qs_ot_env%matrix_response_gx_im))
THEN
1399 IF (
ASSOCIATED(qs_ot_env%matrix_mermin_g0))
CALL dbcsr_release_p(qs_ot_env%matrix_mermin_g0)
1400 IF (
ASSOCIATED(qs_ot_env%matrix_mermin_g0_im))
THEN
1403 IF (
ASSOCIATED(qs_ot_env%matrix_ref_inv_sqrt))
CALL dbcsr_release_p(qs_ot_env%matrix_ref_inv_sqrt)
1404 IF (
ASSOCIATED(qs_ot_env%matrix_ref_inv_sqrt_im))
CALL dbcsr_release_p(qs_ot_env%matrix_ref_inv_sqrt_im)
1405 IF (
ASSOCIATED(qs_ot_env%fm_mermin_c0))
THEN
1407 DEALLOCATE (qs_ot_env%fm_mermin_c0)
1409 IF (
ASSOCIATED(qs_ot_env%fm_mermin_c0_im))
THEN
1411 DEALLOCATE (qs_ot_env%fm_mermin_c0_im)
1413 IF (
ASSOCIATED(qs_ot_env%fm_mermin_h0))
THEN
1415 DEALLOCATE (qs_ot_env%fm_mermin_h0)
1417 IF (
ASSOCIATED(qs_ot_env%fm_mermin_h0_im))
THEN
1419 DEALLOCATE (qs_ot_env%fm_mermin_h0_im)
1421 IF (
ASSOCIATED(qs_ot_env%fm_mermin_c_previous))
THEN
1423 DEALLOCATE (qs_ot_env%fm_mermin_c_previous)
1425 IF (
ASSOCIATED(qs_ot_env%fm_mermin_c_previous_im))
THEN
1427 DEALLOCATE (qs_ot_env%fm_mermin_c_previous_im)
1429 IF (
ASSOCIATED(qs_ot_env%fm_mermin_y_previous))
THEN
1431 DEALLOCATE (qs_ot_env%fm_mermin_y_previous)
1433 IF (
ASSOCIATED(qs_ot_env%fm_mermin_y_previous_im))
THEN
1435 DEALLOCATE (qs_ot_env%fm_mermin_y_previous_im)
1437 IF (
ALLOCATED(qs_ot_env%mermin_occupation0))
DEALLOCATE (qs_ot_env%mermin_occupation0)
1438 IF (
ALLOCATED(qs_ot_env%mermin_occupation_previous))
THEN
1439 DEALLOCATE (qs_ot_env%mermin_occupation_previous)
1441 IF (
ALLOCATED(qs_ot_env%ener_mermin_g0))
DEALLOCATE (qs_ot_env%ener_mermin_g0)
1442 qs_ot_env%mermin_physical_ref_valid = .false.
1443 qs_ot_env%mermin_physical_secant_valid = .false.
1444 qs_ot_env%mermin_gradient_ref_valid = .false.
1445 IF (
ASSOCIATED(qs_ot_env%matrix_dx))
CALL dbcsr_release_p(qs_ot_env%matrix_dx)
1446 IF (
ASSOCIATED(qs_ot_env%matrix_dx_im))
CALL dbcsr_release_p(qs_ot_env%matrix_dx_im)
1447 IF (
ASSOCIATED(qs_ot_env%matrix_gx_old))
CALL dbcsr_release_p(qs_ot_env%matrix_gx_old)
1448 IF (
ASSOCIATED(qs_ot_env%matrix_gx_old_im))
CALL dbcsr_release_p(qs_ot_env%matrix_gx_old_im)
1449 IF (
ASSOCIATED(qs_ot_env%buf1_k_k_nosym))
CALL dbcsr_release_p(qs_ot_env%buf1_k_k_nosym)
1450 IF (
ASSOCIATED(qs_ot_env%buf2_k_k_nosym))
CALL dbcsr_release_p(qs_ot_env%buf2_k_k_nosym)
1451 IF (
ASSOCIATED(qs_ot_env%buf3_k_k_nosym))
CALL dbcsr_release_p(qs_ot_env%buf3_k_k_nosym)
1452 IF (
ASSOCIATED(qs_ot_env%buf4_k_k_nosym))
CALL dbcsr_release_p(qs_ot_env%buf4_k_k_nosym)
1453 IF (
ASSOCIATED(qs_ot_env%p_k_k_sym))
CALL dbcsr_release_p(qs_ot_env%p_k_k_sym)
1454 IF (
ASSOCIATED(qs_ot_env%buf1_k_k_sym))
CALL dbcsr_release_p(qs_ot_env%buf1_k_k_sym)
1455 IF (
ASSOCIATED(qs_ot_env%buf2_k_k_sym))
CALL dbcsr_release_p(qs_ot_env%buf2_k_k_sym)
1456 IF (
ASSOCIATED(qs_ot_env%buf3_k_k_sym))
CALL dbcsr_release_p(qs_ot_env%buf3_k_k_sym)
1457 IF (
ASSOCIATED(qs_ot_env%buf4_k_k_sym))
CALL dbcsr_release_p(qs_ot_env%buf4_k_k_sym)
1458 IF (
ASSOCIATED(qs_ot_env%buf1_n_k))
CALL dbcsr_release_p(qs_ot_env%buf1_n_k)
1459 IF (
ASSOCIATED(qs_ot_env%buf1_n_k_dp))
CALL dbcsr_release_p(qs_ot_env%buf1_n_k_dp)
1461 IF (qs_ot_env%settings%ot_method ==
"DIIS" .OR. &
1462 qs_ot_env%settings%ot_method ==
"BROY" .OR. &
1463 qs_ot_env%settings%ot_method ==
"LBFG")
THEN
1466 IF (
ASSOCIATED(qs_ot_env%matrix_h_x_im))
THEN
1469 IF (
ASSOCIATED(qs_ot_env%matrix_h_e_im))
THEN
1473 IF (qs_ot_env%settings%ot_method ==
"DIIS" .OR. &
1474 qs_ot_env%settings%ot_method ==
"BROY")
THEN
1475 DEALLOCATE (qs_ot_env%ls_diis)
1476 DEALLOCATE (qs_ot_env%lss_diis)
1477 DEALLOCATE (qs_ot_env%c_diis)
1478 DEALLOCATE (qs_ot_env%c_broy)
1479 DEALLOCATE (qs_ot_env%energy_h)
1480 DEALLOCATE (qs_ot_env%ipivot)
1482 IF (qs_ot_env%settings%ot_method ==
"LBFG")
THEN
1483 DEALLOCATE (qs_ot_env%lbfgs_rho, qs_ot_env%lbfgs_yy, &
1484 qs_ot_env%lbfgs_sy_rotation, qs_ot_env%lbfgs_yy_rotation)
1487 IF (qs_ot_env%settings%do_rotation)
THEN
1489 IF (
ASSOCIATED(qs_ot_env%rot_mat_u))
CALL dbcsr_release_p(qs_ot_env%rot_mat_u)
1490 IF (
ASSOCIATED(qs_ot_env%rot_mat_u_im))
CALL dbcsr_release_p(qs_ot_env%rot_mat_u_im)
1491 IF (
ASSOCIATED(qs_ot_env%rot_mat_x))
CALL dbcsr_release_p(qs_ot_env%rot_mat_x)
1492 IF (
ASSOCIATED(qs_ot_env%rot_mat_x_im))
CALL dbcsr_release_p(qs_ot_env%rot_mat_x_im)
1493 IF (
ASSOCIATED(qs_ot_env%rot_mat_dedu))
CALL dbcsr_release_p(qs_ot_env%rot_mat_dedu)
1494 IF (
ASSOCIATED(qs_ot_env%rot_mat_dedu_im))
CALL dbcsr_release_p(qs_ot_env%rot_mat_dedu_im)
1495 IF (
ASSOCIATED(qs_ot_env%rot_mat_chc))
CALL dbcsr_release_p(qs_ot_env%rot_mat_chc)
1496 IF (
ASSOCIATED(qs_ot_env%rot_mat_chc_im))
CALL dbcsr_release_p(qs_ot_env%rot_mat_chc_im)
1498 IF (qs_ot_env%settings%ot_method ==
"DIIS" .OR. &
1499 qs_ot_env%settings%ot_method ==
"BROY" .OR. &
1500 qs_ot_env%settings%ot_method ==
"LBFG")
THEN
1503 IF (
ASSOCIATED(qs_ot_env%rot_mat_h_x_im))
THEN
1506 IF (
ASSOCIATED(qs_ot_env%rot_mat_h_e_im))
THEN
1511 IF (
ASSOCIATED(qs_ot_env%rot_mat_evals))
DEALLOCATE (qs_ot_env%rot_mat_evals)
1512 IF (
ASSOCIATED(qs_ot_env%rot_mat_evec_re))
CALL dbcsr_release_p(qs_ot_env%rot_mat_evec_re)
1513 IF (
ASSOCIATED(qs_ot_env%rot_mat_evec_im))
CALL dbcsr_release_p(qs_ot_env%rot_mat_evec_im)
1514 IF (
ASSOCIATED(qs_ot_env%rot_mat_gx))
CALL dbcsr_release_p(qs_ot_env%rot_mat_gx)
1515 IF (
ASSOCIATED(qs_ot_env%rot_mat_gx_im))
CALL dbcsr_release_p(qs_ot_env%rot_mat_gx_im)
1516 IF (
ASSOCIATED(qs_ot_env%rot_mat_response_gx))
THEN
1519 IF (
ASSOCIATED(qs_ot_env%rot_mat_response_gx_im))
THEN
1522 IF (
ASSOCIATED(qs_ot_env%rot_mat_mermin_g0))
THEN
1525 IF (
ASSOCIATED(qs_ot_env%rot_mat_mermin_g0_im))
THEN
1528 IF (
ASSOCIATED(qs_ot_env%rot_mat_gx_old))
CALL dbcsr_release_p(qs_ot_env%rot_mat_gx_old)
1529 IF (
ASSOCIATED(qs_ot_env%rot_mat_gx_old_im))
CALL dbcsr_release_p(qs_ot_env%rot_mat_gx_old_im)
1530 IF (
ASSOCIATED(qs_ot_env%rot_mat_dx))
CALL dbcsr_release_p(qs_ot_env%rot_mat_dx)
1531 IF (
ASSOCIATED(qs_ot_env%rot_mat_dx_im))
CALL dbcsr_release_p(qs_ot_env%rot_mat_dx_im)
1534 IF (qs_ot_env%settings%do_ener)
THEN
1535 IF (
ASSOCIATED(qs_ot_env%ener_x))
DEALLOCATE (qs_ot_env%ener_x)
1536 IF (
ASSOCIATED(qs_ot_env%ener_rayleigh))
DEALLOCATE (qs_ot_env%ener_rayleigh)
1537 IF (
ASSOCIATED(qs_ot_env%ener_gx))
DEALLOCATE (qs_ot_env%ener_gx)
1538 IF (
ASSOCIATED(qs_ot_env%ener_preconditioned_gx))
THEN
1539 DEALLOCATE (qs_ot_env%ener_preconditioned_gx)
1541 IF (
ASSOCIATED(qs_ot_env%ener_response_gx))
DEALLOCATE (qs_ot_env%ener_response_gx)
1542 IF (qs_ot_env%settings%ot_method ==
"DIIS" .OR. &
1543 qs_ot_env%settings%ot_method ==
"BROY" .OR. &
1544 qs_ot_env%settings%ot_method ==
"LBFG")
THEN
1545 IF (
ASSOCIATED(qs_ot_env%ener_h_x))
DEALLOCATE (qs_ot_env%ener_h_x)
1546 IF (
ASSOCIATED(qs_ot_env%ener_h_e))
DEALLOCATE (qs_ot_env%ener_h_e)
1548 IF (qs_ot_env%use_dx)
THEN
1549 IF (
ASSOCIATED(qs_ot_env%ener_dx))
DEALLOCATE (qs_ot_env%ener_dx)
1551 IF (qs_ot_env%use_gx_old)
THEN
1552 IF (
ASSOCIATED(qs_ot_env%ener_gx_old))
DEALLOCATE (qs_ot_env%ener_gx_old)
1556 qs_ot_env%state_allocated = .false.
1557 qs_ot_env%has_complex_kpoint_state = .false.
1572 INTEGER,
INTENT(IN) :: output_unit
1573 LOGICAL,
INTENT(IN),
OPTIONAL :: complex_kpoints, eigensolver
1575 CHARACTER(len=*),
PARAMETER :: routinen =
'ot_readwrite_input'
1577 INTEGER :: handle, ls_method, ot_algorithm, &
1578 ot_method, ot_ortho_irac
1579 LOGICAL :: energy_gap_explicit, &
1580 use_complex_kpoints, use_eigensolver
1582 CALL timeset(routinen, handle)
1584 use_complex_kpoints = .false.
1585 IF (
PRESENT(complex_kpoints)) use_complex_kpoints = complex_kpoints
1586 use_eigensolver = .false.
1587 IF (
PRESENT(eigensolver)) use_eigensolver = eigensolver
1591 SELECT CASE (ot_algorithm)
1593 settings%ot_algorithm =
"TOD"
1596 settings%ot_algorithm =
"REF"
1598 cpabort(
"Value unknown")
1603 IF (settings%irac_degree < 2 .OR. settings%irac_degree > 4)
THEN
1604 cpabort(
"READ OT IRAC_DEGREE: Value unknown")
1607 IF (settings%max_irac < 1)
THEN
1608 cpabort(
"READ OT MAX_IRAC: VALUE MUST BE GREATER THAN ZERO")
1610 CALL section_vals_val_get(ot_section,
"EPS_IRAC_FILTER_MATRIX", r_val=settings%eps_irac_filter_matrix)
1612 IF (settings%eps_irac < 0.0_dp)
THEN
1613 cpabort(
"READ OT EPS_IRAC: VALUE MUST BE GREATER THAN ZERO")
1615 CALL section_vals_val_get(ot_section,
"EPS_IRAC_QUICK_EXIT", r_val=settings%eps_irac_quick_exit)
1616 IF (settings%eps_irac_quick_exit < 0.0_dp)
THEN
1617 cpabort(
"READ OT EPS_IRAC_QUICK_EXIT: VALUE MUST BE GREATER THAN ZERO")
1621 IF (settings%eps_irac_switch < 0.0_dp)
THEN
1622 cpabort(
"READ OT EPS_IRAC_SWITCH: VALUE MUST BE GREATER THAN ZERO")
1626 SELECT CASE (ot_ortho_irac)
1628 settings%ortho_irac =
"CHOL"
1630 settings%ortho_irac =
"POLY"
1632 settings%ortho_irac =
"LWDN"
1634 cpabort(
"READ OT ORTHO_IRAC: Value unknown")
1641 IF (settings%ot_state == 1)
THEN
1645 SELECT CASE (ot_method)
1647 settings%ot_method =
"SD"
1649 settings%ot_method =
"CG"
1651 settings%ot_method =
"DIIS"
1660 CALL section_vals_val_get(ot_section,
"BROYDEN_SIGMA_DECREASE", r_val=settings%broyden_sigma_decrease)
1662 CALL section_vals_val_get(ot_section,
"BROYDEN_FORGET_HISTORY", l_val=settings%broyden_forget_history)
1663 CALL section_vals_val_get(ot_section,
"BROYDEN_ADAPTIVE_SIGMA", l_val=settings%broyden_adaptive_sigma)
1664 CALL section_vals_val_get(ot_section,
"BROYDEN_ENABLE_FLIP", l_val=settings%broyden_enable_flip)
1665 settings%ot_method =
"BROY"
1669 r_val=settings%lbfgs_curvature_tol)
1671 l_val=settings%lbfgs_damping)
1672 IF (settings%lbfgs_curvature_tol < 0.0_dp .OR. &
1673 settings%lbfgs_curvature_tol >= 1.0_dp)
THEN
1674 cpabort(
"READ OT LBFGS_CURVATURE_TOL: Value must be in [0, 1)")
1676 settings%ot_method =
"LBFG"
1678 cpabort(
"READ OTSCF MINIMIZER: Value unknown")
1682 SELECT CASE (ls_method)
1684 settings%line_search_method =
"NONE"
1686 settings%line_search_method =
"2PNT"
1688 settings%line_search_method =
"3PNT"
1690 settings%line_search_method =
"ADPT"
1692 settings%line_search_method =
"GOLD"
1695 cpabort(
"READ OTSCF LS: Value unknown")
1699 SELECT CASE (settings%precond_solver_type)
1701 settings%precond_solver_name =
"DEFAULT"
1703 settings%precond_solver_name =
"INVERSE_CHOLESKY"
1705 settings%precond_solver_name =
"DIRECT"
1707 settings%precond_solver_name =
"INVERSE_UPDATE"
1709 settings%precond_solver_name =
"CHEBYSHEV"
1711 cpabort(
"READ OTSCF SOLVER: Value unknown")
1714 IF (settings%chebyshev_degree < 1 .OR. settings%chebyshev_degree > 100)
THEN
1715 cpabort(
"READ OT CHEBYSHEV_DEGREE: Value must be between 1 and 100")
1723 explicit=energy_gap_explicit)
1726 SELECT CASE (settings%preconditioner_type)
1728 settings%preconditioner_name =
"NONE"
1729 IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.15_dp
1730 IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.2_dp
1732 settings%preconditioner_name =
"FULL_SINGLE"
1733 IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.15_dp
1734 IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.2_dp
1736 settings%preconditioner_name =
"FULL_SINGLE_INVERSE"
1737 IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.08_dp
1738 IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.08_dp
1740 settings%preconditioner_name =
"FULL_ALL"
1741 IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.15_dp
1742 IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.08_dp
1744 settings%preconditioner_name =
"FULL_KINETIC"
1745 IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.15_dp
1746 IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.2_dp
1748 settings%preconditioner_name =
"FULL_S_INVERSE"
1749 IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.15_dp
1750 IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.2_dp
1752 cpabort(
"READ OTSCF PRECONDITIONER: Value unknown")
1754 IF (use_complex_kpoints .AND. &
1756 .NOT. energy_gap_explicit) settings%energy_gap = 0.20_dp
1763 l_val=settings%occupation_preconditioner)
1766 r_val=settings%nondiag_energy_strength)
1767 IF (settings%ot_method ==
"LBFG")
THEN
1768 IF (settings%ot_algorithm /=
"TOD" .AND. settings%ot_algorithm /=
"REF")
THEN
1769 cpabort(
"MINIMIZER LBFGS requires ALGORITHM STRICT or IRAC")
1772 IF (settings%do_ener .AND. .NOT. use_complex_kpoints .AND. .NOT. use_eigensolver)
THEN
1773 cpabort(
"OT%ENERGIES is currently supported only by the complex K-point Mermin path.")
1775 IF (use_eigensolver .AND. &
1776 (settings%do_rotation .OR. settings%do_ener .OR. &
1777 settings%occupation_preconditioner .OR. settings%add_nondiag_energy))
THEN
1778 CALL cp_warn(__location__, &
1779 "DIAGONALIZATION%OT ignores ROTATION, ENERGIES, "// &
1780 "OCCUPATION_PRECONDITIONER, and NONDIAG_ENERGY because occupations "// &
1781 "are assigned after eigenspace minimization.")
1782 settings%do_rotation = .false.
1783 settings%do_ener = .false.
1784 settings%occupation_preconditioner = .false.
1785 settings%add_nondiag_energy = .false.
1790 IF (output_unit > 0)
THEN
1791 WRITE (output_unit,
'(/,A)')
" ----------------------------------- OT ---------------------------------------"
1792 IF (settings%do_rotation)
THEN
1793 WRITE (output_unit,
'(A)')
" Allowing for rotations "
1795 IF (settings%do_ener)
THEN
1796 WRITE (output_unit,
'(A,L2)')
" Optimizing orbital energies "
1798 SELECT CASE (settings%OT_METHOD)
1800 WRITE (output_unit,
'(A)')
" Minimizer : SD : steepest descent"
1802 WRITE (output_unit,
'(A)')
" Minimizer : CG : conjugate gradient"
1804 WRITE (output_unit,
'(A)')
" Minimizer : DIIS : direct inversion"
1805 WRITE (output_unit,
'(A)')
" in the iterative subspace"
1806 WRITE (output_unit,
'(A,I3,A)')
" using ", settings%diis_m,
" DIIS vectors"
1807 IF (settings%safer_diis)
THEN
1808 WRITE (output_unit,
'(A,I3,A)')
" safer DIIS on"
1810 WRITE (output_unit,
'(A,I3,A)')
" safer DIIS off"
1813 WRITE (output_unit,
'(A)')
" Minimizer : BROYDEN : Broyden "
1814 WRITE (output_unit,
'(A,F16.8)')
" BETA : ", settings%broyden_beta
1815 WRITE (output_unit,
'(A,F16.8)')
" GAMMA : ", settings%broyden_gamma
1816 WRITE (output_unit,
'(A,F16.8)')
" SIGMA : ", settings%broyden_sigma
1817 WRITE (output_unit,
'(A,I3,A)')
" using : - ", &
1818 settings%diis_m,
" BROYDEN vectors"
1820 WRITE (output_unit,
'(A)')
" Minimizer : LBFGS : limited-memory BFGS"
1821 WRITE (output_unit,
'(A,I3,A)')
" using : ", &
1822 settings%diis_m,
" secant pairs"
1823 WRITE (output_unit,
'(A,ES12.4)')
" curvature tolerance : ", &
1824 settings%lbfgs_curvature_tol
1825 WRITE (output_unit,
'(A,L7)')
" damp weak curvature : ", &
1826 settings%lbfgs_damping
1828 WRITE (output_unit,
'(3A)')
" Minimizer : ", settings%OT_METHOD,
" : UNKNOWN"
1830 SELECT CASE (settings%preconditioner_name)
1831 CASE (
"FULL_SINGLE")
1832 WRITE (output_unit,
'(A)')
" Preconditioner : FULL_SINGLE : diagonalization based"
1833 CASE (
"FULL_SINGLE_INVERSE")
1834 WRITE (output_unit,
'(A,/,A)')
" Preconditioner : FULL_SINGLE_INVERSE : inversion of ", &
1835 " H + eS - 2*(Sc)(c^T*H*c+const)(Sc)^T"
1837 WRITE (output_unit,
'(A)')
" Preconditioner : FULL_ALL : diagonalization, state selective"
1838 CASE (
"FULL_KINETIC")
1839 WRITE (output_unit,
'(A)')
" Preconditioner : FULL_KINETIC : inversion of T + eS"
1840 CASE (
"FULL_S_INVERSE")
1841 WRITE (output_unit,
'(A)')
" Preconditioner : FULL_S_INVERSE : cholesky inversion of S"
1842 CASE (
"SPARSE_DIAG")
1843 WRITE (output_unit,
'(A)') &
1844 " Preconditioner : SPARSE_DIAG : diagonal atomic block diagonalization"
1845 CASE (
"SPARSE_KINETIC")
1846 WRITE (output_unit,
'(A)')
" Preconditioner : SPARSE_KINETIC : sparse linear solver for T + eS"
1848 WRITE (output_unit,
'(A)')
" Preconditioner : NONE"
1850 WRITE (output_unit,
'(3A)')
" Preconditioner : ", settings%preconditioner_name,
" : UNKNOWN"
1853 WRITE (output_unit,
'(A)')
" Precond_solver : "//trim(settings%precond_solver_name)
1855 WRITE (output_unit,
'(A,I14)')
" Chebyshev degree:", settings%chebyshev_degree
1858 IF (settings%OT_METHOD ==
"SD" .OR. settings%OT_METHOD ==
"CG" .OR. &
1859 settings%OT_METHOD ==
"LBFG")
THEN
1860 SELECT CASE (settings%line_search_method)
1862 WRITE (output_unit,
'(A)')
" Line search : 2PNT : 2 energies, one gradient"
1864 WRITE (output_unit,
'(A)')
" Line search : 3PNT : 3 energies"
1866 WRITE (output_unit,
'(A)')
" Line search : GOLD : bracketing and golden section search"
1867 WRITE (output_unit,
'(A,F14.8)')
" target rel accuracy : ", settings%gold_target
1869 WRITE (output_unit,
'(A)')
" Line search : NONE"
1871 WRITE (output_unit,
'(3A)')
" Line search : ", settings%line_search_method,
" : UNKNOWN"
1874 WRITE (output_unit,
'(A,F14.8,T49,A,F14.8)')
" stepsize :", settings%ds_min, &
1875 " energy_gap :", settings%energy_gap
1876 IF (settings%ot_algorithm ==
'TOD')
THEN
1877 WRITE (output_unit,
'(A,E14.5,T49,A,I14)')
" eps_taylor :", settings%eps_taylor, &
1878 " max_taylor :", settings%max_taylor
1880 IF (settings%ot_algorithm ==
'REF')
THEN
1881 WRITE (output_unit,
'(A,1X,A,T49,A,I14)')
" ortho_irac :", settings%ortho_irac, &
1882 " irac_degree :", settings%irac_degree
1883 WRITE (output_unit,
'(A,I14,T49,A,E14.5)')
" max_irac :", settings%max_irac, &
1884 " eps_irac :", settings%eps_irac
1885 WRITE (output_unit,
'(A,E14.5,T49,A,E10.3)')
" eps_irac_switch:", settings%eps_irac_switch, &
1886 " eps_irac_quick_exit:", settings%eps_irac_quick_exit
1887 WRITE (output_unit,
'(A,L2)')
" on_the_fly_loc :", settings%on_the_fly_loc
1889 WRITE (output_unit,
'(A)')
" ----------------------------------- OT ---------------------------------------"
1890 WRITE (unit=output_unit, &
1891 fmt=
"(/,T3,A,T12,A,T31,A,T39,A,T59,A,T75,A,/,T3,A)") &
1892 "Step",
"Update method",
"Time",
"Convergence",
"Total energy",
"Change", &
1896 CALL timestop(handle)