18 USE dbcsr_api,
ONLY: dbcsr_deallocate_matrix,&
42 #include "./base/base_uses.f90"
47 LOGICAL,
PRIVATE,
PARAMETER :: debug_this_module = .true.
49 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_scf_types'
59 PUBLIC :: qs_scf_env_type
70 TYPE krylov_space_type
71 INTEGER :: nkrylov, nblock, nmo_conv, nmo_nc, max_iter
72 LOGICAL :: always_check_conv
73 REAL(
dp) :: eps_std_diag, eps_conv, eps_adapt, max_res_norm, min_res_norm
74 REAL(
dp),
DIMENSION(:),
POINTER :: c_eval, t_eval
75 TYPE(cp_fm_type),
DIMENSION(:),
POINTER :: v_mat, mo_conv, mo_refine
76 TYPE(cp_fm_type),
POINTER :: tmp_mat
78 TYPE(cp_fm_type),
POINTER :: block1_mat, block2_mat, block3_mat, block4_mat, block5_mat
79 TYPE(cp_fm_type),
DIMENSION(:),
POINTER :: c_vec, chc_mat
80 END TYPE krylov_space_type
82 TYPE subspace_env_type
83 INTEGER :: max_iter, mixing_method
84 REAL(
dp) :: eps_diag_sub, eps_ene, eps_adapt
85 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: p_matrix_store
86 TYPE(dbcsr_p_type),
DIMENSION(:, :),
POINTER :: p_matrix_mix
87 TYPE(cp_fm_type),
DIMENSION(:),
POINTER :: chc_mat, c_vec, c0
88 TYPE(mixing_storage_type),
POINTER :: mixing_store
89 END TYPE subspace_env_type
91 TYPE floating_basis_type
92 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: gradient
93 END TYPE floating_basis_type
96 TYPE(qs_outer_scf_type) :: outer_scf
98 INTEGER :: cholesky_method, nelectron, method, mixing_method, nskip_mixing
99 REAL(kind=
dp) :: iter_param, iter_delta, p_mix_alpha, sum_zeff_corr
100 CHARACTER(len=15) :: iter_method
101 COMPLEX(KIND=dp),
DIMENSION(:, :, :),
POINTER :: cc_buffer
102 LOGICAL :: print_iter_line, skip_mixing, skip_diis, needs_ortho
103 TYPE(mixing_storage_type),
POINTER :: mixing_store
104 TYPE(cp_fm_type),
DIMENSION(:),
POINTER :: scf_work1
105 TYPE(cp_fm_type),
POINTER :: scf_work2, ortho, ortho_m1, s_half, s_minus_one
106 TYPE(krylov_space_type),
POINTER :: krylov_space
107 TYPE(dbcsr_p_type),
DIMENSION(:, :),
POINTER :: p_delta, p_mix_new
108 TYPE(dbcsr_type),
POINTER :: ortho_dbcsr, buf1_dbcsr, buf2_dbcsr
109 TYPE(preconditioner_p_type),
DIMENSION(:),
POINTER :: ot_preconditioner
110 TYPE(qs_ot_type),
POINTER,
DIMENSION(:) :: qs_ot_env
111 TYPE(qs_diis_buffer_type),
POINTER :: scf_diis_buffer
112 TYPE(subspace_env_type),
POINTER :: subspace_env
113 TYPE(davidson_type),
POINTER,
DIMENSION(:) :: block_davidson_env
114 TYPE(fb_env_obj) :: filter_matrix_env
115 TYPE(floating_basis_type) :: floating_basis
117 TYPE(cp_fm_type),
DIMENSION(:),
POINTER :: mom_ref_mo_coeff
119 TYPE(cp_fm_type),
DIMENSION(:),
POINTER :: mom_overlap, mom_s_mo_coeff
120 END TYPE qs_scf_env_type
132 TYPE(qs_scf_env_type),
INTENT(OUT) :: scf_env
134 CHARACTER(len=*),
PARAMETER :: routinen =
'scf_env_create'
138 CALL timeset(routinen, handle)
140 scf_env%iter_count = 0
141 scf_env%nelectron = 0
142 scf_env%iter_param = 0.0_dp
143 scf_env%iter_delta = 0.0_dp
144 scf_env%iter_method =
""
145 scf_env%print_iter_line = .true.
146 scf_env%skip_mixing = .false.
147 scf_env%skip_diis = .false.
148 scf_env%needs_ortho = .false.
150 scf_env%mixing_method = -1
151 scf_env%p_mix_alpha = 1.0_dp
152 scf_env%cholesky_method = -1
153 scf_env%outer_scf%iter_count = 0
154 scf_env%sum_zeff_corr = 0.0_dp
155 NULLIFY (scf_env%outer_scf%variables)
156 NULLIFY (scf_env%outer_scf%gradient)
157 NULLIFY (scf_env%outer_scf%energy)
158 NULLIFY (scf_env%outer_scf%count)
159 NULLIFY (scf_env%outer_scf%inv_jacobian)
160 scf_env%outer_scf%deallocate_jacobian = .true.
161 NULLIFY (scf_env%scf_work1)
162 NULLIFY (scf_env%scf_work2)
163 NULLIFY (scf_env%ortho)
164 NULLIFY (scf_env%ortho_dbcsr)
165 NULLIFY (scf_env%ortho_m1)
166 NULLIFY (scf_env%p_mix_new)
167 NULLIFY (scf_env%ot_preconditioner)
168 NULLIFY (scf_env%qs_ot_env)
169 NULLIFY (scf_env%scf_diis_buffer)
170 NULLIFY (scf_env%buf1_dbcsr)
171 NULLIFY (scf_env%buf2_dbcsr)
172 NULLIFY (scf_env%s_half)
173 NULLIFY (scf_env%p_delta)
174 NULLIFY (scf_env%s_minus_one)
175 NULLIFY (scf_env%cc_buffer)
176 NULLIFY (scf_env%mixing_store)
177 NULLIFY (scf_env%krylov_space)
178 NULLIFY (scf_env%subspace_env)
179 NULLIFY (scf_env%block_davidson_env)
180 NULLIFY (scf_env%floating_basis%gradient)
182 NULLIFY (scf_env%mom_ref_mo_coeff)
183 NULLIFY (scf_env%mom_overlap)
184 NULLIFY (scf_env%mom_s_mo_coeff)
186 CALL timestop(handle)
198 TYPE(qs_scf_env_type),
INTENT(INOUT) :: scf_env
200 CHARACTER(len=*),
PARAMETER :: routinen =
'scf_env_did_change'
204 CALL timeset(routinen, handle)
206 IF (
ASSOCIATED(scf_env%p_mix_new))
THEN
209 IF (
ASSOCIATED(scf_env%p_delta))
THEN
212 CALL cp_fm_release(scf_env%mom_ref_mo_coeff)
214 CALL timestop(handle)
227 TYPE(qs_scf_env_type),
INTENT(INOUT) :: scf_env
229 CHARACTER(len=*),
PARAMETER :: routinen =
'scf_env_release'
233 CALL timeset(routinen, handle)
235 CALL cp_fm_release(scf_env%scf_work1)
236 IF (
ASSOCIATED(scf_env%scf_work2))
THEN
237 CALL cp_fm_release(scf_env%scf_work2)
238 DEALLOCATE (scf_env%scf_work2)
240 IF (
ASSOCIATED(scf_env%ortho))
THEN
241 CALL cp_fm_release(scf_env%ortho)
242 DEALLOCATE (scf_env%ortho)
244 IF (
ASSOCIATED(scf_env%ortho_m1))
THEN
245 CALL cp_fm_release(scf_env%ortho_m1)
246 DEALLOCATE (scf_env%ortho_m1)
248 IF (
ASSOCIATED(scf_env%ortho_dbcsr))
THEN
251 CALL dbcsr_deallocate_matrix(scf_env%ortho_dbcsr)
253 IF (
ASSOCIATED(scf_env%buf1_dbcsr))
THEN
256 CALL dbcsr_deallocate_matrix(scf_env%buf1_dbcsr)
258 IF (
ASSOCIATED(scf_env%buf2_dbcsr))
THEN
261 CALL dbcsr_deallocate_matrix(scf_env%buf2_dbcsr)
263 IF (
ASSOCIATED(scf_env%s_half))
THEN
264 CALL cp_fm_release(scf_env%s_half)
265 DEALLOCATE (scf_env%s_half)
267 IF (
ASSOCIATED(scf_env%s_minus_one))
THEN
268 CALL cp_fm_release(scf_env%s_minus_one)
269 DEALLOCATE (scf_env%s_minus_one)
271 IF (
ASSOCIATED(scf_env%p_mix_new))
THEN
276 IF (
ASSOCIATED(scf_env%p_delta))
THEN
281 IF (
ASSOCIATED(scf_env%ot_preconditioner))
THEN
282 DO i = 1,
SIZE(scf_env%ot_preconditioner)
284 DEALLOCATE (scf_env%ot_preconditioner(i)%preconditioner)
286 DEALLOCATE (scf_env%ot_preconditioner)
288 IF (
ASSOCIATED(scf_env%qs_ot_env))
THEN
289 DO i = 1,
SIZE(scf_env%qs_ot_env)
292 DEALLOCATE (scf_env%qs_ot_env)
294 IF (
ASSOCIATED(scf_env%scf_diis_buffer))
THEN
296 DEALLOCATE (scf_env%scf_diis_buffer)
298 IF (
ASSOCIATED(scf_env%outer_scf%variables))
THEN
299 DEALLOCATE (scf_env%outer_scf%variables)
301 IF (
ASSOCIATED(scf_env%outer_scf%count))
THEN
302 DEALLOCATE (scf_env%outer_scf%count)
304 IF (
ASSOCIATED(scf_env%outer_scf%gradient))
THEN
305 DEALLOCATE (scf_env%outer_scf%gradient)
307 IF (
ASSOCIATED(scf_env%outer_scf%inv_jacobian))
THEN
308 DEALLOCATE (scf_env%outer_scf%inv_jacobian)
310 IF (
ASSOCIATED(scf_env%outer_scf%energy))
THEN
311 DEALLOCATE (scf_env%outer_scf%energy)
313 IF (
ASSOCIATED(scf_env%cc_buffer))
THEN
314 DEALLOCATE (scf_env%cc_buffer)
316 IF (
ASSOCIATED(scf_env%mixing_store))
THEN
318 DEALLOCATE (scf_env%mixing_store)
320 IF (
ASSOCIATED(scf_env%krylov_space))
THEN
321 CALL krylov_space_release(scf_env%krylov_space)
323 IF (
ASSOCIATED(scf_env%subspace_env))
THEN
324 CALL diag_subspace_env_release(scf_env%subspace_env)
326 IF (
ASSOCIATED(scf_env%block_davidson_env))
THEN
332 IF (
ASSOCIATED(scf_env%floating_basis%gradient))
THEN
333 DEALLOCATE (scf_env%floating_basis%gradient)
335 CALL cp_fm_release(scf_env%mom_ref_mo_coeff)
336 CALL cp_fm_release(scf_env%mom_overlap)
337 CALL cp_fm_release(scf_env%mom_s_mo_coeff)
339 CALL timestop(handle)
353 TYPE(krylov_space_type),
POINTER :: krylov_space
354 TYPE(section_vals_type),
POINTER :: scf_section
356 cpassert(.NOT.
ASSOCIATED(krylov_space))
357 ALLOCATE (krylov_space)
359 NULLIFY (krylov_space%c_eval, krylov_space%t_eval)
360 NULLIFY (krylov_space%v_mat)
361 NULLIFY (krylov_space%mo_conv, krylov_space%mo_refine)
362 NULLIFY (krylov_space%chc_mat, krylov_space%c_vec)
363 NULLIFY (krylov_space%tmp_mat)
364 NULLIFY (krylov_space%block1_mat, krylov_space%block2_mat)
365 NULLIFY (krylov_space%block3_mat, krylov_space%block4_mat, krylov_space%block5_mat)
368 i_val=krylov_space%max_iter)
370 i_val=krylov_space%nkrylov)
372 i_val=krylov_space%nblock)
374 r_val=krylov_space%eps_conv)
376 r_val=krylov_space%eps_std_diag)
378 r_val=krylov_space%eps_adapt)
380 l_val=krylov_space%always_check_conv)
391 SUBROUTINE krylov_space_release(krylov_space)
392 TYPE(krylov_space_type),
POINTER :: krylov_space
394 IF (
ASSOCIATED(krylov_space))
THEN
396 DEALLOCATE (krylov_space%c_eval)
397 DEALLOCATE (krylov_space%t_eval)
399 CALL cp_fm_release(krylov_space%v_mat)
400 CALL cp_fm_release(krylov_space%mo_conv)
401 CALL cp_fm_release(krylov_space%mo_refine)
402 CALL cp_fm_release(krylov_space%chc_mat)
403 CALL cp_fm_release(krylov_space%c_vec)
405 IF (
ASSOCIATED(krylov_space%tmp_mat))
THEN
406 CALL cp_fm_release(krylov_space%tmp_mat)
407 DEALLOCATE (krylov_space%tmp_mat)
409 IF (
ASSOCIATED(krylov_space%block1_mat))
THEN
410 CALL cp_fm_release(krylov_space%block1_mat)
411 DEALLOCATE (krylov_space%block1_mat)
413 IF (
ASSOCIATED(krylov_space%block2_mat))
THEN
414 CALL cp_fm_release(krylov_space%block2_mat)
415 DEALLOCATE (krylov_space%block2_mat)
417 IF (
ASSOCIATED(krylov_space%block3_mat))
THEN
418 CALL cp_fm_release(krylov_space%block3_mat)
419 DEALLOCATE (krylov_space%block3_mat)
421 IF (
ASSOCIATED(krylov_space%block4_mat))
THEN
422 CALL cp_fm_release(krylov_space%block4_mat)
423 DEALLOCATE (krylov_space%block4_mat)
425 IF (
ASSOCIATED(krylov_space%block5_mat))
THEN
426 CALL cp_fm_release(krylov_space%block5_mat)
427 DEALLOCATE (krylov_space%block5_mat)
430 DEALLOCATE (krylov_space)
432 NULLIFY (krylov_space)
435 END SUBROUTINE krylov_space_release
448 TYPE(subspace_env_type),
POINTER :: subspace_env
449 TYPE(section_vals_type),
POINTER :: scf_section
450 REAL(
dp),
INTENT(IN) :: ecut
453 TYPE(section_vals_type),
POINTER :: mixing_section
455 cpassert(.NOT.
ASSOCIATED(subspace_env))
456 ALLOCATE (subspace_env)
458 NULLIFY (subspace_env%p_matrix_store)
459 NULLIFY (subspace_env%p_matrix_mix)
460 NULLIFY (subspace_env%chc_mat)
461 NULLIFY (subspace_env%c_vec)
462 NULLIFY (subspace_env%c0)
463 NULLIFY (subspace_env%mixing_store)
464 NULLIFY (mixing_section)
467 i_val=subspace_env%max_iter)
469 r_val=subspace_env%eps_ene)
471 r_val=subspace_env%eps_diag_sub)
473 r_val=subspace_env%eps_adapt)
474 subspace_env%mixing_method = 0
481 i_val=subspace_env%mixing_method)
483 ALLOCATE (subspace_env%mixing_store)
485 subspace_env%mixing_method, ecut=ecut)
498 SUBROUTINE diag_subspace_env_release(subspace_env)
499 TYPE(subspace_env_type),
POINTER :: subspace_env
501 IF (
ASSOCIATED(subspace_env))
THEN
503 IF (
ASSOCIATED(subspace_env%p_matrix_store))
THEN
508 CALL cp_fm_release(subspace_env%chc_mat)
509 CALL cp_fm_release(subspace_env%c_vec)
510 CALL cp_fm_release(subspace_env%c0)
512 IF (
ASSOCIATED(subspace_env%mixing_store))
THEN
514 DEALLOCATE (subspace_env%mixing_store)
517 DEALLOCATE (subspace_env)
520 END SUBROUTINE diag_subspace_env_release
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 itrative diagonalization by the block-Davidson appr...
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)
...
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 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