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