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 gw_auto_ri_types, ONLY: auto_ri_release,&
25 : auto_ri_type
26 : USE input_constants, ONLY: G0W0,&
27 : cohsex_off,&
28 : tensor_small_cell_full_kp
29 : USE kinds, ONLY: default_path_length,&
30 : default_string_length,&
31 : dp,&
32 : int_4,&
33 : int_8
34 : USE kpoint_types, ONLY: kpoint_release,&
35 : kpoint_type
36 : USE libint_2c_3c, ONLY: libint_potential_type
37 : USE message_passing, ONLY: mp_para_env_release,&
38 : mp_para_env_type
39 : USE physcon, ONLY: evolt
40 : USE qs_tensors_types, ONLY: neighbor_list_3c_type
41 : USE ri_rs_types, ONLY: ri_rs_env,&
42 : ri_rs_release
43 : USE time_frequency_grids, ONLY: time_frequency_grid_release,&
44 : time_frequency_grid_type
45 : #include "./base/base_uses.f90"
46 :
47 : IMPLICIT NONE
48 :
49 : PRIVATE
50 :
51 : CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'post_scf_bandstructure_types'
52 :
53 : PUBLIC :: post_scf_bandstructure_type, band_edges_type, bs_env_release
54 :
55 : ! valence band maximum (VBM), conduction band minimum (CBM), direct band gap (DBG),
56 : ! indirect band gap (IDBG)
57 : TYPE band_edges_type
58 : REAL(KIND=dp) :: VBM = -1.0_dp, &
59 : CBM = -1.0_dp, &
60 : DBG = -1.0_dp, &
61 : IDBG = -1.0_dp, &
62 : E_fermi = -1.0_dp
63 : END TYPE band_edges_type
64 :
65 : TYPE post_scf_bandstructure_type
66 :
67 : ! decide which calculations will be done
68 : LOGICAL :: do_gw = .FALSE., &
69 : do_soc = .FALSE., &
70 : do_ldos = .FALSE., &
71 : do_gw_ri_rs = .FALSE., &
72 : do_dos_pdos = .FALSE., &
73 : do_floquet = .FALSE., &
74 : do_static_cohsex = .FALSE.
75 :
76 : ! various eigenvalues computed in GW code, some depend on k-points
77 : ! and have therefore three dimensions (band index, k-point, spin)
78 : !
79 : ! eigenval_GW carries the quasiparticle energies of the highest-level GW flavour requested
80 : ! eigenval_G0W0 - the G0W0 result
81 : ! eigenval_evGW0 - the evGW0 result
82 : REAL(KIND=dp), DIMENSION(:, :), ALLOCATABLE :: eigenval_scf_Gamma
83 : REAL(KIND=dp), DIMENSION(:, :, :), ALLOCATABLE :: eigenval_scf, &
84 : eigenval_GW, &
85 : eigenval_G0W0, &
86 : eigenval_evGW0, &
87 : eigenval_HF
88 : TYPE(band_edges_type) :: band_edges_scf = band_edges_type(), &
89 : band_edges_GW = band_edges_type(), &
90 : band_edges_HF = band_edges_type()
91 :
92 : ! parameters that influence the GW flavor
93 : LOGICAL :: do_hedin_shift = .FALSE.
94 : ! which GW flavour was requested; constants from input_constants (G0W0, evGW0, ...)
95 : INTEGER :: gw_flavour = G0W0
96 :
97 : ! parameters for static COHSEX approximation to GW
98 : ! static COHSEX: OFF, DIAGONAL (ϵ^DG only) or QP_UPDATE (also diagonalization, ϵ^CN, MOs)
99 : INTEGER :: cohsex_flavor = cohsex_off
100 : REAL(KIND=dp) :: cohsex_scale_occ = 1.0_dp, &
101 : cohsex_scale_virt = 1.0_dp
102 :
103 : ! parameters for RI-RS implementation of GW
104 : TYPE(ri_rs_env) :: ri_rs
105 : ! Eigenvalue self-consistency settings and current GW iteration.
106 : INTEGER :: evgw0_iter = 20
107 : REAL(KIND=dp) :: evgw0_eps_iter = 5.0E-5_dp
108 : INTEGER :: evgw0_i_iter = 0
109 :
110 : ! Parameters for automatic RI basis set optimization.
111 : TYPE(auto_ri_type) :: auto_ri = auto_ri_type()
112 :
113 : ! DBCSR stores each rank's matrix panel in one MPI message whose length is stored in a
114 : ! 32-bit default INTEGER (dbcsr_mpiwrap.F: msglen = SIZE(buffer)). Exceeding this ceiling
115 : ! overflows the count to a negative/garbage value and multiply_cannon segfaults. This is
116 : ! that hard limit in elements (= HUGE(int_4) = 2^31-1), the same bound DBCSR uses
117 : ! internally as mp_max_memory_size. Panel sizing keeps every per-rank message below it.
118 : INTEGER(KIND=int_8) :: dbcsr_msg_elem_limit = &
119 : INT(HUGE(0_int_4), int_8)
120 :
121 : ! general parameters on molecular orbitals and basis sets
122 : ! Number of real states; entries above it are linear-dependency placeholders, not states.
123 : INTEGER :: n_mo_retained = -1
124 : INTEGER :: n_ao = -1, &
125 : n_RI = -1, &
126 : n_spin = -1, &
127 : n_atom = -1, &
128 : max_AO_bf_per_atom = -1
129 : INTEGER, DIMENSION(:), ALLOCATABLE :: i_ao_start_from_atom, &
130 : i_ao_end_from_atom, &
131 : i_RI_start_from_atom, &
132 : i_RI_end_from_atom
133 : INTEGER, DIMENSION(:, :), ALLOCATABLE :: min_RI_idx_from_AO_AO_atom, &
134 : max_RI_idx_from_AO_AO_atom, &
135 : min_AO_idx_from_RI_AO_atom, &
136 : max_AO_idx_from_RI_AO_atom
137 : INTEGER, DIMENSION(2) :: n_occ = -1, &
138 : n_vir = -1
139 : INTEGER, DIMENSION(2) :: n_electron = -1
140 : ! n_occ above is the HOMO index: under smearing,
141 : ! not the true T=0 electron count. n_occ_nosmear is the smearing-independent
142 : ! NINT(nelectron/maxocc) count, used only to center the SOC truncation window.
143 : INTEGER, DIMENSION(2) :: n_occ_nosmear = -1
144 : LOGICAL :: do_smear = .FALSE.
145 : INTEGER :: smear_method = -1
146 : REAL(KIND=dp) :: smear_width = 0.0_dp
147 : REAL(KIND=dp) :: fixed_mag_mom = -1.0_dp
148 : REAL(KIND=dp) :: spin_degeneracy = -1.0_dp
149 : REAL(KIND=dp), DIMENSION(2) :: e_fermi = -1.0_dp
150 :
151 : ! kpoint mesh for chi, eps, W
152 : INTEGER, DIMENSION(:), POINTER :: nkp_grid_DOS_input => NULL(), &
153 : nkp_grid_chi_eps_W_input => NULL()
154 : INTEGER, DIMENSION(3) :: nkp_grid_chi_eps_W_orig = -1, &
155 : nkp_grid_chi_eps_W_extra = -1
156 : INTEGER :: nkp_chi_eps_W_orig = -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 with k-points
177 : INTEGER :: gw_implementation = -1, &
178 : nimages_scf = -1
179 : INTEGER, DIMENSION(3) :: periodic = -1
180 : LOGICAL :: do_periodic = .FALSE.
181 : REAL(KIND=dp), DIMENSION(3, 3) :: hmat = -1.0_dp
182 :
183 : ! imaginary time and frequency grids
184 : INTEGER :: num_time_freq_points = -1, &
185 : num_freq_points_fit = -1
186 : TYPE(time_frequency_grid_type) :: time_frequency_grid
187 : REAL(KIND=dp), DIMENSION(:), ALLOCATABLE :: imag_freq_points_fit
188 : INTEGER :: nparam_pade = -1, &
189 : num_points_per_magnitude = -1
190 : REAL(KIND=dp) :: freq_max_fit = -1.0_dp, &
191 : input_regularization_minimax = -1.0_dp, &
192 : regularization_minimax = -1.0_dp, &
193 : stabilize_exp = -1.0_dp
194 :
195 : ! filter threshold for matrix-tensor operations
196 : REAL(KIND=dp) :: eps_filter = -1.0_dp, &
197 : eps_atom_grid_2d_mat = -1.0_dp
198 :
199 : ! threshold for inverting ao overlap matrix, RI cfm_1d
200 : REAL(KIND=dp) :: eps_eigval_mat_s = -1.0_dp, &
201 : eps_eigval_mat_RI = -1.0_dp, &
202 : input_regularization_RI = -1.0_dp, &
203 : regularization_RI = -1.0_dp
204 :
205 : ! global full cfm_1d used in GW
206 : TYPE(cp_fm_type) :: fm_s_Gamma = cp_fm_type(), &
207 : fm_Gocc = cp_fm_type(), &
208 : fm_Gvir = cp_fm_type()
209 : TYPE(cp_fm_type), DIMENSION(2) :: fm_ks_Gamma = cp_fm_type(), &
210 : fm_V_xc_Gamma = cp_fm_type(), &
211 : fm_mo_coeff_Gamma = cp_fm_type()
212 : TYPE(cp_fm_type), DIMENSION(4) :: fm_work_mo = cp_fm_type()
213 : TYPE(cp_fm_type) :: fm_RI_RI = cp_fm_type(), &
214 : fm_Minv_Gamma = cp_fm_type(), &
215 : fm_chi_Gamma_freq = cp_fm_type(), &
216 : fm_W_MIC_freq = cp_fm_type(), &
217 : fm_W_MIC_freq_1_extra = cp_fm_type(), &
218 : fm_W_MIC_freq_1_no_extra = cp_fm_type(), &
219 : fm_W_MIC_freq_zero = cp_fm_type()
220 : TYPE(cp_cfm_type) :: cfm_work_mo = cp_cfm_type(), &
221 : cfm_work_mo_2 = cp_cfm_type()
222 :
223 : ! global dbcsr cfm_1d used in GW
224 : TYPE(dbcsr_p_type) :: mat_ao_ao = dbcsr_p_type(), &
225 : mat_RI_RI = dbcsr_p_type()
226 : TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: mat_chi_Gamma_tau => NULL()
227 :
228 : ! local dbcsr cfm_1d used in GW (local in tensor group)
229 : TYPE(dbcsr_p_type) :: mat_ao_ao_tensor = dbcsr_p_type(), &
230 : mat_RI_RI_tensor = dbcsr_p_type()
231 :
232 : ! tensors for sparse matrix-tensor operations
233 : #if defined(FTN_NO_DEFAULT_INIT)
234 : TYPE(dbt_type) :: t_G, &
235 : t_chi, &
236 : t_W, &
237 : t_RI_AO__AO, &
238 : t_RI__AO_AO
239 : #else
240 : TYPE(dbt_type) :: t_G = dbt_type(), &
241 : t_chi = dbt_type(), &
242 : t_W = dbt_type(), &
243 : t_RI_AO__AO = dbt_type(), &
244 : t_RI__AO_AO = dbt_type()
245 : #endif
246 :
247 : ! parameters and data for parallelization
248 : INTEGER :: group_size_tensor = -1, &
249 : tensor_group_color = -1, &
250 : num_tensor_groups = -1
251 : REAL(KIND=dp) :: input_memory_per_proc_GB = -1.0_dp
252 : LOGICAL :: auto_memory_per_proc = .FALSE.
253 : TYPE(mp_para_env_type), POINTER :: para_env => NULL(), &
254 : para_env_tensor => NULL()
255 : REAL(KIND=dp) :: occupation_3c_int = -1.0_dp, &
256 : max_dist_AO_atoms = -1.0_dp, &
257 : safety_factor_memory = -1.0_dp
258 :
259 : ! parallelization: atom range i and atom range j for tensor group
260 : INTEGER, DIMENSION(2) :: atoms_i = -1, &
261 : atoms_j = -1
262 : INTEGER :: n_atom_i = -1, &
263 : n_intervals_i = -1, &
264 : n_atom_j = -1, &
265 : n_intervals_j = -1, &
266 : n_intervals_inner_loop_atoms = -1, &
267 : n_skip_sigma = -1, &
268 : n_skip_chi = -1
269 : INTEGER, DIMENSION(:, :), ALLOCATABLE :: i_atom_intervals, &
270 : j_atom_intervals, &
271 : inner_loop_atom_intervals, &
272 : atoms_i_t_group, &
273 : atoms_j_t_group
274 : LOGICAL, DIMENSION(:, :), ALLOCATABLE :: skip_Sigma_occ, &
275 : skip_Sigma_vir, &
276 : skip_chi
277 : ! rtbse_method (Stepan Marek)
278 : INTEGER :: rtp_method = -1
279 : ! what PROPERTIES%BSE needs the GW to keep for it; set at init, read at the W(0) and de-init
280 : ! sites; the consumer frees both itself once read
281 : LOGICAL :: keep_W_freq_zero = .FALSE., &
282 : keep_3c_nl = .FALSE.
283 :
284 : ! check-arrays and names for restarting
285 : LOGICAL, DIMENSION(:), ALLOCATABLE :: read_chi, &
286 : calc_chi
287 : LOGICAL, DIMENSION(:, :), ALLOCATABLE :: Sigma_c_exists
288 : LOGICAL :: all_W_exist = .FALSE., &
289 : Sigma_x_exists = .FALSE., &
290 : Sigma_c_freq_zero_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=17) :: Sigma_c_freq_zero_name = "Sigma_c_freq_zero"
295 : CHARACTER(LEN=13) :: Sigma_p_name = "Sigma_pos_tau", &
296 : Sigma_n_name = "Sigma_neg_tau"
297 : CHARACTER(LEN=default_path_length) :: prefix = ""
298 : INTEGER :: unit_nr = -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 : INTEGER :: soc_nbands_occ = -1.0_dp
315 : INTEGER :: soc_nbands_virt = -1.0_dp
316 :
317 : ! sizes: mat_V_SOC_xyz: xyz, img
318 : TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: mat_V_SOC_xyz => NULL()
319 : ! small-cell GW: dimension = number of kpoints; large-cell GW: Gamma-point, dimension = 1
320 : TYPE(cp_cfm_type), DIMENSION(:), ALLOCATABLE :: cfm_SOC_spinor_ao
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 : INTEGER :: max_nmo_floquet = -1
336 : REAL(KIND=dp), DIMENSION(:), POINTER :: floquet_polarisation => NULL(), &
337 : floquet_phi => NULL()
338 : REAL(KIND=dp) :: floquet_omega = -1.0_dp, &
339 : floquet_amplitude = -1.0_dp, &
340 : eps_floquet = -1.0_dp, &
341 : broadening_floquet = -1.0_dp, &
342 : energy_step_floquet = -1.0_dp, &
343 : energy_window_floquet = -1.0_dp, &
344 : floquet_mem_fill_fraction = -1.0_dp, &
345 : floquet_temperature = -1.0_dp
346 : CHARACTER(LEN=default_string_length) :: floquet_dos_file = "", &
347 : floquet_qe_file = "", &
348 : floquet_bs_file = ""
349 :
350 : ! quantities only needed for small cells and k-point sampling in DFT (tensor_small_cell_full_kp)
351 : INTEGER :: nkp_scf_desymm = -1, &
352 : nimages_3c = -1, &
353 : nimages_scf_desymm = -1, &
354 : nimages_Delta_R = -1
355 : TYPE(kpoint_type), POINTER :: kpoints_scf_desymm => NULL()
356 : INTEGER, DIMENSION(3) :: cell_grid_scf_desymm = -1
357 : INTEGER, DIMENSION(:, :), ALLOCATABLE :: index_to_cell_3c, &
358 : index_to_cell_Delta_R
359 : INTEGER, DIMENSION(:, :, :), POINTER :: cell_to_index_3c => NULL(), &
360 : cell_to_index_Delta_R => NULL()
361 : REAL(KIND=dp) :: heuristic_filter_factor = -1.0_dp
362 :
363 : ! tensor_small_cell_full_kp parallelization
364 : INTEGER :: n_tasks_Delta_R_local = -1
365 : INTEGER, DIMENSION(:), ALLOCATABLE :: task_Delta_R
366 : INTEGER, DIMENSION(:, :), ALLOCATABLE :: nblocks_3c
367 : LOGICAL, DIMENSION(:), ALLOCATABLE :: skip_DR_chi, &
368 : skip_DR_Sigma
369 : LOGICAL, DIMENSION(:, :, :), ALLOCATABLE :: skip_DR_R_R2_MxM_chi, &
370 : skip_DR_R1_R_MxM_Sigma, &
371 : skip_DR_R12_S_Goccx3c_chi, &
372 : skip_DR_R12_S_Gvirx3c_chi, &
373 : skip_DR_R1_S2_Gx3c_Sigma
374 :
375 : ! cfm for k-dep overl mat S_µν(k), KS mat h_µν(k,spin) and mo coeff C_μn(k,spin) from SCF
376 : TYPE(cp_cfm_type), DIMENSION(:), ALLOCATABLE :: cfm_s_kp
377 : TYPE(cp_cfm_type), DIMENSION(:, :), ALLOCATABLE :: cfm_mo_coeff_kp, &
378 : cfm_ks_kp
379 : TYPE(cp_fm_type), DIMENSION(:), ALLOCATABLE :: fm_G_S, &
380 : fm_Sigma_x_R
381 : TYPE(cp_fm_type), DIMENSION(:, :), ALLOCATABLE :: fm_V_xc_R, &
382 : fm_chi_R_t, &
383 : fm_MWM_R_t
384 : TYPE(cp_fm_type), DIMENSION(:, :, :), ALLOCATABLE :: fm_Sigma_c_R_neg_tau, &
385 : fm_Sigma_c_R_pos_tau
386 : REAL(KIND=dp), DIMENSION(:, :, :), ALLOCATABLE :: v_xc_n
387 : TYPE(dbt_type), ALLOCATABLE, DIMENSION(:, :) :: t_3c_int
388 :
389 : END TYPE post_scf_bandstructure_type
390 :
391 : ! Sanity bounds on a quasiparticle gap (Hartree): inverted below -eps_qp_gap, diverged above max_qp_gap
392 : REAL(KIND=dp), PARAMETER, PUBLIC :: eps_qp_gap = 0.01_dp/evolt, &
393 : max_qp_gap = 200.0_dp/evolt
394 :
395 : CONTAINS
396 :
397 : ! **************************************************************************************************
398 : !> \brief ...
399 : !> \param bs_env ...
400 : ! **************************************************************************************************
401 140 : SUBROUTINE bs_env_release(bs_env)
402 : TYPE(post_scf_bandstructure_type), POINTER :: bs_env
403 :
404 : CHARACTER(LEN=*), PARAMETER :: routineN = 'bs_env_release'
405 :
406 : INTEGER :: handle
407 :
408 140 : CALL timeset(routineN, handle)
409 :
410 140 : CPASSERT(ASSOCIATED(bs_env))
411 :
412 140 : CALL safe_kpoints_release(bs_env%kpoints_chi_eps_W)
413 140 : CALL safe_kpoints_release(bs_env%kpoints_DOS)
414 140 : CALL safe_kpoints_release(bs_env%kpoints_scf_desymm)
415 :
416 140 : IF (ALLOCATED(bs_env%wkp_s_p)) DEALLOCATE (bs_env%wkp_s_p)
417 140 : IF (ALLOCATED(bs_env%wkp_no_extra)) DEALLOCATE (bs_env%wkp_no_extra)
418 140 : IF (ALLOCATED(bs_env%l_RI)) DEALLOCATE (bs_env%l_RI)
419 140 : IF (ALLOCATED(bs_env%xkp_special)) DEALLOCATE (bs_env%xkp_special)
420 140 : CALL time_frequency_grid_release(bs_env%time_frequency_grid)
421 140 : IF (ALLOCATED(bs_env%eigenval_scf_Gamma)) DEALLOCATE (bs_env%eigenval_scf_Gamma)
422 140 : IF (ALLOCATED(bs_env%eigenval_scf)) DEALLOCATE (bs_env%eigenval_scf)
423 140 : IF (ALLOCATED(bs_env%eigenval_GW)) DEALLOCATE (bs_env%eigenval_GW)
424 140 : IF (ALLOCATED(bs_env%eigenval_G0W0)) DEALLOCATE (bs_env%eigenval_G0W0)
425 140 : IF (ALLOCATED(bs_env%eigenval_HF)) DEALLOCATE (bs_env%eigenval_HF)
426 140 : IF (ALLOCATED(bs_env%eigenval_evGW0)) DEALLOCATE (bs_env%eigenval_evGW0)
427 140 : IF (ALLOCATED(bs_env%i_ao_start_from_atom)) DEALLOCATE (bs_env%i_ao_start_from_atom)
428 140 : IF (ALLOCATED(bs_env%i_ao_end_from_atom)) DEALLOCATE (bs_env%i_ao_end_from_atom)
429 140 : IF (ALLOCATED(bs_env%i_RI_start_from_atom)) DEALLOCATE (bs_env%i_RI_start_from_atom)
430 140 : IF (ALLOCATED(bs_env%i_RI_end_from_atom)) DEALLOCATE (bs_env%i_RI_end_from_atom)
431 140 : IF (ALLOCATED(bs_env%min_RI_idx_from_AO_AO_atom)) DEALLOCATE (bs_env%min_RI_idx_from_AO_AO_atom)
432 140 : IF (ALLOCATED(bs_env%max_RI_idx_from_AO_AO_atom)) DEALLOCATE (bs_env%max_RI_idx_from_AO_AO_atom)
433 140 : IF (ALLOCATED(bs_env%min_AO_idx_from_RI_AO_atom)) DEALLOCATE (bs_env%min_AO_idx_from_RI_AO_atom)
434 140 : IF (ALLOCATED(bs_env%max_AO_idx_from_RI_AO_atom)) DEALLOCATE (bs_env%max_AO_idx_from_RI_AO_atom)
435 140 : IF (ALLOCATED(bs_env%i_atom_intervals)) DEALLOCATE (bs_env%i_atom_intervals)
436 140 : IF (ALLOCATED(bs_env%j_atom_intervals)) DEALLOCATE (bs_env%j_atom_intervals)
437 140 : IF (ALLOCATED(bs_env%atoms_i_t_group)) DEALLOCATE (bs_env%atoms_i_t_group)
438 140 : IF (ALLOCATED(bs_env%atoms_j_t_group)) DEALLOCATE (bs_env%atoms_j_t_group)
439 140 : IF (ALLOCATED(bs_env%skip_Sigma_occ)) DEALLOCATE (bs_env%skip_Sigma_occ)
440 140 : IF (ALLOCATED(bs_env%skip_Sigma_vir)) DEALLOCATE (bs_env%skip_Sigma_vir)
441 140 : IF (ALLOCATED(bs_env%skip_chi)) DEALLOCATE (bs_env%skip_chi)
442 140 : IF (ALLOCATED(bs_env%read_chi)) DEALLOCATE (bs_env%read_chi)
443 140 : IF (ALLOCATED(bs_env%calc_chi)) DEALLOCATE (bs_env%calc_chi)
444 140 : IF (ALLOCATED(bs_env%Sigma_c_exists)) DEALLOCATE (bs_env%Sigma_c_exists)
445 140 : IF (ALLOCATED(bs_env%sizes_AO)) DEALLOCATE (bs_env%sizes_AO)
446 140 : IF (ALLOCATED(bs_env%sizes_RI)) DEALLOCATE (bs_env%sizes_RI)
447 140 : IF (ALLOCATED(bs_env%index_to_cell_3c)) DEALLOCATE (bs_env%index_to_cell_3c)
448 140 : IF (ALLOCATED(bs_env%index_to_cell_Delta_R)) DEALLOCATE (bs_env%index_to_cell_Delta_R)
449 140 : IF (ASSOCIATED(bs_env%cell_to_index_3c)) DEALLOCATE (bs_env%cell_to_index_3c)
450 140 : IF (ASSOCIATED(bs_env%cell_to_index_Delta_R)) DEALLOCATE (bs_env%cell_to_index_Delta_R)
451 140 : IF (ALLOCATED(bs_env%task_Delta_R)) DEALLOCATE (bs_env%task_Delta_R)
452 140 : IF (ALLOCATED(bs_env%nblocks_3c)) DEALLOCATE (bs_env%nblocks_3c)
453 140 : IF (ALLOCATED(bs_env%skip_DR_chi)) DEALLOCATE (bs_env%skip_DR_chi)
454 140 : IF (ALLOCATED(bs_env%skip_DR_Sigma)) DEALLOCATE (bs_env%skip_DR_Sigma)
455 140 : IF (ALLOCATED(bs_env%skip_DR_R_R2_MxM_chi)) DEALLOCATE (bs_env%skip_DR_R_R2_MxM_chi)
456 140 : IF (ALLOCATED(bs_env%skip_DR_R1_R_MxM_Sigma)) DEALLOCATE (bs_env%skip_DR_R1_R_MxM_Sigma)
457 140 : IF (ALLOCATED(bs_env%skip_DR_R12_S_Goccx3c_chi)) DEALLOCATE (bs_env%skip_DR_R12_S_Goccx3c_chi)
458 140 : IF (ALLOCATED(bs_env%skip_DR_R12_S_Gvirx3c_chi)) DEALLOCATE (bs_env%skip_DR_R12_S_Gvirx3c_chi)
459 140 : IF (ALLOCATED(bs_env%skip_DR_R1_S2_Gx3c_Sigma)) DEALLOCATE (bs_env%skip_DR_R1_S2_Gx3c_Sigma)
460 :
461 140 : CALL cp_fm_release(bs_env%fm_s_Gamma)
462 140 : CALL cp_fm_release(bs_env%fm_ks_Gamma(1))
463 140 : CALL cp_fm_release(bs_env%fm_ks_Gamma(2))
464 140 : CALL cp_fm_release(bs_env%fm_V_xc_Gamma(1))
465 140 : CALL cp_fm_release(bs_env%fm_V_xc_Gamma(2))
466 140 : CALL cp_fm_release(bs_env%fm_mo_coeff_Gamma(1))
467 140 : CALL cp_fm_release(bs_env%fm_mo_coeff_Gamma(2))
468 140 : CALL cp_fm_release(bs_env%fm_Gocc)
469 140 : CALL cp_fm_release(bs_env%fm_Gvir)
470 140 : CALL cp_fm_release(bs_env%fm_work_mo(1))
471 140 : CALL cp_fm_release(bs_env%fm_work_mo(2))
472 140 : CALL cp_fm_release(bs_env%fm_work_mo(3))
473 140 : CALL cp_fm_release(bs_env%fm_work_mo(4))
474 140 : CALL cp_fm_release(bs_env%fm_RI_RI)
475 140 : CALL cp_fm_release(bs_env%fm_Minv_Gamma)
476 140 : CALL cp_fm_release(bs_env%fm_chi_Gamma_freq)
477 140 : CALL cp_fm_release(bs_env%fm_W_MIC_freq)
478 140 : CALL cp_fm_release(bs_env%fm_W_MIC_freq_zero)
479 140 : CALL cp_fm_release(bs_env%fm_W_MIC_freq_1_extra)
480 140 : CALL cp_fm_release(bs_env%fm_W_MIC_freq_1_no_extra)
481 140 : CALL cp_cfm_release(bs_env%cfm_work_mo)
482 140 : CALL cp_cfm_release(bs_env%cfm_work_mo_2)
483 :
484 140 : CALL safe_fm_destroy_1d(bs_env%fm_G_S)
485 140 : CALL safe_fm_destroy_1d(bs_env%fm_Sigma_x_R)
486 140 : CALL safe_fm_destroy_2d(bs_env%fm_V_xc_R)
487 140 : CALL safe_fm_destroy_2d(bs_env%fm_chi_R_t)
488 140 : CALL safe_fm_destroy_2d(bs_env%fm_MWM_R_t)
489 140 : CALL safe_fm_destroy_3d(bs_env%fm_Sigma_c_R_neg_tau)
490 140 : CALL safe_fm_destroy_3d(bs_env%fm_Sigma_c_R_pos_tau)
491 :
492 140 : CALL t_destroy_2d(bs_env%t_3c_int)
493 :
494 140 : CALL release_dbcsr_p_type(bs_env%mat_ao_ao)
495 140 : CALL release_dbcsr_p_type(bs_env%mat_RI_RI)
496 140 : CALL safe_dbcsr_deallocate_matrix_set_1d(bs_env%mat_chi_Gamma_tau)
497 :
498 140 : CALL release_dbcsr_p_type(bs_env%mat_ao_ao_tensor)
499 140 : CALL release_dbcsr_p_type(bs_env%mat_RI_RI_tensor)
500 :
501 140 : CALL safe_cfm_destroy_1d(bs_env%cfm_s_kp)
502 140 : CALL safe_cfm_destroy_2d(bs_env%cfm_ks_kp)
503 140 : CALL safe_cfm_destroy_2d(bs_env%cfm_mo_coeff_kp)
504 :
505 140 : CALL ri_rs_release(bs_env%ri_rs)
506 140 : CALL mp_para_env_release(bs_env%para_env)
507 140 : IF (ASSOCIATED(bs_env%para_env_tensor)) CALL mp_para_env_release(bs_env%para_env_tensor)
508 :
509 140 : CALL safe_dbt_destroy(bs_env%t_G)
510 140 : CALL safe_dbt_destroy(bs_env%t_chi)
511 140 : CALL safe_dbt_destroy(bs_env%t_W)
512 140 : CALL safe_dbt_destroy(bs_env%t_RI_AO__AO)
513 140 : CALL safe_dbt_destroy(bs_env%t_RI__AO_AO)
514 :
515 140 : IF (ALLOCATED(bs_env%basis_set_AO)) DEALLOCATE (bs_env%basis_set_AO)
516 140 : IF (ALLOCATED(bs_env%basis_set_RI)) DEALLOCATE (bs_env%basis_set_RI)
517 :
518 : ! SOC cfm_1d and arrays
519 140 : CALL safe_dbcsr_deallocate_matrix_set_2d(bs_env%mat_V_SOC_xyz)
520 140 : CALL safe_cfm_destroy_1d(bs_env%cfm_SOC_spinor_ao)
521 :
522 140 : CALL auto_ri_release(bs_env%auto_ri)
523 :
524 140 : DEALLOCATE (bs_env)
525 :
526 140 : CALL timestop(handle)
527 :
528 140 : END SUBROUTINE bs_env_release
529 :
530 : ! **************************************************************************************************
531 : !> \brief ...
532 : !> \param kpoints ...
533 : ! **************************************************************************************************
534 420 : SUBROUTINE safe_kpoints_release(kpoints)
535 : TYPE(kpoint_type), POINTER :: kpoints
536 :
537 420 : IF (ASSOCIATED(kpoints)) CALL kpoint_release(kpoints)
538 :
539 420 : END SUBROUTINE safe_kpoints_release
540 :
541 : ! **************************************************************************************************
542 : !> \brief ...
543 : !> \param dbcsr_p_type_matrix ...
544 : ! **************************************************************************************************
545 560 : SUBROUTINE release_dbcsr_p_type(dbcsr_p_type_matrix)
546 : TYPE(dbcsr_p_type) :: dbcsr_p_type_matrix
547 :
548 560 : IF (ASSOCIATED(dbcsr_p_type_matrix%matrix)) THEN
549 474 : CALL dbcsr_release(dbcsr_p_type_matrix%matrix)
550 474 : DEALLOCATE (dbcsr_p_type_matrix%matrix)
551 : END IF
552 :
553 560 : END SUBROUTINE release_dbcsr_p_type
554 :
555 : ! **************************************************************************************************
556 : !> \brief ...
557 : !> \param t ...
558 : ! **************************************************************************************************
559 700 : SUBROUTINE safe_dbt_destroy(t)
560 : TYPE(dbt_type) :: t
561 :
562 700 : IF (ASSOCIATED(t%matrix_rep)) CALL dbt_destroy(t)
563 :
564 700 : END SUBROUTINE safe_dbt_destroy
565 :
566 : ! **************************************************************************************************
567 : !> \brief ...
568 : !> \param dbcsr_array ...
569 : ! **************************************************************************************************
570 140 : SUBROUTINE safe_dbcsr_deallocate_matrix_set_1d(dbcsr_array)
571 : TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: dbcsr_array
572 :
573 140 : IF (ASSOCIATED(dbcsr_array)) CALL dbcsr_deallocate_matrix_set(dbcsr_array)
574 :
575 140 : END SUBROUTINE safe_dbcsr_deallocate_matrix_set_1d
576 :
577 : ! **************************************************************************************************
578 : !> \brief ...
579 : !> \param dbcsr_array ...
580 : ! **************************************************************************************************
581 140 : SUBROUTINE safe_dbcsr_deallocate_matrix_set_2d(dbcsr_array)
582 : TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: dbcsr_array
583 :
584 140 : IF (ASSOCIATED(dbcsr_array)) CALL dbcsr_deallocate_matrix_set(dbcsr_array)
585 :
586 140 : END SUBROUTINE safe_dbcsr_deallocate_matrix_set_2d
587 :
588 : ! **************************************************************************************************
589 : !> \brief ...
590 : !> \param fm_1d ...
591 : ! **************************************************************************************************
592 280 : SUBROUTINE safe_fm_destroy_1d(fm_1d)
593 : TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:) :: fm_1d
594 :
595 : INTEGER :: i
596 :
597 280 : IF (ALLOCATED(fm_1d)) THEN
598 320 : DO i = 1, SIZE(fm_1d, 1)
599 320 : CALL cp_fm_release(fm_1d(i))
600 : END DO
601 32 : DEALLOCATE (fm_1d)
602 : END IF
603 :
604 280 : END SUBROUTINE safe_fm_destroy_1d
605 :
606 : ! **************************************************************************************************
607 : !> \brief ...
608 : !> \param fm_2d ...
609 : ! **************************************************************************************************
610 420 : SUBROUTINE safe_fm_destroy_2d(fm_2d)
611 : TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:, :) :: fm_2d
612 :
613 : INTEGER :: i, j
614 :
615 420 : IF (ALLOCATED(fm_2d)) THEN
616 864 : DO i = 1, SIZE(fm_2d, 1)
617 3264 : DO j = 1, SIZE(fm_2d, 2)
618 3216 : CALL cp_fm_release(fm_2d(i, j))
619 : END DO
620 : END DO
621 48 : DEALLOCATE (fm_2d)
622 : END IF
623 :
624 420 : END SUBROUTINE safe_fm_destroy_2d
625 :
626 : ! **************************************************************************************************
627 : !> \brief ...
628 : !> \param fm_3d ...
629 : ! **************************************************************************************************
630 280 : SUBROUTINE safe_fm_destroy_3d(fm_3d)
631 : TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:, :, :) :: fm_3d
632 :
633 : INTEGER :: i, j, k
634 :
635 280 : IF (ALLOCATED(fm_3d)) THEN
636 320 : DO i = 1, SIZE(fm_3d, 1)
637 2192 : DO j = 1, SIZE(fm_3d, 2)
638 4032 : DO k = 1, SIZE(fm_3d, 3)
639 3744 : CALL cp_fm_release(fm_3d(i, j, k))
640 : END DO
641 : END DO
642 : END DO
643 32 : DEALLOCATE (fm_3d)
644 : END IF
645 :
646 280 : END SUBROUTINE safe_fm_destroy_3d
647 :
648 : ! **************************************************************************************************
649 : !> \brief ...
650 : !> \param cfm_1d ...
651 : ! **************************************************************************************************
652 280 : SUBROUTINE safe_cfm_destroy_1d(cfm_1d)
653 : TYPE(cp_cfm_type), ALLOCATABLE, DIMENSION(:) :: cfm_1d
654 :
655 : INTEGER :: i
656 :
657 280 : IF (ALLOCATED(cfm_1d)) THEN
658 716 : DO i = 1, SIZE(cfm_1d, 1)
659 716 : CALL cp_cfm_release(cfm_1d(i))
660 : END DO
661 40 : DEALLOCATE (cfm_1d)
662 : END IF
663 :
664 280 : END SUBROUTINE safe_cfm_destroy_1d
665 :
666 : ! **************************************************************************************************
667 : !> \brief ...
668 : !> \param cfm_2d ...
669 : ! **************************************************************************************************
670 280 : SUBROUTINE safe_cfm_destroy_2d(cfm_2d)
671 : TYPE(cp_cfm_type), ALLOCATABLE, DIMENSION(:, :) :: cfm_2d
672 :
673 : INTEGER :: i, j
674 :
675 280 : IF (ALLOCATED(cfm_2d)) THEN
676 740 : DO i = 1, SIZE(cfm_2d, 1)
677 1444 : DO j = 1, SIZE(cfm_2d, 2)
678 1408 : CALL cp_cfm_release(cfm_2d(i, j))
679 : END DO
680 : END DO
681 36 : DEALLOCATE (cfm_2d)
682 : END IF
683 :
684 280 : END SUBROUTINE safe_cfm_destroy_2d
685 :
686 : ! **************************************************************************************************
687 : !> \brief ...
688 : !> \param t_2d ...
689 : ! **************************************************************************************************
690 140 : SUBROUTINE t_destroy_2d(t_2d)
691 : TYPE(dbt_type), ALLOCATABLE, DIMENSION(:, :) :: t_2d
692 :
693 : INTEGER :: i, j
694 :
695 140 : IF (ALLOCATED(t_2d)) THEN
696 194 : DO i = 1, SIZE(t_2d, 1)
697 2260 : DO j = 1, SIZE(t_2d, 2)
698 2244 : CALL dbt_destroy(t_2d(i, j))
699 : END DO
700 : END DO
701 2082 : DEALLOCATE (t_2d)
702 : END IF
703 :
704 140 : END SUBROUTINE t_destroy_2d
705 :
706 0 : END MODULE post_scf_bandstructure_types
|