LCOV - code coverage report
Current view: top level - src - dm_ls_scf_types.F (source / functions) Hit Total Coverage
Test: CP2K Regtests (git:b8e0b09) Lines: 30 31 96.8 %
Date: 2024-08-31 06:31:37 Functions: 1 10 10.0 %

          Line data    Source code
       1             : !--------------------------------------------------------------------------------------------------!
       2             : !   CP2K: A general program to perform molecular dynamics simulations                              !
       3             : !   Copyright 2000-2024 CP2K developers group <https://cp2k.org>                                   !
       4             : !                                                                                                  !
       5             : !   SPDX-License-Identifier: GPL-2.0-or-later                                                      !
       6             : !--------------------------------------------------------------------------------------------------!
       7             : 
       8             : ! **************************************************************************************************
       9             : !> \brief Types needed for a linear scaling quickstep SCF run based on the density
      10             : !>        matrix
      11             : !> \par History
      12             : !>       2010.10 created [Joost VandeVondele]
      13             : !> \author Joost VandeVondele
      14             : ! **************************************************************************************************
      15             : MODULE dm_ls_scf_types
      16             :    USE cp_dbcsr_api,                    ONLY: dbcsr_release,&
      17             :                                               dbcsr_type
      18             :    USE input_constants,                 ONLY: ls_cluster_atomic,&
      19             :                                               ls_cluster_molecular
      20             :    USE input_section_types,             ONLY: section_vals_release,&
      21             :                                               section_vals_type
      22             :    USE kinds,                           ONLY: dp
      23             :    USE message_passing,                 ONLY: mp_para_env_release,&
      24             :                                               mp_para_env_type
      25             :    USE pao_types,                       ONLY: pao_env_type,&
      26             :                                               pao_finalize
      27             :    USE pexsi_types,                     ONLY: lib_pexsi_env,&
      28             :                                               lib_pexsi_finalize
      29             :    USE qs_density_mixing_types,         ONLY: mixing_storage_release,&
      30             :                                               mixing_storage_type
      31             : #include "./base/base_uses.f90"
      32             : 
      33             :    IMPLICIT NONE
      34             : 
      35             :    PRIVATE
      36             : 
      37             :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'dm_ls_scf_types'
      38             : 
      39             :    PUBLIC :: ls_scf_env_type, ls_mstruct_type, ls_cluster_atomic, ls_cluster_molecular, &
      40             :              ls_scf_curvy_type
      41             : 
      42             :    TYPE ls_mstruct_type
      43             :       INTEGER :: cluster_type = -1
      44             :       LOGICAL :: do_pao = .FALSE.
      45             :       INTEGER, DIMENSION(:), ALLOCATABLE :: atom_to_molecule
      46             :       TYPE(dbcsr_type)                :: matrix_A = dbcsr_type()
      47             :       TYPE(dbcsr_type)                :: matrix_B = dbcsr_type()
      48             :    END TYPE
      49             : 
      50             :    TYPE ls_mat_history_type
      51             :       INTEGER :: istore = 0, nstore = 0
      52             :       TYPE(dbcsr_type), DIMENSION(:, :), ALLOCATABLE :: matrix
      53             :    END TYPE
      54             : 
      55             :    TYPE ls_scf_curvy_type
      56             :       TYPE(dbcsr_type), DIMENSION(:), ALLOCATABLE :: matrix_dp
      57             :       TYPE(dbcsr_type), DIMENSION(:), ALLOCATABLE :: matrix_p
      58             :       TYPE(dbcsr_type), DIMENSION(:, :), ALLOCATABLE :: matrix_psave
      59             :       TYPE(dbcsr_type), DIMENSION(:, :), ALLOCATABLE :: matrix_BCH
      60             :       REAL(KIND=dp), DIMENSION(2)                      :: step_size = 0.0_dp
      61             :       REAL(KIND=dp), DIMENSION(2)                      :: shift = 0.0_dp
      62             :       REAL(KIND=dp), DIMENSION(2)                      :: cg_denom = 0.0_dp
      63             :       REAL(KIND=dp), DIMENSION(2)                      :: cg_numer = 0.0_dp
      64             :       REAL(KIND=dp), DIMENSION(6)                      :: energies = 0.0_dp
      65             :       INTEGER                                          :: line_search_step = 0
      66             :       INTEGER, DIMENSION(2)                            :: BCH_saved = 0
      67             :       LOGICAL                                          :: double_step_size = .FALSE.
      68             :       LOGICAL, DIMENSION(2)                            :: fix_shift = .FALSE.
      69             : 
      70             :       INTEGER                                          :: line_search_type = 0
      71             :       INTEGER                                          :: n_bch_hist = 0
      72             :       REAL(KIND=dp)                                    :: scale_filter = 0.0_dp
      73             :       REAL(KIND=dp)                                    :: filter_factor = 0.0_dp
      74             :       REAL(KIND=dp)                                    :: min_shift = 0.0_dp
      75             :       REAL(KIND=dp)                                    :: min_filter = 0.0_dp
      76             :    END TYPE
      77             : 
      78             :    TYPE chebyshev_type
      79             :       LOGICAL :: compute_chebyshev = .FALSE.
      80             :       INTEGER :: n_chebyshev = 0
      81             :       INTEGER :: n_gridpoint_dos = 0
      82             :       REAL(KIND=dp), DIMENSION(:), POINTER :: min_energy => NULL()
      83             :       REAL(KIND=dp), DIMENSION(:), POINTER :: max_energy => NULL()
      84             :       TYPE(section_vals_type), POINTER :: print_key_dos => NULL()
      85             :       TYPE(section_vals_type), POINTER :: print_key_cube => NULL()
      86             :    END TYPE
      87             : 
      88             :    TYPE ls_scf_env_type
      89             :       INTEGER               :: nspins = 0, natoms = 0
      90             :       INTEGER               :: nelectron_total = 0
      91             :       INTEGER, DIMENSION(2) :: nelectron_spin = 0
      92             :       REAL(KIND=dp), DIMENSION(2) ::  mu_spin = 0.0_dp
      93             :       REAL(KIND=dp), DIMENSION(2) ::  homo_spin = 0.0_dp
      94             :       REAL(KIND=dp), DIMENSION(2) ::  lumo_spin = 0.0_dp
      95             : 
      96             : #if defined(__GNUC__) && defined(__GNUC_MINOR__) && (CPVERSION(9, 5) > CPVERSION(__GNUC__, __GNUC_MINOR__))
      97             :       TYPE(ls_mat_history_type) :: scf_history = ls_mat_history_type(matrix=null())
      98             : #else
      99             :       TYPE(ls_mat_history_type) :: scf_history = ls_mat_history_type()
     100             : #endif
     101             :       INTEGER :: extrapolation_order = -1
     102             : 
     103             :       LOGICAL :: has_unit_metric = .FALSE.
     104             : 
     105             :       LOGICAL :: curvy_steps = .FALSE.
     106             :       INTEGER :: s_preconditioner_type = 0
     107             :       INTEGER :: s_inversion_type = 0
     108             :       INTEGER :: purification_method = 0
     109             :       INTEGER :: sign_method = 0
     110             :       INTEGER :: sign_order = 0
     111             :       LOGICAL :: sign_symmetric = .FALSE.
     112             :       INTEGER :: submatrix_sign_method = -1
     113             :       INTEGER :: s_sqrt_method = 0
     114             :       INTEGER :: s_sqrt_order = 0
     115             : 
     116             :       LOGICAL               :: needs_s_inv = .FALSE., has_s_preconditioner = .FALSE., fixed_mu = .FALSE., &
     117             :                                dynamic_threshold = .FALSE., check_s_inv = .FALSE.
     118             :       LOGICAL               :: restart_read = .FALSE., restart_write = .FALSE., non_monotonic = .FALSE.
     119             :       REAL(KIND=dp)         :: eps_filter = 0.0_dp, eps_scf = 0.0_dp
     120             : 
     121             :       REAL(KIND=dp)         :: eps_lanczos = 0.0_dp
     122             :       INTEGER               :: max_iter_lanczos = 0
     123             : 
     124             :       REAL(KIND=dp)         :: mixing_fraction = 0.0_dp
     125             :       INTEGER               :: max_scf = 0
     126             :       LOGICAL               :: ls_diis = .FALSE.
     127             :       INTEGER               :: iter_ini_diis = 0
     128             :       INTEGER               :: nmixing = 0, max_diis = 0
     129             :       REAL(KIND=dp)         :: eps_diis = 0.0_dp
     130             :       REAL(KIND=dp)         :: energy_init = 0.0_dp
     131             : 
     132             :       TYPE(dbcsr_type)   :: matrix_s_inv = dbcsr_type()
     133             :       TYPE(dbcsr_type)   :: matrix_s = dbcsr_type()
     134             :       TYPE(dbcsr_type)   :: matrix_bs_sqrt = dbcsr_type(), matrix_bs_sqrt_inv = dbcsr_type()
     135             :       TYPE(dbcsr_type)   :: matrix_s_sqrt = dbcsr_type(), matrix_s_sqrt_inv = dbcsr_type()
     136             :       TYPE(dbcsr_type), DIMENSION(:), ALLOCATABLE :: matrix_ks
     137             :       TYPE(dbcsr_type), DIMENSION(:), ALLOCATABLE :: matrix_p
     138             : 
     139             :       LOGICAL  :: report_all_sparsities = .FALSE., perform_mu_scan = .FALSE., use_s_sqrt = .FALSE.
     140             : 
     141             : #if defined(__GNUC__) && defined(__GNUC_MINOR__) && (CPVERSION(9, 5) > CPVERSION(__GNUC__, __GNUC_MINOR__))
     142             :       TYPE(ls_mstruct_type) :: ls_mstruct = ls_mstruct_type(atom_to_molecule=NULL())
     143             :       TYPE(ls_scf_curvy_type) :: curvy_data = ls_scf_curvy_type(matrix_dp=null(), matrix_p=null(), &
     144             :                                                                 matrix_psave=null(), matrix_bch=null())
     145             : #else
     146             :       TYPE(ls_mstruct_type) :: ls_mstruct = ls_mstruct_type()
     147             :       TYPE(ls_scf_curvy_type) :: curvy_data = ls_scf_curvy_type()
     148             : #endif
     149             : 
     150             :       TYPE(chebyshev_type) :: chebyshev = chebyshev_type()
     151             : 
     152             :       LOGICAL :: do_rho_mixing = .FALSE.
     153             :       INTEGER :: density_mixing_method = 0
     154             :       TYPE(mixing_storage_type), POINTER :: mixing_store => NULL()
     155             : 
     156             :       LOGICAL :: do_transport = .FALSE.
     157             :       LOGICAL :: do_pexsi = .FALSE.
     158             : 
     159             :       LOGICAL :: calculate_forces = .FALSE.
     160             : 
     161             : #if defined(__LIBPEXSI)
     162             :       TYPE(lib_pexsi_env) :: pexsi
     163             : #else
     164             :       TYPE(lib_pexsi_env) :: pexsi = lib_pexsi_env()
     165             : #endif
     166             : 
     167             :       TYPE(mp_para_env_type), POINTER :: para_env => NULL()
     168             :       LOGICAL                 :: do_pao = .FALSE.
     169             :       TYPE(pao_env_type)      :: pao_env
     170             :    END TYPE ls_scf_env_type
     171             : 
     172             :    PUBLIC :: ls_scf_release
     173             : 
     174             : CONTAINS
     175             : 
     176             : ! **************************************************************************************************
     177             : !> \brief release the LS type.
     178             : !> \param ls_scf_env ...
     179             : !> \par History
     180             : !>       2012.11 created [Joost VandeVondele]
     181             : !> \author Joost VandeVondele
     182             : ! **************************************************************************************************
     183         358 :    SUBROUTINE ls_scf_release(ls_scf_env)
     184             :       TYPE(ls_scf_env_type), POINTER                     :: ls_scf_env
     185             : 
     186             :       CHARACTER(len=*), PARAMETER                        :: routineN = 'ls_scf_release'
     187             : 
     188             :       INTEGER                                            :: handle, ispin, istore
     189             : 
     190         358 :       CALL timeset(routineN, handle)
     191             : 
     192         358 :       CALL mp_para_env_release(ls_scf_env%para_env)
     193             : 
     194         358 :       DEALLOCATE (ls_scf_env%ls_mstruct%atom_to_molecule)
     195             : 
     196             :       ! set up the buffer for the history of matrices
     197         758 :       DO istore = 1, MIN(ls_scf_env%scf_history%istore, ls_scf_env%scf_history%nstore)
     198        1178 :          DO ispin = 1, SIZE(ls_scf_env%scf_history%matrix, 1)
     199         820 :             CALL dbcsr_release(ls_scf_env%scf_history%matrix(ispin, istore))
     200             :          END DO
     201             :       END DO
     202         358 :       DEALLOCATE (ls_scf_env%scf_history%matrix)
     203             : 
     204         358 :       IF (ALLOCATED(ls_scf_env%matrix_p)) THEN
     205         726 :          DO ispin = 1, SIZE(ls_scf_env%matrix_p)
     206         726 :             CALL dbcsr_release(ls_scf_env%matrix_p(ispin))
     207             :          END DO
     208         356 :          DEALLOCATE (ls_scf_env%matrix_p)
     209             :       END IF
     210             : 
     211         358 :       IF (ASSOCIATED(ls_scf_env%chebyshev%print_key_dos)) &
     212           6 :          CALL section_vals_release(ls_scf_env%chebyshev%print_key_dos)
     213         358 :       IF (ASSOCIATED(ls_scf_env%chebyshev%print_key_cube)) &
     214           6 :          CALL section_vals_release(ls_scf_env%chebyshev%print_key_cube)
     215         358 :       IF (ASSOCIATED(ls_scf_env%chebyshev%min_energy)) THEN
     216           2 :          DEALLOCATE (ls_scf_env%chebyshev%min_energy)
     217             :       END IF
     218         358 :       IF (ASSOCIATED(ls_scf_env%chebyshev%max_energy)) THEN
     219           2 :          DEALLOCATE (ls_scf_env%chebyshev%max_energy)
     220             :       END IF
     221             : 
     222         358 :       IF (ASSOCIATED(ls_scf_env%mixing_store)) THEN
     223         336 :          CALL mixing_storage_release(ls_scf_env%mixing_store)
     224         336 :          DEALLOCATE (ls_scf_env%mixing_store)
     225             :       END IF
     226             : 
     227         358 :       IF (ls_scf_env%do_pexsi) THEN
     228           8 :          CALL lib_pexsi_finalize(ls_scf_env%pexsi)
     229             :       END IF
     230             : 
     231         358 :       IF (ls_scf_env%do_pao) &
     232          94 :          CALL pao_finalize(ls_scf_env%pao_env)
     233             : 
     234         358 :       DEALLOCATE (ls_scf_env)
     235             : 
     236         358 :       CALL timestop(handle)
     237             : 
     238         358 :    END SUBROUTINE ls_scf_release
     239             : 
     240           0 : END MODULE dm_ls_scf_types

Generated by: LCOV version 1.15