Line data Source code
1 : !--------------------------------------------------------------------------------------------------!
2 : ! CP2K: A general program to perform molecular dynamics simulations !
3 : ! Copyright 2000-2024 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_operations, ONLY: dbcsr_deallocate_matrix_set
18 : USE cp_fm_types, ONLY: cp_fm_release,&
19 : cp_fm_type
20 : USE dbcsr_api, ONLY: dbcsr_p_type,&
21 : dbcsr_release
22 : USE dbt_api, ONLY: dbt_destroy,&
23 : dbt_type
24 : USE kinds, ONLY: default_string_length,&
25 : dp,&
26 : int_8
27 : USE kpoint_types, ONLY: kpoint_release,&
28 : kpoint_type
29 : USE libint_2c_3c, ONLY: libint_potential_type
30 : USE message_passing, ONLY: mp_para_env_release,&
31 : mp_para_env_type
32 : USE qs_tensors_types, ONLY: neighbor_list_3c_type
33 : #include "./base/base_uses.f90"
34 :
35 : IMPLICIT NONE
36 :
37 : PRIVATE
38 :
39 : CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'post_scf_bandstructure_types'
40 :
41 : PUBLIC :: post_scf_bandstructure_type, band_edges_type, bs_env_release
42 :
43 : ! valence band maximum (VBM), conduction band minimum (CBM), direct band gap (DBG),
44 : ! indirect band gap (IDBG)
45 : TYPE band_edges_type
46 : REAL(KIND=dp) :: VBM = -1.0_dp, &
47 : CBM = -1.0_dp, &
48 : DBG = -1.0_dp, &
49 : IDBG = -1.0_dp
50 : END TYPE band_edges_type
51 :
52 : TYPE post_scf_bandstructure_type
53 :
54 : ! decide which calculations will be done
55 : LOGICAL :: do_gw = .FALSE., &
56 : do_soc = .FALSE., &
57 : do_bs = .FALSE., &
58 : do_bs_primitive_cell = .FALSE., &
59 : do_ldos = .FALSE.
60 :
61 : ! various eigenvalues computed in GW code, some depend on k-points
62 : ! and have therefore three dimensions (band index, k-point, spin)
63 : REAL(KIND=dp), DIMENSION(:, :), ALLOCATABLE :: eigenval_scf_Gamma
64 : REAL(KIND=dp), DIMENSION(:, :, :), ALLOCATABLE :: eigenval_scf, &
65 : eigenval_G0W0
66 : REAL(KIND=dp), DIMENSION(:, :, :), ALLOCATABLE :: eigenval_scGW0
67 : REAL(KIND=dp), DIMENSION(:, :), ALLOCATABLE :: eigenval_prim_cell_scf, &
68 : eigenval_prim_cell_scf_soc, &
69 : eigenval_prim_cell_G0W0, &
70 : eigenval_prim_cell_G0W0_soc
71 : REAL(KIND=dp), DIMENSION(:, :), ALLOCATABLE :: eigenval_scf_soc, &
72 : eigenval_G0W0_soc
73 : TYPE(band_edges_type), DIMENSION(2) :: band_edges_scf_Gamma
74 : TYPE(band_edges_type) :: band_edges_scf, &
75 : band_edges_G0W0
76 :
77 : ! general parameters on molecular orbitals and basis sets
78 : INTEGER :: n_ao = -1, &
79 : n_RI = -1, &
80 : n_spin = -1, &
81 : n_atom = -1, &
82 : max_AO_bf_per_atom = -1
83 : INTEGER, DIMENSION(:), ALLOCATABLE :: i_ao_start_from_atom, &
84 : i_ao_end_from_atom, &
85 : i_RI_start_from_atom, &
86 : i_RI_end_from_atom
87 : INTEGER, DIMENSION(2) :: n_occ = -1, &
88 : n_vir = -1
89 : REAL(KIND=dp) :: spin_degeneracy = -1.0_dp
90 : REAL(KIND=dp), DIMENSION(2) :: e_fermi = -1.0_dp
91 :
92 : ! kpoint mesh for chi, eps, W
93 : INTEGER, DIMENSION(:), POINTER :: nkp_grid_DOS_input => NULL()
94 : INTEGER, DIMENSION(3) :: nkp_grid_chi_eps_W_orig = -1, &
95 : nkp_grid_chi_eps_W_extra = -1
96 : INTEGER :: nkp_chi_eps_W_orig = -1, &
97 : nkp_chi_eps_W_extra = -1, &
98 : nkp_chi_eps_W_orig_plus_extra = -1, &
99 : nkp_chi_eps_W_batch = -1, &
100 : num_chi_eps_W_batches = -1, &
101 : size_lattice_sum_V = -1
102 : TYPE(kpoint_type), POINTER :: kpoints_chi_eps_W => NULL(), &
103 : kpoints_DOS => NULL(), &
104 : kpoints_bandstructure => NULL()
105 : LOGICAL :: approx_kp_extrapol = .FALSE.
106 : REAL(KIND=dp) :: wkp_orig = -1.0_dp
107 : REAL(KIND=dp), DIMENSION(:), ALLOCATABLE :: wkp_s_p, &
108 : wkp_no_extra
109 : INTEGER, DIMENSION(:), ALLOCATABLE :: l_RI
110 : INTEGER :: input_kp_bs_npoints = -1, &
111 : input_kp_bs_n_sp_pts = -1, &
112 : nkp_bs = -1, &
113 : nkp_DOS = -1
114 : REAL(KIND=dp), DIMENSION(:, :), ALLOCATABLE :: xkp_special
115 : CHARACTER(LEN=default_string_length), &
116 : DIMENSION(:), ALLOCATABLE :: kp_special_name
117 :
118 : ! parameters for GW band structure calculation of small unit cell (with multiple unit cell)
119 : INTEGER, DIMENSION(3) :: periodic = -1, &
120 : multiple_unit_cell = -1
121 : LOGICAL :: calculate_bandstructure_of_primitive_cell &
122 : = .FALSE.
123 : INTEGER :: n_atom_in_primitive_cell = -1, &
124 : n_primitive_cells = -1
125 : INTEGER, DIMENSION(:), ALLOCATABLE :: atoms_i_primitive_cell, &
126 : ref_atom_primitive_cell
127 : INTEGER, DIMENSION(:, :), ALLOCATABLE :: cell_of_i_atom
128 : REAL(KIND=dp), DIMENSION(3, 3) :: hmat_primitive_cell = -1.0_dp, &
129 : hinv_primitive_cell = -1.0_dp, &
130 : hmat = -1.0_dp
131 :
132 : ! imaginary time and imaginary frequency grids
133 : INTEGER :: num_time_freq_points = -1, &
134 : num_freq_points_fit = -1
135 : REAL(KIND=dp), DIMENSION(:), ALLOCATABLE :: imag_time_points, &
136 : imag_freq_points, &
137 : imag_freq_points_fit
138 : REAL(KIND=dp), DIMENSION(:, :), ALLOCATABLE :: weights_cos_t_to_w, &
139 : weights_cos_w_to_t, &
140 : weights_sin_t_to_w
141 : INTEGER :: nparam_pade = -1, &
142 : num_points_per_magnitude = -1
143 : REAL(KIND=dp) :: freq_max_fit = -1.0_dp, &
144 : regularization_minimax = -1.0_dp, &
145 : stabilize_exp = -1.0_dp
146 :
147 : ! filter threshold for matrix-tensor operations
148 : REAL(KIND=dp) :: eps_filter = -1.0_dp, &
149 : eps_3c_int = -1.0_dp, &
150 : eps_atom_grid_2d_mat = -1.0_dp
151 :
152 : ! threshold for inverting ao overlap matrix, RI matrices
153 : REAL(KIND=dp) :: eps_eigval_mat_s = -1.0_dp, &
154 : eps_eigval_mat_RI = -1.0_dp, &
155 : regularization_RI = -1.0_dp
156 :
157 : ! global full matrices used in GW
158 : TYPE(cp_fm_type) :: fm_s_Gamma, &
159 : fm_Gocc, &
160 : fm_Gvir
161 : TYPE(cp_fm_type), DIMENSION(2) :: fm_ks_Gamma, &
162 : fm_V_xc_Gamma, &
163 : fm_mo_coeff_Gamma
164 : TYPE(cp_fm_type), DIMENSION(4) :: fm_work_mo
165 : TYPE(cp_fm_type) :: fm_RI_RI, &
166 : fm_chi_Gamma_freq, &
167 : fm_W_MIC_freq, &
168 : fm_W_MIC_freq_1_extra, &
169 : fm_W_MIC_freq_1_no_extra, &
170 : fm_h_G0W0_Gamma
171 :
172 : ! global dbcsr matrices used in GW
173 : TYPE(dbcsr_p_type) :: mat_ao_ao, &
174 : mat_RI_RI
175 : TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: mat_chi_Gamma_tau => NULL()
176 :
177 : ! local dbcsr matrices used in GW (local in tensor group)
178 : TYPE(dbcsr_p_type) :: mat_ao_ao_tensor, &
179 : mat_RI_RI_tensor, &
180 : mat_Sigma_from_Gocc_tensor, &
181 : mat_Sigma_from_Gvir_tensor, &
182 : mat_W_MIC_time_tensor
183 :
184 : ! tensors for sparse matrix-tensor operations
185 : TYPE(dbt_type) :: t_G, &
186 : t_chi, &
187 : t_W, &
188 : t_RI_AO__AO, &
189 : t_RI__AO_AO
190 :
191 : ! parameters and data for parallelization
192 : INTEGER :: group_size_tensor = -1, &
193 : tensor_group_color = -1, &
194 : num_tensor_groups = -1, &
195 : diag_group_color = -1, &
196 : num_diag_groups = -1, &
197 : min_block_size = -1
198 : REAL(KIND=dp) :: input_memory_per_proc_GB = -1.0_dp
199 : INTEGER(KIND=int_8) :: input_memory_per_proc = -1
200 : TYPE(mp_para_env_type), POINTER :: para_env => NULL(), &
201 : para_env_tensor => NULL()
202 : REAL(KIND=dp) :: occupation_3c_int = -1.0_dp, &
203 : max_dist_AO_atoms = -1.0_dp, &
204 : safety_factor_memory = -1.0_dp
205 : ! parallelization: atom range i and atom range j for tensor group
206 : INTEGER, DIMENSION(2) :: atoms_i = -1, &
207 : atoms_j = -1
208 : INTEGER :: n_atom_i = -1, &
209 : n_intervals_i = -1, &
210 : n_atom_j = -1, &
211 : n_intervals_j = -1, &
212 : n_atom_per_interval_ij = -1, &
213 : n_intervals_inner_loop_atoms = -1, &
214 : n_atom_per_IL_interval = -1
215 : INTEGER, DIMENSION(:, :), ALLOCATABLE :: i_atom_intervals, &
216 : j_atom_intervals, &
217 : inner_loop_atom_intervals, &
218 : atoms_i_t_group, &
219 : atoms_j_t_group
220 : LOGICAL, DIMENSION(:, :), ALLOCATABLE :: skip_Sigma_occ, &
221 : skip_Sigma_vir
222 :
223 : ! check-arrays and names for restarting
224 : LOGICAL, DIMENSION(:), ALLOCATABLE :: read_chi, &
225 : calc_chi
226 : LOGICAL, DIMENSION(:, :), ALLOCATABLE :: Sigma_c_exists
227 : LOGICAL :: all_W_exist = .FALSE., &
228 : Sigma_x_exists = .FALSE.
229 : CHARACTER(LEN=3) :: chi_name = "chi"
230 : CHARACTER(LEN=6) :: W_time_name = "W_time"
231 : CHARACTER(LEN=7) :: Sigma_x_name = "Sigma_x"
232 : CHARACTER(LEN=13) :: Sigma_p_name = "Sigma_pos_tau", &
233 : Sigma_n_name = "Sigma_neg_tau"
234 : CHARACTER(LEN=default_string_length) :: prefix = ""
235 :
236 : REAL(KIND=dp) :: t1 = -1.0_dp, &
237 : t2 = -1.0_dp
238 : INTEGER :: unit_nr = -1
239 :
240 : ! parameters and data for basis sets
241 : TYPE(gto_basis_set_p_type), DIMENSION(:), &
242 : ALLOCATABLE :: basis_set_AO, &
243 : basis_set_RI
244 : INTEGER, DIMENSION(:), ALLOCATABLE :: sizes_AO, &
245 : sizes_RI
246 : TYPE(neighbor_list_3c_type) :: nl_3c
247 : TYPE(libint_potential_type) :: ri_metric, &
248 : trunc_coulomb
249 :
250 : ! parameters for SOC calculation
251 : REAL(KIND=dp) :: energy_window_soc = -1.0_dp
252 : TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: mat_V_SOC_xyz => NULL()
253 : TYPE(cp_fm_type), DIMENSION(3) :: fm_V_SOC_xyz_mo
254 : TYPE(cp_cfm_type) :: cfm_ks_spinor_ao_Gamma, &
255 : cfm_SOC_spinor_ao_Gamma, &
256 : cfm_s_spinor_Gamma
257 : TYPE(band_edges_type) :: band_edges_scf_SOC, &
258 : band_edges_G0W0_SOC
259 :
260 : ! parameters for DOS and PDOS calculation
261 : REAL(KIND=dp) :: energy_window_DOS = -1.0_dp, &
262 : energy_step_DOS = -1.0_dp, &
263 : broadening_DOS = -1.0_dp
264 :
265 : ! parameters for LDOS calculation (LDOS: local density of states)
266 : INTEGER :: int_ldos_xyz = -1
267 : INTEGER, DIMENSION(:), POINTER :: bin_mesh => NULL()
268 : INTEGER :: n_bins_max_for_printing = -1
269 : REAL(KIND=dp) :: unit_ldos_int_z_inv_Ang2_eV = -1.0_dp
270 :
271 : END TYPE post_scf_bandstructure_type
272 :
273 : CONTAINS
274 :
275 : ! **************************************************************************************************
276 : !> \brief ...
277 : !> \param bs_env ...
278 : ! **************************************************************************************************
279 18 : SUBROUTINE bs_env_release(bs_env)
280 : TYPE(post_scf_bandstructure_type), POINTER :: bs_env
281 :
282 : CHARACTER(LEN=*), PARAMETER :: routineN = 'bs_env_release'
283 :
284 : INTEGER :: handle
285 :
286 18 : CALL timeset(routineN, handle)
287 :
288 18 : CPASSERT(ASSOCIATED(bs_env))
289 :
290 18 : CALL safe_kpoints_release(bs_env%kpoints_chi_eps_W)
291 18 : CALL safe_kpoints_release(bs_env%kpoints_DOS)
292 18 : CALL safe_kpoints_release(bs_env%kpoints_bandstructure)
293 :
294 18 : IF (ALLOCATED(bs_env%wkp_s_p)) DEALLOCATE (bs_env%wkp_s_p)
295 18 : IF (ALLOCATED(bs_env%wkp_no_extra)) DEALLOCATE (bs_env%wkp_no_extra)
296 18 : IF (ALLOCATED(bs_env%l_RI)) DEALLOCATE (bs_env%l_RI)
297 18 : IF (ALLOCATED(bs_env%xkp_special)) DEALLOCATE (bs_env%xkp_special)
298 18 : IF (ALLOCATED(bs_env%kp_special_name)) DEALLOCATE (bs_env%kp_special_name)
299 18 : IF (ALLOCATED(bs_env%atoms_i_primitive_cell)) DEALLOCATE (bs_env%atoms_i_primitive_cell)
300 18 : IF (ALLOCATED(bs_env%ref_atom_primitive_cell)) DEALLOCATE (bs_env%ref_atom_primitive_cell)
301 18 : IF (ALLOCATED(bs_env%cell_of_i_atom)) DEALLOCATE (bs_env%cell_of_i_atom)
302 18 : IF (ALLOCATED(bs_env%imag_time_points)) DEALLOCATE (bs_env%imag_time_points)
303 18 : IF (ALLOCATED(bs_env%imag_freq_points)) DEALLOCATE (bs_env%imag_freq_points)
304 18 : IF (ALLOCATED(bs_env%eigenval_scf_Gamma)) DEALLOCATE (bs_env%eigenval_scf_Gamma)
305 18 : IF (ALLOCATED(bs_env%eigenval_scf)) DEALLOCATE (bs_env%eigenval_scf)
306 18 : IF (ALLOCATED(bs_env%eigenval_G0W0)) DEALLOCATE (bs_env%eigenval_G0W0)
307 18 : IF (ALLOCATED(bs_env%eigenval_scGW0)) DEALLOCATE (bs_env%eigenval_scGW0)
308 18 : IF (ALLOCATED(bs_env%eigenval_prim_cell_scf)) DEALLOCATE (bs_env%eigenval_prim_cell_scf)
309 18 : IF (ALLOCATED(bs_env%eigenval_prim_cell_scf_soc)) DEALLOCATE (bs_env%eigenval_prim_cell_scf_soc)
310 18 : IF (ALLOCATED(bs_env%eigenval_prim_cell_G0W0)) DEALLOCATE (bs_env%eigenval_prim_cell_G0W0)
311 18 : IF (ALLOCATED(bs_env%eigenval_prim_cell_G0W0_soc)) DEALLOCATE (bs_env%eigenval_prim_cell_G0W0_soc)
312 18 : IF (ALLOCATED(bs_env%eigenval_scf_soc)) DEALLOCATE (bs_env%eigenval_scf_soc)
313 18 : IF (ALLOCATED(bs_env%eigenval_G0W0_soc)) DEALLOCATE (bs_env%eigenval_G0W0_soc)
314 18 : IF (ALLOCATED(bs_env%i_ao_start_from_atom)) DEALLOCATE (bs_env%i_ao_start_from_atom)
315 18 : IF (ALLOCATED(bs_env%i_ao_end_from_atom)) DEALLOCATE (bs_env%i_ao_end_from_atom)
316 18 : IF (ALLOCATED(bs_env%i_RI_start_from_atom)) DEALLOCATE (bs_env%i_RI_start_from_atom)
317 18 : IF (ALLOCATED(bs_env%i_RI_end_from_atom)) DEALLOCATE (bs_env%i_RI_end_from_atom)
318 18 : IF (ALLOCATED(bs_env%i_atom_intervals)) DEALLOCATE (bs_env%i_atom_intervals)
319 18 : IF (ALLOCATED(bs_env%j_atom_intervals)) DEALLOCATE (bs_env%j_atom_intervals)
320 18 : IF (ALLOCATED(bs_env%atoms_i_t_group)) DEALLOCATE (bs_env%atoms_i_t_group)
321 18 : IF (ALLOCATED(bs_env%atoms_j_t_group)) DEALLOCATE (bs_env%atoms_j_t_group)
322 18 : IF (ALLOCATED(bs_env%skip_Sigma_occ)) DEALLOCATE (bs_env%skip_Sigma_occ)
323 18 : IF (ALLOCATED(bs_env%skip_Sigma_vir)) DEALLOCATE (bs_env%skip_Sigma_vir)
324 18 : IF (ALLOCATED(bs_env%read_chi)) DEALLOCATE (bs_env%read_chi)
325 18 : IF (ALLOCATED(bs_env%calc_chi)) DEALLOCATE (bs_env%calc_chi)
326 18 : IF (ALLOCATED(bs_env%Sigma_c_exists)) DEALLOCATE (bs_env%Sigma_c_exists)
327 18 : IF (ALLOCATED(bs_env%sizes_AO)) DEALLOCATE (bs_env%sizes_AO)
328 18 : IF (ALLOCATED(bs_env%sizes_RI)) DEALLOCATE (bs_env%sizes_RI)
329 :
330 18 : CALL cp_fm_release(bs_env%fm_s_Gamma)
331 18 : CALL cp_fm_release(bs_env%fm_ks_Gamma(1))
332 18 : CALL cp_fm_release(bs_env%fm_ks_Gamma(2))
333 18 : CALL cp_fm_release(bs_env%fm_V_xc_Gamma(1))
334 18 : CALL cp_fm_release(bs_env%fm_V_xc_Gamma(2))
335 18 : CALL cp_fm_release(bs_env%fm_mo_coeff_Gamma(1))
336 18 : CALL cp_fm_release(bs_env%fm_mo_coeff_Gamma(2))
337 18 : CALL cp_fm_release(bs_env%fm_Gocc)
338 18 : CALL cp_fm_release(bs_env%fm_Gvir)
339 18 : CALL cp_fm_release(bs_env%fm_work_mo(1))
340 18 : CALL cp_fm_release(bs_env%fm_work_mo(2))
341 18 : CALL cp_fm_release(bs_env%fm_work_mo(3))
342 18 : CALL cp_fm_release(bs_env%fm_work_mo(4))
343 18 : CALL cp_fm_release(bs_env%fm_RI_RI)
344 18 : CALL cp_fm_release(bs_env%fm_chi_Gamma_freq)
345 18 : CALL cp_fm_release(bs_env%fm_W_MIC_freq)
346 18 : CALL cp_fm_release(bs_env%fm_W_MIC_freq_1_extra)
347 18 : CALL cp_fm_release(bs_env%fm_W_MIC_freq_1_no_extra)
348 18 : CALL cp_fm_release(bs_env%fm_h_G0W0_Gamma)
349 :
350 18 : CALL release_dbcsr_p_type(bs_env%mat_ao_ao)
351 18 : CALL release_dbcsr_p_type(bs_env%mat_RI_RI)
352 18 : CALL safe_dbcsr_deallocate_matrix_set_1d(bs_env%mat_chi_Gamma_tau)
353 :
354 18 : CALL release_dbcsr_p_type(bs_env%mat_ao_ao_tensor)
355 18 : CALL release_dbcsr_p_type(bs_env%mat_RI_RI_tensor)
356 18 : CALL release_dbcsr_p_type(bs_env%mat_Sigma_from_Gocc_tensor)
357 18 : CALL release_dbcsr_p_type(bs_env%mat_Sigma_from_Gvir_tensor)
358 18 : CALL release_dbcsr_p_type(bs_env%mat_W_MIC_time_tensor)
359 :
360 18 : CALL mp_para_env_release(bs_env%para_env)
361 18 : IF (ASSOCIATED(bs_env%para_env_tensor)) CALL mp_para_env_release(bs_env%para_env_tensor)
362 :
363 18 : CALL safe_dbt_destroy(bs_env%t_G)
364 18 : CALL safe_dbt_destroy(bs_env%t_chi)
365 18 : CALL safe_dbt_destroy(bs_env%t_W)
366 18 : CALL safe_dbt_destroy(bs_env%t_RI_AO__AO)
367 18 : CALL safe_dbt_destroy(bs_env%t_RI__AO_AO)
368 :
369 18 : IF (ALLOCATED(bs_env%basis_set_AO)) DEALLOCATE (bs_env%basis_set_AO)
370 18 : IF (ALLOCATED(bs_env%basis_set_RI)) DEALLOCATE (bs_env%basis_set_RI)
371 :
372 : ! SOC matrices and arrays
373 18 : CALL safe_dbcsr_deallocate_matrix_set_2d(bs_env%mat_V_SOC_xyz)
374 18 : CALL cp_fm_release(bs_env%fm_V_SOC_xyz_mo(1))
375 18 : CALL cp_fm_release(bs_env%fm_V_SOC_xyz_mo(2))
376 18 : CALL cp_fm_release(bs_env%fm_V_SOC_xyz_mo(3))
377 18 : CALL cp_cfm_release(bs_env%cfm_ks_spinor_ao_Gamma)
378 18 : CALL cp_cfm_release(bs_env%cfm_SOC_spinor_ao_Gamma)
379 18 : CALL cp_cfm_release(bs_env%cfm_s_spinor_Gamma)
380 :
381 18 : DEALLOCATE (bs_env)
382 :
383 18 : CALL timestop(handle)
384 :
385 18 : END SUBROUTINE bs_env_release
386 :
387 : ! **************************************************************************************************
388 : !> \brief ...
389 : !> \param kpoints ...
390 : ! **************************************************************************************************
391 54 : SUBROUTINE safe_kpoints_release(kpoints)
392 : TYPE(kpoint_type), POINTER :: kpoints
393 :
394 54 : IF (ASSOCIATED(kpoints)) CALL kpoint_release(kpoints)
395 :
396 54 : END SUBROUTINE safe_kpoints_release
397 :
398 : ! **************************************************************************************************
399 : !> \brief ...
400 : !> \param dbcsr_p_type_matrix ...
401 : ! **************************************************************************************************
402 126 : SUBROUTINE release_dbcsr_p_type(dbcsr_p_type_matrix)
403 : TYPE(dbcsr_p_type) :: dbcsr_p_type_matrix
404 :
405 126 : IF (ASSOCIATED(dbcsr_p_type_matrix%matrix)) THEN
406 72 : CALL dbcsr_release(dbcsr_p_type_matrix%matrix)
407 72 : DEALLOCATE (dbcsr_p_type_matrix%matrix)
408 : END IF
409 :
410 126 : END SUBROUTINE release_dbcsr_p_type
411 :
412 : ! **************************************************************************************************
413 : !> \brief ...
414 : !> \param t ...
415 : ! **************************************************************************************************
416 90 : SUBROUTINE safe_dbt_destroy(t)
417 : TYPE(dbt_type) :: t
418 :
419 90 : IF (ASSOCIATED(t%matrix_rep)) CALL dbt_destroy(t)
420 :
421 90 : END SUBROUTINE safe_dbt_destroy
422 :
423 : ! **************************************************************************************************
424 : !> \brief ...
425 : !> \param dbcsr_p_type_matrix_array ...
426 : ! **************************************************************************************************
427 18 : SUBROUTINE safe_dbcsr_deallocate_matrix_set_1d(dbcsr_p_type_matrix_array)
428 :
429 : TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: dbcsr_p_type_matrix_array
430 :
431 18 : IF (ASSOCIATED(dbcsr_p_type_matrix_array)) CALL dbcsr_deallocate_matrix_set(dbcsr_p_type_matrix_array)
432 :
433 18 : END SUBROUTINE safe_dbcsr_deallocate_matrix_set_1d
434 : ! **************************************************************************************************
435 : !> \brief ...
436 : !> \param dbcsr_p_type_matrix_array ...
437 : ! **************************************************************************************************
438 18 : SUBROUTINE safe_dbcsr_deallocate_matrix_set_2d(dbcsr_p_type_matrix_array)
439 :
440 : TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: dbcsr_p_type_matrix_array
441 :
442 18 : IF (ASSOCIATED(dbcsr_p_type_matrix_array)) CALL dbcsr_deallocate_matrix_set(dbcsr_p_type_matrix_array)
443 :
444 18 : END SUBROUTINE safe_dbcsr_deallocate_matrix_set_2d
445 :
446 0 : END MODULE post_scf_bandstructure_types
|