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