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 : USE cp_fm_types, ONLY: cp_fm_release,&
20 : cp_fm_type
21 : USE input_section_types, ONLY: section_vals_get_subs_vals,&
22 : section_vals_type,&
23 : section_vals_val_get
24 : USE kinds, ONLY: dp
25 : USE outer_scf_control_types, ONLY: qs_outer_scf_type
26 : USE preconditioner_types, ONLY: destroy_preconditioner,&
27 : preconditioner_p_type
28 : USE qs_block_davidson_types, ONLY: block_davidson_release,&
29 : davidson_type
30 : USE qs_density_mixing_types, ONLY: direct_mixing_nr,&
31 : mixing_storage_create,&
32 : mixing_storage_release,&
33 : mixing_storage_type
34 : USE qs_diis_types, ONLY: qs_diis_b_release,&
35 : qs_diis_buffer_type
36 : USE qs_fb_env_types, ONLY: fb_env_has_data,&
37 : fb_env_nullify,&
38 : fb_env_obj,&
39 : fb_env_release
40 : USE qs_ot_types, ONLY: qs_ot_destroy,&
41 : qs_ot_type
42 : USE qs_scf_subspace_types, ONLY: qs_scf_subspace_buffer_release,&
43 : qs_scf_subspace_buffer_type
44 : #include "./base/base_uses.f90"
45 :
46 : IMPLICIT NONE
47 : PRIVATE
48 :
49 : LOGICAL, PRIVATE, PARAMETER :: debug_this_module = .TRUE.
50 :
51 : CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_scf_types'
52 :
53 : INTEGER, PARAMETER, PUBLIC :: general_diag_method_nr = 1, &
54 : special_diag_method_nr = 2, &
55 : ot_diag_method_nr = 3, &
56 : block_krylov_diag_method_nr = 4, &
57 : block_davidson_diag_method_nr = 5, &
58 : ot_method_nr = 10, &
59 : filter_matrix_diag_method_nr = 20, &
60 : smeagol_method_nr = 41
61 :
62 : PUBLIC :: qs_scf_env_type
63 : PUBLIC :: scf_env_release, scf_env_create, scf_env_did_change
64 : PUBLIC :: krylov_space_type, krylov_space_create, subspace_env_type
65 : PUBLIC :: diag_subspace_env_create
66 :
67 : ! **************************************************************************************************
68 : !> \brief wrapper for temporary and cached objects used in the scf iteration
69 : !> \par History
70 : !> 02.2003 created [fawzi]
71 : !> \author fawzi
72 : ! **************************************************************************************************
73 : TYPE krylov_space_type
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()
79 : TYPE(cp_fm_type), POINTER :: tmp_mat => NULL()
80 : !NOTE: the following matrices are small and could be used as standard array rather than distributed fm
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()
84 : END TYPE krylov_space_type
85 :
86 : TYPE subspace_env_type
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()
92 : TYPE(mixing_storage_type), POINTER :: mixing_store => NULL()
93 : END TYPE subspace_env_type
94 :
95 : TYPE floating_basis_type
96 : REAL(KIND=dp), DIMENSION(:, :), POINTER :: gradient => NULL()
97 : END TYPE floating_basis_type
98 : ! **************************************************************************************************
99 : TYPE qs_scf_env_type
100 : TYPE(qs_outer_scf_type) :: outer_scf = qs_outer_scf_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
104 : ! ADIIS diagnostics: accepted-step norm and raw-map delta.
105 : REAL(KIND=dp) :: step_norm = -1.0_dp, raw_map_delta = -1.0_dp
106 : ! ODA diagnostics for the most recent raw-step line search.
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.
114 : TYPE(mixing_storage_type), POINTER :: mixing_store => NULL()
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()
119 : TYPE(krylov_space_type), POINTER :: krylov_space => 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()
122 : TYPE(preconditioner_p_type), DIMENSION(:), POINTER :: ot_preconditioner => NULL()
123 : TYPE(qs_ot_type), POINTER, DIMENSION(:) :: qs_ot_env => NULL()
124 : TYPE(qs_diis_buffer_type), POINTER :: scf_diis_buffer => NULL()
125 : TYPE(qs_scf_subspace_buffer_type), POINTER :: scf_subspace_buffer => NULL()
126 : TYPE(subspace_env_type), POINTER :: subspace_env => NULL()
127 : TYPE(davidson_type), POINTER, DIMENSION(:) :: block_davidson_env => NULL()
128 : TYPE(fb_env_obj) :: filter_matrix_env = fb_env_obj()
129 : TYPE(floating_basis_type) :: floating_basis = floating_basis_type()
130 : !> reference molecular orbitals for the maximum overlap method
131 : TYPE(cp_fm_type), DIMENSION(:), POINTER :: mom_ref_mo_coeff => NULL()
132 : !> MOM-related work matrices
133 : TYPE(cp_fm_type), DIMENSION(:), POINTER :: mom_overlap => NULL(), mom_s_mo_coeff => NULL()
134 : END TYPE qs_scf_env_type
135 :
136 : CONTAINS
137 :
138 : ! **************************************************************************************************
139 : !> \brief allocates and initialize an scf_env
140 : !> \param scf_env the scf env to initialize
141 : !> \par History
142 : !> 02.2003 created [fawzi]
143 : !> \author fawzi
144 : ! **************************************************************************************************
145 7977 : SUBROUTINE scf_env_create(scf_env)
146 : TYPE(qs_scf_env_type), INTENT(OUT) :: scf_env
147 :
148 : CHARACTER(len=*), PARAMETER :: routineN = 'scf_env_create'
149 :
150 : INTEGER :: handle
151 :
152 7977 : CALL timeset(routineN, handle)
153 :
154 7977 : scf_env%iter_count = 0
155 7977 : scf_env%nelectron = 0
156 7977 : scf_env%iter_param = 0.0_dp
157 7977 : scf_env%iter_delta = 0.0_dp
158 7977 : scf_env%step_norm = 0.0_dp
159 7977 : scf_env%raw_map_delta = 0.0_dp
160 7977 : scf_env%oda_lambda = 0.0_dp
161 7977 : scf_env%oda_energy = 0.0_dp
162 7977 : scf_env%oda_gradient0 = 0.0_dp
163 7977 : scf_env%oda_gradient1 = 0.0_dp
164 7977 : scf_env%oda_evaluations = 0
165 7977 : scf_env%oda_status = ""
166 7977 : scf_env%iter_method = ""
167 7977 : scf_env%print_iter_line = .TRUE.
168 7977 : scf_env%skip_mixing = .FALSE.
169 7977 : scf_env%skip_diis = .FALSE.
170 7977 : scf_env%needs_ortho = .FALSE.
171 7977 : scf_env%adiis_check_next = .FALSE.
172 7977 : scf_env%adiis_validated = .FALSE.
173 7977 : scf_env%raw_map_delta_valid = .FALSE.
174 7977 : scf_env%method = -1
175 7977 : scf_env%mixing_method = -1
176 7977 : scf_env%p_mix_alpha = 1.0_dp
177 7977 : scf_env%cholesky_method = -1
178 7977 : scf_env%outer_scf%iter_count = 0
179 7977 : scf_env%sum_zeff_corr = 0.0_dp
180 7977 : NULLIFY (scf_env%outer_scf%variables)
181 7977 : NULLIFY (scf_env%outer_scf%gradient)
182 7977 : NULLIFY (scf_env%outer_scf%energy)
183 7977 : NULLIFY (scf_env%outer_scf%count)
184 7977 : NULLIFY (scf_env%outer_scf%inv_jacobian)
185 7977 : scf_env%outer_scf%deallocate_jacobian = .TRUE.
186 7977 : NULLIFY (scf_env%scf_work1)
187 7977 : NULLIFY (scf_env%scf_work2)
188 7977 : NULLIFY (scf_env%scf_work1_red)
189 7977 : NULLIFY (scf_env%scf_work2_red)
190 7977 : NULLIFY (scf_env%ortho)
191 7977 : NULLIFY (scf_env%ortho_red)
192 7977 : NULLIFY (scf_env%ortho_dbcsr)
193 7977 : NULLIFY (scf_env%ortho_m1)
194 7977 : NULLIFY (scf_env%ortho_m1_red)
195 7977 : NULLIFY (scf_env%p_mix_new)
196 7977 : NULLIFY (scf_env%ot_preconditioner)
197 7977 : NULLIFY (scf_env%qs_ot_env)
198 7977 : NULLIFY (scf_env%scf_diis_buffer)
199 7977 : NULLIFY (scf_env%scf_subspace_buffer)
200 7977 : NULLIFY (scf_env%buf1_dbcsr)
201 7977 : NULLIFY (scf_env%buf2_dbcsr)
202 7977 : NULLIFY (scf_env%s_half)
203 7977 : NULLIFY (scf_env%p_delta)
204 7977 : NULLIFY (scf_env%s_minus_one)
205 7977 : NULLIFY (scf_env%cc_buffer)
206 7977 : NULLIFY (scf_env%mixing_store)
207 7977 : NULLIFY (scf_env%krylov_space)
208 7977 : NULLIFY (scf_env%subspace_env)
209 7977 : NULLIFY (scf_env%block_davidson_env)
210 7977 : NULLIFY (scf_env%floating_basis%gradient)
211 7977 : CALL fb_env_nullify(scf_env%filter_matrix_env)
212 7977 : NULLIFY (scf_env%mom_ref_mo_coeff)
213 7977 : NULLIFY (scf_env%mom_overlap)
214 7977 : NULLIFY (scf_env%mom_s_mo_coeff)
215 :
216 7977 : CALL timestop(handle)
217 :
218 7977 : END SUBROUTINE scf_env_create
219 :
220 : ! **************************************************************************************************
221 : !> \brief function to be called to inform the scf_env about changes
222 : !> \param scf_env the scf env to inform
223 : !> \par History
224 : !> 03.2003 created [fawzi]
225 : !> \author fawzi
226 : ! **************************************************************************************************
227 19422 : SUBROUTINE scf_env_did_change(scf_env)
228 : TYPE(qs_scf_env_type), INTENT(INOUT) :: scf_env
229 :
230 : CHARACTER(len=*), PARAMETER :: routineN = 'scf_env_did_change'
231 :
232 : INTEGER :: handle
233 :
234 19422 : CALL timeset(routineN, handle)
235 :
236 19422 : IF (ASSOCIATED(scf_env%p_mix_new)) THEN
237 2064 : CALL dbcsr_deallocate_matrix_set(scf_env%p_mix_new)
238 : END IF
239 19422 : IF (ASSOCIATED(scf_env%p_delta)) THEN
240 14 : CALL dbcsr_deallocate_matrix_set(scf_env%p_delta)
241 : END IF
242 19422 : IF (ASSOCIATED(scf_env%scf_subspace_buffer)) THEN
243 0 : CALL qs_scf_subspace_buffer_release(scf_env%scf_subspace_buffer)
244 0 : DEALLOCATE (scf_env%scf_subspace_buffer)
245 : END IF
246 19422 : CALL cp_fm_release(scf_env%mom_ref_mo_coeff)
247 :
248 19422 : CALL timestop(handle)
249 :
250 19422 : END SUBROUTINE scf_env_did_change
251 :
252 : ! **************************************************************************************************
253 : !> \brief releases an scf_env (see doc/ReferenceCounting.html)
254 : !> \param scf_env the environment to release
255 : !> \par History
256 : !> 02.2003 created [fawzi]
257 : !> \author fawzi
258 : ! **************************************************************************************************
259 7977 : SUBROUTINE scf_env_release(scf_env)
260 :
261 : TYPE(qs_scf_env_type), INTENT(INOUT) :: scf_env
262 :
263 : CHARACTER(len=*), PARAMETER :: routineN = 'scf_env_release'
264 :
265 : INTEGER :: handle, i
266 :
267 7977 : CALL timeset(routineN, handle)
268 :
269 7977 : CALL cp_fm_release(scf_env%scf_work1)
270 7977 : IF (ASSOCIATED(scf_env%scf_work1_red)) THEN
271 0 : CALL cp_fm_release(scf_env%scf_work1_red)
272 0 : DEALLOCATE (scf_env%scf_work1_red)
273 : NULLIFY (scf_env%scf_work1_red)
274 : END IF
275 7977 : IF (ASSOCIATED(scf_env%scf_work2)) THEN
276 774 : CALL cp_fm_release(scf_env%scf_work2)
277 774 : DEALLOCATE (scf_env%scf_work2)
278 : NULLIFY (scf_env%scf_work2)
279 : END IF
280 7977 : IF (ASSOCIATED(scf_env%scf_work2_red)) THEN
281 0 : CALL cp_fm_release(scf_env%scf_work2_red)
282 0 : DEALLOCATE (scf_env%scf_work2_red)
283 : NULLIFY (scf_env%scf_work2_red)
284 : END IF
285 7977 : IF (ASSOCIATED(scf_env%ortho)) THEN
286 774 : CALL cp_fm_release(scf_env%ortho)
287 774 : DEALLOCATE (scf_env%ortho)
288 : NULLIFY (scf_env%ortho)
289 : END IF
290 7977 : IF (ASSOCIATED(scf_env%ortho_red)) THEN
291 0 : CALL cp_fm_release(scf_env%ortho_red)
292 0 : DEALLOCATE (scf_env%ortho_red)
293 : NULLIFY (scf_env%ortho_red)
294 : END IF
295 7977 : IF (ASSOCIATED(scf_env%ortho_m1)) THEN
296 0 : CALL cp_fm_release(scf_env%ortho_m1)
297 0 : DEALLOCATE (scf_env%ortho_m1)
298 : NULLIFY (scf_env%ortho_m1)
299 : END IF
300 7977 : IF (ASSOCIATED(scf_env%ortho_m1_red)) THEN
301 0 : CALL cp_fm_release(scf_env%ortho_m1_red)
302 0 : DEALLOCATE (scf_env%ortho_m1_red)
303 : NULLIFY (scf_env%ortho_m1_red)
304 : END IF
305 7977 : IF (ASSOCIATED(scf_env%ortho_dbcsr)) THEN
306 : ! we should not end up here, and give back using the pools
307 0 : CALL dbcsr_deallocate_matrix(scf_env%ortho_dbcsr)
308 : END IF
309 7977 : IF (ASSOCIATED(scf_env%buf1_dbcsr)) THEN
310 : ! we should not end up here, and give back using the pools
311 0 : CALL dbcsr_deallocate_matrix(scf_env%buf1_dbcsr)
312 : END IF
313 7977 : IF (ASSOCIATED(scf_env%buf2_dbcsr)) THEN
314 : ! we should not end up here, and give back using the pools
315 0 : CALL dbcsr_deallocate_matrix(scf_env%buf2_dbcsr)
316 : END IF
317 7977 : IF (ASSOCIATED(scf_env%s_half)) THEN
318 14 : CALL cp_fm_release(scf_env%s_half)
319 14 : DEALLOCATE (scf_env%s_half)
320 : END IF
321 7977 : IF (ASSOCIATED(scf_env%s_minus_one)) THEN
322 0 : CALL cp_fm_release(scf_env%s_minus_one)
323 0 : DEALLOCATE (scf_env%s_minus_one)
324 : END IF
325 7977 : IF (ASSOCIATED(scf_env%p_mix_new)) THEN
326 : ! we should not end up here, and give back using the pools
327 772 : CALL dbcsr_deallocate_matrix_set(scf_env%p_mix_new)
328 : END IF
329 7977 : IF (ASSOCIATED(scf_env%p_delta)) THEN
330 : ! we should not end up here, and give back using the pools
331 10 : CALL dbcsr_deallocate_matrix_set(scf_env%p_delta)
332 : END IF
333 7977 : IF (ASSOCIATED(scf_env%ot_preconditioner)) THEN
334 5483 : DO i = 1, SIZE(scf_env%ot_preconditioner)
335 5483 : IF (ASSOCIATED(scf_env%ot_preconditioner(i)%preconditioner)) THEN
336 3048 : CALL destroy_preconditioner(scf_env%ot_preconditioner(i)%preconditioner)
337 3048 : DEALLOCATE (scf_env%ot_preconditioner(i)%preconditioner)
338 : END IF
339 : END DO
340 2419 : DEALLOCATE (scf_env%ot_preconditioner)
341 : END IF
342 7977 : IF (ASSOCIATED(scf_env%qs_ot_env)) THEN
343 0 : DO i = 1, SIZE(scf_env%qs_ot_env)
344 0 : CALL qs_ot_destroy(scf_env%qs_ot_env(i))
345 : END DO
346 0 : DEALLOCATE (scf_env%qs_ot_env)
347 : END IF
348 7977 : IF (ASSOCIATED(scf_env%scf_diis_buffer)) THEN
349 4524 : CALL qs_diis_b_release(scf_env%scf_diis_buffer)
350 4524 : DEALLOCATE (scf_env%scf_diis_buffer)
351 : END IF
352 7977 : IF (ASSOCIATED(scf_env%scf_subspace_buffer)) THEN
353 16 : CALL qs_scf_subspace_buffer_release(scf_env%scf_subspace_buffer)
354 16 : DEALLOCATE (scf_env%scf_subspace_buffer)
355 : END IF
356 7977 : IF (ASSOCIATED(scf_env%outer_scf%variables)) THEN
357 0 : DEALLOCATE (scf_env%outer_scf%variables)
358 : END IF
359 7977 : IF (ASSOCIATED(scf_env%outer_scf%count)) THEN
360 0 : DEALLOCATE (scf_env%outer_scf%count)
361 : END IF
362 7977 : IF (ASSOCIATED(scf_env%outer_scf%gradient)) THEN
363 0 : DEALLOCATE (scf_env%outer_scf%gradient)
364 : END IF
365 7977 : IF (ASSOCIATED(scf_env%outer_scf%inv_jacobian)) THEN
366 6 : DEALLOCATE (scf_env%outer_scf%inv_jacobian)
367 : END IF
368 7977 : IF (ASSOCIATED(scf_env%outer_scf%energy)) THEN
369 0 : DEALLOCATE (scf_env%outer_scf%energy)
370 : END IF
371 7977 : IF (ASSOCIATED(scf_env%cc_buffer)) THEN
372 0 : DEALLOCATE (scf_env%cc_buffer)
373 : END IF
374 7977 : IF (ASSOCIATED(scf_env%mixing_store)) THEN
375 7837 : CALL mixing_storage_release(scf_env%mixing_store)
376 7837 : DEALLOCATE (scf_env%mixing_store)
377 : END IF
378 7977 : IF (ASSOCIATED(scf_env%krylov_space)) THEN
379 4 : CALL krylov_space_release(scf_env%krylov_space)
380 : END IF
381 7977 : IF (ASSOCIATED(scf_env%subspace_env)) THEN
382 2 : CALL diag_subspace_env_release(scf_env%subspace_env)
383 : END IF
384 7977 : IF (ASSOCIATED(scf_env%block_davidson_env)) THEN
385 36 : CALL block_davidson_release(scf_env%block_davidson_env)
386 : END IF
387 7977 : IF (fb_env_has_data(scf_env%filter_matrix_env)) THEN
388 10 : CALL fb_env_release(scf_env%filter_matrix_env)
389 : END IF
390 7977 : IF (ASSOCIATED(scf_env%floating_basis%gradient)) THEN
391 0 : DEALLOCATE (scf_env%floating_basis%gradient)
392 : END IF
393 7977 : CALL cp_fm_release(scf_env%mom_ref_mo_coeff)
394 7977 : CALL cp_fm_release(scf_env%mom_overlap)
395 7977 : CALL cp_fm_release(scf_env%mom_s_mo_coeff)
396 :
397 7977 : CALL timestop(handle)
398 :
399 7977 : END SUBROUTINE scf_env_release
400 :
401 : ! **************************************************************************************************
402 : !> \brief creates krylov space
403 : !> \param krylov_space ...
404 : !> \param scf_section ...
405 : !> \par History
406 : !> 05.2009 created [MI]
407 : !> \author [MI]
408 : ! **************************************************************************************************
409 4 : SUBROUTINE krylov_space_create(krylov_space, scf_section)
410 :
411 : TYPE(krylov_space_type), POINTER :: krylov_space
412 : TYPE(section_vals_type), POINTER :: scf_section
413 :
414 4 : CPASSERT(.NOT. ASSOCIATED(krylov_space))
415 4 : ALLOCATE (krylov_space)
416 :
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)
424 :
425 : CALL section_vals_val_get(scf_section, "DIAGONALIZATION%MAX_ITER", &
426 4 : i_val=krylov_space%max_iter)
427 : CALL section_vals_val_get(scf_section, "DIAGONALIZATION%KRYLOV%NKRYLOV", &
428 4 : i_val=krylov_space%nkrylov)
429 : CALL section_vals_val_get(scf_section, "DIAGONALIZATION%KRYLOV%NBLOCK", &
430 4 : i_val=krylov_space%nblock)
431 : CALL section_vals_val_get(scf_section, "DIAGONALIZATION%KRYLOV%EPS_KRYLOV", &
432 4 : r_val=krylov_space%eps_conv)
433 : CALL section_vals_val_get(scf_section, "DIAGONALIZATION%KRYLOV%EPS_STD_DIAG", &
434 4 : r_val=krylov_space%eps_std_diag)
435 : CALL section_vals_val_get(scf_section, "DIAGONALIZATION%EPS_ADAPT", &
436 4 : r_val=krylov_space%eps_adapt)
437 : CALL section_vals_val_get(scf_section, "DIAGONALIZATION%KRYLOV%CHECK_MOS_CONV", &
438 4 : l_val=krylov_space%always_check_conv)
439 :
440 4 : END SUBROUTINE krylov_space_create
441 :
442 : ! **************************************************************************************************
443 : !> \brief releases krylov space
444 : !> \param krylov_space ...
445 : !> \par History
446 : !> 05.2009 created [MI]
447 : !> \author [MI]
448 : ! **************************************************************************************************
449 4 : SUBROUTINE krylov_space_release(krylov_space)
450 : TYPE(krylov_space_type), POINTER :: krylov_space
451 :
452 4 : IF (ASSOCIATED(krylov_space)) THEN
453 :
454 4 : DEALLOCATE (krylov_space%c_eval)
455 4 : DEALLOCATE (krylov_space%t_eval)
456 :
457 4 : CALL cp_fm_release(krylov_space%v_mat)
458 4 : CALL cp_fm_release(krylov_space%mo_conv)
459 4 : CALL cp_fm_release(krylov_space%mo_refine)
460 4 : CALL cp_fm_release(krylov_space%chc_mat)
461 4 : CALL cp_fm_release(krylov_space%c_vec)
462 :
463 4 : IF (ASSOCIATED(krylov_space%tmp_mat)) THEN
464 4 : CALL cp_fm_release(krylov_space%tmp_mat)
465 4 : DEALLOCATE (krylov_space%tmp_mat)
466 : END IF
467 4 : IF (ASSOCIATED(krylov_space%block1_mat)) THEN
468 4 : CALL cp_fm_release(krylov_space%block1_mat)
469 4 : DEALLOCATE (krylov_space%block1_mat)
470 : END IF
471 4 : IF (ASSOCIATED(krylov_space%block2_mat)) THEN
472 4 : CALL cp_fm_release(krylov_space%block2_mat)
473 4 : DEALLOCATE (krylov_space%block2_mat)
474 : END IF
475 4 : IF (ASSOCIATED(krylov_space%block3_mat)) THEN
476 4 : CALL cp_fm_release(krylov_space%block3_mat)
477 4 : DEALLOCATE (krylov_space%block3_mat)
478 : END IF
479 4 : IF (ASSOCIATED(krylov_space%block4_mat)) THEN
480 4 : CALL cp_fm_release(krylov_space%block4_mat)
481 4 : DEALLOCATE (krylov_space%block4_mat)
482 : END IF
483 4 : IF (ASSOCIATED(krylov_space%block5_mat)) THEN
484 4 : CALL cp_fm_release(krylov_space%block5_mat)
485 4 : DEALLOCATE (krylov_space%block5_mat)
486 : END IF
487 :
488 4 : DEALLOCATE (krylov_space)
489 :
490 : NULLIFY (krylov_space)
491 : END IF
492 :
493 4 : END SUBROUTINE krylov_space_release
494 :
495 : ! **************************************************************************************************
496 : !> \brief creates subspace-rotation environment
497 : !> \param subspace_env ...
498 : !> \param scf_section ...
499 : !> \param ecut ...
500 : !> \par History
501 : !> 09.2009 created [MI]
502 : !> \author [MI]
503 : ! **************************************************************************************************
504 4 : SUBROUTINE diag_subspace_env_create(subspace_env, scf_section, ecut)
505 :
506 : TYPE(subspace_env_type), POINTER :: subspace_env
507 : TYPE(section_vals_type), POINTER :: scf_section
508 : REAL(dp), INTENT(IN) :: ecut
509 :
510 : LOGICAL :: do_mixing
511 : TYPE(section_vals_type), POINTER :: mixing_section
512 :
513 2 : CPASSERT(.NOT. ASSOCIATED(subspace_env))
514 2 : ALLOCATE (subspace_env)
515 :
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 2 : NULLIFY (mixing_section)
523 :
524 : CALL section_vals_val_get(scf_section, "DIAGONALIZATION%DIAG_SUB_SCF%MAX_ITER", &
525 2 : i_val=subspace_env%max_iter)
526 : CALL section_vals_val_get(scf_section, "DIAGONALIZATION%DIAG_SUB_SCF%EPS_ENE", &
527 2 : r_val=subspace_env%eps_ene)
528 : CALL section_vals_val_get(scf_section, "DIAGONALIZATION%DIAG_SUB_SCF%EPS_SKIP_SUB_DIAG", &
529 2 : r_val=subspace_env%eps_diag_sub)
530 : CALL section_vals_val_get(scf_section, "DIAGONALIZATION%DIAG_SUB_SCF%EPS_ADAPT_SCF", &
531 2 : r_val=subspace_env%eps_adapt)
532 2 : subspace_env%mixing_method = 0
533 : do_mixing = .FALSE.
534 2 : mixing_section => section_vals_get_subs_vals(scf_section, "DIAGONALIZATION%DIAG_SUB_SCF%MIXING")
535 : CALL section_vals_val_get(mixing_section, "_SECTION_PARAMETERS_", &
536 2 : l_val=do_mixing)
537 2 : IF (do_mixing) THEN
538 : CALL section_vals_val_get(mixing_section, "METHOD", &
539 2 : i_val=subspace_env%mixing_method)
540 2 : IF (subspace_env%mixing_method >= direct_mixing_nr) THEN
541 8 : ALLOCATE (subspace_env%mixing_store)
542 : CALL mixing_storage_create(subspace_env%mixing_store, mixing_section, &
543 2 : subspace_env%mixing_method, ecut=ecut)
544 : END IF
545 : END IF
546 :
547 2 : END SUBROUTINE diag_subspace_env_create
548 :
549 : ! **************************************************************************************************
550 : !> \brief releases subspace-rotation environment
551 : !> \param subspace_env ...
552 : !> \par History
553 : !> 09.2009 created [MI]
554 : !> \author [MI]
555 : ! **************************************************************************************************
556 2 : SUBROUTINE diag_subspace_env_release(subspace_env)
557 : TYPE(subspace_env_type), POINTER :: subspace_env
558 :
559 2 : IF (ASSOCIATED(subspace_env)) THEN
560 :
561 2 : IF (ASSOCIATED(subspace_env%p_matrix_store)) THEN
562 :
563 : CPASSERT(.TRUE.)
564 2 : CALL dbcsr_deallocate_matrix_set(subspace_env%p_matrix_store)
565 : END IF
566 2 : CALL cp_fm_release(subspace_env%chc_mat)
567 2 : CALL cp_fm_release(subspace_env%c_vec)
568 2 : CALL cp_fm_release(subspace_env%c0)
569 :
570 2 : IF (ASSOCIATED(subspace_env%mixing_store)) THEN
571 2 : CALL mixing_storage_release(subspace_env%mixing_store)
572 2 : DEALLOCATE (subspace_env%mixing_store)
573 : END IF
574 :
575 2 : DEALLOCATE (subspace_env)
576 : END IF
577 :
578 2 : END SUBROUTINE diag_subspace_env_release
579 :
580 0 : END MODULE qs_scf_types
|