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