1!--------------------------------------------------------------------------------------------------!
2!   CP2K: A general program to perform molecular dynamics simulations                              !
3!   Copyright (C) 2000 - 2020  CP2K developers group                                               !
4!--------------------------------------------------------------------------------------------------!
5
6! **************************************************************************************************
7!> \brief module that contains the definitions of the scf types
8!> \par History
9!>      02.2003 created [fawzi]
10!> \author fawzi
11! **************************************************************************************************
12MODULE qs_scf_types
13   USE cp_dbcsr_operations,             ONLY: dbcsr_deallocate_matrix_set
14   USE cp_fm_types,                     ONLY: cp_fm_p_type,&
15                                              cp_fm_release,&
16                                              cp_fm_type
17   USE cp_fm_vect,                      ONLY: cp_fm_vect_dealloc
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   INTEGER, SAVE, PRIVATE :: last_scf_env_id = 0
60
61   PUBLIC :: qs_scf_env_type
62   PUBLIC :: scf_env_retain, scf_env_release, scf_env_create, scf_env_did_change
63   PUBLIC :: krylov_space_type, krylov_space_create, subspace_env_type
64   PUBLIC :: diag_subspace_env_create
65
66! **************************************************************************************************
67!> \brief wrapper for temporary and cached objects used in the scf iteration
68!> \par History
69!>      02.2003 created [fawzi]
70!> \author fawzi
71! **************************************************************************************************
72   TYPE krylov_space_type
73      INTEGER :: nkrylov, nblock, nmo_conv, nmo_nc, max_iter
74      LOGICAL :: always_check_conv
75      REAL(dp) :: eps_std_diag, eps_conv, eps_adapt, max_res_norm, min_res_norm
76      REAL(dp), DIMENSION(:), POINTER :: c_eval, t_eval
77      TYPE(cp_fm_p_type), DIMENSION(:), POINTER :: v_mat, mo_conv, mo_refine
78      TYPE(cp_fm_type), POINTER ::  tmp_mat
79      !NOTE: the following matrices are small and could be used as standard array rather than distributed fm
80      TYPE(cp_fm_type), POINTER :: block1_mat, block2_mat, block3_mat, block4_mat, block5_mat
81      TYPE(cp_fm_p_type), DIMENSION(:), POINTER ::  c_vec, chc_mat
82   END TYPE krylov_space_type
83
84   TYPE subspace_env_type
85      INTEGER :: max_iter, mixing_method
86      REAL(dp) :: eps_diag_sub, eps_ene, eps_adapt
87      TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: p_matrix_store
88      TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: p_matrix_mix
89      TYPE(cp_fm_p_type), DIMENSION(:), POINTER :: chc_mat, c_vec, c0
90      TYPE(mixing_storage_type), POINTER :: mixing_store
91   END TYPE subspace_env_type
92
93   TYPE floating_basis_type
94      REAL(KIND=dp), DIMENSION(:, :), POINTER :: gradient
95   END TYPE floating_basis_type
96   ! **************************************************************************************************
97   TYPE qs_scf_env_type
98      TYPE(qs_outer_scf_type) :: outer_scf
99      INTEGER :: ref_count, id_nr, print_count, iter_count
100      INTEGER :: cholesky_method, nelectron, method, mixing_method, nskip_mixing
101      REAL(KIND=dp) :: iter_param, iter_delta, p_mix_alpha, sum_zeff_corr
102      CHARACTER(len=15) :: iter_method
103      COMPLEX(KIND=dp), DIMENSION(:, :, :), POINTER :: cc_buffer
104      LOGICAL :: print_iter_line, skip_mixing, skip_diis, needs_ortho
105      TYPE(mixing_storage_type), POINTER :: mixing_store
106      TYPE(cp_fm_p_type), DIMENSION(:), POINTER :: scf_work1
107      TYPE(cp_fm_type), POINTER  :: scf_work2, ortho, ortho_m1, s_half, s_minus_one
108      TYPE(krylov_space_type), POINTER :: krylov_space
109      TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: p_delta, p_mix_new
110      TYPE(dbcsr_type), POINTER :: ortho_dbcsr, buf1_dbcsr, buf2_dbcsr
111      TYPE(preconditioner_p_type), DIMENSION(:), POINTER :: ot_preconditioner
112      TYPE(qs_ot_type), POINTER, DIMENSION(:)  :: qs_ot_env
113      TYPE(qs_diis_buffer_type), POINTER :: scf_diis_buffer
114      TYPE(subspace_env_type), POINTER :: subspace_env
115      TYPE(davidson_type), POINTER, DIMENSION(:) :: block_davidson_env
116      TYPE(fb_env_obj) :: filter_matrix_env
117      TYPE(floating_basis_type) :: floating_basis
118      !> reference molecular orbitals for the maximum overlap method
119      TYPE(cp_fm_p_type), DIMENSION(:), POINTER          :: mom_ref_mo_coeff
120      !> MOM-related work matrices
121      TYPE(cp_fm_p_type), DIMENSION(:), POINTER          :: mom_overlap, mom_s_mo_coeff
122   END TYPE qs_scf_env_type
123
124CONTAINS
125
126! **************************************************************************************************
127!> \brief allocates and initialize an scf_env
128!> \param scf_env the scf env to initialize
129!> \par History
130!>      02.2003 created [fawzi]
131!> \author fawzi
132! **************************************************************************************************
133   SUBROUTINE scf_env_create(scf_env)
134      TYPE(qs_scf_env_type), POINTER                     :: scf_env
135
136      CHARACTER(len=*), PARAMETER :: routineN = 'scf_env_create', routineP = moduleN//':'//routineN
137
138      INTEGER                                            :: handle
139
140      CALL timeset(routineN, handle)
141
142      ALLOCATE (scf_env)
143      scf_env%ref_count = 1
144      scf_env%print_count = 0
145      last_scf_env_id = last_scf_env_id + 1
146      scf_env%id_nr = last_scf_env_id
147      scf_env%print_count = 0
148      scf_env%iter_count = 0
149      scf_env%nelectron = 0
150      scf_env%iter_param = 0.0_dp
151      scf_env%iter_delta = 0.0_dp
152      scf_env%iter_method = ""
153      scf_env%print_iter_line = .TRUE.
154      scf_env%skip_mixing = .FALSE.
155      scf_env%skip_diis = .FALSE.
156      scf_env%needs_ortho = .FALSE.
157      scf_env%method = -1
158      scf_env%mixing_method = -1
159      scf_env%p_mix_alpha = 1.0_dp
160      scf_env%cholesky_method = -1
161      scf_env%outer_scf%iter_count = 0
162      scf_env%sum_zeff_corr = 0.0_dp
163      NULLIFY (scf_env%outer_scf%variables)
164      NULLIFY (scf_env%outer_scf%gradient)
165      NULLIFY (scf_env%outer_scf%energy)
166      NULLIFY (scf_env%outer_scf%count)
167      NULLIFY (scf_env%outer_scf%inv_jacobian)
168      scf_env%outer_scf%deallocate_jacobian = .TRUE.
169      NULLIFY (scf_env%scf_work1)
170      NULLIFY (scf_env%scf_work2)
171      NULLIFY (scf_env%ortho)
172      NULLIFY (scf_env%ortho_dbcsr)
173      NULLIFY (scf_env%ortho_m1)
174      NULLIFY (scf_env%p_mix_new)
175      NULLIFY (scf_env%ot_preconditioner)
176      NULLIFY (scf_env%qs_ot_env)
177      NULLIFY (scf_env%scf_diis_buffer)
178      NULLIFY (scf_env%buf1_dbcsr)
179      NULLIFY (scf_env%buf2_dbcsr)
180      NULLIFY (scf_env%s_half)
181      NULLIFY (scf_env%p_delta)
182      NULLIFY (scf_env%s_minus_one)
183      NULLIFY (scf_env%cc_buffer)
184      NULLIFY (scf_env%mixing_store)
185      NULLIFY (scf_env%krylov_space)
186      NULLIFY (scf_env%subspace_env)
187      NULLIFY (scf_env%block_davidson_env)
188      NULLIFY (scf_env%floating_basis%gradient)
189      CALL fb_env_nullify(scf_env%filter_matrix_env)
190      NULLIFY (scf_env%mom_ref_mo_coeff)
191      NULLIFY (scf_env%mom_overlap)
192      NULLIFY (scf_env%mom_s_mo_coeff)
193
194      CALL timestop(handle)
195
196   END SUBROUTINE scf_env_create
197
198! **************************************************************************************************
199!> \brief retains an scf_env (see doc/ReferenceCounting.html)
200!> \param scf_env the environment to retain
201!> \par History
202!>      02.2003 created [fawzi]
203!> \author fawzi
204! **************************************************************************************************
205   SUBROUTINE scf_env_retain(scf_env)
206
207      TYPE(qs_scf_env_type), POINTER                     :: scf_env
208
209      CHARACTER(len=*), PARAMETER :: routineN = 'scf_env_retain', routineP = moduleN//':'//routineN
210
211      INTEGER                                            :: handle
212
213      CALL timeset(routineN, handle)
214
215      CPASSERT(ASSOCIATED(scf_env))
216      CPASSERT(scf_env%ref_count > 0)
217      scf_env%ref_count = scf_env%ref_count + 1
218
219      CALL timestop(handle)
220
221   END SUBROUTINE scf_env_retain
222
223! **************************************************************************************************
224!> \brief function to be called to inform the scf_env about changes
225!> \param scf_env the scf env to inform
226!> \par History
227!>      03.2003 created [fawzi]
228!> \author fawzi
229! **************************************************************************************************
230   SUBROUTINE scf_env_did_change(scf_env)
231      TYPE(qs_scf_env_type), POINTER                     :: scf_env
232
233      CHARACTER(len=*), PARAMETER :: routineN = 'scf_env_did_change', &
234         routineP = moduleN//':'//routineN
235
236      INTEGER                                            :: handle, i
237
238      CALL timeset(routineN, handle)
239
240      CPASSERT(ASSOCIATED(scf_env))
241      CPASSERT(scf_env%ref_count > 0)
242
243      IF (ASSOCIATED(scf_env%p_mix_new)) THEN
244         CALL dbcsr_deallocate_matrix_set(scf_env%p_mix_new)
245      END IF
246      IF (ASSOCIATED(scf_env%p_delta)) THEN
247         CALL dbcsr_deallocate_matrix_set(scf_env%p_delta)
248      END IF
249      IF (ASSOCIATED(scf_env%mom_ref_mo_coeff)) THEN
250         DO i = 1, SIZE(scf_env%mom_ref_mo_coeff)
251            CALL cp_fm_release(scf_env%mom_ref_mo_coeff(i)%matrix)
252         END DO
253         DEALLOCATE (scf_env%mom_ref_mo_coeff)
254      END IF
255
256      CALL timestop(handle)
257
258   END SUBROUTINE scf_env_did_change
259
260! **************************************************************************************************
261!> \brief releases an scf_env (see doc/ReferenceCounting.html)
262!> \param scf_env the environment to release
263!> \par History
264!>      02.2003 created [fawzi]
265!> \author fawzi
266! **************************************************************************************************
267   SUBROUTINE scf_env_release(scf_env)
268
269      TYPE(qs_scf_env_type), POINTER                     :: scf_env
270
271      CHARACTER(len=*), PARAMETER :: routineN = 'scf_env_release', &
272         routineP = moduleN//':'//routineN
273
274      INTEGER                                            :: handle, i
275
276      CALL timeset(routineN, handle)
277
278      IF (ASSOCIATED(scf_env)) THEN
279         CPASSERT(scf_env%ref_count > 0)
280         scf_env%ref_count = scf_env%ref_count - 1
281         IF (scf_env%ref_count < 1) THEN
282            CALL cp_fm_vect_dealloc(scf_env%scf_work1)
283            CALL cp_fm_release(scf_env%scf_work2)
284            CALL cp_fm_release(scf_env%ortho)
285            CALL cp_fm_release(scf_env%ortho_m1)
286            IF (ASSOCIATED(scf_env%ortho_dbcsr)) THEN
287               ! we should not end up here, and give back using the pools
288               CPASSERT(.TRUE.)
289               CALL dbcsr_deallocate_matrix(scf_env%ortho_dbcsr)
290            END IF
291            IF (ASSOCIATED(scf_env%buf1_dbcsr)) THEN
292               ! we should not end up here, and give back using the pools
293               CPASSERT(.TRUE.)
294               CALL dbcsr_deallocate_matrix(scf_env%buf1_dbcsr)
295            END IF
296            IF (ASSOCIATED(scf_env%buf2_dbcsr)) THEN
297               ! we should not end up here, and give back using the pools
298               CPASSERT(.TRUE.)
299               CALL dbcsr_deallocate_matrix(scf_env%buf2_dbcsr)
300            END IF
301            CALL cp_fm_release(scf_env%s_half)
302            CALL cp_fm_release(scf_env%s_minus_one)
303            IF (ASSOCIATED(scf_env%p_mix_new)) THEN
304               ! we should not end up here, and give back using the pools
305               CPASSERT(.TRUE.)
306               CALL dbcsr_deallocate_matrix_set(scf_env%p_mix_new)
307            END IF
308            IF (ASSOCIATED(scf_env%p_delta)) THEN
309               ! we should not end up here, and give back using the pools
310               CPASSERT(.TRUE.)
311               CALL dbcsr_deallocate_matrix_set(scf_env%p_delta)
312            END IF
313            IF (ASSOCIATED(scf_env%ot_preconditioner)) THEN
314               DO i = 1, SIZE(scf_env%ot_preconditioner)
315                  CALL destroy_preconditioner(scf_env%ot_preconditioner(i)%preconditioner)
316                  DEALLOCATE (scf_env%ot_preconditioner(i)%preconditioner)
317               END DO
318               DEALLOCATE (scf_env%ot_preconditioner)
319            END IF
320            IF (ASSOCIATED(scf_env%qs_ot_env)) THEN
321               DO i = 1, SIZE(scf_env%qs_ot_env)
322                  CALL qs_ot_destroy(scf_env%qs_ot_env(i))
323               END DO
324               DEALLOCATE (scf_env%qs_ot_env)
325            END IF
326            CALL qs_diis_b_release(scf_env%scf_diis_buffer)
327            IF (ASSOCIATED(scf_env%outer_scf%variables)) THEN
328               DEALLOCATE (scf_env%outer_scf%variables)
329            END IF
330            IF (ASSOCIATED(scf_env%outer_scf%count)) THEN
331               DEALLOCATE (scf_env%outer_scf%count)
332            END IF
333            IF (ASSOCIATED(scf_env%outer_scf%gradient)) THEN
334               DEALLOCATE (scf_env%outer_scf%gradient)
335            END IF
336            IF (ASSOCIATED(scf_env%outer_scf%inv_jacobian)) THEN
337               DEALLOCATE (scf_env%outer_scf%inv_jacobian)
338            END IF
339            IF (ASSOCIATED(scf_env%outer_scf%energy)) THEN
340               DEALLOCATE (scf_env%outer_scf%energy)
341            END IF
342            IF (ASSOCIATED(scf_env%cc_buffer)) THEN
343               DEALLOCATE (scf_env%cc_buffer)
344            END IF
345            IF (ASSOCIATED(scf_env%mixing_store)) THEN
346               CALL mixing_storage_release(scf_env%mixing_store)
347            END IF
348            IF (ASSOCIATED(scf_env%krylov_space)) THEN
349               CALL krylov_space_release(scf_env%krylov_space)
350            END IF
351            IF (ASSOCIATED(scf_env%subspace_env)) THEN
352               CALL diag_subspace_env_release(scf_env%subspace_env)
353            END IF
354            IF (ASSOCIATED(scf_env%block_davidson_env)) THEN
355               CALL block_davidson_release(scf_env%block_davidson_env)
356            END IF
357            IF (fb_env_has_data(scf_env%filter_matrix_env)) THEN
358               CALL fb_env_release(scf_env%filter_matrix_env)
359            END IF
360            IF (ASSOCIATED(scf_env%floating_basis%gradient)) THEN
361               DEALLOCATE (scf_env%floating_basis%gradient)
362            END IF
363            IF (ASSOCIATED(scf_env%mom_ref_mo_coeff)) THEN
364               DO i = 1, SIZE(scf_env%mom_ref_mo_coeff)
365                  CALL cp_fm_release(scf_env%mom_ref_mo_coeff(i)%matrix)
366               END DO
367               DEALLOCATE (scf_env%mom_ref_mo_coeff)
368            END IF
369            IF (ASSOCIATED(scf_env%mom_overlap)) THEN
370               DO i = 1, SIZE(scf_env%mom_overlap)
371                  CALL cp_fm_release(scf_env%mom_overlap(i)%matrix)
372               END DO
373               DEALLOCATE (scf_env%mom_overlap)
374            END IF
375            IF (ASSOCIATED(scf_env%mom_s_mo_coeff)) THEN
376               DO i = 1, SIZE(scf_env%mom_s_mo_coeff)
377                  CALL cp_fm_release(scf_env%mom_s_mo_coeff(i)%matrix)
378               END DO
379               DEALLOCATE (scf_env%mom_s_mo_coeff)
380            END IF
381            DEALLOCATE (scf_env)
382         END IF
383      END IF
384
385      NULLIFY (scf_env)
386
387      CALL timestop(handle)
388
389   END SUBROUTINE scf_env_release
390
391! **************************************************************************************************
392!> \brief  creates krylov space
393!> \param krylov_space ...
394!> \param scf_section ...
395!> \par History
396!>      05.2009 created [MI]
397!> \author [MI]
398! **************************************************************************************************
399   SUBROUTINE krylov_space_create(krylov_space, scf_section)
400
401      TYPE(krylov_space_type), POINTER                   :: krylov_space
402      TYPE(section_vals_type), POINTER                   :: scf_section
403
404      CHARACTER(len=*), PARAMETER :: routineN = 'krylov_space_create', &
405         routineP = moduleN//':'//routineN
406
407      CPASSERT(.NOT. ASSOCIATED(krylov_space))
408      ALLOCATE (krylov_space)
409
410      NULLIFY (krylov_space%c_eval, krylov_space%t_eval)
411      NULLIFY (krylov_space%v_mat)
412      NULLIFY (krylov_space%mo_conv, krylov_space%mo_refine)
413      NULLIFY (krylov_space%chc_mat, krylov_space%c_vec)
414      NULLIFY (krylov_space%tmp_mat)
415      NULLIFY (krylov_space%block1_mat, krylov_space%block2_mat)
416      NULLIFY (krylov_space%block3_mat, krylov_space%block4_mat, krylov_space%block5_mat)
417
418      CALL section_vals_val_get(scf_section, "DIAGONALIZATION%MAX_ITER", &
419                                i_val=krylov_space%max_iter)
420      CALL section_vals_val_get(scf_section, "DIAGONALIZATION%KRYLOV%NKRYLOV", &
421                                i_val=krylov_space%nkrylov)
422      CALL section_vals_val_get(scf_section, "DIAGONALIZATION%KRYLOV%NBLOCK", &
423                                i_val=krylov_space%nblock)
424      CALL section_vals_val_get(scf_section, "DIAGONALIZATION%KRYLOV%EPS_KRYLOV", &
425                                r_val=krylov_space%eps_conv)
426      CALL section_vals_val_get(scf_section, "DIAGONALIZATION%KRYLOV%EPS_STD_DIAG", &
427                                r_val=krylov_space%eps_std_diag)
428      CALL section_vals_val_get(scf_section, "DIAGONALIZATION%EPS_ADAPT", &
429                                r_val=krylov_space%eps_adapt)
430      CALL section_vals_val_get(scf_section, "DIAGONALIZATION%KRYLOV%CHECK_MOS_CONV", &
431                                l_val=krylov_space%always_check_conv)
432
433   END SUBROUTINE krylov_space_create
434
435! **************************************************************************************************
436!> \brief releases krylov space
437!> \param krylov_space ...
438!> \par History
439!>      05.2009 created [MI]
440!> \author [MI]
441! **************************************************************************************************
442   SUBROUTINE krylov_space_release(krylov_space)
443      TYPE(krylov_space_type), POINTER                   :: krylov_space
444
445      CHARACTER(len=*), PARAMETER :: routineN = 'krylov_space_release', &
446         routineP = moduleN//':'//routineN
447
448      INTEGER                                            :: i
449
450      IF (ASSOCIATED(krylov_space)) THEN
451
452         DEALLOCATE (krylov_space%c_eval)
453         DEALLOCATE (krylov_space%t_eval)
454
455         DO i = 1, SIZE(krylov_space%v_mat)
456            CALL cp_fm_release(krylov_space%v_mat(i)%matrix)
457         END DO
458         DEALLOCATE (krylov_space%v_mat)
459
460         DO i = 1, SIZE(krylov_space%mo_conv)
461            CALL cp_fm_release(krylov_space%mo_conv(i)%matrix)
462         END DO
463         DEALLOCATE (krylov_space%mo_conv)
464
465         DO i = 1, SIZE(krylov_space%mo_refine)
466            CALL cp_fm_release(krylov_space%mo_refine(i)%matrix)
467         END DO
468         DEALLOCATE (krylov_space%mo_refine)
469
470         DO i = 1, SIZE(krylov_space%chc_mat)
471            CALL cp_fm_release(krylov_space%chc_mat(i)%matrix)
472         END DO
473         DEALLOCATE (krylov_space%chc_mat)
474         DO i = 1, SIZE(krylov_space%c_vec)
475            CALL cp_fm_release(krylov_space%c_vec(i)%matrix)
476         END DO
477         DEALLOCATE (krylov_space%c_vec)
478         CALL cp_fm_release(krylov_space%tmp_mat)
479         CALL cp_fm_release(krylov_space%block1_mat)
480         CALL cp_fm_release(krylov_space%block2_mat)
481         CALL cp_fm_release(krylov_space%block3_mat)
482         CALL cp_fm_release(krylov_space%block4_mat)
483         CALL cp_fm_release(krylov_space%block5_mat)
484
485         DEALLOCATE (krylov_space)
486
487         NULLIFY (krylov_space)
488      END IF
489
490   END SUBROUTINE krylov_space_release
491
492! **************************************************************************************************
493!> \brief creates subspace-rotation environment
494!> \param subspace_env ...
495!> \param scf_section ...
496!> \param ecut ...
497!> \par History
498!>      09.2009 created [MI]
499!> \author [MI]
500! **************************************************************************************************
501   SUBROUTINE diag_subspace_env_create(subspace_env, scf_section, ecut)
502
503      TYPE(subspace_env_type), POINTER                   :: subspace_env
504      TYPE(section_vals_type), POINTER                   :: scf_section
505      REAL(dp), INTENT(IN)                               :: ecut
506
507      CHARACTER(len=*), PARAMETER :: routineN = 'diag_subspace_env_create', &
508         routineP = moduleN//':'//routineN
509
510      LOGICAL                                            :: do_mixing
511      TYPE(section_vals_type), POINTER                   :: mixing_section
512
513      CPASSERT(.NOT. ASSOCIATED(subspace_env))
514      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      NULLIFY (mixing_section)
523
524      CALL section_vals_val_get(scf_section, "DIAGONALIZATION%DIAG_SUB_SCF%MAX_ITER", &
525                                i_val=subspace_env%max_iter)
526      CALL section_vals_val_get(scf_section, "DIAGONALIZATION%DIAG_SUB_SCF%EPS_ENE", &
527                                r_val=subspace_env%eps_ene)
528      CALL section_vals_val_get(scf_section, "DIAGONALIZATION%DIAG_SUB_SCF%EPS_SKIP_SUB_DIAG", &
529                                r_val=subspace_env%eps_diag_sub)
530      CALL section_vals_val_get(scf_section, "DIAGONALIZATION%DIAG_SUB_SCF%EPS_ADAPT_SCF", &
531                                r_val=subspace_env%eps_adapt)
532      subspace_env%mixing_method = 0
533      do_mixing = .FALSE.
534      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                                l_val=do_mixing)
537      IF (do_mixing) THEN
538         CALL section_vals_val_get(mixing_section, "METHOD", &
539                                   i_val=subspace_env%mixing_method)
540         IF (subspace_env%mixing_method >= direct_mixing_nr) &
541            CALL mixing_storage_create(subspace_env%mixing_store, mixing_section, &
542                                       subspace_env%mixing_method, ecut=ecut)
543      END IF
544
545   END SUBROUTINE diag_subspace_env_create
546
547! **************************************************************************************************
548!> \brief releases subspace-rotation environment
549!> \param subspace_env ...
550!> \par History
551!>      09.2009 created [MI]
552!> \author [MI]
553! **************************************************************************************************
554   SUBROUTINE diag_subspace_env_release(subspace_env)
555      TYPE(subspace_env_type), POINTER                   :: subspace_env
556
557      CHARACTER(len=*), PARAMETER :: routineN = 'diag_subspace_env_release', &
558         routineP = moduleN//':'//routineN
559
560      INTEGER                                            :: i
561
562      IF (ASSOCIATED(subspace_env)) THEN
563
564         IF (ASSOCIATED(subspace_env%p_matrix_store)) THEN
565
566            CPASSERT(.TRUE.)
567            CALL dbcsr_deallocate_matrix_set(subspace_env%p_matrix_store)
568         ENDIF
569         DO i = 1, SIZE(subspace_env%chc_mat)
570            CALL cp_fm_release(subspace_env%chc_mat(i)%matrix)
571         END DO
572         DEALLOCATE (subspace_env%chc_mat)
573         DO i = 1, SIZE(subspace_env%c_vec)
574            CALL cp_fm_release(subspace_env%c_vec(i)%matrix)
575         END DO
576         DEALLOCATE (subspace_env%c_vec)
577         DO i = 1, SIZE(subspace_env%c0)
578            CALL cp_fm_release(subspace_env%c0(i)%matrix)
579         END DO
580         DEALLOCATE (subspace_env%c0)
581
582         IF (ASSOCIATED(subspace_env%mixing_store)) THEN
583            CALL mixing_storage_release(subspace_env%mixing_store)
584         END IF
585
586         DEALLOCATE (subspace_env)
587      END IF
588
589   END SUBROUTINE diag_subspace_env_release
590
591END MODULE qs_scf_types
592