LCOV - code coverage report
Current view: top level - src - qs_scf_types.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:123285f) Lines: 89.2 % 249 222
Test Date: 2026-11-04 00:58:17 Functions: 57.1 % 14 8

            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              :                                               dbcsr_fm_copy_plan_type
      20              :    USE cp_fm_types,                     ONLY: cp_fm_release,&
      21              :                                               cp_fm_type
      22              :    USE input_section_types,             ONLY: section_vals_get_subs_vals,&
      23              :                                               section_vals_type,&
      24              :                                               section_vals_val_get
      25              :    USE kinds,                           ONLY: dp
      26              :    USE outer_scf_control_types,         ONLY: qs_outer_scf_type
      27              :    USE preconditioner_types,            ONLY: destroy_preconditioner,&
      28              :                                               preconditioner_p_type
      29              :    USE qs_block_davidson_types,         ONLY: block_davidson_release,&
      30              :                                               davidson_type
      31              :    USE qs_density_mixing_types,         ONLY: direct_mixing_nr,&
      32              :                                               mixing_storage_create,&
      33              :                                               mixing_storage_release,&
      34              :                                               mixing_storage_type
      35              :    USE qs_diis_types,                   ONLY: qs_diis_b_release,&
      36              :                                               qs_diis_buffer_type
      37              :    USE qs_fb_env_types,                 ONLY: fb_env_has_data,&
      38              :                                               fb_env_nullify,&
      39              :                                               fb_env_obj,&
      40              :                                               fb_env_release
      41              :    USE qs_kpoint_operators,             ONLY: kpoint_operator_context_release,&
      42              :                                               kpoint_operator_context_type
      43              :    USE qs_ot_types,                     ONLY: qs_ot_destroy,&
      44              :                                               qs_ot_type
      45              :    USE qs_scf_subspace_types,           ONLY: qs_scf_subspace_buffer_release,&
      46              :                                               qs_scf_subspace_buffer_type
      47              : #include "./base/base_uses.f90"
      48              : 
      49              :    IMPLICIT NONE
      50              :    PRIVATE
      51              : 
      52              :    LOGICAL, PRIVATE, PARAMETER :: debug_this_module = .TRUE.
      53              : 
      54              :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_scf_types'
      55              : 
      56              :    INTEGER, PARAMETER, PUBLIC :: general_diag_method_nr = 1, &
      57              :                                  special_diag_method_nr = 2, &
      58              :                                  ot_diag_method_nr = 3, &
      59              :                                  block_krylov_diag_method_nr = 4, &
      60              :                                  block_davidson_diag_method_nr = 5, &
      61              :                                  ot_method_nr = 10, &
      62              :                                  filter_matrix_diag_method_nr = 20, &
      63              :                                  smeagol_method_nr = 41
      64              : 
      65              :    PUBLIC :: qs_scf_env_type
      66              :    PUBLIC :: scf_env_release, scf_env_create, scf_env_did_change
      67              :    PUBLIC :: scf_env_release_ot_operators
      68              :    PUBLIC :: krylov_settings_type, krylov_settings_create
      69              :    PUBLIC :: krylov_workspace_type, krylov_workspace_release, subspace_env_type
      70              :    PUBLIC :: diag_subspace_env_create
      71              : 
      72              : ! **************************************************************************************************
      73              : !> \brief wrapper for temporary and cached objects used in the scf iteration
      74              : !> \par History
      75              : !>      02.2003 created [fawzi]
      76              : !> \author fawzi
      77              : ! **************************************************************************************************
      78              : !> \brief Parsed Krylov solver settings of the SCF section. One fully
      79              : !>        initialized object exists for every run that selects the
      80              : !>        block-Krylov diagonalization. The Gamma and the k-point
      81              : !>        drivers read it alike
      82              : ! **************************************************************************************************
      83              :    TYPE krylov_settings_type
      84              :       INTEGER :: nkrylov = -1, nblock = -1, max_iter = -1
      85              :       LOGICAL :: always_check_conv = .FALSE.
      86              :       REAL(dp) :: eps_std_diag = -1.0_dp, eps_conv = -1.0_dp, eps_adapt = -1.0_dp
      87              :    END TYPE krylov_settings_type
      88              : 
      89              : !> \brief Workspace and convergence statistics of the real-Lanczos
      90              : !>        Gamma refinement. The k-point drivers never allocate this
      91              : !>        type: their complex kernel takes a caller-owned workspace
      92              : ! **************************************************************************************************
      93              :    TYPE krylov_workspace_type
      94              :       ! the parsed settings of the run, shared with the SCF environment
      95              :       TYPE(krylov_settings_type), POINTER :: settings => NULL()
      96              :       INTEGER :: nmo_conv = -1, nmo_nc = -1
      97              :       REAL(dp) :: max_res_norm = -1.0_dp, min_res_norm = -1.0_dp
      98              :       REAL(dp), DIMENSION(:), POINTER :: c_eval => NULL(), t_eval => NULL()
      99              :       TYPE(cp_fm_type), DIMENSION(:), POINTER :: v_mat => NULL(), mo_conv => NULL(), mo_refine => NULL()
     100              :       TYPE(cp_fm_type), POINTER ::  tmp_mat => NULL()
     101              :       !NOTE: the following matrices are small and could be used as standard array rather than distributed fm
     102              :       TYPE(cp_fm_type), POINTER :: block1_mat => NULL(), block2_mat => NULL(), block3_mat => NULL(), &
     103              :                                    block4_mat => NULL(), block5_mat => NULL()
     104              :       TYPE(cp_fm_type), DIMENSION(:), POINTER ::  c_vec => NULL(), chc_mat => NULL()
     105              :    END TYPE krylov_workspace_type
     106              : 
     107              :    TYPE subspace_env_type
     108              :       INTEGER :: max_iter = -1, mixing_method = -1
     109              :       REAL(dp) :: eps_diag_sub = -1.0_dp, eps_ene = -1.0_dp, eps_adapt = -1.0_dp
     110              :       TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: p_matrix_store => NULL()
     111              :       TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: p_matrix_mix => NULL()
     112              :       TYPE(cp_fm_type), DIMENSION(:), POINTER :: chc_mat => NULL(), c_vec => NULL(), c0 => NULL()
     113              :       TYPE(mixing_storage_type), POINTER :: mixing_store => NULL()
     114              :    END TYPE subspace_env_type
     115              : 
     116              :    TYPE floating_basis_type
     117              :       REAL(KIND=dp), DIMENSION(:, :), POINTER :: gradient => NULL()
     118              :    END TYPE floating_basis_type
     119              : ! **************************************************************************************************
     120              :    TYPE qs_scf_env_type
     121              :       TYPE(qs_outer_scf_type) :: outer_scf = qs_outer_scf_type()
     122              :       INTEGER :: iter_count = -1
     123              :       INTEGER :: cholesky_method = -1, nelectron = -1, method = -1, mixing_method = -1, nskip_mixing = -1
     124              :       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
     125              :       ! ADIIS diagnostics: accepted-step norm and raw-map delta.
     126              :       REAL(KIND=dp) :: step_norm = -1.0_dp, raw_map_delta = -1.0_dp
     127              :       ! Occupied-space regularization used only to generate ADIIS candidates.
     128              :       REAL(KIND=dp) :: adiis_shift = 0.0_dp
     129              :       CHARACTER(len=15) :: iter_method = ""
     130              :       COMPLEX(KIND=dp), DIMENSION(:, :, :), POINTER :: cc_buffer => NULL()
     131              :       LOGICAL :: print_iter_line = .FALSE., skip_mixing = .FALSE., skip_diis = .FALSE., needs_ortho = .FALSE., &
     132              :                  adiis_check_next = .FALSE., adiis_validated = .FALSE., &
     133              :                  raw_map_delta_valid = .FALSE.
     134              :       TYPE(mixing_storage_type), POINTER :: mixing_store => NULL()
     135              :       TYPE(cp_fm_type), DIMENSION(:), POINTER :: scf_work1 => NULL(), scf_work1_red => NULL()
     136              :       ! Gamma copy plans: overlap at index 0, KS matrices at the spin indices.
     137              :       TYPE(dbcsr_fm_copy_plan_type), ALLOCATABLE :: fm_copy_plan(:)
     138              :       TYPE(cp_fm_type), POINTER  :: scf_work2 => NULL(), ortho => NULL(), ortho_m1 => NULL(), &
     139              :                                     s_half => NULL(), s_minus_one => NULL(), &
     140              :                                     scf_work2_red => NULL(), ortho_red => NULL(), ortho_m1_red => NULL()
     141              :       TYPE(krylov_settings_type), POINTER :: krylov_settings => NULL()
     142              :       TYPE(krylov_workspace_type), POINTER :: krylov_space => NULL()
     143              :       TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: p_delta => NULL(), p_mix_new => NULL()
     144              :       TYPE(dbcsr_type), POINTER :: ortho_dbcsr => NULL(), buf1_dbcsr => NULL(), buf2_dbcsr => NULL()
     145              :       TYPE(preconditioner_p_type), DIMENSION(:), POINTER :: ot_preconditioner => NULL()
     146              :       TYPE(qs_ot_type), POINTER, DIMENSION(:)  :: qs_ot_env => NULL()
     147              :       ! K-point operator routing and overlap are valid for one inner SCF loop.
     148              :       TYPE(kpoint_operator_context_type), ALLOCATABLE :: ot_operator_ctx
     149              :       LOGICAL :: ot_ks_valid = .FALSE.
     150              :       TYPE(qs_diis_buffer_type), POINTER :: scf_diis_buffer => NULL()
     151              :       TYPE(qs_scf_subspace_buffer_type), POINTER :: scf_subspace_buffer => NULL()
     152              :       TYPE(subspace_env_type), POINTER :: subspace_env => NULL()
     153              :       TYPE(davidson_type), POINTER, DIMENSION(:) :: block_davidson_env => NULL()
     154              :       TYPE(fb_env_obj) :: filter_matrix_env = fb_env_obj()
     155              :       TYPE(floating_basis_type) :: floating_basis = floating_basis_type()
     156              :       !> reference molecular orbitals for the maximum overlap method
     157              :       TYPE(cp_fm_type), DIMENSION(:), POINTER          :: mom_ref_mo_coeff => NULL()
     158              :       !> MOM-related work matrices
     159              :       TYPE(cp_fm_type), DIMENSION(:), POINTER          :: mom_overlap => NULL(), mom_s_mo_coeff => NULL()
     160              :    END TYPE qs_scf_env_type
     161              : 
     162              : CONTAINS
     163              : 
     164              : ! **************************************************************************************************
     165              : !> \brief Drop k-point OT operator caches before their pools or layout can change.
     166              : !> \param scf_env SCF environment owning the operator context
     167              : ! **************************************************************************************************
     168        54578 :    SUBROUTINE scf_env_release_ot_operators(scf_env)
     169              :       TYPE(qs_scf_env_type), INTENT(INOUT)               :: scf_env
     170              : 
     171        54578 :       IF (ALLOCATED(scf_env%ot_operator_ctx)) THEN
     172          274 :          CALL kpoint_operator_context_release(scf_env%ot_operator_ctx)
     173          274 :          DEALLOCATE (scf_env%ot_operator_ctx)
     174              :       END IF
     175        54578 :       scf_env%ot_ks_valid = .FALSE.
     176        54578 :    END SUBROUTINE scf_env_release_ot_operators
     177              : 
     178              : ! **************************************************************************************************
     179              : !> \brief allocates and initialize an scf_env
     180              : !> \param scf_env the scf env to initialize
     181              : !> \par History
     182              : !>      02.2003 created [fawzi]
     183              : !> \author fawzi
     184              : ! **************************************************************************************************
     185         8305 :    SUBROUTINE scf_env_create(scf_env)
     186              :       TYPE(qs_scf_env_type), INTENT(OUT)                 :: scf_env
     187              : 
     188              :       CHARACTER(len=*), PARAMETER                        :: routineN = 'scf_env_create'
     189              : 
     190              :       INTEGER                                            :: handle
     191              : 
     192         8305 :       CALL timeset(routineN, handle)
     193              : 
     194         8305 :       scf_env%iter_count = 0
     195         8305 :       scf_env%nelectron = 0
     196         8305 :       scf_env%iter_param = 0.0_dp
     197         8305 :       scf_env%iter_delta = 0.0_dp
     198         8305 :       scf_env%step_norm = 0.0_dp
     199         8305 :       scf_env%raw_map_delta = 0.0_dp
     200         8305 :       scf_env%iter_method = ""
     201         8305 :       scf_env%print_iter_line = .TRUE.
     202         8305 :       scf_env%skip_mixing = .FALSE.
     203         8305 :       scf_env%skip_diis = .FALSE.
     204         8305 :       scf_env%needs_ortho = .FALSE.
     205         8305 :       scf_env%adiis_check_next = .FALSE.
     206         8305 :       scf_env%adiis_validated = .FALSE.
     207         8305 :       scf_env%raw_map_delta_valid = .FALSE.
     208         8305 :       scf_env%adiis_shift = 0.0_dp
     209         8305 :       scf_env%method = -1
     210         8305 :       scf_env%mixing_method = -1
     211         8305 :       scf_env%p_mix_alpha = 1.0_dp
     212         8305 :       scf_env%cholesky_method = -1
     213         8305 :       scf_env%outer_scf%iter_count = 0
     214         8305 :       scf_env%sum_zeff_corr = 0.0_dp
     215         8305 :       NULLIFY (scf_env%outer_scf%variables)
     216         8305 :       NULLIFY (scf_env%outer_scf%gradient)
     217         8305 :       NULLIFY (scf_env%outer_scf%energy)
     218         8305 :       NULLIFY (scf_env%outer_scf%count)
     219         8305 :       NULLIFY (scf_env%outer_scf%inv_jacobian)
     220         8305 :       scf_env%outer_scf%deallocate_jacobian = .TRUE.
     221         8305 :       NULLIFY (scf_env%scf_work1)
     222         8305 :       NULLIFY (scf_env%scf_work2)
     223         8305 :       NULLIFY (scf_env%scf_work1_red)
     224         8305 :       NULLIFY (scf_env%scf_work2_red)
     225         8305 :       NULLIFY (scf_env%ortho)
     226         8305 :       NULLIFY (scf_env%ortho_red)
     227         8305 :       NULLIFY (scf_env%ortho_dbcsr)
     228         8305 :       NULLIFY (scf_env%ortho_m1)
     229         8305 :       NULLIFY (scf_env%ortho_m1_red)
     230         8305 :       NULLIFY (scf_env%p_mix_new)
     231         8305 :       NULLIFY (scf_env%ot_preconditioner)
     232         8305 :       NULLIFY (scf_env%qs_ot_env)
     233         8305 :       NULLIFY (scf_env%scf_diis_buffer)
     234         8305 :       NULLIFY (scf_env%scf_subspace_buffer)
     235         8305 :       NULLIFY (scf_env%buf1_dbcsr)
     236         8305 :       NULLIFY (scf_env%buf2_dbcsr)
     237         8305 :       NULLIFY (scf_env%s_half)
     238         8305 :       NULLIFY (scf_env%p_delta)
     239         8305 :       NULLIFY (scf_env%s_minus_one)
     240         8305 :       NULLIFY (scf_env%cc_buffer)
     241         8305 :       NULLIFY (scf_env%mixing_store)
     242         8305 :       NULLIFY (scf_env%krylov_space)
     243         8305 :       NULLIFY (scf_env%subspace_env)
     244         8305 :       NULLIFY (scf_env%block_davidson_env)
     245         8305 :       NULLIFY (scf_env%floating_basis%gradient)
     246         8305 :       CALL fb_env_nullify(scf_env%filter_matrix_env)
     247         8305 :       NULLIFY (scf_env%mom_ref_mo_coeff)
     248         8305 :       NULLIFY (scf_env%mom_overlap)
     249         8305 :       NULLIFY (scf_env%mom_s_mo_coeff)
     250              : 
     251         8305 :       CALL timestop(handle)
     252              : 
     253         8305 :    END SUBROUTINE scf_env_create
     254              : 
     255              : ! **************************************************************************************************
     256              : !> \brief function to be called to inform the scf_env about changes
     257              : !> \param scf_env the scf env to inform
     258              : !> \par History
     259              : !>      03.2003 created [fawzi]
     260              : !> \author fawzi
     261              : ! **************************************************************************************************
     262        20022 :    SUBROUTINE scf_env_did_change(scf_env)
     263              :       TYPE(qs_scf_env_type), INTENT(INOUT)               :: scf_env
     264              : 
     265              :       CHARACTER(len=*), PARAMETER :: routineN = 'scf_env_did_change'
     266              : 
     267              :       INTEGER                                            :: handle
     268              : 
     269        20022 :       CALL timeset(routineN, handle)
     270              : 
     271        20022 :       CALL scf_env_release_ot_operators(scf_env)
     272        25076 :       IF (ALLOCATED(scf_env%fm_copy_plan)) DEALLOCATE (scf_env%fm_copy_plan)
     273        20022 :       IF (ASSOCIATED(scf_env%p_mix_new)) THEN
     274         2064 :          CALL dbcsr_deallocate_matrix_set(scf_env%p_mix_new)
     275              :       END IF
     276        20022 :       IF (ASSOCIATED(scf_env%p_delta)) THEN
     277           14 :          CALL dbcsr_deallocate_matrix_set(scf_env%p_delta)
     278              :       END IF
     279        20022 :       IF (ASSOCIATED(scf_env%scf_subspace_buffer)) THEN
     280            0 :          CALL qs_scf_subspace_buffer_release(scf_env%scf_subspace_buffer)
     281            0 :          DEALLOCATE (scf_env%scf_subspace_buffer)
     282              :       END IF
     283        20022 :       CALL cp_fm_release(scf_env%mom_ref_mo_coeff)
     284              : 
     285        20022 :       CALL timestop(handle)
     286              : 
     287        20022 :    END SUBROUTINE scf_env_did_change
     288              : 
     289              : ! **************************************************************************************************
     290              : !> \brief releases an scf_env (see doc/ReferenceCounting.html)
     291              : !> \param scf_env the environment to release
     292              : !> \par History
     293              : !>      02.2003 created [fawzi]
     294              : !> \author fawzi
     295              : ! **************************************************************************************************
     296         8305 :    SUBROUTINE scf_env_release(scf_env)
     297              : 
     298              :       TYPE(qs_scf_env_type), INTENT(INOUT)               :: scf_env
     299              : 
     300              :       CHARACTER(len=*), PARAMETER                        :: routineN = 'scf_env_release'
     301              : 
     302              :       INTEGER                                            :: handle, i
     303              : 
     304         8305 :       CALL timeset(routineN, handle)
     305              : 
     306         8305 :       CALL scf_env_release_ot_operators(scf_env)
     307        10805 :       IF (ALLOCATED(scf_env%fm_copy_plan)) DEALLOCATE (scf_env%fm_copy_plan)
     308         8305 :       CALL cp_fm_release(scf_env%scf_work1)
     309         8305 :       IF (ASSOCIATED(scf_env%scf_work1_red)) THEN
     310            0 :          CALL cp_fm_release(scf_env%scf_work1_red)
     311            0 :          DEALLOCATE (scf_env%scf_work1_red)
     312              :          NULLIFY (scf_env%scf_work1_red)
     313              :       END IF
     314         8305 :       IF (ASSOCIATED(scf_env%scf_work2)) THEN
     315          784 :          CALL cp_fm_release(scf_env%scf_work2)
     316          784 :          DEALLOCATE (scf_env%scf_work2)
     317              :          NULLIFY (scf_env%scf_work2)
     318              :       END IF
     319         8305 :       IF (ASSOCIATED(scf_env%scf_work2_red)) THEN
     320            0 :          CALL cp_fm_release(scf_env%scf_work2_red)
     321            0 :          DEALLOCATE (scf_env%scf_work2_red)
     322              :          NULLIFY (scf_env%scf_work2_red)
     323              :       END IF
     324         8305 :       IF (ASSOCIATED(scf_env%ortho)) THEN
     325          784 :          CALL cp_fm_release(scf_env%ortho)
     326          784 :          DEALLOCATE (scf_env%ortho)
     327              :          NULLIFY (scf_env%ortho)
     328              :       END IF
     329         8305 :       IF (ASSOCIATED(scf_env%ortho_red)) THEN
     330            0 :          CALL cp_fm_release(scf_env%ortho_red)
     331            0 :          DEALLOCATE (scf_env%ortho_red)
     332              :          NULLIFY (scf_env%ortho_red)
     333              :       END IF
     334         8305 :       IF (ASSOCIATED(scf_env%ortho_m1)) THEN
     335            0 :          CALL cp_fm_release(scf_env%ortho_m1)
     336            0 :          DEALLOCATE (scf_env%ortho_m1)
     337              :          NULLIFY (scf_env%ortho_m1)
     338              :       END IF
     339         8305 :       IF (ASSOCIATED(scf_env%ortho_m1_red)) THEN
     340            0 :          CALL cp_fm_release(scf_env%ortho_m1_red)
     341            0 :          DEALLOCATE (scf_env%ortho_m1_red)
     342              :          NULLIFY (scf_env%ortho_m1_red)
     343              :       END IF
     344         8305 :       IF (ASSOCIATED(scf_env%ortho_dbcsr)) THEN
     345              :          ! we should not end up here, and give back using the pools
     346            0 :          CALL dbcsr_deallocate_matrix(scf_env%ortho_dbcsr)
     347              :       END IF
     348         8305 :       IF (ASSOCIATED(scf_env%buf1_dbcsr)) THEN
     349              :          ! we should not end up here, and give back using the pools
     350            0 :          CALL dbcsr_deallocate_matrix(scf_env%buf1_dbcsr)
     351              :       END IF
     352         8305 :       IF (ASSOCIATED(scf_env%buf2_dbcsr)) THEN
     353              :          ! we should not end up here, and give back using the pools
     354            0 :          CALL dbcsr_deallocate_matrix(scf_env%buf2_dbcsr)
     355              :       END IF
     356         8305 :       IF (ASSOCIATED(scf_env%s_half)) THEN
     357           34 :          CALL cp_fm_release(scf_env%s_half)
     358           34 :          DEALLOCATE (scf_env%s_half)
     359              :       END IF
     360         8305 :       IF (ASSOCIATED(scf_env%s_minus_one)) THEN
     361            0 :          CALL cp_fm_release(scf_env%s_minus_one)
     362            0 :          DEALLOCATE (scf_env%s_minus_one)
     363              :       END IF
     364         8305 :       IF (ASSOCIATED(scf_env%p_mix_new)) THEN
     365              :          ! we should not end up here, and give back using the pools
     366          772 :          CALL dbcsr_deallocate_matrix_set(scf_env%p_mix_new)
     367              :       END IF
     368         8305 :       IF (ASSOCIATED(scf_env%p_delta)) THEN
     369              :          ! we should not end up here, and give back using the pools
     370           10 :          CALL dbcsr_deallocate_matrix_set(scf_env%p_delta)
     371              :       END IF
     372         8305 :       IF (ASSOCIATED(scf_env%ot_preconditioner)) THEN
     373         5781 :          DO i = 1, SIZE(scf_env%ot_preconditioner)
     374         5781 :             IF (ASSOCIATED(scf_env%ot_preconditioner(i)%preconditioner)) THEN
     375         3211 :                CALL destroy_preconditioner(scf_env%ot_preconditioner(i)%preconditioner)
     376         3211 :                DEALLOCATE (scf_env%ot_preconditioner(i)%preconditioner)
     377              :             END IF
     378              :          END DO
     379         2499 :          DEALLOCATE (scf_env%ot_preconditioner)
     380              :       END IF
     381         8305 :       IF (ASSOCIATED(scf_env%qs_ot_env)) THEN
     382            0 :          DO i = 1, SIZE(scf_env%qs_ot_env)
     383            0 :             CALL qs_ot_destroy(scf_env%qs_ot_env(i))
     384              :          END DO
     385            0 :          DEALLOCATE (scf_env%qs_ot_env)
     386              :       END IF
     387         8305 :       IF (ASSOCIATED(scf_env%scf_diis_buffer)) THEN
     388         4608 :          CALL qs_diis_b_release(scf_env%scf_diis_buffer)
     389         4608 :          DEALLOCATE (scf_env%scf_diis_buffer)
     390              :       END IF
     391         8305 :       IF (ASSOCIATED(scf_env%scf_subspace_buffer)) THEN
     392           12 :          CALL qs_scf_subspace_buffer_release(scf_env%scf_subspace_buffer)
     393           12 :          DEALLOCATE (scf_env%scf_subspace_buffer)
     394              :       END IF
     395         8305 :       IF (ASSOCIATED(scf_env%outer_scf%variables)) THEN
     396            0 :          DEALLOCATE (scf_env%outer_scf%variables)
     397              :       END IF
     398         8305 :       IF (ASSOCIATED(scf_env%outer_scf%count)) THEN
     399            0 :          DEALLOCATE (scf_env%outer_scf%count)
     400              :       END IF
     401         8305 :       IF (ASSOCIATED(scf_env%outer_scf%gradient)) THEN
     402            0 :          DEALLOCATE (scf_env%outer_scf%gradient)
     403              :       END IF
     404         8305 :       IF (ASSOCIATED(scf_env%outer_scf%inv_jacobian)) THEN
     405            6 :          DEALLOCATE (scf_env%outer_scf%inv_jacobian)
     406              :       END IF
     407         8305 :       IF (ASSOCIATED(scf_env%outer_scf%energy)) THEN
     408            0 :          DEALLOCATE (scf_env%outer_scf%energy)
     409              :       END IF
     410         8305 :       IF (ASSOCIATED(scf_env%cc_buffer)) THEN
     411            0 :          DEALLOCATE (scf_env%cc_buffer)
     412              :       END IF
     413         8305 :       IF (ASSOCIATED(scf_env%mixing_store)) THEN
     414         8159 :          CALL mixing_storage_release(scf_env%mixing_store)
     415         8159 :          DEALLOCATE (scf_env%mixing_store)
     416              :       END IF
     417         8305 :       IF (ASSOCIATED(scf_env%krylov_space)) THEN
     418            6 :          CALL krylov_workspace_release(scf_env%krylov_space)
     419              :       END IF
     420         8305 :       IF (ASSOCIATED(scf_env%krylov_settings)) THEN
     421           28 :          DEALLOCATE (scf_env%krylov_settings)
     422              :       END IF
     423         8305 :       IF (ASSOCIATED(scf_env%subspace_env)) THEN
     424            2 :          CALL diag_subspace_env_release(scf_env%subspace_env)
     425              :       END IF
     426         8305 :       IF (ASSOCIATED(scf_env%block_davidson_env)) THEN
     427           38 :          CALL block_davidson_release(scf_env%block_davidson_env)
     428              :       END IF
     429         8305 :       IF (fb_env_has_data(scf_env%filter_matrix_env)) THEN
     430           10 :          CALL fb_env_release(scf_env%filter_matrix_env)
     431              :       END IF
     432         8305 :       IF (ASSOCIATED(scf_env%floating_basis%gradient)) THEN
     433            0 :          DEALLOCATE (scf_env%floating_basis%gradient)
     434              :       END IF
     435         8305 :       CALL cp_fm_release(scf_env%mom_ref_mo_coeff)
     436         8305 :       CALL cp_fm_release(scf_env%mom_overlap)
     437         8305 :       CALL cp_fm_release(scf_env%mom_s_mo_coeff)
     438              : 
     439         8305 :       CALL timestop(handle)
     440              : 
     441         8305 :    END SUBROUTINE scf_env_release
     442              : 
     443              : ! **************************************************************************************************
     444              : !> \brief  creates the Krylov solver settings
     445              : !> \param krylov_settings returned settings object
     446              : !> \param scf_section ...
     447              : ! **************************************************************************************************
     448           28 :    SUBROUTINE krylov_settings_create(krylov_settings, scf_section)
     449              : 
     450              :       TYPE(krylov_settings_type), POINTER                :: krylov_settings
     451              :       TYPE(section_vals_type), POINTER                   :: scf_section
     452              : 
     453           28 :       CPASSERT(.NOT. ASSOCIATED(krylov_settings))
     454           28 :       ALLOCATE (krylov_settings)
     455              : 
     456              :       CALL section_vals_val_get(scf_section, "DIAGONALIZATION%MAX_ITER", &
     457           28 :                                 i_val=krylov_settings%max_iter)
     458              :       CALL section_vals_val_get(scf_section, "DIAGONALIZATION%KRYLOV%NKRYLOV", &
     459           28 :                                 i_val=krylov_settings%nkrylov)
     460              :       CALL section_vals_val_get(scf_section, "DIAGONALIZATION%KRYLOV%NBLOCK", &
     461           28 :                                 i_val=krylov_settings%nblock)
     462              :       CALL section_vals_val_get(scf_section, "DIAGONALIZATION%KRYLOV%EPS_KRYLOV", &
     463           28 :                                 r_val=krylov_settings%eps_conv)
     464              :       CALL section_vals_val_get(scf_section, "DIAGONALIZATION%KRYLOV%EPS_STD_DIAG", &
     465           28 :                                 r_val=krylov_settings%eps_std_diag)
     466              :       CALL section_vals_val_get(scf_section, "DIAGONALIZATION%EPS_ADAPT", &
     467           28 :                                 r_val=krylov_settings%eps_adapt)
     468              :       CALL section_vals_val_get(scf_section, "DIAGONALIZATION%KRYLOV%CHECK_MOS_CONV", &
     469           28 :                                 l_val=krylov_settings%always_check_conv)
     470              : 
     471           28 :    END SUBROUTINE krylov_settings_create
     472              : 
     473              : ! **************************************************************************************************
     474              : !> \brief releases the real-Lanczos workspace
     475              : !> \param krylov_space ...
     476              : !> \par History
     477              : !>      05.2009 created [MI]
     478              : !> \author [MI]
     479              : ! **************************************************************************************************
     480            6 :    SUBROUTINE krylov_workspace_release(krylov_space)
     481              :       TYPE(krylov_workspace_type), POINTER               :: krylov_space
     482              : 
     483            6 :       IF (ASSOCIATED(krylov_space)) THEN
     484              : 
     485            6 :          IF (ASSOCIATED(krylov_space%c_eval)) THEN
     486            6 :             DEALLOCATE (krylov_space%c_eval)
     487            6 :             NULLIFY (krylov_space%c_eval)
     488              :          END IF
     489            6 :          IF (ASSOCIATED(krylov_space%t_eval)) THEN
     490            6 :             DEALLOCATE (krylov_space%t_eval)
     491            6 :             NULLIFY (krylov_space%t_eval)
     492              :          END IF
     493              : 
     494            6 :          IF (ASSOCIATED(krylov_space%v_mat)) THEN
     495            6 :             CALL cp_fm_release(krylov_space%v_mat)
     496              :          END IF
     497            6 :          IF (ASSOCIATED(krylov_space%mo_conv)) THEN
     498            6 :             CALL cp_fm_release(krylov_space%mo_conv)
     499              :          END IF
     500            6 :          IF (ASSOCIATED(krylov_space%mo_refine)) THEN
     501            6 :             CALL cp_fm_release(krylov_space%mo_refine)
     502              :          END IF
     503            6 :          IF (ASSOCIATED(krylov_space%chc_mat)) THEN
     504            6 :             CALL cp_fm_release(krylov_space%chc_mat)
     505              :          END IF
     506            6 :          IF (ASSOCIATED(krylov_space%c_vec)) THEN
     507            6 :             CALL cp_fm_release(krylov_space%c_vec)
     508              :          END IF
     509              : 
     510            6 :          IF (ASSOCIATED(krylov_space%tmp_mat)) THEN
     511            6 :             CALL cp_fm_release(krylov_space%tmp_mat)
     512            6 :             DEALLOCATE (krylov_space%tmp_mat)
     513              :          END IF
     514            6 :          IF (ASSOCIATED(krylov_space%block1_mat)) THEN
     515            6 :             CALL cp_fm_release(krylov_space%block1_mat)
     516            6 :             DEALLOCATE (krylov_space%block1_mat)
     517              :          END IF
     518            6 :          IF (ASSOCIATED(krylov_space%block2_mat)) THEN
     519            6 :             CALL cp_fm_release(krylov_space%block2_mat)
     520            6 :             DEALLOCATE (krylov_space%block2_mat)
     521              :          END IF
     522            6 :          IF (ASSOCIATED(krylov_space%block3_mat)) THEN
     523            6 :             CALL cp_fm_release(krylov_space%block3_mat)
     524            6 :             DEALLOCATE (krylov_space%block3_mat)
     525              :          END IF
     526            6 :          IF (ASSOCIATED(krylov_space%block4_mat)) THEN
     527            6 :             CALL cp_fm_release(krylov_space%block4_mat)
     528            6 :             DEALLOCATE (krylov_space%block4_mat)
     529              :          END IF
     530            6 :          IF (ASSOCIATED(krylov_space%block5_mat)) THEN
     531            6 :             CALL cp_fm_release(krylov_space%block5_mat)
     532            6 :             DEALLOCATE (krylov_space%block5_mat)
     533              :          END IF
     534              : 
     535            6 :          DEALLOCATE (krylov_space)
     536              : 
     537              :          NULLIFY (krylov_space)
     538              :       END IF
     539              : 
     540            6 :    END SUBROUTINE krylov_workspace_release
     541              : 
     542              : ! **************************************************************************************************
     543              : !> \brief creates subspace-rotation environment
     544              : !> \param subspace_env ...
     545              : !> \param scf_section ...
     546              : !> \param ecut ...
     547              : !> \par History
     548              : !>      09.2009 created [MI]
     549              : !> \author [MI]
     550              : ! **************************************************************************************************
     551            4 :    SUBROUTINE diag_subspace_env_create(subspace_env, scf_section, ecut)
     552              : 
     553              :       TYPE(subspace_env_type), POINTER                   :: subspace_env
     554              :       TYPE(section_vals_type), POINTER                   :: scf_section
     555              :       REAL(dp), INTENT(IN)                               :: ecut
     556              : 
     557              :       LOGICAL                                            :: do_mixing
     558              :       TYPE(section_vals_type), POINTER                   :: mixing_section
     559              : 
     560            2 :       CPASSERT(.NOT. ASSOCIATED(subspace_env))
     561            2 :       ALLOCATE (subspace_env)
     562              : 
     563              :       NULLIFY (subspace_env%p_matrix_store)
     564              :       NULLIFY (subspace_env%p_matrix_mix)
     565              :       NULLIFY (subspace_env%chc_mat)
     566              :       NULLIFY (subspace_env%c_vec)
     567              :       NULLIFY (subspace_env%c0)
     568              :       NULLIFY (subspace_env%mixing_store)
     569            2 :       NULLIFY (mixing_section)
     570              : 
     571              :       CALL section_vals_val_get(scf_section, "DIAGONALIZATION%DIAG_SUB_SCF%MAX_ITER", &
     572            2 :                                 i_val=subspace_env%max_iter)
     573              :       CALL section_vals_val_get(scf_section, "DIAGONALIZATION%DIAG_SUB_SCF%EPS_ENE", &
     574            2 :                                 r_val=subspace_env%eps_ene)
     575              :       CALL section_vals_val_get(scf_section, "DIAGONALIZATION%DIAG_SUB_SCF%EPS_SKIP_SUB_DIAG", &
     576            2 :                                 r_val=subspace_env%eps_diag_sub)
     577              :       CALL section_vals_val_get(scf_section, "DIAGONALIZATION%DIAG_SUB_SCF%EPS_ADAPT_SCF", &
     578            2 :                                 r_val=subspace_env%eps_adapt)
     579            2 :       subspace_env%mixing_method = 0
     580              :       do_mixing = .FALSE.
     581            2 :       mixing_section => section_vals_get_subs_vals(scf_section, "DIAGONALIZATION%DIAG_SUB_SCF%MIXING")
     582              :       CALL section_vals_val_get(mixing_section, "_SECTION_PARAMETERS_", &
     583            2 :                                 l_val=do_mixing)
     584            2 :       IF (do_mixing) THEN
     585              :          CALL section_vals_val_get(mixing_section, "METHOD", &
     586            2 :                                    i_val=subspace_env%mixing_method)
     587            2 :          IF (subspace_env%mixing_method >= direct_mixing_nr) THEN
     588            8 :             ALLOCATE (subspace_env%mixing_store)
     589              :             CALL mixing_storage_create(subspace_env%mixing_store, mixing_section, &
     590            2 :                                        subspace_env%mixing_method, ecut=ecut)
     591              :          END IF
     592              :       END IF
     593              : 
     594            2 :    END SUBROUTINE diag_subspace_env_create
     595              : 
     596              : ! **************************************************************************************************
     597              : !> \brief releases subspace-rotation environment
     598              : !> \param subspace_env ...
     599              : !> \par History
     600              : !>      09.2009 created [MI]
     601              : !> \author [MI]
     602              : ! **************************************************************************************************
     603            2 :    SUBROUTINE diag_subspace_env_release(subspace_env)
     604              :       TYPE(subspace_env_type), POINTER                   :: subspace_env
     605              : 
     606            2 :       IF (ASSOCIATED(subspace_env)) THEN
     607              : 
     608            2 :          IF (ASSOCIATED(subspace_env%p_matrix_store)) THEN
     609              : 
     610              :             CPASSERT(.TRUE.)
     611            2 :             CALL dbcsr_deallocate_matrix_set(subspace_env%p_matrix_store)
     612              :          END IF
     613            2 :          CALL cp_fm_release(subspace_env%chc_mat)
     614            2 :          CALL cp_fm_release(subspace_env%c_vec)
     615            2 :          CALL cp_fm_release(subspace_env%c0)
     616              : 
     617            2 :          IF (ASSOCIATED(subspace_env%mixing_store)) THEN
     618            2 :             CALL mixing_storage_release(subspace_env%mixing_store)
     619            2 :             DEALLOCATE (subspace_env%mixing_store)
     620              :          END IF
     621              : 
     622            2 :          DEALLOCATE (subspace_env)
     623              :       END IF
     624              : 
     625            2 :    END SUBROUTINE diag_subspace_env_release
     626              : 
     627            0 : END MODULE qs_scf_types
        

Generated by: LCOV version 2.0-1