42#include "./base/base_uses.f90"
47 LOGICAL,
PRIVATE,
PARAMETER :: debug_this_module = .true.
49 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_scf_types'
72 INTEGER :: nkrylov = -1, nblock = -1, nmo_conv = -1, nmo_nc = -1, max_iter = -1
73 LOGICAL :: always_check_conv = .false.
74 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
75 REAL(
dp),
DIMENSION(:),
POINTER :: c_eval => null(), t_eval => null()
76 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: v_mat => null(), mo_conv => null(), mo_refine => null()
79 TYPE(
cp_fm_type),
POINTER :: block1_mat => null(), block2_mat => null(), block3_mat => null(), &
80 block4_mat => null(), block5_mat => null()
81 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: c_vec => null(), chc_mat => null()
85 INTEGER :: max_iter = -1, mixing_method = -1
86 REAL(
dp) :: eps_diag_sub = -1.0_dp, eps_ene = -1.0_dp, eps_adapt = -1.0_dp
87 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: p_matrix_store => null()
88 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: p_matrix_mix => null()
89 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: chc_mat => null(), c_vec => null(), c0 => null()
93 TYPE floating_basis_type
94 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: gradient => null()
95 END TYPE floating_basis_type
99 INTEGER :: iter_count = -1
100 INTEGER :: cholesky_method = -1, nelectron = -1, method = -1, mixing_method = -1, nskip_mixing = -1
101 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
102 CHARACTER(len=15) :: iter_method =
""
103 COMPLEX(KIND=dp),
DIMENSION(:, :, :),
POINTER :: cc_buffer => null()
104 LOGICAL :: print_iter_line = .false., skip_mixing = .false., skip_diis = .false., needs_ortho = .false.
106 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: scf_work1 => null(), scf_work1_red => null()
107 TYPE(
cp_fm_type),
POINTER :: scf_work2 => null(), ortho => null(), ortho_m1 => null(), &
108 s_half => null(), s_minus_one => null(), &
109 scf_work2_red => null(), ortho_red => null(), ortho_m1_red => null()
111 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: p_delta => null(), p_mix_new => null()
112 TYPE(
dbcsr_type),
POINTER :: ortho_dbcsr => null(), buf1_dbcsr => null(), buf2_dbcsr => null()
114 TYPE(
qs_ot_type),
POINTER,
DIMENSION(:) :: qs_ot_env => null()
119 TYPE(floating_basis_type) :: floating_basis = floating_basis_type()
121 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: mom_ref_mo_coeff => null()
123 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: mom_overlap => null(), mom_s_mo_coeff => null()
138 CHARACTER(len=*),
PARAMETER :: routinen =
'scf_env_create'
142 CALL timeset(routinen, handle)
144 scf_env%iter_count = 0
145 scf_env%nelectron = 0
146 scf_env%iter_param = 0.0_dp
147 scf_env%iter_delta = 0.0_dp
148 scf_env%iter_method =
""
149 scf_env%print_iter_line = .true.
150 scf_env%skip_mixing = .false.
151 scf_env%skip_diis = .false.
152 scf_env%needs_ortho = .false.
154 scf_env%mixing_method = -1
155 scf_env%p_mix_alpha = 1.0_dp
156 scf_env%cholesky_method = -1
157 scf_env%outer_scf%iter_count = 0
158 scf_env%sum_zeff_corr = 0.0_dp
159 NULLIFY (scf_env%outer_scf%variables)
160 NULLIFY (scf_env%outer_scf%gradient)
161 NULLIFY (scf_env%outer_scf%energy)
162 NULLIFY (scf_env%outer_scf%count)
163 NULLIFY (scf_env%outer_scf%inv_jacobian)
164 scf_env%outer_scf%deallocate_jacobian = .true.
165 NULLIFY (scf_env%scf_work1)
166 NULLIFY (scf_env%scf_work2)
167 NULLIFY (scf_env%scf_work1_red)
168 NULLIFY (scf_env%scf_work2_red)
169 NULLIFY (scf_env%ortho)
170 NULLIFY (scf_env%ortho_red)
171 NULLIFY (scf_env%ortho_dbcsr)
172 NULLIFY (scf_env%ortho_m1)
173 NULLIFY (scf_env%ortho_m1_red)
174 NULLIFY (scf_env%p_mix_new)
175 NULLIFY (scf_env%ot_preconditioner)
176 NULLIFY (scf_env%qs_ot_env)
177 NULLIFY (scf_env%scf_diis_buffer)
178 NULLIFY (scf_env%buf1_dbcsr)
179 NULLIFY (scf_env%buf2_dbcsr)
180 NULLIFY (scf_env%s_half)
181 NULLIFY (scf_env%p_delta)
182 NULLIFY (scf_env%s_minus_one)
183 NULLIFY (scf_env%cc_buffer)
184 NULLIFY (scf_env%mixing_store)
185 NULLIFY (scf_env%krylov_space)
186 NULLIFY (scf_env%subspace_env)
187 NULLIFY (scf_env%block_davidson_env)
188 NULLIFY (scf_env%floating_basis%gradient)
190 NULLIFY (scf_env%mom_ref_mo_coeff)
191 NULLIFY (scf_env%mom_overlap)
192 NULLIFY (scf_env%mom_s_mo_coeff)
194 CALL timestop(handle)
208 CHARACTER(len=*),
PARAMETER :: routinen =
'scf_env_did_change'
212 CALL timeset(routinen, handle)
214 IF (
ASSOCIATED(scf_env%p_mix_new))
THEN
217 IF (
ASSOCIATED(scf_env%p_delta))
THEN
222 CALL timestop(handle)
237 CHARACTER(len=*),
PARAMETER :: routinen =
'scf_env_release'
241 CALL timeset(routinen, handle)
244 IF (
ASSOCIATED(scf_env%scf_work1_red))
THEN
246 DEALLOCATE (scf_env%scf_work1_red)
247 NULLIFY (scf_env%scf_work1_red)
249 IF (
ASSOCIATED(scf_env%scf_work2))
THEN
251 DEALLOCATE (scf_env%scf_work2)
252 NULLIFY (scf_env%scf_work2)
254 IF (
ASSOCIATED(scf_env%scf_work2_red))
THEN
256 DEALLOCATE (scf_env%scf_work2_red)
257 NULLIFY (scf_env%scf_work2_red)
259 IF (
ASSOCIATED(scf_env%ortho))
THEN
261 DEALLOCATE (scf_env%ortho)
262 NULLIFY (scf_env%ortho)
264 IF (
ASSOCIATED(scf_env%ortho_red))
THEN
266 DEALLOCATE (scf_env%ortho_red)
267 NULLIFY (scf_env%ortho_red)
269 IF (
ASSOCIATED(scf_env%ortho_m1))
THEN
271 DEALLOCATE (scf_env%ortho_m1)
272 NULLIFY (scf_env%ortho_m1)
274 IF (
ASSOCIATED(scf_env%ortho_m1_red))
THEN
276 DEALLOCATE (scf_env%ortho_m1_red)
277 NULLIFY (scf_env%ortho_m1_red)
279 IF (
ASSOCIATED(scf_env%ortho_dbcsr))
THEN
283 IF (
ASSOCIATED(scf_env%buf1_dbcsr))
THEN
287 IF (
ASSOCIATED(scf_env%buf2_dbcsr))
THEN
291 IF (
ASSOCIATED(scf_env%s_half))
THEN
293 DEALLOCATE (scf_env%s_half)
295 IF (
ASSOCIATED(scf_env%s_minus_one))
THEN
297 DEALLOCATE (scf_env%s_minus_one)
299 IF (
ASSOCIATED(scf_env%p_mix_new))
THEN
303 IF (
ASSOCIATED(scf_env%p_delta))
THEN
307 IF (
ASSOCIATED(scf_env%ot_preconditioner))
THEN
308 DO i = 1,
SIZE(scf_env%ot_preconditioner)
310 DEALLOCATE (scf_env%ot_preconditioner(i)%preconditioner)
312 DEALLOCATE (scf_env%ot_preconditioner)
314 IF (
ASSOCIATED(scf_env%qs_ot_env))
THEN
315 DO i = 1,
SIZE(scf_env%qs_ot_env)
318 DEALLOCATE (scf_env%qs_ot_env)
320 IF (
ASSOCIATED(scf_env%scf_diis_buffer))
THEN
322 DEALLOCATE (scf_env%scf_diis_buffer)
324 IF (
ASSOCIATED(scf_env%outer_scf%variables))
THEN
325 DEALLOCATE (scf_env%outer_scf%variables)
327 IF (
ASSOCIATED(scf_env%outer_scf%count))
THEN
328 DEALLOCATE (scf_env%outer_scf%count)
330 IF (
ASSOCIATED(scf_env%outer_scf%gradient))
THEN
331 DEALLOCATE (scf_env%outer_scf%gradient)
333 IF (
ASSOCIATED(scf_env%outer_scf%inv_jacobian))
THEN
334 DEALLOCATE (scf_env%outer_scf%inv_jacobian)
336 IF (
ASSOCIATED(scf_env%outer_scf%energy))
THEN
337 DEALLOCATE (scf_env%outer_scf%energy)
339 IF (
ASSOCIATED(scf_env%cc_buffer))
THEN
340 DEALLOCATE (scf_env%cc_buffer)
342 IF (
ASSOCIATED(scf_env%mixing_store))
THEN
344 DEALLOCATE (scf_env%mixing_store)
346 IF (
ASSOCIATED(scf_env%krylov_space))
THEN
347 CALL krylov_space_release(scf_env%krylov_space)
349 IF (
ASSOCIATED(scf_env%subspace_env))
THEN
350 CALL diag_subspace_env_release(scf_env%subspace_env)
352 IF (
ASSOCIATED(scf_env%block_davidson_env))
THEN
358 IF (
ASSOCIATED(scf_env%floating_basis%gradient))
THEN
359 DEALLOCATE (scf_env%floating_basis%gradient)
365 CALL timestop(handle)
382 cpassert(.NOT.
ASSOCIATED(krylov_space))
383 ALLOCATE (krylov_space)
385 NULLIFY (krylov_space%c_eval, krylov_space%t_eval)
386 NULLIFY (krylov_space%v_mat)
387 NULLIFY (krylov_space%mo_conv, krylov_space%mo_refine)
388 NULLIFY (krylov_space%chc_mat, krylov_space%c_vec)
389 NULLIFY (krylov_space%tmp_mat)
390 NULLIFY (krylov_space%block1_mat, krylov_space%block2_mat)
391 NULLIFY (krylov_space%block3_mat, krylov_space%block4_mat, krylov_space%block5_mat)
394 i_val=krylov_space%max_iter)
396 i_val=krylov_space%nkrylov)
398 i_val=krylov_space%nblock)
400 r_val=krylov_space%eps_conv)
402 r_val=krylov_space%eps_std_diag)
404 r_val=krylov_space%eps_adapt)
406 l_val=krylov_space%always_check_conv)
417 SUBROUTINE krylov_space_release(krylov_space)
420 IF (
ASSOCIATED(krylov_space))
THEN
422 DEALLOCATE (krylov_space%c_eval)
423 DEALLOCATE (krylov_space%t_eval)
431 IF (
ASSOCIATED(krylov_space%tmp_mat))
THEN
433 DEALLOCATE (krylov_space%tmp_mat)
435 IF (
ASSOCIATED(krylov_space%block1_mat))
THEN
437 DEALLOCATE (krylov_space%block1_mat)
439 IF (
ASSOCIATED(krylov_space%block2_mat))
THEN
441 DEALLOCATE (krylov_space%block2_mat)
443 IF (
ASSOCIATED(krylov_space%block3_mat))
THEN
445 DEALLOCATE (krylov_space%block3_mat)
447 IF (
ASSOCIATED(krylov_space%block4_mat))
THEN
449 DEALLOCATE (krylov_space%block4_mat)
451 IF (
ASSOCIATED(krylov_space%block5_mat))
THEN
453 DEALLOCATE (krylov_space%block5_mat)
456 DEALLOCATE (krylov_space)
458 NULLIFY (krylov_space)
461 END SUBROUTINE krylov_space_release
476 REAL(
dp),
INTENT(IN) :: ecut
481 cpassert(.NOT.
ASSOCIATED(subspace_env))
482 ALLOCATE (subspace_env)
484 NULLIFY (subspace_env%p_matrix_store)
485 NULLIFY (subspace_env%p_matrix_mix)
486 NULLIFY (subspace_env%chc_mat)
487 NULLIFY (subspace_env%c_vec)
488 NULLIFY (subspace_env%c0)
489 NULLIFY (subspace_env%mixing_store)
490 NULLIFY (mixing_section)
493 i_val=subspace_env%max_iter)
495 r_val=subspace_env%eps_ene)
497 r_val=subspace_env%eps_diag_sub)
499 r_val=subspace_env%eps_adapt)
500 subspace_env%mixing_method = 0
507 i_val=subspace_env%mixing_method)
509 ALLOCATE (subspace_env%mixing_store)
511 subspace_env%mixing_method, ecut=ecut)
524 SUBROUTINE diag_subspace_env_release(subspace_env)
527 IF (
ASSOCIATED(subspace_env))
THEN
529 IF (
ASSOCIATED(subspace_env%p_matrix_store))
THEN
538 IF (
ASSOCIATED(subspace_env%mixing_store))
THEN
540 DEALLOCATE (subspace_env%mixing_store)
543 DEALLOCATE (subspace_env)
546 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 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)
deallocates data
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
wrapper for temporary and cached objects used in the scf iteration