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