Line data Source code
1 : !--------------------------------------------------------------------------------------------------!
2 : ! CP2K: A general program to perform molecular dynamics simulations !
3 : ! Copyright 2000-2026 CP2K developers group <https://cp2k.org> !
4 : ! !
5 : ! SPDX-License-Identifier: GPL-2.0-or-later !
6 : !--------------------------------------------------------------------------------------------------!
7 :
8 : ! **************************************************************************************************
9 : !> \brief orbital transformations
10 : !> \par History
11 : !> Added Taylor expansion based computation of the matrix functions (01.2004)
12 : !> added additional rotation variables for non-equivalent occupied orbs (08.2004)
13 : !> \author Joost VandeVondele (06.2002)
14 : ! **************************************************************************************************
15 : MODULE qs_ot_types
16 : USE bibliography, ONLY: VandeVondele2003,&
17 : Weber2008,&
18 : cite_reference
19 : USE cp_blacs_env, ONLY: cp_blacs_env_release,&
20 : cp_blacs_env_type
21 : USE cp_dbcsr_api, ONLY: dbcsr_copy,&
22 : dbcsr_get_info,&
23 : dbcsr_init_p,&
24 : dbcsr_p_type,&
25 : dbcsr_release_p,&
26 : dbcsr_set,&
27 : dbcsr_type,&
28 : dbcsr_type_no_symmetry
29 : USE cp_dbcsr_contrib, ONLY: dbcsr_add_on_diag
30 : USE cp_dbcsr_operations, ONLY: cp_dbcsr_m_by_n_from_row_template,&
31 : cp_dbcsr_m_by_n_from_template,&
32 : dbcsr_allocate_matrix_set,&
33 : dbcsr_deallocate_matrix_set
34 : USE cp_fm_struct, ONLY: cp_fm_struct_get,&
35 : cp_fm_struct_type
36 : USE cp_fm_types, ONLY: cp_fm_release,&
37 : cp_fm_type
38 : USE input_constants, ONLY: &
39 : cholesky_reduce, ls_2pnt, ls_3pnt, ls_adapt, ls_gold, ls_none, ot_algo_irac, &
40 : ot_algo_taylor_or_diag, ot_chol_irac, ot_low_rank_base_lattice_fft, &
41 : ot_low_rank_base_overlap, ot_lwdn_irac, ot_mini_broyden, ot_mini_cg, ot_mini_diis, &
42 : ot_mini_lbfgs, ot_mini_sd, ot_poly_irac, ot_precond_fermi_low_rank, ot_precond_full_all, &
43 : ot_precond_full_kinetic, ot_precond_full_single, ot_precond_full_single_inverse, &
44 : ot_precond_none, ot_precond_s_inverse, ot_precond_solver_chebyshev, &
45 : ot_precond_solver_default, ot_precond_solver_direct, ot_precond_solver_inv_chol, &
46 : ot_precond_solver_update
47 : USE input_section_types, ONLY: section_vals_type,&
48 : section_vals_val_get
49 : USE kinds, ONLY: dp
50 : USE message_passing, ONLY: mp_para_env_release,&
51 : mp_para_env_type
52 : USE preconditioner_types, ONLY: preconditioner_type
53 : #include "./base/base_uses.f90"
54 :
55 : IMPLICIT NONE
56 :
57 : PRIVATE
58 :
59 : PUBLIC :: qs_ot_type
60 : PUBLIC :: qs_ot_settings_type
61 : PUBLIC :: qs_ot_destroy
62 : PUBLIC :: qs_ot_allocate
63 : PUBLIC :: qs_ot_allocate_complex_state
64 : PUBLIC :: qs_ot_channel_index
65 : PUBLIC :: qs_ot_check_channel_context
66 : PUBLIC :: qs_ot_init
67 : PUBLIC :: qs_ot_kpoint_preconditioner_solver_supported
68 : PUBLIC :: qs_ot_kpoint_preconditioner_scale
69 : PUBLIC :: qs_ot_kpoint_preconditioner_supported
70 : PUBLIC :: qs_ot_number_of_channels
71 : PUBLIC :: qs_ot_settings_init
72 : PUBLIC :: qs_ot_set_context
73 : PUBLIC :: ot_readwrite_input
74 :
75 : ! **************************************************************************************************
76 : !> \brief notice, this variable needs to be copyable, needed for spins as e.g. in qs_ot_scf
77 : ! **************************************************************************************************
78 : TYPE qs_ot_settings_type
79 : LOGICAL :: do_rotation = .FALSE., do_ener = .FALSE.
80 : LOGICAL :: ks = .FALSE.
81 : CHARACTER(LEN=4) :: ot_method = ""
82 : CHARACTER(LEN=3) :: ot_algorithm = ""
83 : CHARACTER(LEN=4) :: line_search_method = ""
84 : CHARACTER(LEN=20) :: preconditioner_name = ""
85 : INTEGER :: preconditioner_type = -1
86 : CHARACTER(LEN=20) :: low_rank_base_name = ""
87 : INTEGER :: low_rank_base = ot_low_rank_base_overlap
88 : INTEGER :: cholesky_type = -1
89 : INTEGER :: ot_state = 0
90 : CHARACTER(LEN=20) :: precond_solver_name = ""
91 : INTEGER :: precond_solver_type = -1
92 : INTEGER :: chebyshev_degree = 8
93 : LOGICAL :: safer_diis = .FALSE.
94 : REAL(KIND=dp) :: ds_min = -1.0_dp
95 : REAL(KIND=dp) :: energy_gap = -1.0_dp
96 : INTEGER :: diis_m = -1
97 : REAL(KIND=dp) :: lbfgs_curvature_tol = 1.0E-4_dp
98 : LOGICAL :: lbfgs_damping = .TRUE.
99 : INTEGER :: max_scf_diis = 0
100 : REAL(KIND=dp) :: gold_target = -1.0_dp
101 : REAL(KIND=dp) :: eps_taylor = -1.0_dp ! minimum accuracy of Taylor expansion
102 : INTEGER :: max_taylor = -1 ! maximum order of Taylor expansion before switching to diagonalization
103 : INTEGER :: irac_degree = -1 ! used to control the refinement polynomial degree
104 : INTEGER :: max_irac = -1 ! maximum number of iteration for refinement
105 : REAL(KIND=dp) :: eps_irac = -1.0_dp ! target accuracy for refinement
106 : REAL(KIND=dp) :: eps_irac_quick_exit = -1.0_dp
107 : REAL(KIND=dp) :: eps_irac_filter_matrix = -1.0_dp
108 : REAL(KIND=dp) :: eps_irac_switch = -1.0_dp
109 : LOGICAL :: on_the_fly_loc = .FALSE.
110 : CHARACTER(LEN=4) :: ortho_irac = ""
111 : LOGICAL :: occupation_preconditioner = .FALSE., add_nondiag_energy = .FALSE.
112 : REAL(KIND=dp) :: nondiag_energy_strength = -1.0_dp
113 : REAL(KIND=dp) :: broyden_beta = -1.0_dp, broyden_gamma = -1.0_dp, broyden_sigma = -1.0_dp
114 : REAL(KIND=dp) :: broyden_eta = -1.0_dp, broyden_omega = -1.0_dp, broyden_sigma_decrease = -1.0_dp
115 : REAL(KIND=dp) :: broyden_sigma_min = -1.0_dp
116 : LOGICAL :: broyden_forget_history = .FALSE., broyden_adaptive_sigma = .FALSE.
117 : LOGICAL :: broyden_enable_flip = .FALSE.
118 : END TYPE qs_ot_settings_type
119 :
120 : ! **************************************************************************************************
121 : TYPE qs_ot_type
122 : ! this sets the method to be used
123 : TYPE(qs_ot_settings_type) :: settings = qs_ot_settings_type()
124 : LOGICAL :: restricted = .FALSE.
125 : INTEGER :: spin_index = 0, kpoint_index = 0, local_kpoint_index = 0
126 : REAL(KIND=dp) :: kpoint_weight = 1.0_dp
127 : LOGICAL :: has_kpoint_context = .FALSE.
128 : LOGICAL :: state_allocated = .FALSE.
129 : LOGICAL :: has_complex_kpoint_state = .FALSE.
130 :
131 : ! first part of the variables, for occupied subspace invariant optimisation
132 :
133 : ! add a preconditioner matrix. should be symmetric and positive definite
134 : ! the type of this matrix might change in the future
135 : TYPE(preconditioner_type), POINTER :: preconditioner => NULL()
136 :
137 : ! these will/might change during iterations
138 :
139 : ! OT / TOD
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()
144 : TYPE(dbcsr_type), POINTER :: matrix_sinp_b => NULL()
145 : TYPE(dbcsr_type), POINTER :: matrix_cosp_b => 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()
153 : TYPE(dbcsr_type), POINTER :: matrix_tmp_ortho => NULL()
154 : TYPE(dbcsr_type), POINTER :: matrix_buf_nk => NULL(), matrix_buf_nk_im => NULL(), &
155 : matrix_tmp_nk => NULL()
156 :
157 : REAL(KIND=dp), DIMENSION(:), POINTER :: evals => NULL()
158 : REAL(KIND=dp), DIMENSION(:), POINTER :: dum => NULL()
159 :
160 : ! matrix os valid
161 : LOGICAL :: os_valid = .FALSE.
162 :
163 : ! for efficient/parallel writing to the blacs_matrix
164 : TYPE(mp_para_env_type), POINTER :: para_env => NULL()
165 : TYPE(cp_blacs_env_type), POINTER :: blacs_env => NULL()
166 :
167 : ! mo-like vectors
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()
170 :
171 : ! OT / IR
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()
177 :
178 : ! only here for the ease of programming. These will have to be supplied
179 : ! explicitly at all times
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()
187 : ! Owned physical endpoints for the bounded, gauge-invariant Hxc response secant.
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, &
196 : ener_mermin_g0
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()
201 :
202 : LOGICAL :: use_gx_old = .FALSE., use_dx = .FALSE.
203 :
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()
209 :
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()
216 :
217 : REAL(KIND=dp) :: ot_pos(53) = -1.0_dp, ot_energy(53) = -1.0_dp, ot_grad(53) = -1.0_dp ! HARD LIMIT FOR THE LS
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
228 :
229 : LOGICAL :: do_taylor = .FALSE.
230 : INTEGER :: taylor_order = -1
231 : REAL(KIND=dp) :: largest_eval_upper_bound = -1.0_dp
232 :
233 : ! second part of the variables, if an explicit rotation is required as well
234 : TYPE(dbcsr_type), POINTER :: rot_mat_u => NULL() ! rotation matrix
235 : TYPE(dbcsr_type), POINTER :: rot_mat_u_im => NULL() ! imaginary part at complex k points
236 : TYPE(dbcsr_type), POINTER :: rot_mat_x => NULL() ! antisymmetric matrix that parametrises rot_matrix_u
237 : TYPE(dbcsr_type), POINTER :: rot_mat_x_im => NULL() ! symmetric imaginary generator component
238 : TYPE(dbcsr_type), POINTER :: rot_mat_dedu => NULL() ! derivative of the total energy wrt to u
239 : TYPE(dbcsr_type), POINTER :: rot_mat_dedu_im => NULL()
240 : TYPE(dbcsr_type), POINTER :: rot_mat_chc => NULL() ! for convencience, the matrix c^T H c
241 : TYPE(dbcsr_type), POINTER :: rot_mat_chc_im => NULL()
242 :
243 : TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: rot_mat_h_e => NULL()
244 : TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: rot_mat_h_x => NULL()
245 : TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: rot_mat_h_e_im => NULL()
246 : TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: rot_mat_h_x_im => NULL()
247 : TYPE(dbcsr_type), POINTER :: rot_mat_gx => NULL()
248 : TYPE(dbcsr_type), POINTER :: rot_mat_gx_im => NULL()
249 : TYPE(dbcsr_type), POINTER :: rot_mat_response_gx => NULL()
250 : TYPE(dbcsr_type), POINTER :: rot_mat_response_gx_im => NULL()
251 : TYPE(dbcsr_type), POINTER :: rot_mat_mermin_g0 => NULL()
252 : TYPE(dbcsr_type), POINTER :: rot_mat_mermin_g0_im => NULL()
253 : TYPE(dbcsr_type), POINTER :: rot_mat_gx_old => NULL()
254 : TYPE(dbcsr_type), POINTER :: rot_mat_gx_old_im => NULL()
255 : TYPE(dbcsr_type), POINTER :: rot_mat_dx => NULL()
256 : TYPE(dbcsr_type), POINTER :: rot_mat_dx_im => NULL()
257 :
258 : REAL(KIND=dp), DIMENSION(:), POINTER :: rot_mat_evals => NULL()
259 : TYPE(dbcsr_type), POINTER :: rot_mat_evec_re => NULL()
260 : TYPE(dbcsr_type), POINTER :: rot_mat_evec_im => 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
275 :
276 : ! third part of the variables, if we need to optimize orbital energies
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()
286 : END TYPE qs_ot_type
287 :
288 : CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_ot_types'
289 :
290 : CONTAINS
291 :
292 : ! **************************************************************************************************
293 : !> \brief sets default values for the settings type
294 : !> \param settings ...
295 : !> \par History
296 : !> 10.2004 created [Joost VandeVondele]
297 : ! **************************************************************************************************
298 17221 : SUBROUTINE qs_ot_settings_init(settings)
299 : TYPE(qs_ot_settings_type) :: settings
300 :
301 17221 : settings%ot_method = "CG"
302 17221 : settings%ot_algorithm = "TOD"
303 17221 : settings%diis_m = 7
304 17221 : settings%lbfgs_curvature_tol = 1.0E-4_dp
305 17221 : settings%lbfgs_damping = .TRUE.
306 17221 : settings%preconditioner_name = "FULL_KINETIC"
307 17221 : settings%preconditioner_type = ot_precond_full_kinetic
308 17221 : settings%low_rank_base_name = "OVERLAP_INVERSE"
309 17221 : settings%low_rank_base = ot_low_rank_base_overlap
310 17221 : settings%cholesky_type = cholesky_reduce
311 17221 : settings%precond_solver_name = "CHOLESKY_INVERSE"
312 17221 : settings%precond_solver_type = ot_precond_solver_inv_chol
313 17221 : settings%chebyshev_degree = 8
314 17221 : settings%line_search_method = "2PNT"
315 17221 : settings%ds_min = 0.15_dp
316 17221 : settings%safer_diis = .TRUE.
317 17221 : settings%energy_gap = 0.2_dp
318 17221 : settings%eps_taylor = 1.0E-16_dp
319 17221 : settings%max_taylor = 4
320 17221 : settings%gold_target = 0.01_dp
321 17221 : settings%do_rotation = .FALSE.
322 17221 : settings%do_ener = .FALSE.
323 17221 : settings%irac_degree = 4
324 17221 : settings%max_irac = 50
325 17221 : settings%max_scf_diis = 0
326 17221 : settings%eps_irac = 1.0E-10_dp
327 17221 : settings%eps_irac_quick_exit = 1.0E-5_dp
328 17221 : settings%eps_irac_switch = 1.0E-2
329 17221 : settings%eps_irac_filter_matrix = 0.0_dp
330 17221 : settings%on_the_fly_loc = .FALSE.
331 17221 : settings%ortho_irac = "CHOL"
332 17221 : settings%ks = .TRUE.
333 17221 : settings%occupation_preconditioner = .FALSE.
334 17221 : settings%add_nondiag_energy = .FALSE.
335 17221 : settings%nondiag_energy_strength = 0.0_dp
336 :
337 17221 : END SUBROUTINE qs_ot_settings_init
338 :
339 : ! **************************************************************************************************
340 : !> \brief label an OT environment by spin and optional irreducible k-point context
341 : !> \param qs_ot_env ...
342 : !> \param spin_index ...
343 : !> \param kpoint_index ...
344 : !> \param local_kpoint_index ...
345 : !> \param kpoint_weight ...
346 : ! **************************************************************************************************
347 18036 : SUBROUTINE qs_ot_set_context(qs_ot_env, spin_index, kpoint_index, local_kpoint_index, kpoint_weight)
348 : TYPE(qs_ot_type) :: qs_ot_env
349 : INTEGER, INTENT(IN), OPTIONAL :: spin_index, kpoint_index, &
350 : local_kpoint_index
351 : REAL(KIND=dp), INTENT(IN), OPTIONAL :: kpoint_weight
352 :
353 18036 : IF (PRESENT(spin_index)) qs_ot_env%spin_index = spin_index
354 18036 : IF (PRESENT(kpoint_index)) qs_ot_env%kpoint_index = kpoint_index
355 18036 : IF (PRESENT(local_kpoint_index)) qs_ot_env%local_kpoint_index = local_kpoint_index
356 18036 : IF (PRESENT(kpoint_weight)) qs_ot_env%kpoint_weight = kpoint_weight
357 18036 : qs_ot_env%has_kpoint_context = PRESENT(kpoint_index) .OR. PRESENT(local_kpoint_index)
358 :
359 18036 : END SUBROUTINE qs_ot_set_context
360 :
361 : ! **************************************************************************************************
362 : !> \brief number of OT optimization channels for spin and k-point resolved state
363 : !> \param nspin ...
364 : !> \param nkpoint ...
365 : !> \param restricted ...
366 : !> \return ...
367 : ! **************************************************************************************************
368 17694 : INTEGER FUNCTION qs_ot_number_of_channels(nspin, nkpoint, restricted)
369 : INTEGER, INTENT(IN) :: nspin
370 : INTEGER, INTENT(IN), OPTIONAL :: nkpoint
371 : LOGICAL, INTENT(IN), OPTIONAL :: restricted
372 :
373 : INTEGER :: nkpoint_eff, nspin_eff
374 :
375 17694 : nspin_eff = nspin
376 17694 : IF (PRESENT(restricted)) THEN
377 17694 : IF (restricted) nspin_eff = 1
378 : END IF
379 17694 : nkpoint_eff = 1
380 17694 : IF (PRESENT(nkpoint)) nkpoint_eff = nkpoint
381 :
382 17694 : CPASSERT(nspin_eff >= 1)
383 17694 : CPASSERT(nkpoint_eff >= 1)
384 17694 : qs_ot_number_of_channels = nspin_eff*nkpoint_eff
385 :
386 17694 : END FUNCTION qs_ot_number_of_channels
387 :
388 : ! **************************************************************************************************
389 : !> \brief Return whether a preconditioner is implemented for complex k-point OT.
390 : !> \param preconditioner_type selected OT preconditioner
391 : !> \param use_real_wfn whether the k-point channel stores a real wavefunction
392 : !> \return ...
393 : ! **************************************************************************************************
394 326 : PURE ELEMENTAL FUNCTION qs_ot_kpoint_preconditioner_supported(preconditioner_type, use_real_wfn) &
395 : RESULT(supported)
396 : INTEGER, INTENT(IN) :: preconditioner_type
397 : LOGICAL, INTENT(IN) :: use_real_wfn
398 : LOGICAL :: supported
399 :
400 326 : supported = .FALSE.
401 326 : IF (.NOT. use_real_wfn) THEN
402 : supported = preconditioner_type == ot_precond_none .OR. &
403 : preconditioner_type == ot_precond_full_all .OR. &
404 : preconditioner_type == ot_precond_full_single .OR. &
405 : preconditioner_type == ot_precond_full_single_inverse .OR. &
406 : preconditioner_type == ot_precond_full_kinetic .OR. &
407 324 : preconditioner_type == ot_precond_s_inverse
408 : END IF
409 :
410 326 : END FUNCTION qs_ot_kpoint_preconditioner_supported
411 :
412 : ! **************************************************************************************************
413 : !> \brief Return whether a solver is implemented for a complex k-point OT preconditioner.
414 : !> \param preconditioner_type selected OT preconditioner
415 : !> \param solver_type selected preconditioner solver
416 : !> \param use_real_wfn whether the k-point channel stores a real wavefunction
417 : !> \return ...
418 : ! **************************************************************************************************
419 170 : PURE ELEMENTAL FUNCTION qs_ot_kpoint_preconditioner_solver_supported( &
420 : preconditioner_type, solver_type, use_real_wfn) RESULT(supported)
421 : INTEGER, INTENT(IN) :: preconditioner_type, solver_type
422 : LOGICAL, INTENT(IN) :: use_real_wfn
423 : LOGICAL :: supported
424 :
425 170 : supported = qs_ot_kpoint_preconditioner_supported(preconditioner_type, use_real_wfn)
426 170 : IF (.NOT. supported) RETURN
427 170 : IF (preconditioner_type == ot_precond_full_all .OR. &
428 : preconditioner_type == ot_precond_full_single) THEN
429 74 : supported = solver_type == ot_precond_solver_default
430 : ELSE IF (preconditioner_type == ot_precond_full_single_inverse .OR. &
431 96 : preconditioner_type == ot_precond_full_kinetic .OR. &
432 : preconditioner_type == ot_precond_s_inverse) THEN
433 : supported = solver_type == ot_precond_solver_default .OR. &
434 88 : solver_type == ot_precond_solver_inv_chol
435 : END IF
436 :
437 : END FUNCTION qs_ot_kpoint_preconditioner_solver_supported
438 :
439 : ! **************************************************************************************************
440 : !> \brief Scale an inverse k-point Hessian block consistently with its irreducible weight.
441 : !> \param kpoint_weight positive irreducible k-point weight
442 : !> \return ...
443 : ! **************************************************************************************************
444 4241 : PURE ELEMENTAL REAL(KIND=dp) FUNCTION qs_ot_kpoint_preconditioner_scale(kpoint_weight)
445 : REAL(KIND=dp), INTENT(IN) :: kpoint_weight
446 :
447 4241 : qs_ot_kpoint_preconditioner_scale = 1.0_dp/kpoint_weight
448 :
449 4241 : END FUNCTION qs_ot_kpoint_preconditioner_scale
450 :
451 : ! **************************************************************************************************
452 : !> \brief flat OT channel index for a spin/k-point pair
453 : !> \param ispin ...
454 : !> \param ikpoint ...
455 : !> \param nspin ...
456 : !> \return ...
457 : ! **************************************************************************************************
458 48368 : INTEGER FUNCTION qs_ot_channel_index(ispin, ikpoint, nspin)
459 : INTEGER, INTENT(IN) :: ispin, ikpoint, nspin
460 :
461 48368 : CPASSERT(ispin >= 1)
462 48368 : CPASSERT(ikpoint >= 1)
463 48368 : CPASSERT(nspin >= 1)
464 48368 : CPASSERT(ispin <= nspin)
465 48368 : qs_ot_channel_index = (ikpoint - 1)*nspin + ispin
466 :
467 48368 : END FUNCTION qs_ot_channel_index
468 :
469 : ! **************************************************************************************************
470 : !> \brief validate the flat OT channel identity for spin and optional irreducible k-points
471 : !> \param qs_ot_env ...
472 : !> \param nspin ...
473 : !> \param nkpoint ...
474 : !> \param restricted ...
475 : !> \param require_kpoint ...
476 : !> \param kp_range ...
477 : !> \param wkp ...
478 : !> \param require_local_state ...
479 : !> \param require_complex_state ...
480 : ! **************************************************************************************************
481 10103 : SUBROUTINE qs_ot_check_channel_context(qs_ot_env, nspin, nkpoint, restricted, require_kpoint, &
482 : kp_range, wkp, require_local_state, require_complex_state)
483 : TYPE(qs_ot_type), DIMENSION(:), INTENT(IN) :: qs_ot_env
484 : INTEGER, INTENT(IN) :: nspin
485 : INTEGER, INTENT(IN), OPTIONAL :: nkpoint
486 : LOGICAL, INTENT(IN), OPTIONAL :: restricted, require_kpoint
487 : INTEGER, DIMENSION(2), INTENT(IN), OPTIONAL :: kp_range
488 : REAL(KIND=dp), DIMENSION(:), OPTIONAL, POINTER :: wkp
489 : LOGICAL, INTENT(IN), OPTIONAL :: require_local_state, &
490 : require_complex_state
491 :
492 : INTEGER :: expected_local_kpoint, ikpoint, ispin, &
493 : nkpoint_eff, nspin_eff, ot_channel
494 : LOGICAL :: check_complex_state, &
495 : check_kpoint_context, &
496 : check_local_state, check_weights, &
497 : context_ok, restricted_eff
498 : REAL(KIND=dp) :: weight_tol
499 :
500 10103 : nkpoint_eff = 1
501 10103 : IF (PRESENT(nkpoint)) nkpoint_eff = nkpoint
502 10103 : nspin_eff = nspin
503 10103 : restricted_eff = .FALSE.
504 10103 : IF (PRESENT(restricted)) THEN
505 10103 : restricted_eff = restricted
506 10103 : IF (restricted_eff) nspin_eff = 1
507 : END IF
508 :
509 10103 : check_kpoint_context = (nkpoint_eff > 1)
510 10103 : IF (PRESENT(require_kpoint)) check_kpoint_context = require_kpoint
511 10103 : check_weights = .FALSE.
512 10103 : IF (PRESENT(wkp)) check_weights = ASSOCIATED(wkp)
513 10103 : check_local_state = .FALSE.
514 10103 : IF (PRESENT(require_local_state)) check_local_state = require_local_state
515 10103 : check_complex_state = .FALSE.
516 10103 : IF (PRESENT(require_complex_state)) check_complex_state = require_complex_state
517 :
518 : context_ok = (SIZE(qs_ot_env) == qs_ot_number_of_channels(nspin, &
519 : nkpoint=nkpoint_eff, &
520 10103 : restricted=restricted_eff))
521 10103 : CPASSERT(context_ok)
522 22936 : DO ikpoint = 1, nkpoint_eff
523 12833 : expected_local_kpoint = 0
524 12833 : IF (PRESENT(kp_range)) THEN
525 12833 : IF (ikpoint >= kp_range(1) .AND. ikpoint <= kp_range(2)) THEN
526 4174 : expected_local_kpoint = ikpoint - kp_range(1) + 1
527 : END IF
528 : END IF
529 37436 : DO ispin = 1, nspin_eff
530 14500 : ot_channel = qs_ot_channel_index(ispin, ikpoint, nspin_eff)
531 14500 : CPASSERT(qs_ot_env(ot_channel)%spin_index == ispin)
532 14500 : IF (check_kpoint_context) THEN
533 5636 : CPASSERT(qs_ot_env(ot_channel)%has_kpoint_context)
534 5636 : CPASSERT(qs_ot_env(ot_channel)%kpoint_index == ikpoint)
535 5636 : IF (PRESENT(kp_range)) THEN
536 5636 : context_ok = (qs_ot_env(ot_channel)%local_kpoint_index == expected_local_kpoint)
537 5636 : CPASSERT(context_ok)
538 : END IF
539 5636 : IF (check_weights) THEN
540 5328 : weight_tol = 1000.0_dp*EPSILON(1.0_dp)*MAX(1.0_dp, ABS(wkp(ikpoint)))
541 5328 : context_ok = (ABS(qs_ot_env(ot_channel)%kpoint_weight - wkp(ikpoint)) <= weight_tol)
542 5328 : CPASSERT(context_ok)
543 : END IF
544 : END IF
545 27333 : IF (check_local_state) THEN
546 5328 : IF (expected_local_kpoint > 0 .OR. .NOT. PRESENT(kp_range)) THEN
547 4164 : CPASSERT(qs_ot_env(ot_channel)%state_allocated)
548 4164 : IF (check_complex_state) THEN
549 4164 : CPASSERT(qs_ot_env(ot_channel)%has_complex_kpoint_state)
550 : END IF
551 : ELSE
552 1164 : CPASSERT(.NOT. qs_ot_env(ot_channel)%state_allocated)
553 : END IF
554 : END IF
555 : END DO
556 : END DO
557 :
558 10103 : END SUBROUTINE qs_ot_check_channel_context
559 :
560 : ! **************************************************************************************************
561 : !> \brief init matrices, needs c0 and sc0 so that c0*sc0=1
562 : !> \param qs_ot_env ...
563 : ! **************************************************************************************************
564 9887 : SUBROUTINE qs_ot_init(qs_ot_env)
565 : TYPE(qs_ot_type) :: qs_ot_env
566 :
567 533898 : qs_ot_env%OT_energy(:) = 0.0_dp
568 533898 : qs_ot_env%OT_pos(:) = 0.0_dp
569 533898 : qs_ot_env%OT_grad(:) = 0.0_dp
570 9887 : qs_ot_env%line_search_count = 0
571 :
572 9887 : qs_ot_env%energy_only = .FALSE.
573 9887 : qs_ot_env%gnorm_old = 1.0_dp
574 9887 : qs_ot_env%diis_iter = 0
575 9887 : qs_ot_env%ds_min = qs_ot_env%settings%ds_min
576 9887 : qs_ot_env%os_valid = .FALSE.
577 :
578 9887 : CALL dbcsr_set(qs_ot_env%matrix_gx, 0.0_dp)
579 9887 : IF (ASSOCIATED(qs_ot_env%matrix_gx_im)) THEN
580 349 : CALL dbcsr_set(qs_ot_env%matrix_gx_im, 0.0_dp)
581 : END IF
582 9887 : IF (ASSOCIATED(qs_ot_env%matrix_preconditioned_gx)) THEN
583 108 : CALL dbcsr_set(qs_ot_env%matrix_preconditioned_gx, 0.0_dp)
584 : END IF
585 9887 : IF (ASSOCIATED(qs_ot_env%matrix_preconditioned_gx_im)) THEN
586 108 : CALL dbcsr_set(qs_ot_env%matrix_preconditioned_gx_im, 0.0_dp)
587 : END IF
588 9887 : IF (ASSOCIATED(qs_ot_env%matrix_response_gx)) CALL dbcsr_set(qs_ot_env%matrix_response_gx, 0.0_dp)
589 9887 : IF (ASSOCIATED(qs_ot_env%matrix_response_gx_im)) THEN
590 60 : CALL dbcsr_set(qs_ot_env%matrix_response_gx_im, 0.0_dp)
591 : END IF
592 9887 : IF (ASSOCIATED(qs_ot_env%matrix_mermin_g0)) CALL dbcsr_set(qs_ot_env%matrix_mermin_g0, 0.0_dp)
593 9887 : IF (ASSOCIATED(qs_ot_env%matrix_mermin_g0_im)) THEN
594 60 : CALL dbcsr_set(qs_ot_env%matrix_mermin_g0_im, 0.0_dp)
595 : END IF
596 9887 : qs_ot_env%mermin_gradient_ref_valid = .FALSE.
597 :
598 9887 : IF (qs_ot_env%use_dx) THEN
599 4219 : CALL dbcsr_set(qs_ot_env%matrix_dx, 0.0_dp)
600 : END IF
601 9887 : IF (qs_ot_env%use_dx .AND. ASSOCIATED(qs_ot_env%matrix_dx_im)) THEN
602 214 : CALL dbcsr_set(qs_ot_env%matrix_dx_im, 0.0_dp)
603 : END IF
604 :
605 9887 : IF (qs_ot_env%use_gx_old) THEN
606 4219 : CALL dbcsr_set(qs_ot_env%matrix_gx_old, 0.0_dp)
607 : END IF
608 9887 : IF (qs_ot_env%use_gx_old .AND. ASSOCIATED(qs_ot_env%matrix_gx_old_im)) THEN
609 214 : CALL dbcsr_set(qs_ot_env%matrix_gx_old_im, 0.0_dp)
610 : END IF
611 :
612 9887 : IF (qs_ot_env%settings%ot_method == "LBFG") THEN
613 820 : qs_ot_env%lbfgs_rho = 0.0_dp
614 820 : qs_ot_env%lbfgs_yy = 0.0_dp
615 820 : qs_ot_env%lbfgs_sy_rotation = 0.0_dp
616 820 : qs_ot_env%lbfgs_yy_rotation = 0.0_dp
617 : END IF
618 :
619 9887 : IF (qs_ot_env%settings%do_rotation) THEN
620 392 : CALL dbcsr_set(qs_ot_env%rot_mat_u, 0.0_dp)
621 392 : CALL dbcsr_add_on_diag(qs_ot_env%rot_mat_u, 1.0_dp)
622 392 : CALL dbcsr_set(qs_ot_env%rot_mat_x, 0.0_dp)
623 392 : CALL dbcsr_set(qs_ot_env%rot_mat_dedu, 0.0_dp)
624 392 : CALL dbcsr_set(qs_ot_env%rot_mat_chc, 0.0_dp)
625 392 : CALL dbcsr_set(qs_ot_env%rot_mat_gx, 0.0_dp)
626 392 : IF (ASSOCIATED(qs_ot_env%rot_mat_response_gx)) THEN
627 108 : CALL dbcsr_set(qs_ot_env%rot_mat_response_gx, 0.0_dp)
628 : END IF
629 392 : IF (ASSOCIATED(qs_ot_env%rot_mat_u_im)) CALL dbcsr_set(qs_ot_env%rot_mat_u_im, 0.0_dp)
630 392 : IF (ASSOCIATED(qs_ot_env%rot_mat_x_im)) CALL dbcsr_set(qs_ot_env%rot_mat_x_im, 0.0_dp)
631 392 : IF (ASSOCIATED(qs_ot_env%rot_mat_dedu_im)) CALL dbcsr_set(qs_ot_env%rot_mat_dedu_im, 0.0_dp)
632 392 : IF (ASSOCIATED(qs_ot_env%rot_mat_chc_im)) CALL dbcsr_set(qs_ot_env%rot_mat_chc_im, 0.0_dp)
633 392 : IF (ASSOCIATED(qs_ot_env%rot_mat_gx_im)) CALL dbcsr_set(qs_ot_env%rot_mat_gx_im, 0.0_dp)
634 392 : IF (ASSOCIATED(qs_ot_env%rot_mat_response_gx_im)) THEN
635 108 : CALL dbcsr_set(qs_ot_env%rot_mat_response_gx_im, 0.0_dp)
636 : END IF
637 392 : IF (ASSOCIATED(qs_ot_env%rot_mat_mermin_g0)) THEN
638 60 : CALL dbcsr_set(qs_ot_env%rot_mat_mermin_g0, 0.0_dp)
639 : END IF
640 392 : IF (ASSOCIATED(qs_ot_env%rot_mat_mermin_g0_im)) THEN
641 60 : CALL dbcsr_set(qs_ot_env%rot_mat_mermin_g0_im, 0.0_dp)
642 : END IF
643 392 : qs_ot_env%rotation_response_valid = .FALSE.
644 392 : qs_ot_env%response_candidate_pending = .FALSE.
645 392 : qs_ot_env%response_shadow_pending = .FALSE.
646 392 : qs_ot_env%response_candidate_directions = 0
647 392 : qs_ot_env%response_candidate_good_samples = 0
648 392 : qs_ot_env%response_candidate_cooldown = 0
649 392 : qs_ot_env%response_shadow_good_samples = 0
650 392 : qs_ot_env%response_model_curvature = 0.0_dp
651 392 : qs_ot_env%response_shadow_curvature = 0.0_dp
652 392 : qs_ot_env%response_hxc_direction_valid = .FALSE.
653 392 : qs_ot_env%response_reference_energy = 0.0_dp
654 392 : qs_ot_env%response_reference_residual = 0.0_dp
655 392 : qs_ot_env%response_predicted_slope = 0.0_dp
656 392 : qs_ot_env%response_predicted_curvature = 0.0_dp
657 392 : IF (qs_ot_env%use_dx) THEN
658 306 : CALL dbcsr_set(qs_ot_env%rot_mat_dx, 0.0_dp)
659 306 : IF (ASSOCIATED(qs_ot_env%rot_mat_dx_im)) CALL dbcsr_set(qs_ot_env%rot_mat_dx_im, 0.0_dp)
660 : END IF
661 392 : IF (qs_ot_env%use_gx_old) THEN
662 306 : CALL dbcsr_set(qs_ot_env%rot_mat_gx_old, 0.0_dp)
663 306 : IF (ASSOCIATED(qs_ot_env%rot_mat_gx_old_im)) CALL dbcsr_set(qs_ot_env%rot_mat_gx_old_im, 0.0_dp)
664 : END IF
665 : END IF
666 9887 : IF (qs_ot_env%settings%do_ener) THEN
667 912 : qs_ot_env%ener_rayleigh(:) = 0.0_dp
668 912 : qs_ot_env%ener_gx(:) = 0.0_dp
669 112 : IF (ASSOCIATED(qs_ot_env%ener_preconditioned_gx)) THEN
670 820 : qs_ot_env%ener_preconditioned_gx(:) = 0.0_dp
671 : END IF
672 824 : IF (ASSOCIATED(qs_ot_env%ener_response_gx)) qs_ot_env%ener_response_gx(:) = 0.0_dp
673 488 : IF (ALLOCATED(qs_ot_env%ener_mermin_g0)) qs_ot_env%ener_mermin_g0(:) = 0.0_dp
674 112 : IF (qs_ot_env%use_dx) THEN
675 528 : qs_ot_env%ener_dx(:) = 0.0_dp
676 : END IF
677 112 : IF (qs_ot_env%use_gx_old) THEN
678 528 : qs_ot_env%ener_gx_old(:) = 0.0_dp
679 : END IF
680 : END IF
681 :
682 9887 : END SUBROUTINE qs_ot_init
683 :
684 : ! **************************************************************************************************
685 : !> \brief allocates the data in qs_ot_env, for a calculation with fm_struct_ref
686 : !> ortho_k allows for specifying an additional orthogonal subspace (i.e. c will
687 : !> be kept orthogonal provided c0 was, used in qs_ot_eigensolver)
688 : !> \param qs_ot_env ...
689 : !> \param matrix_s ...
690 : !> \param fm_struct_ref ...
691 : !> \param ortho_k ...
692 : !> \param energy_dimension number of auxiliary energy variables, defaults to the orbital count
693 : ! **************************************************************************************************
694 9887 : SUBROUTINE qs_ot_allocate(qs_ot_env, matrix_s, fm_struct_ref, ortho_k, energy_dimension)
695 : TYPE(qs_ot_type) :: qs_ot_env
696 : TYPE(dbcsr_type), POINTER :: matrix_s
697 : TYPE(cp_fm_struct_type), POINTER :: fm_struct_ref
698 : INTEGER, OPTIONAL :: ortho_k, energy_dimension
699 :
700 : INTEGER :: i, k, m_diis, my_energy_dimension, &
701 : my_ortho_k, n, ncoef, nhistory
702 : TYPE(cp_blacs_env_type), POINTER :: context
703 : TYPE(mp_para_env_type), POINTER :: para_env
704 :
705 9887 : CALL cite_reference(VandeVondele2003)
706 :
707 9887 : CPASSERT(.NOT. qs_ot_env%state_allocated)
708 9887 : qs_ot_env%has_complex_kpoint_state = .FALSE.
709 9887 : NULLIFY (qs_ot_env%preconditioner)
710 9887 : NULLIFY (qs_ot_env%matrix_psc0)
711 9887 : NULLIFY (qs_ot_env%matrix_psc0_im)
712 9887 : NULLIFY (qs_ot_env%para_env)
713 9887 : NULLIFY (qs_ot_env%blacs_env)
714 :
715 : CALL cp_fm_struct_get(fm_struct_ref, nrow_global=n, ncol_global=k, &
716 9887 : para_env=para_env, context=context)
717 :
718 9887 : qs_ot_env%para_env => para_env
719 9887 : qs_ot_env%blacs_env => context
720 9887 : CALL para_env%retain()
721 9887 : CALL context%retain()
722 :
723 9887 : IF (PRESENT(ortho_k)) THEN
724 674 : my_ortho_k = ortho_k
725 : ELSE
726 9213 : my_ortho_k = k
727 : END IF
728 9887 : my_energy_dimension = k
729 9887 : IF (PRESENT(energy_dimension)) my_energy_dimension = energy_dimension
730 9887 : IF (qs_ot_env%settings%do_ener) THEN
731 112 : CPASSERT(my_energy_dimension > 0)
732 : END IF
733 :
734 9887 : m_diis = qs_ot_env%settings%diis_m
735 :
736 9887 : qs_ot_env%use_gx_old = .FALSE.
737 9887 : qs_ot_env%use_dx = .FALSE.
738 :
739 4219 : SELECT CASE (qs_ot_env%settings%ot_method)
740 : CASE ("SD")
741 : ! nothing
742 : CASE ("CG", "LBFG")
743 4219 : qs_ot_env%use_gx_old = .TRUE.
744 4219 : qs_ot_env%use_dx = .TRUE.
745 4219 : IF (qs_ot_env%settings%ot_method == "LBFG" .AND. m_diis < 1) CPABORT("m_diis less than one")
746 : CASE ("DIIS", "BROY")
747 5650 : IF (m_diis < 1) CPABORT("m_diis less than one")
748 : CASE DEFAULT
749 9887 : CPABORT("Unknown option")
750 : END SELECT
751 :
752 9887 : IF (qs_ot_env%settings%ot_method == "DIIS" .OR. &
753 : qs_ot_env%settings%ot_method == "BROY") THEN
754 22600 : ALLOCATE (qs_ot_env%ls_diis(m_diis + 1, m_diis + 1))
755 414524 : qs_ot_env%ls_diis = 0.0_dp
756 16950 : ALLOCATE (qs_ot_env%lss_diis(m_diis + 1, m_diis + 1))
757 16950 : ALLOCATE (qs_ot_env%c_diis(m_diis + 1))
758 16950 : ALLOCATE (qs_ot_env%c_broy(m_diis))
759 11300 : ALLOCATE (qs_ot_env%energy_h(m_diis))
760 16950 : ALLOCATE (qs_ot_env%ipivot(m_diis + 1))
761 : END IF
762 9887 : 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 708 : qs_ot_env%lbfgs_sy_rotation(m_diis), qs_ot_env%lbfgs_yy_rotation(m_diis))
765 820 : qs_ot_env%lbfgs_rho = 0.0_dp
766 820 : qs_ot_env%lbfgs_yy = 0.0_dp
767 820 : qs_ot_env%lbfgs_sy_rotation = 0.0_dp
768 820 : qs_ot_env%lbfgs_yy_rotation = 0.0_dp
769 : END IF
770 :
771 29355 : ALLOCATE (qs_ot_env%evals(k))
772 19468 : ALLOCATE (qs_ot_env%dum(k))
773 :
774 9887 : NULLIFY (qs_ot_env%matrix_os)
775 9887 : NULLIFY (qs_ot_env%matrix_os_im)
776 9887 : NULLIFY (qs_ot_env%matrix_buf1_ortho)
777 9887 : NULLIFY (qs_ot_env%matrix_buf1_ortho_im)
778 9887 : NULLIFY (qs_ot_env%matrix_buf2_ortho)
779 9887 : NULLIFY (qs_ot_env%matrix_buf2_ortho_im)
780 9887 : NULLIFY (qs_ot_env%matrix_tmp_ortho)
781 9887 : NULLIFY (qs_ot_env%matrix_buf_nk)
782 9887 : NULLIFY (qs_ot_env%matrix_buf_nk_im)
783 9887 : NULLIFY (qs_ot_env%matrix_tmp_nk)
784 9887 : NULLIFY (qs_ot_env%matrix_p)
785 9887 : NULLIFY (qs_ot_env%matrix_p_im)
786 9887 : NULLIFY (qs_ot_env%matrix_r)
787 9887 : NULLIFY (qs_ot_env%matrix_r_im)
788 9887 : NULLIFY (qs_ot_env%matrix_sinp)
789 9887 : NULLIFY (qs_ot_env%matrix_sinp_im)
790 9887 : NULLIFY (qs_ot_env%matrix_cosp)
791 9887 : NULLIFY (qs_ot_env%matrix_cosp_im)
792 9887 : NULLIFY (qs_ot_env%matrix_sinp_b)
793 9887 : NULLIFY (qs_ot_env%matrix_cosp_b)
794 9887 : NULLIFY (qs_ot_env%matrix_buf1)
795 9887 : NULLIFY (qs_ot_env%matrix_buf1_im)
796 9887 : NULLIFY (qs_ot_env%matrix_buf2)
797 9887 : NULLIFY (qs_ot_env%matrix_buf2_im)
798 9887 : NULLIFY (qs_ot_env%matrix_buf3)
799 9887 : NULLIFY (qs_ot_env%matrix_buf3_im)
800 9887 : NULLIFY (qs_ot_env%matrix_buf4)
801 9887 : NULLIFY (qs_ot_env%matrix_buf4_im)
802 9887 : NULLIFY (qs_ot_env%matrix_c0)
803 9887 : NULLIFY (qs_ot_env%matrix_sc0)
804 9887 : NULLIFY (qs_ot_env%matrix_c0_im)
805 9887 : NULLIFY (qs_ot_env%matrix_sc0_im)
806 9887 : NULLIFY (qs_ot_env%matrix_x)
807 9887 : NULLIFY (qs_ot_env%matrix_sx)
808 9887 : NULLIFY (qs_ot_env%matrix_x_im)
809 9887 : NULLIFY (qs_ot_env%matrix_sx_im)
810 9887 : NULLIFY (qs_ot_env%matrix_gx)
811 9887 : NULLIFY (qs_ot_env%matrix_gx_im)
812 9887 : NULLIFY (qs_ot_env%matrix_preconditioned_gx)
813 9887 : NULLIFY (qs_ot_env%matrix_preconditioned_gx_im)
814 9887 : NULLIFY (qs_ot_env%matrix_response_gx)
815 9887 : NULLIFY (qs_ot_env%matrix_response_gx_im)
816 9887 : NULLIFY (qs_ot_env%matrix_mermin_g0)
817 9887 : NULLIFY (qs_ot_env%matrix_mermin_g0_im)
818 9887 : NULLIFY (qs_ot_env%matrix_ref_inv_sqrt)
819 9887 : NULLIFY (qs_ot_env%matrix_ref_inv_sqrt_im)
820 9887 : NULLIFY (qs_ot_env%fm_mermin_c0)
821 9887 : NULLIFY (qs_ot_env%fm_mermin_c0_im)
822 9887 : NULLIFY (qs_ot_env%fm_mermin_h0)
823 9887 : NULLIFY (qs_ot_env%fm_mermin_h0_im)
824 9887 : NULLIFY (qs_ot_env%fm_mermin_c_previous)
825 9887 : NULLIFY (qs_ot_env%fm_mermin_c_previous_im)
826 9887 : NULLIFY (qs_ot_env%fm_mermin_y_previous)
827 9887 : NULLIFY (qs_ot_env%fm_mermin_y_previous_im)
828 9887 : qs_ot_env%mermin_physical_ref_valid = .FALSE.
829 9887 : qs_ot_env%mermin_physical_secant_valid = .FALSE.
830 9887 : qs_ot_env%mermin_gradient_ref_valid = .FALSE.
831 9887 : NULLIFY (qs_ot_env%matrix_gx_old)
832 9887 : NULLIFY (qs_ot_env%matrix_gx_old_im)
833 9887 : NULLIFY (qs_ot_env%matrix_dx)
834 9887 : NULLIFY (qs_ot_env%matrix_dx_im)
835 9887 : NULLIFY (qs_ot_env%buf1_k_k_nosym)
836 9887 : NULLIFY (qs_ot_env%buf2_k_k_nosym)
837 9887 : NULLIFY (qs_ot_env%buf3_k_k_nosym)
838 9887 : NULLIFY (qs_ot_env%buf4_k_k_nosym)
839 9887 : NULLIFY (qs_ot_env%buf1_k_k_sym)
840 9887 : NULLIFY (qs_ot_env%buf2_k_k_sym)
841 9887 : NULLIFY (qs_ot_env%buf3_k_k_sym)
842 9887 : NULLIFY (qs_ot_env%buf4_k_k_sym)
843 9887 : NULLIFY (qs_ot_env%buf1_n_k)
844 9887 : NULLIFY (qs_ot_env%buf1_n_k_dp)
845 9887 : NULLIFY (qs_ot_env%p_k_k_sym)
846 :
847 : ! COMMON MATRICES
848 9887 : CALL dbcsr_init_p(qs_ot_env%matrix_c0)
849 : CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%matrix_c0, template=matrix_s, n=k, &
850 9887 : sym=dbcsr_type_no_symmetry)
851 :
852 9887 : CALL dbcsr_init_p(qs_ot_env%matrix_sc0)
853 : CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%matrix_sc0, template=matrix_s, n=my_ortho_k, &
854 9887 : sym=dbcsr_type_no_symmetry)
855 :
856 9887 : CALL dbcsr_init_p(qs_ot_env%matrix_x)
857 : CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%matrix_x, template=matrix_s, n=k, &
858 9887 : sym=dbcsr_type_no_symmetry)
859 :
860 9887 : CALL dbcsr_init_p(qs_ot_env%matrix_sx)
861 : CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%matrix_sx, template=matrix_s, n=k, &
862 9887 : sym=dbcsr_type_no_symmetry)
863 :
864 9887 : CALL dbcsr_init_p(qs_ot_env%matrix_gx)
865 : CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%matrix_gx, template=matrix_s, n=k, &
866 9887 : sym=dbcsr_type_no_symmetry)
867 :
868 9887 : IF (qs_ot_env%settings%occupation_preconditioner) THEN
869 108 : CALL dbcsr_init_p(qs_ot_env%matrix_preconditioned_gx)
870 : CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%matrix_preconditioned_gx, &
871 : template=matrix_s, n=k, &
872 108 : sym=dbcsr_type_no_symmetry)
873 : END IF
874 :
875 9887 : IF (qs_ot_env%use_dx) THEN
876 4219 : CALL dbcsr_init_p(qs_ot_env%matrix_dx)
877 : CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%matrix_dx, template=matrix_s, n=k, &
878 4219 : sym=dbcsr_type_no_symmetry)
879 : END IF
880 :
881 9887 : IF (qs_ot_env%use_gx_old) THEN
882 4219 : CALL dbcsr_init_p(qs_ot_env%matrix_gx_old)
883 : CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%matrix_gx_old, template=matrix_s, n=k, &
884 4219 : sym=dbcsr_type_no_symmetry)
885 : END IF
886 :
887 8580 : SELECT CASE (qs_ot_env%settings%ot_algorithm)
888 : CASE ("TOD")
889 8580 : CALL dbcsr_init_p(qs_ot_env%matrix_p)
890 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%matrix_p, template=matrix_s, m=k, n=k, &
891 8580 : sym=dbcsr_type_no_symmetry)
892 :
893 8580 : CALL dbcsr_init_p(qs_ot_env%matrix_r)
894 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%matrix_r, template=matrix_s, m=k, n=k, &
895 8580 : sym=dbcsr_type_no_symmetry)
896 :
897 8580 : CALL dbcsr_init_p(qs_ot_env%matrix_sinp)
898 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%matrix_sinp, template=matrix_s, m=k, n=k, &
899 8580 : sym=dbcsr_type_no_symmetry)
900 :
901 8580 : CALL dbcsr_init_p(qs_ot_env%matrix_cosp)
902 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%matrix_cosp, template=matrix_s, m=k, n=k, &
903 8580 : sym=dbcsr_type_no_symmetry)
904 :
905 8580 : CALL dbcsr_init_p(qs_ot_env%matrix_sinp_b)
906 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%matrix_sinp_b, template=matrix_s, m=k, n=k, &
907 8580 : sym=dbcsr_type_no_symmetry)
908 :
909 8580 : CALL dbcsr_init_p(qs_ot_env%matrix_cosp_b)
910 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%matrix_cosp_b, template=matrix_s, m=k, n=k, &
911 8580 : sym=dbcsr_type_no_symmetry)
912 :
913 8580 : CALL dbcsr_init_p(qs_ot_env%matrix_buf1)
914 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%matrix_buf1, template=matrix_s, m=k, n=k, &
915 8580 : sym=dbcsr_type_no_symmetry)
916 :
917 8580 : CALL dbcsr_init_p(qs_ot_env%matrix_buf2)
918 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%matrix_buf2, template=matrix_s, m=k, n=k, &
919 8580 : sym=dbcsr_type_no_symmetry)
920 :
921 8580 : CALL dbcsr_init_p(qs_ot_env%matrix_buf3)
922 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%matrix_buf3, template=matrix_s, m=k, n=k, &
923 8580 : sym=dbcsr_type_no_symmetry)
924 :
925 8580 : CALL dbcsr_init_p(qs_ot_env%matrix_buf4)
926 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%matrix_buf4, template=matrix_s, m=k, n=k, &
927 8580 : sym=dbcsr_type_no_symmetry)
928 :
929 8580 : CALL dbcsr_init_p(qs_ot_env%matrix_os)
930 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%matrix_os, template=matrix_s, m=my_ortho_k, n=my_ortho_k, &
931 8580 : sym=dbcsr_type_no_symmetry)
932 :
933 8580 : CALL dbcsr_init_p(qs_ot_env%matrix_buf1_ortho)
934 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%matrix_buf1_ortho, template=matrix_s, m=my_ortho_k, n=k, &
935 8580 : sym=dbcsr_type_no_symmetry)
936 :
937 8580 : CALL dbcsr_init_p(qs_ot_env%matrix_buf2_ortho)
938 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%matrix_buf2_ortho, template=matrix_s, m=my_ortho_k, n=k, &
939 8580 : sym=dbcsr_type_no_symmetry)
940 :
941 : CASE ("REF")
942 1307 : CALL dbcsr_init_p(qs_ot_env%buf1_k_k_nosym)
943 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%buf1_k_k_nosym, template=matrix_s, m=k, n=k, &
944 1307 : sym=dbcsr_type_no_symmetry)
945 :
946 1307 : CALL dbcsr_init_p(qs_ot_env%buf2_k_k_nosym)
947 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%buf2_k_k_nosym, template=matrix_s, m=k, n=k, &
948 1307 : sym=dbcsr_type_no_symmetry)
949 :
950 1307 : CALL dbcsr_init_p(qs_ot_env%buf3_k_k_nosym)
951 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%buf3_k_k_nosym, template=matrix_s, m=k, n=k, &
952 1307 : sym=dbcsr_type_no_symmetry)
953 :
954 1307 : CALL dbcsr_init_p(qs_ot_env%buf4_k_k_nosym)
955 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%buf4_k_k_nosym, template=matrix_s, m=k, n=k, &
956 1307 : sym=dbcsr_type_no_symmetry)
957 :
958 : ! It claims to be symmetric but to avoid dbcsr confusion nonsymmetric is kept
959 1307 : CALL dbcsr_init_p(qs_ot_env%buf1_k_k_sym)
960 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%buf1_k_k_sym, template=matrix_s, m=k, n=k, &
961 1307 : sym=dbcsr_type_no_symmetry)
962 :
963 1307 : CALL dbcsr_init_p(qs_ot_env%buf2_k_k_sym)
964 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%buf2_k_k_sym, template=matrix_s, m=k, n=k, &
965 1307 : sym=dbcsr_type_no_symmetry)
966 :
967 1307 : CALL dbcsr_init_p(qs_ot_env%buf3_k_k_sym)
968 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%buf3_k_k_sym, template=matrix_s, m=k, n=k, &
969 1307 : sym=dbcsr_type_no_symmetry)
970 : !
971 1307 : CALL dbcsr_init_p(qs_ot_env%buf4_k_k_sym)
972 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%buf4_k_k_sym, template=matrix_s, m=k, n=k, &
973 1307 : sym=dbcsr_type_no_symmetry)
974 : !
975 1307 : CALL dbcsr_init_p(qs_ot_env%p_k_k_sym)
976 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%p_k_k_sym, template=matrix_s, m=k, n=k, &
977 1307 : sym=dbcsr_type_no_symmetry)
978 : !
979 1307 : CALL dbcsr_init_p(qs_ot_env%buf1_n_k)
980 : CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%buf1_n_k, template=matrix_s, n=k, &
981 1307 : sym=dbcsr_type_no_symmetry)
982 : !
983 1307 : CALL dbcsr_init_p(qs_ot_env%matrix_buf1)
984 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%matrix_buf1, template=matrix_s, m=k, n=k, &
985 11194 : sym=dbcsr_type_no_symmetry)
986 :
987 : END SELECT
988 :
989 : IF (qs_ot_env%settings%ot_method == "DIIS" .OR. &
990 9887 : qs_ot_env%settings%ot_method == "BROY" .OR. &
991 : qs_ot_env%settings%ot_method == "LBFG") THEN
992 5768 : NULLIFY (qs_ot_env%matrix_h_e)
993 5768 : NULLIFY (qs_ot_env%matrix_h_x)
994 5768 : NULLIFY (qs_ot_env%matrix_h_e_im)
995 5768 : NULLIFY (qs_ot_env%matrix_h_x_im)
996 5768 : ncoef = m_diis
997 5768 : IF (qs_ot_env%settings%ot_method == "LBFG") ncoef = m_diis + 1
998 5768 : CALL dbcsr_allocate_matrix_set(qs_ot_env%matrix_h_e, ncoef)
999 5768 : CALL dbcsr_allocate_matrix_set(qs_ot_env%matrix_h_x, ncoef)
1000 45976 : DO i = 1, ncoef
1001 40208 : CALL dbcsr_init_p(qs_ot_env%matrix_h_x(i)%matrix)
1002 : CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%matrix_h_x(i)%matrix, template=matrix_s, n=k, &
1003 40208 : sym=dbcsr_type_no_symmetry)
1004 :
1005 40208 : CALL dbcsr_init_p(qs_ot_env%matrix_h_e(i)%matrix)
1006 : CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%matrix_h_e(i)%matrix, template=matrix_s, n=k, &
1007 50095 : sym=dbcsr_type_no_symmetry)
1008 : END DO
1009 : END IF
1010 :
1011 9887 : NULLIFY (qs_ot_env%rot_mat_u, qs_ot_env%rot_mat_u_im, &
1012 9887 : qs_ot_env%rot_mat_x, qs_ot_env%rot_mat_x_im, &
1013 9887 : qs_ot_env%rot_mat_h_e, qs_ot_env%rot_mat_h_x, &
1014 9887 : qs_ot_env%rot_mat_h_e_im, qs_ot_env%rot_mat_h_x_im, qs_ot_env%rot_mat_gx, &
1015 9887 : qs_ot_env%rot_mat_gx_im, qs_ot_env%rot_mat_response_gx, &
1016 9887 : qs_ot_env%rot_mat_response_gx_im, qs_ot_env%rot_mat_mermin_g0, &
1017 9887 : qs_ot_env%rot_mat_mermin_g0_im, qs_ot_env%rot_mat_gx_old, &
1018 9887 : qs_ot_env%rot_mat_gx_old_im, qs_ot_env%rot_mat_dx, qs_ot_env%rot_mat_dx_im, &
1019 9887 : qs_ot_env%rot_mat_evals, qs_ot_env%rot_mat_dedu, qs_ot_env%rot_mat_dedu_im, &
1020 9887 : qs_ot_env%rot_mat_chc, qs_ot_env%rot_mat_chc_im, &
1021 9887 : qs_ot_env%rot_mat_evec_re, qs_ot_env%rot_mat_evec_im)
1022 :
1023 9887 : IF (qs_ot_env%settings%do_rotation) THEN
1024 392 : CALL dbcsr_init_p(qs_ot_env%rot_mat_u)
1025 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_u, template=matrix_s, m=k, n=k, &
1026 392 : sym=dbcsr_type_no_symmetry)
1027 :
1028 392 : CALL dbcsr_init_p(qs_ot_env%rot_mat_x)
1029 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_x, template=matrix_s, m=k, n=k, &
1030 392 : sym=dbcsr_type_no_symmetry)
1031 :
1032 392 : CALL dbcsr_init_p(qs_ot_env%rot_mat_dedu)
1033 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_dedu, template=matrix_s, m=k, n=k, &
1034 392 : sym=dbcsr_type_no_symmetry)
1035 :
1036 392 : CALL dbcsr_init_p(qs_ot_env%rot_mat_chc)
1037 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_chc, template=matrix_s, m=k, n=k, &
1038 392 : sym=dbcsr_type_no_symmetry)
1039 :
1040 : IF (qs_ot_env%settings%ot_method == "DIIS" .OR. &
1041 392 : qs_ot_env%settings%ot_method == "BROY" .OR. &
1042 : qs_ot_env%settings%ot_method == "LBFG") THEN
1043 140 : ncoef = m_diis
1044 140 : IF (qs_ot_env%settings%ot_method == "LBFG") ncoef = m_diis + 1
1045 140 : CALL dbcsr_allocate_matrix_set(qs_ot_env%rot_mat_h_e, ncoef)
1046 140 : CALL dbcsr_allocate_matrix_set(qs_ot_env%rot_mat_h_x, ncoef)
1047 1070 : DO i = 1, ncoef
1048 930 : CALL dbcsr_init_p(qs_ot_env%rot_mat_h_e(i)%matrix)
1049 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_h_e(i)%matrix, template=matrix_s, m=k, n=k, &
1050 930 : sym=dbcsr_type_no_symmetry)
1051 :
1052 930 : CALL dbcsr_init_p(qs_ot_env%rot_mat_h_x(i)%matrix)
1053 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_h_x(i)%matrix, template=matrix_s, m=k, n=k, &
1054 1322 : sym=dbcsr_type_no_symmetry)
1055 : END DO
1056 : END IF
1057 :
1058 1172 : ALLOCATE (qs_ot_env%rot_mat_evals(k))
1059 392 : CALL dbcsr_init_p(qs_ot_env%rot_mat_evec_re)
1060 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_evec_re, template=matrix_s, m=k, n=k, &
1061 392 : sym=dbcsr_type_no_symmetry)
1062 392 : CALL dbcsr_init_p(qs_ot_env%rot_mat_evec_im)
1063 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_evec_im, template=matrix_s, m=k, n=k, &
1064 392 : sym=dbcsr_type_no_symmetry)
1065 :
1066 392 : CALL dbcsr_init_p(qs_ot_env%rot_mat_gx)
1067 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_gx, template=matrix_s, m=k, n=k, &
1068 392 : sym=dbcsr_type_no_symmetry)
1069 :
1070 392 : IF (qs_ot_env%settings%occupation_preconditioner) THEN
1071 108 : CALL dbcsr_init_p(qs_ot_env%rot_mat_response_gx)
1072 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_response_gx, &
1073 : template=matrix_s, m=k, n=k, &
1074 108 : sym=dbcsr_type_no_symmetry)
1075 : END IF
1076 :
1077 392 : IF (qs_ot_env%use_gx_old) THEN
1078 306 : CALL dbcsr_init_p(qs_ot_env%rot_mat_gx_old)
1079 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_gx_old, template=matrix_s, m=k, n=k, &
1080 306 : sym=dbcsr_type_no_symmetry)
1081 : END IF
1082 :
1083 392 : IF (qs_ot_env%use_dx) THEN
1084 306 : CALL dbcsr_init_p(qs_ot_env%rot_mat_dx)
1085 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_dx, template=matrix_s, m=k, n=k, &
1086 306 : sym=dbcsr_type_no_symmetry)
1087 : END IF
1088 :
1089 : END IF
1090 :
1091 9887 : IF (qs_ot_env%settings%do_ener) THEN
1092 : ncoef = my_energy_dimension
1093 336 : ALLOCATE (qs_ot_env%ener_x(ncoef))
1094 224 : ALLOCATE (qs_ot_env%ener_rayleigh(ncoef))
1095 :
1096 : IF (qs_ot_env%settings%ot_method == "DIIS" .OR. &
1097 112 : qs_ot_env%settings%ot_method == "BROY" .OR. &
1098 : qs_ot_env%settings%ot_method == "LBFG") THEN
1099 56 : nhistory = m_diis
1100 56 : IF (qs_ot_env%settings%ot_method == "LBFG") nhistory = m_diis + 1
1101 224 : ALLOCATE (qs_ot_env%ener_h_e(nhistory, ncoef))
1102 168 : ALLOCATE (qs_ot_env%ener_h_x(nhistory, ncoef))
1103 3876 : qs_ot_env%ener_h_e = 0.0_dp
1104 3876 : qs_ot_env%ener_h_x = 0.0_dp
1105 : END IF
1106 :
1107 224 : ALLOCATE (qs_ot_env%ener_gx(ncoef))
1108 112 : IF (qs_ot_env%settings%occupation_preconditioner) THEN
1109 216 : ALLOCATE (qs_ot_env%ener_preconditioned_gx(ncoef))
1110 216 : ALLOCATE (qs_ot_env%ener_response_gx(ncoef))
1111 : END IF
1112 :
1113 112 : IF (qs_ot_env%use_gx_old) THEN
1114 128 : ALLOCATE (qs_ot_env%ener_gx_old(ncoef))
1115 : END IF
1116 :
1117 112 : IF (qs_ot_env%use_dx) THEN
1118 128 : ALLOCATE (qs_ot_env%ener_dx(ncoef))
1119 528 : qs_ot_env%ener_dx = 0.0_dp
1120 : END IF
1121 : END IF
1122 :
1123 9887 : qs_ot_env%state_allocated = .TRUE.
1124 :
1125 9887 : END SUBROUTINE qs_ot_allocate
1126 :
1127 : ! **************************************************************************************************
1128 : !> \brief ...
1129 : !> \param qs_ot_env ...
1130 : !> \param matrix_s ...
1131 : ! **************************************************************************************************
1132 1047 : SUBROUTINE qs_ot_allocate_complex_state(qs_ot_env, matrix_s)
1133 : TYPE(qs_ot_type) :: qs_ot_env
1134 : TYPE(dbcsr_type), POINTER :: matrix_s
1135 :
1136 : INTEGER :: i, ncoef, nmo, nmo_ortho
1137 :
1138 349 : CPASSERT(qs_ot_env%state_allocated)
1139 349 : CPASSERT(.NOT. qs_ot_env%has_complex_kpoint_state)
1140 349 : CPASSERT(ASSOCIATED(matrix_s))
1141 :
1142 349 : CALL dbcsr_get_info(qs_ot_env%matrix_c0, nfullcols_total=nmo)
1143 349 : CALL dbcsr_get_info(qs_ot_env%matrix_sc0, nfullcols_total=nmo_ortho)
1144 :
1145 349 : CALL dbcsr_init_p(qs_ot_env%matrix_c0_im)
1146 : CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%matrix_c0_im, template=matrix_s, n=nmo, &
1147 349 : sym=dbcsr_type_no_symmetry)
1148 349 : CALL dbcsr_init_p(qs_ot_env%matrix_sc0_im)
1149 : CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%matrix_sc0_im, template=matrix_s, n=nmo_ortho, &
1150 349 : sym=dbcsr_type_no_symmetry)
1151 349 : CALL dbcsr_init_p(qs_ot_env%matrix_x_im)
1152 : CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%matrix_x_im, template=matrix_s, n=nmo, &
1153 349 : sym=dbcsr_type_no_symmetry)
1154 349 : CALL dbcsr_init_p(qs_ot_env%matrix_sx_im)
1155 : CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%matrix_sx_im, template=matrix_s, n=nmo, &
1156 349 : sym=dbcsr_type_no_symmetry)
1157 349 : CALL dbcsr_init_p(qs_ot_env%matrix_gx_im)
1158 : CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%matrix_gx_im, template=matrix_s, n=nmo, &
1159 349 : sym=dbcsr_type_no_symmetry)
1160 349 : IF (qs_ot_env%settings%occupation_preconditioner) THEN
1161 108 : CALL dbcsr_init_p(qs_ot_env%matrix_preconditioned_gx_im)
1162 : CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%matrix_preconditioned_gx_im, &
1163 : template=matrix_s, n=nmo, &
1164 108 : sym=dbcsr_type_no_symmetry)
1165 108 : IF (qs_ot_env%use_dx) THEN
1166 60 : CALL dbcsr_init_p(qs_ot_env%matrix_response_gx)
1167 : CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%matrix_response_gx, &
1168 : template=matrix_s, n=nmo, &
1169 60 : sym=dbcsr_type_no_symmetry)
1170 60 : CALL dbcsr_init_p(qs_ot_env%matrix_response_gx_im)
1171 : CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%matrix_response_gx_im, &
1172 : template=matrix_s, n=nmo, &
1173 60 : sym=dbcsr_type_no_symmetry)
1174 60 : CALL dbcsr_init_p(qs_ot_env%matrix_mermin_g0)
1175 : CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%matrix_mermin_g0, &
1176 : template=matrix_s, n=nmo, &
1177 60 : sym=dbcsr_type_no_symmetry)
1178 60 : CALL dbcsr_init_p(qs_ot_env%matrix_mermin_g0_im)
1179 : CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%matrix_mermin_g0_im, &
1180 : template=matrix_s, n=nmo, &
1181 60 : sym=dbcsr_type_no_symmetry)
1182 60 : IF (qs_ot_env%settings%do_ener) THEN
1183 60 : CPASSERT(ASSOCIATED(qs_ot_env%ener_x))
1184 180 : ALLOCATE (qs_ot_env%ener_mermin_g0(SIZE(qs_ot_env%ener_x)))
1185 : END IF
1186 : END IF
1187 : END IF
1188 150 : SELECT CASE (qs_ot_env%settings%ot_algorithm)
1189 : CASE ("TOD")
1190 150 : CPASSERT(nmo_ortho == nmo)
1191 150 : CALL allocate_complex_copy(qs_ot_env%matrix_p_im, qs_ot_env%matrix_p, "matrix_p_im")
1192 150 : CALL allocate_complex_copy(qs_ot_env%matrix_r_im, qs_ot_env%matrix_r, "matrix_r_im")
1193 150 : CALL allocate_complex_copy(qs_ot_env%matrix_sinp_im, qs_ot_env%matrix_sinp, "matrix_sinp_im")
1194 150 : CALL allocate_complex_copy(qs_ot_env%matrix_cosp_im, qs_ot_env%matrix_cosp, "matrix_cosp_im")
1195 150 : CALL allocate_complex_copy(qs_ot_env%matrix_buf1_im, qs_ot_env%matrix_buf1, "matrix_buf1_im")
1196 150 : CALL allocate_complex_copy(qs_ot_env%matrix_buf2_im, qs_ot_env%matrix_buf2, "matrix_buf2_im")
1197 150 : CALL allocate_complex_copy(qs_ot_env%matrix_buf3_im, qs_ot_env%matrix_buf3, "matrix_buf3_im")
1198 150 : CALL allocate_complex_copy(qs_ot_env%matrix_buf4_im, qs_ot_env%matrix_buf4, "matrix_buf4_im")
1199 150 : 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 150 : "matrix_buf1_ortho_im")
1202 : CALL allocate_complex_copy(qs_ot_env%matrix_buf2_ortho_im, qs_ot_env%matrix_buf2_ortho, &
1203 150 : "matrix_buf2_ortho_im")
1204 : CALL allocate_complex_copy(qs_ot_env%matrix_tmp_ortho, qs_ot_env%matrix_buf1_ortho, &
1205 150 : "matrix_tmp_ortho")
1206 150 : CALL allocate_complex_copy(qs_ot_env%matrix_buf_nk, qs_ot_env%matrix_x, "matrix_buf_nk")
1207 150 : CALL allocate_complex_copy(qs_ot_env%matrix_buf_nk_im, qs_ot_env%matrix_x, "matrix_buf_nk_im")
1208 150 : CALL allocate_complex_copy(qs_ot_env%matrix_tmp_nk, qs_ot_env%matrix_x, "matrix_tmp_nk")
1209 : CASE ("REF")
1210 199 : CALL dbcsr_init_p(qs_ot_env%matrix_ref_inv_sqrt)
1211 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%matrix_ref_inv_sqrt, template=matrix_s, m=nmo, n=nmo, &
1212 199 : sym=dbcsr_type_no_symmetry)
1213 199 : CALL dbcsr_init_p(qs_ot_env%matrix_ref_inv_sqrt_im)
1214 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%matrix_ref_inv_sqrt_im, template=matrix_s, m=nmo, n=nmo, &
1215 199 : sym=dbcsr_type_no_symmetry)
1216 199 : CALL dbcsr_init_p(qs_ot_env%buf1_n_k_dp)
1217 : CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%buf1_n_k_dp, template=matrix_s, n=nmo, &
1218 199 : sym=dbcsr_type_no_symmetry)
1219 : CASE DEFAULT
1220 349 : CPABORT("Complex K-point OT state requires ALGORITHM STRICT or IRAC")
1221 : END SELECT
1222 349 : IF (qs_ot_env%use_dx) THEN
1223 214 : CALL dbcsr_init_p(qs_ot_env%matrix_dx_im)
1224 : CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%matrix_dx_im, template=matrix_s, n=nmo, &
1225 214 : sym=dbcsr_type_no_symmetry)
1226 : END IF
1227 349 : IF (qs_ot_env%use_gx_old) THEN
1228 214 : CALL dbcsr_init_p(qs_ot_env%matrix_gx_old_im)
1229 : CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%matrix_gx_old_im, template=matrix_s, n=nmo, &
1230 214 : sym=dbcsr_type_no_symmetry)
1231 : END IF
1232 : IF (qs_ot_env%settings%ot_method == "DIIS" .OR. &
1233 349 : qs_ot_env%settings%ot_method == "BROY" .OR. &
1234 : qs_ot_env%settings%ot_method == "LBFG") THEN
1235 233 : ncoef = qs_ot_env%settings%diis_m
1236 233 : IF (qs_ot_env%settings%ot_method == "LBFG") ncoef = ncoef + 1
1237 233 : CALL dbcsr_allocate_matrix_set(qs_ot_env%matrix_h_e_im, ncoef)
1238 233 : CALL dbcsr_allocate_matrix_set(qs_ot_env%matrix_h_x_im, ncoef)
1239 1746 : DO i = 1, ncoef
1240 1513 : CALL dbcsr_init_p(qs_ot_env%matrix_h_e_im(i)%matrix)
1241 : CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%matrix_h_e_im(i)%matrix, &
1242 : template=matrix_s, n=nmo, &
1243 1513 : sym=dbcsr_type_no_symmetry)
1244 1513 : CALL dbcsr_init_p(qs_ot_env%matrix_h_x_im(i)%matrix)
1245 : CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%matrix_h_x_im(i)%matrix, &
1246 : template=matrix_s, n=nmo, &
1247 1862 : sym=dbcsr_type_no_symmetry)
1248 : END DO
1249 : END IF
1250 :
1251 349 : IF (qs_ot_env%settings%do_rotation) THEN
1252 168 : CALL dbcsr_init_p(qs_ot_env%rot_mat_u_im)
1253 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_u_im, template=matrix_s, m=nmo, n=nmo, &
1254 168 : sym=dbcsr_type_no_symmetry)
1255 168 : CALL dbcsr_init_p(qs_ot_env%rot_mat_x_im)
1256 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_x_im, template=matrix_s, m=nmo, n=nmo, &
1257 168 : sym=dbcsr_type_no_symmetry)
1258 168 : CALL dbcsr_init_p(qs_ot_env%rot_mat_dedu_im)
1259 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_dedu_im, template=matrix_s, m=nmo, n=nmo, &
1260 168 : sym=dbcsr_type_no_symmetry)
1261 168 : CALL dbcsr_init_p(qs_ot_env%rot_mat_chc_im)
1262 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_chc_im, template=matrix_s, m=nmo, n=nmo, &
1263 168 : sym=dbcsr_type_no_symmetry)
1264 168 : CALL dbcsr_init_p(qs_ot_env%rot_mat_gx_im)
1265 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_gx_im, template=matrix_s, m=nmo, n=nmo, &
1266 168 : sym=dbcsr_type_no_symmetry)
1267 168 : IF (qs_ot_env%settings%occupation_preconditioner) THEN
1268 108 : CALL dbcsr_init_p(qs_ot_env%rot_mat_response_gx_im)
1269 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_response_gx_im, &
1270 : template=matrix_s, m=nmo, n=nmo, &
1271 108 : sym=dbcsr_type_no_symmetry)
1272 108 : IF (qs_ot_env%use_dx) THEN
1273 60 : CALL dbcsr_init_p(qs_ot_env%rot_mat_mermin_g0)
1274 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_mermin_g0, &
1275 : template=matrix_s, m=nmo, n=nmo, &
1276 60 : sym=dbcsr_type_no_symmetry)
1277 60 : CALL dbcsr_init_p(qs_ot_env%rot_mat_mermin_g0_im)
1278 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_mermin_g0_im, &
1279 : template=matrix_s, m=nmo, n=nmo, &
1280 60 : sym=dbcsr_type_no_symmetry)
1281 : END IF
1282 : END IF
1283 168 : IF (qs_ot_env%use_dx) THEN
1284 112 : CALL dbcsr_init_p(qs_ot_env%rot_mat_dx_im)
1285 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_dx_im, template=matrix_s, m=nmo, n=nmo, &
1286 112 : sym=dbcsr_type_no_symmetry)
1287 : END IF
1288 168 : IF (qs_ot_env%use_gx_old) THEN
1289 112 : CALL dbcsr_init_p(qs_ot_env%rot_mat_gx_old_im)
1290 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_gx_old_im, template=matrix_s, m=nmo, n=nmo, &
1291 112 : sym=dbcsr_type_no_symmetry)
1292 : END IF
1293 : IF (qs_ot_env%settings%ot_method == "DIIS" .OR. &
1294 168 : qs_ot_env%settings%ot_method == "BROY" .OR. &
1295 : qs_ot_env%settings%ot_method == "LBFG") THEN
1296 106 : ncoef = qs_ot_env%settings%diis_m
1297 106 : IF (qs_ot_env%settings%ot_method == "LBFG") ncoef = ncoef + 1
1298 106 : CALL dbcsr_allocate_matrix_set(qs_ot_env%rot_mat_h_e_im, ncoef)
1299 106 : CALL dbcsr_allocate_matrix_set(qs_ot_env%rot_mat_h_x_im, ncoef)
1300 794 : DO i = 1, ncoef
1301 688 : CALL dbcsr_init_p(qs_ot_env%rot_mat_h_e_im(i)%matrix)
1302 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_h_e_im(i)%matrix, &
1303 : template=matrix_s, m=nmo, n=nmo, &
1304 688 : sym=dbcsr_type_no_symmetry)
1305 688 : CALL dbcsr_init_p(qs_ot_env%rot_mat_h_x_im(i)%matrix)
1306 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_h_x_im(i)%matrix, &
1307 : template=matrix_s, m=nmo, n=nmo, &
1308 856 : sym=dbcsr_type_no_symmetry)
1309 : END DO
1310 : END IF
1311 : END IF
1312 :
1313 349 : qs_ot_env%has_complex_kpoint_state = .TRUE.
1314 :
1315 : CONTAINS
1316 :
1317 : ! **************************************************************************************************
1318 : !> \brief allocate a zeroed matrix with the distribution and sparsity of a real companion
1319 : !> \param matrix output matrix
1320 : !> \param template real companion matrix
1321 : !> \param name DBCSR matrix name
1322 : ! **************************************************************************************************
1323 2250 : SUBROUTINE allocate_complex_copy(matrix, template, name)
1324 : TYPE(dbcsr_type), POINTER :: matrix, template
1325 : CHARACTER(LEN=*), INTENT(IN) :: name
1326 :
1327 2250 : CALL dbcsr_init_p(matrix)
1328 2250 : CALL dbcsr_copy(matrix, template, name=name)
1329 2250 : CALL dbcsr_set(matrix, 0.0_dp)
1330 2250 : END SUBROUTINE allocate_complex_copy
1331 :
1332 : END SUBROUTINE qs_ot_allocate_complex_state
1333 :
1334 : ! **************************************************************************************************
1335 : !> \brief deallocates data
1336 : !> \param qs_ot_env ...
1337 : ! **************************************************************************************************
1338 9933 : SUBROUTINE qs_ot_destroy(qs_ot_env)
1339 : TYPE(qs_ot_type) :: qs_ot_env
1340 :
1341 9933 : IF (.NOT. qs_ot_env%state_allocated) RETURN
1342 :
1343 9887 : CALL mp_para_env_release(qs_ot_env%para_env)
1344 9887 : CALL cp_blacs_env_release(qs_ot_env%blacs_env)
1345 :
1346 9887 : IF (ASSOCIATED(qs_ot_env%evals)) DEALLOCATE (qs_ot_env%evals)
1347 9887 : IF (ASSOCIATED(qs_ot_env%dum)) DEALLOCATE (qs_ot_env%dum)
1348 :
1349 9887 : IF (ASSOCIATED(qs_ot_env%matrix_os)) CALL dbcsr_release_p(qs_ot_env%matrix_os)
1350 9887 : IF (ASSOCIATED(qs_ot_env%matrix_os_im)) CALL dbcsr_release_p(qs_ot_env%matrix_os_im)
1351 9887 : IF (ASSOCIATED(qs_ot_env%matrix_p)) CALL dbcsr_release_p(qs_ot_env%matrix_p)
1352 9887 : IF (ASSOCIATED(qs_ot_env%matrix_p_im)) CALL dbcsr_release_p(qs_ot_env%matrix_p_im)
1353 9887 : IF (ASSOCIATED(qs_ot_env%matrix_cosp)) CALL dbcsr_release_p(qs_ot_env%matrix_cosp)
1354 9887 : IF (ASSOCIATED(qs_ot_env%matrix_cosp_im)) CALL dbcsr_release_p(qs_ot_env%matrix_cosp_im)
1355 9887 : IF (ASSOCIATED(qs_ot_env%matrix_sinp)) CALL dbcsr_release_p(qs_ot_env%matrix_sinp)
1356 9887 : IF (ASSOCIATED(qs_ot_env%matrix_sinp_im)) CALL dbcsr_release_p(qs_ot_env%matrix_sinp_im)
1357 9887 : IF (ASSOCIATED(qs_ot_env%matrix_r)) CALL dbcsr_release_p(qs_ot_env%matrix_r)
1358 9887 : IF (ASSOCIATED(qs_ot_env%matrix_r_im)) CALL dbcsr_release_p(qs_ot_env%matrix_r_im)
1359 9887 : IF (ASSOCIATED(qs_ot_env%matrix_cosp_b)) CALL dbcsr_release_p(qs_ot_env%matrix_cosp_b)
1360 9887 : IF (ASSOCIATED(qs_ot_env%matrix_sinp_b)) CALL dbcsr_release_p(qs_ot_env%matrix_sinp_b)
1361 9887 : IF (ASSOCIATED(qs_ot_env%matrix_buf1)) CALL dbcsr_release_p(qs_ot_env%matrix_buf1)
1362 9887 : IF (ASSOCIATED(qs_ot_env%matrix_buf1_im)) CALL dbcsr_release_p(qs_ot_env%matrix_buf1_im)
1363 9887 : IF (ASSOCIATED(qs_ot_env%matrix_buf2)) CALL dbcsr_release_p(qs_ot_env%matrix_buf2)
1364 9887 : IF (ASSOCIATED(qs_ot_env%matrix_buf2_im)) CALL dbcsr_release_p(qs_ot_env%matrix_buf2_im)
1365 9887 : IF (ASSOCIATED(qs_ot_env%matrix_buf3)) CALL dbcsr_release_p(qs_ot_env%matrix_buf3)
1366 9887 : IF (ASSOCIATED(qs_ot_env%matrix_buf3_im)) CALL dbcsr_release_p(qs_ot_env%matrix_buf3_im)
1367 9887 : IF (ASSOCIATED(qs_ot_env%matrix_buf4)) CALL dbcsr_release_p(qs_ot_env%matrix_buf4)
1368 9887 : IF (ASSOCIATED(qs_ot_env%matrix_buf4_im)) CALL dbcsr_release_p(qs_ot_env%matrix_buf4_im)
1369 9887 : IF (ASSOCIATED(qs_ot_env%matrix_buf1_ortho)) CALL dbcsr_release_p(qs_ot_env%matrix_buf1_ortho)
1370 9887 : IF (ASSOCIATED(qs_ot_env%matrix_buf1_ortho_im)) CALL dbcsr_release_p(qs_ot_env%matrix_buf1_ortho_im)
1371 9887 : IF (ASSOCIATED(qs_ot_env%matrix_buf2_ortho)) CALL dbcsr_release_p(qs_ot_env%matrix_buf2_ortho)
1372 9887 : IF (ASSOCIATED(qs_ot_env%matrix_buf2_ortho_im)) CALL dbcsr_release_p(qs_ot_env%matrix_buf2_ortho_im)
1373 9887 : IF (ASSOCIATED(qs_ot_env%matrix_tmp_ortho)) CALL dbcsr_release_p(qs_ot_env%matrix_tmp_ortho)
1374 9887 : IF (ASSOCIATED(qs_ot_env%matrix_buf_nk)) CALL dbcsr_release_p(qs_ot_env%matrix_buf_nk)
1375 9887 : IF (ASSOCIATED(qs_ot_env%matrix_buf_nk_im)) CALL dbcsr_release_p(qs_ot_env%matrix_buf_nk_im)
1376 9887 : IF (ASSOCIATED(qs_ot_env%matrix_tmp_nk)) CALL dbcsr_release_p(qs_ot_env%matrix_tmp_nk)
1377 9887 : IF (ASSOCIATED(qs_ot_env%matrix_c0)) CALL dbcsr_release_p(qs_ot_env%matrix_c0)
1378 9887 : IF (ASSOCIATED(qs_ot_env%matrix_sc0)) CALL dbcsr_release_p(qs_ot_env%matrix_sc0)
1379 9887 : IF (ASSOCIATED(qs_ot_env%matrix_psc0)) CALL dbcsr_release_p(qs_ot_env%matrix_psc0)
1380 9887 : IF (ASSOCIATED(qs_ot_env%matrix_psc0_im)) CALL dbcsr_release_p(qs_ot_env%matrix_psc0_im)
1381 9887 : IF (ASSOCIATED(qs_ot_env%matrix_c0_im)) CALL dbcsr_release_p(qs_ot_env%matrix_c0_im)
1382 9887 : IF (ASSOCIATED(qs_ot_env%matrix_sc0_im)) CALL dbcsr_release_p(qs_ot_env%matrix_sc0_im)
1383 9887 : IF (ASSOCIATED(qs_ot_env%matrix_x)) CALL dbcsr_release_p(qs_ot_env%matrix_x)
1384 9887 : IF (ASSOCIATED(qs_ot_env%matrix_sx)) CALL dbcsr_release_p(qs_ot_env%matrix_sx)
1385 9887 : IF (ASSOCIATED(qs_ot_env%matrix_x_im)) CALL dbcsr_release_p(qs_ot_env%matrix_x_im)
1386 9887 : IF (ASSOCIATED(qs_ot_env%matrix_sx_im)) CALL dbcsr_release_p(qs_ot_env%matrix_sx_im)
1387 9887 : IF (ASSOCIATED(qs_ot_env%matrix_gx)) CALL dbcsr_release_p(qs_ot_env%matrix_gx)
1388 9887 : IF (ASSOCIATED(qs_ot_env%matrix_gx_im)) CALL dbcsr_release_p(qs_ot_env%matrix_gx_im)
1389 9887 : IF (ASSOCIATED(qs_ot_env%matrix_preconditioned_gx)) THEN
1390 108 : CALL dbcsr_release_p(qs_ot_env%matrix_preconditioned_gx)
1391 : END IF
1392 9887 : IF (ASSOCIATED(qs_ot_env%matrix_preconditioned_gx_im)) THEN
1393 108 : CALL dbcsr_release_p(qs_ot_env%matrix_preconditioned_gx_im)
1394 : END IF
1395 9887 : IF (ASSOCIATED(qs_ot_env%matrix_response_gx)) CALL dbcsr_release_p(qs_ot_env%matrix_response_gx)
1396 9887 : IF (ASSOCIATED(qs_ot_env%matrix_response_gx_im)) THEN
1397 60 : CALL dbcsr_release_p(qs_ot_env%matrix_response_gx_im)
1398 : END IF
1399 9887 : IF (ASSOCIATED(qs_ot_env%matrix_mermin_g0)) CALL dbcsr_release_p(qs_ot_env%matrix_mermin_g0)
1400 9887 : IF (ASSOCIATED(qs_ot_env%matrix_mermin_g0_im)) THEN
1401 60 : CALL dbcsr_release_p(qs_ot_env%matrix_mermin_g0_im)
1402 : END IF
1403 9887 : IF (ASSOCIATED(qs_ot_env%matrix_ref_inv_sqrt)) CALL dbcsr_release_p(qs_ot_env%matrix_ref_inv_sqrt)
1404 9887 : IF (ASSOCIATED(qs_ot_env%matrix_ref_inv_sqrt_im)) CALL dbcsr_release_p(qs_ot_env%matrix_ref_inv_sqrt_im)
1405 9887 : IF (ASSOCIATED(qs_ot_env%fm_mermin_c0)) THEN
1406 100 : CALL cp_fm_release(qs_ot_env%fm_mermin_c0)
1407 100 : DEALLOCATE (qs_ot_env%fm_mermin_c0)
1408 : END IF
1409 9887 : IF (ASSOCIATED(qs_ot_env%fm_mermin_c0_im)) THEN
1410 100 : CALL cp_fm_release(qs_ot_env%fm_mermin_c0_im)
1411 100 : DEALLOCATE (qs_ot_env%fm_mermin_c0_im)
1412 : END IF
1413 9887 : IF (ASSOCIATED(qs_ot_env%fm_mermin_h0)) THEN
1414 100 : CALL cp_fm_release(qs_ot_env%fm_mermin_h0)
1415 100 : DEALLOCATE (qs_ot_env%fm_mermin_h0)
1416 : END IF
1417 9887 : IF (ASSOCIATED(qs_ot_env%fm_mermin_h0_im)) THEN
1418 100 : CALL cp_fm_release(qs_ot_env%fm_mermin_h0_im)
1419 100 : DEALLOCATE (qs_ot_env%fm_mermin_h0_im)
1420 : END IF
1421 9887 : IF (ASSOCIATED(qs_ot_env%fm_mermin_c_previous)) THEN
1422 88 : CALL cp_fm_release(qs_ot_env%fm_mermin_c_previous)
1423 88 : DEALLOCATE (qs_ot_env%fm_mermin_c_previous)
1424 : END IF
1425 9887 : IF (ASSOCIATED(qs_ot_env%fm_mermin_c_previous_im)) THEN
1426 88 : CALL cp_fm_release(qs_ot_env%fm_mermin_c_previous_im)
1427 88 : DEALLOCATE (qs_ot_env%fm_mermin_c_previous_im)
1428 : END IF
1429 9887 : IF (ASSOCIATED(qs_ot_env%fm_mermin_y_previous)) THEN
1430 88 : CALL cp_fm_release(qs_ot_env%fm_mermin_y_previous)
1431 88 : DEALLOCATE (qs_ot_env%fm_mermin_y_previous)
1432 : END IF
1433 9887 : IF (ASSOCIATED(qs_ot_env%fm_mermin_y_previous_im)) THEN
1434 88 : CALL cp_fm_release(qs_ot_env%fm_mermin_y_previous_im)
1435 88 : DEALLOCATE (qs_ot_env%fm_mermin_y_previous_im)
1436 : END IF
1437 9887 : IF (ALLOCATED(qs_ot_env%mermin_occupation0)) DEALLOCATE (qs_ot_env%mermin_occupation0)
1438 9887 : IF (ALLOCATED(qs_ot_env%mermin_occupation_previous)) THEN
1439 88 : DEALLOCATE (qs_ot_env%mermin_occupation_previous)
1440 : END IF
1441 9887 : IF (ALLOCATED(qs_ot_env%ener_mermin_g0)) DEALLOCATE (qs_ot_env%ener_mermin_g0)
1442 9887 : qs_ot_env%mermin_physical_ref_valid = .FALSE.
1443 9887 : qs_ot_env%mermin_physical_secant_valid = .FALSE.
1444 9887 : qs_ot_env%mermin_gradient_ref_valid = .FALSE.
1445 9887 : IF (ASSOCIATED(qs_ot_env%matrix_dx)) CALL dbcsr_release_p(qs_ot_env%matrix_dx)
1446 9887 : IF (ASSOCIATED(qs_ot_env%matrix_dx_im)) CALL dbcsr_release_p(qs_ot_env%matrix_dx_im)
1447 9887 : IF (ASSOCIATED(qs_ot_env%matrix_gx_old)) CALL dbcsr_release_p(qs_ot_env%matrix_gx_old)
1448 9887 : IF (ASSOCIATED(qs_ot_env%matrix_gx_old_im)) CALL dbcsr_release_p(qs_ot_env%matrix_gx_old_im)
1449 9887 : IF (ASSOCIATED(qs_ot_env%buf1_k_k_nosym)) CALL dbcsr_release_p(qs_ot_env%buf1_k_k_nosym)
1450 9887 : IF (ASSOCIATED(qs_ot_env%buf2_k_k_nosym)) CALL dbcsr_release_p(qs_ot_env%buf2_k_k_nosym)
1451 9887 : IF (ASSOCIATED(qs_ot_env%buf3_k_k_nosym)) CALL dbcsr_release_p(qs_ot_env%buf3_k_k_nosym)
1452 9887 : IF (ASSOCIATED(qs_ot_env%buf4_k_k_nosym)) CALL dbcsr_release_p(qs_ot_env%buf4_k_k_nosym)
1453 9887 : IF (ASSOCIATED(qs_ot_env%p_k_k_sym)) CALL dbcsr_release_p(qs_ot_env%p_k_k_sym)
1454 9887 : IF (ASSOCIATED(qs_ot_env%buf1_k_k_sym)) CALL dbcsr_release_p(qs_ot_env%buf1_k_k_sym)
1455 9887 : IF (ASSOCIATED(qs_ot_env%buf2_k_k_sym)) CALL dbcsr_release_p(qs_ot_env%buf2_k_k_sym)
1456 9887 : IF (ASSOCIATED(qs_ot_env%buf3_k_k_sym)) CALL dbcsr_release_p(qs_ot_env%buf3_k_k_sym)
1457 9887 : IF (ASSOCIATED(qs_ot_env%buf4_k_k_sym)) CALL dbcsr_release_p(qs_ot_env%buf4_k_k_sym)
1458 9887 : IF (ASSOCIATED(qs_ot_env%buf1_n_k)) CALL dbcsr_release_p(qs_ot_env%buf1_n_k)
1459 9887 : IF (ASSOCIATED(qs_ot_env%buf1_n_k_dp)) CALL dbcsr_release_p(qs_ot_env%buf1_n_k_dp)
1460 :
1461 : IF (qs_ot_env%settings%ot_method == "DIIS" .OR. &
1462 9887 : qs_ot_env%settings%ot_method == "BROY" .OR. &
1463 : qs_ot_env%settings%ot_method == "LBFG") THEN
1464 5768 : CALL dbcsr_deallocate_matrix_set(qs_ot_env%matrix_h_x)
1465 5768 : CALL dbcsr_deallocate_matrix_set(qs_ot_env%matrix_h_e)
1466 5768 : IF (ASSOCIATED(qs_ot_env%matrix_h_x_im)) THEN
1467 233 : CALL dbcsr_deallocate_matrix_set(qs_ot_env%matrix_h_x_im)
1468 : END IF
1469 5768 : IF (ASSOCIATED(qs_ot_env%matrix_h_e_im)) THEN
1470 233 : CALL dbcsr_deallocate_matrix_set(qs_ot_env%matrix_h_e_im)
1471 : END IF
1472 : END IF
1473 9887 : IF (qs_ot_env%settings%ot_method == "DIIS" .OR. &
1474 : qs_ot_env%settings%ot_method == "BROY") THEN
1475 5650 : DEALLOCATE (qs_ot_env%ls_diis)
1476 5650 : DEALLOCATE (qs_ot_env%lss_diis)
1477 5650 : DEALLOCATE (qs_ot_env%c_diis)
1478 5650 : DEALLOCATE (qs_ot_env%c_broy)
1479 5650 : DEALLOCATE (qs_ot_env%energy_h)
1480 5650 : DEALLOCATE (qs_ot_env%ipivot)
1481 : END IF
1482 9887 : IF (qs_ot_env%settings%ot_method == "LBFG") THEN
1483 0 : DEALLOCATE (qs_ot_env%lbfgs_rho, qs_ot_env%lbfgs_yy, &
1484 118 : qs_ot_env%lbfgs_sy_rotation, qs_ot_env%lbfgs_yy_rotation)
1485 : END IF
1486 :
1487 9887 : IF (qs_ot_env%settings%do_rotation) THEN
1488 :
1489 392 : IF (ASSOCIATED(qs_ot_env%rot_mat_u)) CALL dbcsr_release_p(qs_ot_env%rot_mat_u)
1490 392 : IF (ASSOCIATED(qs_ot_env%rot_mat_u_im)) CALL dbcsr_release_p(qs_ot_env%rot_mat_u_im)
1491 392 : IF (ASSOCIATED(qs_ot_env%rot_mat_x)) CALL dbcsr_release_p(qs_ot_env%rot_mat_x)
1492 392 : IF (ASSOCIATED(qs_ot_env%rot_mat_x_im)) CALL dbcsr_release_p(qs_ot_env%rot_mat_x_im)
1493 392 : IF (ASSOCIATED(qs_ot_env%rot_mat_dedu)) CALL dbcsr_release_p(qs_ot_env%rot_mat_dedu)
1494 392 : IF (ASSOCIATED(qs_ot_env%rot_mat_dedu_im)) CALL dbcsr_release_p(qs_ot_env%rot_mat_dedu_im)
1495 392 : IF (ASSOCIATED(qs_ot_env%rot_mat_chc)) CALL dbcsr_release_p(qs_ot_env%rot_mat_chc)
1496 392 : IF (ASSOCIATED(qs_ot_env%rot_mat_chc_im)) CALL dbcsr_release_p(qs_ot_env%rot_mat_chc_im)
1497 :
1498 : IF (qs_ot_env%settings%ot_method == "DIIS" .OR. &
1499 392 : qs_ot_env%settings%ot_method == "BROY" .OR. &
1500 : qs_ot_env%settings%ot_method == "LBFG") THEN
1501 140 : CALL dbcsr_deallocate_matrix_set(qs_ot_env%rot_mat_h_x)
1502 140 : CALL dbcsr_deallocate_matrix_set(qs_ot_env%rot_mat_h_e)
1503 140 : IF (ASSOCIATED(qs_ot_env%rot_mat_h_x_im)) THEN
1504 106 : CALL dbcsr_deallocate_matrix_set(qs_ot_env%rot_mat_h_x_im)
1505 : END IF
1506 140 : IF (ASSOCIATED(qs_ot_env%rot_mat_h_e_im)) THEN
1507 106 : CALL dbcsr_deallocate_matrix_set(qs_ot_env%rot_mat_h_e_im)
1508 : END IF
1509 : END IF
1510 :
1511 392 : IF (ASSOCIATED(qs_ot_env%rot_mat_evals)) DEALLOCATE (qs_ot_env%rot_mat_evals)
1512 392 : IF (ASSOCIATED(qs_ot_env%rot_mat_evec_re)) CALL dbcsr_release_p(qs_ot_env%rot_mat_evec_re)
1513 392 : IF (ASSOCIATED(qs_ot_env%rot_mat_evec_im)) CALL dbcsr_release_p(qs_ot_env%rot_mat_evec_im)
1514 392 : IF (ASSOCIATED(qs_ot_env%rot_mat_gx)) CALL dbcsr_release_p(qs_ot_env%rot_mat_gx)
1515 392 : IF (ASSOCIATED(qs_ot_env%rot_mat_gx_im)) CALL dbcsr_release_p(qs_ot_env%rot_mat_gx_im)
1516 392 : IF (ASSOCIATED(qs_ot_env%rot_mat_response_gx)) THEN
1517 108 : CALL dbcsr_release_p(qs_ot_env%rot_mat_response_gx)
1518 : END IF
1519 392 : IF (ASSOCIATED(qs_ot_env%rot_mat_response_gx_im)) THEN
1520 108 : CALL dbcsr_release_p(qs_ot_env%rot_mat_response_gx_im)
1521 : END IF
1522 392 : IF (ASSOCIATED(qs_ot_env%rot_mat_mermin_g0)) THEN
1523 60 : CALL dbcsr_release_p(qs_ot_env%rot_mat_mermin_g0)
1524 : END IF
1525 392 : IF (ASSOCIATED(qs_ot_env%rot_mat_mermin_g0_im)) THEN
1526 60 : CALL dbcsr_release_p(qs_ot_env%rot_mat_mermin_g0_im)
1527 : END IF
1528 392 : IF (ASSOCIATED(qs_ot_env%rot_mat_gx_old)) CALL dbcsr_release_p(qs_ot_env%rot_mat_gx_old)
1529 392 : IF (ASSOCIATED(qs_ot_env%rot_mat_gx_old_im)) CALL dbcsr_release_p(qs_ot_env%rot_mat_gx_old_im)
1530 392 : IF (ASSOCIATED(qs_ot_env%rot_mat_dx)) CALL dbcsr_release_p(qs_ot_env%rot_mat_dx)
1531 392 : IF (ASSOCIATED(qs_ot_env%rot_mat_dx_im)) CALL dbcsr_release_p(qs_ot_env%rot_mat_dx_im)
1532 : END IF
1533 :
1534 9887 : IF (qs_ot_env%settings%do_ener) THEN
1535 112 : IF (ASSOCIATED(qs_ot_env%ener_x)) DEALLOCATE (qs_ot_env%ener_x)
1536 112 : IF (ASSOCIATED(qs_ot_env%ener_rayleigh)) DEALLOCATE (qs_ot_env%ener_rayleigh)
1537 112 : IF (ASSOCIATED(qs_ot_env%ener_gx)) DEALLOCATE (qs_ot_env%ener_gx)
1538 112 : IF (ASSOCIATED(qs_ot_env%ener_preconditioned_gx)) THEN
1539 108 : DEALLOCATE (qs_ot_env%ener_preconditioned_gx)
1540 : END IF
1541 112 : 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 112 : qs_ot_env%settings%ot_method == "BROY" .OR. &
1544 : qs_ot_env%settings%ot_method == "LBFG") THEN
1545 56 : IF (ASSOCIATED(qs_ot_env%ener_h_x)) DEALLOCATE (qs_ot_env%ener_h_x)
1546 56 : IF (ASSOCIATED(qs_ot_env%ener_h_e)) DEALLOCATE (qs_ot_env%ener_h_e)
1547 : END IF
1548 112 : IF (qs_ot_env%use_dx) THEN
1549 112 : IF (ASSOCIATED(qs_ot_env%ener_dx)) DEALLOCATE (qs_ot_env%ener_dx)
1550 : END IF
1551 112 : IF (qs_ot_env%use_gx_old) THEN
1552 64 : IF (ASSOCIATED(qs_ot_env%ener_gx_old)) DEALLOCATE (qs_ot_env%ener_gx_old)
1553 : END IF
1554 : END IF
1555 :
1556 9887 : qs_ot_env%state_allocated = .FALSE.
1557 9887 : qs_ot_env%has_complex_kpoint_state = .FALSE.
1558 :
1559 : END SUBROUTINE qs_ot_destroy
1560 :
1561 : ! **************************************************************************************************
1562 : !> \brief ...
1563 : !> \param settings ...
1564 : !> \param ot_section ...
1565 : !> \param output_unit ...
1566 : !> \param complex_kpoints whether defaults are for complex k-point OT
1567 : !> \param eigensolver whether OT minimizes a fixed-H orbital subspace for DIAGONALIZATION
1568 : ! **************************************************************************************************
1569 45666 : SUBROUTINE ot_readwrite_input(settings, ot_section, output_unit, complex_kpoints, eigensolver)
1570 : TYPE(qs_ot_settings_type) :: settings
1571 : TYPE(section_vals_type), POINTER :: ot_section
1572 : INTEGER, INTENT(IN) :: output_unit
1573 : LOGICAL, INTENT(IN), OPTIONAL :: complex_kpoints, eigensolver
1574 :
1575 : CHARACTER(len=*), PARAMETER :: routineN = 'ot_readwrite_input'
1576 :
1577 : INTEGER :: handle, ls_method, ot_algorithm, &
1578 : ot_method, ot_ortho_irac
1579 : LOGICAL :: energy_gap_explicit, &
1580 : use_complex_kpoints, use_eigensolver
1581 :
1582 7611 : CALL timeset(routineN, handle)
1583 :
1584 7611 : use_complex_kpoints = .FALSE.
1585 7611 : IF (PRESENT(complex_kpoints)) use_complex_kpoints = complex_kpoints
1586 7611 : use_eigensolver = .FALSE.
1587 7611 : IF (PRESENT(eigensolver)) use_eigensolver = eigensolver
1588 :
1589 : ! choose algorithm
1590 7611 : CALL section_vals_val_get(ot_section, "ALGORITHM", i_val=ot_algorithm)
1591 6949 : SELECT CASE (ot_algorithm)
1592 : CASE (ot_algo_taylor_or_diag)
1593 6949 : settings%ot_algorithm = "TOD"
1594 : CASE (ot_algo_irac)
1595 662 : CALL cite_reference(Weber2008)
1596 662 : settings%ot_algorithm = "REF"
1597 : CASE DEFAULT
1598 7611 : CPABORT("Value unknown")
1599 : END SELECT
1600 :
1601 : ! irac input
1602 7611 : CALL section_vals_val_get(ot_section, "IRAC_DEGREE", i_val=settings%irac_degree)
1603 7611 : IF (settings%irac_degree < 2 .OR. settings%irac_degree > 4) THEN
1604 0 : CPABORT("READ OT IRAC_DEGREE: Value unknown")
1605 : END IF
1606 7611 : CALL section_vals_val_get(ot_section, "MAX_IRAC", i_val=settings%max_irac)
1607 7611 : IF (settings%max_irac < 1) THEN
1608 0 : CPABORT("READ OT MAX_IRAC: VALUE MUST BE GREATER THAN ZERO")
1609 : END IF
1610 7611 : CALL section_vals_val_get(ot_section, "EPS_IRAC_FILTER_MATRIX", r_val=settings%eps_irac_filter_matrix)
1611 7611 : CALL section_vals_val_get(ot_section, "EPS_IRAC", r_val=settings%eps_irac)
1612 7611 : IF (settings%eps_irac < 0.0_dp) THEN
1613 0 : CPABORT("READ OT EPS_IRAC: VALUE MUST BE GREATER THAN ZERO")
1614 : END IF
1615 7611 : CALL section_vals_val_get(ot_section, "EPS_IRAC_QUICK_EXIT", r_val=settings%eps_irac_quick_exit)
1616 7611 : IF (settings%eps_irac_quick_exit < 0.0_dp) THEN
1617 0 : CPABORT("READ OT EPS_IRAC_QUICK_EXIT: VALUE MUST BE GREATER THAN ZERO")
1618 : END IF
1619 :
1620 7611 : CALL section_vals_val_get(ot_section, "EPS_IRAC_SWITCH", r_val=settings%eps_irac_switch)
1621 7611 : IF (settings%eps_irac_switch < 0.0_dp) THEN
1622 0 : CPABORT("READ OT EPS_IRAC_SWITCH: VALUE MUST BE GREATER THAN ZERO")
1623 : END IF
1624 :
1625 7611 : CALL section_vals_val_get(ot_section, "ORTHO_IRAC", i_val=ot_ortho_irac)
1626 7527 : SELECT CASE (ot_ortho_irac)
1627 : CASE (ot_chol_irac)
1628 7527 : settings%ortho_irac = "CHOL"
1629 : CASE (ot_poly_irac)
1630 34 : settings%ortho_irac = "POLY"
1631 : CASE (ot_lwdn_irac)
1632 50 : settings%ortho_irac = "LWDN"
1633 : CASE DEFAULT
1634 7611 : CPABORT("READ OT ORTHO_IRAC: Value unknown")
1635 : END SELECT
1636 :
1637 7611 : CALL section_vals_val_get(ot_section, "ON_THE_FLY_LOC", l_val=settings%on_the_fly_loc)
1638 :
1639 7611 : CALL section_vals_val_get(ot_section, "MINIMIZER", i_val=ot_method)
1640 : ! overwrite input if ot_state is set
1641 7611 : IF (settings%ot_state == 1) THEN
1642 6 : ot_method = ot_mini_diis
1643 : END IF
1644 : ! compatibility
1645 14 : SELECT CASE (ot_method)
1646 : CASE (ot_mini_sd)
1647 14 : settings%ot_method = "SD"
1648 : CASE (ot_mini_cg)
1649 2494 : settings%ot_method = "CG"
1650 : CASE (ot_mini_diis)
1651 5041 : settings%ot_method = "DIIS"
1652 5041 : CALL section_vals_val_get(ot_section, "N_HISTORY_VEC", i_val=settings%diis_m)
1653 : CASE (ot_mini_broyden)
1654 16 : CALL section_vals_val_get(ot_section, "N_HISTORY_VEC", i_val=settings%diis_m)
1655 16 : CALL section_vals_val_get(ot_section, "BROYDEN_BETA", r_val=settings%broyden_beta)
1656 16 : CALL section_vals_val_get(ot_section, "BROYDEN_GAMMA", r_val=settings%broyden_gamma)
1657 16 : CALL section_vals_val_get(ot_section, "BROYDEN_SIGMA", r_val=settings%broyden_sigma)
1658 16 : CALL section_vals_val_get(ot_section, "BROYDEN_ETA", r_val=settings%broyden_eta)
1659 16 : CALL section_vals_val_get(ot_section, "BROYDEN_OMEGA", r_val=settings%broyden_omega)
1660 16 : CALL section_vals_val_get(ot_section, "BROYDEN_SIGMA_DECREASE", r_val=settings%broyden_sigma_decrease)
1661 16 : CALL section_vals_val_get(ot_section, "BROYDEN_SIGMA_MIN", r_val=settings%broyden_sigma_min)
1662 16 : CALL section_vals_val_get(ot_section, "BROYDEN_FORGET_HISTORY", l_val=settings%broyden_forget_history)
1663 16 : CALL section_vals_val_get(ot_section, "BROYDEN_ADAPTIVE_SIGMA", l_val=settings%broyden_adaptive_sigma)
1664 16 : CALL section_vals_val_get(ot_section, "BROYDEN_ENABLE_FLIP", l_val=settings%broyden_enable_flip)
1665 16 : settings%ot_method = "BROY"
1666 : CASE (ot_mini_lbfgs)
1667 46 : CALL section_vals_val_get(ot_section, "N_HISTORY_VEC", i_val=settings%diis_m)
1668 : CALL section_vals_val_get(ot_section, "LBFGS_CURVATURE_TOL", &
1669 46 : r_val=settings%lbfgs_curvature_tol)
1670 : CALL section_vals_val_get(ot_section, "LBFGS_DAMPING", &
1671 46 : l_val=settings%lbfgs_damping)
1672 46 : IF (settings%lbfgs_curvature_tol < 0.0_dp .OR. &
1673 : settings%lbfgs_curvature_tol >= 1.0_dp) THEN
1674 0 : CPABORT("READ OT LBFGS_CURVATURE_TOL: Value must be in [0, 1)")
1675 : END IF
1676 46 : settings%ot_method = "LBFG"
1677 : CASE DEFAULT
1678 7611 : CPABORT("READ OTSCF MINIMIZER: Value unknown")
1679 : END SELECT
1680 7611 : CALL section_vals_val_get(ot_section, "SAFER_DIIS", l_val=settings%safer_diis)
1681 7611 : CALL section_vals_val_get(ot_section, "LINESEARCH", i_val=ls_method)
1682 2 : SELECT CASE (ls_method)
1683 : CASE (ls_none)
1684 2 : settings%line_search_method = "NONE"
1685 : CASE (ls_2pnt)
1686 7465 : settings%line_search_method = "2PNT"
1687 : CASE (ls_3pnt)
1688 42 : settings%line_search_method = "3PNT"
1689 : CASE (ls_adapt)
1690 90 : settings%line_search_method = "ADPT"
1691 : CASE (ls_gold)
1692 12 : settings%line_search_method = "GOLD"
1693 12 : CALL section_vals_val_get(ot_section, "GOLD_TARGET", r_val=settings%gold_target)
1694 : CASE DEFAULT
1695 7611 : CPABORT("READ OTSCF LS: Value unknown")
1696 : END SELECT
1697 :
1698 7611 : CALL section_vals_val_get(ot_section, "PRECOND_SOLVER", i_val=settings%precond_solver_type)
1699 15198 : SELECT CASE (settings%precond_solver_type)
1700 : CASE (ot_precond_solver_default)
1701 7587 : settings%precond_solver_name = "DEFAULT"
1702 : CASE (ot_precond_solver_inv_chol)
1703 16 : settings%precond_solver_name = "INVERSE_CHOLESKY"
1704 : CASE (ot_precond_solver_direct)
1705 0 : settings%precond_solver_name = "DIRECT"
1706 : CASE (ot_precond_solver_update)
1707 6 : settings%precond_solver_name = "INVERSE_UPDATE"
1708 : CASE (ot_precond_solver_chebyshev)
1709 2 : settings%precond_solver_name = "CHEBYSHEV"
1710 : CASE DEFAULT
1711 7611 : CPABORT("READ OTSCF SOLVER: Value unknown")
1712 : END SELECT
1713 7611 : CALL section_vals_val_get(ot_section, "CHEBYSHEV_DEGREE", i_val=settings%chebyshev_degree)
1714 7611 : IF (settings%chebyshev_degree < 1 .OR. settings%chebyshev_degree > 100) THEN
1715 0 : CPABORT("READ OT CHEBYSHEV_DEGREE: Value must be between 1 and 100")
1716 : END IF
1717 :
1718 7611 : CALL section_vals_val_get(ot_section, "MAX_SCF_DIIS", i_val=settings%max_scf_diis)
1719 :
1720 : !If these values are negative we will set them "optimal" for a given precondtioner below
1721 7611 : CALL section_vals_val_get(ot_section, "STEPSIZE", r_val=settings%ds_min)
1722 : CALL section_vals_val_get(ot_section, "ENERGY_GAP", r_val=settings%energy_gap, &
1723 7611 : explicit=energy_gap_explicit)
1724 :
1725 7611 : CALL section_vals_val_get(ot_section, "PRECONDITIONER", i_val=settings%preconditioner_type)
1726 8343 : SELECT CASE (settings%preconditioner_type)
1727 : CASE (ot_precond_none)
1728 732 : settings%preconditioner_name = "NONE"
1729 732 : IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.15_dp
1730 732 : IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.2_dp
1731 : CASE (ot_precond_full_single)
1732 34 : settings%preconditioner_name = "FULL_SINGLE"
1733 34 : IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.15_dp
1734 34 : IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.2_dp
1735 : CASE (ot_precond_full_single_inverse)
1736 2892 : settings%preconditioner_name = "FULL_SINGLE_INVERSE"
1737 2892 : IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.08_dp
1738 2892 : IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.08_dp
1739 : CASE (ot_precond_full_all)
1740 2604 : settings%preconditioner_name = "FULL_ALL"
1741 2604 : IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.15_dp
1742 2604 : IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.08_dp
1743 : CASE (ot_precond_fermi_low_rank)
1744 4 : settings%preconditioner_name = "FERMI_LOW_RANK"
1745 4 : IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.12_dp
1746 4 : IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.08_dp
1747 : CASE (ot_precond_full_kinetic)
1748 1285 : settings%preconditioner_name = "FULL_KINETIC"
1749 1285 : IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.15_dp
1750 1285 : IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.2_dp
1751 : CASE (ot_precond_s_inverse)
1752 60 : settings%preconditioner_name = "FULL_S_INVERSE"
1753 60 : IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.15_dp
1754 60 : IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.2_dp
1755 : CASE DEFAULT
1756 7611 : CPABORT("READ OTSCF PRECONDITIONER: Value unknown")
1757 : END SELECT
1758 : IF (use_complex_kpoints .AND. &
1759 7611 : settings%preconditioner_type == ot_precond_full_single_inverse .AND. &
1760 2 : .NOT. energy_gap_explicit) settings%energy_gap = 0.20_dp
1761 7611 : CALL section_vals_val_get(ot_section, "FERMI_LOW_RANK_BASE", i_val=settings%low_rank_base)
1762 15220 : SELECT CASE (settings%low_rank_base)
1763 : CASE (ot_low_rank_base_overlap)
1764 7609 : settings%low_rank_base_name = "OVERLAP_INVERSE"
1765 : CASE (ot_low_rank_base_lattice_fft)
1766 2 : settings%low_rank_base_name = "LATTICE_FFT"
1767 : CASE DEFAULT
1768 7611 : CPABORT("READ OT FERMI_LOW_RANK_BASE: Value unknown")
1769 : END SELECT
1770 7611 : CALL section_vals_val_get(ot_section, "CHOLESKY", i_val=settings%cholesky_type)
1771 7611 : CALL section_vals_val_get(ot_section, "EPS_TAYLOR", r_val=settings%eps_taylor)
1772 7611 : CALL section_vals_val_get(ot_section, "MAX_TAYLOR", i_val=settings%max_taylor)
1773 7611 : CALL section_vals_val_get(ot_section, "ROTATION", l_val=settings%do_rotation)
1774 7611 : CALL section_vals_val_get(ot_section, "ENERGIES", l_val=settings%do_ener)
1775 : CALL section_vals_val_get(ot_section, "OCCUPATION_PRECONDITIONER", &
1776 7611 : l_val=settings%occupation_preconditioner)
1777 7611 : CALL section_vals_val_get(ot_section, "NONDIAG_ENERGY", l_val=settings%add_nondiag_energy)
1778 : CALL section_vals_val_get(ot_section, "NONDIAG_ENERGY_STRENGTH", &
1779 7611 : r_val=settings%nondiag_energy_strength)
1780 7611 : IF (settings%ot_method == "LBFG") THEN
1781 46 : IF (settings%ot_algorithm /= "TOD" .AND. settings%ot_algorithm /= "REF") THEN
1782 0 : CPABORT("MINIMIZER LBFGS requires ALGORITHM STRICT or IRAC")
1783 : END IF
1784 : END IF
1785 7611 : IF (settings%do_ener .AND. .NOT. use_complex_kpoints .AND. .NOT. use_eigensolver) THEN
1786 0 : CPABORT("OT%ENERGIES is currently supported only by the complex K-point Mermin path.")
1787 : END IF
1788 7611 : IF (use_eigensolver .AND. &
1789 : (settings%do_rotation .OR. settings%do_ener .OR. &
1790 : settings%occupation_preconditioner .OR. settings%add_nondiag_energy)) THEN
1791 : CALL cp_warn(__LOCATION__, &
1792 : "DIAGONALIZATION%OT ignores ROTATION, ENERGIES, "// &
1793 : "OCCUPATION_PRECONDITIONER, and NONDIAG_ENERGY because occupations "// &
1794 2 : "are assigned after eigenspace minimization.")
1795 2 : settings%do_rotation = .FALSE.
1796 2 : settings%do_ener = .FALSE.
1797 2 : settings%occupation_preconditioner = .FALSE.
1798 2 : settings%add_nondiag_energy = .FALSE.
1799 : END IF
1800 :
1801 : ! write OT output
1802 :
1803 7611 : IF (output_unit > 0) THEN
1804 3922 : WRITE (output_unit, '(/,A)') " ----------------------------------- OT ---------------------------------------"
1805 3922 : IF (settings%do_rotation) THEN
1806 157 : WRITE (output_unit, '(A)') " Allowing for rotations "
1807 : END IF
1808 3922 : IF (settings%do_ener) THEN
1809 41 : WRITE (output_unit, '(A,L2)') " Optimizing orbital energies "
1810 : END IF
1811 7 : SELECT CASE (settings%OT_METHOD)
1812 : CASE ("SD")
1813 7 : WRITE (output_unit, '(A)') " Minimizer : SD : steepest descent"
1814 : CASE ("CG")
1815 1276 : WRITE (output_unit, '(A)') " Minimizer : CG : conjugate gradient"
1816 : CASE ("DIIS")
1817 2608 : WRITE (output_unit, '(A)') " Minimizer : DIIS : direct inversion"
1818 2608 : WRITE (output_unit, '(A)') " in the iterative subspace"
1819 2608 : WRITE (output_unit, '(A,I3,A)') " using ", settings%diis_m, " DIIS vectors"
1820 2608 : IF (settings%safer_diis) THEN
1821 2608 : WRITE (output_unit, '(A,I3,A)') " safer DIIS on"
1822 : ELSE
1823 0 : WRITE (output_unit, '(A,I3,A)') " safer DIIS off"
1824 : END IF
1825 : CASE ("BROY")
1826 8 : WRITE (output_unit, '(A)') " Minimizer : BROYDEN : Broyden "
1827 8 : WRITE (output_unit, '(A,F16.8)') " BETA : ", settings%broyden_beta
1828 8 : WRITE (output_unit, '(A,F16.8)') " GAMMA : ", settings%broyden_gamma
1829 8 : WRITE (output_unit, '(A,F16.8)') " SIGMA : ", settings%broyden_sigma
1830 8 : WRITE (output_unit, '(A,I3,A)') " using : - ", &
1831 16 : settings%diis_m, " BROYDEN vectors"
1832 : CASE ("LBFG")
1833 23 : WRITE (output_unit, '(A)') " Minimizer : LBFGS : limited-memory BFGS"
1834 23 : WRITE (output_unit, '(A,I3,A)') " using : ", &
1835 46 : settings%diis_m, " secant pairs"
1836 23 : WRITE (output_unit, '(A,ES12.4)') " curvature tolerance : ", &
1837 46 : settings%lbfgs_curvature_tol
1838 23 : WRITE (output_unit, '(A,L7)') " damp weak curvature : ", &
1839 46 : settings%lbfgs_damping
1840 : CASE DEFAULT
1841 3922 : WRITE (output_unit, '(3A)') " Minimizer : ", settings%OT_METHOD, " : UNKNOWN"
1842 : END SELECT
1843 17 : SELECT CASE (settings%preconditioner_name)
1844 : CASE ("FULL_SINGLE")
1845 17 : WRITE (output_unit, '(A)') " Preconditioner : FULL_SINGLE : diagonalization based"
1846 : CASE ("FULL_SINGLE_INVERSE")
1847 1513 : WRITE (output_unit, '(A,/,A)') " Preconditioner : FULL_SINGLE_INVERSE : inversion of ", &
1848 3026 : " H + eS - 2*(Sc)(c^T*H*c+const)(Sc)^T"
1849 : CASE ("FULL_ALL")
1850 1332 : WRITE (output_unit, '(A)') " Preconditioner : FULL_ALL : diagonalization, state selective"
1851 : CASE ("FERMI_LOW_RANK")
1852 : WRITE (output_unit, '(A)') &
1853 2 : " Preconditioner : FERMI_LOW_RANK : rotationally covariant low-rank correction"
1854 : CASE ("FULL_KINETIC")
1855 662 : WRITE (output_unit, '(A)') " Preconditioner : FULL_KINETIC : inversion of T + eS"
1856 : CASE ("FULL_S_INVERSE")
1857 30 : WRITE (output_unit, '(A)') " Preconditioner : FULL_S_INVERSE : cholesky inversion of S"
1858 : CASE ("SPARSE_DIAG")
1859 : WRITE (output_unit, '(A)') &
1860 0 : " Preconditioner : SPARSE_DIAG : diagonal atomic block diagonalization"
1861 : CASE ("SPARSE_KINETIC")
1862 0 : WRITE (output_unit, '(A)') " Preconditioner : SPARSE_KINETIC : sparse linear solver for T + eS"
1863 : CASE ("NONE")
1864 366 : WRITE (output_unit, '(A)') " Preconditioner : NONE"
1865 : CASE DEFAULT
1866 3922 : WRITE (output_unit, '(3A)') " Preconditioner : ", settings%preconditioner_name, " : UNKNOWN"
1867 : END SELECT
1868 :
1869 3922 : IF (settings%preconditioner_type == ot_precond_fermi_low_rank) THEN
1870 2 : WRITE (output_unit, '(A,A)') " Low-rank base : ", TRIM(settings%low_rank_base_name)
1871 : END IF
1872 :
1873 3922 : WRITE (output_unit, '(A)') " Precond_solver : "//TRIM(settings%precond_solver_name)
1874 3922 : IF (settings%precond_solver_type == ot_precond_solver_chebyshev) THEN
1875 1 : WRITE (output_unit, '(A,I14)') " Chebyshev degree:", settings%chebyshev_degree
1876 : END IF
1877 :
1878 3922 : IF (settings%OT_METHOD == "SD" .OR. settings%OT_METHOD == "CG" .OR. &
1879 : settings%OT_METHOD == "LBFG") THEN
1880 1272 : SELECT CASE (settings%line_search_method)
1881 : CASE ("2PNT")
1882 1272 : WRITE (output_unit, '(A)') " Line search : 2PNT : 2 energies, one gradient"
1883 : CASE ("3PNT")
1884 19 : WRITE (output_unit, '(A)') " Line search : 3PNT : 3 energies"
1885 : CASE ("GOLD")
1886 6 : WRITE (output_unit, '(A)') " Line search : GOLD : bracketing and golden section search"
1887 6 : WRITE (output_unit, '(A,F14.8)') " target rel accuracy : ", settings%gold_target
1888 : CASE ("NONE")
1889 1 : WRITE (output_unit, '(A)') " Line search : NONE"
1890 : CASE DEFAULT
1891 3922 : WRITE (output_unit, '(3A)') " Line search : ", settings%line_search_method, " : UNKNOWN"
1892 : END SELECT
1893 : END IF
1894 3922 : WRITE (output_unit, '(A,F14.8,T49,A,F14.8)') " stepsize :", settings%ds_min, &
1895 7844 : " energy_gap :", settings%energy_gap
1896 3922 : IF (settings%ot_algorithm == 'TOD') THEN
1897 3573 : WRITE (output_unit, '(A,E14.5,T49,A,I14)') " eps_taylor :", settings%eps_taylor, &
1898 7146 : " max_taylor :", settings%max_taylor
1899 : END IF
1900 3922 : IF (settings%ot_algorithm == 'REF') THEN
1901 349 : WRITE (output_unit, '(A,1X,A,T49,A,I14)') " ortho_irac :", settings%ortho_irac, &
1902 698 : " irac_degree :", settings%irac_degree
1903 349 : WRITE (output_unit, '(A,I14,T49,A,E14.5)') " max_irac :", settings%max_irac, &
1904 698 : " eps_irac :", settings%eps_irac
1905 349 : WRITE (output_unit, '(A,E14.5,T49,A,E10.3)') " eps_irac_switch:", settings%eps_irac_switch, &
1906 698 : " eps_irac_quick_exit:", settings%eps_irac_quick_exit
1907 349 : WRITE (output_unit, '(A,L2)') " on_the_fly_loc :", settings%on_the_fly_loc
1908 : END IF
1909 3922 : WRITE (output_unit, '(A)') " ----------------------------------- OT ---------------------------------------"
1910 : WRITE (UNIT=output_unit, &
1911 : FMT="(/,T3,A,T12,A,T31,A,T39,A,T59,A,T75,A,/,T3,A)") &
1912 3922 : "Step", "Update method", "Time", "Convergence", "Total energy", "Change", &
1913 7844 : REPEAT("-", 78)
1914 : END IF
1915 :
1916 7611 : CALL timestop(handle)
1917 :
1918 7611 : END SUBROUTINE ot_readwrite_input
1919 :
1920 0 : END MODULE qs_ot_types
|