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 Types needed for MP2 calculations
10 : !> \par History
11 : !> 2011.05 created [Mauro Del Ben]
12 : !> \author MDB
13 : ! **************************************************************************************************
14 : MODULE mp2_types
15 : USE bse_types, ONLY: bse_env_release,&
16 : bse_env_type
17 : USE cp_dbcsr_api, ONLY: dbcsr_p_type,&
18 : dbcsr_type
19 : USE cp_eri_mme_interface, ONLY: cp_eri_mme_finalize,&
20 : cp_eri_mme_param
21 : USE cp_fm_types, ONLY: cp_fm_type
22 : USE hfx_types, ONLY: hfx_release,&
23 : hfx_type,&
24 : pair_list_element_type
25 : USE input_constants, ONLY: &
26 : cohsex_off, do_eri_mme, eri_default, gw_pade_approx, kp_weights_W_auto, mp2_method_direct, &
27 : mp2_method_gpw, mp2_method_none, mp2_ri_optimize_basis, ri_mp2_laplace, ri_mp2_method_gpw, &
28 : ri_rpa_g0w0_crossing_z_shot, ri_rpa_method_gpw, rpa_exchange_none, soc_none, &
29 : wfc_mm_style_gemm
30 : USE input_section_types, ONLY: section_vals_release,&
31 : section_vals_type
32 : USE kinds, ONLY: dp
33 : USE kpoint_types, ONLY: kpoint_type
34 : USE libint_2c_3c, ONLY: libint_potential_type
35 : USE local_gemm_api, ONLY: local_gemm_ctxt_type
36 : USE matrix_communication, ONLY: integ_mat_buffer_type => matrix_buffer_type
37 : USE message_passing, ONLY: mp_request_type
38 : USE qs_force_types, ONLY: qs_force_type
39 : USE qs_p_env_types, ONLY: qs_p_env_type
40 : USE time_frequency_grids, ONLY: time_frequency_grid_release,&
41 : time_frequency_grid_type
42 : #include "./base/base_uses.f90"
43 :
44 : IMPLICIT NONE
45 :
46 : PRIVATE
47 :
48 : CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'mp2_types'
49 :
50 : PUBLIC :: mp2_type, &
51 : integ_mat_buffer_type, &
52 : integ_mat_buffer_type_2D, &
53 : mp2_method_none, &
54 : mp2_method_direct, &
55 : mp2_method_gpw, &
56 : mp2_ri_optimize_basis, &
57 : ri_mp2_method_gpw, &
58 : ri_rpa_method_gpw, &
59 : ri_mp2_laplace, &
60 : init_TShPSC_lmax
61 :
62 : PUBLIC :: mp2_env_create, &
63 : mp2_env_release, &
64 : mp2_biel_type, &
65 : pair_list_type_mp2, &
66 : one_dim_int_array, &
67 : two_dim_int_array, &
68 : one_dim_real_array, &
69 : two_dim_real_array, &
70 : three_dim_real_array
71 :
72 : INTEGER, SAVE :: init_TShPSC_lmax = -1
73 :
74 : ! TYPE definitions
75 :
76 : TYPE one_dim_int_array
77 : INTEGER, DIMENSION(:), ALLOCATABLE :: array
78 : END TYPE one_dim_int_array
79 :
80 : TYPE two_dim_int_array
81 : INTEGER, DIMENSION(:, :), ALLOCATABLE :: array
82 : END TYPE two_dim_int_array
83 :
84 : TYPE one_dim_real_array
85 : REAL(KIND=dp), DIMENSION(:), ALLOCATABLE :: array
86 : END TYPE one_dim_real_array
87 :
88 : TYPE two_dim_real_array
89 : REAL(KIND=dp), DIMENSION(:, :), ALLOCATABLE :: array
90 : END TYPE two_dim_real_array
91 :
92 : TYPE three_dim_real_array
93 : REAL(KIND=dp), DIMENSION(:, :, :), ALLOCATABLE :: array
94 : END TYPE three_dim_real_array
95 :
96 : TYPE mp2_biel_type
97 : INTEGER, DIMENSION(:, :), ALLOCATABLE :: index_table
98 : END TYPE mp2_biel_type
99 :
100 : TYPE mp2_laplace_type
101 : INTEGER :: n_quadrature = -1, &
102 : num_integ_groups = -1
103 : END TYPE mp2_laplace_type
104 :
105 : TYPE mp2_direct_type
106 : LOGICAL :: big_send = .FALSE.
107 : END TYPE mp2_direct_type
108 :
109 : TYPE mp2_gpw_type
110 : REAL(KIND=dp) :: eps_grid = 0.0_dp, &
111 : eps_filter = 0.0_dp, &
112 : eps_pgf_orb_S = 0.0_dp
113 : INTEGER :: print_level = 0
114 : REAL(KIND=dp) :: cutoff = 0.0_dp, &
115 : relative_cutoff = 0.0_dp
116 : INTEGER :: size_lattice_sum = 0
117 : END TYPE mp2_gpw_type
118 :
119 : TYPE ri_mp2_type
120 : INTEGER :: block_size = 0, &
121 : number_integration_groups = 0
122 : LOGICAL :: print_dgemm_info = .FALSE.
123 : END TYPE ri_mp2_type
124 :
125 : TYPE ri_rpa_type
126 : INTEGER :: rpa_num_quad_points = -1, &
127 : rpa_num_integ_groups = -1, &
128 : mm_style = wfc_mm_style_gemm
129 : TYPE(hfx_type), DIMENSION(:, :), POINTER :: x_data => NULL()
130 : TYPE(section_vals_type), POINTER :: xc_section_primary => Null(), &
131 : xc_section_aux => Null()
132 : LOGICAL :: reuse_hfx = .FALSE., &
133 : minimax_quad = .FALSE., &
134 : do_ri_g0w0 = .FALSE., &
135 : do_admm = .FALSE., &
136 : do_rse = .FALSE., &
137 : print_dgemm_info = .FALSE.
138 :
139 : ! GCC 8 has an issue with this being an ALLOCATABLE
140 : TYPE(dbcsr_type), DIMENSION(:), POINTER :: mo_coeff_o => NULL(), &
141 : mo_coeff_v => NULL()
142 : INTEGER :: exchange_correction = rpa_exchange_none, &
143 : exchange_block_size = -1
144 : LOGICAL :: use_hfx_implementation = .FALSE.
145 : REAL(KIND=dp) :: ener_exchange = 0.0_dp, &
146 : rse_corr_diag = 0.0_dp, &
147 : rse_corr = 0.0_dp, &
148 : scale_rpa = 0.0_dp
149 :
150 : !LOGICAL :: do_sigma = .FALSE.
151 : INTEGER :: sigma_param = 0.0_dp
152 : REAL(KIND=dp) :: e_sigma_corr = 0.0_dp
153 :
154 : END TYPE ri_rpa_type
155 :
156 : TYPE ri_rpa_im_time_type
157 : INTEGER :: cut_memory = 0
158 : LOGICAL :: memory_info = .FALSE., &
159 : make_chi_pos_definite = .FALSE., &
160 : make_overlap_mat_ao_pos_definite = .FALSE., &
161 : trunc_coulomb_ri_x = .FALSE., &
162 : keep_quad = .FALSE., &
163 : do_kpoints_from_Gamma = .FALSE., &
164 : do_extrapolate_kpoints = .FALSE.
165 : REAL(KIND=dp) :: eps_filter = 0.0_dp, &
166 : eps_filter_factor = 0.0_dp, &
167 : eps_compress = 0.0_dp, &
168 : exp_tailored_weights = 0.0_dp, &
169 : regularization_RI = 0.0_dp, &
170 : eps_eigval_S = 0.0_dp, &
171 : eps_eigval_S_Gamma = 0.0_dp, &
172 : rel_cutoff_trunc_coulomb_ri_x = 0.0_dp
173 : TYPE(time_frequency_grid_type) :: time_frequency_grid
174 : REAL(KIND=dp), DIMENSION(:), ALLOCATABLE :: Eigenval_Gamma, &
175 : wkp_V
176 : INTEGER :: group_size_P = 0, &
177 : group_size_3c = 0, &
178 : kpoint_weights_W_method = kp_weights_W_auto, &
179 : k_mesh_g_factor = 0
180 : INTEGER, DIMENSION(:), POINTER :: kp_grid => NULL()
181 : INTEGER, DIMENSION(3) :: kp_grid_extra = -1
182 : LOGICAL :: do_im_time_kpoints = .FALSE.
183 : INTEGER :: min_bsize = 0, &
184 : min_bsize_mo = 0, &
185 : nkp_orig = 0, &
186 : nkp_extra = 0
187 : TYPE(kpoint_type), POINTER :: kpoints_G => NULL(), &
188 : kpoints_Sigma => NULL(), &
189 : kpoints_Sigma_no_xc => NULL()
190 : INTEGER, ALLOCATABLE, DIMENSION(:) :: starts_array_mc_RI, ends_array_mc_RI, &
191 : starts_array_mc_block_RI, &
192 : ends_array_mc_block_RI, &
193 : starts_array_mc, ends_array_mc, &
194 : starts_array_mc_block, &
195 : ends_array_mc_block
196 :
197 : END TYPE ri_rpa_im_time_type
198 :
199 : TYPE ri_g0w0_type
200 : INTEGER :: corr_mos_occ = 0, &
201 : corr_mos_virt = 0, &
202 : corr_mos_occ_beta = 0, &
203 : corr_mos_virt_beta = 0, &
204 : num_poles = 0, &
205 : nparam_pade = 0, &
206 : analytic_continuation = gw_pade_approx
207 : REAL(KIND=dp) :: omega_max_fit = 0.0_dp
208 : INTEGER :: crossing_search = ri_rpa_g0w0_crossing_z_shot
209 : REAL(KIND=dp) :: fermi_level_offset = 0.0_dp
210 : INTEGER :: iter_evGW = 0, &
211 : iter_sc_GW0 = 0
212 : REAL(KIND=dp) :: eps_iter = 0.0_dp
213 : LOGICAL :: do_hedin_shift = .FALSE., &
214 : do_ri_Sigma_x = .FALSE., &
215 : do_periodic = .FALSE., &
216 : print_self_energy = .FALSE.
217 : REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :, :) :: vec_Sigma_x_minus_vxc_gw
218 : INTEGER, DIMENSION(:), POINTER :: kp_grid => NULL(), &
219 : kp_grid_Sigma => NULL()
220 : INTEGER :: num_kp_grids = 0
221 : REAL(KIND=dp) :: eps_kpoint = 0.0_dp
222 : LOGICAL :: do_mo_coeff_gamma = .FALSE., &
223 : do_average_deg_levels = .FALSE.
224 : REAL(KIND=dp) :: eps_eigenval = 0.0_dp
225 : LOGICAL :: do_extra_kpoints = .FALSE., &
226 : do_aux_bas_gw = .FALSE.
227 : REAL(KIND=dp) :: frac_aux_mos = 0.0_dp
228 : INTEGER :: num_omega_points = 0
229 : LOGICAL :: do_ic_model = .FALSE., &
230 : print_ic_values = .FALSE.
231 : REAL(KIND=dp) :: eps_dist = 0.0_dp
232 : TYPE(one_dim_real_array), DIMENSION(2) :: ic_corr_list = one_dim_real_array(NULL())
233 : INTEGER :: print_exx = 0
234 : LOGICAL :: do_gamma_only_sigma = .FALSE.
235 : LOGICAL :: update_xc_energy = .FALSE., &
236 : do_kpoints_Sigma = .FALSE., &
237 : print_local_bandgap = .FALSE.
238 : INTEGER :: n_kp_in_kp_line = 0, &
239 : n_special_kp = 0, &
240 : nkp_self_energy = 0, &
241 : nkp_self_energy_special_kp = 0, &
242 : nkp_self_energy_monkh_pack = 0, &
243 : soc_type = soc_none
244 : REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :) :: xkp_special_kp
245 : TYPE(dbcsr_p_type), DIMENSION(:), ALLOCATABLE :: matrix_sigma_x_minus_vxc, &
246 : matrix_ks, &
247 : matrix_vxc
248 : LOGICAL :: do_static_cohsex = .FALSE.
249 : INTEGER :: cohsex_flavor = cohsex_off
250 : REAL(KIND=dp) :: cohsex_scale_occ = 1.0_dp, &
251 : cohsex_scale_virt = 1.0_dp
252 : REAL(KIND=dp) :: broadening_print_loc_bandgap = 0.0_dp, &
253 : energy_window_print_loc_bandgap = 0.0_dp, &
254 : ldos_thresh_print_loc_bandgap = 0.0_dp, &
255 : energy_spacing_print_loc_bandgap = 0.0_dp, &
256 : regularization_minimax = 0.0_dp, &
257 : soc_energy_window = 0.0_dp
258 : INTEGER, DIMENSION(:), POINTER :: stride_loc_bandgap => NULL()
259 :
260 : !GW_DOS
261 : REAL(KIND=dp) :: dos_upper = 0.0_dp, &
262 : dos_lower = 0.0_dp, &
263 : dos_prec = 0.0_dp, &
264 : dos_eta = 0.0_dp
265 : INTEGER :: max_level_self_energy = 0, &
266 : min_level_self_energy = 0, &
267 : dos_min = 0, &
268 : dos_max = 0
269 : END TYPE ri_g0w0_type
270 :
271 : TYPE ri_basis_opt
272 : REAL(KIND=dp) :: DI_rel = 0.0_dp, &
273 : DRI = 0.0_dp, &
274 : eps_step = 0.0_dp
275 : INTEGER :: max_num_iter = 0, &
276 : basis_quality = 0
277 : INTEGER, DIMENSION(:), ALLOCATABLE :: RI_nset_per_l
278 : END TYPE ri_basis_opt
279 :
280 : TYPE grad_util
281 : TYPE(two_dim_real_array), DIMENSION(2) :: P_ij = two_dim_real_array(NULL()), &
282 : P_ab = two_dim_real_array(NULL())
283 : TYPE(three_dim_real_array), DIMENSION(2) :: Gamma_P_ia = three_dim_real_array(NULL())
284 : REAL(KIND=dp), DIMENSION(:, :), ALLOCATABLE :: operator_half, &
285 : PQ_half, &
286 : Gamma_PQ, &
287 : Gamma_PQ_2
288 : TYPE(dbcsr_p_type), DIMENSION(:, :), ALLOCATABLE :: G_P_ia
289 : TYPE(dbcsr_p_type), DIMENSION(:), ALLOCATABLE :: mo_coeff_o, &
290 : mo_coeff_v
291 : TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:) :: P_mo, W_mo, L_jb
292 : REAL(KIND=dp) :: cphf_eps_conv = 0.0_dp, &
293 : scale_step_size = 0.0_dp
294 : INTEGER :: cphf_max_num_iter = 0, &
295 : z_solver_method = 0, &
296 : cphf_restart = 0
297 : LOGICAL :: enforce_decrease = .FALSE., &
298 : recalc_residual = .FALSE., &
299 : polak_ribiere = .FALSE.
300 : TYPE(qs_p_env_type), POINTER :: p_env => NULL()
301 : TYPE(qs_force_type), DIMENSION(:), POINTER :: mp2_force => NULL()
302 : REAL(KIND=dp), DIMENSION(3, 3) :: mp2_virial = 0.0_dp
303 : REAL(dp) :: eps_canonical = 0.0_dp
304 : LOGICAL :: free_hfx_buffer = .FALSE.
305 : INTEGER :: dot_blksize = 0
306 : INTEGER :: max_parallel_comm = 0
307 : END TYPE grad_util
308 :
309 : TYPE mp2_type
310 : INTEGER :: method = mp2_method_none
311 : TYPE(mp2_laplace_type) :: ri_laplace = mp2_laplace_type()
312 : TYPE(mp2_direct_type) :: direct_canonical = mp2_direct_type()
313 : TYPE(libint_potential_type) :: potential_parameter = libint_potential_type()
314 : TYPE(mp2_gpw_type) :: mp2_gpw = mp2_gpw_type()
315 : TYPE(ri_mp2_type) :: ri_mp2 = ri_mp2_type()
316 : TYPE(ri_rpa_type) :: ri_rpa = ri_rpa_type()
317 : ! There is a bug with some older compilers preventing requiring an explicit initialization of allocatable components
318 : #if defined(FTN_NO_DEFAULT_INIT)
319 : TYPE(ri_rpa_im_time_type) :: ri_rpa_im_time = ri_rpa_im_time_type( &
320 : time_frequency_grid=time_frequency_grid_type( &
321 : frequency=NULL(), &
322 : frequency_weights=NULL(), &
323 : imaginary_time=NULL(), &
324 : time_weights_at_zero_frequency=NULL(), &
325 : cosine_time_to_frequency=NULL(), &
326 : cosine_frequency_to_time=NULL(), &
327 : sine_time_to_frequency=NULL()), &
328 : Eigenval_Gamma=NULL(), &
329 : wkp_V=NULL(), &
330 : starts_array_mc_RI=NULL(), &
331 : ends_array_mc_RI=NULL(), &
332 : starts_array_mc_block_RI=NULL(), &
333 : ends_array_mc_block_RI=NULL(), &
334 : starts_array_mc=NULL(), ends_array_mc=NULL(), &
335 : starts_array_mc_block=NULL(), &
336 : ends_array_mc_block=NULL())
337 : TYPE(ri_g0w0_type) :: ri_g0w0 = ri_g0w0_type(vec_Sigma_x_minus_vxc_gw=NULL(), &
338 : xkp_special_kp=NULL(), &
339 : matrix_sigma_x_minus_vxc=NULL(), &
340 : matrix_ks=NULL(), &
341 : matrix_vxc=NULL())
342 : TYPE(ri_basis_opt) :: ri_opt_param = ri_basis_opt(RI_nset_per_l=NULL())
343 : TYPE(grad_util) :: ri_grad = grad_util(operator_half=NULL(), &
344 : PQ_half=NULL(), &
345 : Gamma_PQ=NULL(), &
346 : Gamma_PQ_2=NULL(), &
347 : G_P_ia=NULL(), &
348 : mo_coeff_o=NULL(), &
349 : mo_coeff_v=NULL(), &
350 : P_mo=NULL(), W_mo=NULL(), L_jb=NULL())
351 : TYPE(bse_env_type) :: bse = bse_env_type(bse_nto_state_list_final=NULL(), &
352 : homo_red=NULL(), virt_red=NULL(), &
353 : homo_full=NULL(), gw_corr_lev_virt=NULL(), &
354 : eigenval_dft=NULL(), eigenval_qp=NULL(), &
355 : fm_S_ia=NULL(), &
356 : fm_S_ij=NULL(), fm_S_ab=NULL(), &
357 : fm_S_bar_ia=NULL(), fm_S_bar_ij=NULL())
358 : #else
359 : TYPE(ri_rpa_im_time_type) :: ri_rpa_im_time = ri_rpa_im_time_type()
360 : TYPE(ri_g0w0_type) :: ri_g0w0 = ri_g0w0_type()
361 : TYPE(ri_basis_opt) :: ri_opt_param = ri_basis_opt()
362 : TYPE(grad_util) :: ri_grad = grad_util()
363 : TYPE(bse_env_type) :: bse = bse_env_type()
364 : #endif
365 : REAL(KIND=dp) :: mp2_memory = 0.0_dp, &
366 : scale_S = 0.0_dp, &
367 : scale_T = 0.0_dp
368 : INTEGER :: mp2_num_proc = 0
369 : INTEGER :: block_size_row = 0
370 : INTEGER :: block_size_col = 0
371 : LOGICAL :: calc_PQ_cond_num = .FALSE.
372 : LOGICAL :: hf_fail = .FALSE.
373 : LOGICAL :: p_screen = .FALSE.
374 : LOGICAL :: not_last_hfx = .FALSE.
375 : LOGICAL :: do_im_time = .FALSE.
376 : INTEGER :: eri_method = eri_default
377 : TYPE(cp_eri_mme_param), POINTER :: eri_mme_param => NULL()
378 : INTEGER, DIMENSION(:), POINTER :: eri_blksize => NULL()
379 : LOGICAL :: do_svd = .FALSE.
380 : REAL(KIND=dp) :: eps_svd = -1.0_dp
381 : REAL(KIND=dp) :: eps_range = 0.0_dp
382 : TYPE(libint_potential_type) :: ri_metric = libint_potential_type()
383 : TYPE(local_gemm_ctxt_type) :: local_gemm_ctx = local_gemm_ctxt_type()
384 : REAL(dp) :: e_gap = 0.0_dp, &
385 : e_range = 0.0_dp
386 : LOGICAL :: ri_aux_auto_generated = .FALSE.
387 : END TYPE mp2_type
388 :
389 : TYPE integ_mat_buffer_type_2D
390 : REAL(KIND=dp), DIMENSION(:, :), ALLOCATABLE :: msg
391 : INTEGER :: proc = -1
392 : TYPE(mp_request_type) :: msg_req = mp_request_type()
393 : END TYPE integ_mat_buffer_type_2D
394 :
395 : TYPE pair_list_type_mp2
396 : TYPE(pair_list_element_type), DIMENSION(:), &
397 : ALLOCATABLE :: elements
398 : INTEGER :: n_element = 0
399 : END TYPE pair_list_type_mp2
400 :
401 : CONTAINS
402 :
403 : ! **************************************************************************************************
404 : !> \brief ...
405 : !> \param mp2_env ...
406 : ! **************************************************************************************************
407 512 : SUBROUTINE mp2_env_release(mp2_env)
408 : TYPE(mp2_type) :: mp2_env
409 :
410 : CHARACTER(LEN=*), PARAMETER :: routineN = 'mp2_env_release'
411 :
412 : INTEGER :: handle
413 :
414 512 : CALL timeset(routineN, handle)
415 :
416 : ! release the HFX section for the EXX calculation
417 512 : IF (.NOT. mp2_env%ri_rpa%reuse_hfx) THEN
418 494 : IF (ASSOCIATED(mp2_env%ri_rpa%x_data)) CALL hfx_release(mp2_env%ri_rpa%x_data)
419 : END IF
420 512 : IF (ASSOCIATED(mp2_env%ri_rpa%xc_section_aux)) CALL section_vals_release(mp2_env%ri_rpa%xc_section_aux)
421 512 : IF (ASSOCIATED(mp2_env%ri_rpa%xc_section_primary)) CALL section_vals_release(mp2_env%ri_rpa%xc_section_primary)
422 :
423 512 : IF (mp2_env%eri_method == do_eri_mme) CALL cp_eri_mme_finalize(mp2_env%eri_mme_param)
424 512 : IF (ASSOCIATED(mp2_env%eri_mme_param)) DEALLOCATE (mp2_env%eri_mme_param)
425 512 : CALL time_frequency_grid_release(mp2_env%ri_rpa_im_time%time_frequency_grid)
426 :
427 512 : CALL mp2_env%local_gemm_ctx%destroy()
428 512 : CALL bse_env_release(mp2_env%bse)
429 :
430 512 : CALL timestop(handle)
431 :
432 512 : END SUBROUTINE mp2_env_release
433 :
434 : ! **************************************************************************************************
435 : !> \brief ...
436 : !> \param mp2_env ...
437 : ! **************************************************************************************************
438 512 : 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 512 : CALL timeset(routineN, handle)
446 :
447 512 : CPASSERT(.NOT. ASSOCIATED(mp2_env))
448 :
449 13824 : ALLOCATE (mp2_env)
450 :
451 512 : NULLIFY (mp2_env%ri_rpa%x_data)
452 :
453 512 : CALL timestop(handle)
454 :
455 512 : END SUBROUTINE mp2_env_create
456 :
457 0 : END MODULE mp2_types
|