Line data Source code
1 : !--------------------------------------------------------------------------------------------------!
2 : ! CP2K: A general program to perform molecular dynamics simulations !
3 : ! Copyright 2000-2026 CP2K developers group <https://cp2k.org> !
4 : ! !
5 : ! SPDX-License-Identifier: GPL-2.0-or-later !
6 : !--------------------------------------------------------------------------------------------------!
7 :
8 : ! **************************************************************************************************
9 : !> \brief orbital transformations
10 : !> \par History
11 : !> Added Taylor expansion based computation of the matrix functions (01.2004)
12 : !> added additional rotation variables for non-equivalent occupied orbs (08.2004)
13 : !> \author Joost VandeVondele (06.2002)
14 : ! **************************************************************************************************
15 : MODULE qs_ot_types
16 : USE bibliography, ONLY: VandeVondele2003,&
17 : Weber2008,&
18 : cite_reference
19 : USE cp_blacs_env, ONLY: cp_blacs_env_release,&
20 : cp_blacs_env_type
21 : USE cp_dbcsr_api, ONLY: dbcsr_init_p,&
22 : dbcsr_p_type,&
23 : dbcsr_release_p,&
24 : dbcsr_set,&
25 : dbcsr_type,&
26 : dbcsr_type_no_symmetry
27 : USE cp_dbcsr_operations, ONLY: cp_dbcsr_m_by_n_from_row_template,&
28 : cp_dbcsr_m_by_n_from_template,&
29 : dbcsr_allocate_matrix_set,&
30 : dbcsr_deallocate_matrix_set
31 : USE cp_fm_struct, ONLY: cp_fm_struct_get,&
32 : cp_fm_struct_type
33 : USE input_constants, ONLY: &
34 : cholesky_reduce, ls_2pnt, ls_3pnt, ls_adapt, ls_gold, ls_none, ot_algo_irac, &
35 : ot_algo_taylor_or_diag, ot_chol_irac, ot_lwdn_irac, ot_mini_broyden, ot_mini_cg, &
36 : ot_mini_diis, ot_mini_sd, ot_poly_irac, ot_precond_full_all, ot_precond_full_kinetic, &
37 : ot_precond_full_single, ot_precond_full_single_inverse, ot_precond_none, &
38 : ot_precond_s_inverse, ot_precond_solver_default, ot_precond_solver_direct, &
39 : ot_precond_solver_inv_chol, ot_precond_solver_update
40 : USE input_section_types, ONLY: section_vals_type,&
41 : section_vals_val_get
42 : USE kinds, ONLY: dp
43 : USE message_passing, ONLY: mp_para_env_release,&
44 : mp_para_env_type
45 : USE preconditioner_types, ONLY: preconditioner_type
46 : #include "./base/base_uses.f90"
47 :
48 : IMPLICIT NONE
49 :
50 : PRIVATE
51 :
52 : PUBLIC :: qs_ot_type
53 : PUBLIC :: qs_ot_settings_type
54 : PUBLIC :: qs_ot_destroy
55 : PUBLIC :: qs_ot_allocate
56 : PUBLIC :: qs_ot_init
57 : PUBLIC :: qs_ot_settings_init
58 : PUBLIC :: ot_readwrite_input
59 :
60 : ! **************************************************************************************************
61 : !> \brief notice, this variable needs to be copyable, needed for spins as e.g. in qs_ot_scf
62 : ! **************************************************************************************************
63 : TYPE qs_ot_settings_type
64 : LOGICAL :: do_rotation = .FALSE., do_ener = .FALSE.
65 : LOGICAL :: ks = .FALSE.
66 : CHARACTER(LEN=4) :: ot_method = ""
67 : CHARACTER(LEN=3) :: ot_algorithm = ""
68 : CHARACTER(LEN=4) :: line_search_method = ""
69 : CHARACTER(LEN=20) :: preconditioner_name = ""
70 : INTEGER :: preconditioner_type = -1
71 : INTEGER :: cholesky_type = -1
72 : INTEGER :: ot_state = 0
73 : CHARACTER(LEN=20) :: precond_solver_name = ""
74 : INTEGER :: precond_solver_type = -1
75 : LOGICAL :: safer_diis = .FALSE.
76 : REAL(KIND=dp) :: ds_min = -1.0_dp
77 : REAL(KIND=dp) :: energy_gap = -1.0_dp
78 : INTEGER :: diis_m = -1
79 : INTEGER :: max_scf_diis = 0
80 : REAL(KIND=dp) :: gold_target = -1.0_dp
81 : REAL(KIND=dp) :: eps_taylor = -1.0_dp ! minimum accuracy of Taylor expansion
82 : INTEGER :: max_taylor = -1 ! maximum order of Taylor expansion before switching to diagonalization
83 : INTEGER :: irac_degree = -1 ! used to control the refinement polynomial degree
84 : INTEGER :: max_irac = -1 ! maximum number of iteration for refinement
85 : REAL(KIND=dp) :: eps_irac = -1.0_dp ! target accuracy for refinement
86 : REAL(KIND=dp) :: eps_irac_quick_exit = -1.0_dp
87 : REAL(KIND=dp) :: eps_irac_filter_matrix = -1.0_dp
88 : REAL(KIND=dp) :: eps_irac_switch = -1.0_dp
89 : LOGICAL :: on_the_fly_loc = .FALSE.
90 : CHARACTER(LEN=4) :: ortho_irac = ""
91 : LOGICAL :: occupation_preconditioner = .FALSE., add_nondiag_energy = .FALSE.
92 : REAL(KIND=dp) :: nondiag_energy_strength = -1.0_dp
93 : REAL(KIND=dp) :: broyden_beta = -1.0_dp, broyden_gamma = -1.0_dp, broyden_sigma = -1.0_dp
94 : REAL(KIND=dp) :: broyden_eta = -1.0_dp, broyden_omega = -1.0_dp, broyden_sigma_decrease = -1.0_dp
95 : REAL(KIND=dp) :: broyden_sigma_min = -1.0_dp
96 : LOGICAL :: broyden_forget_history = .FALSE., broyden_adaptive_sigma = .FALSE.
97 : LOGICAL :: broyden_enable_flip = .FALSE.
98 : END TYPE qs_ot_settings_type
99 :
100 : ! **************************************************************************************************
101 : TYPE qs_ot_type
102 : ! this sets the method to be used
103 : TYPE(qs_ot_settings_type) :: settings = qs_ot_settings_type()
104 : LOGICAL :: restricted = .FALSE.
105 :
106 : ! first part of the variables, for occupied subspace invariant optimisation
107 :
108 : ! add a preconditioner matrix. should be symmetric and positive definite
109 : ! the type of this matrix might change in the future
110 : TYPE(preconditioner_type), POINTER :: preconditioner => NULL()
111 :
112 : ! these will/might change during iterations
113 :
114 : ! OT / TOD
115 : TYPE(dbcsr_type), POINTER :: matrix_p => NULL()
116 : TYPE(dbcsr_type), POINTER :: matrix_r => NULL()
117 : TYPE(dbcsr_type), POINTER :: matrix_sinp => NULL()
118 : TYPE(dbcsr_type), POINTER :: matrix_cosp => NULL()
119 : TYPE(dbcsr_type), POINTER :: matrix_sinp_b => NULL()
120 : TYPE(dbcsr_type), POINTER :: matrix_cosp_b => NULL()
121 : TYPE(dbcsr_type), POINTER :: matrix_buf1 => NULL()
122 : TYPE(dbcsr_type), POINTER :: matrix_buf2 => NULL()
123 : TYPE(dbcsr_type), POINTER :: matrix_buf3 => NULL()
124 : TYPE(dbcsr_type), POINTER :: matrix_buf4 => NULL()
125 : TYPE(dbcsr_type), POINTER :: matrix_os => NULL()
126 : TYPE(dbcsr_type), POINTER :: matrix_buf1_ortho => NULL()
127 : TYPE(dbcsr_type), POINTER :: matrix_buf2_ortho => NULL()
128 :
129 : REAL(KIND=dp), DIMENSION(:), POINTER :: evals => NULL()
130 : REAL(KIND=dp), DIMENSION(:), POINTER :: dum => NULL()
131 :
132 : ! matrix os valid
133 : LOGICAL :: os_valid = .FALSE.
134 :
135 : ! for efficient/parallel writing to the blacs_matrix
136 : TYPE(mp_para_env_type), POINTER :: para_env => NULL()
137 : TYPE(cp_blacs_env_type), POINTER :: blacs_env => NULL()
138 :
139 : ! mo-like vectors
140 : TYPE(dbcsr_type), POINTER :: matrix_c0 => NULL(), matrix_sc0 => NULL(), matrix_psc0 => NULL()
141 :
142 : ! OT / IR
143 : TYPE(dbcsr_type), POINTER :: buf1_k_k_nosym => NULL(), buf2_k_k_nosym => NULL(), &
144 : buf3_k_k_nosym => NULL(), buf4_k_k_nosym => NULL(), &
145 : buf1_k_k_sym => NULL(), buf2_k_k_sym => NULL(), &
146 : buf3_k_k_sym => NULL(), buf4_k_k_sym => NULL(), &
147 : p_k_k_sym => NULL(), buf1_n_k => NULL(), buf1_n_k_dp => NULL()
148 :
149 : ! only here for the ease of programming. These will have to be supplied
150 : ! explicitly at all times
151 : TYPE(dbcsr_type), POINTER :: matrix_x => NULL(), matrix_sx => NULL(), matrix_gx => NULL()
152 : TYPE(dbcsr_type), POINTER :: matrix_dx => NULL(), matrix_gx_old => NULL()
153 :
154 : LOGICAL :: use_gx_old = .FALSE., use_dx = .FALSE.
155 :
156 : TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_h_e => NULL(), matrix_h_x => NULL()
157 :
158 : REAL(KIND=dp), DIMENSION(:, :), POINTER :: ls_diis => NULL()
159 : REAL(KIND=dp), DIMENSION(:, :), POINTER :: lss_diis => NULL()
160 : REAL(KIND=dp), DIMENSION(:), POINTER :: c_diis => NULL()
161 : REAL(KIND=dp), DIMENSION(:), POINTER :: c_broy => NULL()
162 : REAL(KIND=dp), DIMENSION(:), POINTER :: energy_h => NULL()
163 : INTEGER, DIMENSION(:), POINTER :: ipivot => NULL()
164 :
165 : 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
166 : INTEGER :: line_search_left = -1, line_search_right = -1, line_search_mid = -1
167 : INTEGER :: line_search_count = -1
168 : LOGICAL :: line_search_might_be_done = .FALSE.
169 : REAL(KIND=dp) :: delta = -1.0_dp, gnorm = -1.0_dp, gnorm_old = -1.0_dp, etotal = -1.0_dp, gradient = -1.0_dp
170 : LOGICAL :: energy_only = .FALSE.
171 : INTEGER :: diis_iter = -1
172 : CHARACTER(LEN=8) :: OT_METHOD_FULL = ""
173 : INTEGER :: OT_count = -1
174 : REAL(KIND=dp) :: ds_min = -1.0_dp
175 : REAL(KIND=dp) :: broyden_adaptive_sigma = -1.0_dp
176 :
177 : LOGICAL :: do_taylor = .FALSE.
178 : INTEGER :: taylor_order = -1
179 : REAL(KIND=dp) :: largest_eval_upper_bound = -1.0_dp
180 :
181 : ! second part of the variables, if an explicit rotation is required as well
182 : TYPE(dbcsr_type), POINTER :: rot_mat_u => NULL() ! rotation matrix
183 : TYPE(dbcsr_type), POINTER :: rot_mat_x => NULL() ! antisymmetric matrix that parametrises rot_matrix_u
184 : TYPE(dbcsr_type), POINTER :: rot_mat_dedu => NULL() ! derivative of the total energy wrt to u
185 : TYPE(dbcsr_type), POINTER :: rot_mat_chc => NULL() ! for convencience, the matrix c^T H c
186 :
187 : TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: rot_mat_h_e => NULL()
188 : TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: rot_mat_h_x => NULL()
189 : TYPE(dbcsr_type), POINTER :: rot_mat_gx => NULL()
190 : TYPE(dbcsr_type), POINTER :: rot_mat_gx_old => NULL()
191 : TYPE(dbcsr_type), POINTER :: rot_mat_dx => NULL()
192 :
193 : REAL(KIND=dp), DIMENSION(:), POINTER :: rot_mat_evals => NULL()
194 : TYPE(dbcsr_type), POINTER :: rot_mat_evec_re => NULL()
195 : TYPE(dbcsr_type), POINTER :: rot_mat_evec_im => NULL()
196 :
197 : ! third part of the variables, if we need to optimize orbital energies
198 : REAL(KIND=dp), POINTER, DIMENSION(:) :: ener_x => NULL()
199 : REAL(KIND=dp), POINTER, DIMENSION(:) :: ener_dx => NULL()
200 : REAL(KIND=dp), POINTER, DIMENSION(:) :: ener_gx => NULL()
201 : REAL(KIND=dp), POINTER, DIMENSION(:) :: ener_gx_old => NULL()
202 : REAL(KIND=dp), POINTER, DIMENSION(:, :) :: ener_h_e => NULL()
203 : REAL(KIND=dp), POINTER, DIMENSION(:, :) :: ener_h_x => NULL()
204 : END TYPE qs_ot_type
205 :
206 : CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_ot_types'
207 :
208 : CONTAINS
209 :
210 : ! **************************************************************************************************
211 : !> \brief sets default values for the settings type
212 : !> \param settings ...
213 : !> \par History
214 : !> 10.2004 created [Joost VandeVondele]
215 : ! **************************************************************************************************
216 16609 : SUBROUTINE qs_ot_settings_init(settings)
217 : TYPE(qs_ot_settings_type) :: settings
218 :
219 16609 : settings%ot_method = "CG"
220 16609 : settings%ot_algorithm = "TOD"
221 16609 : settings%diis_m = 7
222 16609 : settings%preconditioner_name = "FULL_KINETIC"
223 16609 : settings%preconditioner_type = ot_precond_full_kinetic
224 16609 : settings%cholesky_type = cholesky_reduce
225 16609 : settings%precond_solver_name = "CHOLESKY_INVERSE"
226 16609 : settings%precond_solver_type = ot_precond_solver_inv_chol
227 16609 : settings%line_search_method = "2PNT"
228 16609 : settings%ds_min = 0.15_dp
229 16609 : settings%safer_diis = .TRUE.
230 16609 : settings%energy_gap = 0.2_dp
231 16609 : settings%eps_taylor = 1.0E-16_dp
232 16609 : settings%max_taylor = 4
233 16609 : settings%gold_target = 0.01_dp
234 16609 : settings%do_rotation = .FALSE.
235 16609 : settings%do_ener = .FALSE.
236 16609 : settings%irac_degree = 4
237 16609 : settings%max_irac = 50
238 16609 : settings%max_scf_diis = 0
239 16609 : settings%eps_irac = 1.0E-10_dp
240 16609 : settings%eps_irac_quick_exit = 1.0E-5_dp
241 16609 : settings%eps_irac_switch = 1.0E-2
242 16609 : settings%eps_irac_filter_matrix = 0.0_dp
243 16609 : settings%on_the_fly_loc = .FALSE.
244 16609 : settings%ortho_irac = "CHOL"
245 16609 : settings%ks = .TRUE.
246 16609 : settings%occupation_preconditioner = .FALSE.
247 16609 : settings%add_nondiag_energy = .FALSE.
248 16609 : settings%nondiag_energy_strength = 0.0_dp
249 :
250 16609 : END SUBROUTINE qs_ot_settings_init
251 :
252 : ! **************************************************************************************************
253 : !> \brief init matrices, needs c0 and sc0 so that c0*sc0=1
254 : !> \param qs_ot_env ...
255 : ! **************************************************************************************************
256 9226 : SUBROUTINE qs_ot_init(qs_ot_env)
257 : TYPE(qs_ot_type) :: qs_ot_env
258 :
259 498204 : qs_ot_env%OT_energy(:) = 0.0_dp
260 498204 : qs_ot_env%OT_pos(:) = 0.0_dp
261 498204 : qs_ot_env%OT_grad(:) = 0.0_dp
262 9226 : qs_ot_env%line_search_count = 0
263 :
264 9226 : qs_ot_env%energy_only = .FALSE.
265 9226 : qs_ot_env%gnorm_old = 1.0_dp
266 9226 : qs_ot_env%diis_iter = 0
267 9226 : qs_ot_env%ds_min = qs_ot_env%settings%ds_min
268 9226 : qs_ot_env%os_valid = .FALSE.
269 :
270 9226 : CALL dbcsr_set(qs_ot_env%matrix_gx, 0.0_dp)
271 :
272 9226 : IF (qs_ot_env%use_dx) THEN
273 3879 : CALL dbcsr_set(qs_ot_env%matrix_dx, 0.0_dp)
274 : END IF
275 :
276 9226 : IF (qs_ot_env%use_gx_old) THEN
277 3879 : CALL dbcsr_set(qs_ot_env%matrix_gx_old, 0.0_dp)
278 : END IF
279 :
280 9226 : IF (qs_ot_env%settings%do_rotation) THEN
281 216 : CALL dbcsr_set(qs_ot_env%rot_mat_gx, 0.0_dp)
282 216 : IF (qs_ot_env%use_dx) THEN
283 186 : CALL dbcsr_set(qs_ot_env%rot_mat_dx, 0.0_dp)
284 : END IF
285 216 : IF (qs_ot_env%use_gx_old) THEN
286 186 : CALL dbcsr_set(qs_ot_env%rot_mat_gx_old, 0.0_dp)
287 : END IF
288 : END IF
289 9226 : IF (qs_ot_env%settings%do_ener) THEN
290 0 : qs_ot_env%ener_gx(:) = 0.0_dp
291 0 : IF (qs_ot_env%use_dx) THEN
292 0 : qs_ot_env%ener_dx(:) = 0.0_dp
293 : END IF
294 0 : IF (qs_ot_env%use_gx_old) THEN
295 0 : qs_ot_env%ener_gx_old(:) = 0.0_dp
296 : END IF
297 : END IF
298 :
299 9226 : END SUBROUTINE qs_ot_init
300 :
301 : ! **************************************************************************************************
302 : !> \brief allocates the data in qs_ot_env, for a calculation with fm_struct_ref
303 : !> ortho_k allows for specifying an additional orthogonal subspace (i.e. c will
304 : !> be kept orthogonal provided c0 was, used in qs_ot_eigensolver)
305 : !> \param qs_ot_env ...
306 : !> \param matrix_s ...
307 : !> \param fm_struct_ref ...
308 : !> \param ortho_k ...
309 : ! **************************************************************************************************
310 9226 : SUBROUTINE qs_ot_allocate(qs_ot_env, matrix_s, fm_struct_ref, ortho_k)
311 : TYPE(qs_ot_type) :: qs_ot_env
312 : TYPE(dbcsr_type), POINTER :: matrix_s
313 : TYPE(cp_fm_struct_type), POINTER :: fm_struct_ref
314 : INTEGER, OPTIONAL :: ortho_k
315 :
316 : INTEGER :: i, k, m_diis, my_ortho_k, n, ncoef
317 : TYPE(cp_blacs_env_type), POINTER :: context
318 : TYPE(mp_para_env_type), POINTER :: para_env
319 :
320 9226 : CALL cite_reference(VandeVondele2003)
321 :
322 9226 : NULLIFY (qs_ot_env%preconditioner)
323 9226 : NULLIFY (qs_ot_env%matrix_psc0)
324 9226 : NULLIFY (qs_ot_env%para_env)
325 9226 : NULLIFY (qs_ot_env%blacs_env)
326 :
327 : CALL cp_fm_struct_get(fm_struct_ref, nrow_global=n, ncol_global=k, &
328 9226 : para_env=para_env, context=context)
329 :
330 9226 : qs_ot_env%para_env => para_env
331 9226 : qs_ot_env%blacs_env => context
332 9226 : CALL para_env%retain()
333 9226 : CALL context%retain()
334 :
335 9226 : IF (PRESENT(ortho_k)) THEN
336 532 : my_ortho_k = ortho_k
337 : ELSE
338 8694 : my_ortho_k = k
339 : END IF
340 :
341 9226 : m_diis = qs_ot_env%settings%diis_m
342 :
343 9226 : qs_ot_env%use_gx_old = .FALSE.
344 9226 : qs_ot_env%use_dx = .FALSE.
345 :
346 3879 : SELECT CASE (qs_ot_env%settings%ot_method)
347 : CASE ("SD")
348 : ! nothing
349 : CASE ("CG")
350 3879 : qs_ot_env%use_gx_old = .TRUE.
351 3879 : qs_ot_env%use_dx = .TRUE.
352 : CASE ("DIIS", "BROY")
353 5337 : IF (m_diis < 1) CPABORT("m_diis less than one")
354 : CASE DEFAULT
355 9226 : CPABORT("Unknown option")
356 : END SELECT
357 :
358 9226 : IF (qs_ot_env%settings%ot_method == "DIIS" .OR. &
359 : qs_ot_env%settings%ot_method == "BROY") THEN
360 21348 : ALLOCATE (qs_ot_env%ls_diis(m_diis + 1, m_diis + 1))
361 400811 : qs_ot_env%ls_diis = 0.0_dp
362 16011 : ALLOCATE (qs_ot_env%lss_diis(m_diis + 1, m_diis + 1))
363 16011 : ALLOCATE (qs_ot_env%c_diis(m_diis + 1))
364 16011 : ALLOCATE (qs_ot_env%c_broy(m_diis))
365 10674 : ALLOCATE (qs_ot_env%energy_h(m_diis))
366 16011 : ALLOCATE (qs_ot_env%ipivot(m_diis + 1))
367 : END IF
368 :
369 27444 : ALLOCATE (qs_ot_env%evals(k))
370 18218 : ALLOCATE (qs_ot_env%dum(k))
371 :
372 9226 : NULLIFY (qs_ot_env%matrix_os)
373 9226 : NULLIFY (qs_ot_env%matrix_buf1_ortho)
374 9226 : NULLIFY (qs_ot_env%matrix_buf2_ortho)
375 9226 : NULLIFY (qs_ot_env%matrix_p)
376 9226 : NULLIFY (qs_ot_env%matrix_r)
377 9226 : NULLIFY (qs_ot_env%matrix_sinp)
378 9226 : NULLIFY (qs_ot_env%matrix_cosp)
379 9226 : NULLIFY (qs_ot_env%matrix_sinp_b)
380 9226 : NULLIFY (qs_ot_env%matrix_cosp_b)
381 9226 : NULLIFY (qs_ot_env%matrix_buf1)
382 9226 : NULLIFY (qs_ot_env%matrix_buf2)
383 9226 : NULLIFY (qs_ot_env%matrix_buf3)
384 9226 : NULLIFY (qs_ot_env%matrix_buf4)
385 9226 : NULLIFY (qs_ot_env%matrix_c0)
386 9226 : NULLIFY (qs_ot_env%matrix_sc0)
387 9226 : NULLIFY (qs_ot_env%matrix_x)
388 9226 : NULLIFY (qs_ot_env%matrix_sx)
389 9226 : NULLIFY (qs_ot_env%matrix_gx)
390 9226 : NULLIFY (qs_ot_env%matrix_gx_old)
391 9226 : NULLIFY (qs_ot_env%matrix_dx)
392 9226 : NULLIFY (qs_ot_env%buf1_k_k_nosym)
393 9226 : NULLIFY (qs_ot_env%buf2_k_k_nosym)
394 9226 : NULLIFY (qs_ot_env%buf3_k_k_nosym)
395 9226 : NULLIFY (qs_ot_env%buf4_k_k_nosym)
396 9226 : NULLIFY (qs_ot_env%buf1_k_k_sym)
397 9226 : NULLIFY (qs_ot_env%buf2_k_k_sym)
398 9226 : NULLIFY (qs_ot_env%buf3_k_k_sym)
399 9226 : NULLIFY (qs_ot_env%buf4_k_k_sym)
400 9226 : NULLIFY (qs_ot_env%buf1_n_k)
401 9226 : NULLIFY (qs_ot_env%buf1_n_k_dp)
402 9226 : NULLIFY (qs_ot_env%p_k_k_sym)
403 :
404 : ! COMMON MATRICES
405 9226 : CALL dbcsr_init_p(qs_ot_env%matrix_c0)
406 : CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%matrix_c0, template=matrix_s, n=k, &
407 9226 : sym=dbcsr_type_no_symmetry)
408 :
409 9226 : CALL dbcsr_init_p(qs_ot_env%matrix_sc0)
410 : CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%matrix_sc0, template=matrix_s, n=my_ortho_k, &
411 9226 : sym=dbcsr_type_no_symmetry)
412 :
413 9226 : CALL dbcsr_init_p(qs_ot_env%matrix_x)
414 : CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%matrix_x, template=matrix_s, n=k, &
415 9226 : sym=dbcsr_type_no_symmetry)
416 :
417 9226 : CALL dbcsr_init_p(qs_ot_env%matrix_sx)
418 : CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%matrix_sx, template=matrix_s, n=k, &
419 9226 : sym=dbcsr_type_no_symmetry)
420 :
421 9226 : CALL dbcsr_init_p(qs_ot_env%matrix_gx)
422 : CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%matrix_gx, template=matrix_s, n=k, &
423 9226 : sym=dbcsr_type_no_symmetry)
424 :
425 9226 : IF (qs_ot_env%use_dx) THEN
426 3879 : CALL dbcsr_init_p(qs_ot_env%matrix_dx)
427 : CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%matrix_dx, template=matrix_s, n=k, &
428 3879 : sym=dbcsr_type_no_symmetry)
429 : END IF
430 :
431 9226 : IF (qs_ot_env%use_gx_old) THEN
432 3879 : CALL dbcsr_init_p(qs_ot_env%matrix_gx_old)
433 : CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%matrix_gx_old, template=matrix_s, n=k, &
434 3879 : sym=dbcsr_type_no_symmetry)
435 : END IF
436 :
437 8150 : SELECT CASE (qs_ot_env%settings%ot_algorithm)
438 : CASE ("TOD")
439 8150 : CALL dbcsr_init_p(qs_ot_env%matrix_p)
440 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%matrix_p, template=matrix_s, m=k, n=k, &
441 8150 : sym=dbcsr_type_no_symmetry)
442 :
443 8150 : CALL dbcsr_init_p(qs_ot_env%matrix_r)
444 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%matrix_r, template=matrix_s, m=k, n=k, &
445 8150 : sym=dbcsr_type_no_symmetry)
446 :
447 8150 : CALL dbcsr_init_p(qs_ot_env%matrix_sinp)
448 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%matrix_sinp, template=matrix_s, m=k, n=k, &
449 8150 : sym=dbcsr_type_no_symmetry)
450 :
451 8150 : CALL dbcsr_init_p(qs_ot_env%matrix_cosp)
452 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%matrix_cosp, template=matrix_s, m=k, n=k, &
453 8150 : sym=dbcsr_type_no_symmetry)
454 :
455 8150 : CALL dbcsr_init_p(qs_ot_env%matrix_sinp_b)
456 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%matrix_sinp_b, template=matrix_s, m=k, n=k, &
457 8150 : sym=dbcsr_type_no_symmetry)
458 :
459 8150 : CALL dbcsr_init_p(qs_ot_env%matrix_cosp_b)
460 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%matrix_cosp_b, template=matrix_s, m=k, n=k, &
461 8150 : sym=dbcsr_type_no_symmetry)
462 :
463 8150 : CALL dbcsr_init_p(qs_ot_env%matrix_buf1)
464 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%matrix_buf1, template=matrix_s, m=k, n=k, &
465 8150 : sym=dbcsr_type_no_symmetry)
466 :
467 8150 : CALL dbcsr_init_p(qs_ot_env%matrix_buf2)
468 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%matrix_buf2, template=matrix_s, m=k, n=k, &
469 8150 : sym=dbcsr_type_no_symmetry)
470 :
471 8150 : CALL dbcsr_init_p(qs_ot_env%matrix_buf3)
472 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%matrix_buf3, template=matrix_s, m=k, n=k, &
473 8150 : sym=dbcsr_type_no_symmetry)
474 :
475 8150 : CALL dbcsr_init_p(qs_ot_env%matrix_buf4)
476 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%matrix_buf4, template=matrix_s, m=k, n=k, &
477 8150 : sym=dbcsr_type_no_symmetry)
478 :
479 8150 : CALL dbcsr_init_p(qs_ot_env%matrix_os)
480 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%matrix_os, template=matrix_s, m=my_ortho_k, n=my_ortho_k, &
481 8150 : sym=dbcsr_type_no_symmetry)
482 :
483 8150 : CALL dbcsr_init_p(qs_ot_env%matrix_buf1_ortho)
484 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%matrix_buf1_ortho, template=matrix_s, m=my_ortho_k, n=k, &
485 8150 : sym=dbcsr_type_no_symmetry)
486 :
487 8150 : CALL dbcsr_init_p(qs_ot_env%matrix_buf2_ortho)
488 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%matrix_buf2_ortho, template=matrix_s, m=my_ortho_k, n=k, &
489 8150 : sym=dbcsr_type_no_symmetry)
490 :
491 : CASE ("REF")
492 1076 : CALL dbcsr_init_p(qs_ot_env%buf1_k_k_nosym)
493 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%buf1_k_k_nosym, template=matrix_s, m=k, n=k, &
494 1076 : sym=dbcsr_type_no_symmetry)
495 :
496 1076 : CALL dbcsr_init_p(qs_ot_env%buf2_k_k_nosym)
497 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%buf2_k_k_nosym, template=matrix_s, m=k, n=k, &
498 1076 : sym=dbcsr_type_no_symmetry)
499 :
500 1076 : CALL dbcsr_init_p(qs_ot_env%buf3_k_k_nosym)
501 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%buf3_k_k_nosym, template=matrix_s, m=k, n=k, &
502 1076 : sym=dbcsr_type_no_symmetry)
503 :
504 1076 : CALL dbcsr_init_p(qs_ot_env%buf4_k_k_nosym)
505 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%buf4_k_k_nosym, template=matrix_s, m=k, n=k, &
506 1076 : sym=dbcsr_type_no_symmetry)
507 :
508 : ! It claims to be symmetric but to avoid dbcsr confusion nonsymmetric is kept
509 1076 : CALL dbcsr_init_p(qs_ot_env%buf1_k_k_sym)
510 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%buf1_k_k_sym, template=matrix_s, m=k, n=k, &
511 1076 : sym=dbcsr_type_no_symmetry)
512 :
513 1076 : CALL dbcsr_init_p(qs_ot_env%buf2_k_k_sym)
514 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%buf2_k_k_sym, template=matrix_s, m=k, n=k, &
515 1076 : sym=dbcsr_type_no_symmetry)
516 :
517 1076 : CALL dbcsr_init_p(qs_ot_env%buf3_k_k_sym)
518 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%buf3_k_k_sym, template=matrix_s, m=k, n=k, &
519 1076 : sym=dbcsr_type_no_symmetry)
520 : !
521 1076 : CALL dbcsr_init_p(qs_ot_env%buf4_k_k_sym)
522 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%buf4_k_k_sym, template=matrix_s, m=k, n=k, &
523 1076 : sym=dbcsr_type_no_symmetry)
524 : !
525 1076 : CALL dbcsr_init_p(qs_ot_env%p_k_k_sym)
526 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%p_k_k_sym, template=matrix_s, m=k, n=k, &
527 1076 : sym=dbcsr_type_no_symmetry)
528 : !
529 1076 : CALL dbcsr_init_p(qs_ot_env%buf1_n_k)
530 : CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%buf1_n_k, template=matrix_s, n=k, &
531 1076 : sym=dbcsr_type_no_symmetry)
532 : !
533 1076 : CALL dbcsr_init_p(qs_ot_env%matrix_buf1)
534 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%matrix_buf1, template=matrix_s, m=k, n=k, &
535 10302 : sym=dbcsr_type_no_symmetry)
536 :
537 : END SELECT
538 :
539 9226 : IF (qs_ot_env%settings%ot_method == "DIIS" .OR. &
540 : qs_ot_env%settings%ot_method == "BROY") THEN
541 5337 : NULLIFY (qs_ot_env%matrix_h_e)
542 5337 : NULLIFY (qs_ot_env%matrix_h_x)
543 5337 : CALL dbcsr_allocate_matrix_set(qs_ot_env%matrix_h_e, m_diis)
544 5337 : CALL dbcsr_allocate_matrix_set(qs_ot_env%matrix_h_x, m_diis)
545 43286 : DO i = 1, m_diis
546 37949 : CALL dbcsr_init_p(qs_ot_env%matrix_h_x(i)%matrix)
547 : CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%matrix_h_x(i)%matrix, template=matrix_s, n=k, &
548 37949 : sym=dbcsr_type_no_symmetry)
549 :
550 37949 : CALL dbcsr_init_p(qs_ot_env%matrix_h_e(i)%matrix)
551 : CALL cp_dbcsr_m_by_n_from_row_template(qs_ot_env%matrix_h_e(i)%matrix, template=matrix_s, n=k, &
552 47175 : sym=dbcsr_type_no_symmetry)
553 : END DO
554 : END IF
555 :
556 9226 : NULLIFY (qs_ot_env%rot_mat_u, qs_ot_env%rot_mat_x, qs_ot_env%rot_mat_h_e, qs_ot_env%rot_mat_h_x, &
557 9226 : qs_ot_env%rot_mat_gx, qs_ot_env%rot_mat_gx_old, qs_ot_env%rot_mat_dx, &
558 9226 : qs_ot_env%rot_mat_evals, qs_ot_env%rot_mat_dedu, qs_ot_env%rot_mat_chc, &
559 9226 : qs_ot_env%rot_mat_evec_re, qs_ot_env%rot_mat_evec_im)
560 :
561 9226 : IF (qs_ot_env%settings%do_rotation) THEN
562 216 : CALL dbcsr_init_p(qs_ot_env%rot_mat_u)
563 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_u, template=matrix_s, m=k, n=k, &
564 216 : sym=dbcsr_type_no_symmetry)
565 :
566 216 : CALL dbcsr_init_p(qs_ot_env%rot_mat_x)
567 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_x, template=matrix_s, m=k, n=k, &
568 216 : sym=dbcsr_type_no_symmetry)
569 :
570 216 : CALL dbcsr_init_p(qs_ot_env%rot_mat_dedu)
571 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_dedu, template=matrix_s, m=k, n=k, &
572 216 : sym=dbcsr_type_no_symmetry)
573 :
574 216 : CALL dbcsr_init_p(qs_ot_env%rot_mat_chc)
575 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_chc, template=matrix_s, m=k, n=k, &
576 216 : sym=dbcsr_type_no_symmetry)
577 :
578 216 : IF (qs_ot_env%settings%ot_method == "DIIS") THEN
579 30 : CALL dbcsr_allocate_matrix_set(qs_ot_env%rot_mat_h_e, m_diis)
580 30 : CALL dbcsr_allocate_matrix_set(qs_ot_env%rot_mat_h_x, m_diis)
581 240 : DO i = 1, m_diis
582 210 : CALL dbcsr_init_p(qs_ot_env%rot_mat_h_e(i)%matrix)
583 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_h_e(i)%matrix, template=matrix_s, m=k, n=k, &
584 210 : sym=dbcsr_type_no_symmetry)
585 :
586 210 : CALL dbcsr_init_p(qs_ot_env%rot_mat_h_x(i)%matrix)
587 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_h_x(i)%matrix, template=matrix_s, m=k, n=k, &
588 240 : sym=dbcsr_type_no_symmetry)
589 : END DO
590 : END IF
591 :
592 644 : ALLOCATE (qs_ot_env%rot_mat_evals(k))
593 216 : CALL dbcsr_init_p(qs_ot_env%rot_mat_evec_re)
594 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_evec_re, template=matrix_s, m=k, n=k, &
595 216 : sym=dbcsr_type_no_symmetry)
596 216 : CALL dbcsr_init_p(qs_ot_env%rot_mat_evec_im)
597 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_evec_im, template=matrix_s, m=k, n=k, &
598 216 : sym=dbcsr_type_no_symmetry)
599 :
600 216 : CALL dbcsr_init_p(qs_ot_env%rot_mat_gx)
601 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_gx, template=matrix_s, m=k, n=k, &
602 216 : sym=dbcsr_type_no_symmetry)
603 :
604 216 : IF (qs_ot_env%use_gx_old) THEN
605 186 : CALL dbcsr_init_p(qs_ot_env%rot_mat_gx_old)
606 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_gx_old, template=matrix_s, m=k, n=k, &
607 186 : sym=dbcsr_type_no_symmetry)
608 : END IF
609 :
610 216 : IF (qs_ot_env%use_dx) THEN
611 186 : CALL dbcsr_init_p(qs_ot_env%rot_mat_dx)
612 : CALL cp_dbcsr_m_by_n_from_template(qs_ot_env%rot_mat_dx, template=matrix_s, m=k, n=k, &
613 186 : sym=dbcsr_type_no_symmetry)
614 : END IF
615 :
616 : END IF
617 :
618 9226 : IF (qs_ot_env%settings%do_ener) THEN
619 0 : ncoef = k
620 0 : ALLOCATE (qs_ot_env%ener_x(ncoef))
621 :
622 0 : IF (qs_ot_env%settings%ot_method == "DIIS") THEN
623 0 : ALLOCATE (qs_ot_env%ener_h_e(m_diis, ncoef))
624 0 : ALLOCATE (qs_ot_env%ener_h_x(m_diis, ncoef))
625 : END IF
626 :
627 0 : ALLOCATE (qs_ot_env%ener_gx(ncoef))
628 :
629 0 : IF (qs_ot_env%use_gx_old) THEN
630 0 : ALLOCATE (qs_ot_env%ener_gx_old(ncoef))
631 : END IF
632 :
633 0 : IF (qs_ot_env%use_dx) THEN
634 0 : ALLOCATE (qs_ot_env%ener_dx(ncoef))
635 0 : qs_ot_env%ener_dx = 0.0_dp
636 : END IF
637 : END IF
638 :
639 9226 : END SUBROUTINE qs_ot_allocate
640 :
641 : ! **************************************************************************************************
642 : !> \brief deallocates data
643 : !> \param qs_ot_env ...
644 : ! **************************************************************************************************
645 9226 : SUBROUTINE qs_ot_destroy(qs_ot_env)
646 : TYPE(qs_ot_type) :: qs_ot_env
647 :
648 9226 : CALL mp_para_env_release(qs_ot_env%para_env)
649 9226 : CALL cp_blacs_env_release(qs_ot_env%blacs_env)
650 :
651 9226 : DEALLOCATE (qs_ot_env%evals)
652 9226 : DEALLOCATE (qs_ot_env%dum)
653 :
654 9226 : IF (ASSOCIATED(qs_ot_env%matrix_os)) CALL dbcsr_release_p(qs_ot_env%matrix_os)
655 9226 : IF (ASSOCIATED(qs_ot_env%matrix_p)) CALL dbcsr_release_p(qs_ot_env%matrix_p)
656 9226 : IF (ASSOCIATED(qs_ot_env%matrix_cosp)) CALL dbcsr_release_p(qs_ot_env%matrix_cosp)
657 9226 : IF (ASSOCIATED(qs_ot_env%matrix_sinp)) CALL dbcsr_release_p(qs_ot_env%matrix_sinp)
658 9226 : IF (ASSOCIATED(qs_ot_env%matrix_r)) CALL dbcsr_release_p(qs_ot_env%matrix_r)
659 9226 : IF (ASSOCIATED(qs_ot_env%matrix_cosp_b)) CALL dbcsr_release_p(qs_ot_env%matrix_cosp_b)
660 9226 : IF (ASSOCIATED(qs_ot_env%matrix_sinp_b)) CALL dbcsr_release_p(qs_ot_env%matrix_sinp_b)
661 9226 : IF (ASSOCIATED(qs_ot_env%matrix_buf1)) CALL dbcsr_release_p(qs_ot_env%matrix_buf1)
662 9226 : IF (ASSOCIATED(qs_ot_env%matrix_buf2)) CALL dbcsr_release_p(qs_ot_env%matrix_buf2)
663 9226 : IF (ASSOCIATED(qs_ot_env%matrix_buf3)) CALL dbcsr_release_p(qs_ot_env%matrix_buf3)
664 9226 : IF (ASSOCIATED(qs_ot_env%matrix_buf4)) CALL dbcsr_release_p(qs_ot_env%matrix_buf4)
665 9226 : IF (ASSOCIATED(qs_ot_env%matrix_buf1_ortho)) CALL dbcsr_release_p(qs_ot_env%matrix_buf1_ortho)
666 9226 : IF (ASSOCIATED(qs_ot_env%matrix_buf2_ortho)) CALL dbcsr_release_p(qs_ot_env%matrix_buf2_ortho)
667 9226 : IF (ASSOCIATED(qs_ot_env%matrix_c0)) CALL dbcsr_release_p(qs_ot_env%matrix_c0)
668 9226 : IF (ASSOCIATED(qs_ot_env%matrix_sc0)) CALL dbcsr_release_p(qs_ot_env%matrix_sc0)
669 9226 : IF (ASSOCIATED(qs_ot_env%matrix_psc0)) CALL dbcsr_release_p(qs_ot_env%matrix_psc0)
670 9226 : IF (ASSOCIATED(qs_ot_env%matrix_x)) CALL dbcsr_release_p(qs_ot_env%matrix_x)
671 9226 : IF (ASSOCIATED(qs_ot_env%matrix_sx)) CALL dbcsr_release_p(qs_ot_env%matrix_sx)
672 9226 : IF (ASSOCIATED(qs_ot_env%matrix_gx)) CALL dbcsr_release_p(qs_ot_env%matrix_gx)
673 9226 : IF (ASSOCIATED(qs_ot_env%matrix_dx)) CALL dbcsr_release_p(qs_ot_env%matrix_dx)
674 9226 : IF (ASSOCIATED(qs_ot_env%matrix_gx_old)) CALL dbcsr_release_p(qs_ot_env%matrix_gx_old)
675 9226 : IF (ASSOCIATED(qs_ot_env%buf1_k_k_nosym)) CALL dbcsr_release_p(qs_ot_env%buf1_k_k_nosym)
676 9226 : IF (ASSOCIATED(qs_ot_env%buf2_k_k_nosym)) CALL dbcsr_release_p(qs_ot_env%buf2_k_k_nosym)
677 9226 : IF (ASSOCIATED(qs_ot_env%buf3_k_k_nosym)) CALL dbcsr_release_p(qs_ot_env%buf3_k_k_nosym)
678 9226 : IF (ASSOCIATED(qs_ot_env%buf4_k_k_nosym)) CALL dbcsr_release_p(qs_ot_env%buf4_k_k_nosym)
679 9226 : IF (ASSOCIATED(qs_ot_env%p_k_k_sym)) CALL dbcsr_release_p(qs_ot_env%p_k_k_sym)
680 9226 : IF (ASSOCIATED(qs_ot_env%buf1_k_k_sym)) CALL dbcsr_release_p(qs_ot_env%buf1_k_k_sym)
681 9226 : IF (ASSOCIATED(qs_ot_env%buf2_k_k_sym)) CALL dbcsr_release_p(qs_ot_env%buf2_k_k_sym)
682 9226 : IF (ASSOCIATED(qs_ot_env%buf3_k_k_sym)) CALL dbcsr_release_p(qs_ot_env%buf3_k_k_sym)
683 9226 : IF (ASSOCIATED(qs_ot_env%buf4_k_k_sym)) CALL dbcsr_release_p(qs_ot_env%buf4_k_k_sym)
684 9226 : IF (ASSOCIATED(qs_ot_env%buf1_n_k)) CALL dbcsr_release_p(qs_ot_env%buf1_n_k)
685 9226 : IF (ASSOCIATED(qs_ot_env%buf1_n_k_dp)) CALL dbcsr_release_p(qs_ot_env%buf1_n_k_dp)
686 :
687 9226 : IF (qs_ot_env%settings%ot_method == "DIIS" .OR. &
688 : qs_ot_env%settings%ot_method == "BROY") THEN
689 5337 : CALL dbcsr_deallocate_matrix_set(qs_ot_env%matrix_h_x)
690 5337 : CALL dbcsr_deallocate_matrix_set(qs_ot_env%matrix_h_e)
691 5337 : DEALLOCATE (qs_ot_env%ls_diis)
692 5337 : DEALLOCATE (qs_ot_env%lss_diis)
693 5337 : DEALLOCATE (qs_ot_env%c_diis)
694 5337 : DEALLOCATE (qs_ot_env%c_broy)
695 5337 : DEALLOCATE (qs_ot_env%energy_h)
696 5337 : DEALLOCATE (qs_ot_env%ipivot)
697 : END IF
698 :
699 9226 : IF (qs_ot_env%settings%do_rotation) THEN
700 :
701 216 : IF (ASSOCIATED(qs_ot_env%rot_mat_u)) CALL dbcsr_release_p(qs_ot_env%rot_mat_u)
702 216 : IF (ASSOCIATED(qs_ot_env%rot_mat_x)) CALL dbcsr_release_p(qs_ot_env%rot_mat_x)
703 216 : IF (ASSOCIATED(qs_ot_env%rot_mat_dedu)) CALL dbcsr_release_p(qs_ot_env%rot_mat_dedu)
704 216 : IF (ASSOCIATED(qs_ot_env%rot_mat_chc)) CALL dbcsr_release_p(qs_ot_env%rot_mat_chc)
705 :
706 216 : IF (qs_ot_env%settings%ot_method == "DIIS") THEN
707 30 : CALL dbcsr_deallocate_matrix_set(qs_ot_env%rot_mat_h_x)
708 30 : CALL dbcsr_deallocate_matrix_set(qs_ot_env%rot_mat_h_e)
709 : END IF
710 :
711 216 : DEALLOCATE (qs_ot_env%rot_mat_evals)
712 216 : IF (ASSOCIATED(qs_ot_env%rot_mat_evec_re)) CALL dbcsr_release_p(qs_ot_env%rot_mat_evec_re)
713 216 : IF (ASSOCIATED(qs_ot_env%rot_mat_evec_im)) CALL dbcsr_release_p(qs_ot_env%rot_mat_evec_im)
714 216 : IF (ASSOCIATED(qs_ot_env%rot_mat_gx)) CALL dbcsr_release_p(qs_ot_env%rot_mat_gx)
715 216 : IF (ASSOCIATED(qs_ot_env%rot_mat_gx_old)) CALL dbcsr_release_p(qs_ot_env%rot_mat_gx_old)
716 216 : IF (ASSOCIATED(qs_ot_env%rot_mat_dx)) CALL dbcsr_release_p(qs_ot_env%rot_mat_dx)
717 : END IF
718 :
719 9226 : IF (qs_ot_env%settings%do_ener) THEN
720 0 : DEALLOCATE (qs_ot_env%ener_x)
721 0 : DEALLOCATE (qs_ot_env%ener_gx)
722 0 : IF (qs_ot_env%settings%ot_method == "DIIS") THEN
723 0 : DEALLOCATE (qs_ot_env%ener_h_x)
724 0 : DEALLOCATE (qs_ot_env%ener_h_e)
725 : END IF
726 0 : IF (qs_ot_env%use_dx) THEN
727 0 : DEALLOCATE (qs_ot_env%ener_dx)
728 : END IF
729 0 : IF (qs_ot_env%use_gx_old) THEN
730 0 : DEALLOCATE (qs_ot_env%ener_gx_old)
731 : END IF
732 : END IF
733 :
734 9226 : END SUBROUTINE qs_ot_destroy
735 :
736 : ! **************************************************************************************************
737 : !> \brief ...
738 : !> \param settings ...
739 : !> \param ot_section ...
740 : !> \param output_unit ...
741 : ! **************************************************************************************************
742 36965 : SUBROUTINE ot_readwrite_input(settings, ot_section, output_unit)
743 : TYPE(qs_ot_settings_type) :: settings
744 : TYPE(section_vals_type), POINTER :: ot_section
745 : INTEGER, INTENT(IN) :: output_unit
746 :
747 : CHARACTER(len=*), PARAMETER :: routineN = 'ot_readwrite_input'
748 :
749 : INTEGER :: handle, ls_method, ot_algorithm, &
750 : ot_method, ot_ortho_irac
751 :
752 7393 : CALL timeset(routineN, handle)
753 :
754 : ! choose algorithm
755 7393 : CALL section_vals_val_get(ot_section, "ALGORITHM", i_val=ot_algorithm)
756 6823 : SELECT CASE (ot_algorithm)
757 : CASE (ot_algo_taylor_or_diag)
758 6823 : settings%ot_algorithm = "TOD"
759 : CASE (ot_algo_irac)
760 570 : CALL cite_reference(Weber2008)
761 570 : settings%ot_algorithm = "REF"
762 : CASE DEFAULT
763 7393 : CPABORT("Value unknown")
764 : END SELECT
765 :
766 : ! irac input
767 7393 : CALL section_vals_val_get(ot_section, "IRAC_DEGREE", i_val=settings%irac_degree)
768 7393 : IF (settings%irac_degree < 2 .OR. settings%irac_degree > 4) THEN
769 0 : CPABORT("READ OT IRAC_DEGREE: Value unknown")
770 : END IF
771 7393 : CALL section_vals_val_get(ot_section, "MAX_IRAC", i_val=settings%max_irac)
772 7393 : IF (settings%max_irac < 1) THEN
773 0 : CPABORT("READ OT MAX_IRAC: VALUE MUST BE GREATER THAN ZERO")
774 : END IF
775 7393 : CALL section_vals_val_get(ot_section, "EPS_IRAC_FILTER_MATRIX", r_val=settings%eps_irac_filter_matrix)
776 7393 : CALL section_vals_val_get(ot_section, "EPS_IRAC", r_val=settings%eps_irac)
777 7393 : IF (settings%eps_irac < 0.0_dp) THEN
778 0 : CPABORT("READ OT EPS_IRAC: VALUE MUST BE GREATER THAN ZERO")
779 : END IF
780 7393 : CALL section_vals_val_get(ot_section, "EPS_IRAC_QUICK_EXIT", r_val=settings%eps_irac_quick_exit)
781 7393 : IF (settings%eps_irac_quick_exit < 0.0_dp) THEN
782 0 : CPABORT("READ OT EPS_IRAC_QUICK_EXIT: VALUE MUST BE GREATER THAN ZERO")
783 : END IF
784 :
785 7393 : CALL section_vals_val_get(ot_section, "EPS_IRAC_SWITCH", r_val=settings%eps_irac_switch)
786 7393 : IF (settings%eps_irac_switch < 0.0_dp) THEN
787 0 : CPABORT("READ OT EPS_IRAC_SWITCH: VALUE MUST BE GREATER THAN ZERO")
788 : END IF
789 :
790 7393 : CALL section_vals_val_get(ot_section, "ORTHO_IRAC", i_val=ot_ortho_irac)
791 7309 : SELECT CASE (ot_ortho_irac)
792 : CASE (ot_chol_irac)
793 7309 : settings%ortho_irac = "CHOL"
794 : CASE (ot_poly_irac)
795 34 : settings%ortho_irac = "POLY"
796 : CASE (ot_lwdn_irac)
797 50 : settings%ortho_irac = "LWDN"
798 : CASE DEFAULT
799 7393 : CPABORT("READ OT ORTHO_IRAC: Value unknown")
800 : END SELECT
801 :
802 7393 : CALL section_vals_val_get(ot_section, "ON_THE_FLY_LOC", l_val=settings%on_the_fly_loc)
803 :
804 7393 : CALL section_vals_val_get(ot_section, "MINIMIZER", i_val=ot_method)
805 : ! overwrite input if ot_state is set
806 7393 : IF (settings%ot_state == 1) THEN
807 4 : ot_method = ot_mini_diis
808 : END IF
809 : ! compatibility
810 10 : SELECT CASE (ot_method)
811 : CASE (ot_mini_sd)
812 10 : settings%ot_method = "SD"
813 : CASE (ot_mini_cg)
814 2394 : settings%ot_method = "CG"
815 : CASE (ot_mini_diis)
816 4975 : settings%ot_method = "DIIS"
817 4975 : CALL section_vals_val_get(ot_section, "N_HISTORY_VEC", i_val=settings%diis_m)
818 : CASE (ot_mini_broyden)
819 14 : CALL section_vals_val_get(ot_section, "N_HISTORY_VEC", i_val=settings%diis_m)
820 14 : CALL section_vals_val_get(ot_section, "BROYDEN_BETA", r_val=settings%broyden_beta)
821 14 : CALL section_vals_val_get(ot_section, "BROYDEN_GAMMA", r_val=settings%broyden_gamma)
822 14 : CALL section_vals_val_get(ot_section, "BROYDEN_SIGMA", r_val=settings%broyden_sigma)
823 14 : CALL section_vals_val_get(ot_section, "BROYDEN_ETA", r_val=settings%broyden_eta)
824 14 : CALL section_vals_val_get(ot_section, "BROYDEN_OMEGA", r_val=settings%broyden_omega)
825 14 : CALL section_vals_val_get(ot_section, "BROYDEN_SIGMA_DECREASE", r_val=settings%broyden_sigma_decrease)
826 14 : CALL section_vals_val_get(ot_section, "BROYDEN_SIGMA_MIN", r_val=settings%broyden_sigma_min)
827 14 : CALL section_vals_val_get(ot_section, "BROYDEN_FORGET_HISTORY", l_val=settings%broyden_forget_history)
828 14 : CALL section_vals_val_get(ot_section, "BROYDEN_ADAPTIVE_SIGMA", l_val=settings%broyden_adaptive_sigma)
829 14 : CALL section_vals_val_get(ot_section, "BROYDEN_ENABLE_FLIP", l_val=settings%broyden_enable_flip)
830 14 : settings%ot_method = "BROY"
831 : CASE DEFAULT
832 7393 : CPABORT("READ OTSCF MINIMIZER: Value unknown")
833 : END SELECT
834 7393 : CALL section_vals_val_get(ot_section, "SAFER_DIIS", l_val=settings%safer_diis)
835 7393 : CALL section_vals_val_get(ot_section, "LINESEARCH", i_val=ls_method)
836 2 : SELECT CASE (ls_method)
837 : CASE (ls_none)
838 2 : settings%line_search_method = "NONE"
839 : CASE (ls_2pnt)
840 7253 : settings%line_search_method = "2PNT"
841 : CASE (ls_3pnt)
842 42 : settings%line_search_method = "3PNT"
843 : CASE (ls_adapt)
844 84 : settings%line_search_method = "ADPT"
845 : CASE (ls_gold)
846 12 : settings%line_search_method = "GOLD"
847 12 : CALL section_vals_val_get(ot_section, "GOLD_TARGET", r_val=settings%gold_target)
848 : CASE DEFAULT
849 7393 : CPABORT("READ OTSCF LS: Value unknown")
850 : END SELECT
851 :
852 7393 : CALL section_vals_val_get(ot_section, "PRECOND_SOLVER", i_val=settings%precond_solver_type)
853 14764 : SELECT CASE (settings%precond_solver_type)
854 : CASE (ot_precond_solver_default)
855 7371 : settings%precond_solver_name = "DEFAULT"
856 : CASE (ot_precond_solver_inv_chol)
857 16 : settings%precond_solver_name = "INVERSE_CHOLESKY"
858 : CASE (ot_precond_solver_direct)
859 0 : settings%precond_solver_name = "DIRECT"
860 : CASE (ot_precond_solver_update)
861 6 : settings%precond_solver_name = "INVERSE_UPDATE"
862 : CASE DEFAULT
863 7393 : CPABORT("READ OTSCF SOLVER: Value unknown")
864 : END SELECT
865 :
866 7393 : CALL section_vals_val_get(ot_section, "MAX_SCF_DIIS", i_val=settings%max_scf_diis)
867 :
868 : !If these values are negative we will set them "optimal" for a given precondtioner below
869 7393 : CALL section_vals_val_get(ot_section, "STEPSIZE", r_val=settings%ds_min)
870 7393 : CALL section_vals_val_get(ot_section, "ENERGY_GAP", r_val=settings%energy_gap)
871 :
872 7393 : CALL section_vals_val_get(ot_section, "PRECONDITIONER", i_val=settings%preconditioner_type)
873 8117 : SELECT CASE (settings%preconditioner_type)
874 : CASE (ot_precond_none)
875 724 : settings%preconditioner_name = "NONE"
876 724 : IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.15_dp
877 724 : IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.2_dp
878 : CASE (ot_precond_full_single)
879 30 : settings%preconditioner_name = "FULL_SINGLE"
880 30 : IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.15_dp
881 30 : IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.2_dp
882 : CASE (ot_precond_full_single_inverse)
883 2912 : settings%preconditioner_name = "FULL_SINGLE_INVERSE"
884 2912 : IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.08_dp
885 2912 : IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.08_dp
886 : CASE (ot_precond_full_all)
887 2466 : settings%preconditioner_name = "FULL_ALL"
888 2466 : IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.15_dp
889 2466 : IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.08_dp
890 : CASE (ot_precond_full_kinetic)
891 1225 : settings%preconditioner_name = "FULL_KINETIC"
892 1225 : IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.15_dp
893 1225 : IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.2_dp
894 : CASE (ot_precond_s_inverse)
895 36 : settings%preconditioner_name = "FULL_S_INVERSE"
896 36 : IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.15_dp
897 36 : IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.2_dp
898 : CASE DEFAULT
899 7393 : CPABORT("READ OTSCF PRECONDITIONER: Value unknown")
900 : END SELECT
901 7393 : CALL section_vals_val_get(ot_section, "CHOLESKY", i_val=settings%cholesky_type)
902 7393 : CALL section_vals_val_get(ot_section, "EPS_TAYLOR", r_val=settings%eps_taylor)
903 7393 : CALL section_vals_val_get(ot_section, "MAX_TAYLOR", i_val=settings%max_taylor)
904 7393 : CALL section_vals_val_get(ot_section, "ROTATION", l_val=settings%do_rotation)
905 7393 : CALL section_vals_val_get(ot_section, "ENERGIES", l_val=settings%do_ener)
906 : CALL section_vals_val_get(ot_section, "OCCUPATION_PRECONDITIONER", &
907 7393 : l_val=settings%occupation_preconditioner)
908 7393 : CALL section_vals_val_get(ot_section, "NONDIAG_ENERGY", l_val=settings%add_nondiag_energy)
909 : CALL section_vals_val_get(ot_section, "NONDIAG_ENERGY_STRENGTH", &
910 7393 : r_val=settings%nondiag_energy_strength)
911 : ! not yet fully implemented
912 7393 : CPASSERT(.NOT. settings%do_ener)
913 :
914 : ! write OT output
915 :
916 7393 : IF (output_unit > 0) THEN
917 3813 : WRITE (output_unit, '(/,A)') " ----------------------------------- OT ---------------------------------------"
918 3813 : IF (settings%do_rotation) THEN
919 101 : WRITE (output_unit, '(A)') " Allowing for rotations "
920 : END IF
921 3813 : IF (settings%do_ener) THEN
922 0 : WRITE (output_unit, '(A,L2)') " Optimizing orbital energies "
923 : END IF
924 5 : SELECT CASE (settings%OT_METHOD)
925 : CASE ("SD")
926 5 : WRITE (output_unit, '(A)') " Minimizer : SD : steepest descent"
927 : CASE ("CG")
928 1226 : WRITE (output_unit, '(A)') " Minimizer : CG : conjugate gradient"
929 : CASE ("DIIS")
930 2575 : WRITE (output_unit, '(A)') " Minimizer : DIIS : direct inversion"
931 2575 : WRITE (output_unit, '(A)') " in the iterative subspace"
932 2575 : WRITE (output_unit, '(A,I3,A)') " using ", settings%diis_m, " DIIS vectors"
933 2575 : IF (settings%safer_diis) THEN
934 2575 : WRITE (output_unit, '(A,I3,A)') " safer DIIS on"
935 : ELSE
936 0 : WRITE (output_unit, '(A,I3,A)') " safer DIIS off"
937 : END IF
938 : CASE ("BROY")
939 7 : WRITE (output_unit, '(A)') " Minimizer : BROYDEN : Broyden "
940 7 : WRITE (output_unit, '(A,F16.8)') " BETA : ", settings%broyden_beta
941 7 : WRITE (output_unit, '(A,F16.8)') " GAMMA : ", settings%broyden_gamma
942 7 : WRITE (output_unit, '(A,F16.8)') " SIGMA : ", settings%broyden_sigma
943 7 : WRITE (output_unit, '(A,I3,A)') " using : - ", &
944 14 : settings%diis_m, " BROYDEN vectors"
945 : CASE DEFAULT
946 3813 : WRITE (output_unit, '(3A)') " Minimizer : ", settings%OT_METHOD, " : UNKNOWN"
947 : END SELECT
948 15 : SELECT CASE (settings%preconditioner_name)
949 : CASE ("FULL_SINGLE")
950 15 : WRITE (output_unit, '(A)') " Preconditioner : FULL_SINGLE : diagonalization based"
951 : CASE ("FULL_SINGLE_INVERSE")
952 1523 : WRITE (output_unit, '(A,/,A)') " Preconditioner : FULL_SINGLE_INVERSE : inversion of ", &
953 3046 : " H + eS - 2*(Sc)(c^T*H*c+const)(Sc)^T"
954 : CASE ("FULL_ALL")
955 1263 : WRITE (output_unit, '(A)') " Preconditioner : FULL_ALL : diagonalization, state selective"
956 : CASE ("FULL_KINETIC")
957 632 : WRITE (output_unit, '(A)') " Preconditioner : FULL_KINETIC : inversion of T + eS"
958 : CASE ("FULL_S_INVERSE")
959 18 : WRITE (output_unit, '(A)') " Preconditioner : FULL_S_INVERSE : cholesky inversion of S"
960 : CASE ("SPARSE_DIAG")
961 : WRITE (output_unit, '(A)') &
962 0 : " Preconditioner : SPARSE_DIAG : diagonal atomic block diagonalization"
963 : CASE ("SPARSE_KINETIC")
964 0 : WRITE (output_unit, '(A)') " Preconditioner : SPARSE_KINETIC : sparse linear solver for T + eS"
965 : CASE ("NONE")
966 362 : WRITE (output_unit, '(A)') " Preconditioner : NONE"
967 : CASE DEFAULT
968 3813 : WRITE (output_unit, '(3A)') " Preconditioner : ", settings%preconditioner_name, " : UNKNOWN"
969 : END SELECT
970 :
971 3813 : WRITE (output_unit, '(A)') " Precond_solver : "//TRIM(settings%precond_solver_name)
972 :
973 3813 : IF (settings%OT_METHOD == "SD" .OR. settings%OT_METHOD == "CG") THEN
974 1200 : SELECT CASE (settings%line_search_method)
975 : CASE ("2PNT")
976 1200 : WRITE (output_unit, '(A)') " Line search : 2PNT : 2 energies, one gradient"
977 : CASE ("3PNT")
978 19 : WRITE (output_unit, '(A)') " Line search : 3PNT : 3 energies"
979 : CASE ("GOLD")
980 6 : WRITE (output_unit, '(A)') " Line search : GOLD : bracketing and golden section search"
981 6 : WRITE (output_unit, '(A,F14.8)') " target rel accuracy : ", settings%gold_target
982 : CASE ("NONE")
983 1 : WRITE (output_unit, '(A)') " Line search : NONE"
984 : CASE DEFAULT
985 3813 : WRITE (output_unit, '(3A)') " Line search : ", settings%line_search_method, " : UNKNOWN"
986 : END SELECT
987 : END IF
988 3813 : WRITE (output_unit, '(A,F14.8,T49,A,F14.8)') " stepsize :", settings%ds_min, &
989 7626 : " energy_gap :", settings%energy_gap
990 3813 : IF (settings%ot_algorithm == 'TOD') THEN
991 3510 : WRITE (output_unit, '(A,E14.5,T49,A,I14)') " eps_taylor :", settings%eps_taylor, &
992 7020 : " max_taylor :", settings%max_taylor
993 : END IF
994 3813 : IF (settings%ot_algorithm == 'REF') THEN
995 303 : WRITE (output_unit, '(A,1X,A,T49,A,I14)') " ortho_irac :", settings%ortho_irac, &
996 606 : " irac_degree :", settings%irac_degree
997 303 : WRITE (output_unit, '(A,I14,T49,A,E14.5)') " max_irac :", settings%max_irac, &
998 606 : " eps_irac :", settings%eps_irac
999 303 : WRITE (output_unit, '(A,E14.5,T49,A,E10.3)') " eps_irac_switch:", settings%eps_irac_switch, &
1000 606 : " eps_irac_quick_exit:", settings%eps_irac_quick_exit
1001 303 : WRITE (output_unit, '(A,L2)') " on_the_fly_loc :", settings%on_the_fly_loc
1002 : END IF
1003 3813 : WRITE (output_unit, '(A)') " ----------------------------------- OT ---------------------------------------"
1004 : WRITE (UNIT=output_unit, &
1005 : FMT="(/,T3,A,T12,A,T31,A,T39,A,T59,A,T75,A,/,T3,A)") &
1006 3813 : "Step", "Update method", "Time", "Convergence", "Total energy", "Change", &
1007 7626 : REPEAT("-", 78)
1008 : END IF
1009 :
1010 7393 : CALL timestop(handle)
1011 :
1012 7393 : END SUBROUTINE ot_readwrite_input
1013 :
1014 0 : END MODULE qs_ot_types
|