LCOV - code coverage report
Current view: top level - src - qs_scf_types.F (source / functions) Hit Total Coverage
Test: CP2K Regtests (git:ccc2433) Lines: 190 211 90.0 %
Date: 2024-04-25 07:09:54 Functions: 7 11 63.6 %

          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

Generated by: LCOV version 1.15