LCOV - code coverage report
Current view: top level - src - post_scf_bandstructure_types.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:936074a) Lines: 99.4 % 162 161
Test Date: 2025-12-04 06:27:48 Functions: 70.6 % 17 12

            Line data    Source code
       1              : !--------------------------------------------------------------------------------------------------!
       2              : !   CP2K: A general program to perform molecular dynamics simulations                              !
       3              : !   Copyright 2000-2025 CP2K developers group <https://cp2k.org>                                   !
       4              : !                                                                                                  !
       5              : !   SPDX-License-Identifier: GPL-2.0-or-later                                                      !
       6              : !--------------------------------------------------------------------------------------------------!
       7              : 
       8              : ! **************************************************************************************************
       9              : !> \brief
      10              : !> \author Jan Wilhelm
      11              : !> \date 07.2023
      12              : ! **************************************************************************************************
      13              : MODULE post_scf_bandstructure_types
      14              :    USE basis_set_types,                 ONLY: gto_basis_set_p_type
      15              :    USE cp_cfm_types,                    ONLY: cp_cfm_release,&
      16              :                                               cp_cfm_type
      17              :    USE cp_dbcsr_api,                    ONLY: dbcsr_p_type,&
      18              :                                               dbcsr_release
      19              :    USE cp_dbcsr_operations,             ONLY: dbcsr_deallocate_matrix_set
      20              :    USE cp_fm_types,                     ONLY: cp_fm_release,&
      21              :                                               cp_fm_type
      22              :    USE dbt_api,                         ONLY: dbt_destroy,&
      23              :                                               dbt_type
      24              :    USE input_constants,                 ONLY: rtp_method_bse,&
      25              :                                               small_cell_full_kp
      26              :    USE kinds,                           ONLY: default_string_length,&
      27              :                                               dp
      28              :    USE kpoint_types,                    ONLY: kpoint_release,&
      29              :                                               kpoint_type
      30              :    USE libint_2c_3c,                    ONLY: libint_potential_type
      31              :    USE message_passing,                 ONLY: mp_para_env_release,&
      32              :                                               mp_para_env_type
      33              :    USE qs_tensors_types,                ONLY: neighbor_list_3c_type
      34              : #include "./base/base_uses.f90"
      35              : 
      36              :    IMPLICIT NONE
      37              : 
      38              :    PRIVATE
      39              : 
      40              :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'post_scf_bandstructure_types'
      41              : 
      42              :    PUBLIC :: post_scf_bandstructure_type, band_edges_type, data_3_type, bs_env_release
      43              : 
      44              :    ! valence band maximum (VBM), conduction band minimum (CBM), direct band gap (DBG),
      45              :    ! indirect band gap (IDBG)
      46              :    TYPE band_edges_type
      47              :       REAL(KIND=dp)                                   :: VBM = -1.0_dp, &
      48              :                                                          CBM = -1.0_dp, &
      49              :                                                          DBG = -1.0_dp, &
      50              :                                                          IDBG = -1.0_dp
      51              :    END TYPE band_edges_type
      52              : 
      53              :    ! data type for storing 3-index quantities for small-cell, full-k-points GW code
      54              :    TYPE data_3_type
      55              :       REAL(KIND=dp), DIMENSION(:, :, :), ALLOCATABLE :: data_3
      56              :    END TYPE data_3_type
      57              : 
      58              :    TYPE post_scf_bandstructure_type
      59              : 
      60              :       ! decide which calculations will be done
      61              :       LOGICAL                                         :: do_gw = .FALSE., &
      62              :                                                          do_soc = .FALSE., &
      63              :                                                          do_ldos = .FALSE.
      64              : 
      65              :       ! various eigenvalues computed in GW code, some depend on k-points
      66              :       ! and have therefore three dimensions (band index, k-point, spin)
      67              :       REAL(KIND=dp), DIMENSION(:, :), ALLOCATABLE     :: eigenval_scf_Gamma
      68              :       REAL(KIND=dp), DIMENSION(:, :, :), ALLOCATABLE  :: eigenval_scf, &
      69              :                                                          eigenval_G0W0, &
      70              :                                                          eigenval_HF, &
      71              :                                                          eigenval_scGW0
      72              :       REAL(KIND=dp), DIMENSION(:, :), ALLOCATABLE     :: eigenval_scf_soc, &
      73              :                                                          eigenval_G0W0_soc
      74              :       TYPE(band_edges_type), DIMENSION(2)             :: band_edges_scf_Gamma = band_edges_type()
      75              :       TYPE(band_edges_type)                           :: band_edges_scf = band_edges_type(), &
      76              :                                                          band_edges_G0W0 = band_edges_type(), &
      77              :                                                          band_edges_HF = band_edges_type()
      78              : 
      79              :       ! parameters that influence the GW flavor
      80              :       LOGICAL                                         :: do_hedin_shift = .FALSE.
      81              : 
      82              :       ! general parameters on molecular orbitals and basis sets
      83              :       INTEGER                                      :: n_ao = -1, &
      84              :                                                       n_RI = -1, &
      85              :                                                       n_spin = -1, &
      86              :                                                       n_atom = -1, &
      87              :                                                       max_AO_bf_per_atom = -1
      88              :       INTEGER, DIMENSION(:), ALLOCATABLE           :: i_ao_start_from_atom, &
      89              :                                                       i_ao_end_from_atom, &
      90              :                                                       i_RI_start_from_atom, &
      91              :                                                       i_RI_end_from_atom
      92              :       INTEGER, DIMENSION(2)                        :: n_occ = -1, &
      93              :                                                       n_vir = -1
      94              :       REAL(KIND=dp)                                :: spin_degeneracy = -1.0_dp
      95              :       REAL(KIND=dp), DIMENSION(2)                  :: e_fermi = -1.0_dp
      96              : 
      97              :       ! kpoint mesh for chi, eps, W
      98              :       INTEGER, DIMENSION(:), POINTER               :: nkp_grid_DOS_input => NULL(), &
      99              :                                                       nkp_grid_chi_eps_W_input => NULL()
     100              :       INTEGER, DIMENSION(3)                        :: nkp_grid_chi_eps_W_orig = -1, &
     101              :                                                       nkp_grid_chi_eps_W_extra = -1
     102              :       INTEGER                                      :: nkp_chi_eps_W_orig = -1, &
     103              :                                                       nkp_chi_eps_W_extra = -1, &
     104              :                                                       nkp_chi_eps_W_orig_plus_extra = -1, &
     105              :                                                       nkp_chi_eps_W_batch = -1, &
     106              :                                                       num_chi_eps_W_batches = -1, &
     107              :                                                       size_lattice_sum_V = -1
     108              :       TYPE(kpoint_type), POINTER                   :: kpoints_chi_eps_W => NULL(), &
     109              :                                                       kpoints_DOS => NULL()
     110              :       LOGICAL                                      :: approx_kp_extrapol = .FALSE.
     111              : 
     112              :       REAL(KIND=dp)                                :: wkp_orig = -1.0_dp
     113              :       REAL(KIND=dp), DIMENSION(:), ALLOCATABLE     :: wkp_s_p, &
     114              :                                                       wkp_no_extra
     115              :       INTEGER, DIMENSION(:), ALLOCATABLE           :: l_RI
     116              :       INTEGER                                      :: input_kp_bs_npoints = -1, &
     117              :                                                       input_kp_bs_n_sp_pts = -1, &
     118              :                                                       nkp_bs_and_DOS = -1, &
     119              :                                                       nkp_only_bs = -1, &
     120              :                                                       nkp_only_DOS = -1
     121              :       REAL(KIND=dp), DIMENSION(:, :), ALLOCATABLE  :: xkp_special
     122              : 
     123              :       ! parameters for GW band structure calculation of small unit cell (with multiple unit cell)
     124              :       INTEGER                                      :: small_cell_full_kp_or_large_cell_Gamma = -1, &
     125              :                                                       nimages_scf = -1
     126              :       INTEGER, DIMENSION(3)                        :: periodic = -1
     127              :       REAL(KIND=dp), DIMENSION(3, 3)               :: hmat = -1.0_dp
     128              : 
     129              :       ! imaginary time and frequency grids
     130              :       INTEGER                                         :: num_time_freq_points = -1, &
     131              :                                                          num_freq_points_fit = -1
     132              :       REAL(KIND=dp), DIMENSION(:), ALLOCATABLE        :: imag_time_points, &
     133              :                                                          imag_time_weights_freq_zero, &
     134              :                                                          imag_freq_points, &
     135              :                                                          imag_freq_points_fit
     136              :       REAL(KIND=dp), DIMENSION(:, :), ALLOCATABLE     :: weights_cos_t_to_w, &
     137              :                                                          weights_cos_w_to_t, &
     138              :                                                          weights_sin_t_to_w
     139              :       INTEGER                                         :: nparam_pade = -1, &
     140              :                                                          num_points_per_magnitude = -1
     141              :       REAL(KIND=dp)                                   :: freq_max_fit = -1.0_dp, &
     142              :                                                          input_regularization_minimax = -1.0_dp, &
     143              :                                                          regularization_minimax = -1.0_dp, &
     144              :                                                          stabilize_exp = -1.0_dp
     145              : 
     146              :       ! filter threshold for matrix-tensor operations
     147              :       REAL(KIND=dp)                                :: eps_filter = -1.0_dp, &
     148              :                                                       eps_atom_grid_2d_mat = -1.0_dp
     149              : 
     150              :       ! threshold for inverting ao overlap matrix, RI cfm_1d
     151              :       REAL(KIND=dp)                                :: eps_eigval_mat_s = -1.0_dp, &
     152              :                                                       eps_eigval_mat_RI = -1.0_dp, &
     153              :                                                       input_regularization_RI = -1.0_dp, &
     154              :                                                       regularization_RI = -1.0_dp
     155              : 
     156              :       ! global full cfm_1d used in GW
     157              :       TYPE(cp_fm_type)                             :: fm_s_Gamma = cp_fm_type(), &
     158              :                                                       fm_Gocc = cp_fm_type(), &
     159              :                                                       fm_Gvir = cp_fm_type()
     160              :       TYPE(cp_fm_type), DIMENSION(2)               :: fm_ks_Gamma = cp_fm_type(), &
     161              :                                                       fm_V_xc_Gamma = cp_fm_type(), &
     162              :                                                       fm_mo_coeff_Gamma = cp_fm_type()
     163              :       TYPE(cp_fm_type), DIMENSION(4)               :: fm_work_mo = cp_fm_type()
     164              :       TYPE(cp_fm_type)                             :: fm_RI_RI = cp_fm_type(), &
     165              :                                                       fm_chi_Gamma_freq = cp_fm_type(), &
     166              :                                                       fm_W_MIC_freq = cp_fm_type(), &
     167              :                                                       fm_W_MIC_freq_1_extra = cp_fm_type(), &
     168              :                                                       fm_W_MIC_freq_1_no_extra = cp_fm_type(), &
     169              :                                                       fm_W_MIC_freq_zero = cp_fm_type(), &
     170              :                                                       fm_h_G0W0_Gamma = cp_fm_type()
     171              :       TYPE(cp_cfm_type)                            :: cfm_work_mo = cp_cfm_type(), &
     172              :                                                       cfm_work_mo_2 = cp_cfm_type()
     173              : 
     174              :       ! global dbcsr cfm_1d used in GW
     175              :       TYPE(dbcsr_p_type)                           :: mat_ao_ao = dbcsr_p_type(), &
     176              :                                                       mat_RI_RI = dbcsr_p_type()
     177              :       TYPE(dbcsr_p_type), DIMENSION(:), POINTER    :: mat_chi_Gamma_tau => NULL()
     178              : 
     179              :       ! local dbcsr cfm_1d used in GW (local in tensor group)
     180              :       TYPE(dbcsr_p_type)                           :: mat_ao_ao_tensor = dbcsr_p_type(), &
     181              :                                                       mat_RI_RI_tensor = dbcsr_p_type()
     182              : 
     183              :       ! tensors for sparse matrix-tensor operations
     184              : #if defined(FTN_NO_DEFAULT_INIT)
     185              :       TYPE(dbt_type)                               :: t_G, &
     186              :                                                       t_chi, &
     187              :                                                       t_W, &
     188              :                                                       t_RI_AO__AO, &
     189              :                                                       t_RI__AO_AO
     190              : #else
     191              :       TYPE(dbt_type)                               :: t_G = dbt_type(), &
     192              :                                                       t_chi = dbt_type(), &
     193              :                                                       t_W = dbt_type(), &
     194              :                                                       t_RI_AO__AO = dbt_type(), &
     195              :                                                       t_RI__AO_AO = dbt_type()
     196              : #endif
     197              : 
     198              :       ! parameters and data for parallelization
     199              :       INTEGER                                      :: group_size_tensor = -1, &
     200              :                                                       tensor_group_color = -1, &
     201              :                                                       num_tensor_groups = -1
     202              :       REAL(KIND=dp)                                :: input_memory_per_proc_GB = -1.0_dp
     203              :       TYPE(mp_para_env_type), POINTER              :: para_env => NULL(), &
     204              :                                                       para_env_tensor => NULL()
     205              :       REAL(KIND=dp)                                :: occupation_3c_int = -1.0_dp, &
     206              :                                                       max_dist_AO_atoms = -1.0_dp, &
     207              :                                                       safety_factor_memory = -1.0_dp
     208              : 
     209              :       ! parallelization: atom range i and atom range j for tensor group
     210              :       INTEGER, DIMENSION(2)                        :: atoms_i = -1, &
     211              :                                                       atoms_j = -1
     212              :       INTEGER                                      :: n_atom_i = -1, &
     213              :                                                       n_intervals_i = -1, &
     214              :                                                       n_atom_j = -1, &
     215              :                                                       n_intervals_j = -1, &
     216              :                                                       n_atom_per_interval_ij = -1, &
     217              :                                                       n_intervals_inner_loop_atoms = -1, &
     218              :                                                       n_atom_per_IL_interval = -1
     219              :       INTEGER, DIMENSION(:, :), ALLOCATABLE        :: i_atom_intervals, &
     220              :                                                       j_atom_intervals, &
     221              :                                                       inner_loop_atom_intervals, &
     222              :                                                       atoms_i_t_group, &
     223              :                                                       atoms_j_t_group
     224              :       LOGICAL, DIMENSION(:, :), ALLOCATABLE        :: skip_Sigma_occ, &
     225              :                                                       skip_Sigma_vir
     226              :       ! Marek : rtbse_method
     227              :       INTEGER                                      :: rtp_method = rtp_method_bse
     228              : 
     229              :       ! check-arrays and names for restarting
     230              :       LOGICAL, DIMENSION(:), ALLOCATABLE           :: read_chi, &
     231              :                                                       calc_chi
     232              :       LOGICAL, DIMENSION(:, :), ALLOCATABLE        :: Sigma_c_exists
     233              :       LOGICAL                                      :: all_W_exist = .FALSE., &
     234              :                                                       Sigma_x_exists = .FALSE.
     235              :       CHARACTER(LEN=3)                             :: chi_name = "chi"
     236              :       CHARACTER(LEN=6)                             :: W_time_name = "W_time"
     237              :       CHARACTER(LEN=7)                             :: Sigma_x_name = "Sigma_x"
     238              :       CHARACTER(LEN=13)                            :: Sigma_p_name = "Sigma_pos_tau", &
     239              :                                                       Sigma_n_name = "Sigma_neg_tau"
     240              :       CHARACTER(LEN=default_string_length)         :: prefix = ""
     241              :       INTEGER                                      :: unit_nr = -1
     242              : 
     243              :       ! parameters and data for basis sets
     244              :       TYPE(gto_basis_set_p_type), &
     245              :          DIMENSION(:), ALLOCATABLE                 :: basis_set_AO, &
     246              :                                                       basis_set_RI
     247              :       INTEGER, DIMENSION(:), ALLOCATABLE           :: sizes_AO, &
     248              :                                                       sizes_RI
     249              :       TYPE(neighbor_list_3c_type)                  :: nl_3c = neighbor_list_3c_type()
     250              :       TYPE(libint_potential_type)                  :: ri_metric = libint_potential_type(), &
     251              :                                                       trunc_coulomb = libint_potential_type()
     252              : 
     253              :       ! parameters for SOC calculation
     254              :       REAL(KIND=dp)                                :: energy_window_soc = -1.0_dp
     255              :       ! sizes: mat_V_SOC_xyz: xyz, img
     256              :       TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: mat_V_SOC_xyz => NULL()
     257              :       TYPE(cp_fm_type), DIMENSION(3)               :: fm_V_SOC_xyz_mo = cp_fm_type()
     258              :       ! small-cell GW: dimension = number of kpoints; large-cell GW: Gamma-point, dimension = 1
     259              :       TYPE(cp_cfm_type), DIMENSION(:), ALLOCATABLE :: cfm_SOC_spinor_ao
     260              :       TYPE(band_edges_type)                        :: band_edges_scf_SOC = band_edges_type(), &
     261              :                                                       band_edges_G0W0_SOC = band_edges_type()
     262              : 
     263              :       ! parameters for DOS and PDOS calculation
     264              :       REAL(KIND=dp)                                :: energy_window_DOS = -1.0_dp, &
     265              :                                                       energy_step_DOS = -1.0_dp, &
     266              :                                                       broadening_DOS = -1.0_dp
     267              : 
     268              :       ! parameters for LDOS calculation (LDOS: local density of states)
     269              :       INTEGER                                      :: int_ldos_xyz = -1
     270              :       INTEGER, DIMENSION(:), POINTER               :: bin_mesh => NULL()
     271              :       INTEGER                                      :: n_bins_max_for_printing = -1
     272              :       REAL(KIND=dp)                                :: unit_ldos_int_z_inv_Ang2_eV = -1.0_dp
     273              : 
     274              :       ! quantities only needed for small cells and k-point sampling in DFT (small_cell_full_kp)
     275              :       INTEGER                                      :: nkp_scf_desymm = -1, &
     276              :                                                       nimages_3c = -1, &
     277              :                                                       nimages_scf_desymm = -1, &
     278              :                                                       nimages_Delta_R = -1
     279              :       TYPE(kpoint_type), POINTER                   :: kpoints_scf_desymm => NULL(), &
     280              :                                                       kpoints_scf_desymm_2 => NULL()
     281              :       INTEGER, DIMENSION(3)                        :: cell_grid_scf_desymm = -1
     282              :       INTEGER, DIMENSION(:, :), ALLOCATABLE        :: index_to_cell_3c, &
     283              :                                                       index_to_cell_Delta_R
     284              :       INTEGER, DIMENSION(:, :, :), POINTER         :: cell_to_index_3c => NULL(), &
     285              :                                                       cell_to_index_Delta_R => NULL()
     286              :       REAL(KIND=dp)                                :: heuristic_filter_factor = -1.0_dp
     287              : 
     288              :       ! small_cell_full_kp parallelization
     289              :       INTEGER                                      :: n_tasks_Delta_R_local = -1
     290              :       INTEGER, DIMENSION(:), ALLOCATABLE           :: task_Delta_R
     291              :       INTEGER, DIMENSION(:, :), ALLOCATABLE        :: nblocks_3c
     292              :       LOGICAL, DIMENSION(:), ALLOCATABLE           :: skip_DR_chi, &
     293              :                                                       skip_DR_Sigma
     294              :       LOGICAL, DIMENSION(:, :, :), ALLOCATABLE     :: skip_DR_R_R2_MxM_chi, &
     295              :                                                       skip_DR_R1_R_MxM_Sigma, &
     296              :                                                       skip_DR_R12_S_Goccx3c_chi, &
     297              :                                                       skip_DR_R12_S_Gvirx3c_chi, &
     298              :                                                       skip_DR_R1_S2_Gx3c_Sigma
     299              : 
     300              :       ! cfm for k-dep overl mat S_µν(k), KS mat h_µν(k,spin) and mo coeff C_μn(k,spin) from SCF
     301              :       TYPE(cp_cfm_type), DIMENSION(:), ALLOCATABLE      :: cfm_s_kp
     302              :       TYPE(cp_cfm_type), DIMENSION(:, :), ALLOCATABLE   :: cfm_mo_coeff_kp, &
     303              :                                                            cfm_ks_kp
     304              :       TYPE(cp_fm_type), DIMENSION(:), ALLOCATABLE       :: fm_G_S, &
     305              :                                                            fm_Sigma_x_R
     306              :       TYPE(cp_fm_type), DIMENSION(:, :), ALLOCATABLE    :: fm_V_xc_R, &
     307              :                                                            fm_chi_R_t, &
     308              :                                                            fm_MWM_R_t
     309              :       TYPE(cp_fm_type), DIMENSION(:, :, :), ALLOCATABLE :: fm_Sigma_c_R_neg_tau, &
     310              :                                                            fm_Sigma_c_R_pos_tau
     311              :       REAL(KIND=dp), DIMENSION(:, :, :), ALLOCATABLE    :: v_xc_n
     312              :       TYPE(dbt_type), ALLOCATABLE, DIMENSION(:, :)      :: t_3c_int
     313              : 
     314              :    END TYPE post_scf_bandstructure_type
     315              : 
     316              : CONTAINS
     317              : 
     318              : ! **************************************************************************************************
     319              : !> \brief ...
     320              : !> \param bs_env ...
     321              : ! **************************************************************************************************
     322           28 :    SUBROUTINE bs_env_release(bs_env)
     323              :       TYPE(post_scf_bandstructure_type), POINTER         :: bs_env
     324              : 
     325              :       CHARACTER(LEN=*), PARAMETER                        :: routineN = 'bs_env_release'
     326              : 
     327              :       INTEGER                                            :: handle
     328              : 
     329           28 :       CALL timeset(routineN, handle)
     330              : 
     331           28 :       CPASSERT(ASSOCIATED(bs_env))
     332              : 
     333           28 :       CALL safe_kpoints_release(bs_env%kpoints_chi_eps_W)
     334           28 :       CALL safe_kpoints_release(bs_env%kpoints_DOS)
     335           28 :       CALL safe_kpoints_release(bs_env%kpoints_scf_desymm)
     336           28 :       CALL safe_kpoints_release(bs_env%kpoints_scf_desymm_2)
     337              : 
     338           28 :       IF (ALLOCATED(bs_env%wkp_s_p)) DEALLOCATE (bs_env%wkp_s_p)
     339           28 :       IF (ALLOCATED(bs_env%wkp_no_extra)) DEALLOCATE (bs_env%wkp_no_extra)
     340           28 :       IF (ALLOCATED(bs_env%l_RI)) DEALLOCATE (bs_env%l_RI)
     341           28 :       IF (ALLOCATED(bs_env%xkp_special)) DEALLOCATE (bs_env%xkp_special)
     342           28 :       IF (ALLOCATED(bs_env%imag_time_points)) DEALLOCATE (bs_env%imag_time_points)
     343           28 :       IF (ALLOCATED(bs_env%imag_time_weights_freq_zero)) DEALLOCATE (bs_env%imag_time_weights_freq_zero)
     344           28 :       IF (ALLOCATED(bs_env%imag_freq_points)) DEALLOCATE (bs_env%imag_freq_points)
     345           28 :       IF (ALLOCATED(bs_env%eigenval_scf_Gamma)) DEALLOCATE (bs_env%eigenval_scf_Gamma)
     346           28 :       IF (ALLOCATED(bs_env%eigenval_scf)) DEALLOCATE (bs_env%eigenval_scf)
     347           28 :       IF (ALLOCATED(bs_env%eigenval_G0W0)) DEALLOCATE (bs_env%eigenval_G0W0)
     348           28 :       IF (ALLOCATED(bs_env%eigenval_HF)) DEALLOCATE (bs_env%eigenval_HF)
     349           28 :       IF (ALLOCATED(bs_env%eigenval_scGW0)) DEALLOCATE (bs_env%eigenval_scGW0)
     350           28 :       IF (ALLOCATED(bs_env%eigenval_scf_soc)) DEALLOCATE (bs_env%eigenval_scf_soc)
     351           28 :       IF (ALLOCATED(bs_env%eigenval_G0W0_soc)) DEALLOCATE (bs_env%eigenval_G0W0_soc)
     352           28 :       IF (ALLOCATED(bs_env%i_ao_start_from_atom)) DEALLOCATE (bs_env%i_ao_start_from_atom)
     353           28 :       IF (ALLOCATED(bs_env%i_ao_end_from_atom)) DEALLOCATE (bs_env%i_ao_end_from_atom)
     354           28 :       IF (ALLOCATED(bs_env%i_RI_start_from_atom)) DEALLOCATE (bs_env%i_RI_start_from_atom)
     355           28 :       IF (ALLOCATED(bs_env%i_RI_end_from_atom)) DEALLOCATE (bs_env%i_RI_end_from_atom)
     356           28 :       IF (ALLOCATED(bs_env%i_atom_intervals)) DEALLOCATE (bs_env%i_atom_intervals)
     357           28 :       IF (ALLOCATED(bs_env%j_atom_intervals)) DEALLOCATE (bs_env%j_atom_intervals)
     358           28 :       IF (ALLOCATED(bs_env%atoms_i_t_group)) DEALLOCATE (bs_env%atoms_i_t_group)
     359           28 :       IF (ALLOCATED(bs_env%atoms_j_t_group)) DEALLOCATE (bs_env%atoms_j_t_group)
     360           28 :       IF (ALLOCATED(bs_env%skip_Sigma_occ)) DEALLOCATE (bs_env%skip_Sigma_occ)
     361           28 :       IF (ALLOCATED(bs_env%skip_Sigma_vir)) DEALLOCATE (bs_env%skip_Sigma_vir)
     362           28 :       IF (ALLOCATED(bs_env%read_chi)) DEALLOCATE (bs_env%read_chi)
     363           28 :       IF (ALLOCATED(bs_env%calc_chi)) DEALLOCATE (bs_env%calc_chi)
     364           28 :       IF (ALLOCATED(bs_env%Sigma_c_exists)) DEALLOCATE (bs_env%Sigma_c_exists)
     365           28 :       IF (ALLOCATED(bs_env%sizes_AO)) DEALLOCATE (bs_env%sizes_AO)
     366           28 :       IF (ALLOCATED(bs_env%sizes_RI)) DEALLOCATE (bs_env%sizes_RI)
     367           28 :       IF (ALLOCATED(bs_env%index_to_cell_3c)) DEALLOCATE (bs_env%index_to_cell_3c)
     368           28 :       IF (ALLOCATED(bs_env%index_to_cell_Delta_R)) DEALLOCATE (bs_env%index_to_cell_Delta_R)
     369           28 :       IF (ASSOCIATED(bs_env%cell_to_index_3c)) DEALLOCATE (bs_env%cell_to_index_3c)
     370           28 :       IF (ASSOCIATED(bs_env%cell_to_index_Delta_R)) DEALLOCATE (bs_env%cell_to_index_Delta_R)
     371           28 :       IF (ALLOCATED(bs_env%task_Delta_R)) DEALLOCATE (bs_env%task_Delta_R)
     372           28 :       IF (ALLOCATED(bs_env%nblocks_3c)) DEALLOCATE (bs_env%nblocks_3c)
     373           28 :       IF (ALLOCATED(bs_env%skip_DR_chi)) DEALLOCATE (bs_env%skip_DR_chi)
     374           28 :       IF (ALLOCATED(bs_env%skip_DR_Sigma)) DEALLOCATE (bs_env%skip_DR_Sigma)
     375           28 :       IF (ALLOCATED(bs_env%skip_DR_R_R2_MxM_chi)) DEALLOCATE (bs_env%skip_DR_R_R2_MxM_chi)
     376           28 :       IF (ALLOCATED(bs_env%skip_DR_R1_R_MxM_Sigma)) DEALLOCATE (bs_env%skip_DR_R1_R_MxM_Sigma)
     377           28 :       IF (ALLOCATED(bs_env%skip_DR_R12_S_Goccx3c_chi)) DEALLOCATE (bs_env%skip_DR_R12_S_Goccx3c_chi)
     378           28 :       IF (ALLOCATED(bs_env%skip_DR_R12_S_Gvirx3c_chi)) DEALLOCATE (bs_env%skip_DR_R12_S_Gvirx3c_chi)
     379           28 :       IF (ALLOCATED(bs_env%skip_DR_R1_S2_Gx3c_Sigma)) DEALLOCATE (bs_env%skip_DR_R1_S2_Gx3c_Sigma)
     380              : 
     381           28 :       CALL cp_fm_release(bs_env%fm_s_Gamma)
     382           28 :       CALL cp_fm_release(bs_env%fm_ks_Gamma(1))
     383           28 :       CALL cp_fm_release(bs_env%fm_ks_Gamma(2))
     384           28 :       CALL cp_fm_release(bs_env%fm_V_xc_Gamma(1))
     385           28 :       CALL cp_fm_release(bs_env%fm_V_xc_Gamma(2))
     386           28 :       CALL cp_fm_release(bs_env%fm_mo_coeff_Gamma(1))
     387           28 :       CALL cp_fm_release(bs_env%fm_mo_coeff_Gamma(2))
     388           28 :       CALL cp_fm_release(bs_env%fm_Gocc)
     389           28 :       CALL cp_fm_release(bs_env%fm_Gvir)
     390           28 :       CALL cp_fm_release(bs_env%fm_work_mo(1))
     391           28 :       CALL cp_fm_release(bs_env%fm_work_mo(2))
     392           28 :       CALL cp_fm_release(bs_env%fm_work_mo(3))
     393           28 :       CALL cp_fm_release(bs_env%fm_work_mo(4))
     394           28 :       CALL cp_fm_release(bs_env%fm_RI_RI)
     395           28 :       CALL cp_fm_release(bs_env%fm_chi_Gamma_freq)
     396           28 :       CALL cp_fm_release(bs_env%fm_W_MIC_freq)
     397           28 :       IF (bs_env%rtp_method == rtp_method_bse) CALL cp_fm_release(bs_env%fm_W_MIC_freq_zero)
     398           28 :       CALL cp_fm_release(bs_env%fm_W_MIC_freq_1_extra)
     399           28 :       CALL cp_fm_release(bs_env%fm_W_MIC_freq_1_no_extra)
     400           28 :       CALL cp_cfm_release(bs_env%cfm_work_mo)
     401           28 :       CALL cp_cfm_release(bs_env%cfm_work_mo_2)
     402              : 
     403           28 :       CALL safe_fm_destroy_1d(bs_env%fm_G_S)
     404           28 :       CALL safe_fm_destroy_1d(bs_env%fm_Sigma_x_R)
     405           28 :       CALL safe_fm_destroy_2d(bs_env%fm_V_xc_R)
     406           28 :       CALL safe_fm_destroy_2d(bs_env%fm_chi_R_t)
     407           28 :       CALL safe_fm_destroy_2d(bs_env%fm_MWM_R_t)
     408           28 :       CALL safe_fm_destroy_3d(bs_env%fm_Sigma_c_R_neg_tau)
     409           28 :       CALL safe_fm_destroy_3d(bs_env%fm_Sigma_c_R_pos_tau)
     410              : 
     411           28 :       CALL t_destroy_2d(bs_env%t_3c_int)
     412              : 
     413           28 :       CALL release_dbcsr_p_type(bs_env%mat_ao_ao)
     414           28 :       CALL release_dbcsr_p_type(bs_env%mat_RI_RI)
     415           28 :       CALL safe_dbcsr_deallocate_matrix_set_1d(bs_env%mat_chi_Gamma_tau)
     416              : 
     417           28 :       CALL release_dbcsr_p_type(bs_env%mat_ao_ao_tensor)
     418           28 :       CALL release_dbcsr_p_type(bs_env%mat_RI_RI_tensor)
     419              : 
     420           28 :       CALL safe_cfm_destroy_1d(bs_env%cfm_s_kp)
     421           28 :       CALL safe_cfm_destroy_2d(bs_env%cfm_ks_kp)
     422           28 :       CALL safe_cfm_destroy_2d(bs_env%cfm_mo_coeff_kp)
     423              : 
     424           28 :       CALL mp_para_env_release(bs_env%para_env)
     425           28 :       IF (ASSOCIATED(bs_env%para_env_tensor)) CALL mp_para_env_release(bs_env%para_env_tensor)
     426              : 
     427           28 :       CALL safe_dbt_destroy(bs_env%t_G)
     428           28 :       CALL safe_dbt_destroy(bs_env%t_chi)
     429           28 :       CALL safe_dbt_destroy(bs_env%t_W)
     430           28 :       CALL safe_dbt_destroy(bs_env%t_RI_AO__AO)
     431           28 :       CALL safe_dbt_destroy(bs_env%t_RI__AO_AO)
     432              : 
     433           28 :       IF (ALLOCATED(bs_env%basis_set_AO)) DEALLOCATE (bs_env%basis_set_AO)
     434           28 :       IF (ALLOCATED(bs_env%basis_set_RI)) DEALLOCATE (bs_env%basis_set_RI)
     435              : 
     436              :       ! SOC cfm_1d and arrays
     437           28 :       CALL safe_dbcsr_deallocate_matrix_set_2d(bs_env%mat_V_SOC_xyz)
     438           28 :       CALL cp_fm_release(bs_env%fm_V_SOC_xyz_mo(1))
     439           28 :       CALL cp_fm_release(bs_env%fm_V_SOC_xyz_mo(2))
     440           28 :       CALL cp_fm_release(bs_env%fm_V_SOC_xyz_mo(3))
     441           28 :       CALL safe_cfm_destroy_1d(bs_env%cfm_SOC_spinor_ao)
     442              : 
     443           28 :       DEALLOCATE (bs_env)
     444              : 
     445           28 :       CALL timestop(handle)
     446              : 
     447           28 :    END SUBROUTINE bs_env_release
     448              : 
     449              : ! **************************************************************************************************
     450              : !> \brief ...
     451              : !> \param kpoints ...
     452              : ! **************************************************************************************************
     453          112 :    SUBROUTINE safe_kpoints_release(kpoints)
     454              :       TYPE(kpoint_type), POINTER                         :: kpoints
     455              : 
     456          112 :       IF (ASSOCIATED(kpoints)) CALL kpoint_release(kpoints)
     457              : 
     458          112 :    END SUBROUTINE safe_kpoints_release
     459              : 
     460              : ! **************************************************************************************************
     461              : !> \brief ...
     462              : !> \param dbcsr_p_type_matrix ...
     463              : ! **************************************************************************************************
     464          112 :    SUBROUTINE release_dbcsr_p_type(dbcsr_p_type_matrix)
     465              :       TYPE(dbcsr_p_type)                                 :: dbcsr_p_type_matrix
     466              : 
     467          112 :       IF (ASSOCIATED(dbcsr_p_type_matrix%matrix)) THEN
     468          112 :          CALL dbcsr_release(dbcsr_p_type_matrix%matrix)
     469          112 :          DEALLOCATE (dbcsr_p_type_matrix%matrix)
     470              :       END IF
     471              : 
     472          112 :    END SUBROUTINE release_dbcsr_p_type
     473              : 
     474              : ! **************************************************************************************************
     475              : !> \brief ...
     476              : !> \param t ...
     477              : ! **************************************************************************************************
     478          140 :    SUBROUTINE safe_dbt_destroy(t)
     479              :       TYPE(dbt_type)                                     :: t
     480              : 
     481          140 :       IF (ASSOCIATED(t%matrix_rep)) CALL dbt_destroy(t)
     482              : 
     483          140 :    END SUBROUTINE safe_dbt_destroy
     484              : 
     485              : ! **************************************************************************************************
     486              : !> \brief ...
     487              : !> \param dbcsr_array ...
     488              : ! **************************************************************************************************
     489           28 :    SUBROUTINE safe_dbcsr_deallocate_matrix_set_1d(dbcsr_array)
     490              :       TYPE(dbcsr_p_type), DIMENSION(:), POINTER          :: dbcsr_array
     491              : 
     492           28 :       IF (ASSOCIATED(dbcsr_array)) CALL dbcsr_deallocate_matrix_set(dbcsr_array)
     493              : 
     494           28 :    END SUBROUTINE safe_dbcsr_deallocate_matrix_set_1d
     495              : 
     496              : ! **************************************************************************************************
     497              : !> \brief ...
     498              : !> \param dbcsr_array ...
     499              : ! **************************************************************************************************
     500           28 :    SUBROUTINE safe_dbcsr_deallocate_matrix_set_2d(dbcsr_array)
     501              :       TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER       :: dbcsr_array
     502              : 
     503           28 :       IF (ASSOCIATED(dbcsr_array)) CALL dbcsr_deallocate_matrix_set(dbcsr_array)
     504              : 
     505           28 :    END SUBROUTINE safe_dbcsr_deallocate_matrix_set_2d
     506              : 
     507              : ! **************************************************************************************************
     508              : !> \brief ...
     509              : !> \param fm_1d ...
     510              : ! **************************************************************************************************
     511           56 :    SUBROUTINE safe_fm_destroy_1d(fm_1d)
     512              :       TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:)        :: fm_1d
     513              : 
     514              :       INTEGER                                            :: i
     515              : 
     516           56 :       IF (ALLOCATED(fm_1d)) THEN
     517          120 :          DO i = 1, SIZE(fm_1d, 1)
     518          120 :             CALL cp_fm_release(fm_1d(i))
     519              :          END DO
     520           12 :          DEALLOCATE (fm_1d)
     521              :       END IF
     522              : 
     523           56 :    END SUBROUTINE safe_fm_destroy_1d
     524              : 
     525              : ! **************************************************************************************************
     526              : !> \brief ...
     527              : !> \param fm_2d ...
     528              : ! **************************************************************************************************
     529           84 :    SUBROUTINE safe_fm_destroy_2d(fm_2d)
     530              :       TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:, :)     :: fm_2d
     531              : 
     532              :       INTEGER                                            :: i, j
     533              : 
     534           84 :       IF (ALLOCATED(fm_2d)) THEN
     535          304 :          DO i = 1, SIZE(fm_2d, 1)
     536         1274 :          DO j = 1, SIZE(fm_2d, 2)
     537         1256 :             CALL cp_fm_release(fm_2d(i, j))
     538              :          END DO
     539              :          END DO
     540           18 :          DEALLOCATE (fm_2d)
     541              :       END IF
     542              : 
     543           84 :    END SUBROUTINE safe_fm_destroy_2d
     544              : 
     545              : ! **************************************************************************************************
     546              : !> \brief ...
     547              : !> \param fm_3d ...
     548              : ! **************************************************************************************************
     549           56 :    SUBROUTINE safe_fm_destroy_3d(fm_3d)
     550              :       TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:, :, :)  :: fm_3d
     551              : 
     552              :       INTEGER                                            :: i, j, k
     553              : 
     554           56 :       IF (ALLOCATED(fm_3d)) THEN
     555          120 :          DO i = 1, SIZE(fm_3d, 1)
     556          912 :          DO j = 1, SIZE(fm_3d, 2)
     557         1692 :          DO k = 1, SIZE(fm_3d, 3)
     558         1584 :             CALL cp_fm_release(fm_3d(i, j, k))
     559              :          END DO
     560              :          END DO
     561              :          END DO
     562           12 :          DEALLOCATE (fm_3d)
     563              :       END IF
     564              : 
     565           56 :    END SUBROUTINE safe_fm_destroy_3d
     566              : 
     567              : ! **************************************************************************************************
     568              : !> \brief ...
     569              : !> \param cfm_1d ...
     570              : ! **************************************************************************************************
     571           56 :    SUBROUTINE safe_cfm_destroy_1d(cfm_1d)
     572              :       TYPE(cp_cfm_type), ALLOCATABLE, DIMENSION(:)       :: cfm_1d
     573              : 
     574              :       INTEGER                                            :: i
     575              : 
     576           56 :       IF (ALLOCATED(cfm_1d)) THEN
     577          340 :          DO i = 1, SIZE(cfm_1d, 1)
     578          340 :             CALL cp_cfm_release(cfm_1d(i))
     579              :          END DO
     580           18 :          DEALLOCATE (cfm_1d)
     581              :       END IF
     582              : 
     583           56 :    END SUBROUTINE safe_cfm_destroy_1d
     584              : 
     585              : ! **************************************************************************************************
     586              : !> \brief ...
     587              : !> \param cfm_2d ...
     588              : ! **************************************************************************************************
     589           56 :    SUBROUTINE safe_cfm_destroy_2d(cfm_2d)
     590              :       TYPE(cp_cfm_type), ALLOCATABLE, DIMENSION(:, :)    :: cfm_2d
     591              : 
     592              :       INTEGER                                            :: i, j
     593              : 
     594           56 :       IF (ALLOCATED(cfm_2d)) THEN
     595          328 :          DO i = 1, SIZE(cfm_2d, 1)
     596          644 :          DO j = 1, SIZE(cfm_2d, 2)
     597          632 :             CALL cp_cfm_release(cfm_2d(i, j))
     598              :          END DO
     599              :          END DO
     600           12 :          DEALLOCATE (cfm_2d)
     601              :       END IF
     602              : 
     603           56 :    END SUBROUTINE safe_cfm_destroy_2d
     604              : 
     605              : ! **************************************************************************************************
     606              : !> \brief ...
     607              : !> \param t_2d ...
     608              : ! **************************************************************************************************
     609           28 :    SUBROUTINE t_destroy_2d(t_2d)
     610              :       TYPE(dbt_type), ALLOCATABLE, DIMENSION(:, :)       :: t_2d
     611              : 
     612              :       INTEGER                                            :: i, j
     613              : 
     614           28 :       IF (ALLOCATED(t_2d)) THEN
     615           64 :          DO i = 1, SIZE(t_2d, 1)
     616          690 :             DO j = 1, SIZE(t_2d, 2)
     617          684 :                CALL dbt_destroy(t_2d(i, j))
     618              :             END DO
     619              :          END DO
     620          632 :          DEALLOCATE (t_2d)
     621              :       END IF
     622              : 
     623           28 :    END SUBROUTINE t_destroy_2d
     624              : 
     625            0 : END MODULE post_scf_bandstructure_types
        

Generated by: LCOV version 2.0-1