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 : ! Occupied-space regularization used only to generate ADIIS candidates.
107 : REAL(KIND=dp) :: adiis_shift = 0.0_dp
108 : CHARACTER(len=15) :: iter_method = ""
109 : COMPLEX(KIND=dp), DIMENSION(:, :, :), POINTER :: cc_buffer => NULL()
110 : LOGICAL :: print_iter_line = .FALSE., skip_mixing = .FALSE., skip_diis = .FALSE., needs_ortho = .FALSE., &
111 : adiis_check_next = .FALSE., adiis_validated = .FALSE., &
112 : raw_map_delta_valid = .FALSE.
113 : TYPE(mixing_storage_type), POINTER :: mixing_store => NULL()
114 : TYPE(cp_fm_type), DIMENSION(:), POINTER :: scf_work1 => NULL(), scf_work1_red => NULL()
115 : TYPE(cp_fm_type), POINTER :: scf_work2 => NULL(), ortho => NULL(), ortho_m1 => NULL(), &
116 : s_half => NULL(), s_minus_one => NULL(), &
117 : scf_work2_red => NULL(), ortho_red => NULL(), ortho_m1_red => NULL()
118 : TYPE(krylov_space_type), POINTER :: krylov_space => NULL()
119 : TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: p_delta => NULL(), p_mix_new => NULL()
120 : TYPE(dbcsr_type), POINTER :: ortho_dbcsr => NULL(), buf1_dbcsr => NULL(), buf2_dbcsr => NULL()
121 : TYPE(preconditioner_p_type), DIMENSION(:), POINTER :: ot_preconditioner => NULL()
122 : TYPE(qs_ot_type), POINTER, DIMENSION(:) :: qs_ot_env => NULL()
123 : TYPE(qs_diis_buffer_type), POINTER :: scf_diis_buffer => NULL()
124 : TYPE(qs_scf_subspace_buffer_type), POINTER :: scf_subspace_buffer => NULL()
125 : TYPE(subspace_env_type), POINTER :: subspace_env => NULL()
126 : TYPE(davidson_type), POINTER, DIMENSION(:) :: block_davidson_env => NULL()
127 : TYPE(fb_env_obj) :: filter_matrix_env = fb_env_obj()
128 : TYPE(floating_basis_type) :: floating_basis = floating_basis_type()
129 : !> reference molecular orbitals for the maximum overlap method
130 : TYPE(cp_fm_type), DIMENSION(:), POINTER :: mom_ref_mo_coeff => NULL()
131 : !> MOM-related work matrices
132 : TYPE(cp_fm_type), DIMENSION(:), POINTER :: mom_overlap => NULL(), mom_s_mo_coeff => NULL()
133 : END TYPE qs_scf_env_type
134 :
135 : CONTAINS
136 :
137 : ! **************************************************************************************************
138 : !> \brief allocates and initialize an scf_env
139 : !> \param scf_env the scf env to initialize
140 : !> \par History
141 : !> 02.2003 created [fawzi]
142 : !> \author fawzi
143 : ! **************************************************************************************************
144 8085 : SUBROUTINE scf_env_create(scf_env)
145 : TYPE(qs_scf_env_type), INTENT(OUT) :: scf_env
146 :
147 : CHARACTER(len=*), PARAMETER :: routineN = 'scf_env_create'
148 :
149 : INTEGER :: handle
150 :
151 8085 : CALL timeset(routineN, handle)
152 :
153 8085 : scf_env%iter_count = 0
154 8085 : scf_env%nelectron = 0
155 8085 : scf_env%iter_param = 0.0_dp
156 8085 : scf_env%iter_delta = 0.0_dp
157 8085 : scf_env%step_norm = 0.0_dp
158 8085 : scf_env%raw_map_delta = 0.0_dp
159 8085 : scf_env%iter_method = ""
160 8085 : scf_env%print_iter_line = .TRUE.
161 8085 : scf_env%skip_mixing = .FALSE.
162 8085 : scf_env%skip_diis = .FALSE.
163 8085 : scf_env%needs_ortho = .FALSE.
164 8085 : scf_env%adiis_check_next = .FALSE.
165 8085 : scf_env%adiis_validated = .FALSE.
166 8085 : scf_env%raw_map_delta_valid = .FALSE.
167 8085 : scf_env%adiis_shift = 0.0_dp
168 8085 : scf_env%method = -1
169 8085 : scf_env%mixing_method = -1
170 8085 : scf_env%p_mix_alpha = 1.0_dp
171 8085 : scf_env%cholesky_method = -1
172 8085 : scf_env%outer_scf%iter_count = 0
173 8085 : scf_env%sum_zeff_corr = 0.0_dp
174 8085 : NULLIFY (scf_env%outer_scf%variables)
175 8085 : NULLIFY (scf_env%outer_scf%gradient)
176 8085 : NULLIFY (scf_env%outer_scf%energy)
177 8085 : NULLIFY (scf_env%outer_scf%count)
178 8085 : NULLIFY (scf_env%outer_scf%inv_jacobian)
179 8085 : scf_env%outer_scf%deallocate_jacobian = .TRUE.
180 8085 : NULLIFY (scf_env%scf_work1)
181 8085 : NULLIFY (scf_env%scf_work2)
182 8085 : NULLIFY (scf_env%scf_work1_red)
183 8085 : NULLIFY (scf_env%scf_work2_red)
184 8085 : NULLIFY (scf_env%ortho)
185 8085 : NULLIFY (scf_env%ortho_red)
186 8085 : NULLIFY (scf_env%ortho_dbcsr)
187 8085 : NULLIFY (scf_env%ortho_m1)
188 8085 : NULLIFY (scf_env%ortho_m1_red)
189 8085 : NULLIFY (scf_env%p_mix_new)
190 8085 : NULLIFY (scf_env%ot_preconditioner)
191 8085 : NULLIFY (scf_env%qs_ot_env)
192 8085 : NULLIFY (scf_env%scf_diis_buffer)
193 8085 : NULLIFY (scf_env%scf_subspace_buffer)
194 8085 : NULLIFY (scf_env%buf1_dbcsr)
195 8085 : NULLIFY (scf_env%buf2_dbcsr)
196 8085 : NULLIFY (scf_env%s_half)
197 8085 : NULLIFY (scf_env%p_delta)
198 8085 : NULLIFY (scf_env%s_minus_one)
199 8085 : NULLIFY (scf_env%cc_buffer)
200 8085 : NULLIFY (scf_env%mixing_store)
201 8085 : NULLIFY (scf_env%krylov_space)
202 8085 : NULLIFY (scf_env%subspace_env)
203 8085 : NULLIFY (scf_env%block_davidson_env)
204 8085 : NULLIFY (scf_env%floating_basis%gradient)
205 8085 : CALL fb_env_nullify(scf_env%filter_matrix_env)
206 8085 : NULLIFY (scf_env%mom_ref_mo_coeff)
207 8085 : NULLIFY (scf_env%mom_overlap)
208 8085 : NULLIFY (scf_env%mom_s_mo_coeff)
209 :
210 8085 : CALL timestop(handle)
211 :
212 8085 : END SUBROUTINE scf_env_create
213 :
214 : ! **************************************************************************************************
215 : !> \brief function to be called to inform the scf_env about changes
216 : !> \param scf_env the scf env to inform
217 : !> \par History
218 : !> 03.2003 created [fawzi]
219 : !> \author fawzi
220 : ! **************************************************************************************************
221 19672 : SUBROUTINE scf_env_did_change(scf_env)
222 : TYPE(qs_scf_env_type), INTENT(INOUT) :: scf_env
223 :
224 : CHARACTER(len=*), PARAMETER :: routineN = 'scf_env_did_change'
225 :
226 : INTEGER :: handle
227 :
228 19672 : CALL timeset(routineN, handle)
229 :
230 19672 : IF (ASSOCIATED(scf_env%p_mix_new)) THEN
231 2064 : CALL dbcsr_deallocate_matrix_set(scf_env%p_mix_new)
232 : END IF
233 19672 : IF (ASSOCIATED(scf_env%p_delta)) THEN
234 14 : CALL dbcsr_deallocate_matrix_set(scf_env%p_delta)
235 : END IF
236 19672 : IF (ASSOCIATED(scf_env%scf_subspace_buffer)) THEN
237 0 : CALL qs_scf_subspace_buffer_release(scf_env%scf_subspace_buffer)
238 0 : DEALLOCATE (scf_env%scf_subspace_buffer)
239 : END IF
240 19672 : CALL cp_fm_release(scf_env%mom_ref_mo_coeff)
241 :
242 19672 : CALL timestop(handle)
243 :
244 19672 : END SUBROUTINE scf_env_did_change
245 :
246 : ! **************************************************************************************************
247 : !> \brief releases an scf_env (see doc/ReferenceCounting.html)
248 : !> \param scf_env the environment to release
249 : !> \par History
250 : !> 02.2003 created [fawzi]
251 : !> \author fawzi
252 : ! **************************************************************************************************
253 8085 : SUBROUTINE scf_env_release(scf_env)
254 :
255 : TYPE(qs_scf_env_type), INTENT(INOUT) :: scf_env
256 :
257 : CHARACTER(len=*), PARAMETER :: routineN = 'scf_env_release'
258 :
259 : INTEGER :: handle, i
260 :
261 8085 : CALL timeset(routineN, handle)
262 :
263 8085 : CALL cp_fm_release(scf_env%scf_work1)
264 8085 : IF (ASSOCIATED(scf_env%scf_work1_red)) THEN
265 0 : CALL cp_fm_release(scf_env%scf_work1_red)
266 0 : DEALLOCATE (scf_env%scf_work1_red)
267 : NULLIFY (scf_env%scf_work1_red)
268 : END IF
269 8085 : IF (ASSOCIATED(scf_env%scf_work2)) THEN
270 774 : CALL cp_fm_release(scf_env%scf_work2)
271 774 : DEALLOCATE (scf_env%scf_work2)
272 : NULLIFY (scf_env%scf_work2)
273 : END IF
274 8085 : IF (ASSOCIATED(scf_env%scf_work2_red)) THEN
275 0 : CALL cp_fm_release(scf_env%scf_work2_red)
276 0 : DEALLOCATE (scf_env%scf_work2_red)
277 : NULLIFY (scf_env%scf_work2_red)
278 : END IF
279 8085 : IF (ASSOCIATED(scf_env%ortho)) THEN
280 774 : CALL cp_fm_release(scf_env%ortho)
281 774 : DEALLOCATE (scf_env%ortho)
282 : NULLIFY (scf_env%ortho)
283 : END IF
284 8085 : IF (ASSOCIATED(scf_env%ortho_red)) THEN
285 0 : CALL cp_fm_release(scf_env%ortho_red)
286 0 : DEALLOCATE (scf_env%ortho_red)
287 : NULLIFY (scf_env%ortho_red)
288 : END IF
289 8085 : IF (ASSOCIATED(scf_env%ortho_m1)) THEN
290 0 : CALL cp_fm_release(scf_env%ortho_m1)
291 0 : DEALLOCATE (scf_env%ortho_m1)
292 : NULLIFY (scf_env%ortho_m1)
293 : END IF
294 8085 : IF (ASSOCIATED(scf_env%ortho_m1_red)) THEN
295 0 : CALL cp_fm_release(scf_env%ortho_m1_red)
296 0 : DEALLOCATE (scf_env%ortho_m1_red)
297 : NULLIFY (scf_env%ortho_m1_red)
298 : END IF
299 8085 : IF (ASSOCIATED(scf_env%ortho_dbcsr)) THEN
300 : ! we should not end up here, and give back using the pools
301 0 : CALL dbcsr_deallocate_matrix(scf_env%ortho_dbcsr)
302 : END IF
303 8085 : IF (ASSOCIATED(scf_env%buf1_dbcsr)) THEN
304 : ! we should not end up here, and give back using the pools
305 0 : CALL dbcsr_deallocate_matrix(scf_env%buf1_dbcsr)
306 : END IF
307 8085 : IF (ASSOCIATED(scf_env%buf2_dbcsr)) THEN
308 : ! we should not end up here, and give back using the pools
309 0 : CALL dbcsr_deallocate_matrix(scf_env%buf2_dbcsr)
310 : END IF
311 8085 : IF (ASSOCIATED(scf_env%s_half)) THEN
312 26 : CALL cp_fm_release(scf_env%s_half)
313 26 : DEALLOCATE (scf_env%s_half)
314 : END IF
315 8085 : IF (ASSOCIATED(scf_env%s_minus_one)) THEN
316 0 : CALL cp_fm_release(scf_env%s_minus_one)
317 0 : DEALLOCATE (scf_env%s_minus_one)
318 : END IF
319 8085 : IF (ASSOCIATED(scf_env%p_mix_new)) THEN
320 : ! we should not end up here, and give back using the pools
321 772 : CALL dbcsr_deallocate_matrix_set(scf_env%p_mix_new)
322 : END IF
323 8085 : IF (ASSOCIATED(scf_env%p_delta)) THEN
324 : ! we should not end up here, and give back using the pools
325 10 : CALL dbcsr_deallocate_matrix_set(scf_env%p_delta)
326 : END IF
327 8085 : IF (ASSOCIATED(scf_env%ot_preconditioner)) THEN
328 5637 : DO i = 1, SIZE(scf_env%ot_preconditioner)
329 5637 : IF (ASSOCIATED(scf_env%ot_preconditioner(i)%preconditioner)) THEN
330 3131 : CALL destroy_preconditioner(scf_env%ot_preconditioner(i)%preconditioner)
331 3131 : DEALLOCATE (scf_env%ot_preconditioner(i)%preconditioner)
332 : END IF
333 : END DO
334 2481 : DEALLOCATE (scf_env%ot_preconditioner)
335 : END IF
336 8085 : IF (ASSOCIATED(scf_env%qs_ot_env)) THEN
337 0 : DO i = 1, SIZE(scf_env%qs_ot_env)
338 0 : CALL qs_ot_destroy(scf_env%qs_ot_env(i))
339 : END DO
340 0 : DEALLOCATE (scf_env%qs_ot_env)
341 : END IF
342 8085 : IF (ASSOCIATED(scf_env%scf_diis_buffer)) THEN
343 4544 : CALL qs_diis_b_release(scf_env%scf_diis_buffer)
344 4544 : DEALLOCATE (scf_env%scf_diis_buffer)
345 : END IF
346 8085 : IF (ASSOCIATED(scf_env%scf_subspace_buffer)) THEN
347 12 : CALL qs_scf_subspace_buffer_release(scf_env%scf_subspace_buffer)
348 12 : DEALLOCATE (scf_env%scf_subspace_buffer)
349 : END IF
350 8085 : IF (ASSOCIATED(scf_env%outer_scf%variables)) THEN
351 0 : DEALLOCATE (scf_env%outer_scf%variables)
352 : END IF
353 8085 : IF (ASSOCIATED(scf_env%outer_scf%count)) THEN
354 0 : DEALLOCATE (scf_env%outer_scf%count)
355 : END IF
356 8085 : IF (ASSOCIATED(scf_env%outer_scf%gradient)) THEN
357 0 : DEALLOCATE (scf_env%outer_scf%gradient)
358 : END IF
359 8085 : IF (ASSOCIATED(scf_env%outer_scf%inv_jacobian)) THEN
360 6 : DEALLOCATE (scf_env%outer_scf%inv_jacobian)
361 : END IF
362 8085 : IF (ASSOCIATED(scf_env%outer_scf%energy)) THEN
363 0 : DEALLOCATE (scf_env%outer_scf%energy)
364 : END IF
365 8085 : IF (ASSOCIATED(scf_env%cc_buffer)) THEN
366 0 : DEALLOCATE (scf_env%cc_buffer)
367 : END IF
368 8085 : IF (ASSOCIATED(scf_env%mixing_store)) THEN
369 7949 : CALL mixing_storage_release(scf_env%mixing_store)
370 7949 : DEALLOCATE (scf_env%mixing_store)
371 : END IF
372 8085 : IF (ASSOCIATED(scf_env%krylov_space)) THEN
373 6 : CALL krylov_space_release(scf_env%krylov_space)
374 : END IF
375 8085 : IF (ASSOCIATED(scf_env%subspace_env)) THEN
376 2 : CALL diag_subspace_env_release(scf_env%subspace_env)
377 : END IF
378 8085 : IF (ASSOCIATED(scf_env%block_davidson_env)) THEN
379 38 : CALL block_davidson_release(scf_env%block_davidson_env)
380 : END IF
381 8085 : IF (fb_env_has_data(scf_env%filter_matrix_env)) THEN
382 10 : CALL fb_env_release(scf_env%filter_matrix_env)
383 : END IF
384 8085 : IF (ASSOCIATED(scf_env%floating_basis%gradient)) THEN
385 0 : DEALLOCATE (scf_env%floating_basis%gradient)
386 : END IF
387 8085 : CALL cp_fm_release(scf_env%mom_ref_mo_coeff)
388 8085 : CALL cp_fm_release(scf_env%mom_overlap)
389 8085 : CALL cp_fm_release(scf_env%mom_s_mo_coeff)
390 :
391 8085 : CALL timestop(handle)
392 :
393 8085 : END SUBROUTINE scf_env_release
394 :
395 : ! **************************************************************************************************
396 : !> \brief creates krylov space
397 : !> \param krylov_space ...
398 : !> \param scf_section ...
399 : !> \par History
400 : !> 05.2009 created [MI]
401 : !> \author [MI]
402 : ! **************************************************************************************************
403 6 : SUBROUTINE krylov_space_create(krylov_space, scf_section)
404 :
405 : TYPE(krylov_space_type), POINTER :: krylov_space
406 : TYPE(section_vals_type), POINTER :: scf_section
407 :
408 6 : CPASSERT(.NOT. ASSOCIATED(krylov_space))
409 6 : ALLOCATE (krylov_space)
410 :
411 : NULLIFY (krylov_space%c_eval, krylov_space%t_eval)
412 : NULLIFY (krylov_space%v_mat)
413 : NULLIFY (krylov_space%mo_conv, krylov_space%mo_refine)
414 : NULLIFY (krylov_space%chc_mat, krylov_space%c_vec)
415 : NULLIFY (krylov_space%tmp_mat)
416 : NULLIFY (krylov_space%block1_mat, krylov_space%block2_mat)
417 : NULLIFY (krylov_space%block3_mat, krylov_space%block4_mat, krylov_space%block5_mat)
418 :
419 : CALL section_vals_val_get(scf_section, "DIAGONALIZATION%MAX_ITER", &
420 6 : i_val=krylov_space%max_iter)
421 : CALL section_vals_val_get(scf_section, "DIAGONALIZATION%KRYLOV%NKRYLOV", &
422 6 : i_val=krylov_space%nkrylov)
423 : CALL section_vals_val_get(scf_section, "DIAGONALIZATION%KRYLOV%NBLOCK", &
424 6 : i_val=krylov_space%nblock)
425 : CALL section_vals_val_get(scf_section, "DIAGONALIZATION%KRYLOV%EPS_KRYLOV", &
426 6 : r_val=krylov_space%eps_conv)
427 : CALL section_vals_val_get(scf_section, "DIAGONALIZATION%KRYLOV%EPS_STD_DIAG", &
428 6 : r_val=krylov_space%eps_std_diag)
429 : CALL section_vals_val_get(scf_section, "DIAGONALIZATION%EPS_ADAPT", &
430 6 : r_val=krylov_space%eps_adapt)
431 : CALL section_vals_val_get(scf_section, "DIAGONALIZATION%KRYLOV%CHECK_MOS_CONV", &
432 6 : l_val=krylov_space%always_check_conv)
433 :
434 6 : END SUBROUTINE krylov_space_create
435 :
436 : ! **************************************************************************************************
437 : !> \brief releases krylov space
438 : !> \param krylov_space ...
439 : !> \par History
440 : !> 05.2009 created [MI]
441 : !> \author [MI]
442 : ! **************************************************************************************************
443 6 : SUBROUTINE krylov_space_release(krylov_space)
444 : TYPE(krylov_space_type), POINTER :: krylov_space
445 :
446 6 : IF (ASSOCIATED(krylov_space)) THEN
447 :
448 6 : DEALLOCATE (krylov_space%c_eval)
449 6 : DEALLOCATE (krylov_space%t_eval)
450 :
451 6 : CALL cp_fm_release(krylov_space%v_mat)
452 6 : CALL cp_fm_release(krylov_space%mo_conv)
453 6 : CALL cp_fm_release(krylov_space%mo_refine)
454 6 : CALL cp_fm_release(krylov_space%chc_mat)
455 6 : CALL cp_fm_release(krylov_space%c_vec)
456 :
457 6 : IF (ASSOCIATED(krylov_space%tmp_mat)) THEN
458 6 : CALL cp_fm_release(krylov_space%tmp_mat)
459 6 : DEALLOCATE (krylov_space%tmp_mat)
460 : END IF
461 6 : IF (ASSOCIATED(krylov_space%block1_mat)) THEN
462 6 : CALL cp_fm_release(krylov_space%block1_mat)
463 6 : DEALLOCATE (krylov_space%block1_mat)
464 : END IF
465 6 : IF (ASSOCIATED(krylov_space%block2_mat)) THEN
466 6 : CALL cp_fm_release(krylov_space%block2_mat)
467 6 : DEALLOCATE (krylov_space%block2_mat)
468 : END IF
469 6 : IF (ASSOCIATED(krylov_space%block3_mat)) THEN
470 6 : CALL cp_fm_release(krylov_space%block3_mat)
471 6 : DEALLOCATE (krylov_space%block3_mat)
472 : END IF
473 6 : IF (ASSOCIATED(krylov_space%block4_mat)) THEN
474 6 : CALL cp_fm_release(krylov_space%block4_mat)
475 6 : DEALLOCATE (krylov_space%block4_mat)
476 : END IF
477 6 : IF (ASSOCIATED(krylov_space%block5_mat)) THEN
478 6 : CALL cp_fm_release(krylov_space%block5_mat)
479 6 : DEALLOCATE (krylov_space%block5_mat)
480 : END IF
481 :
482 6 : DEALLOCATE (krylov_space)
483 :
484 : NULLIFY (krylov_space)
485 : END IF
486 :
487 6 : END SUBROUTINE krylov_space_release
488 :
489 : ! **************************************************************************************************
490 : !> \brief creates subspace-rotation environment
491 : !> \param subspace_env ...
492 : !> \param scf_section ...
493 : !> \param ecut ...
494 : !> \par History
495 : !> 09.2009 created [MI]
496 : !> \author [MI]
497 : ! **************************************************************************************************
498 4 : SUBROUTINE diag_subspace_env_create(subspace_env, scf_section, ecut)
499 :
500 : TYPE(subspace_env_type), POINTER :: subspace_env
501 : TYPE(section_vals_type), POINTER :: scf_section
502 : REAL(dp), INTENT(IN) :: ecut
503 :
504 : LOGICAL :: do_mixing
505 : TYPE(section_vals_type), POINTER :: mixing_section
506 :
507 2 : CPASSERT(.NOT. ASSOCIATED(subspace_env))
508 2 : ALLOCATE (subspace_env)
509 :
510 : NULLIFY (subspace_env%p_matrix_store)
511 : NULLIFY (subspace_env%p_matrix_mix)
512 : NULLIFY (subspace_env%chc_mat)
513 : NULLIFY (subspace_env%c_vec)
514 : NULLIFY (subspace_env%c0)
515 : NULLIFY (subspace_env%mixing_store)
516 2 : NULLIFY (mixing_section)
517 :
518 : CALL section_vals_val_get(scf_section, "DIAGONALIZATION%DIAG_SUB_SCF%MAX_ITER", &
519 2 : i_val=subspace_env%max_iter)
520 : CALL section_vals_val_get(scf_section, "DIAGONALIZATION%DIAG_SUB_SCF%EPS_ENE", &
521 2 : r_val=subspace_env%eps_ene)
522 : CALL section_vals_val_get(scf_section, "DIAGONALIZATION%DIAG_SUB_SCF%EPS_SKIP_SUB_DIAG", &
523 2 : r_val=subspace_env%eps_diag_sub)
524 : CALL section_vals_val_get(scf_section, "DIAGONALIZATION%DIAG_SUB_SCF%EPS_ADAPT_SCF", &
525 2 : r_val=subspace_env%eps_adapt)
526 2 : subspace_env%mixing_method = 0
527 : do_mixing = .FALSE.
528 2 : mixing_section => section_vals_get_subs_vals(scf_section, "DIAGONALIZATION%DIAG_SUB_SCF%MIXING")
529 : CALL section_vals_val_get(mixing_section, "_SECTION_PARAMETERS_", &
530 2 : l_val=do_mixing)
531 2 : IF (do_mixing) THEN
532 : CALL section_vals_val_get(mixing_section, "METHOD", &
533 2 : i_val=subspace_env%mixing_method)
534 2 : IF (subspace_env%mixing_method >= direct_mixing_nr) THEN
535 8 : ALLOCATE (subspace_env%mixing_store)
536 : CALL mixing_storage_create(subspace_env%mixing_store, mixing_section, &
537 2 : subspace_env%mixing_method, ecut=ecut)
538 : END IF
539 : END IF
540 :
541 2 : END SUBROUTINE diag_subspace_env_create
542 :
543 : ! **************************************************************************************************
544 : !> \brief releases subspace-rotation environment
545 : !> \param subspace_env ...
546 : !> \par History
547 : !> 09.2009 created [MI]
548 : !> \author [MI]
549 : ! **************************************************************************************************
550 2 : SUBROUTINE diag_subspace_env_release(subspace_env)
551 : TYPE(subspace_env_type), POINTER :: subspace_env
552 :
553 2 : IF (ASSOCIATED(subspace_env)) THEN
554 :
555 2 : IF (ASSOCIATED(subspace_env%p_matrix_store)) THEN
556 :
557 : CPASSERT(.TRUE.)
558 2 : CALL dbcsr_deallocate_matrix_set(subspace_env%p_matrix_store)
559 : END IF
560 2 : CALL cp_fm_release(subspace_env%chc_mat)
561 2 : CALL cp_fm_release(subspace_env%c_vec)
562 2 : CALL cp_fm_release(subspace_env%c0)
563 :
564 2 : IF (ASSOCIATED(subspace_env%mixing_store)) THEN
565 2 : CALL mixing_storage_release(subspace_env%mixing_store)
566 2 : DEALLOCATE (subspace_env%mixing_store)
567 : END IF
568 :
569 2 : DEALLOCATE (subspace_env)
570 : END IF
571 :
572 2 : END SUBROUTINE diag_subspace_env_release
573 :
574 0 : END MODULE qs_scf_types
|