(git:374b731)
Loading...
Searching...
No Matches
mp2_types.F
Go to the documentation of this file.
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 Types needed for MP2 calculations
10!> \par History
11!> 2011.05 created [Mauro Del Ben]
12!> \author MDB
13! **************************************************************************************************
17 USE cp_fm_types, ONLY: cp_fm_type
18 USE dbcsr_api, ONLY: dbcsr_p_type,&
19 dbcsr_type
20 USE hfx_types, ONLY: hfx_release,&
21 hfx_type,&
23 USE input_constants, ONLY: &
29 USE iso_c_binding, ONLY: c_null_ptr,&
30 c_ptr
31 USE kinds, ONLY: dp
32 USE kpoint_types, ONLY: kpoint_type
41#include "./base/base_uses.f90"
42
43 IMPLICIT NONE
44
45 PRIVATE
46
47 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'mp2_types'
48
49 PUBLIC :: mp2_type, &
60
61 PUBLIC :: mp2_env_create, &
70
71 INTEGER, SAVE :: init_tshpsc_lmax = -1
72
73! TYPE definitions
74
76 INTEGER, DIMENSION(:), ALLOCATABLE :: array
77 END TYPE one_dim_int_array
78
80 INTEGER, DIMENSION(:, :), ALLOCATABLE :: array
81 END TYPE two_dim_int_array
82
84 REAL(kind=dp), DIMENSION(:), ALLOCATABLE :: array
85 END TYPE one_dim_real_array
86
88 REAL(kind=dp), DIMENSION(:, :), ALLOCATABLE :: array
89 END TYPE two_dim_real_array
90
92 REAL(kind=dp), DIMENSION(:, :, :), ALLOCATABLE :: array
94
96 INTEGER, DIMENSION(:, :), ALLOCATABLE :: index_table
97 END TYPE mp2_biel_type
98
99 TYPE mp2_laplace_type
100 INTEGER :: n_quadrature = -1, &
101 num_integ_groups = -1
102 END TYPE mp2_laplace_type
103
104 TYPE mp2_direct_type
105 LOGICAL :: big_send = .false.
106 END TYPE
107
108 TYPE mp2_gpw_r3d_rs_type
109 REAL(kind=dp) :: eps_grid = 0.0_dp, &
110 eps_filter = 0.0_dp, &
111 eps_pgf_orb_s = 0.0_dp
112 INTEGER :: print_level = 0
113 REAL(kind=dp) :: cutoff = 0.0_dp, &
114 relative_cutoff = 0.0_dp
115 INTEGER :: size_lattice_sum = 0
116 END TYPE mp2_gpw_r3d_rs_type
117
118 TYPE ri_mp2_type
119 INTEGER :: block_size = 0, &
120 number_integration_groups = 0
121 LOGICAL :: print_dgemm_info = .false.
122 END TYPE ri_mp2_type
123
124 TYPE ri_rpa_type
125 INTEGER :: rpa_num_quad_points = -1, &
126 rpa_num_integ_groups = -1, &
127 mm_style = wfc_mm_style_gemm
128 TYPE(hfx_type), DIMENSION(:, :), POINTER :: x_data => null()
129 TYPE(section_vals_type), POINTER :: xc_section_primary => null(), &
130 xc_section_aux => null()
131 LOGICAL :: reuse_hfx = .false., &
132 minimax_quad = .false., &
133 do_ri_g0w0 = .false., &
134 do_admm = .false., &
135 do_ri_axk = .false., &
136 do_rse = .false., &
137 print_dgemm_info = .false.
138 TYPE(dbcsr_type), POINTER :: mo_coeff_o => null(), &
139 mo_coeff_v => null()
140 REAL(kind=dp) :: ener_axk = 0.0_dp, &
141 rse_corr_diag = 0.0_dp, &
142 rse_corr = 0.0_dp, &
143 scale_rpa = 0.0_dp
144 END TYPE ri_rpa_type
145
146 TYPE ri_rpa_im_time_type
147 INTEGER :: cut_memory = 0
148 LOGICAL :: memory_info = .false., &
149 make_chi_pos_definite = .false., &
150 make_overlap_mat_ao_pos_definite = .false., &
151 trunc_coulomb_ri_x = .false., &
152 keep_quad = .false., &
153 do_kpoints_from_gamma = .false., &
154 do_extrapolate_kpoints = .false.
155 REAL(kind=dp) :: eps_filter = 0.0_dp, &
156 eps_filter_factor = 0.0_dp, &
157 eps_compress = 0.0_dp, &
158 exp_tailored_weights = 0.0_dp, &
159 regularization_ri = 0.0_dp, &
160 eps_eigval_s = 0.0_dp, &
161 eps_eigval_s_gamma = 0.0_dp, &
162 rel_cutoff_trunc_coulomb_ri_x = 0.0_dp
163 REAL(kind=dp), DIMENSION(:), POINTER :: tau_tj => null(), &
164 tau_wj => null(), &
165 tj => null(), &
166 wj => null()
167 REAL(kind=dp), DIMENSION(:, :), POINTER :: weights_cos_tf_t_to_w => null(), &
168 weights_cos_tf_w_to_t => null()
169 REAL(kind=dp), DIMENSION(:), ALLOCATABLE :: eigenval_gamma, &
170 wkp_v
171 INTEGER :: group_size_p = 0, &
172 group_size_3c = 0, &
173 kpoint_weights_w_method = kp_weights_w_auto, &
174 k_mesh_g_factor = 0
175 INTEGER, DIMENSION(:), POINTER :: kp_grid => null()
176 INTEGER, DIMENSION(3) :: kp_grid_extra = -1
177 LOGICAL :: do_im_time_kpoints = .false.
178 INTEGER :: min_bsize = 0, &
179 min_bsize_mo = 0, &
180 nkp_orig = 0, &
181 nkp_extra = 0
182 TYPE(kpoint_type), POINTER :: kpoints_g => null(), &
183 kpoints_sigma => null(), &
184 kpoints_sigma_no_xc => null()
185 INTEGER, ALLOCATABLE, DIMENSION(:) :: starts_array_mc_ri, ends_array_mc_ri, &
186 starts_array_mc_block_ri, &
187 ends_array_mc_block_ri, &
188 starts_array_mc, ends_array_mc, &
189 starts_array_mc_block, &
190 ends_array_mc_block
191
192 END TYPE ri_rpa_im_time_type
193
194 TYPE ri_g0w0_type
195 INTEGER :: corr_mos_occ = 0, &
196 corr_mos_virt = 0, &
197 corr_mos_occ_beta = 0, &
198 corr_mos_virt_beta = 0, &
199 num_poles = 0, &
200 nparam_pade = 0, &
201 analytic_continuation = gw_pade_approx
202 REAL(kind=dp) :: omega_max_fit = 0.0_dp
203 INTEGER :: crossing_search = ri_rpa_g0w0_crossing_z_shot
204 REAL(kind=dp) :: fermi_level_offset = 0.0_dp
205 INTEGER :: iter_evgw = 0, &
206 iter_sc_gw0 = 0
207 REAL(kind=dp) :: eps_iter = 0.0_dp
208 LOGICAL :: do_ri_sigma_x = .false., &
209 do_periodic = .false., &
210 print_self_energy = .false.
211 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :, :) :: vec_sigma_x_minus_vxc_gw
212 INTEGER, DIMENSION(:), POINTER :: kp_grid => null(), &
213 kp_grid_sigma => null()
214 INTEGER :: num_kp_grids = 0
215 REAL(kind=dp) :: eps_kpoint = 0.0_dp
216 LOGICAL :: do_mo_coeff_gamma = .false., &
217 do_average_deg_levels = .false.
218 REAL(kind=dp) :: eps_eigenval = 0.0_dp
219 LOGICAL :: do_extra_kpoints = .false., &
220 do_aux_bas_gw = .false.
221 REAL(kind=dp) :: frac_aux_mos = 0.0_dp
222 INTEGER :: num_omega_points = 0
223 INTEGER :: bse_spin_config = 0, &
224 bse_diag_method = 0, &
225 bse_approx = 0, &
226 num_exc_en = 0, &
227 num_print_exc = 0, &
228 num_add_start_z_space = 0, &
229 fac_max_z_space = 0, &
230 num_new_t = 0, &
231 num_davidson_iter = 0, &
232 davidson_abort_cond = 0
233 REAL(kind=dp) :: eps_res = 0.0_dp, &
234 eps_exc_en = 0.0_dp, &
235 eps_x = 0.0_dp, &
236 bse_cutoff_occ = 0.0_dp, &
237 bse_cutoff_virt = 0.0_dp, &
238 z_space_energy_cutoff = 0.0_dp
239 LOGICAL :: do_bse = .false., &
240 bse_debug_print = .false., &
241 do_ic_model = .false., &
242 print_ic_values = .false.
243 REAL(kind=dp) :: eps_dist = 0.0_dp
244 TYPE(one_dim_real_array), DIMENSION(2) :: ic_corr_list = one_dim_real_array(null())
245 INTEGER :: print_exx = 0
246 LOGICAL :: do_gamma_only_sigma = .false.
247 LOGICAL :: update_xc_energy = .false., &
248 do_kpoints_sigma = .false., &
249 print_local_bandgap = .false.
250 INTEGER :: n_kp_in_kp_line = 0, &
251 n_special_kp = 0, &
252 nkp_self_energy = 0, &
253 nkp_self_energy_special_kp = 0, &
254 nkp_self_energy_monkh_pack = 0, &
255 soc_type = soc_none
256 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :) :: xkp_special_kp
257 TYPE(dbcsr_p_type), DIMENSION(:), ALLOCATABLE :: matrix_sigma_x_minus_vxc, &
258 matrix_ks
259 REAL(kind=dp) :: broadening_print_loc_bandgap = 0.0_dp, &
260 energy_window_print_loc_bandgap = 0.0_dp, &
261 ldos_thresh_print_loc_bandgap = 0.0_dp, &
262 energy_spacing_print_loc_bandgap = 0.0_dp, &
263 regularization_minimax = 0.0_dp, &
264 soc_energy_window = 0.0_dp
265 INTEGER, DIMENSION(:), POINTER :: stride_loc_bandgap => null()
266
267 !GW_DOS
268 REAL(kind=dp) :: dos_upper = 0.0_dp, &
269 dos_lower = 0.0_dp, &
270 dos_prec = 0.0_dp, &
271 dos_eta = 0.0_dp
272 INTEGER :: max_level_self_energy = 0, &
273 min_level_self_energy = 0, &
274 dos_min = 0, &
275 dos_max = 0
276 END TYPE ri_g0w0_type
277
278 TYPE ri_basis_opt
279 REAL(kind=dp) :: di_rel = 0.0_dp, &
280 dri = 0.0_dp, &
281 eps_step = 0.0_dp
282 INTEGER :: max_num_iter = 0, &
283 basis_quality = 0
284 INTEGER, DIMENSION(:), ALLOCATABLE :: ri_nset_per_l
285 END TYPE ri_basis_opt
286
287 TYPE grad_util
288 TYPE(two_dim_real_array), DIMENSION(2) :: p_ij = two_dim_real_array(null()), &
289 p_ab = two_dim_real_array(null())
290 TYPE(three_dim_real_array), DIMENSION(2) :: gamma_p_ia = three_dim_real_array(null())
291 REAL(kind=dp), DIMENSION(:, :), ALLOCATABLE :: operator_half, &
292 pq_half, &
293 gamma_pq, &
294 gamma_pq_2
295 TYPE(dbcsr_p_type), DIMENSION(:, :), ALLOCATABLE :: g_p_ia
296 TYPE(dbcsr_p_type), DIMENSION(:), ALLOCATABLE :: mo_coeff_o, &
297 mo_coeff_v
298 TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:) :: p_mo, w_mo, l_jb
299 REAL(kind=dp) :: cphf_eps_conv = 0.0_dp, &
300 scale_step_size = 0.0_dp
301 INTEGER :: cphf_max_num_iter = 0, &
302 z_solver_method = 0, &
303 cphf_restart = 0
304 LOGICAL :: enforce_decrease = .false., &
305 recalc_residual = .false., &
306 polak_ribiere = .false.
307 TYPE(qs_p_env_type), POINTER :: p_env => null()
308 TYPE(qs_force_type), DIMENSION(:), POINTER :: mp2_force => null()
309 REAL(kind=dp), DIMENSION(3, 3) :: mp2_virial = 0.0_dp
310 REAL(dp) :: eps_canonical = 0.0_dp
311 LOGICAL :: free_hfx_buffer = .false.
312 LOGICAL :: use_old_grad = .false.
313 INTEGER :: dot_blksize = 0
314 INTEGER :: max_parallel_comm = 0
315 END TYPE grad_util
316
318 INTEGER :: method = mp2_method_none
319 TYPE(mp2_laplace_type) :: ri_laplace = mp2_laplace_type()
320 TYPE(mp2_direct_type) :: direct_canonical = mp2_direct_type()
321 TYPE(libint_potential_type) :: potential_parameter = libint_potential_type()
322 TYPE(mp2_gpw_r3d_rs_type) :: mp2_gpw = mp2_gpw_r3d_rs_type()
323 TYPE(ri_mp2_type) :: ri_mp2 = ri_mp2_type()
324 TYPE(ri_rpa_type) :: ri_rpa = ri_rpa_type()
325 ! There is a bug with some older compilers preventing requiring an explicit initialization of allocatable components
326#if __GNUC__ < 9 || (__GNUC__ == 9 && __GNUC_MINOR__ < 5)
327 TYPE(ri_rpa_im_time_type) :: ri_rpa_im_time = ri_rpa_im_time_type(eigenval_gamma=null(), &
328 wkp_v=null(), &
329 starts_array_mc_ri=null(), &
330 ends_array_mc_ri=null(), &
331 starts_array_mc_block_ri=null(), &
332 ends_array_mc_block_ri=null(), &
333 starts_array_mc=null(), ends_array_mc=null(), &
334 starts_array_mc_block=null(), &
335 ends_array_mc_block=null())
336 TYPE(ri_g0w0_type) :: ri_g0w0 = ri_g0w0_type(vec_sigma_x_minus_vxc_gw=null(), &
337 xkp_special_kp=null(), &
338 matrix_sigma_x_minus_vxc=null(), &
339 matrix_ks=null())
340 TYPE(ri_basis_opt) :: ri_opt_param = ri_basis_opt(ri_nset_per_l=null())
341 TYPE(grad_util) :: ri_grad = grad_util(operator_half=null(), &
342 pq_half=null(), &
343 gamma_pq=null(), &
344 gamma_pq_2=null(), &
345 g_p_ia=null(), &
346 mo_coeff_o=null(), &
347 mo_coeff_v=null(), &
348 p_mo=null(), w_mo=null(), l_jb=null())
349#else
350 TYPE(ri_rpa_im_time_type) :: ri_rpa_im_time = ri_rpa_im_time_type()
351 TYPE(ri_g0w0_type) :: ri_g0w0 = ri_g0w0_type()
352 TYPE(ri_basis_opt) :: ri_opt_param = ri_basis_opt()
353 TYPE(grad_util) :: ri_grad = grad_util()
354#endif
355 REAL(kind=dp) :: mp2_memory = 0.0_dp, &
356 scale_s = 0.0_dp, &
357 scale_t = 0.0_dp
358 INTEGER :: mp2_num_proc = 0
359 INTEGER :: block_size_row = 0
360 INTEGER :: block_size_col = 0
361 LOGICAL :: calc_pq_cond_num = .false.
362 LOGICAL :: hf_fail = .false.
363 LOGICAL :: p_screen = .false.
364 LOGICAL :: not_last_hfx = .false.
365 LOGICAL :: do_im_time = .false.
366 INTEGER :: eri_method = eri_default
367 TYPE(cp_eri_mme_param), POINTER :: eri_mme_param => null()
368 INTEGER, DIMENSION(:), POINTER :: eri_blksize => null()
369 LOGICAL :: do_svd = .false.
370 REAL(kind=dp) :: eps_range = 0.0_dp
372 TYPE(c_ptr) :: local_gemm_ctx = c_null_ptr
373 REAL(dp) :: e_gap = 0.0_dp, &
374 e_range = 0.0_dp
375 END TYPE mp2_type
376
378 REAL(kind=dp), DIMENSION(:), ALLOCATABLE :: msg
379 INTEGER, DIMENSION(:), ALLOCATABLE :: sizes
380 INTEGER, DIMENSION(:, :), ALLOCATABLE :: indx
381 INTEGER :: proc = -1
382 TYPE(mp_request_type) :: msg_req = mp_request_type()
383 END TYPE integ_mat_buffer_type
384
386 REAL(kind=dp), DIMENSION(:, :), ALLOCATABLE :: msg
387 INTEGER :: proc = -1
388 TYPE(mp_request_type) :: msg_req = mp_request_type()
390
392 TYPE(pair_list_element_type), DIMENSION(:), &
393 ALLOCATABLE :: elements
394 INTEGER :: n_element = 0
395 END TYPE pair_list_type_mp2
396
397CONTAINS
398
399! **************************************************************************************************
400!> \brief ...
401!> \param mp2_env ...
402! **************************************************************************************************
403 SUBROUTINE mp2_env_release(mp2_env)
404 TYPE(mp2_type) :: mp2_env
405
406 CHARACTER(LEN=*), PARAMETER :: routinen = 'mp2_env_release'
407
408 INTEGER :: handle
409
410 CALL timeset(routinen, handle)
411
412 ! release the HFX section for the EXX calculation
413 IF (.NOT. mp2_env%ri_rpa%reuse_hfx) THEN
414 IF (ASSOCIATED(mp2_env%ri_rpa%x_data)) CALL hfx_release(mp2_env%ri_rpa%x_data)
415 END IF
416 IF (ASSOCIATED(mp2_env%ri_rpa%xc_section_aux)) CALL section_vals_release(mp2_env%ri_rpa%xc_section_aux)
417 IF (ASSOCIATED(mp2_env%ri_rpa%xc_section_primary)) CALL section_vals_release(mp2_env%ri_rpa%xc_section_primary)
418
419 IF (mp2_env%eri_method .EQ. do_eri_mme) CALL cp_eri_mme_finalize(mp2_env%eri_mme_param)
420 IF (ASSOCIATED(mp2_env%eri_mme_param)) DEALLOCATE (mp2_env%eri_mme_param)
421 IF (ASSOCIATED(mp2_env%ri_rpa_im_time%tau_tj)) DEALLOCATE (mp2_env%ri_rpa_im_time%tau_tj)
422 IF (ASSOCIATED(mp2_env%ri_rpa_im_time%tau_wj)) DEALLOCATE (mp2_env%ri_rpa_im_time%tau_wj)
423 IF (ASSOCIATED(mp2_env%ri_rpa_im_time%tj)) DEALLOCATE (mp2_env%ri_rpa_im_time%tj)
424 IF (ASSOCIATED(mp2_env%ri_rpa_im_time%wj)) DEALLOCATE (mp2_env%ri_rpa_im_time%wj)
425 IF (ASSOCIATED(mp2_env%ri_rpa_im_time%weights_cos_tf_t_to_w)) DEALLOCATE (mp2_env%ri_rpa_im_time%weights_cos_tf_t_to_w)
426 IF (ASSOCIATED(mp2_env%ri_rpa_im_time%weights_cos_tf_w_to_t)) DEALLOCATE (mp2_env%ri_rpa_im_time%weights_cos_tf_w_to_t)
427
428 CALL local_gemm_destroy(mp2_env%local_gemm_ctx)
429
430 CALL timestop(handle)
431
432 END SUBROUTINE mp2_env_release
433
434! **************************************************************************************************
435!> \brief ...
436!> \param mp2_env ...
437! **************************************************************************************************
438 SUBROUTINE mp2_env_create(mp2_env)
439 TYPE(mp2_type), POINTER :: mp2_env
440
441 CHARACTER(LEN=*), PARAMETER :: routinen = 'mp2_env_create'
442
443 INTEGER :: handle
444
445 CALL timeset(routinen, handle)
446
447 cpassert(.NOT. ASSOCIATED(mp2_env))
448
449 ALLOCATE (mp2_env)
450
451 ! these two functions are empty if spla is build without gpu support and
452 ! OFFLOAD_GEMM is not given at compilation time
453
454 CALL local_gemm_create(mp2_env%local_gemm_ctx, local_gemm_pu_gpu)
455 CALL local_gemm_set_op_threshold_gpu(mp2_env%local_gemm_ctx, 128*128*128*2)
456
457 NULLIFY (mp2_env%ri_rpa%x_data)
458
459 CALL timestop(handle)
460
461 END SUBROUTINE mp2_env_create
462
463END MODULE mp2_types
Interface to Minimax-Ewald method for periodic ERI's to be used in CP2K.
subroutine, public cp_eri_mme_finalize(param)
Release eri mme data. Prints some statistics on summation methods chosen.
represent a full matrix distributed on many processors
Definition cp_fm_types.F:15
Types and set/get functions for HFX.
Definition hfx_types.F:15
subroutine, public hfx_release(x_data)
This routine deallocates all data structures
Definition hfx_types.F:1905
collects all constants needed in input so that they can be used without circular dependencies
integer, parameter, public gw_pade_approx
integer, parameter, public mp2_method_direct
integer, parameter, public mp2_ri_optimize_basis
integer, parameter, public kp_weights_w_auto
integer, parameter, public do_eri_mme
integer, parameter, public wfc_mm_style_gemm
integer, parameter, public ri_rpa_method_gpw
integer, parameter, public ri_mp2_method_gpw
integer, parameter, public mp2_method_gpw
integer, parameter, public mp2_method_none
integer, parameter, public ri_mp2_laplace
integer, parameter, public eri_default
integer, parameter, public ri_rpa_g0w0_crossing_z_shot
integer, parameter, public soc_none
objects that represent the structure of input sections and the data contained in an input section
recursive subroutine, public section_vals_release(section_vals)
releases the given object
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
Types and basic routines needed for a kpoint calculation.
2- and 3-center electron repulsion integral routines based on libint2 Currently available operators: ...
integer, parameter, public local_gemm_pu_gpu
subroutine, public local_gemm_set_op_threshold_gpu(ctx, opthresholdgpu)
...
subroutine, public local_gemm_destroy(ctx)
release resources associated to a gemm context
subroutine, public local_gemm_create(ctx, pu)
create a context for handling gemm offloading
Interface to the message passing library MPI.
Calls routines to get RI integrals and calculate total energies.
Definition mp2_gpw.F:14
Types needed for MP2 calculations.
Definition mp2_types.F:14
subroutine, public mp2_env_create(mp2_env)
...
Definition mp2_types.F:439
integer, save, public init_tshpsc_lmax
Definition mp2_types.F:71
subroutine, public mp2_env_release(mp2_env)
...
Definition mp2_types.F:404
basis types for the calculation of the perturbation of density theory.
represent a full matrix
stores some data used in construction of Kohn-Sham matrix
Definition hfx_types.F:509
Contains information about kpoints.
Represent a qs system that is perturbed. Can calculate the linear operator and the rhs of the system ...