(git:9111030)
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_init_p,&
24 dbcsr_set,&
26 dbcsr_type_no_symmetry
33 USE input_constants, ONLY: &
42 USE kinds, ONLY: dp
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! **************************************************************************************************
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! **************************************************************************************************
102 ! this sets the method to be used
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
208CONTAINS
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 SUBROUTINE qs_ot_settings_init(settings)
217 TYPE(qs_ot_settings_type) :: settings
218
219 settings%ot_method = "CG"
220 settings%ot_algorithm = "TOD"
221 settings%diis_m = 7
222 settings%preconditioner_name = "FULL_KINETIC"
223 settings%preconditioner_type = ot_precond_full_kinetic
224 settings%cholesky_type = cholesky_reduce
225 settings%precond_solver_name = "CHOLESKY_INVERSE"
226 settings%precond_solver_type = ot_precond_solver_inv_chol
227 settings%line_search_method = "2PNT"
228 settings%ds_min = 0.15_dp
229 settings%safer_diis = .true.
230 settings%energy_gap = 0.2_dp
231 settings%eps_taylor = 1.0e-16_dp
232 settings%max_taylor = 4
233 settings%gold_target = 0.01_dp
234 settings%do_rotation = .false.
235 settings%do_ener = .false.
236 settings%irac_degree = 4
237 settings%max_irac = 50
238 settings%max_scf_diis = 0
239 settings%eps_irac = 1.0e-10_dp
240 settings%eps_irac_quick_exit = 1.0e-5_dp
241 settings%eps_irac_switch = 1.0e-2
242 settings%eps_irac_filter_matrix = 0.0_dp
243 settings%on_the_fly_loc = .false.
244 settings%ortho_irac = "CHOL"
245 settings%ks = .true.
246 settings%occupation_preconditioner = .false.
247 settings%add_nondiag_energy = .false.
248 settings%nondiag_energy_strength = 0.0_dp
249
250 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 SUBROUTINE qs_ot_init(qs_ot_env)
257 TYPE(qs_ot_type) :: qs_ot_env
258
259 qs_ot_env%OT_energy(:) = 0.0_dp
260 qs_ot_env%OT_pos(:) = 0.0_dp
261 qs_ot_env%OT_grad(:) = 0.0_dp
262 qs_ot_env%line_search_count = 0
263
264 qs_ot_env%energy_only = .false.
265 qs_ot_env%gnorm_old = 1.0_dp
266 qs_ot_env%diis_iter = 0
267 qs_ot_env%ds_min = qs_ot_env%settings%ds_min
268 qs_ot_env%os_valid = .false.
269
270 CALL dbcsr_set(qs_ot_env%matrix_gx, 0.0_dp)
271
272 IF (qs_ot_env%use_dx) THEN
273 CALL dbcsr_set(qs_ot_env%matrix_dx, 0.0_dp)
274 END IF
275
276 IF (qs_ot_env%use_gx_old) THEN
277 CALL dbcsr_set(qs_ot_env%matrix_gx_old, 0.0_dp)
278 END IF
279
280 IF (qs_ot_env%settings%do_rotation) THEN
281 CALL dbcsr_set(qs_ot_env%rot_mat_gx, 0.0_dp)
282 IF (qs_ot_env%use_dx) THEN
283 CALL dbcsr_set(qs_ot_env%rot_mat_dx, 0.0_dp)
284 END IF
285 IF (qs_ot_env%use_gx_old) THEN
286 CALL dbcsr_set(qs_ot_env%rot_mat_gx_old, 0.0_dp)
287 END IF
288 END IF
289 IF (qs_ot_env%settings%do_ener) THEN
290 qs_ot_env%ener_gx(:) = 0.0_dp
291 IF (qs_ot_env%use_dx) THEN
292 qs_ot_env%ener_dx(:) = 0.0_dp
293 END IF
294 IF (qs_ot_env%use_gx_old) THEN
295 qs_ot_env%ener_gx_old(:) = 0.0_dp
296 END IF
297 END IF
298
299 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 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 CALL cite_reference(vandevondele2003)
321
322 NULLIFY (qs_ot_env%preconditioner)
323 NULLIFY (qs_ot_env%matrix_psc0)
324 NULLIFY (qs_ot_env%para_env)
325 NULLIFY (qs_ot_env%blacs_env)
326
327 CALL cp_fm_struct_get(fm_struct_ref, nrow_global=n, ncol_global=k, &
328 para_env=para_env, context=context)
329
330 qs_ot_env%para_env => para_env
331 qs_ot_env%blacs_env => context
332 CALL para_env%retain()
333 CALL context%retain()
334
335 IF (PRESENT(ortho_k)) THEN
336 my_ortho_k = ortho_k
337 ELSE
338 my_ortho_k = k
339 END IF
340
341 m_diis = qs_ot_env%settings%diis_m
342
343 qs_ot_env%use_gx_old = .false.
344 qs_ot_env%use_dx = .false.
345
346 SELECT CASE (qs_ot_env%settings%ot_method)
347 CASE ("SD")
348 ! nothing
349 CASE ("CG")
350 qs_ot_env%use_gx_old = .true.
351 qs_ot_env%use_dx = .true.
352 CASE ("DIIS", "BROY")
353 IF (m_diis < 1) cpabort("m_diis less than one")
354 CASE DEFAULT
355 cpabort("Unknown option")
356 END SELECT
357
358 IF (qs_ot_env%settings%ot_method == "DIIS" .OR. &
359 qs_ot_env%settings%ot_method == "BROY") THEN
360 ALLOCATE (qs_ot_env%ls_diis(m_diis + 1, m_diis + 1))
361 qs_ot_env%ls_diis = 0.0_dp
362 ALLOCATE (qs_ot_env%lss_diis(m_diis + 1, m_diis + 1))
363 ALLOCATE (qs_ot_env%c_diis(m_diis + 1))
364 ALLOCATE (qs_ot_env%c_broy(m_diis))
365 ALLOCATE (qs_ot_env%energy_h(m_diis))
366 ALLOCATE (qs_ot_env%ipivot(m_diis + 1))
367 END IF
368
369 ALLOCATE (qs_ot_env%evals(k))
370 ALLOCATE (qs_ot_env%dum(k))
371
372 NULLIFY (qs_ot_env%matrix_os)
373 NULLIFY (qs_ot_env%matrix_buf1_ortho)
374 NULLIFY (qs_ot_env%matrix_buf2_ortho)
375 NULLIFY (qs_ot_env%matrix_p)
376 NULLIFY (qs_ot_env%matrix_r)
377 NULLIFY (qs_ot_env%matrix_sinp)
378 NULLIFY (qs_ot_env%matrix_cosp)
379 NULLIFY (qs_ot_env%matrix_sinp_b)
380 NULLIFY (qs_ot_env%matrix_cosp_b)
381 NULLIFY (qs_ot_env%matrix_buf1)
382 NULLIFY (qs_ot_env%matrix_buf2)
383 NULLIFY (qs_ot_env%matrix_buf3)
384 NULLIFY (qs_ot_env%matrix_buf4)
385 NULLIFY (qs_ot_env%matrix_c0)
386 NULLIFY (qs_ot_env%matrix_sc0)
387 NULLIFY (qs_ot_env%matrix_x)
388 NULLIFY (qs_ot_env%matrix_sx)
389 NULLIFY (qs_ot_env%matrix_gx)
390 NULLIFY (qs_ot_env%matrix_gx_old)
391 NULLIFY (qs_ot_env%matrix_dx)
392 NULLIFY (qs_ot_env%buf1_k_k_nosym)
393 NULLIFY (qs_ot_env%buf2_k_k_nosym)
394 NULLIFY (qs_ot_env%buf3_k_k_nosym)
395 NULLIFY (qs_ot_env%buf4_k_k_nosym)
396 NULLIFY (qs_ot_env%buf1_k_k_sym)
397 NULLIFY (qs_ot_env%buf2_k_k_sym)
398 NULLIFY (qs_ot_env%buf3_k_k_sym)
399 NULLIFY (qs_ot_env%buf4_k_k_sym)
400 NULLIFY (qs_ot_env%buf1_n_k)
401 NULLIFY (qs_ot_env%buf1_n_k_dp)
402 NULLIFY (qs_ot_env%p_k_k_sym)
403
404 ! COMMON MATRICES
405 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 sym=dbcsr_type_no_symmetry)
408
409 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 sym=dbcsr_type_no_symmetry)
412
413 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 sym=dbcsr_type_no_symmetry)
416
417 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 sym=dbcsr_type_no_symmetry)
420
421 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 sym=dbcsr_type_no_symmetry)
424
425 IF (qs_ot_env%use_dx) THEN
426 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 sym=dbcsr_type_no_symmetry)
429 END IF
430
431 IF (qs_ot_env%use_gx_old) THEN
432 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 sym=dbcsr_type_no_symmetry)
435 END IF
436
437 SELECT CASE (qs_ot_env%settings%ot_algorithm)
438 CASE ("TOD")
439 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 sym=dbcsr_type_no_symmetry)
442
443 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 sym=dbcsr_type_no_symmetry)
446
447 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 sym=dbcsr_type_no_symmetry)
450
451 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 sym=dbcsr_type_no_symmetry)
454
455 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 sym=dbcsr_type_no_symmetry)
458
459 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 sym=dbcsr_type_no_symmetry)
462
463 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 sym=dbcsr_type_no_symmetry)
466
467 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 sym=dbcsr_type_no_symmetry)
470
471 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 sym=dbcsr_type_no_symmetry)
474
475 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 sym=dbcsr_type_no_symmetry)
478
479 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 sym=dbcsr_type_no_symmetry)
482
483 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 sym=dbcsr_type_no_symmetry)
486
487 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 sym=dbcsr_type_no_symmetry)
490
491 CASE ("REF")
492 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 sym=dbcsr_type_no_symmetry)
495
496 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 sym=dbcsr_type_no_symmetry)
499
500 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 sym=dbcsr_type_no_symmetry)
503
504 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 sym=dbcsr_type_no_symmetry)
507
508 ! It claims to be symmetric but to avoid dbcsr confusion nonsymmetric is kept
509 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 sym=dbcsr_type_no_symmetry)
512
513 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 sym=dbcsr_type_no_symmetry)
516
517 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 sym=dbcsr_type_no_symmetry)
520 !
521 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 sym=dbcsr_type_no_symmetry)
524 !
525 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 sym=dbcsr_type_no_symmetry)
528 !
529 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 sym=dbcsr_type_no_symmetry)
532 !
533 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 sym=dbcsr_type_no_symmetry)
536
537 END SELECT
538
539 IF (qs_ot_env%settings%ot_method == "DIIS" .OR. &
540 qs_ot_env%settings%ot_method == "BROY") THEN
541 NULLIFY (qs_ot_env%matrix_h_e)
542 NULLIFY (qs_ot_env%matrix_h_x)
543 CALL dbcsr_allocate_matrix_set(qs_ot_env%matrix_h_e, m_diis)
544 CALL dbcsr_allocate_matrix_set(qs_ot_env%matrix_h_x, m_diis)
545 DO i = 1, m_diis
546 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 sym=dbcsr_type_no_symmetry)
549
550 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 sym=dbcsr_type_no_symmetry)
553 END DO
554 END IF
555
556 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 qs_ot_env%rot_mat_gx, qs_ot_env%rot_mat_gx_old, qs_ot_env%rot_mat_dx, &
558 qs_ot_env%rot_mat_evals, qs_ot_env%rot_mat_dedu, qs_ot_env%rot_mat_chc, &
559 qs_ot_env%rot_mat_evec_re, qs_ot_env%rot_mat_evec_im)
560
561 IF (qs_ot_env%settings%do_rotation) THEN
562 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 sym=dbcsr_type_no_symmetry)
565
566 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 sym=dbcsr_type_no_symmetry)
569
570 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 sym=dbcsr_type_no_symmetry)
573
574 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 sym=dbcsr_type_no_symmetry)
577
578 IF (qs_ot_env%settings%ot_method == "DIIS") THEN
579 CALL dbcsr_allocate_matrix_set(qs_ot_env%rot_mat_h_e, m_diis)
580 CALL dbcsr_allocate_matrix_set(qs_ot_env%rot_mat_h_x, m_diis)
581 DO i = 1, m_diis
582 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 sym=dbcsr_type_no_symmetry)
585
586 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 sym=dbcsr_type_no_symmetry)
589 END DO
590 END IF
591
592 ALLOCATE (qs_ot_env%rot_mat_evals(k))
593 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 sym=dbcsr_type_no_symmetry)
596 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 sym=dbcsr_type_no_symmetry)
599
600 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 sym=dbcsr_type_no_symmetry)
603
604 IF (qs_ot_env%use_gx_old) THEN
605 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 sym=dbcsr_type_no_symmetry)
608 END IF
609
610 IF (qs_ot_env%use_dx) THEN
611 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 sym=dbcsr_type_no_symmetry)
614 END IF
615
616 END IF
617
618 IF (qs_ot_env%settings%do_ener) THEN
619 ncoef = k
620 ALLOCATE (qs_ot_env%ener_x(ncoef))
621
622 IF (qs_ot_env%settings%ot_method == "DIIS") THEN
623 ALLOCATE (qs_ot_env%ener_h_e(m_diis, ncoef))
624 ALLOCATE (qs_ot_env%ener_h_x(m_diis, ncoef))
625 END IF
626
627 ALLOCATE (qs_ot_env%ener_gx(ncoef))
628
629 IF (qs_ot_env%use_gx_old) THEN
630 ALLOCATE (qs_ot_env%ener_gx_old(ncoef))
631 END IF
632
633 IF (qs_ot_env%use_dx) THEN
634 ALLOCATE (qs_ot_env%ener_dx(ncoef))
635 qs_ot_env%ener_dx = 0.0_dp
636 END IF
637 END IF
638
639 END SUBROUTINE qs_ot_allocate
640
641! **************************************************************************************************
642!> \brief deallocates data
643!> \param qs_ot_env ...
644! **************************************************************************************************
645 SUBROUTINE qs_ot_destroy(qs_ot_env)
646 TYPE(qs_ot_type) :: qs_ot_env
647
648 CALL mp_para_env_release(qs_ot_env%para_env)
649 CALL cp_blacs_env_release(qs_ot_env%blacs_env)
650
651 DEALLOCATE (qs_ot_env%evals)
652 DEALLOCATE (qs_ot_env%dum)
653
654 IF (ASSOCIATED(qs_ot_env%matrix_os)) CALL dbcsr_release_p(qs_ot_env%matrix_os)
655 IF (ASSOCIATED(qs_ot_env%matrix_p)) CALL dbcsr_release_p(qs_ot_env%matrix_p)
656 IF (ASSOCIATED(qs_ot_env%matrix_cosp)) CALL dbcsr_release_p(qs_ot_env%matrix_cosp)
657 IF (ASSOCIATED(qs_ot_env%matrix_sinp)) CALL dbcsr_release_p(qs_ot_env%matrix_sinp)
658 IF (ASSOCIATED(qs_ot_env%matrix_r)) CALL dbcsr_release_p(qs_ot_env%matrix_r)
659 IF (ASSOCIATED(qs_ot_env%matrix_cosp_b)) CALL dbcsr_release_p(qs_ot_env%matrix_cosp_b)
660 IF (ASSOCIATED(qs_ot_env%matrix_sinp_b)) CALL dbcsr_release_p(qs_ot_env%matrix_sinp_b)
661 IF (ASSOCIATED(qs_ot_env%matrix_buf1)) CALL dbcsr_release_p(qs_ot_env%matrix_buf1)
662 IF (ASSOCIATED(qs_ot_env%matrix_buf2)) CALL dbcsr_release_p(qs_ot_env%matrix_buf2)
663 IF (ASSOCIATED(qs_ot_env%matrix_buf3)) CALL dbcsr_release_p(qs_ot_env%matrix_buf3)
664 IF (ASSOCIATED(qs_ot_env%matrix_buf4)) CALL dbcsr_release_p(qs_ot_env%matrix_buf4)
665 IF (ASSOCIATED(qs_ot_env%matrix_buf1_ortho)) CALL dbcsr_release_p(qs_ot_env%matrix_buf1_ortho)
666 IF (ASSOCIATED(qs_ot_env%matrix_buf2_ortho)) CALL dbcsr_release_p(qs_ot_env%matrix_buf2_ortho)
667 IF (ASSOCIATED(qs_ot_env%matrix_c0)) CALL dbcsr_release_p(qs_ot_env%matrix_c0)
668 IF (ASSOCIATED(qs_ot_env%matrix_sc0)) CALL dbcsr_release_p(qs_ot_env%matrix_sc0)
669 IF (ASSOCIATED(qs_ot_env%matrix_psc0)) CALL dbcsr_release_p(qs_ot_env%matrix_psc0)
670 IF (ASSOCIATED(qs_ot_env%matrix_x)) CALL dbcsr_release_p(qs_ot_env%matrix_x)
671 IF (ASSOCIATED(qs_ot_env%matrix_sx)) CALL dbcsr_release_p(qs_ot_env%matrix_sx)
672 IF (ASSOCIATED(qs_ot_env%matrix_gx)) CALL dbcsr_release_p(qs_ot_env%matrix_gx)
673 IF (ASSOCIATED(qs_ot_env%matrix_dx)) CALL dbcsr_release_p(qs_ot_env%matrix_dx)
674 IF (ASSOCIATED(qs_ot_env%matrix_gx_old)) CALL dbcsr_release_p(qs_ot_env%matrix_gx_old)
675 IF (ASSOCIATED(qs_ot_env%buf1_k_k_nosym)) CALL dbcsr_release_p(qs_ot_env%buf1_k_k_nosym)
676 IF (ASSOCIATED(qs_ot_env%buf2_k_k_nosym)) CALL dbcsr_release_p(qs_ot_env%buf2_k_k_nosym)
677 IF (ASSOCIATED(qs_ot_env%buf3_k_k_nosym)) CALL dbcsr_release_p(qs_ot_env%buf3_k_k_nosym)
678 IF (ASSOCIATED(qs_ot_env%buf4_k_k_nosym)) CALL dbcsr_release_p(qs_ot_env%buf4_k_k_nosym)
679 IF (ASSOCIATED(qs_ot_env%p_k_k_sym)) CALL dbcsr_release_p(qs_ot_env%p_k_k_sym)
680 IF (ASSOCIATED(qs_ot_env%buf1_k_k_sym)) CALL dbcsr_release_p(qs_ot_env%buf1_k_k_sym)
681 IF (ASSOCIATED(qs_ot_env%buf2_k_k_sym)) CALL dbcsr_release_p(qs_ot_env%buf2_k_k_sym)
682 IF (ASSOCIATED(qs_ot_env%buf3_k_k_sym)) CALL dbcsr_release_p(qs_ot_env%buf3_k_k_sym)
683 IF (ASSOCIATED(qs_ot_env%buf4_k_k_sym)) CALL dbcsr_release_p(qs_ot_env%buf4_k_k_sym)
684 IF (ASSOCIATED(qs_ot_env%buf1_n_k)) CALL dbcsr_release_p(qs_ot_env%buf1_n_k)
685 IF (ASSOCIATED(qs_ot_env%buf1_n_k_dp)) CALL dbcsr_release_p(qs_ot_env%buf1_n_k_dp)
686
687 IF (qs_ot_env%settings%ot_method == "DIIS" .OR. &
688 qs_ot_env%settings%ot_method == "BROY") THEN
689 CALL dbcsr_deallocate_matrix_set(qs_ot_env%matrix_h_x)
690 CALL dbcsr_deallocate_matrix_set(qs_ot_env%matrix_h_e)
691 DEALLOCATE (qs_ot_env%ls_diis)
692 DEALLOCATE (qs_ot_env%lss_diis)
693 DEALLOCATE (qs_ot_env%c_diis)
694 DEALLOCATE (qs_ot_env%c_broy)
695 DEALLOCATE (qs_ot_env%energy_h)
696 DEALLOCATE (qs_ot_env%ipivot)
697 END IF
698
699 IF (qs_ot_env%settings%do_rotation) THEN
700
701 IF (ASSOCIATED(qs_ot_env%rot_mat_u)) CALL dbcsr_release_p(qs_ot_env%rot_mat_u)
702 IF (ASSOCIATED(qs_ot_env%rot_mat_x)) CALL dbcsr_release_p(qs_ot_env%rot_mat_x)
703 IF (ASSOCIATED(qs_ot_env%rot_mat_dedu)) CALL dbcsr_release_p(qs_ot_env%rot_mat_dedu)
704 IF (ASSOCIATED(qs_ot_env%rot_mat_chc)) CALL dbcsr_release_p(qs_ot_env%rot_mat_chc)
705
706 IF (qs_ot_env%settings%ot_method == "DIIS") THEN
707 CALL dbcsr_deallocate_matrix_set(qs_ot_env%rot_mat_h_x)
708 CALL dbcsr_deallocate_matrix_set(qs_ot_env%rot_mat_h_e)
709 END IF
710
711 DEALLOCATE (qs_ot_env%rot_mat_evals)
712 IF (ASSOCIATED(qs_ot_env%rot_mat_evec_re)) CALL dbcsr_release_p(qs_ot_env%rot_mat_evec_re)
713 IF (ASSOCIATED(qs_ot_env%rot_mat_evec_im)) CALL dbcsr_release_p(qs_ot_env%rot_mat_evec_im)
714 IF (ASSOCIATED(qs_ot_env%rot_mat_gx)) CALL dbcsr_release_p(qs_ot_env%rot_mat_gx)
715 IF (ASSOCIATED(qs_ot_env%rot_mat_gx_old)) CALL dbcsr_release_p(qs_ot_env%rot_mat_gx_old)
716 IF (ASSOCIATED(qs_ot_env%rot_mat_dx)) CALL dbcsr_release_p(qs_ot_env%rot_mat_dx)
717 END IF
718
719 IF (qs_ot_env%settings%do_ener) THEN
720 DEALLOCATE (qs_ot_env%ener_x)
721 DEALLOCATE (qs_ot_env%ener_gx)
722 IF (qs_ot_env%settings%ot_method == "DIIS") THEN
723 DEALLOCATE (qs_ot_env%ener_h_x)
724 DEALLOCATE (qs_ot_env%ener_h_e)
725 END IF
726 IF (qs_ot_env%use_dx) THEN
727 DEALLOCATE (qs_ot_env%ener_dx)
728 END IF
729 IF (qs_ot_env%use_gx_old) THEN
730 DEALLOCATE (qs_ot_env%ener_gx_old)
731 END IF
732 END IF
733
734 END SUBROUTINE qs_ot_destroy
735
736! **************************************************************************************************
737!> \brief ...
738!> \param settings ...
739!> \param ot_section ...
740!> \param output_unit ...
741! **************************************************************************************************
742 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 CALL timeset(routinen, handle)
753
754 ! choose algorithm
755 CALL section_vals_val_get(ot_section, "ALGORITHM", i_val=ot_algorithm)
756 SELECT CASE (ot_algorithm)
758 settings%ot_algorithm = "TOD"
759 CASE (ot_algo_irac)
760 CALL cite_reference(weber2008)
761 settings%ot_algorithm = "REF"
762 CASE DEFAULT
763 cpabort("Value unknown")
764 END SELECT
765
766 ! irac input
767 CALL section_vals_val_get(ot_section, "IRAC_DEGREE", i_val=settings%irac_degree)
768 IF (settings%irac_degree < 2 .OR. settings%irac_degree > 4) THEN
769 cpabort("READ OT IRAC_DEGREE: Value unknown")
770 END IF
771 CALL section_vals_val_get(ot_section, "MAX_IRAC", i_val=settings%max_irac)
772 IF (settings%max_irac < 1) THEN
773 cpabort("READ OT MAX_IRAC: VALUE MUST BE GREATER THAN ZERO")
774 END IF
775 CALL section_vals_val_get(ot_section, "EPS_IRAC_FILTER_MATRIX", r_val=settings%eps_irac_filter_matrix)
776 CALL section_vals_val_get(ot_section, "EPS_IRAC", r_val=settings%eps_irac)
777 IF (settings%eps_irac < 0.0_dp) THEN
778 cpabort("READ OT EPS_IRAC: VALUE MUST BE GREATER THAN ZERO")
779 END IF
780 CALL section_vals_val_get(ot_section, "EPS_IRAC_QUICK_EXIT", r_val=settings%eps_irac_quick_exit)
781 IF (settings%eps_irac_quick_exit < 0.0_dp) THEN
782 cpabort("READ OT EPS_IRAC_QUICK_EXIT: VALUE MUST BE GREATER THAN ZERO")
783 END IF
784
785 CALL section_vals_val_get(ot_section, "EPS_IRAC_SWITCH", r_val=settings%eps_irac_switch)
786 IF (settings%eps_irac_switch < 0.0_dp) THEN
787 cpabort("READ OT EPS_IRAC_SWITCH: VALUE MUST BE GREATER THAN ZERO")
788 END IF
789
790 CALL section_vals_val_get(ot_section, "ORTHO_IRAC", i_val=ot_ortho_irac)
791 SELECT CASE (ot_ortho_irac)
792 CASE (ot_chol_irac)
793 settings%ortho_irac = "CHOL"
794 CASE (ot_poly_irac)
795 settings%ortho_irac = "POLY"
796 CASE (ot_lwdn_irac)
797 settings%ortho_irac = "LWDN"
798 CASE DEFAULT
799 cpabort("READ OT ORTHO_IRAC: Value unknown")
800 END SELECT
801
802 CALL section_vals_val_get(ot_section, "ON_THE_FLY_LOC", l_val=settings%on_the_fly_loc)
803
804 CALL section_vals_val_get(ot_section, "MINIMIZER", i_val=ot_method)
805 ! overwrite input if ot_state is set
806 IF (settings%ot_state == 1) THEN
807 ot_method = ot_mini_diis
808 END IF
809 ! compatibility
810 SELECT CASE (ot_method)
811 CASE (ot_mini_sd)
812 settings%ot_method = "SD"
813 CASE (ot_mini_cg)
814 settings%ot_method = "CG"
815 CASE (ot_mini_diis)
816 settings%ot_method = "DIIS"
817 CALL section_vals_val_get(ot_section, "N_HISTORY_VEC", i_val=settings%diis_m)
818 CASE (ot_mini_broyden)
819 CALL section_vals_val_get(ot_section, "N_HISTORY_VEC", i_val=settings%diis_m)
820 CALL section_vals_val_get(ot_section, "BROYDEN_BETA", r_val=settings%broyden_beta)
821 CALL section_vals_val_get(ot_section, "BROYDEN_GAMMA", r_val=settings%broyden_gamma)
822 CALL section_vals_val_get(ot_section, "BROYDEN_SIGMA", r_val=settings%broyden_sigma)
823 CALL section_vals_val_get(ot_section, "BROYDEN_ETA", r_val=settings%broyden_eta)
824 CALL section_vals_val_get(ot_section, "BROYDEN_OMEGA", r_val=settings%broyden_omega)
825 CALL section_vals_val_get(ot_section, "BROYDEN_SIGMA_DECREASE", r_val=settings%broyden_sigma_decrease)
826 CALL section_vals_val_get(ot_section, "BROYDEN_SIGMA_MIN", r_val=settings%broyden_sigma_min)
827 CALL section_vals_val_get(ot_section, "BROYDEN_FORGET_HISTORY", l_val=settings%broyden_forget_history)
828 CALL section_vals_val_get(ot_section, "BROYDEN_ADAPTIVE_SIGMA", l_val=settings%broyden_adaptive_sigma)
829 CALL section_vals_val_get(ot_section, "BROYDEN_ENABLE_FLIP", l_val=settings%broyden_enable_flip)
830 settings%ot_method = "BROY"
831 CASE DEFAULT
832 cpabort("READ OTSCF MINIMIZER: Value unknown")
833 END SELECT
834 CALL section_vals_val_get(ot_section, "SAFER_DIIS", l_val=settings%safer_diis)
835 CALL section_vals_val_get(ot_section, "LINESEARCH", i_val=ls_method)
836 SELECT CASE (ls_method)
837 CASE (ls_none)
838 settings%line_search_method = "NONE"
839 CASE (ls_2pnt)
840 settings%line_search_method = "2PNT"
841 CASE (ls_3pnt)
842 settings%line_search_method = "3PNT"
843 CASE (ls_adapt)
844 settings%line_search_method = "ADPT"
845 CASE (ls_gold)
846 settings%line_search_method = "GOLD"
847 CALL section_vals_val_get(ot_section, "GOLD_TARGET", r_val=settings%gold_target)
848 CASE DEFAULT
849 cpabort("READ OTSCF LS: Value unknown")
850 END SELECT
851
852 CALL section_vals_val_get(ot_section, "PRECOND_SOLVER", i_val=settings%precond_solver_type)
853 SELECT CASE (settings%precond_solver_type)
855 settings%precond_solver_name = "DEFAULT"
857 settings%precond_solver_name = "INVERSE_CHOLESKY"
859 settings%precond_solver_name = "DIRECT"
861 settings%precond_solver_name = "INVERSE_UPDATE"
862 CASE DEFAULT
863 cpabort("READ OTSCF SOLVER: Value unknown")
864 END SELECT
865
866 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 CALL section_vals_val_get(ot_section, "STEPSIZE", r_val=settings%ds_min)
870 CALL section_vals_val_get(ot_section, "ENERGY_GAP", r_val=settings%energy_gap)
871
872 CALL section_vals_val_get(ot_section, "PRECONDITIONER", i_val=settings%preconditioner_type)
873 SELECT CASE (settings%preconditioner_type)
874 CASE (ot_precond_none)
875 settings%preconditioner_name = "NONE"
876 IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.15_dp
877 IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.2_dp
879 settings%preconditioner_name = "FULL_SINGLE"
880 IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.15_dp
881 IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.2_dp
883 settings%preconditioner_name = "FULL_SINGLE_INVERSE"
884 IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.08_dp
885 IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.08_dp
887 settings%preconditioner_name = "FULL_ALL"
888 IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.15_dp
889 IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.08_dp
891 settings%preconditioner_name = "FULL_KINETIC"
892 IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.15_dp
893 IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.2_dp
895 settings%preconditioner_name = "FULL_S_INVERSE"
896 IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.15_dp
897 IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.2_dp
898 CASE DEFAULT
899 cpabort("READ OTSCF PRECONDITIONER: Value unknown")
900 END SELECT
901 CALL section_vals_val_get(ot_section, "CHOLESKY", i_val=settings%cholesky_type)
902 CALL section_vals_val_get(ot_section, "EPS_TAYLOR", r_val=settings%eps_taylor)
903 CALL section_vals_val_get(ot_section, "MAX_TAYLOR", i_val=settings%max_taylor)
904 CALL section_vals_val_get(ot_section, "ROTATION", l_val=settings%do_rotation)
905 CALL section_vals_val_get(ot_section, "ENERGIES", l_val=settings%do_ener)
906 CALL section_vals_val_get(ot_section, "OCCUPATION_PRECONDITIONER", &
907 l_val=settings%occupation_preconditioner)
908 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 r_val=settings%nondiag_energy_strength)
911 ! not yet fully implemented
912 cpassert(.NOT. settings%do_ener)
913
914 ! write OT output
915
916 IF (output_unit > 0) THEN
917 WRITE (output_unit, '(/,A)') " ----------------------------------- OT ---------------------------------------"
918 IF (settings%do_rotation) THEN
919 WRITE (output_unit, '(A)') " Allowing for rotations "
920 END IF
921 IF (settings%do_ener) THEN
922 WRITE (output_unit, '(A,L2)') " Optimizing orbital energies "
923 END IF
924 SELECT CASE (settings%OT_METHOD)
925 CASE ("SD")
926 WRITE (output_unit, '(A)') " Minimizer : SD : steepest descent"
927 CASE ("CG")
928 WRITE (output_unit, '(A)') " Minimizer : CG : conjugate gradient"
929 CASE ("DIIS")
930 WRITE (output_unit, '(A)') " Minimizer : DIIS : direct inversion"
931 WRITE (output_unit, '(A)') " in the iterative subspace"
932 WRITE (output_unit, '(A,I3,A)') " using ", settings%diis_m, " DIIS vectors"
933 IF (settings%safer_diis) THEN
934 WRITE (output_unit, '(A,I3,A)') " safer DIIS on"
935 ELSE
936 WRITE (output_unit, '(A,I3,A)') " safer DIIS off"
937 END IF
938 CASE ("BROY")
939 WRITE (output_unit, '(A)') " Minimizer : BROYDEN : Broyden "
940 WRITE (output_unit, '(A,F16.8)') " BETA : ", settings%broyden_beta
941 WRITE (output_unit, '(A,F16.8)') " GAMMA : ", settings%broyden_gamma
942 WRITE (output_unit, '(A,F16.8)') " SIGMA : ", settings%broyden_sigma
943 WRITE (output_unit, '(A,I3,A)') " using : - ", &
944 settings%diis_m, " BROYDEN vectors"
945 CASE DEFAULT
946 WRITE (output_unit, '(3A)') " Minimizer : ", settings%OT_METHOD, " : UNKNOWN"
947 END SELECT
948 SELECT CASE (settings%preconditioner_name)
949 CASE ("FULL_SINGLE")
950 WRITE (output_unit, '(A)') " Preconditioner : FULL_SINGLE : diagonalization based"
951 CASE ("FULL_SINGLE_INVERSE")
952 WRITE (output_unit, '(A,/,A)') " Preconditioner : FULL_SINGLE_INVERSE : inversion of ", &
953 " H + eS - 2*(Sc)(c^T*H*c+const)(Sc)^T"
954 CASE ("FULL_ALL")
955 WRITE (output_unit, '(A)') " Preconditioner : FULL_ALL : diagonalization, state selective"
956 CASE ("FULL_KINETIC")
957 WRITE (output_unit, '(A)') " Preconditioner : FULL_KINETIC : inversion of T + eS"
958 CASE ("FULL_S_INVERSE")
959 WRITE (output_unit, '(A)') " Preconditioner : FULL_S_INVERSE : cholesky inversion of S"
960 CASE ("SPARSE_DIAG")
961 WRITE (output_unit, '(A)') &
962 " Preconditioner : SPARSE_DIAG : diagonal atomic block diagonalization"
963 CASE ("SPARSE_KINETIC")
964 WRITE (output_unit, '(A)') " Preconditioner : SPARSE_KINETIC : sparse linear solver for T + eS"
965 CASE ("NONE")
966 WRITE (output_unit, '(A)') " Preconditioner : NONE"
967 CASE DEFAULT
968 WRITE (output_unit, '(3A)') " Preconditioner : ", settings%preconditioner_name, " : UNKNOWN"
969 END SELECT
970
971 WRITE (output_unit, '(A)') " Precond_solver : "//trim(settings%precond_solver_name)
972
973 IF (settings%OT_METHOD == "SD" .OR. settings%OT_METHOD == "CG") THEN
974 SELECT CASE (settings%line_search_method)
975 CASE ("2PNT")
976 WRITE (output_unit, '(A)') " Line search : 2PNT : 2 energies, one gradient"
977 CASE ("3PNT")
978 WRITE (output_unit, '(A)') " Line search : 3PNT : 3 energies"
979 CASE ("GOLD")
980 WRITE (output_unit, '(A)') " Line search : GOLD : bracketing and golden section search"
981 WRITE (output_unit, '(A,F14.8)') " target rel accuracy : ", settings%gold_target
982 CASE ("NONE")
983 WRITE (output_unit, '(A)') " Line search : NONE"
984 CASE DEFAULT
985 WRITE (output_unit, '(3A)') " Line search : ", settings%line_search_method, " : UNKNOWN"
986 END SELECT
987 END IF
988 WRITE (output_unit, '(A,F14.8,T49,A,F14.8)') " stepsize :", settings%ds_min, &
989 " energy_gap :", settings%energy_gap
990 IF (settings%ot_algorithm == 'TOD') THEN
991 WRITE (output_unit, '(A,E14.5,T49,A,I14)') " eps_taylor :", settings%eps_taylor, &
992 " max_taylor :", settings%max_taylor
993 END IF
994 IF (settings%ot_algorithm == 'REF') THEN
995 WRITE (output_unit, '(A,1X,A,T49,A,I14)') " ortho_irac :", settings%ortho_irac, &
996 " irac_degree :", settings%irac_degree
997 WRITE (output_unit, '(A,I14,T49,A,E14.5)') " max_irac :", settings%max_irac, &
998 " eps_irac :", settings%eps_irac
999 WRITE (output_unit, '(A,E14.5,T49,A,E10.3)') " eps_irac_switch:", settings%eps_irac_switch, &
1000 " eps_irac_quick_exit:", settings%eps_irac_quick_exit
1001 WRITE (output_unit, '(A,L2)') " on_the_fly_loc :", settings%on_the_fly_loc
1002 END IF
1003 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 "Step", "Update method", "Time", "Convergence", "Total energy", "Change", &
1007 repeat("-", 78)
1008 END IF
1009
1010 CALL timestop(handle)
1011
1012 END SUBROUTINE ot_readwrite_input
1013
1014END 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_init_p(matrix)
...
subroutine, public dbcsr_set(matrix, alpha)
...
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
collects all constants needed in input so that they can be used without circular dependencies
integer, parameter, public ls_adapt
integer, parameter, public ot_chol_irac
integer, parameter, public ls_3pnt
integer, parameter, public ot_algo_irac
integer, parameter, public ot_algo_taylor_or_diag
integer, parameter, public ot_poly_irac
integer, parameter, public ot_mini_cg
integer, parameter, public ot_precond_full_kinetic
integer, parameter, public cholesky_reduce
integer, parameter, public ot_mini_diis
integer, parameter, public ot_precond_solver_default
integer, parameter, public ot_precond_full_single
integer, parameter, public ot_precond_solver_inv_chol
integer, parameter, public ot_precond_none
integer, parameter, public ls_2pnt
integer, parameter, public ls_none
integer, parameter, public ot_precond_full_single_inverse
integer, parameter, public ot_lwdn_irac
integer, parameter, public ls_gold
integer, parameter, public do_taylor
integer, parameter, public ot_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
subroutine, public qs_ot_allocate(qs_ot_env, matrix_s, fm_struct_ref, ortho_k)
allocates the data in qs_ot_env, for a calculation with fm_struct_ref ortho_k allows for specifying a...
subroutine, public qs_ot_settings_init(settings)
sets default values for the settings type
subroutine, public qs_ot_destroy(qs_ot_env)
deallocates data
subroutine, public ot_readwrite_input(settings, ot_section, output_unit)
...
represent a blacs multidimensional parallel environment (for the mpi corrispective see cp_paratypes/m...
keeps the information about the structure of a full matrix
stores all the informations relevant to an mpi environment
notice, this variable needs to be copyable, needed for spins as e.g. in qs_ot_scf
Definition qs_ot_types.F:63