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