LCOV - code coverage report
Current view: top level - src - qs_scf_types.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:9ccafda) Lines: 88.3 % 230 203
Test Date: 2026-10-15 00:55:44 Functions: 58.3 % 12 7

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

Generated by: LCOV version 2.0-1