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