Line data Source code
1 : !--------------------------------------------------------------------------------------------------!
2 : ! CP2K: A general program to perform molecular dynamics simulations !
3 : ! Copyright 2000-2024 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_operations, ONLY: dbcsr_deallocate_matrix_set
16 : USE cp_fm_types, ONLY: cp_fm_release,&
17 : cp_fm_type
18 : USE dbcsr_api, ONLY: dbcsr_deallocate_matrix,&
19 : dbcsr_p_type,&
20 : dbcsr_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 : #include "./base/base_uses.f90"
43 :
44 : IMPLICIT NONE
45 : PRIVATE
46 :
47 : LOGICAL, PRIVATE, PARAMETER :: debug_this_module = .TRUE.
48 :
49 : CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_scf_types'
50 :
51 : INTEGER, PARAMETER, PUBLIC :: general_diag_method_nr = 1, &
52 : special_diag_method_nr = 2, &
53 : ot_diag_method_nr = 3, &
54 : block_krylov_diag_method_nr = 4, &
55 : block_davidson_diag_method_nr = 5, &
56 : ot_method_nr = 10, &
57 : filter_matrix_diag_method_nr = 20
58 :
59 : PUBLIC :: qs_scf_env_type
60 : PUBLIC :: scf_env_release, scf_env_create, scf_env_did_change
61 : PUBLIC :: krylov_space_type, krylov_space_create, subspace_env_type
62 : PUBLIC :: diag_subspace_env_create
63 :
64 : ! **************************************************************************************************
65 : !> \brief wrapper for temporary and cached objects used in the scf iteration
66 : !> \par History
67 : !> 02.2003 created [fawzi]
68 : !> \author fawzi
69 : ! **************************************************************************************************
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
77 : !NOTE: the following matrices are small and could be used as standard array rather than distributed fm
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
81 :
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
90 :
91 : TYPE floating_basis_type
92 : REAL(KIND=dp), DIMENSION(:, :), POINTER :: gradient
93 : END TYPE floating_basis_type
94 : ! **************************************************************************************************
95 : TYPE qs_scf_env_type
96 : TYPE(qs_outer_scf_type) :: outer_scf
97 : INTEGER :: iter_count
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
116 : !> reference molecular orbitals for the maximum overlap method
117 : TYPE(cp_fm_type), DIMENSION(:), POINTER :: mom_ref_mo_coeff
118 : !> MOM-related work matrices
119 : TYPE(cp_fm_type), DIMENSION(:), POINTER :: mom_overlap, mom_s_mo_coeff
120 : END TYPE qs_scf_env_type
121 :
122 : CONTAINS
123 :
124 : ! **************************************************************************************************
125 : !> \brief allocates and initialize an scf_env
126 : !> \param scf_env the scf env to initialize
127 : !> \par History
128 : !> 02.2003 created [fawzi]
129 : !> \author fawzi
130 : ! **************************************************************************************************
131 5563 : SUBROUTINE scf_env_create(scf_env)
132 : TYPE(qs_scf_env_type), INTENT(OUT) :: scf_env
133 :
134 : CHARACTER(len=*), PARAMETER :: routineN = 'scf_env_create'
135 :
136 : INTEGER :: handle
137 :
138 5563 : CALL timeset(routineN, handle)
139 :
140 5563 : scf_env%iter_count = 0
141 5563 : scf_env%nelectron = 0
142 5563 : scf_env%iter_param = 0.0_dp
143 5563 : scf_env%iter_delta = 0.0_dp
144 5563 : scf_env%iter_method = ""
145 5563 : scf_env%print_iter_line = .TRUE.
146 5563 : scf_env%skip_mixing = .FALSE.
147 5563 : scf_env%skip_diis = .FALSE.
148 5563 : scf_env%needs_ortho = .FALSE.
149 5563 : scf_env%method = -1
150 5563 : scf_env%mixing_method = -1
151 5563 : scf_env%p_mix_alpha = 1.0_dp
152 5563 : scf_env%cholesky_method = -1
153 5563 : scf_env%outer_scf%iter_count = 0
154 5563 : scf_env%sum_zeff_corr = 0.0_dp
155 5563 : NULLIFY (scf_env%outer_scf%variables)
156 5563 : NULLIFY (scf_env%outer_scf%gradient)
157 5563 : NULLIFY (scf_env%outer_scf%energy)
158 5563 : NULLIFY (scf_env%outer_scf%count)
159 5563 : NULLIFY (scf_env%outer_scf%inv_jacobian)
160 5563 : scf_env%outer_scf%deallocate_jacobian = .TRUE.
161 5563 : NULLIFY (scf_env%scf_work1)
162 5563 : NULLIFY (scf_env%scf_work2)
163 5563 : NULLIFY (scf_env%ortho)
164 5563 : NULLIFY (scf_env%ortho_dbcsr)
165 5563 : NULLIFY (scf_env%ortho_m1)
166 5563 : NULLIFY (scf_env%p_mix_new)
167 5563 : NULLIFY (scf_env%ot_preconditioner)
168 5563 : NULLIFY (scf_env%qs_ot_env)
169 5563 : NULLIFY (scf_env%scf_diis_buffer)
170 5563 : NULLIFY (scf_env%buf1_dbcsr)
171 5563 : NULLIFY (scf_env%buf2_dbcsr)
172 5563 : NULLIFY (scf_env%s_half)
173 5563 : NULLIFY (scf_env%p_delta)
174 5563 : NULLIFY (scf_env%s_minus_one)
175 5563 : NULLIFY (scf_env%cc_buffer)
176 5563 : NULLIFY (scf_env%mixing_store)
177 5563 : NULLIFY (scf_env%krylov_space)
178 5563 : NULLIFY (scf_env%subspace_env)
179 5563 : NULLIFY (scf_env%block_davidson_env)
180 5563 : NULLIFY (scf_env%floating_basis%gradient)
181 5563 : CALL fb_env_nullify(scf_env%filter_matrix_env)
182 5563 : NULLIFY (scf_env%mom_ref_mo_coeff)
183 5563 : NULLIFY (scf_env%mom_overlap)
184 5563 : NULLIFY (scf_env%mom_s_mo_coeff)
185 :
186 5563 : CALL timestop(handle)
187 :
188 5563 : END SUBROUTINE scf_env_create
189 :
190 : ! **************************************************************************************************
191 : !> \brief function to be called to inform the scf_env about changes
192 : !> \param scf_env the scf env to inform
193 : !> \par History
194 : !> 03.2003 created [fawzi]
195 : !> \author fawzi
196 : ! **************************************************************************************************
197 12658 : SUBROUTINE scf_env_did_change(scf_env)
198 : TYPE(qs_scf_env_type), INTENT(INOUT) :: scf_env
199 :
200 : CHARACTER(len=*), PARAMETER :: routineN = 'scf_env_did_change'
201 :
202 : INTEGER :: handle
203 :
204 12658 : CALL timeset(routineN, handle)
205 :
206 12658 : IF (ASSOCIATED(scf_env%p_mix_new)) THEN
207 0 : CALL dbcsr_deallocate_matrix_set(scf_env%p_mix_new)
208 : END IF
209 12658 : IF (ASSOCIATED(scf_env%p_delta)) THEN
210 0 : CALL dbcsr_deallocate_matrix_set(scf_env%p_delta)
211 : END IF
212 12658 : CALL cp_fm_release(scf_env%mom_ref_mo_coeff)
213 :
214 12658 : CALL timestop(handle)
215 :
216 12658 : END SUBROUTINE scf_env_did_change
217 :
218 : ! **************************************************************************************************
219 : !> \brief releases an scf_env (see doc/ReferenceCounting.html)
220 : !> \param scf_env the environment to release
221 : !> \par History
222 : !> 02.2003 created [fawzi]
223 : !> \author fawzi
224 : ! **************************************************************************************************
225 5563 : SUBROUTINE scf_env_release(scf_env)
226 :
227 : TYPE(qs_scf_env_type), INTENT(INOUT) :: scf_env
228 :
229 : CHARACTER(len=*), PARAMETER :: routineN = 'scf_env_release'
230 :
231 : INTEGER :: handle, i
232 :
233 5563 : CALL timeset(routineN, handle)
234 :
235 5563 : CALL cp_fm_release(scf_env%scf_work1)
236 5563 : IF (ASSOCIATED(scf_env%scf_work2)) THEN
237 2 : CALL cp_fm_release(scf_env%scf_work2)
238 2 : DEALLOCATE (scf_env%scf_work2)
239 : END IF
240 5563 : IF (ASSOCIATED(scf_env%ortho)) THEN
241 2 : CALL cp_fm_release(scf_env%ortho)
242 2 : DEALLOCATE (scf_env%ortho)
243 : END IF
244 5563 : IF (ASSOCIATED(scf_env%ortho_m1)) THEN
245 0 : CALL cp_fm_release(scf_env%ortho_m1)
246 0 : DEALLOCATE (scf_env%ortho_m1)
247 : END IF
248 5563 : IF (ASSOCIATED(scf_env%ortho_dbcsr)) THEN
249 : ! we should not end up here, and give back using the pools
250 : CPASSERT(.TRUE.)
251 0 : CALL dbcsr_deallocate_matrix(scf_env%ortho_dbcsr)
252 : END IF
253 5563 : IF (ASSOCIATED(scf_env%buf1_dbcsr)) THEN
254 : ! we should not end up here, and give back using the pools
255 : CPASSERT(.TRUE.)
256 0 : CALL dbcsr_deallocate_matrix(scf_env%buf1_dbcsr)
257 : END IF
258 5563 : IF (ASSOCIATED(scf_env%buf2_dbcsr)) THEN
259 : ! we should not end up here, and give back using the pools
260 : CPASSERT(.TRUE.)
261 0 : CALL dbcsr_deallocate_matrix(scf_env%buf2_dbcsr)
262 : END IF
263 5563 : IF (ASSOCIATED(scf_env%s_half)) THEN
264 8 : CALL cp_fm_release(scf_env%s_half)
265 8 : DEALLOCATE (scf_env%s_half)
266 : END IF
267 5563 : IF (ASSOCIATED(scf_env%s_minus_one)) THEN
268 0 : CALL cp_fm_release(scf_env%s_minus_one)
269 0 : DEALLOCATE (scf_env%s_minus_one)
270 : END IF
271 5563 : IF (ASSOCIATED(scf_env%p_mix_new)) THEN
272 : ! we should not end up here, and give back using the pools
273 : CPASSERT(.TRUE.)
274 0 : CALL dbcsr_deallocate_matrix_set(scf_env%p_mix_new)
275 : END IF
276 5563 : IF (ASSOCIATED(scf_env%p_delta)) THEN
277 : ! we should not end up here, and give back using the pools
278 : CPASSERT(.TRUE.)
279 0 : CALL dbcsr_deallocate_matrix_set(scf_env%p_delta)
280 : END IF
281 5563 : IF (ASSOCIATED(scf_env%ot_preconditioner)) THEN
282 4379 : DO i = 1, SIZE(scf_env%ot_preconditioner)
283 2414 : CALL destroy_preconditioner(scf_env%ot_preconditioner(i)%preconditioner)
284 4379 : DEALLOCATE (scf_env%ot_preconditioner(i)%preconditioner)
285 : END DO
286 1965 : DEALLOCATE (scf_env%ot_preconditioner)
287 : END IF
288 5563 : IF (ASSOCIATED(scf_env%qs_ot_env)) THEN
289 0 : DO i = 1, SIZE(scf_env%qs_ot_env)
290 0 : CALL qs_ot_destroy(scf_env%qs_ot_env(i))
291 : END DO
292 0 : DEALLOCATE (scf_env%qs_ot_env)
293 : END IF
294 5563 : IF (ASSOCIATED(scf_env%scf_diis_buffer)) THEN
295 3160 : CALL qs_diis_b_release(scf_env%scf_diis_buffer)
296 3160 : DEALLOCATE (scf_env%scf_diis_buffer)
297 : END IF
298 5563 : IF (ASSOCIATED(scf_env%outer_scf%variables)) THEN
299 0 : DEALLOCATE (scf_env%outer_scf%variables)
300 : END IF
301 5563 : IF (ASSOCIATED(scf_env%outer_scf%count)) THEN
302 0 : DEALLOCATE (scf_env%outer_scf%count)
303 : END IF
304 5563 : IF (ASSOCIATED(scf_env%outer_scf%gradient)) THEN
305 0 : DEALLOCATE (scf_env%outer_scf%gradient)
306 : END IF
307 5563 : IF (ASSOCIATED(scf_env%outer_scf%inv_jacobian)) THEN
308 6 : DEALLOCATE (scf_env%outer_scf%inv_jacobian)
309 : END IF
310 5563 : IF (ASSOCIATED(scf_env%outer_scf%energy)) THEN
311 0 : DEALLOCATE (scf_env%outer_scf%energy)
312 : END IF
313 5563 : IF (ASSOCIATED(scf_env%cc_buffer)) THEN
314 0 : DEALLOCATE (scf_env%cc_buffer)
315 : END IF
316 5563 : IF (ASSOCIATED(scf_env%mixing_store)) THEN
317 5445 : CALL mixing_storage_release(scf_env%mixing_store)
318 5445 : DEALLOCATE (scf_env%mixing_store)
319 : END IF
320 5563 : IF (ASSOCIATED(scf_env%krylov_space)) THEN
321 4 : CALL krylov_space_release(scf_env%krylov_space)
322 : END IF
323 5563 : IF (ASSOCIATED(scf_env%subspace_env)) THEN
324 2 : CALL diag_subspace_env_release(scf_env%subspace_env)
325 : END IF
326 5563 : IF (ASSOCIATED(scf_env%block_davidson_env)) THEN
327 12 : CALL block_davidson_release(scf_env%block_davidson_env)
328 : END IF
329 5563 : IF (fb_env_has_data(scf_env%filter_matrix_env)) THEN
330 10 : CALL fb_env_release(scf_env%filter_matrix_env)
331 : END IF
332 5563 : IF (ASSOCIATED(scf_env%floating_basis%gradient)) THEN
333 0 : DEALLOCATE (scf_env%floating_basis%gradient)
334 : END IF
335 5563 : CALL cp_fm_release(scf_env%mom_ref_mo_coeff)
336 5563 : CALL cp_fm_release(scf_env%mom_overlap)
337 5563 : CALL cp_fm_release(scf_env%mom_s_mo_coeff)
338 :
339 5563 : CALL timestop(handle)
340 :
341 5563 : END SUBROUTINE scf_env_release
342 :
343 : ! **************************************************************************************************
344 : !> \brief creates krylov space
345 : !> \param krylov_space ...
346 : !> \param scf_section ...
347 : !> \par History
348 : !> 05.2009 created [MI]
349 : !> \author [MI]
350 : ! **************************************************************************************************
351 4 : SUBROUTINE krylov_space_create(krylov_space, scf_section)
352 :
353 : TYPE(krylov_space_type), POINTER :: krylov_space
354 : TYPE(section_vals_type), POINTER :: scf_section
355 :
356 4 : CPASSERT(.NOT. ASSOCIATED(krylov_space))
357 4 : ALLOCATE (krylov_space)
358 :
359 4 : NULLIFY (krylov_space%c_eval, krylov_space%t_eval)
360 4 : NULLIFY (krylov_space%v_mat)
361 4 : NULLIFY (krylov_space%mo_conv, krylov_space%mo_refine)
362 4 : NULLIFY (krylov_space%chc_mat, krylov_space%c_vec)
363 4 : NULLIFY (krylov_space%tmp_mat)
364 4 : NULLIFY (krylov_space%block1_mat, krylov_space%block2_mat)
365 4 : NULLIFY (krylov_space%block3_mat, krylov_space%block4_mat, krylov_space%block5_mat)
366 :
367 : CALL section_vals_val_get(scf_section, "DIAGONALIZATION%MAX_ITER", &
368 4 : i_val=krylov_space%max_iter)
369 : CALL section_vals_val_get(scf_section, "DIAGONALIZATION%KRYLOV%NKRYLOV", &
370 4 : i_val=krylov_space%nkrylov)
371 : CALL section_vals_val_get(scf_section, "DIAGONALIZATION%KRYLOV%NBLOCK", &
372 4 : i_val=krylov_space%nblock)
373 : CALL section_vals_val_get(scf_section, "DIAGONALIZATION%KRYLOV%EPS_KRYLOV", &
374 4 : r_val=krylov_space%eps_conv)
375 : CALL section_vals_val_get(scf_section, "DIAGONALIZATION%KRYLOV%EPS_STD_DIAG", &
376 4 : r_val=krylov_space%eps_std_diag)
377 : CALL section_vals_val_get(scf_section, "DIAGONALIZATION%EPS_ADAPT", &
378 4 : r_val=krylov_space%eps_adapt)
379 : CALL section_vals_val_get(scf_section, "DIAGONALIZATION%KRYLOV%CHECK_MOS_CONV", &
380 4 : l_val=krylov_space%always_check_conv)
381 :
382 4 : END SUBROUTINE krylov_space_create
383 :
384 : ! **************************************************************************************************
385 : !> \brief releases krylov space
386 : !> \param krylov_space ...
387 : !> \par History
388 : !> 05.2009 created [MI]
389 : !> \author [MI]
390 : ! **************************************************************************************************
391 4 : SUBROUTINE krylov_space_release(krylov_space)
392 : TYPE(krylov_space_type), POINTER :: krylov_space
393 :
394 4 : IF (ASSOCIATED(krylov_space)) THEN
395 :
396 4 : DEALLOCATE (krylov_space%c_eval)
397 4 : DEALLOCATE (krylov_space%t_eval)
398 :
399 4 : CALL cp_fm_release(krylov_space%v_mat)
400 4 : CALL cp_fm_release(krylov_space%mo_conv)
401 4 : CALL cp_fm_release(krylov_space%mo_refine)
402 4 : CALL cp_fm_release(krylov_space%chc_mat)
403 4 : CALL cp_fm_release(krylov_space%c_vec)
404 :
405 4 : IF (ASSOCIATED(krylov_space%tmp_mat)) THEN
406 4 : CALL cp_fm_release(krylov_space%tmp_mat)
407 4 : DEALLOCATE (krylov_space%tmp_mat)
408 : END IF
409 4 : IF (ASSOCIATED(krylov_space%block1_mat)) THEN
410 4 : CALL cp_fm_release(krylov_space%block1_mat)
411 4 : DEALLOCATE (krylov_space%block1_mat)
412 : END IF
413 4 : IF (ASSOCIATED(krylov_space%block2_mat)) THEN
414 4 : CALL cp_fm_release(krylov_space%block2_mat)
415 4 : DEALLOCATE (krylov_space%block2_mat)
416 : END IF
417 4 : IF (ASSOCIATED(krylov_space%block3_mat)) THEN
418 4 : CALL cp_fm_release(krylov_space%block3_mat)
419 4 : DEALLOCATE (krylov_space%block3_mat)
420 : END IF
421 4 : IF (ASSOCIATED(krylov_space%block4_mat)) THEN
422 4 : CALL cp_fm_release(krylov_space%block4_mat)
423 4 : DEALLOCATE (krylov_space%block4_mat)
424 : END IF
425 4 : IF (ASSOCIATED(krylov_space%block5_mat)) THEN
426 4 : CALL cp_fm_release(krylov_space%block5_mat)
427 4 : DEALLOCATE (krylov_space%block5_mat)
428 : END IF
429 :
430 4 : DEALLOCATE (krylov_space)
431 :
432 : NULLIFY (krylov_space)
433 : END IF
434 :
435 4 : END SUBROUTINE krylov_space_release
436 :
437 : ! **************************************************************************************************
438 : !> \brief creates subspace-rotation environment
439 : !> \param subspace_env ...
440 : !> \param scf_section ...
441 : !> \param ecut ...
442 : !> \par History
443 : !> 09.2009 created [MI]
444 : !> \author [MI]
445 : ! **************************************************************************************************
446 4 : SUBROUTINE diag_subspace_env_create(subspace_env, scf_section, ecut)
447 :
448 : TYPE(subspace_env_type), POINTER :: subspace_env
449 : TYPE(section_vals_type), POINTER :: scf_section
450 : REAL(dp), INTENT(IN) :: ecut
451 :
452 : LOGICAL :: do_mixing
453 : TYPE(section_vals_type), POINTER :: mixing_section
454 :
455 2 : CPASSERT(.NOT. ASSOCIATED(subspace_env))
456 2 : ALLOCATE (subspace_env)
457 :
458 2 : NULLIFY (subspace_env%p_matrix_store)
459 2 : NULLIFY (subspace_env%p_matrix_mix)
460 2 : NULLIFY (subspace_env%chc_mat)
461 2 : NULLIFY (subspace_env%c_vec)
462 2 : NULLIFY (subspace_env%c0)
463 2 : NULLIFY (subspace_env%mixing_store)
464 2 : NULLIFY (mixing_section)
465 :
466 : CALL section_vals_val_get(scf_section, "DIAGONALIZATION%DIAG_SUB_SCF%MAX_ITER", &
467 2 : i_val=subspace_env%max_iter)
468 : CALL section_vals_val_get(scf_section, "DIAGONALIZATION%DIAG_SUB_SCF%EPS_ENE", &
469 2 : r_val=subspace_env%eps_ene)
470 : CALL section_vals_val_get(scf_section, "DIAGONALIZATION%DIAG_SUB_SCF%EPS_SKIP_SUB_DIAG", &
471 2 : r_val=subspace_env%eps_diag_sub)
472 : CALL section_vals_val_get(scf_section, "DIAGONALIZATION%DIAG_SUB_SCF%EPS_ADAPT_SCF", &
473 2 : r_val=subspace_env%eps_adapt)
474 2 : subspace_env%mixing_method = 0
475 : do_mixing = .FALSE.
476 2 : mixing_section => section_vals_get_subs_vals(scf_section, "DIAGONALIZATION%DIAG_SUB_SCF%MIXING")
477 : CALL section_vals_val_get(mixing_section, "_SECTION_PARAMETERS_", &
478 2 : l_val=do_mixing)
479 2 : IF (do_mixing) THEN
480 : CALL section_vals_val_get(mixing_section, "METHOD", &
481 2 : i_val=subspace_env%mixing_method)
482 2 : IF (subspace_env%mixing_method >= direct_mixing_nr) THEN
483 2 : ALLOCATE (subspace_env%mixing_store)
484 : CALL mixing_storage_create(subspace_env%mixing_store, mixing_section, &
485 2 : subspace_env%mixing_method, ecut=ecut)
486 : END IF
487 : END IF
488 :
489 2 : END SUBROUTINE diag_subspace_env_create
490 :
491 : ! **************************************************************************************************
492 : !> \brief releases subspace-rotation environment
493 : !> \param subspace_env ...
494 : !> \par History
495 : !> 09.2009 created [MI]
496 : !> \author [MI]
497 : ! **************************************************************************************************
498 2 : SUBROUTINE diag_subspace_env_release(subspace_env)
499 : TYPE(subspace_env_type), POINTER :: subspace_env
500 :
501 2 : IF (ASSOCIATED(subspace_env)) THEN
502 :
503 2 : IF (ASSOCIATED(subspace_env%p_matrix_store)) THEN
504 :
505 : CPASSERT(.TRUE.)
506 2 : CALL dbcsr_deallocate_matrix_set(subspace_env%p_matrix_store)
507 : END IF
508 2 : CALL cp_fm_release(subspace_env%chc_mat)
509 2 : CALL cp_fm_release(subspace_env%c_vec)
510 2 : CALL cp_fm_release(subspace_env%c0)
511 :
512 2 : IF (ASSOCIATED(subspace_env%mixing_store)) THEN
513 2 : CALL mixing_storage_release(subspace_env%mixing_store)
514 2 : DEALLOCATE (subspace_env%mixing_store)
515 : END IF
516 :
517 2 : DEALLOCATE (subspace_env)
518 : END IF
519 :
520 2 : END SUBROUTINE diag_subspace_env_release
521 :
522 0 : END MODULE qs_scf_types
|