44#include "./base/base_uses.f90"
49 LOGICAL,
PRIVATE,
PARAMETER :: debug_this_module = .true.
51 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_scf_types'
74 INTEGER :: nkrylov = -1, nblock = -1, nmo_conv = -1, nmo_nc = -1, max_iter = -1
75 LOGICAL :: always_check_conv = .false.
76 REAL(
dp) :: eps_std_diag = -1.0_dp, eps_conv = -1.0_dp, eps_adapt = -1.0_dp, max_res_norm = -1.0_dp, min_res_norm = -1.0_dp
77 REAL(
dp),
DIMENSION(:),
POINTER :: c_eval => null(), t_eval => null()
78 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: v_mat => null(), mo_conv => null(), mo_refine => null()
81 TYPE(
cp_fm_type),
POINTER :: block1_mat => null(), block2_mat => null(), block3_mat => null(), &
82 block4_mat => null(), block5_mat => null()
83 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: c_vec => null(), chc_mat => null()
87 INTEGER :: max_iter = -1, mixing_method = -1
88 REAL(
dp) :: eps_diag_sub = -1.0_dp, eps_ene = -1.0_dp, eps_adapt = -1.0_dp
89 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: p_matrix_store => null()
90 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: p_matrix_mix => null()
91 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: chc_mat => null(), c_vec => null(), c0 => null()
95 TYPE floating_basis_type
96 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: gradient => null()
97 END TYPE floating_basis_type
101 INTEGER :: iter_count = -1
102 INTEGER :: cholesky_method = -1, nelectron = -1, method = -1, mixing_method = -1, nskip_mixing = -1
103 REAL(kind=
dp) :: iter_param = -1.0_dp, iter_delta = -1.0_dp, p_mix_alpha = -1.0_dp, sum_zeff_corr = -1.0_dp
105 REAL(kind=
dp) :: step_norm = -1.0_dp, raw_map_delta = -1.0_dp
107 REAL(kind=
dp) :: oda_lambda = 0.0_dp, oda_energy = 0.0_dp, oda_gradient0 = 0.0_dp, oda_gradient1 = 0.0_dp
108 INTEGER :: oda_evaluations = 0
109 CHARACTER(len=15) :: iter_method =
"", oda_status =
""
110 COMPLEX(KIND=dp),
DIMENSION(:, :, :),
POINTER :: cc_buffer => null()
111 LOGICAL :: print_iter_line = .false., skip_mixing = .false., skip_diis = .false., needs_ortho = .false., &
112 adiis_check_next = .false., adiis_validated = .false., &
113 raw_map_delta_valid = .false.
115 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: scf_work1 => null(), scf_work1_red => null()
116 TYPE(
cp_fm_type),
POINTER :: scf_work2 => null(), ortho => null(), ortho_m1 => null(), &
117 s_half => null(), s_minus_one => null(), &
118 scf_work2_red => null(), ortho_red => null(), ortho_m1_red => null()
120 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: p_delta => null(), p_mix_new => null()
121 TYPE(
dbcsr_type),
POINTER :: ortho_dbcsr => null(), buf1_dbcsr => null(), buf2_dbcsr => null()
123 TYPE(
qs_ot_type),
POINTER,
DIMENSION(:) :: qs_ot_env => null()
129 TYPE(floating_basis_type) :: floating_basis = floating_basis_type()
131 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: mom_ref_mo_coeff => null()
133 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: mom_overlap => null(), mom_s_mo_coeff => null()
148 CHARACTER(len=*),
PARAMETER :: routinen =
'scf_env_create'
152 CALL timeset(routinen, handle)
154 scf_env%iter_count = 0
155 scf_env%nelectron = 0
156 scf_env%iter_param = 0.0_dp
157 scf_env%iter_delta = 0.0_dp
158 scf_env%step_norm = 0.0_dp
159 scf_env%raw_map_delta = 0.0_dp
160 scf_env%oda_lambda = 0.0_dp
161 scf_env%oda_energy = 0.0_dp
162 scf_env%oda_gradient0 = 0.0_dp
163 scf_env%oda_gradient1 = 0.0_dp
164 scf_env%oda_evaluations = 0
165 scf_env%oda_status =
""
166 scf_env%iter_method =
""
167 scf_env%print_iter_line = .true.
168 scf_env%skip_mixing = .false.
169 scf_env%skip_diis = .false.
170 scf_env%needs_ortho = .false.
171 scf_env%adiis_check_next = .false.
172 scf_env%adiis_validated = .false.
173 scf_env%raw_map_delta_valid = .false.
175 scf_env%mixing_method = -1
176 scf_env%p_mix_alpha = 1.0_dp
177 scf_env%cholesky_method = -1
178 scf_env%outer_scf%iter_count = 0
179 scf_env%sum_zeff_corr = 0.0_dp
180 NULLIFY (scf_env%outer_scf%variables)
181 NULLIFY (scf_env%outer_scf%gradient)
182 NULLIFY (scf_env%outer_scf%energy)
183 NULLIFY (scf_env%outer_scf%count)
184 NULLIFY (scf_env%outer_scf%inv_jacobian)
185 scf_env%outer_scf%deallocate_jacobian = .true.
186 NULLIFY (scf_env%scf_work1)
187 NULLIFY (scf_env%scf_work2)
188 NULLIFY (scf_env%scf_work1_red)
189 NULLIFY (scf_env%scf_work2_red)
190 NULLIFY (scf_env%ortho)
191 NULLIFY (scf_env%ortho_red)
192 NULLIFY (scf_env%ortho_dbcsr)
193 NULLIFY (scf_env%ortho_m1)
194 NULLIFY (scf_env%ortho_m1_red)
195 NULLIFY (scf_env%p_mix_new)
196 NULLIFY (scf_env%ot_preconditioner)
197 NULLIFY (scf_env%qs_ot_env)
198 NULLIFY (scf_env%scf_diis_buffer)
199 NULLIFY (scf_env%scf_subspace_buffer)
200 NULLIFY (scf_env%buf1_dbcsr)
201 NULLIFY (scf_env%buf2_dbcsr)
202 NULLIFY (scf_env%s_half)
203 NULLIFY (scf_env%p_delta)
204 NULLIFY (scf_env%s_minus_one)
205 NULLIFY (scf_env%cc_buffer)
206 NULLIFY (scf_env%mixing_store)
207 NULLIFY (scf_env%krylov_space)
208 NULLIFY (scf_env%subspace_env)
209 NULLIFY (scf_env%block_davidson_env)
210 NULLIFY (scf_env%floating_basis%gradient)
212 NULLIFY (scf_env%mom_ref_mo_coeff)
213 NULLIFY (scf_env%mom_overlap)
214 NULLIFY (scf_env%mom_s_mo_coeff)
216 CALL timestop(handle)
230 CHARACTER(len=*),
PARAMETER :: routinen =
'scf_env_did_change'
234 CALL timeset(routinen, handle)
236 IF (
ASSOCIATED(scf_env%p_mix_new))
THEN
239 IF (
ASSOCIATED(scf_env%p_delta))
THEN
242 IF (
ASSOCIATED(scf_env%scf_subspace_buffer))
THEN
244 DEALLOCATE (scf_env%scf_subspace_buffer)
248 CALL timestop(handle)
263 CHARACTER(len=*),
PARAMETER :: routinen =
'scf_env_release'
267 CALL timeset(routinen, handle)
270 IF (
ASSOCIATED(scf_env%scf_work1_red))
THEN
272 DEALLOCATE (scf_env%scf_work1_red)
273 NULLIFY (scf_env%scf_work1_red)
275 IF (
ASSOCIATED(scf_env%scf_work2))
THEN
277 DEALLOCATE (scf_env%scf_work2)
278 NULLIFY (scf_env%scf_work2)
280 IF (
ASSOCIATED(scf_env%scf_work2_red))
THEN
282 DEALLOCATE (scf_env%scf_work2_red)
283 NULLIFY (scf_env%scf_work2_red)
285 IF (
ASSOCIATED(scf_env%ortho))
THEN
287 DEALLOCATE (scf_env%ortho)
288 NULLIFY (scf_env%ortho)
290 IF (
ASSOCIATED(scf_env%ortho_red))
THEN
292 DEALLOCATE (scf_env%ortho_red)
293 NULLIFY (scf_env%ortho_red)
295 IF (
ASSOCIATED(scf_env%ortho_m1))
THEN
297 DEALLOCATE (scf_env%ortho_m1)
298 NULLIFY (scf_env%ortho_m1)
300 IF (
ASSOCIATED(scf_env%ortho_m1_red))
THEN
302 DEALLOCATE (scf_env%ortho_m1_red)
303 NULLIFY (scf_env%ortho_m1_red)
305 IF (
ASSOCIATED(scf_env%ortho_dbcsr))
THEN
309 IF (
ASSOCIATED(scf_env%buf1_dbcsr))
THEN
313 IF (
ASSOCIATED(scf_env%buf2_dbcsr))
THEN
317 IF (
ASSOCIATED(scf_env%s_half))
THEN
319 DEALLOCATE (scf_env%s_half)
321 IF (
ASSOCIATED(scf_env%s_minus_one))
THEN
323 DEALLOCATE (scf_env%s_minus_one)
325 IF (
ASSOCIATED(scf_env%p_mix_new))
THEN
329 IF (
ASSOCIATED(scf_env%p_delta))
THEN
333 IF (
ASSOCIATED(scf_env%ot_preconditioner))
THEN
334 DO i = 1,
SIZE(scf_env%ot_preconditioner)
335 IF (
ASSOCIATED(scf_env%ot_preconditioner(i)%preconditioner))
THEN
337 DEALLOCATE (scf_env%ot_preconditioner(i)%preconditioner)
340 DEALLOCATE (scf_env%ot_preconditioner)
342 IF (
ASSOCIATED(scf_env%qs_ot_env))
THEN
343 DO i = 1,
SIZE(scf_env%qs_ot_env)
346 DEALLOCATE (scf_env%qs_ot_env)
348 IF (
ASSOCIATED(scf_env%scf_diis_buffer))
THEN
350 DEALLOCATE (scf_env%scf_diis_buffer)
352 IF (
ASSOCIATED(scf_env%scf_subspace_buffer))
THEN
354 DEALLOCATE (scf_env%scf_subspace_buffer)
356 IF (
ASSOCIATED(scf_env%outer_scf%variables))
THEN
357 DEALLOCATE (scf_env%outer_scf%variables)
359 IF (
ASSOCIATED(scf_env%outer_scf%count))
THEN
360 DEALLOCATE (scf_env%outer_scf%count)
362 IF (
ASSOCIATED(scf_env%outer_scf%gradient))
THEN
363 DEALLOCATE (scf_env%outer_scf%gradient)
365 IF (
ASSOCIATED(scf_env%outer_scf%inv_jacobian))
THEN
366 DEALLOCATE (scf_env%outer_scf%inv_jacobian)
368 IF (
ASSOCIATED(scf_env%outer_scf%energy))
THEN
369 DEALLOCATE (scf_env%outer_scf%energy)
371 IF (
ASSOCIATED(scf_env%cc_buffer))
THEN
372 DEALLOCATE (scf_env%cc_buffer)
374 IF (
ASSOCIATED(scf_env%mixing_store))
THEN
376 DEALLOCATE (scf_env%mixing_store)
378 IF (
ASSOCIATED(scf_env%krylov_space))
THEN
379 CALL krylov_space_release(scf_env%krylov_space)
381 IF (
ASSOCIATED(scf_env%subspace_env))
THEN
382 CALL diag_subspace_env_release(scf_env%subspace_env)
384 IF (
ASSOCIATED(scf_env%block_davidson_env))
THEN
390 IF (
ASSOCIATED(scf_env%floating_basis%gradient))
THEN
391 DEALLOCATE (scf_env%floating_basis%gradient)
397 CALL timestop(handle)
414 cpassert(.NOT.
ASSOCIATED(krylov_space))
415 ALLOCATE (krylov_space)
417 NULLIFY (krylov_space%c_eval, krylov_space%t_eval)
418 NULLIFY (krylov_space%v_mat)
419 NULLIFY (krylov_space%mo_conv, krylov_space%mo_refine)
420 NULLIFY (krylov_space%chc_mat, krylov_space%c_vec)
421 NULLIFY (krylov_space%tmp_mat)
422 NULLIFY (krylov_space%block1_mat, krylov_space%block2_mat)
423 NULLIFY (krylov_space%block3_mat, krylov_space%block4_mat, krylov_space%block5_mat)
426 i_val=krylov_space%max_iter)
428 i_val=krylov_space%nkrylov)
430 i_val=krylov_space%nblock)
432 r_val=krylov_space%eps_conv)
434 r_val=krylov_space%eps_std_diag)
436 r_val=krylov_space%eps_adapt)
438 l_val=krylov_space%always_check_conv)
449 SUBROUTINE krylov_space_release(krylov_space)
452 IF (
ASSOCIATED(krylov_space))
THEN
454 DEALLOCATE (krylov_space%c_eval)
455 DEALLOCATE (krylov_space%t_eval)
463 IF (
ASSOCIATED(krylov_space%tmp_mat))
THEN
465 DEALLOCATE (krylov_space%tmp_mat)
467 IF (
ASSOCIATED(krylov_space%block1_mat))
THEN
469 DEALLOCATE (krylov_space%block1_mat)
471 IF (
ASSOCIATED(krylov_space%block2_mat))
THEN
473 DEALLOCATE (krylov_space%block2_mat)
475 IF (
ASSOCIATED(krylov_space%block3_mat))
THEN
477 DEALLOCATE (krylov_space%block3_mat)
479 IF (
ASSOCIATED(krylov_space%block4_mat))
THEN
481 DEALLOCATE (krylov_space%block4_mat)
483 IF (
ASSOCIATED(krylov_space%block5_mat))
THEN
485 DEALLOCATE (krylov_space%block5_mat)
488 DEALLOCATE (krylov_space)
490 NULLIFY (krylov_space)
493 END SUBROUTINE krylov_space_release
508 REAL(
dp),
INTENT(IN) :: ecut
513 cpassert(.NOT.
ASSOCIATED(subspace_env))
514 ALLOCATE (subspace_env)
516 NULLIFY (subspace_env%p_matrix_store)
517 NULLIFY (subspace_env%p_matrix_mix)
518 NULLIFY (subspace_env%chc_mat)
519 NULLIFY (subspace_env%c_vec)
520 NULLIFY (subspace_env%c0)
521 NULLIFY (subspace_env%mixing_store)
522 NULLIFY (mixing_section)
525 i_val=subspace_env%max_iter)
527 r_val=subspace_env%eps_ene)
529 r_val=subspace_env%eps_diag_sub)
531 r_val=subspace_env%eps_adapt)
532 subspace_env%mixing_method = 0
539 i_val=subspace_env%mixing_method)
541 ALLOCATE (subspace_env%mixing_store)
543 subspace_env%mixing_method, ecut=ecut)
556 SUBROUTINE diag_subspace_env_release(subspace_env)
559 IF (
ASSOCIATED(subspace_env))
THEN
561 IF (
ASSOCIATED(subspace_env%p_matrix_store))
THEN
570 IF (
ASSOCIATED(subspace_env%mixing_store))
THEN
572 DEALLOCATE (subspace_env%mixing_store)
575 DEALLOCATE (subspace_env)
578 END SUBROUTINE diag_subspace_env_release
subroutine, public dbcsr_deallocate_matrix(matrix)
...
DBCSR operations in CP2K.
represent a full matrix distributed on many processors
Defines the basic variable types.
integer, parameter, public dp
parameters that control the outer loop of an SCF iteration
subroutine, public destroy_preconditioner(preconditioner_env)
...
module that contains the algorithms to perform an iterative diagonalization by the block-Davidson app...
subroutine, public block_davidson_release(bdav_env)
...
module that contains the definitions of the scf types
subroutine, public mixing_storage_release(mixing_store)
releases a mixing_storage
integer, parameter, public direct_mixing_nr
subroutine, public mixing_storage_create(mixing_store, mixing_section, mixing_method, ecut)
creates a mixing_storage
buffer for the diis of the scf
subroutine, public qs_diis_b_release(diis_buffer)
releases the given diis buffer (see doc/ReferenceCounting.html)
logical function, public fb_env_has_data(fb_env)
Checks if a fb_env object is associated with an actual data content or not.
subroutine, public fb_env_release(fb_env)
releases a given fb_env
subroutine, public fb_env_nullify(fb_env)
nullifies a fb_env object, note that this does not release the original object. This procedure is use...
subroutine, public qs_ot_destroy(qs_ot_env)
deallocates data
Data types for the ADIIS SCF subspace accelerator.
subroutine, public qs_scf_subspace_buffer_release(buffer)
Release all matrices and scalar storage owned by a subspace buffer.
module that contains the definitions of the scf types
subroutine, public scf_env_did_change(scf_env)
function to be called to inform the scf_env about changes
integer, parameter, public ot_diag_method_nr
subroutine, public krylov_space_create(krylov_space, scf_section)
creates krylov space
subroutine, public diag_subspace_env_create(subspace_env, scf_section, ecut)
creates subspace-rotation environment
integer, parameter, public filter_matrix_diag_method_nr
integer, parameter, public block_davidson_diag_method_nr
integer, parameter, public smeagol_method_nr
integer, parameter, public ot_method_nr
subroutine, public scf_env_create(scf_env)
allocates and initialize an scf_env
integer, parameter, public special_diag_method_nr
integer, parameter, public block_krylov_diag_method_nr
subroutine, public scf_env_release(scf_env)
releases an scf_env (see doc/ReferenceCounting.html)
integer, parameter, public general_diag_method_nr
keeps a buffer with the previous values of s,p,k
the object container which allows for the creation of an array of pointers to fb_env
History buffer holding strictly paired P and F[P] SCF states.
wrapper for temporary and cached objects used in the scf iteration