Line data Source code
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 module that contains the definitions of the scf types
10 : !> \par History
11 : !> 02.2003 created [fawzi]
12 : !> \author fawzi
13 : ! **************************************************************************************************
14 : MODULE qs_scf_types
15 : USE cp_dbcsr_api, ONLY: dbcsr_deallocate_matrix,&
16 : dbcsr_p_type,&
17 : dbcsr_type
18 : USE cp_dbcsr_operations, ONLY: dbcsr_deallocate_matrix_set,&
19 : dbcsr_fm_copy_plan_type
20 : USE cp_fm_types, ONLY: cp_fm_release,&
21 : cp_fm_type
22 : USE input_section_types, ONLY: section_vals_get_subs_vals,&
23 : section_vals_type,&
24 : section_vals_val_get
25 : USE kinds, ONLY: dp
26 : USE outer_scf_control_types, ONLY: qs_outer_scf_type
27 : USE preconditioner_types, ONLY: destroy_preconditioner,&
28 : preconditioner_p_type
29 : USE qs_block_davidson_types, ONLY: block_davidson_release,&
30 : davidson_type
31 : USE qs_density_mixing_types, ONLY: direct_mixing_nr,&
32 : mixing_storage_create,&
33 : mixing_storage_release,&
34 : mixing_storage_type
35 : USE qs_diis_types, ONLY: qs_diis_b_release,&
36 : qs_diis_buffer_type
37 : USE qs_fb_env_types, ONLY: fb_env_has_data,&
38 : fb_env_nullify,&
39 : fb_env_obj,&
40 : fb_env_release
41 : USE qs_kpoint_operators, ONLY: kpoint_operator_context_release,&
42 : kpoint_operator_context_type
43 : USE qs_ot_types, ONLY: qs_ot_destroy,&
44 : qs_ot_type
45 : USE qs_scf_subspace_types, ONLY: qs_scf_subspace_buffer_release,&
46 : qs_scf_subspace_buffer_type
47 : #include "./base/base_uses.f90"
48 :
49 : IMPLICIT NONE
50 : PRIVATE
51 :
52 : LOGICAL, PRIVATE, PARAMETER :: debug_this_module = .TRUE.
53 :
54 : CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_scf_types'
55 :
56 : INTEGER, PARAMETER, PUBLIC :: general_diag_method_nr = 1, &
57 : special_diag_method_nr = 2, &
58 : ot_diag_method_nr = 3, &
59 : block_krylov_diag_method_nr = 4, &
60 : block_davidson_diag_method_nr = 5, &
61 : ot_method_nr = 10, &
62 : filter_matrix_diag_method_nr = 20, &
63 : smeagol_method_nr = 41
64 :
65 : PUBLIC :: qs_scf_env_type
66 : PUBLIC :: scf_env_release, scf_env_create, scf_env_did_change
67 : PUBLIC :: scf_env_release_ot_operators
68 : PUBLIC :: krylov_settings_type, krylov_settings_create
69 : PUBLIC :: krylov_workspace_type, krylov_workspace_release, subspace_env_type
70 : PUBLIC :: diag_subspace_env_create
71 :
72 : ! **************************************************************************************************
73 : !> \brief wrapper for temporary and cached objects used in the scf iteration
74 : !> \par History
75 : !> 02.2003 created [fawzi]
76 : !> \author fawzi
77 : ! **************************************************************************************************
78 : !> \brief Parsed Krylov solver settings of the SCF section. One fully
79 : !> initialized object exists for every run that selects the
80 : !> block-Krylov diagonalization. The Gamma and the k-point
81 : !> drivers read it alike
82 : ! **************************************************************************************************
83 : TYPE krylov_settings_type
84 : INTEGER :: nkrylov = -1, nblock = -1, max_iter = -1
85 : LOGICAL :: always_check_conv = .FALSE.
86 : REAL(dp) :: eps_std_diag = -1.0_dp, eps_conv = -1.0_dp, eps_adapt = -1.0_dp
87 : END TYPE krylov_settings_type
88 :
89 : !> \brief Workspace and convergence statistics of the real-Lanczos
90 : !> Gamma refinement. The k-point drivers never allocate this
91 : !> type: their complex kernel takes a caller-owned workspace
92 : ! **************************************************************************************************
93 : TYPE krylov_workspace_type
94 : ! the parsed settings of the run, shared with the SCF environment
95 : TYPE(krylov_settings_type), POINTER :: settings => NULL()
96 : INTEGER :: nmo_conv = -1, nmo_nc = -1
97 : REAL(dp) :: max_res_norm = -1.0_dp, min_res_norm = -1.0_dp
98 : REAL(dp), DIMENSION(:), POINTER :: c_eval => NULL(), t_eval => NULL()
99 : TYPE(cp_fm_type), DIMENSION(:), POINTER :: v_mat => NULL(), mo_conv => NULL(), mo_refine => NULL()
100 : TYPE(cp_fm_type), POINTER :: tmp_mat => NULL()
101 : !NOTE: the following matrices are small and could be used as standard array rather than distributed fm
102 : TYPE(cp_fm_type), POINTER :: block1_mat => NULL(), block2_mat => NULL(), block3_mat => NULL(), &
103 : block4_mat => NULL(), block5_mat => NULL()
104 : TYPE(cp_fm_type), DIMENSION(:), POINTER :: c_vec => NULL(), chc_mat => NULL()
105 : END TYPE krylov_workspace_type
106 :
107 : TYPE subspace_env_type
108 : INTEGER :: max_iter = -1, mixing_method = -1
109 : REAL(dp) :: eps_diag_sub = -1.0_dp, eps_ene = -1.0_dp, eps_adapt = -1.0_dp
110 : TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: p_matrix_store => NULL()
111 : TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: p_matrix_mix => NULL()
112 : TYPE(cp_fm_type), DIMENSION(:), POINTER :: chc_mat => NULL(), c_vec => NULL(), c0 => NULL()
113 : TYPE(mixing_storage_type), POINTER :: mixing_store => NULL()
114 : END TYPE subspace_env_type
115 :
116 : TYPE floating_basis_type
117 : REAL(KIND=dp), DIMENSION(:, :), POINTER :: gradient => NULL()
118 : END TYPE floating_basis_type
119 : ! **************************************************************************************************
120 : TYPE qs_scf_env_type
121 : TYPE(qs_outer_scf_type) :: outer_scf = qs_outer_scf_type()
122 : INTEGER :: iter_count = -1
123 : INTEGER :: cholesky_method = -1, nelectron = -1, method = -1, mixing_method = -1, nskip_mixing = -1
124 : 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
125 : ! ADIIS diagnostics: accepted-step norm and raw-map delta.
126 : REAL(KIND=dp) :: step_norm = -1.0_dp, raw_map_delta = -1.0_dp
127 : ! Occupied-space regularization used only to generate ADIIS candidates.
128 : REAL(KIND=dp) :: adiis_shift = 0.0_dp
129 : CHARACTER(len=15) :: iter_method = ""
130 : COMPLEX(KIND=dp), DIMENSION(:, :, :), POINTER :: cc_buffer => NULL()
131 : LOGICAL :: print_iter_line = .FALSE., skip_mixing = .FALSE., skip_diis = .FALSE., needs_ortho = .FALSE., &
132 : adiis_check_next = .FALSE., adiis_validated = .FALSE., &
133 : raw_map_delta_valid = .FALSE.
134 : TYPE(mixing_storage_type), POINTER :: mixing_store => NULL()
135 : TYPE(cp_fm_type), DIMENSION(:), POINTER :: scf_work1 => NULL(), scf_work1_red => NULL()
136 : ! Gamma copy plans: overlap at index 0, KS matrices at the spin indices.
137 : TYPE(dbcsr_fm_copy_plan_type), ALLOCATABLE :: fm_copy_plan(:)
138 : TYPE(cp_fm_type), POINTER :: scf_work2 => NULL(), ortho => NULL(), ortho_m1 => NULL(), &
139 : s_half => NULL(), s_minus_one => NULL(), &
140 : scf_work2_red => NULL(), ortho_red => NULL(), ortho_m1_red => NULL()
141 : TYPE(krylov_settings_type), POINTER :: krylov_settings => NULL()
142 : TYPE(krylov_workspace_type), POINTER :: krylov_space => NULL()
143 : TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: p_delta => NULL(), p_mix_new => NULL()
144 : TYPE(dbcsr_type), POINTER :: ortho_dbcsr => NULL(), buf1_dbcsr => NULL(), buf2_dbcsr => NULL()
145 : TYPE(preconditioner_p_type), DIMENSION(:), POINTER :: ot_preconditioner => NULL()
146 : TYPE(qs_ot_type), POINTER, DIMENSION(:) :: qs_ot_env => NULL()
147 : ! K-point operator routing and overlap are valid for one inner SCF loop.
148 : TYPE(kpoint_operator_context_type), ALLOCATABLE :: ot_operator_ctx
149 : LOGICAL :: ot_ks_valid = .FALSE.
150 : TYPE(qs_diis_buffer_type), POINTER :: scf_diis_buffer => NULL()
151 : TYPE(qs_scf_subspace_buffer_type), POINTER :: scf_subspace_buffer => NULL()
152 : TYPE(subspace_env_type), POINTER :: subspace_env => NULL()
153 : TYPE(davidson_type), POINTER, DIMENSION(:) :: block_davidson_env => NULL()
154 : TYPE(fb_env_obj) :: filter_matrix_env = fb_env_obj()
155 : TYPE(floating_basis_type) :: floating_basis = floating_basis_type()
156 : !> reference molecular orbitals for the maximum overlap method
157 : TYPE(cp_fm_type), DIMENSION(:), POINTER :: mom_ref_mo_coeff => NULL()
158 : !> MOM-related work matrices
159 : TYPE(cp_fm_type), DIMENSION(:), POINTER :: mom_overlap => NULL(), mom_s_mo_coeff => NULL()
160 : END TYPE qs_scf_env_type
161 :
162 : CONTAINS
163 :
164 : ! **************************************************************************************************
165 : !> \brief Drop k-point OT operator caches before their pools or layout can change.
166 : !> \param scf_env SCF environment owning the operator context
167 : ! **************************************************************************************************
168 54578 : SUBROUTINE scf_env_release_ot_operators(scf_env)
169 : TYPE(qs_scf_env_type), INTENT(INOUT) :: scf_env
170 :
171 54578 : IF (ALLOCATED(scf_env%ot_operator_ctx)) THEN
172 274 : CALL kpoint_operator_context_release(scf_env%ot_operator_ctx)
173 274 : DEALLOCATE (scf_env%ot_operator_ctx)
174 : END IF
175 54578 : scf_env%ot_ks_valid = .FALSE.
176 54578 : END SUBROUTINE scf_env_release_ot_operators
177 :
178 : ! **************************************************************************************************
179 : !> \brief allocates and initialize an scf_env
180 : !> \param scf_env the scf env to initialize
181 : !> \par History
182 : !> 02.2003 created [fawzi]
183 : !> \author fawzi
184 : ! **************************************************************************************************
185 8305 : SUBROUTINE scf_env_create(scf_env)
186 : TYPE(qs_scf_env_type), INTENT(OUT) :: scf_env
187 :
188 : CHARACTER(len=*), PARAMETER :: routineN = 'scf_env_create'
189 :
190 : INTEGER :: handle
191 :
192 8305 : CALL timeset(routineN, handle)
193 :
194 8305 : scf_env%iter_count = 0
195 8305 : scf_env%nelectron = 0
196 8305 : scf_env%iter_param = 0.0_dp
197 8305 : scf_env%iter_delta = 0.0_dp
198 8305 : scf_env%step_norm = 0.0_dp
199 8305 : scf_env%raw_map_delta = 0.0_dp
200 8305 : scf_env%iter_method = ""
201 8305 : scf_env%print_iter_line = .TRUE.
202 8305 : scf_env%skip_mixing = .FALSE.
203 8305 : scf_env%skip_diis = .FALSE.
204 8305 : scf_env%needs_ortho = .FALSE.
205 8305 : scf_env%adiis_check_next = .FALSE.
206 8305 : scf_env%adiis_validated = .FALSE.
207 8305 : scf_env%raw_map_delta_valid = .FALSE.
208 8305 : scf_env%adiis_shift = 0.0_dp
209 8305 : scf_env%method = -1
210 8305 : scf_env%mixing_method = -1
211 8305 : scf_env%p_mix_alpha = 1.0_dp
212 8305 : scf_env%cholesky_method = -1
213 8305 : scf_env%outer_scf%iter_count = 0
214 8305 : scf_env%sum_zeff_corr = 0.0_dp
215 8305 : NULLIFY (scf_env%outer_scf%variables)
216 8305 : NULLIFY (scf_env%outer_scf%gradient)
217 8305 : NULLIFY (scf_env%outer_scf%energy)
218 8305 : NULLIFY (scf_env%outer_scf%count)
219 8305 : NULLIFY (scf_env%outer_scf%inv_jacobian)
220 8305 : scf_env%outer_scf%deallocate_jacobian = .TRUE.
221 8305 : NULLIFY (scf_env%scf_work1)
222 8305 : NULLIFY (scf_env%scf_work2)
223 8305 : NULLIFY (scf_env%scf_work1_red)
224 8305 : NULLIFY (scf_env%scf_work2_red)
225 8305 : NULLIFY (scf_env%ortho)
226 8305 : NULLIFY (scf_env%ortho_red)
227 8305 : NULLIFY (scf_env%ortho_dbcsr)
228 8305 : NULLIFY (scf_env%ortho_m1)
229 8305 : NULLIFY (scf_env%ortho_m1_red)
230 8305 : NULLIFY (scf_env%p_mix_new)
231 8305 : NULLIFY (scf_env%ot_preconditioner)
232 8305 : NULLIFY (scf_env%qs_ot_env)
233 8305 : NULLIFY (scf_env%scf_diis_buffer)
234 8305 : NULLIFY (scf_env%scf_subspace_buffer)
235 8305 : NULLIFY (scf_env%buf1_dbcsr)
236 8305 : NULLIFY (scf_env%buf2_dbcsr)
237 8305 : NULLIFY (scf_env%s_half)
238 8305 : NULLIFY (scf_env%p_delta)
239 8305 : NULLIFY (scf_env%s_minus_one)
240 8305 : NULLIFY (scf_env%cc_buffer)
241 8305 : NULLIFY (scf_env%mixing_store)
242 8305 : NULLIFY (scf_env%krylov_space)
243 8305 : NULLIFY (scf_env%subspace_env)
244 8305 : NULLIFY (scf_env%block_davidson_env)
245 8305 : NULLIFY (scf_env%floating_basis%gradient)
246 8305 : CALL fb_env_nullify(scf_env%filter_matrix_env)
247 8305 : NULLIFY (scf_env%mom_ref_mo_coeff)
248 8305 : NULLIFY (scf_env%mom_overlap)
249 8305 : NULLIFY (scf_env%mom_s_mo_coeff)
250 :
251 8305 : CALL timestop(handle)
252 :
253 8305 : END SUBROUTINE scf_env_create
254 :
255 : ! **************************************************************************************************
256 : !> \brief function to be called to inform the scf_env about changes
257 : !> \param scf_env the scf env to inform
258 : !> \par History
259 : !> 03.2003 created [fawzi]
260 : !> \author fawzi
261 : ! **************************************************************************************************
262 20022 : SUBROUTINE scf_env_did_change(scf_env)
263 : TYPE(qs_scf_env_type), INTENT(INOUT) :: scf_env
264 :
265 : CHARACTER(len=*), PARAMETER :: routineN = 'scf_env_did_change'
266 :
267 : INTEGER :: handle
268 :
269 20022 : CALL timeset(routineN, handle)
270 :
271 20022 : CALL scf_env_release_ot_operators(scf_env)
272 25076 : IF (ALLOCATED(scf_env%fm_copy_plan)) DEALLOCATE (scf_env%fm_copy_plan)
273 20022 : IF (ASSOCIATED(scf_env%p_mix_new)) THEN
274 2064 : CALL dbcsr_deallocate_matrix_set(scf_env%p_mix_new)
275 : END IF
276 20022 : IF (ASSOCIATED(scf_env%p_delta)) THEN
277 14 : CALL dbcsr_deallocate_matrix_set(scf_env%p_delta)
278 : END IF
279 20022 : IF (ASSOCIATED(scf_env%scf_subspace_buffer)) THEN
280 0 : CALL qs_scf_subspace_buffer_release(scf_env%scf_subspace_buffer)
281 0 : DEALLOCATE (scf_env%scf_subspace_buffer)
282 : END IF
283 20022 : CALL cp_fm_release(scf_env%mom_ref_mo_coeff)
284 :
285 20022 : CALL timestop(handle)
286 :
287 20022 : END SUBROUTINE scf_env_did_change
288 :
289 : ! **************************************************************************************************
290 : !> \brief releases an scf_env (see doc/ReferenceCounting.html)
291 : !> \param scf_env the environment to release
292 : !> \par History
293 : !> 02.2003 created [fawzi]
294 : !> \author fawzi
295 : ! **************************************************************************************************
296 8305 : SUBROUTINE scf_env_release(scf_env)
297 :
298 : TYPE(qs_scf_env_type), INTENT(INOUT) :: scf_env
299 :
300 : CHARACTER(len=*), PARAMETER :: routineN = 'scf_env_release'
301 :
302 : INTEGER :: handle, i
303 :
304 8305 : CALL timeset(routineN, handle)
305 :
306 8305 : CALL scf_env_release_ot_operators(scf_env)
307 10805 : IF (ALLOCATED(scf_env%fm_copy_plan)) DEALLOCATE (scf_env%fm_copy_plan)
308 8305 : CALL cp_fm_release(scf_env%scf_work1)
309 8305 : IF (ASSOCIATED(scf_env%scf_work1_red)) THEN
310 0 : CALL cp_fm_release(scf_env%scf_work1_red)
311 0 : DEALLOCATE (scf_env%scf_work1_red)
312 : NULLIFY (scf_env%scf_work1_red)
313 : END IF
314 8305 : IF (ASSOCIATED(scf_env%scf_work2)) THEN
315 784 : CALL cp_fm_release(scf_env%scf_work2)
316 784 : DEALLOCATE (scf_env%scf_work2)
317 : NULLIFY (scf_env%scf_work2)
318 : END IF
319 8305 : IF (ASSOCIATED(scf_env%scf_work2_red)) THEN
320 0 : CALL cp_fm_release(scf_env%scf_work2_red)
321 0 : DEALLOCATE (scf_env%scf_work2_red)
322 : NULLIFY (scf_env%scf_work2_red)
323 : END IF
324 8305 : IF (ASSOCIATED(scf_env%ortho)) THEN
325 784 : CALL cp_fm_release(scf_env%ortho)
326 784 : DEALLOCATE (scf_env%ortho)
327 : NULLIFY (scf_env%ortho)
328 : END IF
329 8305 : IF (ASSOCIATED(scf_env%ortho_red)) THEN
330 0 : CALL cp_fm_release(scf_env%ortho_red)
331 0 : DEALLOCATE (scf_env%ortho_red)
332 : NULLIFY (scf_env%ortho_red)
333 : END IF
334 8305 : IF (ASSOCIATED(scf_env%ortho_m1)) THEN
335 0 : CALL cp_fm_release(scf_env%ortho_m1)
336 0 : DEALLOCATE (scf_env%ortho_m1)
337 : NULLIFY (scf_env%ortho_m1)
338 : END IF
339 8305 : IF (ASSOCIATED(scf_env%ortho_m1_red)) THEN
340 0 : CALL cp_fm_release(scf_env%ortho_m1_red)
341 0 : DEALLOCATE (scf_env%ortho_m1_red)
342 : NULLIFY (scf_env%ortho_m1_red)
343 : END IF
344 8305 : IF (ASSOCIATED(scf_env%ortho_dbcsr)) THEN
345 : ! we should not end up here, and give back using the pools
346 0 : CALL dbcsr_deallocate_matrix(scf_env%ortho_dbcsr)
347 : END IF
348 8305 : IF (ASSOCIATED(scf_env%buf1_dbcsr)) THEN
349 : ! we should not end up here, and give back using the pools
350 0 : CALL dbcsr_deallocate_matrix(scf_env%buf1_dbcsr)
351 : END IF
352 8305 : IF (ASSOCIATED(scf_env%buf2_dbcsr)) THEN
353 : ! we should not end up here, and give back using the pools
354 0 : CALL dbcsr_deallocate_matrix(scf_env%buf2_dbcsr)
355 : END IF
356 8305 : IF (ASSOCIATED(scf_env%s_half)) THEN
357 34 : CALL cp_fm_release(scf_env%s_half)
358 34 : DEALLOCATE (scf_env%s_half)
359 : END IF
360 8305 : IF (ASSOCIATED(scf_env%s_minus_one)) THEN
361 0 : CALL cp_fm_release(scf_env%s_minus_one)
362 0 : DEALLOCATE (scf_env%s_minus_one)
363 : END IF
364 8305 : IF (ASSOCIATED(scf_env%p_mix_new)) THEN
365 : ! we should not end up here, and give back using the pools
366 772 : CALL dbcsr_deallocate_matrix_set(scf_env%p_mix_new)
367 : END IF
368 8305 : IF (ASSOCIATED(scf_env%p_delta)) THEN
369 : ! we should not end up here, and give back using the pools
370 10 : CALL dbcsr_deallocate_matrix_set(scf_env%p_delta)
371 : END IF
372 8305 : IF (ASSOCIATED(scf_env%ot_preconditioner)) THEN
373 5781 : DO i = 1, SIZE(scf_env%ot_preconditioner)
374 5781 : IF (ASSOCIATED(scf_env%ot_preconditioner(i)%preconditioner)) THEN
375 3211 : CALL destroy_preconditioner(scf_env%ot_preconditioner(i)%preconditioner)
376 3211 : DEALLOCATE (scf_env%ot_preconditioner(i)%preconditioner)
377 : END IF
378 : END DO
379 2499 : DEALLOCATE (scf_env%ot_preconditioner)
380 : END IF
381 8305 : IF (ASSOCIATED(scf_env%qs_ot_env)) THEN
382 0 : DO i = 1, SIZE(scf_env%qs_ot_env)
383 0 : CALL qs_ot_destroy(scf_env%qs_ot_env(i))
384 : END DO
385 0 : DEALLOCATE (scf_env%qs_ot_env)
386 : END IF
387 8305 : IF (ASSOCIATED(scf_env%scf_diis_buffer)) THEN
388 4608 : CALL qs_diis_b_release(scf_env%scf_diis_buffer)
389 4608 : DEALLOCATE (scf_env%scf_diis_buffer)
390 : END IF
391 8305 : IF (ASSOCIATED(scf_env%scf_subspace_buffer)) THEN
392 12 : CALL qs_scf_subspace_buffer_release(scf_env%scf_subspace_buffer)
393 12 : DEALLOCATE (scf_env%scf_subspace_buffer)
394 : END IF
395 8305 : IF (ASSOCIATED(scf_env%outer_scf%variables)) THEN
396 0 : DEALLOCATE (scf_env%outer_scf%variables)
397 : END IF
398 8305 : IF (ASSOCIATED(scf_env%outer_scf%count)) THEN
399 0 : DEALLOCATE (scf_env%outer_scf%count)
400 : END IF
401 8305 : IF (ASSOCIATED(scf_env%outer_scf%gradient)) THEN
402 0 : DEALLOCATE (scf_env%outer_scf%gradient)
403 : END IF
404 8305 : IF (ASSOCIATED(scf_env%outer_scf%inv_jacobian)) THEN
405 6 : DEALLOCATE (scf_env%outer_scf%inv_jacobian)
406 : END IF
407 8305 : IF (ASSOCIATED(scf_env%outer_scf%energy)) THEN
408 0 : DEALLOCATE (scf_env%outer_scf%energy)
409 : END IF
410 8305 : IF (ASSOCIATED(scf_env%cc_buffer)) THEN
411 0 : DEALLOCATE (scf_env%cc_buffer)
412 : END IF
413 8305 : IF (ASSOCIATED(scf_env%mixing_store)) THEN
414 8159 : CALL mixing_storage_release(scf_env%mixing_store)
415 8159 : DEALLOCATE (scf_env%mixing_store)
416 : END IF
417 8305 : IF (ASSOCIATED(scf_env%krylov_space)) THEN
418 6 : CALL krylov_workspace_release(scf_env%krylov_space)
419 : END IF
420 8305 : IF (ASSOCIATED(scf_env%krylov_settings)) THEN
421 28 : DEALLOCATE (scf_env%krylov_settings)
422 : END IF
423 8305 : IF (ASSOCIATED(scf_env%subspace_env)) THEN
424 2 : CALL diag_subspace_env_release(scf_env%subspace_env)
425 : END IF
426 8305 : IF (ASSOCIATED(scf_env%block_davidson_env)) THEN
427 38 : CALL block_davidson_release(scf_env%block_davidson_env)
428 : END IF
429 8305 : IF (fb_env_has_data(scf_env%filter_matrix_env)) THEN
430 10 : CALL fb_env_release(scf_env%filter_matrix_env)
431 : END IF
432 8305 : IF (ASSOCIATED(scf_env%floating_basis%gradient)) THEN
433 0 : DEALLOCATE (scf_env%floating_basis%gradient)
434 : END IF
435 8305 : CALL cp_fm_release(scf_env%mom_ref_mo_coeff)
436 8305 : CALL cp_fm_release(scf_env%mom_overlap)
437 8305 : CALL cp_fm_release(scf_env%mom_s_mo_coeff)
438 :
439 8305 : CALL timestop(handle)
440 :
441 8305 : END SUBROUTINE scf_env_release
442 :
443 : ! **************************************************************************************************
444 : !> \brief creates the Krylov solver settings
445 : !> \param krylov_settings returned settings object
446 : !> \param scf_section ...
447 : ! **************************************************************************************************
448 28 : SUBROUTINE krylov_settings_create(krylov_settings, scf_section)
449 :
450 : TYPE(krylov_settings_type), POINTER :: krylov_settings
451 : TYPE(section_vals_type), POINTER :: scf_section
452 :
453 28 : CPASSERT(.NOT. ASSOCIATED(krylov_settings))
454 28 : ALLOCATE (krylov_settings)
455 :
456 : CALL section_vals_val_get(scf_section, "DIAGONALIZATION%MAX_ITER", &
457 28 : i_val=krylov_settings%max_iter)
458 : CALL section_vals_val_get(scf_section, "DIAGONALIZATION%KRYLOV%NKRYLOV", &
459 28 : i_val=krylov_settings%nkrylov)
460 : CALL section_vals_val_get(scf_section, "DIAGONALIZATION%KRYLOV%NBLOCK", &
461 28 : i_val=krylov_settings%nblock)
462 : CALL section_vals_val_get(scf_section, "DIAGONALIZATION%KRYLOV%EPS_KRYLOV", &
463 28 : r_val=krylov_settings%eps_conv)
464 : CALL section_vals_val_get(scf_section, "DIAGONALIZATION%KRYLOV%EPS_STD_DIAG", &
465 28 : r_val=krylov_settings%eps_std_diag)
466 : CALL section_vals_val_get(scf_section, "DIAGONALIZATION%EPS_ADAPT", &
467 28 : r_val=krylov_settings%eps_adapt)
468 : CALL section_vals_val_get(scf_section, "DIAGONALIZATION%KRYLOV%CHECK_MOS_CONV", &
469 28 : l_val=krylov_settings%always_check_conv)
470 :
471 28 : END SUBROUTINE krylov_settings_create
472 :
473 : ! **************************************************************************************************
474 : !> \brief releases the real-Lanczos workspace
475 : !> \param krylov_space ...
476 : !> \par History
477 : !> 05.2009 created [MI]
478 : !> \author [MI]
479 : ! **************************************************************************************************
480 6 : SUBROUTINE krylov_workspace_release(krylov_space)
481 : TYPE(krylov_workspace_type), POINTER :: krylov_space
482 :
483 6 : IF (ASSOCIATED(krylov_space)) THEN
484 :
485 6 : IF (ASSOCIATED(krylov_space%c_eval)) THEN
486 6 : DEALLOCATE (krylov_space%c_eval)
487 6 : NULLIFY (krylov_space%c_eval)
488 : END IF
489 6 : IF (ASSOCIATED(krylov_space%t_eval)) THEN
490 6 : DEALLOCATE (krylov_space%t_eval)
491 6 : NULLIFY (krylov_space%t_eval)
492 : END IF
493 :
494 6 : IF (ASSOCIATED(krylov_space%v_mat)) THEN
495 6 : CALL cp_fm_release(krylov_space%v_mat)
496 : END IF
497 6 : IF (ASSOCIATED(krylov_space%mo_conv)) THEN
498 6 : CALL cp_fm_release(krylov_space%mo_conv)
499 : END IF
500 6 : IF (ASSOCIATED(krylov_space%mo_refine)) THEN
501 6 : CALL cp_fm_release(krylov_space%mo_refine)
502 : END IF
503 6 : IF (ASSOCIATED(krylov_space%chc_mat)) THEN
504 6 : CALL cp_fm_release(krylov_space%chc_mat)
505 : END IF
506 6 : IF (ASSOCIATED(krylov_space%c_vec)) THEN
507 6 : CALL cp_fm_release(krylov_space%c_vec)
508 : END IF
509 :
510 6 : IF (ASSOCIATED(krylov_space%tmp_mat)) THEN
511 6 : CALL cp_fm_release(krylov_space%tmp_mat)
512 6 : DEALLOCATE (krylov_space%tmp_mat)
513 : END IF
514 6 : IF (ASSOCIATED(krylov_space%block1_mat)) THEN
515 6 : CALL cp_fm_release(krylov_space%block1_mat)
516 6 : DEALLOCATE (krylov_space%block1_mat)
517 : END IF
518 6 : IF (ASSOCIATED(krylov_space%block2_mat)) THEN
519 6 : CALL cp_fm_release(krylov_space%block2_mat)
520 6 : DEALLOCATE (krylov_space%block2_mat)
521 : END IF
522 6 : IF (ASSOCIATED(krylov_space%block3_mat)) THEN
523 6 : CALL cp_fm_release(krylov_space%block3_mat)
524 6 : DEALLOCATE (krylov_space%block3_mat)
525 : END IF
526 6 : IF (ASSOCIATED(krylov_space%block4_mat)) THEN
527 6 : CALL cp_fm_release(krylov_space%block4_mat)
528 6 : DEALLOCATE (krylov_space%block4_mat)
529 : END IF
530 6 : IF (ASSOCIATED(krylov_space%block5_mat)) THEN
531 6 : CALL cp_fm_release(krylov_space%block5_mat)
532 6 : DEALLOCATE (krylov_space%block5_mat)
533 : END IF
534 :
535 6 : DEALLOCATE (krylov_space)
536 :
537 : NULLIFY (krylov_space)
538 : END IF
539 :
540 6 : END SUBROUTINE krylov_workspace_release
541 :
542 : ! **************************************************************************************************
543 : !> \brief creates subspace-rotation environment
544 : !> \param subspace_env ...
545 : !> \param scf_section ...
546 : !> \param ecut ...
547 : !> \par History
548 : !> 09.2009 created [MI]
549 : !> \author [MI]
550 : ! **************************************************************************************************
551 4 : SUBROUTINE diag_subspace_env_create(subspace_env, scf_section, ecut)
552 :
553 : TYPE(subspace_env_type), POINTER :: subspace_env
554 : TYPE(section_vals_type), POINTER :: scf_section
555 : REAL(dp), INTENT(IN) :: ecut
556 :
557 : LOGICAL :: do_mixing
558 : TYPE(section_vals_type), POINTER :: mixing_section
559 :
560 2 : CPASSERT(.NOT. ASSOCIATED(subspace_env))
561 2 : ALLOCATE (subspace_env)
562 :
563 : NULLIFY (subspace_env%p_matrix_store)
564 : NULLIFY (subspace_env%p_matrix_mix)
565 : NULLIFY (subspace_env%chc_mat)
566 : NULLIFY (subspace_env%c_vec)
567 : NULLIFY (subspace_env%c0)
568 : NULLIFY (subspace_env%mixing_store)
569 2 : NULLIFY (mixing_section)
570 :
571 : CALL section_vals_val_get(scf_section, "DIAGONALIZATION%DIAG_SUB_SCF%MAX_ITER", &
572 2 : i_val=subspace_env%max_iter)
573 : CALL section_vals_val_get(scf_section, "DIAGONALIZATION%DIAG_SUB_SCF%EPS_ENE", &
574 2 : r_val=subspace_env%eps_ene)
575 : CALL section_vals_val_get(scf_section, "DIAGONALIZATION%DIAG_SUB_SCF%EPS_SKIP_SUB_DIAG", &
576 2 : r_val=subspace_env%eps_diag_sub)
577 : CALL section_vals_val_get(scf_section, "DIAGONALIZATION%DIAG_SUB_SCF%EPS_ADAPT_SCF", &
578 2 : r_val=subspace_env%eps_adapt)
579 2 : subspace_env%mixing_method = 0
580 : do_mixing = .FALSE.
581 2 : mixing_section => section_vals_get_subs_vals(scf_section, "DIAGONALIZATION%DIAG_SUB_SCF%MIXING")
582 : CALL section_vals_val_get(mixing_section, "_SECTION_PARAMETERS_", &
583 2 : l_val=do_mixing)
584 2 : IF (do_mixing) THEN
585 : CALL section_vals_val_get(mixing_section, "METHOD", &
586 2 : i_val=subspace_env%mixing_method)
587 2 : IF (subspace_env%mixing_method >= direct_mixing_nr) THEN
588 8 : ALLOCATE (subspace_env%mixing_store)
589 : CALL mixing_storage_create(subspace_env%mixing_store, mixing_section, &
590 2 : subspace_env%mixing_method, ecut=ecut)
591 : END IF
592 : END IF
593 :
594 2 : END SUBROUTINE diag_subspace_env_create
595 :
596 : ! **************************************************************************************************
597 : !> \brief releases subspace-rotation environment
598 : !> \param subspace_env ...
599 : !> \par History
600 : !> 09.2009 created [MI]
601 : !> \author [MI]
602 : ! **************************************************************************************************
603 2 : SUBROUTINE diag_subspace_env_release(subspace_env)
604 : TYPE(subspace_env_type), POINTER :: subspace_env
605 :
606 2 : IF (ASSOCIATED(subspace_env)) THEN
607 :
608 2 : IF (ASSOCIATED(subspace_env%p_matrix_store)) THEN
609 :
610 : CPASSERT(.TRUE.)
611 2 : CALL dbcsr_deallocate_matrix_set(subspace_env%p_matrix_store)
612 : END IF
613 2 : CALL cp_fm_release(subspace_env%chc_mat)
614 2 : CALL cp_fm_release(subspace_env%c_vec)
615 2 : CALL cp_fm_release(subspace_env%c0)
616 :
617 2 : IF (ASSOCIATED(subspace_env%mixing_store)) THEN
618 2 : CALL mixing_storage_release(subspace_env%mixing_store)
619 2 : DEALLOCATE (subspace_env%mixing_store)
620 : END IF
621 :
622 2 : DEALLOCATE (subspace_env)
623 : END IF
624 :
625 2 : END SUBROUTINE diag_subspace_env_release
626 :
627 0 : END MODULE qs_scf_types
|