(git:9111030)
Loading...
Searching...
No Matches
post_scf_bandstructure_types.F
Go to the documentation of this file.
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! **************************************************************************************************
15 USE cp_cfm_types, ONLY: cp_cfm_release,&
17 USE cp_dbcsr_api, ONLY: dbcsr_p_type,&
21 USE cp_fm_types, ONLY: cp_fm_release,&
23 USE dbt_api, ONLY: dbt_destroy,&
24 dbt_type
27 USE kinds, ONLY: default_path_length,&
29 dp
30 USE kpoint_types, ONLY: kpoint_release,&
35 USE physcon, ONLY: evolt
37#include "./base/base_uses.f90"
38
39 IMPLICIT NONE
40
41 PRIVATE
42
43 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'post_scf_bandstructure_types'
44
46
47 ! valence band maximum (VBM), conduction band minimum (CBM), direct band gap (DBG),
48 ! indirect band gap (IDBG)
50 REAL(kind=dp) :: vbm = -1.0_dp, &
51 cbm = -1.0_dp, &
52 dbg = -1.0_dp, &
53 idbg = -1.0_dp
54 END TYPE band_edges_type
55
56 ! data type for storing 3-index quantities for small-cell, full-k-points GW code
58 REAL(kind=dp), DIMENSION(:, :, :), ALLOCATABLE :: data_3
59 END TYPE data_3_type
60
61 ! data types for GW RI-RS code
62 TYPE rirs_grid_type
63 INTEGER :: npts = 0
64 REAL(kind=dp), ALLOCATABLE :: raw_points(:, :)
65 END TYPE rirs_grid_type
66
67 TYPE ri_rs_env
68
69 ! Input parameters for RI-RS
70 INTEGER :: grid_select = 1
71 REAL(kind=dp) :: tikhonov = 1.0e-08_dp
72 REAL(kind=dp) :: cutoff_radius_ri_rs = 30.0_dp
73
74 ! Number of MPI ranks that cooperate on one atom's Cholesky solve via
75 ! distributed pdpotrf. Default 1 = single-rank dpotrf path (BLAS, fastest
76 ! when D_local fits per rank). > 1 enables ScaLAPACK: ranks are split into
77 ! atom-groups of this size, D_local is block-cyclic distributed across
78 ! each group (memory ~1/G per rank), and compute_d_lp is also split across
79 ! the subgroup so wall time matches the BLAS path.
80 INTEGER :: n_procs_per_atom_z_lp = 1
81
82 ! Data types for building grid points
83 TYPE(rirs_grid_type), ALLOCATABLE :: grid_cache(:)
84
85 ! Data types for storing RI-RS matrices
86 TYPE(dbcsr_type) :: mat_phi_mu_l
87 TYPE(dbcsr_type) :: mat_z_lp
88 REAL(kind=dp), ALLOCATABLE :: grid_points(:, :)
89 LOGICAL :: z_lp_exists = .false.
90
91 ! Per-atom spatial extent of the most diffuse Gaussian primitive in each basis
92 REAL(kind=dp), ALLOCATABLE :: radius_ao_per_atom(:)
93 REAL(kind=dp), ALLOCATABLE :: radius_ri_per_atom(:)
94
95 END TYPE ri_rs_env
96
98
99 ! decide which calculations will be done
100 LOGICAL :: do_gw = .false., &
101 do_soc = .false., &
102 do_ldos = .false., &
103 do_gw_ri_rs = .false., &
104 do_dos_pdos = .false., &
105 do_floquet = .false.
106
107 ! various eigenvalues computed in GW code, some depend on k-points
108 ! and have therefore three dimensions (band index, k-point, spin)
109 REAL(kind=dp), DIMENSION(:, :), ALLOCATABLE :: eigenval_scf_gamma
110 REAL(kind=dp), DIMENSION(:, :, :), ALLOCATABLE :: eigenval_scf, &
111 eigenval_g0w0, &
112 eigenval_hf, &
113 eigenval_scgw0
114 REAL(kind=dp), DIMENSION(:, :), ALLOCATABLE :: eigenval_scf_soc, &
115 eigenval_g0w0_soc
116 TYPE(band_edges_type), DIMENSION(2) :: band_edges_scf_gamma = band_edges_type()
117 TYPE(band_edges_type) :: band_edges_scf = band_edges_type(), &
118 band_edges_g0w0 = band_edges_type(), &
119 band_edges_hf = band_edges_type()
120
121 ! parameters that influence the GW flavor
122 LOGICAL :: do_hedin_shift = .false.
123
124 ! parameters for RI-RS implementation of GW
125 TYPE(ri_rs_env) :: ri_rs
126
127 ! general parameters on molecular orbitals and basis sets
128 INTEGER :: n_ao = -1, &
129 n_ri = -1, &
130 n_spin = -1, &
131 n_atom = -1, &
132 max_ao_bf_per_atom = -1
133 INTEGER, DIMENSION(:), ALLOCATABLE :: i_ao_start_from_atom, &
134 i_ao_end_from_atom, &
135 i_ri_start_from_atom, &
136 i_ri_end_from_atom
137 INTEGER, DIMENSION(:, :), ALLOCATABLE :: min_ri_idx_from_ao_ao_atom, &
138 max_ri_idx_from_ao_ao_atom, &
139 min_ao_idx_from_ri_ao_atom, &
140 max_ao_idx_from_ri_ao_atom
141 INTEGER, DIMENSION(2) :: n_occ = -1, &
142 n_vir = -1
143 REAL(kind=dp) :: spin_degeneracy = -1.0_dp
144 REAL(kind=dp), DIMENSION(2) :: e_fermi = -1.0_dp
145
146 ! kpoint mesh for chi, eps, W
147 INTEGER, DIMENSION(:), POINTER :: nkp_grid_dos_input => null(), &
148 nkp_grid_chi_eps_w_input => null()
149 INTEGER, DIMENSION(3) :: nkp_grid_chi_eps_w_orig = -1, &
150 nkp_grid_chi_eps_w_extra = -1
151 INTEGER :: nkp_chi_eps_w_orig = -1, &
152 nkp_chi_eps_w_extra = -1, &
153 nkp_chi_eps_w_orig_plus_extra = -1, &
154 nkp_chi_eps_w_batch = -1, &
155 num_chi_eps_w_batches = -1, &
156 size_lattice_sum_v = -1
157 TYPE(kpoint_type), POINTER :: kpoints_chi_eps_w => null(), &
158 kpoints_dos => null()
159 LOGICAL :: approx_kp_extrapol = .false.
160
161 REAL(kind=dp) :: wkp_orig = -1.0_dp
162 REAL(kind=dp), DIMENSION(:), ALLOCATABLE :: wkp_s_p, &
163 wkp_no_extra
164 INTEGER, DIMENSION(:), ALLOCATABLE :: l_ri
165 INTEGER :: input_kp_bs_npoints = -1, &
166 input_kp_bs_n_sp_pts = -1, &
167 nkp_bs_and_dos = -1, &
168 nkp_only_bs = -1, &
169 nkp_only_dos = -1
170 REAL(kind=dp), DIMENSION(:, :), ALLOCATABLE :: xkp_special
171
172 ! parameters for GW band structure calculation of small unit cell (with multiple unit cell)
173 INTEGER :: small_cell_full_kp_or_large_cell_gamma = -1, &
174 nimages_scf = -1
175 INTEGER, DIMENSION(3) :: periodic = -1
176 REAL(kind=dp), DIMENSION(3, 3) :: hmat = -1.0_dp
177
178 ! imaginary time and frequency grids
179 INTEGER :: num_time_freq_points = -1, &
180 num_freq_points_fit = -1
181 REAL(kind=dp), DIMENSION(:), ALLOCATABLE :: imag_time_points, &
182 imag_time_weights_freq_zero, &
183 imag_freq_points, &
184 imag_freq_points_fit
185 REAL(kind=dp), DIMENSION(:, :), ALLOCATABLE :: weights_cos_t_to_w, &
186 weights_cos_w_to_t, &
187 weights_sin_t_to_w
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_chi_gamma_freq = cp_fm_type(), &
215 fm_w_mic_freq = cp_fm_type(), &
216 fm_w_mic_freq_1_extra = cp_fm_type(), &
217 fm_w_mic_freq_1_no_extra = cp_fm_type(), &
218 fm_w_mic_freq_zero = cp_fm_type(), &
219 fm_h_g0w0_gamma = 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 TYPE(mp_para_env_type), POINTER :: para_env => null(), &
253 para_env_tensor => null()
254 REAL(kind=dp) :: occupation_3c_int = -1.0_dp, &
255 max_dist_ao_atoms = -1.0_dp, &
256 safety_factor_memory = -1.0_dp
257
258 ! parallelization: atom range i and atom range j for tensor group
259 INTEGER, DIMENSION(2) :: atoms_i = -1, &
260 atoms_j = -1
261 INTEGER :: n_atom_i = -1, &
262 n_intervals_i = -1, &
263 n_atom_j = -1, &
264 n_intervals_j = -1, &
265 n_atom_per_interval_ij = -1, &
266 n_intervals_inner_loop_atoms = -1, &
267 n_atom_per_il_interval = -1, &
268 n_skip_sigma = -1, &
269 n_skip_chi = -1
270 INTEGER, DIMENSION(:, :), ALLOCATABLE :: i_atom_intervals, &
271 j_atom_intervals, &
272 inner_loop_atom_intervals, &
273 atoms_i_t_group, &
274 atoms_j_t_group
275 LOGICAL, DIMENSION(:, :), ALLOCATABLE :: skip_sigma_occ, &
276 skip_sigma_vir, &
277 skip_chi
278 ! Marek : rtbse_method
279 INTEGER :: rtp_method = rtp_method_bse
280
281 ! check-arrays and names for restarting
282 LOGICAL, DIMENSION(:), ALLOCATABLE :: read_chi, &
283 calc_chi
284 LOGICAL, DIMENSION(:, :), ALLOCATABLE :: sigma_c_exists
285 LOGICAL :: all_w_exist = .false., &
286 sigma_x_exists = .false.
287 CHARACTER(LEN=3) :: chi_name = "chi"
288 CHARACTER(LEN=6) :: w_time_name = "W_time"
289 CHARACTER(LEN=7) :: sigma_x_name = "Sigma_x"
290 CHARACTER(LEN=13) :: sigma_p_name = "Sigma_pos_tau", &
291 sigma_n_name = "Sigma_neg_tau"
292 CHARACTER(LEN=default_path_length) :: prefix = ""
293 INTEGER :: unit_nr = -1, &
294 unit_nr_contract = -1
295
296 ! parameters and data for basis sets
298 DIMENSION(:), ALLOCATABLE :: basis_set_ao, &
299 basis_set_ri
300 INTEGER, DIMENSION(:), ALLOCATABLE :: sizes_ao, &
301 sizes_ri
304 trunc_coulomb = libint_potential_type()
305
306 ! parameters for SOC calculation
307 REAL(kind=dp) :: soc_window_occ = -1.0_dp
308 REAL(kind=dp) :: soc_window_virt = -1.0_dp
309 REAL(kind=dp) :: soc_window_smearing = 1.0_dp/evolt
310 ! sizes: mat_V_SOC_xyz: xyz, img
311 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: mat_v_soc_xyz => null()
312 TYPE(cp_fm_type), DIMENSION(3) :: fm_v_soc_xyz_mo = cp_fm_type()
313 ! small-cell GW: dimension = number of kpoints; large-cell GW: Gamma-point, dimension = 1
314 TYPE(cp_cfm_type), DIMENSION(:), ALLOCATABLE :: cfm_soc_spinor_ao
315 TYPE(band_edges_type) :: band_edges_scf_soc = band_edges_type(), &
316 band_edges_g0w0_soc = band_edges_type()
317
318 ! parameters for DOS and PDOS calculation
319 REAL(kind=dp) :: energy_window_dos = -1.0_dp, &
320 energy_step_dos = -1.0_dp, &
321 broadening_dos = -1.0_dp
322
323 ! parameters for LDOS calculation (LDOS: local density of states)
324 INTEGER :: int_ldos_xyz = -1
325 INTEGER, DIMENSION(:), POINTER :: bin_mesh => null()
326 INTEGER :: n_bins_max_for_printing = -1
327 REAL(kind=dp) :: unit_ldos_int_z_inv_ang2_ev = -1.0_dp
328
329 ! parameters for Floquet band structure calculations
330 INTEGER :: max_floquet_index = -1
331 REAL(kind=dp), DIMENSION(:), POINTER :: floquet_polarisation => null(), &
332 floquet_phi => null()
333 REAL(kind=dp) :: floquet_omega = -1.0_dp, &
334 floquet_amplitude = -1.0_dp, &
335 eps_floquet = -1.0_dp, &
336 broadening_floquet = -1.0_dp, &
337 energy_step_floquet = -1.0_dp, &
338 energy_window_floquet = -1.0_dp
339 CHARACTER(LEN=default_string_length) :: floquet_dos_file = "", &
340 floquet_qe_file = ""
341
342 ! quantities only needed for small cells and k-point sampling in DFT (small_cell_full_kp)
343 INTEGER :: nkp_scf_desymm = -1, &
344 nimages_3c = -1, &
345 nimages_scf_desymm = -1, &
346 nimages_delta_r = -1
347 TYPE(kpoint_type), POINTER :: kpoints_scf_desymm => null(), &
348 kpoints_scf_desymm_2 => null()
349 INTEGER, DIMENSION(3) :: cell_grid_scf_desymm = -1
350 INTEGER, DIMENSION(:, :), ALLOCATABLE :: index_to_cell_3c, &
351 index_to_cell_delta_r
352 INTEGER, DIMENSION(:, :, :), POINTER :: cell_to_index_3c => null(), &
353 cell_to_index_delta_r => null()
354 REAL(kind=dp) :: heuristic_filter_factor = -1.0_dp
355
356 ! small_cell_full_kp parallelization
357 INTEGER :: n_tasks_delta_r_local = -1
358 INTEGER, DIMENSION(:), ALLOCATABLE :: task_delta_r
359 INTEGER, DIMENSION(:, :), ALLOCATABLE :: nblocks_3c
360 LOGICAL, DIMENSION(:), ALLOCATABLE :: skip_dr_chi, &
361 skip_dr_sigma
362 LOGICAL, DIMENSION(:, :, :), ALLOCATABLE :: skip_dr_r_r2_mxm_chi, &
363 skip_dr_r1_r_mxm_sigma, &
364 skip_dr_r12_s_goccx3c_chi, &
365 skip_dr_r12_s_gvirx3c_chi, &
366 skip_dr_r1_s2_gx3c_sigma
367
368 ! cfm for k-dep overl mat S_µν(k), KS mat h_µν(k,spin) and mo coeff C_μn(k,spin) from SCF
369 TYPE(cp_cfm_type), DIMENSION(:), ALLOCATABLE :: cfm_s_kp
370 TYPE(cp_cfm_type), DIMENSION(:, :), ALLOCATABLE :: cfm_mo_coeff_kp, &
371 cfm_ks_kp
372 TYPE(cp_fm_type), DIMENSION(:), ALLOCATABLE :: fm_g_s, &
373 fm_sigma_x_r
374 TYPE(cp_fm_type), DIMENSION(:, :), ALLOCATABLE :: fm_v_xc_r, &
375 fm_chi_r_t, &
376 fm_mwm_r_t
377 TYPE(cp_fm_type), DIMENSION(:, :, :), ALLOCATABLE :: fm_sigma_c_r_neg_tau, &
378 fm_sigma_c_r_pos_tau
379 REAL(kind=dp), DIMENSION(:, :, :), ALLOCATABLE :: v_xc_n
380 TYPE(dbt_type), ALLOCATABLE, DIMENSION(:, :) :: t_3c_int
381
382 !MG: Print options
383 LOGICAL :: print_contract = .false., &
384 print_contract_verbose = .false.
385
387
388CONTAINS
389
390! **************************************************************************************************
391!> \brief ...
392!> \param bs_env ...
393! **************************************************************************************************
394 SUBROUTINE bs_env_release(bs_env)
395 TYPE(post_scf_bandstructure_type), POINTER :: bs_env
396
397 CHARACTER(LEN=*), PARAMETER :: routinen = 'bs_env_release'
398
399 INTEGER :: handle
400
401 CALL timeset(routinen, handle)
402
403 cpassert(ASSOCIATED(bs_env))
404
405 CALL safe_kpoints_release(bs_env%kpoints_chi_eps_W)
406 CALL safe_kpoints_release(bs_env%kpoints_DOS)
407 CALL safe_kpoints_release(bs_env%kpoints_scf_desymm)
408 CALL safe_kpoints_release(bs_env%kpoints_scf_desymm_2)
409
410 IF (ALLOCATED(bs_env%wkp_s_p)) DEALLOCATE (bs_env%wkp_s_p)
411 IF (ALLOCATED(bs_env%wkp_no_extra)) DEALLOCATE (bs_env%wkp_no_extra)
412 IF (ALLOCATED(bs_env%l_RI)) DEALLOCATE (bs_env%l_RI)
413 IF (ALLOCATED(bs_env%xkp_special)) DEALLOCATE (bs_env%xkp_special)
414 IF (ALLOCATED(bs_env%imag_time_points)) DEALLOCATE (bs_env%imag_time_points)
415 IF (ALLOCATED(bs_env%imag_time_weights_freq_zero)) DEALLOCATE (bs_env%imag_time_weights_freq_zero)
416 IF (ALLOCATED(bs_env%imag_freq_points)) DEALLOCATE (bs_env%imag_freq_points)
417 IF (ALLOCATED(bs_env%eigenval_scf_Gamma)) DEALLOCATE (bs_env%eigenval_scf_Gamma)
418 IF (ALLOCATED(bs_env%eigenval_scf)) DEALLOCATE (bs_env%eigenval_scf)
419 IF (ALLOCATED(bs_env%eigenval_G0W0)) DEALLOCATE (bs_env%eigenval_G0W0)
420 IF (ALLOCATED(bs_env%eigenval_HF)) DEALLOCATE (bs_env%eigenval_HF)
421 IF (ALLOCATED(bs_env%eigenval_scGW0)) DEALLOCATE (bs_env%eigenval_scGW0)
422 IF (ALLOCATED(bs_env%eigenval_scf_soc)) DEALLOCATE (bs_env%eigenval_scf_soc)
423 IF (ALLOCATED(bs_env%eigenval_G0W0_soc)) DEALLOCATE (bs_env%eigenval_G0W0_soc)
424 IF (ALLOCATED(bs_env%i_ao_start_from_atom)) DEALLOCATE (bs_env%i_ao_start_from_atom)
425 IF (ALLOCATED(bs_env%i_ao_end_from_atom)) DEALLOCATE (bs_env%i_ao_end_from_atom)
426 IF (ALLOCATED(bs_env%i_RI_start_from_atom)) DEALLOCATE (bs_env%i_RI_start_from_atom)
427 IF (ALLOCATED(bs_env%i_RI_end_from_atom)) DEALLOCATE (bs_env%i_RI_end_from_atom)
428 IF (ALLOCATED(bs_env%min_RI_idx_from_AO_AO_atom)) DEALLOCATE (bs_env%min_RI_idx_from_AO_AO_atom)
429 IF (ALLOCATED(bs_env%max_RI_idx_from_AO_AO_atom)) DEALLOCATE (bs_env%max_RI_idx_from_AO_AO_atom)
430 IF (ALLOCATED(bs_env%min_AO_idx_from_RI_AO_atom)) DEALLOCATE (bs_env%min_AO_idx_from_RI_AO_atom)
431 IF (ALLOCATED(bs_env%max_AO_idx_from_RI_AO_atom)) DEALLOCATE (bs_env%max_AO_idx_from_RI_AO_atom)
432 IF (ALLOCATED(bs_env%i_atom_intervals)) DEALLOCATE (bs_env%i_atom_intervals)
433 IF (ALLOCATED(bs_env%j_atom_intervals)) DEALLOCATE (bs_env%j_atom_intervals)
434 IF (ALLOCATED(bs_env%atoms_i_t_group)) DEALLOCATE (bs_env%atoms_i_t_group)
435 IF (ALLOCATED(bs_env%atoms_j_t_group)) DEALLOCATE (bs_env%atoms_j_t_group)
436 IF (ALLOCATED(bs_env%skip_Sigma_occ)) DEALLOCATE (bs_env%skip_Sigma_occ)
437 IF (ALLOCATED(bs_env%skip_Sigma_vir)) DEALLOCATE (bs_env%skip_Sigma_vir)
438 IF (ALLOCATED(bs_env%skip_chi)) DEALLOCATE (bs_env%skip_chi)
439 IF (ALLOCATED(bs_env%read_chi)) DEALLOCATE (bs_env%read_chi)
440 IF (ALLOCATED(bs_env%calc_chi)) DEALLOCATE (bs_env%calc_chi)
441 IF (ALLOCATED(bs_env%Sigma_c_exists)) DEALLOCATE (bs_env%Sigma_c_exists)
442 IF (ALLOCATED(bs_env%sizes_AO)) DEALLOCATE (bs_env%sizes_AO)
443 IF (ALLOCATED(bs_env%sizes_RI)) DEALLOCATE (bs_env%sizes_RI)
444 IF (ALLOCATED(bs_env%index_to_cell_3c)) DEALLOCATE (bs_env%index_to_cell_3c)
445 IF (ALLOCATED(bs_env%index_to_cell_Delta_R)) DEALLOCATE (bs_env%index_to_cell_Delta_R)
446 IF (ASSOCIATED(bs_env%cell_to_index_3c)) DEALLOCATE (bs_env%cell_to_index_3c)
447 IF (ASSOCIATED(bs_env%cell_to_index_Delta_R)) DEALLOCATE (bs_env%cell_to_index_Delta_R)
448 IF (ALLOCATED(bs_env%task_Delta_R)) DEALLOCATE (bs_env%task_Delta_R)
449 IF (ALLOCATED(bs_env%nblocks_3c)) DEALLOCATE (bs_env%nblocks_3c)
450 IF (ALLOCATED(bs_env%skip_DR_chi)) DEALLOCATE (bs_env%skip_DR_chi)
451 IF (ALLOCATED(bs_env%skip_DR_Sigma)) DEALLOCATE (bs_env%skip_DR_Sigma)
452 IF (ALLOCATED(bs_env%skip_DR_R_R2_MxM_chi)) DEALLOCATE (bs_env%skip_DR_R_R2_MxM_chi)
453 IF (ALLOCATED(bs_env%skip_DR_R1_R_MxM_Sigma)) DEALLOCATE (bs_env%skip_DR_R1_R_MxM_Sigma)
454 IF (ALLOCATED(bs_env%skip_DR_R12_S_Goccx3c_chi)) DEALLOCATE (bs_env%skip_DR_R12_S_Goccx3c_chi)
455 IF (ALLOCATED(bs_env%skip_DR_R12_S_Gvirx3c_chi)) DEALLOCATE (bs_env%skip_DR_R12_S_Gvirx3c_chi)
456 IF (ALLOCATED(bs_env%skip_DR_R1_S2_Gx3c_Sigma)) DEALLOCATE (bs_env%skip_DR_R1_S2_Gx3c_Sigma)
457
458 CALL cp_fm_release(bs_env%fm_s_Gamma)
459 CALL cp_fm_release(bs_env%fm_ks_Gamma(1))
460 CALL cp_fm_release(bs_env%fm_ks_Gamma(2))
461 CALL cp_fm_release(bs_env%fm_V_xc_Gamma(1))
462 CALL cp_fm_release(bs_env%fm_V_xc_Gamma(2))
463 CALL cp_fm_release(bs_env%fm_mo_coeff_Gamma(1))
464 CALL cp_fm_release(bs_env%fm_mo_coeff_Gamma(2))
465 CALL cp_fm_release(bs_env%fm_Gocc)
466 CALL cp_fm_release(bs_env%fm_Gvir)
467 CALL cp_fm_release(bs_env%fm_work_mo(1))
468 CALL cp_fm_release(bs_env%fm_work_mo(2))
469 CALL cp_fm_release(bs_env%fm_work_mo(3))
470 CALL cp_fm_release(bs_env%fm_work_mo(4))
471 CALL cp_fm_release(bs_env%fm_RI_RI)
472 CALL cp_fm_release(bs_env%fm_chi_Gamma_freq)
473 CALL cp_fm_release(bs_env%fm_W_MIC_freq)
474 IF (bs_env%rtp_method == rtp_method_bse) CALL cp_fm_release(bs_env%fm_W_MIC_freq_zero)
475 CALL cp_fm_release(bs_env%fm_W_MIC_freq_1_extra)
476 CALL cp_fm_release(bs_env%fm_W_MIC_freq_1_no_extra)
477 CALL cp_cfm_release(bs_env%cfm_work_mo)
478 CALL cp_cfm_release(bs_env%cfm_work_mo_2)
479
480 CALL safe_fm_destroy_1d(bs_env%fm_G_S)
481 CALL safe_fm_destroy_1d(bs_env%fm_Sigma_x_R)
482 CALL safe_fm_destroy_2d(bs_env%fm_V_xc_R)
483 CALL safe_fm_destroy_2d(bs_env%fm_chi_R_t)
484 CALL safe_fm_destroy_2d(bs_env%fm_MWM_R_t)
485 CALL safe_fm_destroy_3d(bs_env%fm_Sigma_c_R_neg_tau)
486 CALL safe_fm_destroy_3d(bs_env%fm_Sigma_c_R_pos_tau)
487
488 CALL t_destroy_2d(bs_env%t_3c_int)
489
490 CALL release_dbcsr_p_type(bs_env%mat_ao_ao)
491 CALL release_dbcsr_p_type(bs_env%mat_RI_RI)
492 CALL safe_dbcsr_deallocate_matrix_set_1d(bs_env%mat_chi_Gamma_tau)
493
494 CALL release_dbcsr_p_type(bs_env%mat_ao_ao_tensor)
495 CALL release_dbcsr_p_type(bs_env%mat_RI_RI_tensor)
496
497 CALL safe_cfm_destroy_1d(bs_env%cfm_s_kp)
498 CALL safe_cfm_destroy_2d(bs_env%cfm_ks_kp)
499 CALL safe_cfm_destroy_2d(bs_env%cfm_mo_coeff_kp)
500
501 CALL mp_para_env_release(bs_env%para_env)
502 IF (ASSOCIATED(bs_env%para_env_tensor)) CALL mp_para_env_release(bs_env%para_env_tensor)
503
504 CALL safe_dbt_destroy(bs_env%t_G)
505 CALL safe_dbt_destroy(bs_env%t_chi)
506 CALL safe_dbt_destroy(bs_env%t_W)
507 CALL safe_dbt_destroy(bs_env%t_RI_AO__AO)
508 CALL safe_dbt_destroy(bs_env%t_RI__AO_AO)
509
510 IF (ALLOCATED(bs_env%basis_set_AO)) DEALLOCATE (bs_env%basis_set_AO)
511 IF (ALLOCATED(bs_env%basis_set_RI)) DEALLOCATE (bs_env%basis_set_RI)
512
513 ! SOC cfm_1d and arrays
514 CALL safe_dbcsr_deallocate_matrix_set_2d(bs_env%mat_V_SOC_xyz)
515 CALL cp_fm_release(bs_env%fm_V_SOC_xyz_mo(1))
516 CALL cp_fm_release(bs_env%fm_V_SOC_xyz_mo(2))
517 CALL cp_fm_release(bs_env%fm_V_SOC_xyz_mo(3))
518 CALL safe_cfm_destroy_1d(bs_env%cfm_SOC_spinor_ao)
519
520 ! Deallocate RI-RS matrices
521 IF (bs_env%do_gw_ri_rs) CALL dbcsr_release(bs_env%ri_rs%mat_phi_mu_l)
522 IF (bs_env%do_gw_ri_rs) CALL dbcsr_release(bs_env%ri_rs%mat_Z_lP)
523 IF (ALLOCATED(bs_env%ri_rs%grid_points)) DEALLOCATE (bs_env%ri_rs%grid_points)
524 IF (ALLOCATED(bs_env%ri_rs%grid_cache)) DEALLOCATE (bs_env%ri_rs%grid_cache)
525 IF (ALLOCATED(bs_env%ri_rs%radius_ao_per_atom)) DEALLOCATE (bs_env%ri_rs%radius_ao_per_atom)
526 IF (ALLOCATED(bs_env%ri_rs%radius_ri_per_atom)) DEALLOCATE (bs_env%ri_rs%radius_ri_per_atom)
527
528 DEALLOCATE (bs_env)
529
530 CALL timestop(handle)
531
532 END SUBROUTINE bs_env_release
533
534! **************************************************************************************************
535!> \brief ...
536!> \param kpoints ...
537! **************************************************************************************************
538 SUBROUTINE safe_kpoints_release(kpoints)
539 TYPE(kpoint_type), POINTER :: kpoints
540
541 IF (ASSOCIATED(kpoints)) CALL kpoint_release(kpoints)
542
543 END SUBROUTINE safe_kpoints_release
544
545! **************************************************************************************************
546!> \brief ...
547!> \param dbcsr_p_type_matrix ...
548! **************************************************************************************************
549 SUBROUTINE release_dbcsr_p_type(dbcsr_p_type_matrix)
550 TYPE(dbcsr_p_type) :: dbcsr_p_type_matrix
551
552 IF (ASSOCIATED(dbcsr_p_type_matrix%matrix)) THEN
553 CALL dbcsr_release(dbcsr_p_type_matrix%matrix)
554 DEALLOCATE (dbcsr_p_type_matrix%matrix)
555 END IF
556
557 END SUBROUTINE release_dbcsr_p_type
558
559! **************************************************************************************************
560!> \brief ...
561!> \param t ...
562! **************************************************************************************************
563 SUBROUTINE safe_dbt_destroy(t)
564 TYPE(dbt_type) :: t
565
566 IF (ASSOCIATED(t%matrix_rep)) CALL dbt_destroy(t)
567
568 END SUBROUTINE safe_dbt_destroy
569
570! **************************************************************************************************
571!> \brief ...
572!> \param dbcsr_array ...
573! **************************************************************************************************
574 SUBROUTINE safe_dbcsr_deallocate_matrix_set_1d(dbcsr_array)
575 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: dbcsr_array
576
577 IF (ASSOCIATED(dbcsr_array)) CALL dbcsr_deallocate_matrix_set(dbcsr_array)
578
579 END SUBROUTINE safe_dbcsr_deallocate_matrix_set_1d
580
581! **************************************************************************************************
582!> \brief ...
583!> \param dbcsr_array ...
584! **************************************************************************************************
585 SUBROUTINE safe_dbcsr_deallocate_matrix_set_2d(dbcsr_array)
586 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: dbcsr_array
587
588 IF (ASSOCIATED(dbcsr_array)) CALL dbcsr_deallocate_matrix_set(dbcsr_array)
589
590 END SUBROUTINE safe_dbcsr_deallocate_matrix_set_2d
591
592! **************************************************************************************************
593!> \brief ...
594!> \param fm_1d ...
595! **************************************************************************************************
596 SUBROUTINE safe_fm_destroy_1d(fm_1d)
597 TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:) :: fm_1d
598
599 INTEGER :: i
600
601 IF (ALLOCATED(fm_1d)) THEN
602 DO i = 1, SIZE(fm_1d, 1)
603 CALL cp_fm_release(fm_1d(i))
604 END DO
605 DEALLOCATE (fm_1d)
606 END IF
607
608 END SUBROUTINE safe_fm_destroy_1d
609
610! **************************************************************************************************
611!> \brief ...
612!> \param fm_2d ...
613! **************************************************************************************************
614 SUBROUTINE safe_fm_destroy_2d(fm_2d)
615 TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:, :) :: fm_2d
616
617 INTEGER :: i, j
618
619 IF (ALLOCATED(fm_2d)) THEN
620 DO i = 1, SIZE(fm_2d, 1)
621 DO j = 1, SIZE(fm_2d, 2)
622 CALL cp_fm_release(fm_2d(i, j))
623 END DO
624 END DO
625 DEALLOCATE (fm_2d)
626 END IF
627
628 END SUBROUTINE safe_fm_destroy_2d
629
630! **************************************************************************************************
631!> \brief ...
632!> \param fm_3d ...
633! **************************************************************************************************
634 SUBROUTINE safe_fm_destroy_3d(fm_3d)
635 TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:, :, :) :: fm_3d
636
637 INTEGER :: i, j, k
638
639 IF (ALLOCATED(fm_3d)) THEN
640 DO i = 1, SIZE(fm_3d, 1)
641 DO j = 1, SIZE(fm_3d, 2)
642 DO k = 1, SIZE(fm_3d, 3)
643 CALL cp_fm_release(fm_3d(i, j, k))
644 END DO
645 END DO
646 END DO
647 DEALLOCATE (fm_3d)
648 END IF
649
650 END SUBROUTINE safe_fm_destroy_3d
651
652! **************************************************************************************************
653!> \brief ...
654!> \param cfm_1d ...
655! **************************************************************************************************
656 SUBROUTINE safe_cfm_destroy_1d(cfm_1d)
657 TYPE(cp_cfm_type), ALLOCATABLE, DIMENSION(:) :: cfm_1d
658
659 INTEGER :: i
660
661 IF (ALLOCATED(cfm_1d)) THEN
662 DO i = 1, SIZE(cfm_1d, 1)
663 CALL cp_cfm_release(cfm_1d(i))
664 END DO
665 DEALLOCATE (cfm_1d)
666 END IF
667
668 END SUBROUTINE safe_cfm_destroy_1d
669
670! **************************************************************************************************
671!> \brief ...
672!> \param cfm_2d ...
673! **************************************************************************************************
674 SUBROUTINE safe_cfm_destroy_2d(cfm_2d)
675 TYPE(cp_cfm_type), ALLOCATABLE, DIMENSION(:, :) :: cfm_2d
676
677 INTEGER :: i, j
678
679 IF (ALLOCATED(cfm_2d)) THEN
680 DO i = 1, SIZE(cfm_2d, 1)
681 DO j = 1, SIZE(cfm_2d, 2)
682 CALL cp_cfm_release(cfm_2d(i, j))
683 END DO
684 END DO
685 DEALLOCATE (cfm_2d)
686 END IF
687
688 END SUBROUTINE safe_cfm_destroy_2d
689
690! **************************************************************************************************
691!> \brief ...
692!> \param t_2d ...
693! **************************************************************************************************
694 SUBROUTINE t_destroy_2d(t_2d)
695 TYPE(dbt_type), ALLOCATABLE, DIMENSION(:, :) :: t_2d
696
697 INTEGER :: i, j
698
699 IF (ALLOCATED(t_2d)) THEN
700 DO i = 1, SIZE(t_2d, 1)
701 DO j = 1, SIZE(t_2d, 2)
702 CALL dbt_destroy(t_2d(i, j))
703 END DO
704 END DO
705 DEALLOCATE (t_2d)
706 END IF
707
708 END SUBROUTINE t_destroy_2d
709
Represents a complex full matrix distributed on many processors.
subroutine, public cp_cfm_release(matrix)
Releases a full matrix.
subroutine, public dbcsr_release(matrix)
...
DBCSR operations in CP2K.
represent a full matrix distributed on many processors
Definition cp_fm_types.F:15
This is the start of a dbt_api, all publically needed functions are exported here....
Definition dbt_api.F:17
collects all constants needed in input so that they can be used without circular dependencies
integer, parameter, public rtp_method_bse
integer, parameter, public small_cell_full_kp
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
integer, parameter, public default_string_length
Definition kinds.F:57
integer, parameter, public default_path_length
Definition kinds.F:58
Types and basic routines needed for a kpoint calculation.
subroutine, public kpoint_release(kpoint)
Release a kpoint environment, deallocate all data.
2- and 3-center electron repulsion integral routines based on libint2 Currently available operators: ...
Interface to the message passing library MPI.
subroutine, public mp_para_env_release(para_env)
releases the para object (to be called when you don't want anymore the shared copy of this object)
Definition of physical constants:
Definition physcon.F:68
real(kind=dp), parameter, public evolt
Definition physcon.F:183
subroutine, public bs_env_release(bs_env)
...
Utility methods to build 3-center integral tensors of various types.
Represent a complex full matrix.
represent a full matrix
Contains information about kpoints.
stores all the informations relevant to an mpi environment