27 USE dbcsr_api,
ONLY: dbcsr_init_p,&
32 dbcsr_type_complex_default,&
33 dbcsr_type_no_symmetry,&
48 #include "./base/base_uses.f90"
55 PUBLIC :: qs_ot_settings_type
65 TYPE qs_ot_settings_type
66 LOGICAL :: do_rotation, do_ener
68 CHARACTER(LEN=4) :: ot_method
69 CHARACTER(LEN=3) :: ot_algorithm
70 CHARACTER(LEN=4) :: line_search_method
71 CHARACTER(LEN=20) :: preconditioner_name
72 INTEGER :: preconditioner_type
73 INTEGER :: cholesky_type
74 CHARACTER(LEN=20) :: precond_solver_name
75 INTEGER :: precond_solver_type
77 REAL(KIND=
dp) :: ds_min
78 REAL(KIND=
dp) :: energy_gap
80 REAL(KIND=
dp) :: gold_target
81 REAL(KIND=
dp) :: eps_taylor
83 INTEGER :: irac_degree
85 REAL(KIND=
dp) :: eps_irac
86 REAL(KIND=
dp) :: eps_irac_quick_exit
87 REAL(dp) :: eps_irac_filter_matrix
88 REAL(KIND=dp) :: eps_irac_switch
89 LOGICAL :: on_the_fly_loc
90 CHARACTER(LEN=4) :: ortho_irac
91 LOGICAL :: occupation_preconditioner, add_nondiag_energy
92 REAL(KIND=dp) :: nondiag_energy_strength
93 REAL(KIND=dp) :: broyden_beta, broyden_gamma, broyden_sigma
94 REAL(KIND=dp) :: broyden_eta, broyden_omega, broyden_sigma_decrease
95 REAL(KIND=dp) :: broyden_sigma_min
96 LOGICAL :: broyden_forget_history, broyden_adaptive_sigma
97 LOGICAL :: broyden_enable_flip
98 END TYPE qs_ot_settings_type
103 TYPE(qs_ot_settings_type) :: settings
104 LOGICAL :: restricted
110 TYPE(preconditioner_type),
POINTER :: preconditioner
115 TYPE(dbcsr_type),
POINTER :: matrix_p
116 TYPE(dbcsr_type),
POINTER :: matrix_r
117 TYPE(dbcsr_type),
POINTER :: matrix_sinp
118 TYPE(dbcsr_type),
POINTER :: matrix_cosp
119 TYPE(dbcsr_type),
POINTER :: matrix_sinp_b
120 TYPE(dbcsr_type),
POINTER :: matrix_cosp_b
121 TYPE(dbcsr_type),
POINTER :: matrix_buf1
122 TYPE(dbcsr_type),
POINTER :: matrix_buf2
123 TYPE(dbcsr_type),
POINTER :: matrix_buf3
124 TYPE(dbcsr_type),
POINTER :: matrix_buf4
125 TYPE(dbcsr_type),
POINTER :: matrix_os
126 TYPE(dbcsr_type),
POINTER :: matrix_buf1_ortho
127 TYPE(dbcsr_type),
POINTER :: matrix_buf2_ortho
129 REAL(KIND=
dp),
DIMENSION(:),
POINTER :: evals
130 REAL(KIND=
dp),
DIMENSION(:),
POINTER :: dum
136 TYPE(mp_para_env_type),
POINTER :: para_env
137 TYPE(cp_blacs_env_type),
POINTER :: blacs_env
140 TYPE(dbcsr_type),
POINTER :: matrix_c0, matrix_sc0, matrix_psc0
143 TYPE(dbcsr_type),
POINTER :: buf1_k_k_nosym, buf2_k_k_nosym, &
144 buf3_k_k_nosym, buf4_k_k_nosym, &
145 buf1_k_k_sym, buf2_k_k_sym, buf3_k_k_sym, buf4_k_k_sym, &
146 p_k_k_sym, buf1_n_k, buf1_n_k_dp
150 TYPE(dbcsr_type),
POINTER :: matrix_x, matrix_sx, matrix_gx
151 TYPE(dbcsr_type),
POINTER :: matrix_dx, matrix_gx_old
153 LOGICAL :: use_gx_old, use_dx
155 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_h_e, matrix_h_x
157 REAL(KIND=
dp),
DIMENSION(:, :),
POINTER :: ls_diis
158 REAL(KIND=
dp),
DIMENSION(:, :),
POINTER :: lss_diis
159 REAL(KIND=
dp),
DIMENSION(:),
POINTER :: c_diis
160 REAL(KIND=
dp),
DIMENSION(:),
POINTER :: c_broy
161 REAL(KIND=
dp),
DIMENSION(:),
POINTER :: energy_h
162 INTEGER,
DIMENSION(:),
POINTER :: ipivot
164 REAL(KIND=
dp) :: ot_pos(53), ot_energy(53), ot_grad(53)
165 INTEGER :: line_search_left, line_search_right, line_search_mid
166 INTEGER :: line_search_count
167 LOGICAL :: line_search_might_be_done
168 REAL(KIND=
dp) :: delta, gnorm, gnorm_old, etotal, gradient
169 LOGICAL :: energy_only
171 CHARACTER(LEN=8) :: OT_METHOD_FULL
173 REAL(KIND=
dp) :: ds_min
174 REAL(KIND=
dp) :: broyden_adaptive_sigma
177 INTEGER :: taylor_order
178 REAL(KIND=
dp) :: largest_eval_upper_bound
181 TYPE(dbcsr_type),
POINTER :: rot_mat_u
182 TYPE(dbcsr_type),
POINTER :: rot_mat_x
183 TYPE(dbcsr_type),
POINTER :: rot_mat_dedu
184 TYPE(dbcsr_type),
POINTER :: rot_mat_chc
186 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: rot_mat_h_e
187 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: rot_mat_h_x
188 TYPE(dbcsr_type),
POINTER :: rot_mat_gx
189 TYPE(dbcsr_type),
POINTER :: rot_mat_gx_old
190 TYPE(dbcsr_type),
POINTER :: rot_mat_dx
192 REAL(KIND=
dp),
DIMENSION(:),
POINTER :: rot_mat_evals
193 TYPE(dbcsr_type),
POINTER :: rot_mat_evec
196 REAL(KIND=
dp),
POINTER,
DIMENSION(:) :: ener_x
197 REAL(KIND=
dp),
POINTER,
DIMENSION(:) :: ener_dx
198 REAL(KIND=
dp),
POINTER,
DIMENSION(:) :: ener_gx
199 REAL(KIND=
dp),
POINTER,
DIMENSION(:) :: ener_gx_old
200 REAL(KIND=
dp),
POINTER,
DIMENSION(:, :) :: ener_h_e
201 REAL(KIND=
dp),
POINTER,
DIMENSION(:, :) :: ener_h_x
204 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_ot_types'
215 TYPE(qs_ot_settings_type) :: settings
217 settings%ot_method =
"CG"
218 settings%ot_algorithm =
"TOD"
220 settings%preconditioner_name =
"FULL_KINETIC"
223 settings%precond_solver_name =
"CHOLESKY_INVERSE"
225 settings%line_search_method =
"2PNT"
226 settings%ds_min = 0.15_dp
227 settings%safer_diis = .true.
228 settings%energy_gap = 0.2_dp
229 settings%eps_taylor = 1.0e-16_dp
230 settings%max_taylor = 4
231 settings%gold_target = 0.01_dp
232 settings%do_rotation = .false.
233 settings%do_ener = .false.
234 settings%irac_degree = 4
235 settings%max_irac = 50
236 settings%eps_irac = 1.0e-10_dp
237 settings%eps_irac_quick_exit = 1.0e-5_dp
238 settings%eps_irac_switch = 1.0e-2
239 settings%eps_irac_filter_matrix = 0.0_dp
240 settings%on_the_fly_loc = .false.
241 settings%ortho_irac =
"CHOL"
243 settings%occupation_preconditioner = .false.
244 settings%add_nondiag_energy = .false.
245 settings%nondiag_energy_strength = 0.0_dp
254 TYPE(qs_ot_type) :: qs_ot_env
256 qs_ot_env%OT_energy(:) = 0.0_dp
257 qs_ot_env%OT_pos(:) = 0.0_dp
258 qs_ot_env%OT_grad(:) = 0.0_dp
259 qs_ot_env%line_search_count = 0
261 qs_ot_env%energy_only = .false.
262 qs_ot_env%gnorm_old = 1.0_dp
263 qs_ot_env%diis_iter = 0
264 qs_ot_env%ds_min = qs_ot_env%settings%ds_min
265 qs_ot_env%os_valid = .false.
267 CALL dbcsr_set(qs_ot_env%matrix_gx, 0.0_dp)
269 IF (qs_ot_env%use_dx) &
270 CALL dbcsr_set(qs_ot_env%matrix_dx, 0.0_dp)
272 IF (qs_ot_env%use_gx_old) &
273 CALL dbcsr_set(qs_ot_env%matrix_gx_old, 0.0_dp)
275 IF (qs_ot_env%settings%do_rotation)
THEN
276 CALL dbcsr_set(qs_ot_env%rot_mat_gx, 0.0_dp)
277 IF (qs_ot_env%use_dx) &
278 CALL dbcsr_set(qs_ot_env%rot_mat_dx, 0.0_dp)
279 IF (qs_ot_env%use_gx_old) &
280 CALL dbcsr_set(qs_ot_env%rot_mat_gx_old, 0.0_dp)
282 IF (qs_ot_env%settings%do_ener)
THEN
283 qs_ot_env%ener_gx(:) = 0.0_dp
284 IF (qs_ot_env%use_dx) &
285 qs_ot_env%ener_dx(:) = 0.0_dp
286 IF (qs_ot_env%use_gx_old) &
287 qs_ot_env%ener_gx_old(:) = 0.0_dp
303 TYPE(qs_ot_type) :: qs_ot_env
304 TYPE(dbcsr_type),
POINTER :: matrix_s
305 TYPE(cp_fm_struct_type),
POINTER :: fm_struct_ref
306 INTEGER,
OPTIONAL :: ortho_k
308 INTEGER :: i, k, m_diis, my_ortho_k, n, ncoef
309 TYPE(cp_blacs_env_type),
POINTER :: context
310 TYPE(mp_para_env_type),
POINTER :: para_env
314 NULLIFY (qs_ot_env%preconditioner)
315 NULLIFY (qs_ot_env%matrix_psc0)
316 NULLIFY (qs_ot_env%para_env)
317 NULLIFY (qs_ot_env%blacs_env)
320 para_env=para_env, context=context)
322 qs_ot_env%para_env => para_env
323 qs_ot_env%blacs_env => context
324 CALL para_env%retain()
325 CALL context%retain()
327 IF (
PRESENT(ortho_k))
THEN
333 m_diis = qs_ot_env%settings%diis_m
335 qs_ot_env%use_gx_old = .false.
336 qs_ot_env%use_dx = .false.
338 SELECT CASE (qs_ot_env%settings%ot_method)
342 qs_ot_env%use_gx_old = .true.
343 qs_ot_env%use_dx = .true.
344 CASE (
"DIIS",
"BROY")
345 IF (m_diis .LT. 1) cpabort(
"m_diis less than one")
347 cpabort(
"Unknown option")
350 IF (qs_ot_env%settings%ot_method .EQ.
"DIIS" .OR. &
351 qs_ot_env%settings%ot_method .EQ.
"BROY")
THEN
352 ALLOCATE (qs_ot_env%ls_diis(m_diis + 1, m_diis + 1))
353 qs_ot_env%ls_diis = 0.0_dp
354 ALLOCATE (qs_ot_env%lss_diis(m_diis + 1, m_diis + 1))
355 ALLOCATE (qs_ot_env%c_diis(m_diis + 1))
356 ALLOCATE (qs_ot_env%c_broy(m_diis))
357 ALLOCATE (qs_ot_env%energy_h(m_diis))
358 ALLOCATE (qs_ot_env%ipivot(m_diis + 1))
361 ALLOCATE (qs_ot_env%evals(k))
362 ALLOCATE (qs_ot_env%dum(k))
364 NULLIFY (qs_ot_env%matrix_os)
365 NULLIFY (qs_ot_env%matrix_buf1_ortho)
366 NULLIFY (qs_ot_env%matrix_buf2_ortho)
367 NULLIFY (qs_ot_env%matrix_p)
368 NULLIFY (qs_ot_env%matrix_r)
369 NULLIFY (qs_ot_env%matrix_sinp)
370 NULLIFY (qs_ot_env%matrix_cosp)
371 NULLIFY (qs_ot_env%matrix_sinp_b)
372 NULLIFY (qs_ot_env%matrix_cosp_b)
373 NULLIFY (qs_ot_env%matrix_buf1)
374 NULLIFY (qs_ot_env%matrix_buf2)
375 NULLIFY (qs_ot_env%matrix_buf3)
376 NULLIFY (qs_ot_env%matrix_buf4)
377 NULLIFY (qs_ot_env%matrix_c0)
378 NULLIFY (qs_ot_env%matrix_sc0)
379 NULLIFY (qs_ot_env%matrix_x)
380 NULLIFY (qs_ot_env%matrix_sx)
381 NULLIFY (qs_ot_env%matrix_gx)
382 NULLIFY (qs_ot_env%matrix_gx_old)
383 NULLIFY (qs_ot_env%matrix_dx)
384 NULLIFY (qs_ot_env%buf1_k_k_nosym)
385 NULLIFY (qs_ot_env%buf2_k_k_nosym)
386 NULLIFY (qs_ot_env%buf3_k_k_nosym)
387 NULLIFY (qs_ot_env%buf4_k_k_nosym)
388 NULLIFY (qs_ot_env%buf1_k_k_sym)
389 NULLIFY (qs_ot_env%buf2_k_k_sym)
390 NULLIFY (qs_ot_env%buf3_k_k_sym)
391 NULLIFY (qs_ot_env%buf4_k_k_sym)
392 NULLIFY (qs_ot_env%buf1_n_k)
393 NULLIFY (qs_ot_env%buf1_n_k_dp)
394 NULLIFY (qs_ot_env%p_k_k_sym)
397 CALL dbcsr_init_p(qs_ot_env%matrix_c0)
399 sym=dbcsr_type_no_symmetry)
401 CALL dbcsr_init_p(qs_ot_env%matrix_sc0)
403 sym=dbcsr_type_no_symmetry)
405 CALL dbcsr_init_p(qs_ot_env%matrix_x)
407 sym=dbcsr_type_no_symmetry)
409 CALL dbcsr_init_p(qs_ot_env%matrix_sx)
411 sym=dbcsr_type_no_symmetry)
413 CALL dbcsr_init_p(qs_ot_env%matrix_gx)
415 sym=dbcsr_type_no_symmetry, data_type=dbcsr_type_real_8)
417 IF (qs_ot_env%use_dx)
THEN
418 CALL dbcsr_init_p(qs_ot_env%matrix_dx)
420 sym=dbcsr_type_no_symmetry, data_type=dbcsr_type_real_8)
423 IF (qs_ot_env%use_gx_old)
THEN
424 CALL dbcsr_init_p(qs_ot_env%matrix_gx_old)
426 sym=dbcsr_type_no_symmetry, data_type=dbcsr_type_real_8)
429 SELECT CASE (qs_ot_env%settings%ot_algorithm)
431 CALL dbcsr_init_p(qs_ot_env%matrix_p)
433 sym=dbcsr_type_no_symmetry)
435 CALL dbcsr_init_p(qs_ot_env%matrix_r)
437 sym=dbcsr_type_no_symmetry)
439 CALL dbcsr_init_p(qs_ot_env%matrix_sinp)
441 sym=dbcsr_type_no_symmetry)
443 CALL dbcsr_init_p(qs_ot_env%matrix_cosp)
445 sym=dbcsr_type_no_symmetry)
447 CALL dbcsr_init_p(qs_ot_env%matrix_sinp_b)
449 sym=dbcsr_type_no_symmetry)
451 CALL dbcsr_init_p(qs_ot_env%matrix_cosp_b)
453 sym=dbcsr_type_no_symmetry)
455 CALL dbcsr_init_p(qs_ot_env%matrix_buf1)
457 sym=dbcsr_type_no_symmetry)
459 CALL dbcsr_init_p(qs_ot_env%matrix_buf2)
461 sym=dbcsr_type_no_symmetry)
463 CALL dbcsr_init_p(qs_ot_env%matrix_buf3)
465 sym=dbcsr_type_no_symmetry)
467 CALL dbcsr_init_p(qs_ot_env%matrix_buf4)
469 sym=dbcsr_type_no_symmetry)
471 CALL dbcsr_init_p(qs_ot_env%matrix_os)
473 sym=dbcsr_type_no_symmetry)
475 CALL dbcsr_init_p(qs_ot_env%matrix_buf1_ortho)
477 sym=dbcsr_type_no_symmetry)
479 CALL dbcsr_init_p(qs_ot_env%matrix_buf2_ortho)
481 sym=dbcsr_type_no_symmetry)
484 CALL dbcsr_init_p(qs_ot_env%buf1_k_k_nosym)
486 sym=dbcsr_type_no_symmetry)
488 CALL dbcsr_init_p(qs_ot_env%buf2_k_k_nosym)
490 sym=dbcsr_type_no_symmetry)
492 CALL dbcsr_init_p(qs_ot_env%buf3_k_k_nosym)
494 sym=dbcsr_type_no_symmetry)
496 CALL dbcsr_init_p(qs_ot_env%buf4_k_k_nosym)
498 sym=dbcsr_type_no_symmetry)
501 CALL dbcsr_init_p(qs_ot_env%buf1_k_k_sym)
503 sym=dbcsr_type_no_symmetry)
505 CALL dbcsr_init_p(qs_ot_env%buf2_k_k_sym)
507 sym=dbcsr_type_no_symmetry)
509 CALL dbcsr_init_p(qs_ot_env%buf3_k_k_sym)
511 sym=dbcsr_type_no_symmetry)
513 CALL dbcsr_init_p(qs_ot_env%buf4_k_k_sym)
515 sym=dbcsr_type_no_symmetry)
517 CALL dbcsr_init_p(qs_ot_env%p_k_k_sym)
519 sym=dbcsr_type_no_symmetry)
521 CALL dbcsr_init_p(qs_ot_env%buf1_n_k)
523 sym=dbcsr_type_no_symmetry)
525 CALL dbcsr_init_p(qs_ot_env%matrix_buf1)
527 sym=dbcsr_type_no_symmetry)
531 IF (qs_ot_env%settings%ot_method .EQ.
"DIIS" .OR. &
532 qs_ot_env%settings%ot_method .EQ.
"BROY")
THEN
533 NULLIFY (qs_ot_env%matrix_h_e)
534 NULLIFY (qs_ot_env%matrix_h_x)
538 CALL dbcsr_init_p(qs_ot_env%matrix_h_x(i)%matrix)
540 sym=dbcsr_type_no_symmetry, data_type=dbcsr_type_real_8)
542 CALL dbcsr_init_p(qs_ot_env%matrix_h_e(i)%matrix)
544 sym=dbcsr_type_no_symmetry, data_type=dbcsr_type_real_8)
548 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, &
549 qs_ot_env%rot_mat_gx, qs_ot_env%rot_mat_gx_old, qs_ot_env%rot_mat_dx, &
550 qs_ot_env%rot_mat_evals, qs_ot_env%rot_mat_evec, qs_ot_env%rot_mat_dedu, qs_ot_env%rot_mat_chc)
552 IF (qs_ot_env%settings%do_rotation)
THEN
553 CALL dbcsr_init_p(qs_ot_env%rot_mat_u)
555 sym=dbcsr_type_no_symmetry)
557 CALL dbcsr_init_p(qs_ot_env%rot_mat_x)
559 sym=dbcsr_type_no_symmetry)
561 CALL dbcsr_init_p(qs_ot_env%rot_mat_dedu)
563 sym=dbcsr_type_no_symmetry)
565 CALL dbcsr_init_p(qs_ot_env%rot_mat_chc)
567 sym=dbcsr_type_no_symmetry)
569 IF (qs_ot_env%settings%ot_method .EQ.
"DIIS")
THEN
573 CALL dbcsr_init_p(qs_ot_env%rot_mat_h_e(i)%matrix)
575 sym=dbcsr_type_no_symmetry)
577 CALL dbcsr_init_p(qs_ot_env%rot_mat_h_x(i)%matrix)
579 sym=dbcsr_type_no_symmetry)
583 ALLOCATE (qs_ot_env%rot_mat_evals(k))
585 CALL dbcsr_init_p(qs_ot_env%rot_mat_evec)
587 sym=dbcsr_type_no_symmetry, data_type=dbcsr_type_complex_default)
589 CALL dbcsr_init_p(qs_ot_env%rot_mat_gx)
591 sym=dbcsr_type_no_symmetry)
593 IF (qs_ot_env%use_gx_old)
THEN
594 CALL dbcsr_init_p(qs_ot_env%rot_mat_gx_old)
596 sym=dbcsr_type_no_symmetry)
599 IF (qs_ot_env%use_dx)
THEN
600 CALL dbcsr_init_p(qs_ot_env%rot_mat_dx)
602 sym=dbcsr_type_no_symmetry)
607 IF (qs_ot_env%settings%do_ener)
THEN
609 ALLOCATE (qs_ot_env%ener_x(ncoef))
611 IF (qs_ot_env%settings%ot_method .EQ.
"DIIS")
THEN
612 ALLOCATE (qs_ot_env%ener_h_e(m_diis, ncoef))
613 ALLOCATE (qs_ot_env%ener_h_x(m_diis, ncoef))
616 ALLOCATE (qs_ot_env%ener_gx(ncoef))
618 IF (qs_ot_env%use_gx_old)
THEN
619 ALLOCATE (qs_ot_env%ener_gx_old(ncoef))
622 IF (qs_ot_env%use_dx)
THEN
623 ALLOCATE (qs_ot_env%ener_dx(ncoef))
624 qs_ot_env%ener_dx = 0.0_dp
636 TYPE(qs_ot_type) :: qs_ot_env
641 DEALLOCATE (qs_ot_env%evals)
642 DEALLOCATE (qs_ot_env%dum)
644 IF (
ASSOCIATED(qs_ot_env%matrix_os))
CALL dbcsr_release_p(qs_ot_env%matrix_os)
645 IF (
ASSOCIATED(qs_ot_env%matrix_p))
CALL dbcsr_release_p(qs_ot_env%matrix_p)
646 IF (
ASSOCIATED(qs_ot_env%matrix_cosp))
CALL dbcsr_release_p(qs_ot_env%matrix_cosp)
647 IF (
ASSOCIATED(qs_ot_env%matrix_sinp))
CALL dbcsr_release_p(qs_ot_env%matrix_sinp)
648 IF (
ASSOCIATED(qs_ot_env%matrix_r))
CALL dbcsr_release_p(qs_ot_env%matrix_r)
649 IF (
ASSOCIATED(qs_ot_env%matrix_cosp_b))
CALL dbcsr_release_p(qs_ot_env%matrix_cosp_b)
650 IF (
ASSOCIATED(qs_ot_env%matrix_sinp_b))
CALL dbcsr_release_p(qs_ot_env%matrix_sinp_b)
651 IF (
ASSOCIATED(qs_ot_env%matrix_buf1))
CALL dbcsr_release_p(qs_ot_env%matrix_buf1)
652 IF (
ASSOCIATED(qs_ot_env%matrix_buf2))
CALL dbcsr_release_p(qs_ot_env%matrix_buf2)
653 IF (
ASSOCIATED(qs_ot_env%matrix_buf3))
CALL dbcsr_release_p(qs_ot_env%matrix_buf3)
654 IF (
ASSOCIATED(qs_ot_env%matrix_buf4))
CALL dbcsr_release_p(qs_ot_env%matrix_buf4)
655 IF (
ASSOCIATED(qs_ot_env%matrix_buf1_ortho))
CALL dbcsr_release_p(qs_ot_env%matrix_buf1_ortho)
656 IF (
ASSOCIATED(qs_ot_env%matrix_buf2_ortho))
CALL dbcsr_release_p(qs_ot_env%matrix_buf2_ortho)
657 IF (
ASSOCIATED(qs_ot_env%matrix_c0))
CALL dbcsr_release_p(qs_ot_env%matrix_c0)
658 IF (
ASSOCIATED(qs_ot_env%matrix_sc0))
CALL dbcsr_release_p(qs_ot_env%matrix_sc0)
659 IF (
ASSOCIATED(qs_ot_env%matrix_psc0))
CALL dbcsr_release_p(qs_ot_env%matrix_psc0)
660 IF (
ASSOCIATED(qs_ot_env%matrix_x))
CALL dbcsr_release_p(qs_ot_env%matrix_x)
661 IF (
ASSOCIATED(qs_ot_env%matrix_sx))
CALL dbcsr_release_p(qs_ot_env%matrix_sx)
662 IF (
ASSOCIATED(qs_ot_env%matrix_gx))
CALL dbcsr_release_p(qs_ot_env%matrix_gx)
663 IF (
ASSOCIATED(qs_ot_env%matrix_dx))
CALL dbcsr_release_p(qs_ot_env%matrix_dx)
664 IF (
ASSOCIATED(qs_ot_env%matrix_gx_old))
CALL dbcsr_release_p(qs_ot_env%matrix_gx_old)
665 IF (
ASSOCIATED(qs_ot_env%buf1_k_k_nosym))
CALL dbcsr_release_p(qs_ot_env%buf1_k_k_nosym)
666 IF (
ASSOCIATED(qs_ot_env%buf2_k_k_nosym))
CALL dbcsr_release_p(qs_ot_env%buf2_k_k_nosym)
667 IF (
ASSOCIATED(qs_ot_env%buf3_k_k_nosym))
CALL dbcsr_release_p(qs_ot_env%buf3_k_k_nosym)
668 IF (
ASSOCIATED(qs_ot_env%buf4_k_k_nosym))
CALL dbcsr_release_p(qs_ot_env%buf4_k_k_nosym)
669 IF (
ASSOCIATED(qs_ot_env%p_k_k_sym))
CALL dbcsr_release_p(qs_ot_env%p_k_k_sym)
670 IF (
ASSOCIATED(qs_ot_env%buf1_k_k_sym))
CALL dbcsr_release_p(qs_ot_env%buf1_k_k_sym)
671 IF (
ASSOCIATED(qs_ot_env%buf2_k_k_sym))
CALL dbcsr_release_p(qs_ot_env%buf2_k_k_sym)
672 IF (
ASSOCIATED(qs_ot_env%buf3_k_k_sym))
CALL dbcsr_release_p(qs_ot_env%buf3_k_k_sym)
673 IF (
ASSOCIATED(qs_ot_env%buf4_k_k_sym))
CALL dbcsr_release_p(qs_ot_env%buf4_k_k_sym)
674 IF (
ASSOCIATED(qs_ot_env%buf1_n_k))
CALL dbcsr_release_p(qs_ot_env%buf1_n_k)
675 IF (
ASSOCIATED(qs_ot_env%buf1_n_k_dp))
CALL dbcsr_release_p(qs_ot_env%buf1_n_k_dp)
677 IF (qs_ot_env%settings%ot_method .EQ.
"DIIS" .OR. &
678 qs_ot_env%settings%ot_method .EQ.
"BROY")
THEN
681 DEALLOCATE (qs_ot_env%ls_diis)
682 DEALLOCATE (qs_ot_env%lss_diis)
683 DEALLOCATE (qs_ot_env%c_diis)
684 DEALLOCATE (qs_ot_env%c_broy)
685 DEALLOCATE (qs_ot_env%energy_h)
686 DEALLOCATE (qs_ot_env%ipivot)
689 IF (qs_ot_env%settings%do_rotation)
THEN
691 IF (
ASSOCIATED(qs_ot_env%rot_mat_u))
CALL dbcsr_release_p(qs_ot_env%rot_mat_u)
692 IF (
ASSOCIATED(qs_ot_env%rot_mat_x))
CALL dbcsr_release_p(qs_ot_env%rot_mat_x)
693 IF (
ASSOCIATED(qs_ot_env%rot_mat_dedu))
CALL dbcsr_release_p(qs_ot_env%rot_mat_dedu)
694 IF (
ASSOCIATED(qs_ot_env%rot_mat_chc))
CALL dbcsr_release_p(qs_ot_env%rot_mat_chc)
696 IF (qs_ot_env%settings%ot_method .EQ.
"DIIS")
THEN
701 DEALLOCATE (qs_ot_env%rot_mat_evals)
703 IF (
ASSOCIATED(qs_ot_env%rot_mat_evec))
CALL dbcsr_release_p(qs_ot_env%rot_mat_evec)
704 IF (
ASSOCIATED(qs_ot_env%rot_mat_gx))
CALL dbcsr_release_p(qs_ot_env%rot_mat_gx)
705 IF (
ASSOCIATED(qs_ot_env%rot_mat_gx_old))
CALL dbcsr_release_p(qs_ot_env%rot_mat_gx_old)
706 IF (
ASSOCIATED(qs_ot_env%rot_mat_dx))
CALL dbcsr_release_p(qs_ot_env%rot_mat_dx)
709 IF (qs_ot_env%settings%do_ener)
THEN
710 DEALLOCATE (qs_ot_env%ener_x)
711 DEALLOCATE (qs_ot_env%ener_gx)
712 IF (qs_ot_env%settings%ot_method .EQ.
"DIIS")
THEN
713 DEALLOCATE (qs_ot_env%ener_h_x)
714 DEALLOCATE (qs_ot_env%ener_h_e)
716 IF (qs_ot_env%use_dx)
THEN
717 DEALLOCATE (qs_ot_env%ener_dx)
719 IF (qs_ot_env%use_gx_old)
THEN
720 DEALLOCATE (qs_ot_env%ener_gx_old)
733 TYPE(qs_ot_settings_type) :: settings
734 TYPE(section_vals_type),
POINTER :: ot_section
735 INTEGER,
INTENT(IN) :: output_unit
737 CHARACTER(len=*),
PARAMETER :: routinen =
'ot_readwrite_input'
739 INTEGER :: handle, ls_method, ot_algorithm, &
740 ot_method, ot_ortho_irac
742 CALL timeset(routinen, handle)
746 SELECT CASE (ot_algorithm)
748 settings%ot_algorithm =
"TOD"
751 settings%ot_algorithm =
"REF"
753 cpabort(
"Value unknown")
758 IF (settings%irac_degree < 2 .OR. settings%irac_degree > 4)
THEN
759 cpabort(
"READ OT IRAC_DEGREE: Value unknown")
762 IF (settings%max_irac < 1)
THEN
763 cpabort(
"READ OT MAX_IRAC: VALUE MUST BE GREATER THAN ZERO")
765 CALL section_vals_val_get(ot_section,
"EPS_IRAC_FILTER_MATRIX", r_val=settings%eps_irac_filter_matrix)
767 IF (settings%eps_irac < 0.0_dp)
THEN
768 cpabort(
"READ OT EPS_IRAC: VALUE MUST BE GREATER THAN ZERO")
770 CALL section_vals_val_get(ot_section,
"EPS_IRAC_QUICK_EXIT", r_val=settings%eps_irac_quick_exit)
771 IF (settings%eps_irac_quick_exit < 0.0_dp)
THEN
772 cpabort(
"READ OT EPS_IRAC_QUICK_EXIT: VALUE MUST BE GREATER THAN ZERO")
776 IF (settings%eps_irac_switch < 0.0_dp)
THEN
777 cpabort(
"READ OT EPS_IRAC_SWITCH: VALUE MUST BE GREATER THAN ZERO")
781 SELECT CASE (ot_ortho_irac)
783 settings%ortho_irac =
"CHOL"
785 settings%ortho_irac =
"POLY"
787 settings%ortho_irac =
"LWDN"
789 cpabort(
"READ OT ORTHO_IRAC: Value unknown")
796 SELECT CASE (ot_method)
798 settings%ot_method =
"SD"
800 settings%ot_method =
"CG"
802 settings%ot_method =
"DIIS"
811 CALL section_vals_val_get(ot_section,
"BROYDEN_SIGMA_DECREASE", r_val=settings%broyden_sigma_decrease)
813 CALL section_vals_val_get(ot_section,
"BROYDEN_FORGET_HISTORY", l_val=settings%broyden_forget_history)
814 CALL section_vals_val_get(ot_section,
"BROYDEN_ADAPTIVE_SIGMA", l_val=settings%broyden_adaptive_sigma)
815 CALL section_vals_val_get(ot_section,
"BROYDEN_ENABLE_FLIP", l_val=settings%broyden_enable_flip)
816 settings%ot_method =
"BROY"
818 cpabort(
"READ OTSCF MINIMIZER: Value unknown")
822 SELECT CASE (ls_method)
824 settings%line_search_method =
"NONE"
826 settings%line_search_method =
"2PNT"
828 settings%line_search_method =
"3PNT"
830 settings%line_search_method =
"GOLD"
833 cpabort(
"READ OTSCF LS: Value unknown")
837 SELECT CASE (settings%precond_solver_type)
839 settings%precond_solver_name =
"DEFAULT"
841 settings%precond_solver_name =
"INVERSE_CHOLESKY"
843 settings%precond_solver_name =
"DIRECT"
845 settings%precond_solver_name =
"INVERSE_UPDATE"
847 cpabort(
"READ OTSCF SOLVER: Value unknown")
855 SELECT CASE (settings%preconditioner_type)
857 settings%preconditioner_name =
"NONE"
858 IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.15_dp
859 IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.2_dp
861 settings%preconditioner_name =
"FULL_SINGLE"
862 IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.15_dp
863 IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.2_dp
865 settings%preconditioner_name =
"FULL_SINGLE_INVERSE"
866 IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.08_dp
867 IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.08_dp
869 settings%preconditioner_name =
"FULL_ALL"
870 IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.15_dp
871 IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.08_dp
873 settings%preconditioner_name =
"FULL_KINETIC"
874 IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.15_dp
875 IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.2_dp
877 settings%preconditioner_name =
"FULL_S_INVERSE"
878 IF (settings%ds_min < 0.0_dp) settings%ds_min = 0.15_dp
879 IF (settings%energy_gap < 0.0_dp) settings%energy_gap = 0.2_dp
881 cpabort(
"READ OTSCF PRECONDITIONER: Value unknown")
889 l_val=settings%occupation_preconditioner)
892 r_val=settings%nondiag_energy_strength)
894 cpassert(.NOT. settings%do_ener)
898 IF (output_unit > 0)
THEN
899 WRITE (output_unit,
'(/,A)')
" ----------------------------------- OT ---------------------------------------"
900 IF (settings%do_rotation)
THEN
901 WRITE (output_unit,
'(A)')
" Allowing for rotations "
903 IF (settings%do_ener)
THEN
904 WRITE (output_unit,
'(A,L2)')
" Optimizing orbital energies "
906 SELECT CASE (settings%OT_METHOD)
908 WRITE (output_unit,
'(A)')
" Minimizer : SD : steepest descent"
910 WRITE (output_unit,
'(A)')
" Minimizer : CG : conjugate gradient"
912 WRITE (output_unit,
'(A)')
" Minimizer : DIIS : direct inversion"
913 WRITE (output_unit,
'(A)')
" in the iterative subspace"
914 WRITE (output_unit,
'(A,I3,A)')
" using ", settings%diis_m,
" DIIS vectors"
915 IF (settings%safer_diis)
THEN
916 WRITE (output_unit,
'(A,I3,A)')
" safer DIIS on"
918 WRITE (output_unit,
'(A,I3,A)')
" safer DIIS off"
921 WRITE (output_unit,
'(A)')
" Minimizer : BROYDEN : Broyden "
922 WRITE (output_unit,
'(A,F16.8)')
" BETA : ", settings%broyden_beta
923 WRITE (output_unit,
'(A,F16.8)')
" GAMMA : ", settings%broyden_gamma
924 WRITE (output_unit,
'(A,F16.8)')
" SIGMA : ", settings%broyden_sigma
925 WRITE (output_unit,
'(A,I3,A)')
" using : - ", &
926 settings%diis_m,
" BROYDEN vectors"
928 WRITE (output_unit,
'(3A)')
" Minimizer : ", settings%OT_METHOD,
" : UNKNOWN"
930 SELECT CASE (settings%preconditioner_name)
932 WRITE (output_unit,
'(A)')
" Preconditioner : FULL_SINGLE : diagonalization based"
933 CASE (
"FULL_SINGLE_INVERSE")
934 WRITE (output_unit,
'(A,/,A)')
" Preconditioner : FULL_SINGLE_INVERSE : inversion of ", &
935 " H + eS - 2*(Sc)(c^T*H*c+const)(Sc)^T"
937 WRITE (output_unit,
'(A)')
" Preconditioner : FULL_ALL : diagonalization, state selective"
938 CASE (
"FULL_KINETIC")
939 WRITE (output_unit,
'(A)')
" Preconditioner : FULL_KINETIC : inversion of T + eS"
940 CASE (
"FULL_S_INVERSE")
941 WRITE (output_unit,
'(A)')
" Preconditioner : FULL_S_INVERSE : cholesky inversion of S"
943 WRITE (output_unit,
'(A)') &
944 " Preconditioner : SPARSE_DIAG : diagonal atomic block diagonalization"
945 CASE (
"SPARSE_KINETIC")
946 WRITE (output_unit,
'(A)')
" Preconditioner : SPARSE_KINETIC : sparse linear solver for T + eS"
948 WRITE (output_unit,
'(A)')
" Preconditioner : NONE"
950 WRITE (output_unit,
'(3A)')
" Preconditioner : ", settings%preconditioner_name,
" : UNKNOWN"
953 WRITE (output_unit,
'(A)')
" Precond_solver : "//trim(settings%precond_solver_name)
955 IF (settings%OT_METHOD .EQ.
"SD" .OR. settings%OT_METHOD .EQ.
"CG")
THEN
956 SELECT CASE (settings%line_search_method)
958 WRITE (output_unit,
'(A)')
" Line search : 2PNT : 2 energies, one gradient"
960 WRITE (output_unit,
'(A)')
" Line search : 3PNT : 3 energies"
962 WRITE (output_unit,
'(A)')
" Line search : GOLD : bracketing and golden section search"
963 WRITE (output_unit,
'(A,F14.8)')
" target rel accuracy : ", settings%gold_target
965 WRITE (output_unit,
'(A)')
" Line search : NONE"
967 WRITE (output_unit,
'(3A)')
" Line search : ", settings%line_search_method,
" : UNKNOWN"
970 WRITE (output_unit,
'(A,F14.8,T49,A,F14.8)')
" stepsize :", settings%ds_min, &
971 " energy_gap :", settings%energy_gap
972 IF (settings%ot_algorithm .EQ.
'TOD')
THEN
973 WRITE (output_unit,
'(A,E14.5,T49,A,I14)')
" eps_taylor :", settings%eps_taylor, &
974 " max_taylor :", settings%max_taylor
976 IF (settings%ot_algorithm .EQ.
'REF')
THEN
977 WRITE (output_unit,
'(A,1X,A,T49,A,I14)')
" ortho_irac :", settings%ortho_irac, &
978 " irac_degree :", settings%irac_degree
979 WRITE (output_unit,
'(A,I14,T49,A,E14.5)')
" max_irac :", settings%max_irac, &
980 " eps_irac :", settings%eps_irac
981 WRITE (output_unit,
'(A,E14.5,T49,A,E10.3)')
" eps_irac_switch:", settings%eps_irac_switch, &
982 " eps_irac_quick_exit:", settings%eps_irac_quick_exit
983 WRITE (output_unit,
'(A,L2)')
" on_the_fly_loc :", settings%on_the_fly_loc
985 WRITE (output_unit,
'(A)')
" ----------------------------------- OT ---------------------------------------"
986 WRITE (unit=output_unit, &
987 fmt=
"(/,T3,A,T12,A,T31,A,T39,A,T59,A,T75,A,/,T3,A)") &
988 "Step",
"Update method",
"Time",
"Convergence",
"Total energy",
"Change", &
992 CALL timestop(handle)
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
DBCSR operations in CP2K.
subroutine, public cp_dbcsr_m_by_n_from_template(matrix, template, m, n, sym, data_type)
Utility function to create an arbitrary shaped dbcsr matrix with the same processor grid as the templ...
subroutine, public cp_dbcsr_m_by_n_from_row_template(matrix, template, n, sym, data_type)
Utility function to create dbcsr matrix, m x n matrix (n arbitrary) with the same processor grid and ...
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
Defines the basic variable types.
integer, parameter, public dp
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)
subroutine, public qs_ot_init(qs_ot_env)
...
subroutine, public qs_ot_allocate(qs_ot_env, matrix_s, fm_struct_ref, ortho_k)
...
subroutine, public qs_ot_settings_init(settings)
sets default values for the settings type
subroutine, public qs_ot_destroy(qs_ot_env)
...
subroutine, public ot_readwrite_input(settings, ot_section, output_unit)
...