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