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