LCOV - code coverage report
Current view: top level - src - post_scf_bandstructure_types.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:9ccafda) Lines: 99.4 % 175 174
Test Date: 2026-10-15 00:55:44 Functions: 60.0 % 20 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 atomic_kind_types,               ONLY: atomic_kind_type
      15              :    USE basis_set_types,                 ONLY: gto_basis_set_p_type
      16              :    USE cell_types,                      ONLY: cell_type
      17              :    USE cp_cfm_types,                    ONLY: cp_cfm_release,&
      18              :                                               cp_cfm_type
      19              :    USE cp_dbcsr_api,                    ONLY: dbcsr_p_type,&
      20              :                                               dbcsr_release,&
      21              :                                               dbcsr_type
      22              :    USE cp_dbcsr_operations,             ONLY: dbcsr_deallocate_matrix_set
      23              :    USE cp_fm_types,                     ONLY: cp_fm_release,&
      24              :                                               cp_fm_type
      25              :    USE dbt_api,                         ONLY: dbt_destroy,&
      26              :                                               dbt_type
      27              :    USE gw_auto_ri_types,                ONLY: auto_ri_release,&
      28              :                                               auto_ri_type
      29              :    USE input_constants,                 ONLY: G0W0,&
      30              :                                               cohsex_off,&
      31              :                                               tensor_small_cell_full_kp
      32              :    USE kinds,                           ONLY: default_path_length,&
      33              :                                               default_string_length,&
      34              :                                               dp,&
      35              :                                               int_4,&
      36              :                                               int_8
      37              :    USE kpoint_types,                    ONLY: kpoint_release,&
      38              :                                               kpoint_type
      39              :    USE libint_2c_3c,                    ONLY: libint_potential_type
      40              :    USE message_passing,                 ONLY: mp_para_env_release,&
      41              :                                               mp_para_env_type
      42              :    USE particle_types,                  ONLY: particle_type
      43              :    USE physcon,                         ONLY: angstrom,&
      44              :                                               evolt
      45              :    USE qs_tensors_types,                ONLY: neighbor_list_3c_type
      46              :    USE time_frequency_grids,            ONLY: time_frequency_grid_release,&
      47              :                                               time_frequency_grid_type
      48              : #include "./base/base_uses.f90"
      49              : 
      50              :    IMPLICIT NONE
      51              : 
      52              :    PRIVATE
      53              : 
      54              :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'post_scf_bandstructure_types'
      55              : 
      56              :    PUBLIC :: post_scf_bandstructure_type, ri_rs_env, &
      57              :              rirs_grid_type, ri_rs_grid_opt_type, band_edges_type, bs_env_release
      58              : 
      59              :    ! valence band maximum (VBM), conduction band minimum (CBM), direct band gap (DBG),
      60              :    ! indirect band gap (IDBG)
      61              :    TYPE band_edges_type
      62              :       REAL(KIND=dp)                                   :: VBM = -1.0_dp, &
      63              :                                                          CBM = -1.0_dp, &
      64              :                                                          DBG = -1.0_dp, &
      65              :                                                          IDBG = -1.0_dp, &
      66              :                                                          E_fermi = -1.0_dp
      67              :    END TYPE band_edges_type
      68              : 
      69              :    ! data types for GW RI-RS code
      70              :    TYPE rirs_grid_type
      71              :       INTEGER                    :: npts = 0
      72              :       REAL(KIND=dp), ALLOCATABLE :: raw_points(:, :)
      73              :    END TYPE rirs_grid_type
      74              : 
      75              :    ! User input for the in-memory GW RI-RS grid optimization.
      76              :    TYPE ri_rs_grid_opt_type
      77              :       LOGICAL                                          :: enabled = .FALSE.
      78              :       REAL(KIND=dp)                                    :: cutoff_atomic_cluster = 3.0_dp/angstrom
      79              :       REAL(KIND=dp)                                    :: rs_ao_ratio = 5.0_dp
      80              :       INTEGER                                          :: max_iter = 300
      81              :    END TYPE ri_rs_grid_opt_type
      82              : 
      83              :    TYPE ri_rs_env
      84              : 
      85              :       ! Input parameters for RI-RS
      86              :       INTEGER                                          :: grid_select = 1
      87              :       REAL(KIND=dp)                                    :: tikhonov = 1.0E-08_dp
      88              :       REAL(KIND=dp)                                    :: cutoff_radius_ri_ao = -1.0_dp
      89              :       REAL(KIND=dp)                                    :: cutoff_radius_v_w = -1.0_dp
      90              :       TYPE(ri_rs_grid_opt_type)                        :: grid_opt
      91              : 
      92              :       ! Geometry references used by RI-RS grid setup and optimization.
      93              :       ! They remain owned by qs_env and must never be deallocated here.
      94              :       TYPE(cell_type), POINTER                         :: cell => NULL()
      95              :       TYPE(particle_type), DIMENSION(:), POINTER       :: particle_set => NULL()
      96              :       TYPE(atomic_kind_type), DIMENSION(:), POINTER    :: atomic_kind_set => NULL()
      97              : 
      98              :       ! Eigenvalue self-consistency (evGW0): G is rebuilt from the quasiparticle energies of
      99              :       ! the previous cycle while W stays frozen at the RPA@DFT level.
     100              :       INTEGER                                          :: evgw0_iter = 20
     101              :       REAL(KIND=dp)                                    :: evgw0_eps_iter = 5.0E-5_dp
     102              :       ! index of the running evGW0 cycle
     103              :       INTEGER                                          :: evgw0_i_iter = 0
     104              : 
     105              :       ! Data types for cutoffs based DBCSR matrices
     106              :       REAL(KIND=dp), ALLOCATABLE                       :: chunk_centroids(:, :)
     107              :       INTEGER, ALLOCATABLE                             :: grid_atom_boundaries(:)
     108              :       INTEGER, ALLOCATABLE                             :: pan_first(:), pan_last(:)
     109              : 
     110              :       ! Atom-specific grids used directly by the GW grid assembler
     111              :       TYPE(rirs_grid_type), ALLOCATABLE                :: atomic_grids(:)
     112              : 
     113              :       ! Data types for storing RI-RS matrices
     114              :       INTEGER                                          :: n_grid_points = 0
     115              :       TYPE(dbcsr_type)                                 :: mat_phi_mu_l
     116              :       TYPE(dbcsr_type)                                 :: mat_Z_lP
     117              :       REAL(KIND=dp), ALLOCATABLE                       :: grid_points(:, :)
     118              :       LOGICAL                                          :: Z_lP_exists = .FALSE.
     119              : 
     120              :       ! Spatial extent of most diffuse Gaussian primitive of AO/RI basis for each atom
     121              :       REAL(KIND=dp), ALLOCATABLE                       :: radius_ao_per_atom(:)
     122              :       REAL(KIND=dp), ALLOCATABLE                       :: radius_ri_per_atom(:)
     123              : 
     124              :       ! Precomputed grid-basis kernels for RT-BSE
     125              :       ! mat_V_aux_rtbse(P, Q) = truncated-Coulomb V_PQ with M^-1 sandwich (RI x RI);
     126              :       ! the Hartree grid kernel Z V Z^T is applied factorized, never materialized
     127              :       ! mat_W0_grid_rtbse(l, l') = sum_PQ  Z_lP W^{w=0}_PQ Z_l'Q
     128              :       TYPE(dbcsr_type)                                 :: mat_V_aux_rtbse
     129              :       TYPE(dbcsr_type)                                 :: mat_W0_grid_rtbse
     130              : 
     131              :       ! RTBSE%EPS_FILTER_RHO: cuts Delta-rho_AO in compute_sigma_ri_rs, also cuts SEX and Hartree
     132              :       REAL(KIND=dp)                                    :: eps_filter_rho = -1.0_dp
     133              : 
     134              :       ! RTBSE%CUTOFF_RADIUS_W0 (bohr): drops grid block pairs of W0 beyond this distance.
     135              :       ! BSE-only: the GW quasiparticle energies use their own &GW CUTOFF_RADIUS_* family.
     136              :       REAL(KIND=dp)                                    :: cutoff_radius_w0 = -1.0_dp
     137              : 
     138              :       ! Set TRUE once mat_phi_mu_l and mat_Z_lP have been populated in memory (by GW RI-RS
     139              :       ! or on-demand by the RT-BSE RI-RS kernel path).
     140              :       LOGICAL                                          :: grid_built = .FALSE.
     141              : 
     142              :       ! Independent toggles for V_grid / W0_grid availability
     143              :       LOGICAL                                          :: V_grid_built = .FALSE.
     144              :       LOGICAL                                          :: W0_grid_built = .FALSE.
     145              : 
     146              :    END TYPE ri_rs_env
     147              : 
     148              :    TYPE post_scf_bandstructure_type
     149              : 
     150              :       ! decide which calculations will be done
     151              :       LOGICAL                                         :: do_gw = .FALSE., &
     152              :                                                          do_soc = .FALSE., &
     153              :                                                          do_ldos = .FALSE., &
     154              :                                                          do_gw_ri_rs = .FALSE., &
     155              :                                                          do_dos_pdos = .FALSE., &
     156              :                                                          do_floquet = .FALSE., &
     157              :                                                          do_static_cohsex = .FALSE.
     158              : 
     159              :       ! various eigenvalues computed in GW code, some depend on k-points
     160              :       ! and have therefore three dimensions (band index, k-point, spin)
     161              :       !
     162              :       ! eigenval_GW carries the quasiparticle energies of the highest-level GW flavour requested
     163              :       !   eigenval_G0W0  - the G0W0 result
     164              :       !   eigenval_evGW0 - the evGW0 result
     165              :       REAL(KIND=dp), DIMENSION(:, :), ALLOCATABLE     :: eigenval_scf_Gamma
     166              :       REAL(KIND=dp), DIMENSION(:, :, :), ALLOCATABLE  :: eigenval_scf, &
     167              :                                                          eigenval_GW, &
     168              :                                                          eigenval_G0W0, &
     169              :                                                          eigenval_evGW0, &
     170              :                                                          eigenval_HF
     171              :       TYPE(band_edges_type)                           :: band_edges_scf = band_edges_type(), &
     172              :                                                          band_edges_GW = band_edges_type(), &
     173              :                                                          band_edges_HF = band_edges_type()
     174              : 
     175              :       ! parameters that influence the GW flavor
     176              :       LOGICAL                                         :: do_hedin_shift = .FALSE.
     177              :       ! which GW flavour was requested; constants from input_constants (G0W0, evGW0, ...)
     178              :       INTEGER                                         :: gw_flavour = G0W0
     179              : 
     180              :       ! parameters for static COHSEX approximation to GW
     181              :       ! static COHSEX: OFF, DIAGONAL (ϵ^DG only) or QP_UPDATE (also diagonalization, ϵ^CN, MOs)
     182              :       INTEGER                                         :: cohsex_flavor = cohsex_off
     183              :       REAL(KIND=dp)                                   :: cohsex_scale_occ = 1.0_dp, &
     184              :                                                          cohsex_scale_virt = 1.0_dp
     185              : 
     186              :       ! parameters for RI-RS implementation of GW
     187              :       TYPE(ri_rs_env)                                 :: ri_rs
     188              : 
     189              :       ! Parameters for automatic RI basis set optimization.
     190              :       TYPE(auto_ri_type)                              :: auto_ri = auto_ri_type()
     191              : 
     192              :       ! DBCSR stores each rank's matrix panel in one MPI message whose length is stored in a
     193              :       ! 32-bit default INTEGER (dbcsr_mpiwrap.F: msglen = SIZE(buffer)). Exceeding this ceiling
     194              :       ! overflows the count to a negative/garbage value and multiply_cannon segfaults. This is
     195              :       ! that hard limit in elements (= HUGE(int_4) = 2^31-1), the same bound DBCSR uses
     196              :       ! internally as mp_max_memory_size. Panel sizing keeps every per-rank message below it.
     197              :       INTEGER(KIND=int_8)                             :: dbcsr_msg_elem_limit = &
     198              :                                                          INT(HUGE(0_int_4), int_8)
     199              : 
     200              :       ! general parameters on molecular orbitals and basis sets
     201              :       ! Number of real states; entries above it are linear-dependency placeholders, not states.
     202              :       INTEGER                                      :: n_mo_retained = -1
     203              :       INTEGER                                      :: n_ao = -1, &
     204              :                                                       n_RI = -1, &
     205              :                                                       n_spin = -1, &
     206              :                                                       n_atom = -1, &
     207              :                                                       max_AO_bf_per_atom = -1
     208              :       INTEGER, DIMENSION(:), ALLOCATABLE           :: i_ao_start_from_atom, &
     209              :                                                       i_ao_end_from_atom, &
     210              :                                                       i_RI_start_from_atom, &
     211              :                                                       i_RI_end_from_atom
     212              :       INTEGER, DIMENSION(:, :), ALLOCATABLE         :: min_RI_idx_from_AO_AO_atom, &
     213              :                                                        max_RI_idx_from_AO_AO_atom, &
     214              :                                                        min_AO_idx_from_RI_AO_atom, &
     215              :                                                        max_AO_idx_from_RI_AO_atom
     216              :       INTEGER, DIMENSION(2)                        :: n_occ = -1, &
     217              :                                                       n_vir = -1
     218              :       INTEGER, DIMENSION(2)                        :: n_electron = -1
     219              :       ! n_occ above is the HOMO index: under smearing,
     220              :       ! not the true T=0 electron count. n_occ_nosmear is the smearing-independent
     221              :       ! NINT(nelectron/maxocc) count, used only to center the SOC truncation window.
     222              :       INTEGER, DIMENSION(2)                        :: n_occ_nosmear = -1
     223              :       LOGICAL                                      :: do_smear = .FALSE.
     224              :       INTEGER                                      :: smear_method = -1
     225              :       REAL(KIND=dp)                                :: smear_width = 0.0_dp
     226              :       REAL(KIND=dp)                                :: fixed_mag_mom = -1.0_dp
     227              :       REAL(KIND=dp)                                :: spin_degeneracy = -1.0_dp
     228              :       REAL(KIND=dp), DIMENSION(2)                  :: e_fermi = -1.0_dp
     229              : 
     230              :       ! kpoint mesh for chi, eps, W
     231              :       INTEGER, DIMENSION(:), POINTER               :: nkp_grid_DOS_input => NULL(), &
     232              :                                                       nkp_grid_chi_eps_W_input => NULL()
     233              :       INTEGER, DIMENSION(3)                        :: nkp_grid_chi_eps_W_orig = -1, &
     234              :                                                       nkp_grid_chi_eps_W_extra = -1
     235              :       INTEGER                                      :: nkp_chi_eps_W_orig = -1, &
     236              :                                                       nkp_chi_eps_W_orig_plus_extra = -1, &
     237              :                                                       nkp_chi_eps_W_batch = -1, &
     238              :                                                       num_chi_eps_W_batches = -1, &
     239              :                                                       size_lattice_sum_V = -1
     240              :       TYPE(kpoint_type), POINTER                   :: kpoints_chi_eps_W => NULL(), &
     241              :                                                       kpoints_DOS => NULL()
     242              :       LOGICAL                                      :: approx_kp_extrapol = .FALSE.
     243              : 
     244              :       REAL(KIND=dp)                                :: wkp_orig = -1.0_dp
     245              :       REAL(KIND=dp), DIMENSION(:), ALLOCATABLE     :: wkp_s_p, &
     246              :                                                       wkp_no_extra
     247              :       INTEGER, DIMENSION(:), ALLOCATABLE           :: l_RI
     248              :       INTEGER                                      :: input_kp_bs_npoints = -1, &
     249              :                                                       input_kp_bs_n_sp_pts = -1, &
     250              :                                                       nkp_bs_and_DOS = -1, &
     251              :                                                       nkp_only_bs = -1, &
     252              :                                                       nkp_only_DOS = -1
     253              :       REAL(KIND=dp), DIMENSION(:, :), ALLOCATABLE  :: xkp_special
     254              : 
     255              :       ! parameters for GW band structure calculation with k-points
     256              :       INTEGER                                      :: gw_implementation = -1, &
     257              :                                                       nimages_scf = -1
     258              :       INTEGER, DIMENSION(3)                        :: periodic = -1
     259              :       LOGICAL                                      :: do_periodic = .FALSE.
     260              :       REAL(KIND=dp), DIMENSION(3, 3)               :: hmat = -1.0_dp
     261              : 
     262              :       ! imaginary time and frequency grids
     263              :       INTEGER                                      :: num_time_freq_points = -1, &
     264              :                                                       num_freq_points_fit = -1
     265              :       TYPE(time_frequency_grid_type)               :: time_frequency_grid
     266              :       REAL(KIND=dp), DIMENSION(:), ALLOCATABLE     :: imag_freq_points_fit
     267              :       INTEGER                                      :: nparam_pade = -1, &
     268              :                                                       num_points_per_magnitude = -1
     269              :       REAL(KIND=dp)                                :: freq_max_fit = -1.0_dp, &
     270              :                                                       input_regularization_minimax = -1.0_dp, &
     271              :                                                       regularization_minimax = -1.0_dp, &
     272              :                                                       stabilize_exp = -1.0_dp
     273              : 
     274              :       ! filter threshold for matrix-tensor operations
     275              :       REAL(KIND=dp)                                :: eps_filter = -1.0_dp, &
     276              :                                                       eps_atom_grid_2d_mat = -1.0_dp
     277              : 
     278              :       ! threshold for inverting ao overlap matrix, RI cfm_1d
     279              :       REAL(KIND=dp)                                :: eps_eigval_mat_s = -1.0_dp, &
     280              :                                                       eps_eigval_mat_RI = -1.0_dp, &
     281              :                                                       input_regularization_RI = -1.0_dp, &
     282              :                                                       regularization_RI = -1.0_dp
     283              : 
     284              :       ! global full cfm_1d used in GW
     285              :       TYPE(cp_fm_type)                             :: fm_s_Gamma = cp_fm_type(), &
     286              :                                                       fm_Gocc = cp_fm_type(), &
     287              :                                                       fm_Gvir = cp_fm_type()
     288              :       TYPE(cp_fm_type), DIMENSION(2)               :: fm_ks_Gamma = cp_fm_type(), &
     289              :                                                       fm_V_xc_Gamma = cp_fm_type(), &
     290              :                                                       fm_mo_coeff_Gamma = cp_fm_type()
     291              :       TYPE(cp_fm_type), DIMENSION(4)               :: fm_work_mo = cp_fm_type()
     292              :       TYPE(cp_fm_type)                             :: fm_RI_RI = cp_fm_type(), &
     293              :                                                       fm_Minv_Gamma = cp_fm_type(), &
     294              :                                                       fm_chi_Gamma_freq = cp_fm_type(), &
     295              :                                                       fm_W_MIC_freq = cp_fm_type(), &
     296              :                                                       fm_W_MIC_freq_1_extra = cp_fm_type(), &
     297              :                                                       fm_W_MIC_freq_1_no_extra = cp_fm_type(), &
     298              :                                                       fm_W_MIC_freq_zero = cp_fm_type()
     299              :       TYPE(cp_cfm_type)                            :: cfm_work_mo = cp_cfm_type(), &
     300              :                                                       cfm_work_mo_2 = cp_cfm_type()
     301              : 
     302              :       ! global dbcsr cfm_1d used in GW
     303              :       TYPE(dbcsr_p_type)                           :: mat_ao_ao = dbcsr_p_type(), &
     304              :                                                       mat_RI_RI = dbcsr_p_type()
     305              :       TYPE(dbcsr_p_type), DIMENSION(:), POINTER    :: mat_chi_Gamma_tau => NULL()
     306              : 
     307              :       ! local dbcsr cfm_1d used in GW (local in tensor group)
     308              :       TYPE(dbcsr_p_type)                           :: mat_ao_ao_tensor = dbcsr_p_type(), &
     309              :                                                       mat_RI_RI_tensor = dbcsr_p_type()
     310              : 
     311              :       ! tensors for sparse matrix-tensor operations
     312              : #if defined(FTN_NO_DEFAULT_INIT)
     313              :       TYPE(dbt_type)                               :: t_G, &
     314              :                                                       t_chi, &
     315              :                                                       t_W, &
     316              :                                                       t_RI_AO__AO, &
     317              :                                                       t_RI__AO_AO
     318              : #else
     319              :       TYPE(dbt_type)                               :: t_G = dbt_type(), &
     320              :                                                       t_chi = dbt_type(), &
     321              :                                                       t_W = dbt_type(), &
     322              :                                                       t_RI_AO__AO = dbt_type(), &
     323              :                                                       t_RI__AO_AO = dbt_type()
     324              : #endif
     325              : 
     326              :       ! parameters and data for parallelization
     327              :       INTEGER                                      :: group_size_tensor = -1, &
     328              :                                                       tensor_group_color = -1, &
     329              :                                                       num_tensor_groups = -1
     330              :       REAL(KIND=dp)                                :: input_memory_per_proc_GB = -1.0_dp
     331              :       LOGICAL                                      :: auto_memory_per_proc = .FALSE.
     332              :       TYPE(mp_para_env_type), POINTER              :: para_env => NULL(), &
     333              :                                                       para_env_tensor => NULL()
     334              :       REAL(KIND=dp)                                :: occupation_3c_int = -1.0_dp, &
     335              :                                                       max_dist_AO_atoms = -1.0_dp, &
     336              :                                                       safety_factor_memory = -1.0_dp
     337              : 
     338              :       ! parallelization: atom range i and atom range j for tensor group
     339              :       INTEGER, DIMENSION(2)                        :: atoms_i = -1, &
     340              :                                                       atoms_j = -1
     341              :       INTEGER                                      :: n_atom_i = -1, &
     342              :                                                       n_intervals_i = -1, &
     343              :                                                       n_atom_j = -1, &
     344              :                                                       n_intervals_j = -1, &
     345              :                                                       n_intervals_inner_loop_atoms = -1, &
     346              :                                                       n_skip_sigma = -1, &
     347              :                                                       n_skip_chi = -1
     348              :       INTEGER, DIMENSION(:, :), ALLOCATABLE        :: i_atom_intervals, &
     349              :                                                       j_atom_intervals, &
     350              :                                                       inner_loop_atom_intervals, &
     351              :                                                       atoms_i_t_group, &
     352              :                                                       atoms_j_t_group
     353              :       LOGICAL, DIMENSION(:, :), ALLOCATABLE        :: skip_Sigma_occ, &
     354              :                                                       skip_Sigma_vir, &
     355              :                                                       skip_chi
     356              :       ! rtbse_method (Stepan Marek)
     357              :       INTEGER                                      :: rtp_method = -1
     358              :       ! what PROPERTIES%BSE needs the GW to keep for it; set at init, read at the W(0) and de-init
     359              :       ! sites; the consumer frees both itself once read
     360              :       LOGICAL                                      :: keep_W_freq_zero = .FALSE., &
     361              :                                                       keep_3c_nl = .FALSE.
     362              : 
     363              :       ! check-arrays and names for restarting
     364              :       LOGICAL, DIMENSION(:), ALLOCATABLE           :: read_chi, &
     365              :                                                       calc_chi
     366              :       LOGICAL, DIMENSION(:, :), ALLOCATABLE        :: Sigma_c_exists
     367              :       LOGICAL                                      :: all_W_exist = .FALSE., &
     368              :                                                       Sigma_x_exists = .FALSE., &
     369              :                                                       Sigma_c_freq_zero_exists = .FALSE.
     370              :       CHARACTER(LEN=3)                             :: chi_name = "chi"
     371              :       CHARACTER(LEN=6)                             :: W_time_name = "W_time"
     372              :       CHARACTER(LEN=7)                             :: Sigma_x_name = "Sigma_x"
     373              :       CHARACTER(LEN=17)                            :: Sigma_c_freq_zero_name = "Sigma_c_freq_zero"
     374              :       CHARACTER(LEN=13)                            :: Sigma_p_name = "Sigma_pos_tau", &
     375              :                                                       Sigma_n_name = "Sigma_neg_tau"
     376              :       CHARACTER(LEN=default_path_length)           :: prefix = ""
     377              :       INTEGER                                      :: unit_nr = -1
     378              : 
     379              :       ! parameters and data for basis sets
     380              :       TYPE(gto_basis_set_p_type), &
     381              :          DIMENSION(:), ALLOCATABLE                 :: basis_set_AO, &
     382              :                                                       basis_set_RI
     383              :       INTEGER, DIMENSION(:), ALLOCATABLE           :: sizes_AO, &
     384              :                                                       sizes_RI
     385              :       TYPE(neighbor_list_3c_type)                  :: nl_3c = neighbor_list_3c_type()
     386              :       TYPE(libint_potential_type)                  :: ri_metric = libint_potential_type(), &
     387              :                                                       trunc_coulomb = libint_potential_type()
     388              : 
     389              :       ! parameters for SOC calculation
     390              :       REAL(KIND=dp)                                :: soc_window_occ = -1.0_dp
     391              :       REAL(KIND=dp)                                :: soc_window_virt = -1.0_dp
     392              :       REAL(KIND=dp)                                :: soc_window_smearing = 1.0_dp/evolt
     393              :       INTEGER                                      :: soc_nbands_occ = -1.0_dp
     394              :       INTEGER                                      :: soc_nbands_virt = -1.0_dp
     395              : 
     396              :       ! sizes: mat_V_SOC_xyz: xyz, img
     397              :       TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: mat_V_SOC_xyz => NULL()
     398              :       ! small-cell GW: dimension = number of kpoints; large-cell GW: Gamma-point, dimension = 1
     399              :       TYPE(cp_cfm_type), DIMENSION(:), ALLOCATABLE :: cfm_SOC_spinor_ao
     400              : 
     401              :       ! parameters for DOS and PDOS calculation
     402              :       REAL(KIND=dp)                                :: energy_window_DOS = -1.0_dp, &
     403              :                                                       energy_step_DOS = -1.0_dp, &
     404              :                                                       broadening_DOS = -1.0_dp
     405              : 
     406              :       ! parameters for LDOS calculation (LDOS: local density of states)
     407              :       INTEGER                                      :: int_ldos_xyz = -1
     408              :       INTEGER, DIMENSION(:), POINTER               :: bin_mesh => NULL()
     409              :       INTEGER                                      :: n_bins_max_for_printing = -1
     410              :       REAL(KIND=dp)                                :: unit_ldos_int_z_inv_Ang2_eV = -1.0_dp
     411              : 
     412              :       ! parameters for Floquet band structure calculations
     413              :       INTEGER                                      :: max_floquet_index = -1
     414              :       INTEGER                                      :: max_nmo_floquet = -1
     415              :       REAL(KIND=dp), DIMENSION(:), POINTER         :: floquet_polarisation => NULL(), &
     416              :                                                       floquet_phi => NULL()
     417              :       REAL(KIND=dp)                                :: floquet_omega = -1.0_dp, &
     418              :                                                       floquet_amplitude = -1.0_dp, &
     419              :                                                       eps_floquet = -1.0_dp, &
     420              :                                                       broadening_floquet = -1.0_dp, &
     421              :                                                       energy_step_floquet = -1.0_dp, &
     422              :                                                       energy_window_floquet = -1.0_dp, &
     423              :                                                       floquet_mem_fill_fraction = -1.0_dp, &
     424              :                                                       floquet_temperature = -1.0_dp
     425              :       CHARACTER(LEN=default_string_length)         :: floquet_dos_file = "", &
     426              :                                                       floquet_qe_file = "", &
     427              :                                                       floquet_bs_file = ""
     428              : 
     429              :       ! quantities only needed for small cells and k-point sampling in DFT (tensor_small_cell_full_kp)
     430              :       INTEGER                                      :: nkp_scf_desymm = -1, &
     431              :                                                       nimages_3c = -1, &
     432              :                                                       nimages_scf_desymm = -1, &
     433              :                                                       nimages_Delta_R = -1
     434              :       TYPE(kpoint_type), POINTER                   :: kpoints_scf_desymm => NULL()
     435              :       INTEGER, DIMENSION(3)                        :: cell_grid_scf_desymm = -1
     436              :       INTEGER, DIMENSION(:, :), ALLOCATABLE        :: index_to_cell_3c, &
     437              :                                                       index_to_cell_Delta_R
     438              :       INTEGER, DIMENSION(:, :, :), POINTER         :: cell_to_index_3c => NULL(), &
     439              :                                                       cell_to_index_Delta_R => NULL()
     440              :       REAL(KIND=dp)                                :: heuristic_filter_factor = -1.0_dp
     441              : 
     442              :       ! tensor_small_cell_full_kp parallelization
     443              :       INTEGER                                      :: n_tasks_Delta_R_local = -1
     444              :       INTEGER, DIMENSION(:), ALLOCATABLE           :: task_Delta_R
     445              :       INTEGER, DIMENSION(:, :), ALLOCATABLE        :: nblocks_3c
     446              :       LOGICAL, DIMENSION(:), ALLOCATABLE           :: skip_DR_chi, &
     447              :                                                       skip_DR_Sigma
     448              :       LOGICAL, DIMENSION(:, :, :), ALLOCATABLE     :: skip_DR_R_R2_MxM_chi, &
     449              :                                                       skip_DR_R1_R_MxM_Sigma, &
     450              :                                                       skip_DR_R12_S_Goccx3c_chi, &
     451              :                                                       skip_DR_R12_S_Gvirx3c_chi, &
     452              :                                                       skip_DR_R1_S2_Gx3c_Sigma
     453              : 
     454              :       ! cfm for k-dep overl mat S_µν(k), KS mat h_µν(k,spin) and mo coeff C_μn(k,spin) from SCF
     455              :       TYPE(cp_cfm_type), DIMENSION(:), ALLOCATABLE      :: cfm_s_kp
     456              :       TYPE(cp_cfm_type), DIMENSION(:, :), ALLOCATABLE   :: cfm_mo_coeff_kp, &
     457              :                                                            cfm_ks_kp
     458              :       TYPE(cp_fm_type), DIMENSION(:), ALLOCATABLE       :: fm_G_S, &
     459              :                                                            fm_Sigma_x_R
     460              :       TYPE(cp_fm_type), DIMENSION(:, :), ALLOCATABLE    :: fm_V_xc_R, &
     461              :                                                            fm_chi_R_t, &
     462              :                                                            fm_MWM_R_t
     463              :       TYPE(cp_fm_type), DIMENSION(:, :, :), ALLOCATABLE :: fm_Sigma_c_R_neg_tau, &
     464              :                                                            fm_Sigma_c_R_pos_tau
     465              :       REAL(KIND=dp), DIMENSION(:, :, :), ALLOCATABLE    :: v_xc_n
     466              :       TYPE(dbt_type), ALLOCATABLE, DIMENSION(:, :)      :: t_3c_int
     467              : 
     468              :    END TYPE post_scf_bandstructure_type
     469              : 
     470              :    ! Sanity bounds on a quasiparticle gap (Hartree): inverted below -eps_qp_gap, diverged above max_qp_gap
     471              :    REAL(KIND=dp), PARAMETER, PUBLIC                   :: eps_qp_gap = 0.01_dp/evolt, &
     472              :                                                          max_qp_gap = 200.0_dp/evolt
     473              : 
     474              : CONTAINS
     475              : 
     476              : ! **************************************************************************************************
     477              : !> \brief ...
     478              : !> \param bs_env ...
     479              : ! **************************************************************************************************
     480          140 :    SUBROUTINE bs_env_release(bs_env)
     481              :       TYPE(post_scf_bandstructure_type), POINTER         :: bs_env
     482              : 
     483              :       CHARACTER(LEN=*), PARAMETER                        :: routineN = 'bs_env_release'
     484              : 
     485              :       INTEGER                                            :: handle
     486              : 
     487          140 :       CALL timeset(routineN, handle)
     488              : 
     489          140 :       CPASSERT(ASSOCIATED(bs_env))
     490              : 
     491          140 :       CALL safe_kpoints_release(bs_env%kpoints_chi_eps_W)
     492          140 :       CALL safe_kpoints_release(bs_env%kpoints_DOS)
     493          140 :       CALL safe_kpoints_release(bs_env%kpoints_scf_desymm)
     494              : 
     495          140 :       IF (ALLOCATED(bs_env%wkp_s_p)) DEALLOCATE (bs_env%wkp_s_p)
     496          140 :       IF (ALLOCATED(bs_env%wkp_no_extra)) DEALLOCATE (bs_env%wkp_no_extra)
     497          140 :       IF (ALLOCATED(bs_env%l_RI)) DEALLOCATE (bs_env%l_RI)
     498          140 :       IF (ALLOCATED(bs_env%xkp_special)) DEALLOCATE (bs_env%xkp_special)
     499          140 :       CALL time_frequency_grid_release(bs_env%time_frequency_grid)
     500          140 :       IF (ALLOCATED(bs_env%eigenval_scf_Gamma)) DEALLOCATE (bs_env%eigenval_scf_Gamma)
     501          140 :       IF (ALLOCATED(bs_env%eigenval_scf)) DEALLOCATE (bs_env%eigenval_scf)
     502          140 :       IF (ALLOCATED(bs_env%eigenval_GW)) DEALLOCATE (bs_env%eigenval_GW)
     503          140 :       IF (ALLOCATED(bs_env%eigenval_G0W0)) DEALLOCATE (bs_env%eigenval_G0W0)
     504          140 :       IF (ALLOCATED(bs_env%eigenval_HF)) DEALLOCATE (bs_env%eigenval_HF)
     505          140 :       IF (ALLOCATED(bs_env%eigenval_evGW0)) DEALLOCATE (bs_env%eigenval_evGW0)
     506          140 :       IF (ALLOCATED(bs_env%i_ao_start_from_atom)) DEALLOCATE (bs_env%i_ao_start_from_atom)
     507          140 :       IF (ALLOCATED(bs_env%i_ao_end_from_atom)) DEALLOCATE (bs_env%i_ao_end_from_atom)
     508          140 :       IF (ALLOCATED(bs_env%i_RI_start_from_atom)) DEALLOCATE (bs_env%i_RI_start_from_atom)
     509          140 :       IF (ALLOCATED(bs_env%i_RI_end_from_atom)) DEALLOCATE (bs_env%i_RI_end_from_atom)
     510          140 :       IF (ALLOCATED(bs_env%min_RI_idx_from_AO_AO_atom)) DEALLOCATE (bs_env%min_RI_idx_from_AO_AO_atom)
     511          140 :       IF (ALLOCATED(bs_env%max_RI_idx_from_AO_AO_atom)) DEALLOCATE (bs_env%max_RI_idx_from_AO_AO_atom)
     512          140 :       IF (ALLOCATED(bs_env%min_AO_idx_from_RI_AO_atom)) DEALLOCATE (bs_env%min_AO_idx_from_RI_AO_atom)
     513          140 :       IF (ALLOCATED(bs_env%max_AO_idx_from_RI_AO_atom)) DEALLOCATE (bs_env%max_AO_idx_from_RI_AO_atom)
     514          140 :       IF (ALLOCATED(bs_env%i_atom_intervals)) DEALLOCATE (bs_env%i_atom_intervals)
     515          140 :       IF (ALLOCATED(bs_env%j_atom_intervals)) DEALLOCATE (bs_env%j_atom_intervals)
     516          140 :       IF (ALLOCATED(bs_env%atoms_i_t_group)) DEALLOCATE (bs_env%atoms_i_t_group)
     517          140 :       IF (ALLOCATED(bs_env%atoms_j_t_group)) DEALLOCATE (bs_env%atoms_j_t_group)
     518          140 :       IF (ALLOCATED(bs_env%skip_Sigma_occ)) DEALLOCATE (bs_env%skip_Sigma_occ)
     519          140 :       IF (ALLOCATED(bs_env%skip_Sigma_vir)) DEALLOCATE (bs_env%skip_Sigma_vir)
     520          140 :       IF (ALLOCATED(bs_env%skip_chi)) DEALLOCATE (bs_env%skip_chi)
     521          140 :       IF (ALLOCATED(bs_env%read_chi)) DEALLOCATE (bs_env%read_chi)
     522          140 :       IF (ALLOCATED(bs_env%calc_chi)) DEALLOCATE (bs_env%calc_chi)
     523          140 :       IF (ALLOCATED(bs_env%Sigma_c_exists)) DEALLOCATE (bs_env%Sigma_c_exists)
     524          140 :       IF (ALLOCATED(bs_env%sizes_AO)) DEALLOCATE (bs_env%sizes_AO)
     525          140 :       IF (ALLOCATED(bs_env%sizes_RI)) DEALLOCATE (bs_env%sizes_RI)
     526          140 :       IF (ALLOCATED(bs_env%index_to_cell_3c)) DEALLOCATE (bs_env%index_to_cell_3c)
     527          140 :       IF (ALLOCATED(bs_env%index_to_cell_Delta_R)) DEALLOCATE (bs_env%index_to_cell_Delta_R)
     528          140 :       IF (ASSOCIATED(bs_env%cell_to_index_3c)) DEALLOCATE (bs_env%cell_to_index_3c)
     529          140 :       IF (ASSOCIATED(bs_env%cell_to_index_Delta_R)) DEALLOCATE (bs_env%cell_to_index_Delta_R)
     530          140 :       IF (ALLOCATED(bs_env%task_Delta_R)) DEALLOCATE (bs_env%task_Delta_R)
     531          140 :       IF (ALLOCATED(bs_env%nblocks_3c)) DEALLOCATE (bs_env%nblocks_3c)
     532          140 :       IF (ALLOCATED(bs_env%skip_DR_chi)) DEALLOCATE (bs_env%skip_DR_chi)
     533          140 :       IF (ALLOCATED(bs_env%skip_DR_Sigma)) DEALLOCATE (bs_env%skip_DR_Sigma)
     534          140 :       IF (ALLOCATED(bs_env%skip_DR_R_R2_MxM_chi)) DEALLOCATE (bs_env%skip_DR_R_R2_MxM_chi)
     535          140 :       IF (ALLOCATED(bs_env%skip_DR_R1_R_MxM_Sigma)) DEALLOCATE (bs_env%skip_DR_R1_R_MxM_Sigma)
     536          140 :       IF (ALLOCATED(bs_env%skip_DR_R12_S_Goccx3c_chi)) DEALLOCATE (bs_env%skip_DR_R12_S_Goccx3c_chi)
     537          140 :       IF (ALLOCATED(bs_env%skip_DR_R12_S_Gvirx3c_chi)) DEALLOCATE (bs_env%skip_DR_R12_S_Gvirx3c_chi)
     538          140 :       IF (ALLOCATED(bs_env%skip_DR_R1_S2_Gx3c_Sigma)) DEALLOCATE (bs_env%skip_DR_R1_S2_Gx3c_Sigma)
     539              : 
     540          140 :       CALL cp_fm_release(bs_env%fm_s_Gamma)
     541          140 :       CALL cp_fm_release(bs_env%fm_ks_Gamma(1))
     542          140 :       CALL cp_fm_release(bs_env%fm_ks_Gamma(2))
     543          140 :       CALL cp_fm_release(bs_env%fm_V_xc_Gamma(1))
     544          140 :       CALL cp_fm_release(bs_env%fm_V_xc_Gamma(2))
     545          140 :       CALL cp_fm_release(bs_env%fm_mo_coeff_Gamma(1))
     546          140 :       CALL cp_fm_release(bs_env%fm_mo_coeff_Gamma(2))
     547          140 :       CALL cp_fm_release(bs_env%fm_Gocc)
     548          140 :       CALL cp_fm_release(bs_env%fm_Gvir)
     549          140 :       CALL cp_fm_release(bs_env%fm_work_mo(1))
     550          140 :       CALL cp_fm_release(bs_env%fm_work_mo(2))
     551          140 :       CALL cp_fm_release(bs_env%fm_work_mo(3))
     552          140 :       CALL cp_fm_release(bs_env%fm_work_mo(4))
     553          140 :       CALL cp_fm_release(bs_env%fm_RI_RI)
     554          140 :       CALL cp_fm_release(bs_env%fm_Minv_Gamma)
     555          140 :       CALL cp_fm_release(bs_env%fm_chi_Gamma_freq)
     556          140 :       CALL cp_fm_release(bs_env%fm_W_MIC_freq)
     557          140 :       CALL cp_fm_release(bs_env%fm_W_MIC_freq_zero)
     558          140 :       CALL cp_fm_release(bs_env%fm_W_MIC_freq_1_extra)
     559          140 :       CALL cp_fm_release(bs_env%fm_W_MIC_freq_1_no_extra)
     560          140 :       CALL cp_cfm_release(bs_env%cfm_work_mo)
     561          140 :       CALL cp_cfm_release(bs_env%cfm_work_mo_2)
     562              : 
     563          140 :       CALL safe_fm_destroy_1d(bs_env%fm_G_S)
     564          140 :       CALL safe_fm_destroy_1d(bs_env%fm_Sigma_x_R)
     565          140 :       CALL safe_fm_destroy_2d(bs_env%fm_V_xc_R)
     566          140 :       CALL safe_fm_destroy_2d(bs_env%fm_chi_R_t)
     567          140 :       CALL safe_fm_destroy_2d(bs_env%fm_MWM_R_t)
     568          140 :       CALL safe_fm_destroy_3d(bs_env%fm_Sigma_c_R_neg_tau)
     569          140 :       CALL safe_fm_destroy_3d(bs_env%fm_Sigma_c_R_pos_tau)
     570              : 
     571          140 :       CALL t_destroy_2d(bs_env%t_3c_int)
     572              : 
     573          140 :       CALL release_dbcsr_p_type(bs_env%mat_ao_ao)
     574          140 :       CALL release_dbcsr_p_type(bs_env%mat_RI_RI)
     575          140 :       CALL safe_dbcsr_deallocate_matrix_set_1d(bs_env%mat_chi_Gamma_tau)
     576              : 
     577          140 :       CALL release_dbcsr_p_type(bs_env%mat_ao_ao_tensor)
     578          140 :       CALL release_dbcsr_p_type(bs_env%mat_RI_RI_tensor)
     579              : 
     580          140 :       CALL safe_cfm_destroy_1d(bs_env%cfm_s_kp)
     581          140 :       CALL safe_cfm_destroy_2d(bs_env%cfm_ks_kp)
     582          140 :       CALL safe_cfm_destroy_2d(bs_env%cfm_mo_coeff_kp)
     583              : 
     584          140 :       CALL mp_para_env_release(bs_env%para_env)
     585          140 :       IF (ASSOCIATED(bs_env%para_env_tensor)) CALL mp_para_env_release(bs_env%para_env_tensor)
     586              : 
     587          140 :       CALL safe_dbt_destroy(bs_env%t_G)
     588          140 :       CALL safe_dbt_destroy(bs_env%t_chi)
     589          140 :       CALL safe_dbt_destroy(bs_env%t_W)
     590          140 :       CALL safe_dbt_destroy(bs_env%t_RI_AO__AO)
     591          140 :       CALL safe_dbt_destroy(bs_env%t_RI__AO_AO)
     592              : 
     593          140 :       IF (ALLOCATED(bs_env%basis_set_AO)) DEALLOCATE (bs_env%basis_set_AO)
     594          140 :       IF (ALLOCATED(bs_env%basis_set_RI)) DEALLOCATE (bs_env%basis_set_RI)
     595              : 
     596              :       ! SOC cfm_1d and arrays
     597          140 :       CALL safe_dbcsr_deallocate_matrix_set_2d(bs_env%mat_V_SOC_xyz)
     598          140 :       CALL safe_cfm_destroy_1d(bs_env%cfm_SOC_spinor_ao)
     599              : 
     600              :       ! Deallocate RI-RS matrices
     601          140 :       IF (bs_env%ri_rs%grid_built) CALL dbcsr_release(bs_env%ri_rs%mat_phi_mu_l)
     602          140 :       IF (bs_env%ri_rs%grid_built) CALL dbcsr_release(bs_env%ri_rs%mat_Z_lP)
     603          140 :       IF (bs_env%ri_rs%V_grid_built) CALL dbcsr_release(bs_env%ri_rs%mat_V_aux_rtbse)
     604          140 :       IF (bs_env%ri_rs%W0_grid_built) CALL dbcsr_release(bs_env%ri_rs%mat_W0_grid_rtbse)
     605          140 :       IF (ALLOCATED(bs_env%ri_rs%grid_points)) DEALLOCATE (bs_env%ri_rs%grid_points)
     606          140 :       IF (ALLOCATED(bs_env%ri_rs%atomic_grids)) DEALLOCATE (bs_env%ri_rs%atomic_grids)
     607          140 :       IF (ALLOCATED(bs_env%ri_rs%radius_ao_per_atom)) DEALLOCATE (bs_env%ri_rs%radius_ao_per_atom)
     608          140 :       IF (ALLOCATED(bs_env%ri_rs%radius_ri_per_atom)) DEALLOCATE (bs_env%ri_rs%radius_ri_per_atom)
     609          140 :       IF (ALLOCATED(bs_env%ri_rs%chunk_centroids)) DEALLOCATE (bs_env%ri_rs%chunk_centroids)
     610          140 :       IF (ALLOCATED(bs_env%ri_rs%grid_atom_boundaries)) DEALLOCATE (bs_env%ri_rs%grid_atom_boundaries)
     611          140 :       NULLIFY (bs_env%ri_rs%atomic_kind_set, bs_env%ri_rs%cell, bs_env%ri_rs%particle_set)
     612          140 :       IF (ALLOCATED(bs_env%ri_rs%pan_first)) DEALLOCATE (bs_env%ri_rs%pan_first)
     613          140 :       IF (ALLOCATED(bs_env%ri_rs%pan_last)) DEALLOCATE (bs_env%ri_rs%pan_last)
     614          140 :       CALL auto_ri_release(bs_env%auto_ri)
     615              : 
     616          140 :       DEALLOCATE (bs_env)
     617              : 
     618          140 :       CALL timestop(handle)
     619              : 
     620          140 :    END SUBROUTINE bs_env_release
     621              : 
     622              : ! **************************************************************************************************
     623              : !> \brief ...
     624              : !> \param kpoints ...
     625              : ! **************************************************************************************************
     626          420 :    SUBROUTINE safe_kpoints_release(kpoints)
     627              :       TYPE(kpoint_type), POINTER                         :: kpoints
     628              : 
     629          420 :       IF (ASSOCIATED(kpoints)) CALL kpoint_release(kpoints)
     630              : 
     631          420 :    END SUBROUTINE safe_kpoints_release
     632              : 
     633              : ! **************************************************************************************************
     634              : !> \brief ...
     635              : !> \param dbcsr_p_type_matrix ...
     636              : ! **************************************************************************************************
     637          560 :    SUBROUTINE release_dbcsr_p_type(dbcsr_p_type_matrix)
     638              :       TYPE(dbcsr_p_type)                                 :: dbcsr_p_type_matrix
     639              : 
     640          560 :       IF (ASSOCIATED(dbcsr_p_type_matrix%matrix)) THEN
     641          474 :          CALL dbcsr_release(dbcsr_p_type_matrix%matrix)
     642          474 :          DEALLOCATE (dbcsr_p_type_matrix%matrix)
     643              :       END IF
     644              : 
     645          560 :    END SUBROUTINE release_dbcsr_p_type
     646              : 
     647              : ! **************************************************************************************************
     648              : !> \brief ...
     649              : !> \param t ...
     650              : ! **************************************************************************************************
     651          700 :    SUBROUTINE safe_dbt_destroy(t)
     652              :       TYPE(dbt_type)                                     :: t
     653              : 
     654          700 :       IF (ASSOCIATED(t%matrix_rep)) CALL dbt_destroy(t)
     655              : 
     656          700 :    END SUBROUTINE safe_dbt_destroy
     657              : 
     658              : ! **************************************************************************************************
     659              : !> \brief ...
     660              : !> \param dbcsr_array ...
     661              : ! **************************************************************************************************
     662          140 :    SUBROUTINE safe_dbcsr_deallocate_matrix_set_1d(dbcsr_array)
     663              :       TYPE(dbcsr_p_type), DIMENSION(:), POINTER          :: dbcsr_array
     664              : 
     665          140 :       IF (ASSOCIATED(dbcsr_array)) CALL dbcsr_deallocate_matrix_set(dbcsr_array)
     666              : 
     667          140 :    END SUBROUTINE safe_dbcsr_deallocate_matrix_set_1d
     668              : 
     669              : ! **************************************************************************************************
     670              : !> \brief ...
     671              : !> \param dbcsr_array ...
     672              : ! **************************************************************************************************
     673          140 :    SUBROUTINE safe_dbcsr_deallocate_matrix_set_2d(dbcsr_array)
     674              :       TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER       :: dbcsr_array
     675              : 
     676          140 :       IF (ASSOCIATED(dbcsr_array)) CALL dbcsr_deallocate_matrix_set(dbcsr_array)
     677              : 
     678          140 :    END SUBROUTINE safe_dbcsr_deallocate_matrix_set_2d
     679              : 
     680              : ! **************************************************************************************************
     681              : !> \brief ...
     682              : !> \param fm_1d ...
     683              : ! **************************************************************************************************
     684          280 :    SUBROUTINE safe_fm_destroy_1d(fm_1d)
     685              :       TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:)        :: fm_1d
     686              : 
     687              :       INTEGER                                            :: i
     688              : 
     689          280 :       IF (ALLOCATED(fm_1d)) THEN
     690          320 :          DO i = 1, SIZE(fm_1d, 1)
     691          320 :             CALL cp_fm_release(fm_1d(i))
     692              :          END DO
     693           32 :          DEALLOCATE (fm_1d)
     694              :       END IF
     695              : 
     696          280 :    END SUBROUTINE safe_fm_destroy_1d
     697              : 
     698              : ! **************************************************************************************************
     699              : !> \brief ...
     700              : !> \param fm_2d ...
     701              : ! **************************************************************************************************
     702          420 :    SUBROUTINE safe_fm_destroy_2d(fm_2d)
     703              :       TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:, :)     :: fm_2d
     704              : 
     705              :       INTEGER                                            :: i, j
     706              : 
     707          420 :       IF (ALLOCATED(fm_2d)) THEN
     708          864 :          DO i = 1, SIZE(fm_2d, 1)
     709         3264 :          DO j = 1, SIZE(fm_2d, 2)
     710         3216 :             CALL cp_fm_release(fm_2d(i, j))
     711              :          END DO
     712              :          END DO
     713           48 :          DEALLOCATE (fm_2d)
     714              :       END IF
     715              : 
     716          420 :    END SUBROUTINE safe_fm_destroy_2d
     717              : 
     718              : ! **************************************************************************************************
     719              : !> \brief ...
     720              : !> \param fm_3d ...
     721              : ! **************************************************************************************************
     722          280 :    SUBROUTINE safe_fm_destroy_3d(fm_3d)
     723              :       TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:, :, :)  :: fm_3d
     724              : 
     725              :       INTEGER                                            :: i, j, k
     726              : 
     727          280 :       IF (ALLOCATED(fm_3d)) THEN
     728          320 :          DO i = 1, SIZE(fm_3d, 1)
     729         2192 :          DO j = 1, SIZE(fm_3d, 2)
     730         4032 :          DO k = 1, SIZE(fm_3d, 3)
     731         3744 :             CALL cp_fm_release(fm_3d(i, j, k))
     732              :          END DO
     733              :          END DO
     734              :          END DO
     735           32 :          DEALLOCATE (fm_3d)
     736              :       END IF
     737              : 
     738          280 :    END SUBROUTINE safe_fm_destroy_3d
     739              : 
     740              : ! **************************************************************************************************
     741              : !> \brief ...
     742              : !> \param cfm_1d ...
     743              : ! **************************************************************************************************
     744          280 :    SUBROUTINE safe_cfm_destroy_1d(cfm_1d)
     745              :       TYPE(cp_cfm_type), ALLOCATABLE, DIMENSION(:)       :: cfm_1d
     746              : 
     747              :       INTEGER                                            :: i
     748              : 
     749          280 :       IF (ALLOCATED(cfm_1d)) THEN
     750          716 :          DO i = 1, SIZE(cfm_1d, 1)
     751          716 :             CALL cp_cfm_release(cfm_1d(i))
     752              :          END DO
     753           40 :          DEALLOCATE (cfm_1d)
     754              :       END IF
     755              : 
     756          280 :    END SUBROUTINE safe_cfm_destroy_1d
     757              : 
     758              : ! **************************************************************************************************
     759              : !> \brief ...
     760              : !> \param cfm_2d ...
     761              : ! **************************************************************************************************
     762          280 :    SUBROUTINE safe_cfm_destroy_2d(cfm_2d)
     763              :       TYPE(cp_cfm_type), ALLOCATABLE, DIMENSION(:, :)    :: cfm_2d
     764              : 
     765              :       INTEGER                                            :: i, j
     766              : 
     767          280 :       IF (ALLOCATED(cfm_2d)) THEN
     768          740 :          DO i = 1, SIZE(cfm_2d, 1)
     769         1444 :          DO j = 1, SIZE(cfm_2d, 2)
     770         1408 :             CALL cp_cfm_release(cfm_2d(i, j))
     771              :          END DO
     772              :          END DO
     773           36 :          DEALLOCATE (cfm_2d)
     774              :       END IF
     775              : 
     776          280 :    END SUBROUTINE safe_cfm_destroy_2d
     777              : 
     778              : ! **************************************************************************************************
     779              : !> \brief ...
     780              : !> \param t_2d ...
     781              : ! **************************************************************************************************
     782          140 :    SUBROUTINE t_destroy_2d(t_2d)
     783              :       TYPE(dbt_type), ALLOCATABLE, DIMENSION(:, :)       :: t_2d
     784              : 
     785              :       INTEGER                                            :: i, j
     786              : 
     787          140 :       IF (ALLOCATED(t_2d)) THEN
     788          194 :          DO i = 1, SIZE(t_2d, 1)
     789         2260 :             DO j = 1, SIZE(t_2d, 2)
     790         2244 :                CALL dbt_destroy(t_2d(i, j))
     791              :             END DO
     792              :          END DO
     793         2082 :          DEALLOCATE (t_2d)
     794              :       END IF
     795              : 
     796          140 :    END SUBROUTINE t_destroy_2d
     797              : 
     798            0 : END MODULE post_scf_bandstructure_types
        

Generated by: LCOV version 2.0-1