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 atomic_kind_types, ONLY: atomic_kind_type
15 : USE basis_set_types, ONLY: gto_basis_set_p_type
16 : USE cell_types, ONLY: cell_type
17 : USE cp_cfm_types, ONLY: cp_cfm_release,&
18 : cp_cfm_type
19 : USE cp_dbcsr_api, ONLY: dbcsr_p_type,&
20 : dbcsr_release,&
21 : dbcsr_type
22 : USE cp_dbcsr_operations, ONLY: dbcsr_deallocate_matrix_set
23 : USE cp_fm_types, ONLY: cp_fm_release,&
24 : cp_fm_type
25 : USE dbt_api, ONLY: dbt_destroy,&
26 : dbt_type
27 : USE gw_auto_ri_types, ONLY: auto_ri_release,&
28 : auto_ri_type
29 : USE input_constants, ONLY: G0W0,&
30 : cohsex_off,&
31 : tensor_small_cell_full_kp
32 : USE kinds, ONLY: default_path_length,&
33 : default_string_length,&
34 : dp,&
35 : int_4,&
36 : int_8
37 : USE kpoint_types, ONLY: kpoint_release,&
38 : kpoint_type
39 : USE libint_2c_3c, ONLY: libint_potential_type
40 : USE message_passing, ONLY: mp_para_env_release,&
41 : mp_para_env_type
42 : USE particle_types, ONLY: particle_type
43 : USE physcon, ONLY: angstrom,&
44 : evolt
45 : USE qs_tensors_types, ONLY: neighbor_list_3c_type
46 : USE time_frequency_grids, ONLY: time_frequency_grid_release,&
47 : time_frequency_grid_type
48 : #include "./base/base_uses.f90"
49 :
50 : IMPLICIT NONE
51 :
52 : PRIVATE
53 :
54 : CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'post_scf_bandstructure_types'
55 :
56 : PUBLIC :: post_scf_bandstructure_type, ri_rs_env, &
57 : rirs_grid_type, ri_rs_grid_opt_type, band_edges_type, bs_env_release
58 :
59 : ! valence band maximum (VBM), conduction band minimum (CBM), direct band gap (DBG),
60 : ! indirect band gap (IDBG)
61 : TYPE band_edges_type
62 : REAL(KIND=dp) :: VBM = -1.0_dp, &
63 : CBM = -1.0_dp, &
64 : DBG = -1.0_dp, &
65 : IDBG = -1.0_dp, &
66 : E_fermi = -1.0_dp
67 : END TYPE band_edges_type
68 :
69 : ! data types for GW RI-RS code
70 : TYPE rirs_grid_type
71 : INTEGER :: npts = 0
72 : REAL(KIND=dp), ALLOCATABLE :: raw_points(:, :)
73 : END TYPE rirs_grid_type
74 :
75 : ! User input for the in-memory GW RI-RS grid optimization.
76 : TYPE ri_rs_grid_opt_type
77 : LOGICAL :: enabled = .FALSE.
78 : REAL(KIND=dp) :: cutoff_atomic_cluster = 3.0_dp/angstrom
79 : REAL(KIND=dp) :: rs_ao_ratio = 5.0_dp
80 : INTEGER :: max_iter = 300
81 : END TYPE ri_rs_grid_opt_type
82 :
83 : TYPE ri_rs_env
84 :
85 : ! Input parameters for RI-RS
86 : INTEGER :: grid_select = 1
87 : REAL(KIND=dp) :: tikhonov = 1.0E-08_dp
88 : REAL(KIND=dp) :: cutoff_radius_ri_ao = -1.0_dp
89 : REAL(KIND=dp) :: cutoff_radius_v_w = -1.0_dp
90 : TYPE(ri_rs_grid_opt_type) :: grid_opt
91 :
92 : ! Geometry references used by RI-RS grid setup and optimization.
93 : ! They remain owned by qs_env and must never be deallocated here.
94 : TYPE(cell_type), POINTER :: cell => NULL()
95 : TYPE(particle_type), DIMENSION(:), POINTER :: particle_set => NULL()
96 : TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set => NULL()
97 :
98 : ! Eigenvalue self-consistency (evGW0): G is rebuilt from the quasiparticle energies of
99 : ! the previous cycle while W stays frozen at the RPA@DFT level.
100 : INTEGER :: evgw0_iter = 20
101 : REAL(KIND=dp) :: evgw0_eps_iter = 5.0E-5_dp
102 : ! index of the running evGW0 cycle
103 : INTEGER :: evgw0_i_iter = 0
104 :
105 : ! Data types for cutoffs based DBCSR matrices
106 : REAL(KIND=dp), ALLOCATABLE :: chunk_centroids(:, :)
107 : INTEGER, ALLOCATABLE :: grid_atom_boundaries(:)
108 : INTEGER, ALLOCATABLE :: pan_first(:), pan_last(:)
109 :
110 : ! Atom-specific grids used directly by the GW grid assembler
111 : TYPE(rirs_grid_type), ALLOCATABLE :: atomic_grids(:)
112 :
113 : ! Data types for storing RI-RS matrices
114 : INTEGER :: n_grid_points = 0
115 : TYPE(dbcsr_type) :: mat_phi_mu_l
116 : TYPE(dbcsr_type) :: mat_Z_lP
117 : REAL(KIND=dp), ALLOCATABLE :: grid_points(:, :)
118 : LOGICAL :: Z_lP_exists = .FALSE.
119 :
120 : ! Spatial extent of most diffuse Gaussian primitive of AO/RI basis for each atom
121 : REAL(KIND=dp), ALLOCATABLE :: radius_ao_per_atom(:)
122 : REAL(KIND=dp), ALLOCATABLE :: radius_ri_per_atom(:)
123 :
124 : ! Precomputed grid-basis kernels for RT-BSE
125 : ! mat_V_aux_rtbse(P, Q) = truncated-Coulomb V_PQ with M^-1 sandwich (RI x RI);
126 : ! the Hartree grid kernel Z V Z^T is applied factorized, never materialized
127 : ! mat_W0_grid_rtbse(l, l') = sum_PQ Z_lP W^{w=0}_PQ Z_l'Q
128 : TYPE(dbcsr_type) :: mat_V_aux_rtbse
129 : TYPE(dbcsr_type) :: mat_W0_grid_rtbse
130 :
131 : ! RTBSE%EPS_FILTER_RHO: cuts Delta-rho_AO in compute_sigma_ri_rs, also cuts SEX and Hartree
132 : REAL(KIND=dp) :: eps_filter_rho = -1.0_dp
133 :
134 : ! RTBSE%CUTOFF_RADIUS_W0 (bohr): drops grid block pairs of W0 beyond this distance.
135 : ! BSE-only: the GW quasiparticle energies use their own &GW CUTOFF_RADIUS_* family.
136 : REAL(KIND=dp) :: cutoff_radius_w0 = -1.0_dp
137 :
138 : ! Set TRUE once mat_phi_mu_l and mat_Z_lP have been populated in memory (by GW RI-RS
139 : ! or on-demand by the RT-BSE RI-RS kernel path).
140 : LOGICAL :: grid_built = .FALSE.
141 :
142 : ! Independent toggles for V_grid / W0_grid availability
143 : LOGICAL :: V_grid_built = .FALSE.
144 : LOGICAL :: W0_grid_built = .FALSE.
145 :
146 : END TYPE ri_rs_env
147 :
148 : TYPE post_scf_bandstructure_type
149 :
150 : ! decide which calculations will be done
151 : LOGICAL :: do_gw = .FALSE., &
152 : do_soc = .FALSE., &
153 : do_ldos = .FALSE., &
154 : do_gw_ri_rs = .FALSE., &
155 : do_dos_pdos = .FALSE., &
156 : do_floquet = .FALSE., &
157 : do_static_cohsex = .FALSE.
158 :
159 : ! various eigenvalues computed in GW code, some depend on k-points
160 : ! and have therefore three dimensions (band index, k-point, spin)
161 : !
162 : ! eigenval_GW carries the quasiparticle energies of the highest-level GW flavour requested
163 : ! eigenval_G0W0 - the G0W0 result
164 : ! eigenval_evGW0 - the evGW0 result
165 : REAL(KIND=dp), DIMENSION(:, :), ALLOCATABLE :: eigenval_scf_Gamma
166 : REAL(KIND=dp), DIMENSION(:, :, :), ALLOCATABLE :: eigenval_scf, &
167 : eigenval_GW, &
168 : eigenval_G0W0, &
169 : eigenval_evGW0, &
170 : eigenval_HF
171 : TYPE(band_edges_type) :: band_edges_scf = band_edges_type(), &
172 : band_edges_GW = band_edges_type(), &
173 : band_edges_HF = band_edges_type()
174 :
175 : ! parameters that influence the GW flavor
176 : LOGICAL :: do_hedin_shift = .FALSE.
177 : ! which GW flavour was requested; constants from input_constants (G0W0, evGW0, ...)
178 : INTEGER :: gw_flavour = G0W0
179 :
180 : ! parameters for static COHSEX approximation to GW
181 : ! static COHSEX: OFF, DIAGONAL (ϵ^DG only) or QP_UPDATE (also diagonalization, ϵ^CN, MOs)
182 : INTEGER :: cohsex_flavor = cohsex_off
183 : REAL(KIND=dp) :: cohsex_scale_occ = 1.0_dp, &
184 : cohsex_scale_virt = 1.0_dp
185 :
186 : ! parameters for RI-RS implementation of GW
187 : TYPE(ri_rs_env) :: ri_rs
188 :
189 : ! Parameters for automatic RI basis set optimization.
190 : TYPE(auto_ri_type) :: auto_ri = auto_ri_type()
191 :
192 : ! DBCSR stores each rank's matrix panel in one MPI message whose length is stored in a
193 : ! 32-bit default INTEGER (dbcsr_mpiwrap.F: msglen = SIZE(buffer)). Exceeding this ceiling
194 : ! overflows the count to a negative/garbage value and multiply_cannon segfaults. This is
195 : ! that hard limit in elements (= HUGE(int_4) = 2^31-1), the same bound DBCSR uses
196 : ! internally as mp_max_memory_size. Panel sizing keeps every per-rank message below it.
197 : INTEGER(KIND=int_8) :: dbcsr_msg_elem_limit = &
198 : INT(HUGE(0_int_4), int_8)
199 :
200 : ! general parameters on molecular orbitals and basis sets
201 : ! Number of real states; entries above it are linear-dependency placeholders, not states.
202 : INTEGER :: n_mo_retained = -1
203 : INTEGER :: n_ao = -1, &
204 : n_RI = -1, &
205 : n_spin = -1, &
206 : n_atom = -1, &
207 : max_AO_bf_per_atom = -1
208 : INTEGER, DIMENSION(:), ALLOCATABLE :: i_ao_start_from_atom, &
209 : i_ao_end_from_atom, &
210 : i_RI_start_from_atom, &
211 : i_RI_end_from_atom
212 : INTEGER, DIMENSION(:, :), ALLOCATABLE :: min_RI_idx_from_AO_AO_atom, &
213 : max_RI_idx_from_AO_AO_atom, &
214 : min_AO_idx_from_RI_AO_atom, &
215 : max_AO_idx_from_RI_AO_atom
216 : INTEGER, DIMENSION(2) :: n_occ = -1, &
217 : n_vir = -1
218 : INTEGER, DIMENSION(2) :: n_electron = -1
219 : ! n_occ above is the HOMO index: under smearing,
220 : ! not the true T=0 electron count. n_occ_nosmear is the smearing-independent
221 : ! NINT(nelectron/maxocc) count, used only to center the SOC truncation window.
222 : INTEGER, DIMENSION(2) :: n_occ_nosmear = -1
223 : LOGICAL :: do_smear = .FALSE.
224 : INTEGER :: smear_method = -1
225 : REAL(KIND=dp) :: smear_width = 0.0_dp
226 : REAL(KIND=dp) :: fixed_mag_mom = -1.0_dp
227 : REAL(KIND=dp) :: spin_degeneracy = -1.0_dp
228 : REAL(KIND=dp), DIMENSION(2) :: e_fermi = -1.0_dp
229 :
230 : ! kpoint mesh for chi, eps, W
231 : INTEGER, DIMENSION(:), POINTER :: nkp_grid_DOS_input => NULL(), &
232 : nkp_grid_chi_eps_W_input => NULL()
233 : INTEGER, DIMENSION(3) :: nkp_grid_chi_eps_W_orig = -1, &
234 : nkp_grid_chi_eps_W_extra = -1
235 : INTEGER :: nkp_chi_eps_W_orig = -1, &
236 : nkp_chi_eps_W_orig_plus_extra = -1, &
237 : nkp_chi_eps_W_batch = -1, &
238 : num_chi_eps_W_batches = -1, &
239 : size_lattice_sum_V = -1
240 : TYPE(kpoint_type), POINTER :: kpoints_chi_eps_W => NULL(), &
241 : kpoints_DOS => NULL()
242 : LOGICAL :: approx_kp_extrapol = .FALSE.
243 :
244 : REAL(KIND=dp) :: wkp_orig = -1.0_dp
245 : REAL(KIND=dp), DIMENSION(:), ALLOCATABLE :: wkp_s_p, &
246 : wkp_no_extra
247 : INTEGER, DIMENSION(:), ALLOCATABLE :: l_RI
248 : INTEGER :: input_kp_bs_npoints = -1, &
249 : input_kp_bs_n_sp_pts = -1, &
250 : nkp_bs_and_DOS = -1, &
251 : nkp_only_bs = -1, &
252 : nkp_only_DOS = -1
253 : REAL(KIND=dp), DIMENSION(:, :), ALLOCATABLE :: xkp_special
254 :
255 : ! parameters for GW band structure calculation with k-points
256 : INTEGER :: gw_implementation = -1, &
257 : nimages_scf = -1
258 : INTEGER, DIMENSION(3) :: periodic = -1
259 : LOGICAL :: do_periodic = .FALSE.
260 : REAL(KIND=dp), DIMENSION(3, 3) :: hmat = -1.0_dp
261 :
262 : ! imaginary time and frequency grids
263 : INTEGER :: num_time_freq_points = -1, &
264 : num_freq_points_fit = -1
265 : TYPE(time_frequency_grid_type) :: time_frequency_grid
266 : REAL(KIND=dp), DIMENSION(:), ALLOCATABLE :: imag_freq_points_fit
267 : INTEGER :: nparam_pade = -1, &
268 : num_points_per_magnitude = -1
269 : REAL(KIND=dp) :: freq_max_fit = -1.0_dp, &
270 : input_regularization_minimax = -1.0_dp, &
271 : regularization_minimax = -1.0_dp, &
272 : stabilize_exp = -1.0_dp
273 :
274 : ! filter threshold for matrix-tensor operations
275 : REAL(KIND=dp) :: eps_filter = -1.0_dp, &
276 : eps_atom_grid_2d_mat = -1.0_dp
277 :
278 : ! threshold for inverting ao overlap matrix, RI cfm_1d
279 : REAL(KIND=dp) :: eps_eigval_mat_s = -1.0_dp, &
280 : eps_eigval_mat_RI = -1.0_dp, &
281 : input_regularization_RI = -1.0_dp, &
282 : regularization_RI = -1.0_dp
283 :
284 : ! global full cfm_1d used in GW
285 : TYPE(cp_fm_type) :: fm_s_Gamma = cp_fm_type(), &
286 : fm_Gocc = cp_fm_type(), &
287 : fm_Gvir = cp_fm_type()
288 : TYPE(cp_fm_type), DIMENSION(2) :: fm_ks_Gamma = cp_fm_type(), &
289 : fm_V_xc_Gamma = cp_fm_type(), &
290 : fm_mo_coeff_Gamma = cp_fm_type()
291 : TYPE(cp_fm_type), DIMENSION(4) :: fm_work_mo = cp_fm_type()
292 : TYPE(cp_fm_type) :: fm_RI_RI = cp_fm_type(), &
293 : fm_Minv_Gamma = cp_fm_type(), &
294 : fm_chi_Gamma_freq = cp_fm_type(), &
295 : fm_W_MIC_freq = cp_fm_type(), &
296 : fm_W_MIC_freq_1_extra = cp_fm_type(), &
297 : fm_W_MIC_freq_1_no_extra = cp_fm_type(), &
298 : fm_W_MIC_freq_zero = cp_fm_type()
299 : TYPE(cp_cfm_type) :: cfm_work_mo = cp_cfm_type(), &
300 : cfm_work_mo_2 = cp_cfm_type()
301 :
302 : ! global dbcsr cfm_1d used in GW
303 : TYPE(dbcsr_p_type) :: mat_ao_ao = dbcsr_p_type(), &
304 : mat_RI_RI = dbcsr_p_type()
305 : TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: mat_chi_Gamma_tau => NULL()
306 :
307 : ! local dbcsr cfm_1d used in GW (local in tensor group)
308 : TYPE(dbcsr_p_type) :: mat_ao_ao_tensor = dbcsr_p_type(), &
309 : mat_RI_RI_tensor = dbcsr_p_type()
310 :
311 : ! tensors for sparse matrix-tensor operations
312 : #if defined(FTN_NO_DEFAULT_INIT)
313 : TYPE(dbt_type) :: t_G, &
314 : t_chi, &
315 : t_W, &
316 : t_RI_AO__AO, &
317 : t_RI__AO_AO
318 : #else
319 : TYPE(dbt_type) :: t_G = dbt_type(), &
320 : t_chi = dbt_type(), &
321 : t_W = dbt_type(), &
322 : t_RI_AO__AO = dbt_type(), &
323 : t_RI__AO_AO = dbt_type()
324 : #endif
325 :
326 : ! parameters and data for parallelization
327 : INTEGER :: group_size_tensor = -1, &
328 : tensor_group_color = -1, &
329 : num_tensor_groups = -1
330 : REAL(KIND=dp) :: input_memory_per_proc_GB = -1.0_dp
331 : LOGICAL :: auto_memory_per_proc = .FALSE.
332 : TYPE(mp_para_env_type), POINTER :: para_env => NULL(), &
333 : para_env_tensor => NULL()
334 : REAL(KIND=dp) :: occupation_3c_int = -1.0_dp, &
335 : max_dist_AO_atoms = -1.0_dp, &
336 : safety_factor_memory = -1.0_dp
337 :
338 : ! parallelization: atom range i and atom range j for tensor group
339 : INTEGER, DIMENSION(2) :: atoms_i = -1, &
340 : atoms_j = -1
341 : INTEGER :: n_atom_i = -1, &
342 : n_intervals_i = -1, &
343 : n_atom_j = -1, &
344 : n_intervals_j = -1, &
345 : n_intervals_inner_loop_atoms = -1, &
346 : n_skip_sigma = -1, &
347 : n_skip_chi = -1
348 : INTEGER, DIMENSION(:, :), ALLOCATABLE :: i_atom_intervals, &
349 : j_atom_intervals, &
350 : inner_loop_atom_intervals, &
351 : atoms_i_t_group, &
352 : atoms_j_t_group
353 : LOGICAL, DIMENSION(:, :), ALLOCATABLE :: skip_Sigma_occ, &
354 : skip_Sigma_vir, &
355 : skip_chi
356 : ! rtbse_method (Stepan Marek)
357 : INTEGER :: rtp_method = -1
358 : ! what PROPERTIES%BSE needs the GW to keep for it; set at init, read at the W(0) and de-init
359 : ! sites; the consumer frees both itself once read
360 : LOGICAL :: keep_W_freq_zero = .FALSE., &
361 : keep_3c_nl = .FALSE.
362 :
363 : ! check-arrays and names for restarting
364 : LOGICAL, DIMENSION(:), ALLOCATABLE :: read_chi, &
365 : calc_chi
366 : LOGICAL, DIMENSION(:, :), ALLOCATABLE :: Sigma_c_exists
367 : LOGICAL :: all_W_exist = .FALSE., &
368 : Sigma_x_exists = .FALSE., &
369 : Sigma_c_freq_zero_exists = .FALSE.
370 : CHARACTER(LEN=3) :: chi_name = "chi"
371 : CHARACTER(LEN=6) :: W_time_name = "W_time"
372 : CHARACTER(LEN=7) :: Sigma_x_name = "Sigma_x"
373 : CHARACTER(LEN=17) :: Sigma_c_freq_zero_name = "Sigma_c_freq_zero"
374 : CHARACTER(LEN=13) :: Sigma_p_name = "Sigma_pos_tau", &
375 : Sigma_n_name = "Sigma_neg_tau"
376 : CHARACTER(LEN=default_path_length) :: prefix = ""
377 : INTEGER :: unit_nr = -1
378 :
379 : ! parameters and data for basis sets
380 : TYPE(gto_basis_set_p_type), &
381 : DIMENSION(:), ALLOCATABLE :: basis_set_AO, &
382 : basis_set_RI
383 : INTEGER, DIMENSION(:), ALLOCATABLE :: sizes_AO, &
384 : sizes_RI
385 : TYPE(neighbor_list_3c_type) :: nl_3c = neighbor_list_3c_type()
386 : TYPE(libint_potential_type) :: ri_metric = libint_potential_type(), &
387 : trunc_coulomb = libint_potential_type()
388 :
389 : ! parameters for SOC calculation
390 : REAL(KIND=dp) :: soc_window_occ = -1.0_dp
391 : REAL(KIND=dp) :: soc_window_virt = -1.0_dp
392 : REAL(KIND=dp) :: soc_window_smearing = 1.0_dp/evolt
393 : INTEGER :: soc_nbands_occ = -1.0_dp
394 : INTEGER :: soc_nbands_virt = -1.0_dp
395 :
396 : ! sizes: mat_V_SOC_xyz: xyz, img
397 : TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: mat_V_SOC_xyz => NULL()
398 : ! small-cell GW: dimension = number of kpoints; large-cell GW: Gamma-point, dimension = 1
399 : TYPE(cp_cfm_type), DIMENSION(:), ALLOCATABLE :: cfm_SOC_spinor_ao
400 :
401 : ! parameters for DOS and PDOS calculation
402 : REAL(KIND=dp) :: energy_window_DOS = -1.0_dp, &
403 : energy_step_DOS = -1.0_dp, &
404 : broadening_DOS = -1.0_dp
405 :
406 : ! parameters for LDOS calculation (LDOS: local density of states)
407 : INTEGER :: int_ldos_xyz = -1
408 : INTEGER, DIMENSION(:), POINTER :: bin_mesh => NULL()
409 : INTEGER :: n_bins_max_for_printing = -1
410 : REAL(KIND=dp) :: unit_ldos_int_z_inv_Ang2_eV = -1.0_dp
411 :
412 : ! parameters for Floquet band structure calculations
413 : INTEGER :: max_floquet_index = -1
414 : INTEGER :: max_nmo_floquet = -1
415 : REAL(KIND=dp), DIMENSION(:), POINTER :: floquet_polarisation => NULL(), &
416 : floquet_phi => NULL()
417 : REAL(KIND=dp) :: floquet_omega = -1.0_dp, &
418 : floquet_amplitude = -1.0_dp, &
419 : eps_floquet = -1.0_dp, &
420 : broadening_floquet = -1.0_dp, &
421 : energy_step_floquet = -1.0_dp, &
422 : energy_window_floquet = -1.0_dp, &
423 : floquet_mem_fill_fraction = -1.0_dp, &
424 : floquet_temperature = -1.0_dp
425 : CHARACTER(LEN=default_string_length) :: floquet_dos_file = "", &
426 : floquet_qe_file = "", &
427 : floquet_bs_file = ""
428 :
429 : ! quantities only needed for small cells and k-point sampling in DFT (tensor_small_cell_full_kp)
430 : INTEGER :: nkp_scf_desymm = -1, &
431 : nimages_3c = -1, &
432 : nimages_scf_desymm = -1, &
433 : nimages_Delta_R = -1
434 : TYPE(kpoint_type), POINTER :: kpoints_scf_desymm => NULL()
435 : INTEGER, DIMENSION(3) :: cell_grid_scf_desymm = -1
436 : INTEGER, DIMENSION(:, :), ALLOCATABLE :: index_to_cell_3c, &
437 : index_to_cell_Delta_R
438 : INTEGER, DIMENSION(:, :, :), POINTER :: cell_to_index_3c => NULL(), &
439 : cell_to_index_Delta_R => NULL()
440 : REAL(KIND=dp) :: heuristic_filter_factor = -1.0_dp
441 :
442 : ! tensor_small_cell_full_kp parallelization
443 : INTEGER :: n_tasks_Delta_R_local = -1
444 : INTEGER, DIMENSION(:), ALLOCATABLE :: task_Delta_R
445 : INTEGER, DIMENSION(:, :), ALLOCATABLE :: nblocks_3c
446 : LOGICAL, DIMENSION(:), ALLOCATABLE :: skip_DR_chi, &
447 : skip_DR_Sigma
448 : LOGICAL, DIMENSION(:, :, :), ALLOCATABLE :: skip_DR_R_R2_MxM_chi, &
449 : skip_DR_R1_R_MxM_Sigma, &
450 : skip_DR_R12_S_Goccx3c_chi, &
451 : skip_DR_R12_S_Gvirx3c_chi, &
452 : skip_DR_R1_S2_Gx3c_Sigma
453 :
454 : ! cfm for k-dep overl mat S_µν(k), KS mat h_µν(k,spin) and mo coeff C_μn(k,spin) from SCF
455 : TYPE(cp_cfm_type), DIMENSION(:), ALLOCATABLE :: cfm_s_kp
456 : TYPE(cp_cfm_type), DIMENSION(:, :), ALLOCATABLE :: cfm_mo_coeff_kp, &
457 : cfm_ks_kp
458 : TYPE(cp_fm_type), DIMENSION(:), ALLOCATABLE :: fm_G_S, &
459 : fm_Sigma_x_R
460 : TYPE(cp_fm_type), DIMENSION(:, :), ALLOCATABLE :: fm_V_xc_R, &
461 : fm_chi_R_t, &
462 : fm_MWM_R_t
463 : TYPE(cp_fm_type), DIMENSION(:, :, :), ALLOCATABLE :: fm_Sigma_c_R_neg_tau, &
464 : fm_Sigma_c_R_pos_tau
465 : REAL(KIND=dp), DIMENSION(:, :, :), ALLOCATABLE :: v_xc_n
466 : TYPE(dbt_type), ALLOCATABLE, DIMENSION(:, :) :: t_3c_int
467 :
468 : END TYPE post_scf_bandstructure_type
469 :
470 : ! Sanity bounds on a quasiparticle gap (Hartree): inverted below -eps_qp_gap, diverged above max_qp_gap
471 : REAL(KIND=dp), PARAMETER, PUBLIC :: eps_qp_gap = 0.01_dp/evolt, &
472 : max_qp_gap = 200.0_dp/evolt
473 :
474 : CONTAINS
475 :
476 : ! **************************************************************************************************
477 : !> \brief ...
478 : !> \param bs_env ...
479 : ! **************************************************************************************************
480 140 : SUBROUTINE bs_env_release(bs_env)
481 : TYPE(post_scf_bandstructure_type), POINTER :: bs_env
482 :
483 : CHARACTER(LEN=*), PARAMETER :: routineN = 'bs_env_release'
484 :
485 : INTEGER :: handle
486 :
487 140 : CALL timeset(routineN, handle)
488 :
489 140 : CPASSERT(ASSOCIATED(bs_env))
490 :
491 140 : CALL safe_kpoints_release(bs_env%kpoints_chi_eps_W)
492 140 : CALL safe_kpoints_release(bs_env%kpoints_DOS)
493 140 : CALL safe_kpoints_release(bs_env%kpoints_scf_desymm)
494 :
495 140 : IF (ALLOCATED(bs_env%wkp_s_p)) DEALLOCATE (bs_env%wkp_s_p)
496 140 : IF (ALLOCATED(bs_env%wkp_no_extra)) DEALLOCATE (bs_env%wkp_no_extra)
497 140 : IF (ALLOCATED(bs_env%l_RI)) DEALLOCATE (bs_env%l_RI)
498 140 : IF (ALLOCATED(bs_env%xkp_special)) DEALLOCATE (bs_env%xkp_special)
499 140 : CALL time_frequency_grid_release(bs_env%time_frequency_grid)
500 140 : IF (ALLOCATED(bs_env%eigenval_scf_Gamma)) DEALLOCATE (bs_env%eigenval_scf_Gamma)
501 140 : IF (ALLOCATED(bs_env%eigenval_scf)) DEALLOCATE (bs_env%eigenval_scf)
502 140 : IF (ALLOCATED(bs_env%eigenval_GW)) DEALLOCATE (bs_env%eigenval_GW)
503 140 : IF (ALLOCATED(bs_env%eigenval_G0W0)) DEALLOCATE (bs_env%eigenval_G0W0)
504 140 : IF (ALLOCATED(bs_env%eigenval_HF)) DEALLOCATE (bs_env%eigenval_HF)
505 140 : IF (ALLOCATED(bs_env%eigenval_evGW0)) DEALLOCATE (bs_env%eigenval_evGW0)
506 140 : IF (ALLOCATED(bs_env%i_ao_start_from_atom)) DEALLOCATE (bs_env%i_ao_start_from_atom)
507 140 : IF (ALLOCATED(bs_env%i_ao_end_from_atom)) DEALLOCATE (bs_env%i_ao_end_from_atom)
508 140 : IF (ALLOCATED(bs_env%i_RI_start_from_atom)) DEALLOCATE (bs_env%i_RI_start_from_atom)
509 140 : IF (ALLOCATED(bs_env%i_RI_end_from_atom)) DEALLOCATE (bs_env%i_RI_end_from_atom)
510 140 : IF (ALLOCATED(bs_env%min_RI_idx_from_AO_AO_atom)) DEALLOCATE (bs_env%min_RI_idx_from_AO_AO_atom)
511 140 : IF (ALLOCATED(bs_env%max_RI_idx_from_AO_AO_atom)) DEALLOCATE (bs_env%max_RI_idx_from_AO_AO_atom)
512 140 : IF (ALLOCATED(bs_env%min_AO_idx_from_RI_AO_atom)) DEALLOCATE (bs_env%min_AO_idx_from_RI_AO_atom)
513 140 : IF (ALLOCATED(bs_env%max_AO_idx_from_RI_AO_atom)) DEALLOCATE (bs_env%max_AO_idx_from_RI_AO_atom)
514 140 : IF (ALLOCATED(bs_env%i_atom_intervals)) DEALLOCATE (bs_env%i_atom_intervals)
515 140 : IF (ALLOCATED(bs_env%j_atom_intervals)) DEALLOCATE (bs_env%j_atom_intervals)
516 140 : IF (ALLOCATED(bs_env%atoms_i_t_group)) DEALLOCATE (bs_env%atoms_i_t_group)
517 140 : IF (ALLOCATED(bs_env%atoms_j_t_group)) DEALLOCATE (bs_env%atoms_j_t_group)
518 140 : IF (ALLOCATED(bs_env%skip_Sigma_occ)) DEALLOCATE (bs_env%skip_Sigma_occ)
519 140 : IF (ALLOCATED(bs_env%skip_Sigma_vir)) DEALLOCATE (bs_env%skip_Sigma_vir)
520 140 : IF (ALLOCATED(bs_env%skip_chi)) DEALLOCATE (bs_env%skip_chi)
521 140 : IF (ALLOCATED(bs_env%read_chi)) DEALLOCATE (bs_env%read_chi)
522 140 : IF (ALLOCATED(bs_env%calc_chi)) DEALLOCATE (bs_env%calc_chi)
523 140 : IF (ALLOCATED(bs_env%Sigma_c_exists)) DEALLOCATE (bs_env%Sigma_c_exists)
524 140 : IF (ALLOCATED(bs_env%sizes_AO)) DEALLOCATE (bs_env%sizes_AO)
525 140 : IF (ALLOCATED(bs_env%sizes_RI)) DEALLOCATE (bs_env%sizes_RI)
526 140 : IF (ALLOCATED(bs_env%index_to_cell_3c)) DEALLOCATE (bs_env%index_to_cell_3c)
527 140 : IF (ALLOCATED(bs_env%index_to_cell_Delta_R)) DEALLOCATE (bs_env%index_to_cell_Delta_R)
528 140 : IF (ASSOCIATED(bs_env%cell_to_index_3c)) DEALLOCATE (bs_env%cell_to_index_3c)
529 140 : IF (ASSOCIATED(bs_env%cell_to_index_Delta_R)) DEALLOCATE (bs_env%cell_to_index_Delta_R)
530 140 : IF (ALLOCATED(bs_env%task_Delta_R)) DEALLOCATE (bs_env%task_Delta_R)
531 140 : IF (ALLOCATED(bs_env%nblocks_3c)) DEALLOCATE (bs_env%nblocks_3c)
532 140 : IF (ALLOCATED(bs_env%skip_DR_chi)) DEALLOCATE (bs_env%skip_DR_chi)
533 140 : IF (ALLOCATED(bs_env%skip_DR_Sigma)) DEALLOCATE (bs_env%skip_DR_Sigma)
534 140 : IF (ALLOCATED(bs_env%skip_DR_R_R2_MxM_chi)) DEALLOCATE (bs_env%skip_DR_R_R2_MxM_chi)
535 140 : IF (ALLOCATED(bs_env%skip_DR_R1_R_MxM_Sigma)) DEALLOCATE (bs_env%skip_DR_R1_R_MxM_Sigma)
536 140 : IF (ALLOCATED(bs_env%skip_DR_R12_S_Goccx3c_chi)) DEALLOCATE (bs_env%skip_DR_R12_S_Goccx3c_chi)
537 140 : IF (ALLOCATED(bs_env%skip_DR_R12_S_Gvirx3c_chi)) DEALLOCATE (bs_env%skip_DR_R12_S_Gvirx3c_chi)
538 140 : IF (ALLOCATED(bs_env%skip_DR_R1_S2_Gx3c_Sigma)) DEALLOCATE (bs_env%skip_DR_R1_S2_Gx3c_Sigma)
539 :
540 140 : CALL cp_fm_release(bs_env%fm_s_Gamma)
541 140 : CALL cp_fm_release(bs_env%fm_ks_Gamma(1))
542 140 : CALL cp_fm_release(bs_env%fm_ks_Gamma(2))
543 140 : CALL cp_fm_release(bs_env%fm_V_xc_Gamma(1))
544 140 : CALL cp_fm_release(bs_env%fm_V_xc_Gamma(2))
545 140 : CALL cp_fm_release(bs_env%fm_mo_coeff_Gamma(1))
546 140 : CALL cp_fm_release(bs_env%fm_mo_coeff_Gamma(2))
547 140 : CALL cp_fm_release(bs_env%fm_Gocc)
548 140 : CALL cp_fm_release(bs_env%fm_Gvir)
549 140 : CALL cp_fm_release(bs_env%fm_work_mo(1))
550 140 : CALL cp_fm_release(bs_env%fm_work_mo(2))
551 140 : CALL cp_fm_release(bs_env%fm_work_mo(3))
552 140 : CALL cp_fm_release(bs_env%fm_work_mo(4))
553 140 : CALL cp_fm_release(bs_env%fm_RI_RI)
554 140 : CALL cp_fm_release(bs_env%fm_Minv_Gamma)
555 140 : CALL cp_fm_release(bs_env%fm_chi_Gamma_freq)
556 140 : CALL cp_fm_release(bs_env%fm_W_MIC_freq)
557 140 : CALL cp_fm_release(bs_env%fm_W_MIC_freq_zero)
558 140 : CALL cp_fm_release(bs_env%fm_W_MIC_freq_1_extra)
559 140 : CALL cp_fm_release(bs_env%fm_W_MIC_freq_1_no_extra)
560 140 : CALL cp_cfm_release(bs_env%cfm_work_mo)
561 140 : CALL cp_cfm_release(bs_env%cfm_work_mo_2)
562 :
563 140 : CALL safe_fm_destroy_1d(bs_env%fm_G_S)
564 140 : CALL safe_fm_destroy_1d(bs_env%fm_Sigma_x_R)
565 140 : CALL safe_fm_destroy_2d(bs_env%fm_V_xc_R)
566 140 : CALL safe_fm_destroy_2d(bs_env%fm_chi_R_t)
567 140 : CALL safe_fm_destroy_2d(bs_env%fm_MWM_R_t)
568 140 : CALL safe_fm_destroy_3d(bs_env%fm_Sigma_c_R_neg_tau)
569 140 : CALL safe_fm_destroy_3d(bs_env%fm_Sigma_c_R_pos_tau)
570 :
571 140 : CALL t_destroy_2d(bs_env%t_3c_int)
572 :
573 140 : CALL release_dbcsr_p_type(bs_env%mat_ao_ao)
574 140 : CALL release_dbcsr_p_type(bs_env%mat_RI_RI)
575 140 : CALL safe_dbcsr_deallocate_matrix_set_1d(bs_env%mat_chi_Gamma_tau)
576 :
577 140 : CALL release_dbcsr_p_type(bs_env%mat_ao_ao_tensor)
578 140 : CALL release_dbcsr_p_type(bs_env%mat_RI_RI_tensor)
579 :
580 140 : CALL safe_cfm_destroy_1d(bs_env%cfm_s_kp)
581 140 : CALL safe_cfm_destroy_2d(bs_env%cfm_ks_kp)
582 140 : CALL safe_cfm_destroy_2d(bs_env%cfm_mo_coeff_kp)
583 :
584 140 : CALL mp_para_env_release(bs_env%para_env)
585 140 : IF (ASSOCIATED(bs_env%para_env_tensor)) CALL mp_para_env_release(bs_env%para_env_tensor)
586 :
587 140 : CALL safe_dbt_destroy(bs_env%t_G)
588 140 : CALL safe_dbt_destroy(bs_env%t_chi)
589 140 : CALL safe_dbt_destroy(bs_env%t_W)
590 140 : CALL safe_dbt_destroy(bs_env%t_RI_AO__AO)
591 140 : CALL safe_dbt_destroy(bs_env%t_RI__AO_AO)
592 :
593 140 : IF (ALLOCATED(bs_env%basis_set_AO)) DEALLOCATE (bs_env%basis_set_AO)
594 140 : IF (ALLOCATED(bs_env%basis_set_RI)) DEALLOCATE (bs_env%basis_set_RI)
595 :
596 : ! SOC cfm_1d and arrays
597 140 : CALL safe_dbcsr_deallocate_matrix_set_2d(bs_env%mat_V_SOC_xyz)
598 140 : CALL safe_cfm_destroy_1d(bs_env%cfm_SOC_spinor_ao)
599 :
600 : ! Deallocate RI-RS matrices
601 140 : IF (bs_env%ri_rs%grid_built) CALL dbcsr_release(bs_env%ri_rs%mat_phi_mu_l)
602 140 : IF (bs_env%ri_rs%grid_built) CALL dbcsr_release(bs_env%ri_rs%mat_Z_lP)
603 140 : IF (bs_env%ri_rs%V_grid_built) CALL dbcsr_release(bs_env%ri_rs%mat_V_aux_rtbse)
604 140 : IF (bs_env%ri_rs%W0_grid_built) CALL dbcsr_release(bs_env%ri_rs%mat_W0_grid_rtbse)
605 140 : IF (ALLOCATED(bs_env%ri_rs%grid_points)) DEALLOCATE (bs_env%ri_rs%grid_points)
606 140 : IF (ALLOCATED(bs_env%ri_rs%atomic_grids)) DEALLOCATE (bs_env%ri_rs%atomic_grids)
607 140 : IF (ALLOCATED(bs_env%ri_rs%radius_ao_per_atom)) DEALLOCATE (bs_env%ri_rs%radius_ao_per_atom)
608 140 : IF (ALLOCATED(bs_env%ri_rs%radius_ri_per_atom)) DEALLOCATE (bs_env%ri_rs%radius_ri_per_atom)
609 140 : IF (ALLOCATED(bs_env%ri_rs%chunk_centroids)) DEALLOCATE (bs_env%ri_rs%chunk_centroids)
610 140 : IF (ALLOCATED(bs_env%ri_rs%grid_atom_boundaries)) DEALLOCATE (bs_env%ri_rs%grid_atom_boundaries)
611 140 : NULLIFY (bs_env%ri_rs%atomic_kind_set, bs_env%ri_rs%cell, bs_env%ri_rs%particle_set)
612 140 : IF (ALLOCATED(bs_env%ri_rs%pan_first)) DEALLOCATE (bs_env%ri_rs%pan_first)
613 140 : IF (ALLOCATED(bs_env%ri_rs%pan_last)) DEALLOCATE (bs_env%ri_rs%pan_last)
614 140 : CALL auto_ri_release(bs_env%auto_ri)
615 :
616 140 : DEALLOCATE (bs_env)
617 :
618 140 : CALL timestop(handle)
619 :
620 140 : END SUBROUTINE bs_env_release
621 :
622 : ! **************************************************************************************************
623 : !> \brief ...
624 : !> \param kpoints ...
625 : ! **************************************************************************************************
626 420 : SUBROUTINE safe_kpoints_release(kpoints)
627 : TYPE(kpoint_type), POINTER :: kpoints
628 :
629 420 : IF (ASSOCIATED(kpoints)) CALL kpoint_release(kpoints)
630 :
631 420 : END SUBROUTINE safe_kpoints_release
632 :
633 : ! **************************************************************************************************
634 : !> \brief ...
635 : !> \param dbcsr_p_type_matrix ...
636 : ! **************************************************************************************************
637 560 : SUBROUTINE release_dbcsr_p_type(dbcsr_p_type_matrix)
638 : TYPE(dbcsr_p_type) :: dbcsr_p_type_matrix
639 :
640 560 : IF (ASSOCIATED(dbcsr_p_type_matrix%matrix)) THEN
641 474 : CALL dbcsr_release(dbcsr_p_type_matrix%matrix)
642 474 : DEALLOCATE (dbcsr_p_type_matrix%matrix)
643 : END IF
644 :
645 560 : END SUBROUTINE release_dbcsr_p_type
646 :
647 : ! **************************************************************************************************
648 : !> \brief ...
649 : !> \param t ...
650 : ! **************************************************************************************************
651 700 : SUBROUTINE safe_dbt_destroy(t)
652 : TYPE(dbt_type) :: t
653 :
654 700 : IF (ASSOCIATED(t%matrix_rep)) CALL dbt_destroy(t)
655 :
656 700 : END SUBROUTINE safe_dbt_destroy
657 :
658 : ! **************************************************************************************************
659 : !> \brief ...
660 : !> \param dbcsr_array ...
661 : ! **************************************************************************************************
662 140 : SUBROUTINE safe_dbcsr_deallocate_matrix_set_1d(dbcsr_array)
663 : TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: dbcsr_array
664 :
665 140 : IF (ASSOCIATED(dbcsr_array)) CALL dbcsr_deallocate_matrix_set(dbcsr_array)
666 :
667 140 : END SUBROUTINE safe_dbcsr_deallocate_matrix_set_1d
668 :
669 : ! **************************************************************************************************
670 : !> \brief ...
671 : !> \param dbcsr_array ...
672 : ! **************************************************************************************************
673 140 : SUBROUTINE safe_dbcsr_deallocate_matrix_set_2d(dbcsr_array)
674 : TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: dbcsr_array
675 :
676 140 : IF (ASSOCIATED(dbcsr_array)) CALL dbcsr_deallocate_matrix_set(dbcsr_array)
677 :
678 140 : END SUBROUTINE safe_dbcsr_deallocate_matrix_set_2d
679 :
680 : ! **************************************************************************************************
681 : !> \brief ...
682 : !> \param fm_1d ...
683 : ! **************************************************************************************************
684 280 : SUBROUTINE safe_fm_destroy_1d(fm_1d)
685 : TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:) :: fm_1d
686 :
687 : INTEGER :: i
688 :
689 280 : IF (ALLOCATED(fm_1d)) THEN
690 320 : DO i = 1, SIZE(fm_1d, 1)
691 320 : CALL cp_fm_release(fm_1d(i))
692 : END DO
693 32 : DEALLOCATE (fm_1d)
694 : END IF
695 :
696 280 : END SUBROUTINE safe_fm_destroy_1d
697 :
698 : ! **************************************************************************************************
699 : !> \brief ...
700 : !> \param fm_2d ...
701 : ! **************************************************************************************************
702 420 : SUBROUTINE safe_fm_destroy_2d(fm_2d)
703 : TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:, :) :: fm_2d
704 :
705 : INTEGER :: i, j
706 :
707 420 : IF (ALLOCATED(fm_2d)) THEN
708 864 : DO i = 1, SIZE(fm_2d, 1)
709 3264 : DO j = 1, SIZE(fm_2d, 2)
710 3216 : CALL cp_fm_release(fm_2d(i, j))
711 : END DO
712 : END DO
713 48 : DEALLOCATE (fm_2d)
714 : END IF
715 :
716 420 : END SUBROUTINE safe_fm_destroy_2d
717 :
718 : ! **************************************************************************************************
719 : !> \brief ...
720 : !> \param fm_3d ...
721 : ! **************************************************************************************************
722 280 : SUBROUTINE safe_fm_destroy_3d(fm_3d)
723 : TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:, :, :) :: fm_3d
724 :
725 : INTEGER :: i, j, k
726 :
727 280 : IF (ALLOCATED(fm_3d)) THEN
728 320 : DO i = 1, SIZE(fm_3d, 1)
729 2192 : DO j = 1, SIZE(fm_3d, 2)
730 4032 : DO k = 1, SIZE(fm_3d, 3)
731 3744 : CALL cp_fm_release(fm_3d(i, j, k))
732 : END DO
733 : END DO
734 : END DO
735 32 : DEALLOCATE (fm_3d)
736 : END IF
737 :
738 280 : END SUBROUTINE safe_fm_destroy_3d
739 :
740 : ! **************************************************************************************************
741 : !> \brief ...
742 : !> \param cfm_1d ...
743 : ! **************************************************************************************************
744 280 : SUBROUTINE safe_cfm_destroy_1d(cfm_1d)
745 : TYPE(cp_cfm_type), ALLOCATABLE, DIMENSION(:) :: cfm_1d
746 :
747 : INTEGER :: i
748 :
749 280 : IF (ALLOCATED(cfm_1d)) THEN
750 716 : DO i = 1, SIZE(cfm_1d, 1)
751 716 : CALL cp_cfm_release(cfm_1d(i))
752 : END DO
753 40 : DEALLOCATE (cfm_1d)
754 : END IF
755 :
756 280 : END SUBROUTINE safe_cfm_destroy_1d
757 :
758 : ! **************************************************************************************************
759 : !> \brief ...
760 : !> \param cfm_2d ...
761 : ! **************************************************************************************************
762 280 : SUBROUTINE safe_cfm_destroy_2d(cfm_2d)
763 : TYPE(cp_cfm_type), ALLOCATABLE, DIMENSION(:, :) :: cfm_2d
764 :
765 : INTEGER :: i, j
766 :
767 280 : IF (ALLOCATED(cfm_2d)) THEN
768 740 : DO i = 1, SIZE(cfm_2d, 1)
769 1444 : DO j = 1, SIZE(cfm_2d, 2)
770 1408 : CALL cp_cfm_release(cfm_2d(i, j))
771 : END DO
772 : END DO
773 36 : DEALLOCATE (cfm_2d)
774 : END IF
775 :
776 280 : END SUBROUTINE safe_cfm_destroy_2d
777 :
778 : ! **************************************************************************************************
779 : !> \brief ...
780 : !> \param t_2d ...
781 : ! **************************************************************************************************
782 140 : SUBROUTINE t_destroy_2d(t_2d)
783 : TYPE(dbt_type), ALLOCATABLE, DIMENSION(:, :) :: t_2d
784 :
785 : INTEGER :: i, j
786 :
787 140 : IF (ALLOCATED(t_2d)) THEN
788 194 : DO i = 1, SIZE(t_2d, 1)
789 2260 : DO j = 1, SIZE(t_2d, 2)
790 2244 : CALL dbt_destroy(t_2d(i, j))
791 : END DO
792 : END DO
793 2082 : DEALLOCATE (t_2d)
794 : END IF
795 :
796 140 : END SUBROUTINE t_destroy_2d
797 :
798 0 : END MODULE post_scf_bandstructure_types
|