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

Generated by: LCOV version 2.0-1