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