LCOV - code coverage report
Current view: top level - src - post_scf_bandstructure_types.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:5b7fc9f) Lines: 99.4 % 181 180
Test Date: 2026-08-15 07:07:40 Functions: 57.1 % 21 12

            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
      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              :                                               dbcsr_type
      20              :    USE cp_dbcsr_operations,             ONLY: dbcsr_deallocate_matrix_set
      21              :    USE cp_fm_types,                     ONLY: cp_fm_release,&
      22              :                                               cp_fm_type
      23              :    USE dbt_api,                         ONLY: dbt_destroy,&
      24              :                                               dbt_type
      25              :    USE input_constants,                 ONLY: rtp_method_bse,&
      26              :                                               rtp_method_bse_linearized,&
      27              :                                               small_cell_full_kp
      28              :    USE kinds,                           ONLY: default_path_length,&
      29              :                                               default_string_length,&
      30              :                                               dp
      31              :    USE kpoint_types,                    ONLY: kpoint_release,&
      32              :                                               kpoint_type
      33              :    USE libint_2c_3c,                    ONLY: libint_potential_type
      34              :    USE message_passing,                 ONLY: mp_para_env_release,&
      35              :                                               mp_para_env_type
      36              :    USE physcon,                         ONLY: evolt
      37              :    USE qs_tensors_types,                ONLY: neighbor_list_3c_type
      38              : #include "./base/base_uses.f90"
      39              : 
      40              :    IMPLICIT NONE
      41              : 
      42              :    PRIVATE
      43              : 
      44              :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'post_scf_bandstructure_types'
      45              : 
      46              :    PUBLIC :: post_scf_bandstructure_type, band_edges_type, data_3_type, bs_env_release
      47              : 
      48              :    ! Sanity bounds on a fundamental quasiparticle gap, in Hartree: below -eps_qp_gap the spectrum is
      49              :    ! inverted, above max_qp_gap the quasiparticle solve has diverged. eps_qp_gap is a noise tolerance,
      50              :    ! low enough that a metal or a near-degenerate system does not trip the inversion test; max_qp_gap
      51              :    ! sits far above any real valence gap (a few tens of eV) but is not derived from the all-electron
      52              :    ! KS spread (~1000 eV), which would defeat the test.
      53              :    REAL(KIND=dp), PARAMETER, PUBLIC                   :: eps_qp_gap = 0.01_dp/evolt, &
      54              :                                                          max_qp_gap = 200.0_dp/evolt
      55              : 
      56              :    ! valence band maximum (VBM), conduction band minimum (CBM), direct band gap (DBG),
      57              :    ! indirect band gap (IDBG)
      58              :    TYPE band_edges_type
      59              :       REAL(KIND=dp)                                   :: VBM = -1.0_dp, &
      60              :                                                          CBM = -1.0_dp, &
      61              :                                                          DBG = -1.0_dp, &
      62              :                                                          IDBG = -1.0_dp
      63              :    END TYPE band_edges_type
      64              : 
      65              :    ! data type for storing 3-index quantities for small-cell, full-k-points GW code
      66              :    TYPE data_3_type
      67              :       REAL(KIND=dp), DIMENSION(:, :, :), ALLOCATABLE :: data_3
      68              :    END TYPE data_3_type
      69              : 
      70              :    ! data types for GW RI-RS code
      71              :    TYPE rirs_grid_type
      72              :       INTEGER                    :: npts = 0
      73              :       REAL(KIND=dp), ALLOCATABLE :: raw_points(:, :)
      74              :    END TYPE rirs_grid_type
      75              : 
      76              :    TYPE ri_rs_env
      77              : 
      78              :       ! Input parameters for RI-RS
      79              :       INTEGER                                          :: grid_select = 1
      80              :       REAL(KIND=dp)                                    :: tikhonov = 1.0E-08_dp
      81              :       REAL(KIND=dp)                                    :: cutoff_radius_ri_rs = -1.0_dp
      82              :       REAL(KIND=dp)                                    :: cutoff_radius_ri_ao = -1.0_dp
      83              :       INTEGER                                          :: n_procs_per_atom_z_lp = -1
      84              :       INTEGER                                          :: n_panels = 1
      85              :       LOGICAL                                          :: keep_sparsity_rirs = .TRUE.
      86              :       REAL(KIND=dp)                                    :: cutoff_radius_v_w = -1.0_dp
      87              :       REAL(KIND=dp)                                    :: cutoff_radius_g_w = -1.0_dp
      88              :       CHARACTER(LEN=default_string_length)             :: grid_file_suffix = ""
      89              : 
      90              :       ! Data types for cutoffs based DBCSR matrices
      91              :       REAL(KIND=dp), ALLOCATABLE                       :: chunk_centroids(:, :)
      92              :       REAL(KIND=dp), ALLOCATABLE                       :: atom_centers(:, :)
      93              :       INTEGER, ALLOCATABLE                             :: grid_atom_boundaries(:)
      94              :       INTEGER, ALLOCATABLE                             :: pan_first(:), pan_last(:)
      95              : 
      96              :       ! Data types for building grid points
      97              :       TYPE(rirs_grid_type), ALLOCATABLE                :: grid_cache(:)
      98              : 
      99              :       ! Data types for storing RI-RS matrices
     100              :       TYPE(dbcsr_type)                                 :: mat_phi_mu_l
     101              :       TYPE(dbcsr_type)                                 :: mat_Z_lP
     102              :       REAL(KIND=dp), ALLOCATABLE                       :: grid_points(:, :)
     103              :       LOGICAL                                          :: Z_lP_exists = .FALSE.
     104              : 
     105              :       ! Per-atom spatial extent of the most diffuse Gaussian primitive in each basis
     106              :       REAL(KIND=dp), ALLOCATABLE                       :: radius_ao_per_atom(:)
     107              :       REAL(KIND=dp), ALLOCATABLE                       :: radius_ri_per_atom(:)
     108              : 
     109              :       ! Precomputed grid-basis kernels for RT-BSE
     110              :       ! mat_V_aux_rtbse(P, Q) = truncated-Coulomb V_PQ with M^-1 sandwich (RI x RI);
     111              :       ! the Hartree grid kernel Z V Z^T is applied factorized, never materialized
     112              :       ! mat_W0_grid_rtbse(l, l') = sum_PQ  Z_lP W^{w=0}_PQ Z_l'Q
     113              :       TYPE(dbcsr_type)                                 :: mat_V_aux_rtbse
     114              :       TYPE(dbcsr_type)                                 :: mat_W0_grid_rtbse
     115              :       LOGICAL                                          :: rtbse_kernels_ready = .FALSE.
     116              :       ! Set TRUE once mat_phi_mu_l and mat_Z_lP have been populated in memory (by GW RI-RS
     117              :       ! or on-demand by the RT-BSE RI-RS kernel path).
     118              :       LOGICAL                                          :: grid_built = .FALSE.
     119              :       ! Independent toggles for V_grid / W0_grid availability
     120              :       LOGICAL                                          :: V_grid_built = .FALSE.
     121              :       LOGICAL                                          :: W0_grid_built = .FALSE.
     122              : 
     123              :    END TYPE ri_rs_env
     124              : 
     125              :    TYPE post_scf_bandstructure_type
     126              : 
     127              :       ! decide which calculations will be done
     128              :       LOGICAL                                         :: do_gw = .FALSE., &
     129              :                                                          do_soc = .FALSE., &
     130              :                                                          do_ldos = .FALSE., &
     131              :                                                          do_gw_ri_rs = .FALSE., &
     132              :                                                          do_dos_pdos = .FALSE., &
     133              :                                                          do_floquet = .FALSE.
     134              : 
     135              :       ! various eigenvalues computed in GW code, some depend on k-points
     136              :       ! and have therefore three dimensions (band index, k-point, spin)
     137              :       REAL(KIND=dp), DIMENSION(:, :), ALLOCATABLE     :: eigenval_scf_Gamma
     138              :       REAL(KIND=dp), DIMENSION(:, :, :), ALLOCATABLE  :: eigenval_scf, &
     139              :                                                          eigenval_G0W0, &
     140              :                                                          eigenval_HF, &
     141              :                                                          eigenval_scGW0
     142              :       REAL(KIND=dp), DIMENSION(:, :), ALLOCATABLE     :: eigenval_scf_soc, &
     143              :                                                          eigenval_G0W0_soc
     144              :       TYPE(band_edges_type), DIMENSION(2)             :: band_edges_scf_Gamma = band_edges_type()
     145              :       TYPE(band_edges_type)                           :: band_edges_scf = band_edges_type(), &
     146              :                                                          band_edges_G0W0 = band_edges_type(), &
     147              :                                                          band_edges_HF = band_edges_type()
     148              : 
     149              :       ! parameters that influence the GW flavor
     150              :       LOGICAL                                         :: do_hedin_shift = .FALSE.
     151              : 
     152              :       ! parameters for RI-RS implementation of GW
     153              :       TYPE(ri_rs_env)                                 :: ri_rs
     154              : 
     155              :       ! general parameters on molecular orbitals and basis sets
     156              :       INTEGER                                      :: n_ao = -1, &
     157              :                                                       n_RI = -1, &
     158              :                                                       n_spin = -1, &
     159              :                                                       n_atom = -1, &
     160              :                                                       max_AO_bf_per_atom = -1
     161              :       INTEGER, DIMENSION(:), ALLOCATABLE           :: i_ao_start_from_atom, &
     162              :                                                       i_ao_end_from_atom, &
     163              :                                                       i_RI_start_from_atom, &
     164              :                                                       i_RI_end_from_atom
     165              :       INTEGER, DIMENSION(:, :), ALLOCATABLE         :: min_RI_idx_from_AO_AO_atom, &
     166              :                                                        max_RI_idx_from_AO_AO_atom, &
     167              :                                                        min_AO_idx_from_RI_AO_atom, &
     168              :                                                        max_AO_idx_from_RI_AO_atom
     169              :       INTEGER, DIMENSION(2)                        :: n_occ = -1, &
     170              :                                                       n_vir = -1
     171              :       REAL(KIND=dp)                                :: spin_degeneracy = -1.0_dp
     172              :       REAL(KIND=dp), DIMENSION(2)                  :: e_fermi = -1.0_dp
     173              : 
     174              :       ! kpoint mesh for chi, eps, W
     175              :       INTEGER, DIMENSION(:), POINTER               :: nkp_grid_DOS_input => NULL(), &
     176              :                                                       nkp_grid_chi_eps_W_input => NULL()
     177              :       INTEGER, DIMENSION(3)                        :: nkp_grid_chi_eps_W_orig = -1, &
     178              :                                                       nkp_grid_chi_eps_W_extra = -1
     179              :       INTEGER                                      :: nkp_chi_eps_W_orig = -1, &
     180              :                                                       nkp_chi_eps_W_extra = -1, &
     181              :                                                       nkp_chi_eps_W_orig_plus_extra = -1, &
     182              :                                                       nkp_chi_eps_W_batch = -1, &
     183              :                                                       num_chi_eps_W_batches = -1, &
     184              :                                                       size_lattice_sum_V = -1
     185              :       TYPE(kpoint_type), POINTER                   :: kpoints_chi_eps_W => NULL(), &
     186              :                                                       kpoints_DOS => NULL()
     187              :       LOGICAL                                      :: approx_kp_extrapol = .FALSE.
     188              : 
     189              :       REAL(KIND=dp)                                :: wkp_orig = -1.0_dp
     190              :       REAL(KIND=dp), DIMENSION(:), ALLOCATABLE     :: wkp_s_p, &
     191              :                                                       wkp_no_extra
     192              :       INTEGER, DIMENSION(:), ALLOCATABLE           :: l_RI
     193              :       INTEGER                                      :: input_kp_bs_npoints = -1, &
     194              :                                                       input_kp_bs_n_sp_pts = -1, &
     195              :                                                       nkp_bs_and_DOS = -1, &
     196              :                                                       nkp_only_bs = -1, &
     197              :                                                       nkp_only_DOS = -1
     198              :       REAL(KIND=dp), DIMENSION(:, :), ALLOCATABLE  :: xkp_special
     199              : 
     200              :       ! parameters for GW band structure calculation of small unit cell (with multiple unit cell)
     201              :       INTEGER                                      :: small_cell_full_kp_or_large_cell_Gamma = -1, &
     202              :                                                       nimages_scf = -1
     203              :       INTEGER, DIMENSION(3)                        :: periodic = -1
     204              :       REAL(KIND=dp), DIMENSION(3, 3)               :: hmat = -1.0_dp
     205              : 
     206              :       ! imaginary time and frequency grids
     207              :       INTEGER                                         :: num_time_freq_points = -1, &
     208              :                                                          num_freq_points_fit = -1
     209              :       REAL(KIND=dp), DIMENSION(:), ALLOCATABLE        :: imag_time_points, &
     210              :                                                          imag_time_weights_freq_zero, &
     211              :                                                          imag_freq_points, &
     212              :                                                          imag_freq_points_fit
     213              :       REAL(KIND=dp), DIMENSION(:, :), ALLOCATABLE     :: weights_cos_t_to_w, &
     214              :                                                          weights_cos_w_to_t, &
     215              :                                                          weights_sin_t_to_w
     216              :       INTEGER                                         :: nparam_pade = -1, &
     217              :                                                          num_points_per_magnitude = -1
     218              :       REAL(KIND=dp)                                   :: freq_max_fit = -1.0_dp, &
     219              :                                                          input_regularization_minimax = -1.0_dp, &
     220              :                                                          regularization_minimax = -1.0_dp, &
     221              :                                                          stabilize_exp = -1.0_dp
     222              : 
     223              :       ! filter threshold for matrix-tensor operations
     224              :       REAL(KIND=dp)                                :: eps_filter = -1.0_dp, &
     225              :                                                       eps_atom_grid_2d_mat = -1.0_dp
     226              : 
     227              :       ! threshold for inverting ao overlap matrix, RI cfm_1d
     228              :       REAL(KIND=dp)                                :: eps_eigval_mat_s = -1.0_dp, &
     229              :                                                       eps_eigval_mat_RI = -1.0_dp, &
     230              :                                                       input_regularization_RI = -1.0_dp, &
     231              :                                                       regularization_RI = -1.0_dp
     232              : 
     233              :       ! global full cfm_1d used in GW
     234              :       TYPE(cp_fm_type)                             :: fm_s_Gamma = cp_fm_type(), &
     235              :                                                       fm_Gocc = cp_fm_type(), &
     236              :                                                       fm_Gvir = cp_fm_type()
     237              :       TYPE(cp_fm_type), DIMENSION(2)               :: fm_ks_Gamma = cp_fm_type(), &
     238              :                                                       fm_V_xc_Gamma = cp_fm_type(), &
     239              :                                                       fm_mo_coeff_Gamma = cp_fm_type()
     240              :       TYPE(cp_fm_type), DIMENSION(4)               :: fm_work_mo = cp_fm_type()
     241              :       TYPE(cp_fm_type)                             :: fm_RI_RI = cp_fm_type(), &
     242              :                                                       fm_chi_Gamma_freq = cp_fm_type(), &
     243              :                                                       fm_W_MIC_freq = cp_fm_type(), &
     244              :                                                       fm_W_MIC_freq_1_extra = cp_fm_type(), &
     245              :                                                       fm_W_MIC_freq_1_no_extra = cp_fm_type(), &
     246              :                                                       fm_W_MIC_freq_zero = cp_fm_type(), &
     247              :                                                       fm_h_G0W0_Gamma = cp_fm_type()
     248              :       TYPE(cp_cfm_type)                            :: cfm_work_mo = cp_cfm_type(), &
     249              :                                                       cfm_work_mo_2 = cp_cfm_type()
     250              : 
     251              :       ! global dbcsr cfm_1d used in GW
     252              :       TYPE(dbcsr_p_type)                           :: mat_ao_ao = dbcsr_p_type(), &
     253              :                                                       mat_RI_RI = dbcsr_p_type()
     254              :       TYPE(dbcsr_p_type), DIMENSION(:), POINTER    :: mat_chi_Gamma_tau => NULL()
     255              : 
     256              :       ! local dbcsr cfm_1d used in GW (local in tensor group)
     257              :       TYPE(dbcsr_p_type)                           :: mat_ao_ao_tensor = dbcsr_p_type(), &
     258              :                                                       mat_RI_RI_tensor = dbcsr_p_type()
     259              : 
     260              :       ! tensors for sparse matrix-tensor operations
     261              : #if defined(FTN_NO_DEFAULT_INIT)
     262              :       TYPE(dbt_type)                               :: t_G, &
     263              :                                                       t_chi, &
     264              :                                                       t_W, &
     265              :                                                       t_RI_AO__AO, &
     266              :                                                       t_RI__AO_AO
     267              : #else
     268              :       TYPE(dbt_type)                               :: t_G = dbt_type(), &
     269              :                                                       t_chi = dbt_type(), &
     270              :                                                       t_W = dbt_type(), &
     271              :                                                       t_RI_AO__AO = dbt_type(), &
     272              :                                                       t_RI__AO_AO = dbt_type()
     273              : #endif
     274              : 
     275              :       ! parameters and data for parallelization
     276              :       INTEGER                                      :: group_size_tensor = -1, &
     277              :                                                       tensor_group_color = -1, &
     278              :                                                       num_tensor_groups = -1
     279              :       REAL(KIND=dp)                                :: input_memory_per_proc_GB = -1.0_dp
     280              :       TYPE(mp_para_env_type), POINTER              :: para_env => NULL(), &
     281              :                                                       para_env_tensor => NULL()
     282              :       REAL(KIND=dp)                                :: occupation_3c_int = -1.0_dp, &
     283              :                                                       max_dist_AO_atoms = -1.0_dp, &
     284              :                                                       safety_factor_memory = -1.0_dp
     285              : 
     286              :       ! parallelization: atom range i and atom range j for tensor group
     287              :       INTEGER, DIMENSION(2)                        :: atoms_i = -1, &
     288              :                                                       atoms_j = -1
     289              :       INTEGER                                      :: n_atom_i = -1, &
     290              :                                                       n_intervals_i = -1, &
     291              :                                                       n_atom_j = -1, &
     292              :                                                       n_intervals_j = -1, &
     293              :                                                       n_atom_per_interval_ij = -1, &
     294              :                                                       n_intervals_inner_loop_atoms = -1, &
     295              :                                                       n_atom_per_IL_interval = -1, &
     296              :                                                       n_skip_sigma = -1, &
     297              :                                                       n_skip_chi = -1
     298              :       INTEGER, DIMENSION(:, :), ALLOCATABLE        :: i_atom_intervals, &
     299              :                                                       j_atom_intervals, &
     300              :                                                       inner_loop_atom_intervals, &
     301              :                                                       atoms_i_t_group, &
     302              :                                                       atoms_j_t_group
     303              :       LOGICAL, DIMENSION(:, :), ALLOCATABLE        :: skip_Sigma_occ, &
     304              :                                                       skip_Sigma_vir, &
     305              :                                                       skip_chi
     306              :       ! Marek : rtbse_method
     307              :       INTEGER                                      :: rtp_method = -1
     308              : 
     309              :       ! check-arrays and names for restarting
     310              :       LOGICAL, DIMENSION(:), ALLOCATABLE           :: read_chi, &
     311              :                                                       calc_chi
     312              :       LOGICAL, DIMENSION(:, :), ALLOCATABLE        :: Sigma_c_exists
     313              :       LOGICAL                                      :: all_W_exist = .FALSE., &
     314              :                                                       Sigma_x_exists = .FALSE.
     315              :       CHARACTER(LEN=3)                             :: chi_name = "chi"
     316              :       CHARACTER(LEN=6)                             :: W_time_name = "W_time"
     317              :       CHARACTER(LEN=7)                             :: Sigma_x_name = "Sigma_x"
     318              :       CHARACTER(LEN=13)                            :: Sigma_p_name = "Sigma_pos_tau", &
     319              :                                                       Sigma_n_name = "Sigma_neg_tau"
     320              :       CHARACTER(LEN=default_path_length)           :: prefix = ""
     321              :       INTEGER                                      :: unit_nr = -1, &
     322              :                                                       unit_nr_contract = -1
     323              : 
     324              :       ! parameters and data for basis sets
     325              :       TYPE(gto_basis_set_p_type), &
     326              :          DIMENSION(:), ALLOCATABLE                 :: basis_set_AO, &
     327              :                                                       basis_set_RI
     328              :       INTEGER, DIMENSION(:), ALLOCATABLE           :: sizes_AO, &
     329              :                                                       sizes_RI
     330              :       TYPE(neighbor_list_3c_type)                  :: nl_3c = neighbor_list_3c_type()
     331              :       TYPE(libint_potential_type)                  :: ri_metric = libint_potential_type(), &
     332              :                                                       trunc_coulomb = libint_potential_type()
     333              : 
     334              :       ! parameters for SOC calculation
     335              :       REAL(KIND=dp)                                :: soc_window_occ = -1.0_dp
     336              :       REAL(KIND=dp)                                :: soc_window_virt = -1.0_dp
     337              :       REAL(KIND=dp)                                :: soc_window_smearing = 1.0_dp/evolt
     338              :       ! sizes: mat_V_SOC_xyz: xyz, img
     339              :       TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: mat_V_SOC_xyz => NULL()
     340              :       TYPE(cp_fm_type), DIMENSION(3)               :: fm_V_SOC_xyz_mo = cp_fm_type()
     341              :       ! small-cell GW: dimension = number of kpoints; large-cell GW: Gamma-point, dimension = 1
     342              :       TYPE(cp_cfm_type), DIMENSION(:), ALLOCATABLE :: cfm_SOC_spinor_ao
     343              :       TYPE(band_edges_type)                        :: band_edges_scf_SOC = band_edges_type(), &
     344              :                                                       band_edges_G0W0_SOC = band_edges_type()
     345              : 
     346              :       ! parameters for DOS and PDOS calculation
     347              :       REAL(KIND=dp)                                :: energy_window_DOS = -1.0_dp, &
     348              :                                                       energy_step_DOS = -1.0_dp, &
     349              :                                                       broadening_DOS = -1.0_dp
     350              : 
     351              :       ! parameters for LDOS calculation (LDOS: local density of states)
     352              :       INTEGER                                      :: int_ldos_xyz = -1
     353              :       INTEGER, DIMENSION(:), POINTER               :: bin_mesh => NULL()
     354              :       INTEGER                                      :: n_bins_max_for_printing = -1
     355              :       REAL(KIND=dp)                                :: unit_ldos_int_z_inv_Ang2_eV = -1.0_dp
     356              : 
     357              :       ! parameters for Floquet band structure calculations
     358              :       INTEGER                                      :: max_floquet_index = -1
     359              :       REAL(KIND=dp), DIMENSION(:), POINTER         :: floquet_polarisation => NULL(), &
     360              :                                                       floquet_phi => NULL()
     361              :       REAL(KIND=dp)                                :: floquet_omega = -1.0_dp, &
     362              :                                                       floquet_amplitude = -1.0_dp, &
     363              :                                                       eps_floquet = -1.0_dp, &
     364              :                                                       broadening_floquet = -1.0_dp, &
     365              :                                                       energy_step_floquet = -1.0_dp, &
     366              :                                                       energy_window_floquet = -1.0_dp, &
     367              :                                                       floquet_mem_fill_fraction = -1.0_dp, &
     368              :                                                       floquet_temperature = -1.0_dp
     369              :       CHARACTER(LEN=default_string_length)         :: floquet_dos_file = "", &
     370              :                                                       floquet_qe_file = "", &
     371              :                                                       floquet_bs_file = ""
     372              : 
     373              :       ! quantities only needed for small cells and k-point sampling in DFT (small_cell_full_kp)
     374              :       INTEGER                                      :: nkp_scf_desymm = -1, &
     375              :                                                       nimages_3c = -1, &
     376              :                                                       nimages_scf_desymm = -1, &
     377              :                                                       nimages_Delta_R = -1
     378              :       TYPE(kpoint_type), POINTER                   :: kpoints_scf_desymm => NULL(), &
     379              :                                                       kpoints_scf_desymm_2 => NULL()
     380              :       INTEGER, DIMENSION(3)                        :: cell_grid_scf_desymm = -1
     381              :       INTEGER, DIMENSION(:, :), ALLOCATABLE        :: index_to_cell_3c, &
     382              :                                                       index_to_cell_Delta_R
     383              :       INTEGER, DIMENSION(:, :, :), POINTER         :: cell_to_index_3c => NULL(), &
     384              :                                                       cell_to_index_Delta_R => NULL()
     385              :       REAL(KIND=dp)                                :: heuristic_filter_factor = -1.0_dp
     386              : 
     387              :       ! small_cell_full_kp parallelization
     388              :       INTEGER                                      :: n_tasks_Delta_R_local = -1
     389              :       INTEGER, DIMENSION(:), ALLOCATABLE           :: task_Delta_R
     390              :       INTEGER, DIMENSION(:, :), ALLOCATABLE        :: nblocks_3c
     391              :       LOGICAL, DIMENSION(:), ALLOCATABLE           :: skip_DR_chi, &
     392              :                                                       skip_DR_Sigma
     393              :       LOGICAL, DIMENSION(:, :, :), ALLOCATABLE     :: skip_DR_R_R2_MxM_chi, &
     394              :                                                       skip_DR_R1_R_MxM_Sigma, &
     395              :                                                       skip_DR_R12_S_Goccx3c_chi, &
     396              :                                                       skip_DR_R12_S_Gvirx3c_chi, &
     397              :                                                       skip_DR_R1_S2_Gx3c_Sigma
     398              : 
     399              :       ! cfm for k-dep overl mat S_µν(k), KS mat h_µν(k,spin) and mo coeff C_μn(k,spin) from SCF
     400              :       TYPE(cp_cfm_type), DIMENSION(:), ALLOCATABLE      :: cfm_s_kp
     401              :       TYPE(cp_cfm_type), DIMENSION(:, :), ALLOCATABLE   :: cfm_mo_coeff_kp, &
     402              :                                                            cfm_ks_kp
     403              :       TYPE(cp_fm_type), DIMENSION(:), ALLOCATABLE       :: fm_G_S, &
     404              :                                                            fm_Sigma_x_R
     405              :       TYPE(cp_fm_type), DIMENSION(:, :), ALLOCATABLE    :: fm_V_xc_R, &
     406              :                                                            fm_chi_R_t, &
     407              :                                                            fm_MWM_R_t
     408              :       TYPE(cp_fm_type), DIMENSION(:, :, :), ALLOCATABLE :: fm_Sigma_c_R_neg_tau, &
     409              :                                                            fm_Sigma_c_R_pos_tau
     410              :       REAL(KIND=dp), DIMENSION(:, :, :), ALLOCATABLE    :: v_xc_n
     411              :       TYPE(dbt_type), ALLOCATABLE, DIMENSION(:, :)      :: t_3c_int
     412              : 
     413              :       !MG: Print options
     414              :       LOGICAL                                           :: print_contract = .FALSE., &
     415              :                                                            print_contract_verbose = .FALSE.
     416              : 
     417              :    END TYPE post_scf_bandstructure_type
     418              : 
     419              : CONTAINS
     420              : 
     421              : ! **************************************************************************************************
     422              : !> \brief ...
     423              : !> \param bs_env ...
     424              : ! **************************************************************************************************
     425          106 :    SUBROUTINE bs_env_release(bs_env)
     426              :       TYPE(post_scf_bandstructure_type), POINTER         :: bs_env
     427              : 
     428              :       CHARACTER(LEN=*), PARAMETER                        :: routineN = 'bs_env_release'
     429              : 
     430              :       INTEGER                                            :: handle
     431              : 
     432          106 :       CALL timeset(routineN, handle)
     433              : 
     434          106 :       CPASSERT(ASSOCIATED(bs_env))
     435              : 
     436          106 :       CALL safe_kpoints_release(bs_env%kpoints_chi_eps_W)
     437          106 :       CALL safe_kpoints_release(bs_env%kpoints_DOS)
     438          106 :       CALL safe_kpoints_release(bs_env%kpoints_scf_desymm)
     439          106 :       CALL safe_kpoints_release(bs_env%kpoints_scf_desymm_2)
     440              : 
     441          106 :       IF (ALLOCATED(bs_env%wkp_s_p)) DEALLOCATE (bs_env%wkp_s_p)
     442          106 :       IF (ALLOCATED(bs_env%wkp_no_extra)) DEALLOCATE (bs_env%wkp_no_extra)
     443          106 :       IF (ALLOCATED(bs_env%l_RI)) DEALLOCATE (bs_env%l_RI)
     444          106 :       IF (ALLOCATED(bs_env%xkp_special)) DEALLOCATE (bs_env%xkp_special)
     445          106 :       IF (ALLOCATED(bs_env%imag_time_points)) DEALLOCATE (bs_env%imag_time_points)
     446          106 :       IF (ALLOCATED(bs_env%imag_time_weights_freq_zero)) DEALLOCATE (bs_env%imag_time_weights_freq_zero)
     447          106 :       IF (ALLOCATED(bs_env%imag_freq_points)) DEALLOCATE (bs_env%imag_freq_points)
     448          106 :       IF (ALLOCATED(bs_env%eigenval_scf_Gamma)) DEALLOCATE (bs_env%eigenval_scf_Gamma)
     449          106 :       IF (ALLOCATED(bs_env%eigenval_scf)) DEALLOCATE (bs_env%eigenval_scf)
     450          106 :       IF (ALLOCATED(bs_env%eigenval_G0W0)) DEALLOCATE (bs_env%eigenval_G0W0)
     451          106 :       IF (ALLOCATED(bs_env%eigenval_HF)) DEALLOCATE (bs_env%eigenval_HF)
     452          106 :       IF (ALLOCATED(bs_env%eigenval_scGW0)) DEALLOCATE (bs_env%eigenval_scGW0)
     453          106 :       IF (ALLOCATED(bs_env%eigenval_scf_soc)) DEALLOCATE (bs_env%eigenval_scf_soc)
     454          106 :       IF (ALLOCATED(bs_env%eigenval_G0W0_soc)) DEALLOCATE (bs_env%eigenval_G0W0_soc)
     455          106 :       IF (ALLOCATED(bs_env%i_ao_start_from_atom)) DEALLOCATE (bs_env%i_ao_start_from_atom)
     456          106 :       IF (ALLOCATED(bs_env%i_ao_end_from_atom)) DEALLOCATE (bs_env%i_ao_end_from_atom)
     457          106 :       IF (ALLOCATED(bs_env%i_RI_start_from_atom)) DEALLOCATE (bs_env%i_RI_start_from_atom)
     458          106 :       IF (ALLOCATED(bs_env%i_RI_end_from_atom)) DEALLOCATE (bs_env%i_RI_end_from_atom)
     459          106 :       IF (ALLOCATED(bs_env%min_RI_idx_from_AO_AO_atom)) DEALLOCATE (bs_env%min_RI_idx_from_AO_AO_atom)
     460          106 :       IF (ALLOCATED(bs_env%max_RI_idx_from_AO_AO_atom)) DEALLOCATE (bs_env%max_RI_idx_from_AO_AO_atom)
     461          106 :       IF (ALLOCATED(bs_env%min_AO_idx_from_RI_AO_atom)) DEALLOCATE (bs_env%min_AO_idx_from_RI_AO_atom)
     462          106 :       IF (ALLOCATED(bs_env%max_AO_idx_from_RI_AO_atom)) DEALLOCATE (bs_env%max_AO_idx_from_RI_AO_atom)
     463          106 :       IF (ALLOCATED(bs_env%i_atom_intervals)) DEALLOCATE (bs_env%i_atom_intervals)
     464          106 :       IF (ALLOCATED(bs_env%j_atom_intervals)) DEALLOCATE (bs_env%j_atom_intervals)
     465          106 :       IF (ALLOCATED(bs_env%atoms_i_t_group)) DEALLOCATE (bs_env%atoms_i_t_group)
     466          106 :       IF (ALLOCATED(bs_env%atoms_j_t_group)) DEALLOCATE (bs_env%atoms_j_t_group)
     467          106 :       IF (ALLOCATED(bs_env%skip_Sigma_occ)) DEALLOCATE (bs_env%skip_Sigma_occ)
     468          106 :       IF (ALLOCATED(bs_env%skip_Sigma_vir)) DEALLOCATE (bs_env%skip_Sigma_vir)
     469          106 :       IF (ALLOCATED(bs_env%skip_chi)) DEALLOCATE (bs_env%skip_chi)
     470          106 :       IF (ALLOCATED(bs_env%read_chi)) DEALLOCATE (bs_env%read_chi)
     471          106 :       IF (ALLOCATED(bs_env%calc_chi)) DEALLOCATE (bs_env%calc_chi)
     472          106 :       IF (ALLOCATED(bs_env%Sigma_c_exists)) DEALLOCATE (bs_env%Sigma_c_exists)
     473          106 :       IF (ALLOCATED(bs_env%sizes_AO)) DEALLOCATE (bs_env%sizes_AO)
     474          106 :       IF (ALLOCATED(bs_env%sizes_RI)) DEALLOCATE (bs_env%sizes_RI)
     475          106 :       IF (ALLOCATED(bs_env%index_to_cell_3c)) DEALLOCATE (bs_env%index_to_cell_3c)
     476          106 :       IF (ALLOCATED(bs_env%index_to_cell_Delta_R)) DEALLOCATE (bs_env%index_to_cell_Delta_R)
     477          106 :       IF (ASSOCIATED(bs_env%cell_to_index_3c)) DEALLOCATE (bs_env%cell_to_index_3c)
     478          106 :       IF (ASSOCIATED(bs_env%cell_to_index_Delta_R)) DEALLOCATE (bs_env%cell_to_index_Delta_R)
     479          106 :       IF (ALLOCATED(bs_env%task_Delta_R)) DEALLOCATE (bs_env%task_Delta_R)
     480          106 :       IF (ALLOCATED(bs_env%nblocks_3c)) DEALLOCATE (bs_env%nblocks_3c)
     481          106 :       IF (ALLOCATED(bs_env%skip_DR_chi)) DEALLOCATE (bs_env%skip_DR_chi)
     482          106 :       IF (ALLOCATED(bs_env%skip_DR_Sigma)) DEALLOCATE (bs_env%skip_DR_Sigma)
     483          106 :       IF (ALLOCATED(bs_env%skip_DR_R_R2_MxM_chi)) DEALLOCATE (bs_env%skip_DR_R_R2_MxM_chi)
     484          106 :       IF (ALLOCATED(bs_env%skip_DR_R1_R_MxM_Sigma)) DEALLOCATE (bs_env%skip_DR_R1_R_MxM_Sigma)
     485          106 :       IF (ALLOCATED(bs_env%skip_DR_R12_S_Goccx3c_chi)) DEALLOCATE (bs_env%skip_DR_R12_S_Goccx3c_chi)
     486          106 :       IF (ALLOCATED(bs_env%skip_DR_R12_S_Gvirx3c_chi)) DEALLOCATE (bs_env%skip_DR_R12_S_Gvirx3c_chi)
     487          106 :       IF (ALLOCATED(bs_env%skip_DR_R1_S2_Gx3c_Sigma)) DEALLOCATE (bs_env%skip_DR_R1_S2_Gx3c_Sigma)
     488              : 
     489          106 :       CALL cp_fm_release(bs_env%fm_s_Gamma)
     490          106 :       CALL cp_fm_release(bs_env%fm_ks_Gamma(1))
     491          106 :       CALL cp_fm_release(bs_env%fm_ks_Gamma(2))
     492          106 :       CALL cp_fm_release(bs_env%fm_V_xc_Gamma(1))
     493          106 :       CALL cp_fm_release(bs_env%fm_V_xc_Gamma(2))
     494          106 :       CALL cp_fm_release(bs_env%fm_mo_coeff_Gamma(1))
     495          106 :       CALL cp_fm_release(bs_env%fm_mo_coeff_Gamma(2))
     496          106 :       CALL cp_fm_release(bs_env%fm_Gocc)
     497          106 :       CALL cp_fm_release(bs_env%fm_Gvir)
     498          106 :       CALL cp_fm_release(bs_env%fm_work_mo(1))
     499          106 :       CALL cp_fm_release(bs_env%fm_work_mo(2))
     500          106 :       CALL cp_fm_release(bs_env%fm_work_mo(3))
     501          106 :       CALL cp_fm_release(bs_env%fm_work_mo(4))
     502          106 :       CALL cp_fm_release(bs_env%fm_RI_RI)
     503          106 :       CALL cp_fm_release(bs_env%fm_chi_Gamma_freq)
     504          106 :       CALL cp_fm_release(bs_env%fm_W_MIC_freq)
     505          106 :       IF (bs_env%rtp_method == rtp_method_bse .OR. bs_env%rtp_method == rtp_method_bse_linearized) THEN
     506           66 :          CALL cp_fm_release(bs_env%fm_W_MIC_freq_zero)
     507              :       END IF
     508          106 :       CALL cp_fm_release(bs_env%fm_W_MIC_freq_1_extra)
     509          106 :       CALL cp_fm_release(bs_env%fm_W_MIC_freq_1_no_extra)
     510          106 :       CALL cp_cfm_release(bs_env%cfm_work_mo)
     511          106 :       CALL cp_cfm_release(bs_env%cfm_work_mo_2)
     512              : 
     513          106 :       CALL safe_fm_destroy_1d(bs_env%fm_G_S)
     514          106 :       CALL safe_fm_destroy_1d(bs_env%fm_Sigma_x_R)
     515          106 :       CALL safe_fm_destroy_2d(bs_env%fm_V_xc_R)
     516          106 :       CALL safe_fm_destroy_2d(bs_env%fm_chi_R_t)
     517          106 :       CALL safe_fm_destroy_2d(bs_env%fm_MWM_R_t)
     518          106 :       CALL safe_fm_destroy_3d(bs_env%fm_Sigma_c_R_neg_tau)
     519          106 :       CALL safe_fm_destroy_3d(bs_env%fm_Sigma_c_R_pos_tau)
     520              : 
     521          106 :       CALL t_destroy_2d(bs_env%t_3c_int)
     522              : 
     523          106 :       CALL release_dbcsr_p_type(bs_env%mat_ao_ao)
     524          106 :       CALL release_dbcsr_p_type(bs_env%mat_RI_RI)
     525          106 :       CALL safe_dbcsr_deallocate_matrix_set_1d(bs_env%mat_chi_Gamma_tau)
     526              : 
     527          106 :       CALL release_dbcsr_p_type(bs_env%mat_ao_ao_tensor)
     528          106 :       CALL release_dbcsr_p_type(bs_env%mat_RI_RI_tensor)
     529              : 
     530          106 :       CALL safe_cfm_destroy_1d(bs_env%cfm_s_kp)
     531          106 :       CALL safe_cfm_destroy_2d(bs_env%cfm_ks_kp)
     532          106 :       CALL safe_cfm_destroy_2d(bs_env%cfm_mo_coeff_kp)
     533              : 
     534          106 :       CALL mp_para_env_release(bs_env%para_env)
     535          106 :       IF (ASSOCIATED(bs_env%para_env_tensor)) CALL mp_para_env_release(bs_env%para_env_tensor)
     536              : 
     537          106 :       CALL safe_dbt_destroy(bs_env%t_G)
     538          106 :       CALL safe_dbt_destroy(bs_env%t_chi)
     539          106 :       CALL safe_dbt_destroy(bs_env%t_W)
     540          106 :       CALL safe_dbt_destroy(bs_env%t_RI_AO__AO)
     541          106 :       CALL safe_dbt_destroy(bs_env%t_RI__AO_AO)
     542              : 
     543          106 :       IF (ALLOCATED(bs_env%basis_set_AO)) DEALLOCATE (bs_env%basis_set_AO)
     544          106 :       IF (ALLOCATED(bs_env%basis_set_RI)) DEALLOCATE (bs_env%basis_set_RI)
     545              : 
     546              :       ! SOC cfm_1d and arrays
     547          106 :       CALL safe_dbcsr_deallocate_matrix_set_2d(bs_env%mat_V_SOC_xyz)
     548          106 :       CALL cp_fm_release(bs_env%fm_V_SOC_xyz_mo(1))
     549          106 :       CALL cp_fm_release(bs_env%fm_V_SOC_xyz_mo(2))
     550          106 :       CALL cp_fm_release(bs_env%fm_V_SOC_xyz_mo(3))
     551          106 :       CALL safe_cfm_destroy_1d(bs_env%cfm_SOC_spinor_ao)
     552              : 
     553              :       ! Deallocate RI-RS matrices
     554          106 :       IF (bs_env%ri_rs%grid_built) CALL dbcsr_release(bs_env%ri_rs%mat_phi_mu_l)
     555          106 :       IF (bs_env%ri_rs%grid_built) CALL dbcsr_release(bs_env%ri_rs%mat_Z_lP)
     556          106 :       IF (bs_env%ri_rs%V_grid_built) CALL dbcsr_release(bs_env%ri_rs%mat_V_aux_rtbse)
     557          106 :       IF (bs_env%ri_rs%W0_grid_built) CALL dbcsr_release(bs_env%ri_rs%mat_W0_grid_rtbse)
     558          106 :       IF (ALLOCATED(bs_env%ri_rs%grid_points)) DEALLOCATE (bs_env%ri_rs%grid_points)
     559          106 :       IF (ALLOCATED(bs_env%ri_rs%grid_cache)) DEALLOCATE (bs_env%ri_rs%grid_cache)
     560          106 :       IF (ALLOCATED(bs_env%ri_rs%radius_ao_per_atom)) DEALLOCATE (bs_env%ri_rs%radius_ao_per_atom)
     561          106 :       IF (ALLOCATED(bs_env%ri_rs%radius_ri_per_atom)) DEALLOCATE (bs_env%ri_rs%radius_ri_per_atom)
     562          106 :       IF (ALLOCATED(bs_env%ri_rs%chunk_centroids)) DEALLOCATE (bs_env%ri_rs%chunk_centroids)
     563          106 :       IF (ALLOCATED(bs_env%ri_rs%atom_centers)) DEALLOCATE (bs_env%ri_rs%atom_centers)
     564          106 :       IF (ALLOCATED(bs_env%ri_rs%grid_atom_boundaries)) DEALLOCATE (bs_env%ri_rs%grid_atom_boundaries)
     565          106 :       IF (ALLOCATED(bs_env%ri_rs%pan_first)) DEALLOCATE (bs_env%ri_rs%pan_first)
     566          106 :       IF (ALLOCATED(bs_env%ri_rs%pan_last)) DEALLOCATE (bs_env%ri_rs%pan_last)
     567              : 
     568          106 :       DEALLOCATE (bs_env)
     569              : 
     570          106 :       CALL timestop(handle)
     571              : 
     572          106 :    END SUBROUTINE bs_env_release
     573              : 
     574              : ! **************************************************************************************************
     575              : !> \brief ...
     576              : !> \param kpoints ...
     577              : ! **************************************************************************************************
     578          424 :    SUBROUTINE safe_kpoints_release(kpoints)
     579              :       TYPE(kpoint_type), POINTER                         :: kpoints
     580              : 
     581          424 :       IF (ASSOCIATED(kpoints)) CALL kpoint_release(kpoints)
     582              : 
     583          424 :    END SUBROUTINE safe_kpoints_release
     584              : 
     585              : ! **************************************************************************************************
     586              : !> \brief ...
     587              : !> \param dbcsr_p_type_matrix ...
     588              : ! **************************************************************************************************
     589          424 :    SUBROUTINE release_dbcsr_p_type(dbcsr_p_type_matrix)
     590              :       TYPE(dbcsr_p_type)                                 :: dbcsr_p_type_matrix
     591              : 
     592          424 :       IF (ASSOCIATED(dbcsr_p_type_matrix%matrix)) THEN
     593          418 :          CALL dbcsr_release(dbcsr_p_type_matrix%matrix)
     594          418 :          DEALLOCATE (dbcsr_p_type_matrix%matrix)
     595              :       END IF
     596              : 
     597          424 :    END SUBROUTINE release_dbcsr_p_type
     598              : 
     599              : ! **************************************************************************************************
     600              : !> \brief ...
     601              : !> \param t ...
     602              : ! **************************************************************************************************
     603          530 :    SUBROUTINE safe_dbt_destroy(t)
     604              :       TYPE(dbt_type)                                     :: t
     605              : 
     606          530 :       IF (ASSOCIATED(t%matrix_rep)) CALL dbt_destroy(t)
     607              : 
     608          530 :    END SUBROUTINE safe_dbt_destroy
     609              : 
     610              : ! **************************************************************************************************
     611              : !> \brief ...
     612              : !> \param dbcsr_array ...
     613              : ! **************************************************************************************************
     614          106 :    SUBROUTINE safe_dbcsr_deallocate_matrix_set_1d(dbcsr_array)
     615              :       TYPE(dbcsr_p_type), DIMENSION(:), POINTER          :: dbcsr_array
     616              : 
     617          106 :       IF (ASSOCIATED(dbcsr_array)) CALL dbcsr_deallocate_matrix_set(dbcsr_array)
     618              : 
     619          106 :    END SUBROUTINE safe_dbcsr_deallocate_matrix_set_1d
     620              : 
     621              : ! **************************************************************************************************
     622              : !> \brief ...
     623              : !> \param dbcsr_array ...
     624              : ! **************************************************************************************************
     625          106 :    SUBROUTINE safe_dbcsr_deallocate_matrix_set_2d(dbcsr_array)
     626              :       TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER       :: dbcsr_array
     627              : 
     628          106 :       IF (ASSOCIATED(dbcsr_array)) CALL dbcsr_deallocate_matrix_set(dbcsr_array)
     629              : 
     630          106 :    END SUBROUTINE safe_dbcsr_deallocate_matrix_set_2d
     631              : 
     632              : ! **************************************************************************************************
     633              : !> \brief ...
     634              : !> \param fm_1d ...
     635              : ! **************************************************************************************************
     636          212 :    SUBROUTINE safe_fm_destroy_1d(fm_1d)
     637              :       TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:)        :: fm_1d
     638              : 
     639              :       INTEGER                                            :: i
     640              : 
     641          212 :       IF (ALLOCATED(fm_1d)) THEN
     642          320 :          DO i = 1, SIZE(fm_1d, 1)
     643          320 :             CALL cp_fm_release(fm_1d(i))
     644              :          END DO
     645           32 :          DEALLOCATE (fm_1d)
     646              :       END IF
     647              : 
     648          212 :    END SUBROUTINE safe_fm_destroy_1d
     649              : 
     650              : ! **************************************************************************************************
     651              : !> \brief ...
     652              : !> \param fm_2d ...
     653              : ! **************************************************************************************************
     654          318 :    SUBROUTINE safe_fm_destroy_2d(fm_2d)
     655              :       TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:, :)     :: fm_2d
     656              : 
     657              :       INTEGER                                            :: i, j
     658              : 
     659          318 :       IF (ALLOCATED(fm_2d)) THEN
     660          864 :          DO i = 1, SIZE(fm_2d, 1)
     661         3264 :          DO j = 1, SIZE(fm_2d, 2)
     662         3216 :             CALL cp_fm_release(fm_2d(i, j))
     663              :          END DO
     664              :          END DO
     665           48 :          DEALLOCATE (fm_2d)
     666              :       END IF
     667              : 
     668          318 :    END SUBROUTINE safe_fm_destroy_2d
     669              : 
     670              : ! **************************************************************************************************
     671              : !> \brief ...
     672              : !> \param fm_3d ...
     673              : ! **************************************************************************************************
     674          212 :    SUBROUTINE safe_fm_destroy_3d(fm_3d)
     675              :       TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:, :, :)  :: fm_3d
     676              : 
     677              :       INTEGER                                            :: i, j, k
     678              : 
     679          212 :       IF (ALLOCATED(fm_3d)) THEN
     680          320 :          DO i = 1, SIZE(fm_3d, 1)
     681         2192 :          DO j = 1, SIZE(fm_3d, 2)
     682         4032 :          DO k = 1, SIZE(fm_3d, 3)
     683         3744 :             CALL cp_fm_release(fm_3d(i, j, k))
     684              :          END DO
     685              :          END DO
     686              :          END DO
     687           32 :          DEALLOCATE (fm_3d)
     688              :       END IF
     689              : 
     690          212 :    END SUBROUTINE safe_fm_destroy_3d
     691              : 
     692              : ! **************************************************************************************************
     693              : !> \brief ...
     694              : !> \param cfm_1d ...
     695              : ! **************************************************************************************************
     696          212 :    SUBROUTINE safe_cfm_destroy_1d(cfm_1d)
     697              :       TYPE(cp_cfm_type), ALLOCATABLE, DIMENSION(:)       :: cfm_1d
     698              : 
     699              :       INTEGER                                            :: i
     700              : 
     701          212 :       IF (ALLOCATED(cfm_1d)) THEN
     702          716 :          DO i = 1, SIZE(cfm_1d, 1)
     703          716 :             CALL cp_cfm_release(cfm_1d(i))
     704              :          END DO
     705           40 :          DEALLOCATE (cfm_1d)
     706              :       END IF
     707              : 
     708          212 :    END SUBROUTINE safe_cfm_destroy_1d
     709              : 
     710              : ! **************************************************************************************************
     711              : !> \brief ...
     712              : !> \param cfm_2d ...
     713              : ! **************************************************************************************************
     714          212 :    SUBROUTINE safe_cfm_destroy_2d(cfm_2d)
     715              :       TYPE(cp_cfm_type), ALLOCATABLE, DIMENSION(:, :)    :: cfm_2d
     716              : 
     717              :       INTEGER                                            :: i, j
     718              : 
     719          212 :       IF (ALLOCATED(cfm_2d)) THEN
     720          740 :          DO i = 1, SIZE(cfm_2d, 1)
     721         1444 :          DO j = 1, SIZE(cfm_2d, 2)
     722         1408 :             CALL cp_cfm_release(cfm_2d(i, j))
     723              :          END DO
     724              :          END DO
     725           36 :          DEALLOCATE (cfm_2d)
     726              :       END IF
     727              : 
     728          212 :    END SUBROUTINE safe_cfm_destroy_2d
     729              : 
     730              : ! **************************************************************************************************
     731              : !> \brief ...
     732              : !> \param t_2d ...
     733              : ! **************************************************************************************************
     734          106 :    SUBROUTINE t_destroy_2d(t_2d)
     735              :       TYPE(dbt_type), ALLOCATABLE, DIMENSION(:, :)       :: t_2d
     736              : 
     737              :       INTEGER                                            :: i, j
     738              : 
     739          106 :       IF (ALLOCATED(t_2d)) THEN
     740          194 :          DO i = 1, SIZE(t_2d, 1)
     741         2260 :             DO j = 1, SIZE(t_2d, 2)
     742         2244 :                CALL dbt_destroy(t_2d(i, j))
     743              :             END DO
     744              :          END DO
     745         2082 :          DEALLOCATE (t_2d)
     746              :       END IF
     747              : 
     748          106 :    END SUBROUTINE t_destroy_2d
     749              : 
     750            0 : END MODULE post_scf_bandstructure_types
        

Generated by: LCOV version 2.0-1