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