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_setup
15 : USE bse_input, ONLY: read_bse_section
16 : USE cp_eri_mme_interface, ONLY: cp_eri_mme_init_read_input
17 : USE cp_log_handling, ONLY: cp_get_default_logger,&
18 : cp_logger_type
19 : USE cp_output_handling, ONLY: cp_p_file,&
20 : cp_print_key_finished_output,&
21 : cp_print_key_should_output,&
22 : cp_print_key_unit_nr
23 : USE cp_parser_methods, ONLY: read_float_object
24 : USE input_constants, ONLY: &
25 : cohsex_off, do_eri_mme, do_potential_short, evGW, evGW0, mp2_method_direct, &
26 : mp2_method_gpw, mp2_method_none, mp2_ri_optimize_basis, ri_mp2_laplace, ri_mp2_method_gpw, &
27 : ri_rpa_method_gpw
28 : USE input_section_types, ONLY: section_vals_get_subs_vals,&
29 : section_vals_type,&
30 : section_vals_val_get
31 : USE kinds, ONLY: default_string_length,&
32 : dp,&
33 : max_line_length
34 : USE machine, ONLY: m_flush
35 : USE mathlib, ONLY: erfc_cutoff
36 : USE mp2_types, ONLY: mp2_method_direct,&
37 : mp2_method_gpw,&
38 : mp2_method_none,&
39 : mp2_ri_optimize_basis,&
40 : mp2_type,&
41 : ri_mp2_laplace,&
42 : ri_mp2_method_gpw,&
43 : ri_rpa_method_gpw
44 : #include "./base/base_uses.f90"
45 :
46 : IMPLICIT NONE
47 :
48 : PRIVATE
49 :
50 : CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'mp2_setup'
51 :
52 : PUBLIC :: read_mp2_section
53 :
54 : CONTAINS
55 :
56 : ! **************************************************************************************************
57 : !> \brief ...
58 : !> \param input ...
59 : !> \param mp2_env ...
60 : ! **************************************************************************************************
61 512 : SUBROUTINE read_mp2_section(input, mp2_env)
62 : TYPE(section_vals_type), POINTER :: input
63 : TYPE(mp2_type), INTENT(INOUT) :: mp2_env
64 :
65 : CHARACTER(len=*), PARAMETER :: routineN = 'read_mp2_section'
66 :
67 : CHARACTER(LEN=default_string_length), &
68 512 : DIMENSION(:), POINTER :: string_pointer
69 : CHARACTER(LEN=max_line_length) :: error_message
70 : INTEGER :: gw_sc, handle, i, i_special_kp, ival, &
71 : unit_nr
72 512 : INTEGER, DIMENSION(:), POINTER :: tmplist
73 : LOGICAL :: do_mp2, do_opt_ri_basis, do_ri_mp2, &
74 : do_ri_sos_mp2, do_rpa
75 512 : REAL(KIND=dp), DIMENSION(:), POINTER :: r_vals
76 : TYPE(cp_logger_type), POINTER :: logger
77 : TYPE(section_vals_type), POINTER :: bse_section, cphf_section, &
78 : eri_mme_section, gw_section, &
79 : low_scaling_section, mp2_section
80 :
81 512 : CALL timeset(routineN, handle)
82 512 : logger => cp_get_default_logger()
83 :
84 512 : mp2_section => section_vals_get_subs_vals(input, "DFT%XC%WF_CORRELATION")
85 :
86 512 : mp2_env%method = mp2_method_none
87 :
88 : ! should come from input
89 512 : CALL section_vals_val_get(mp2_section, "MEMORY", r_val=mp2_env%mp2_memory)
90 512 : CALL section_vals_val_get(mp2_section, "SCALE_S", r_val=mp2_env%scale_S)
91 512 : CALL section_vals_val_get(mp2_section, "SCALE_T", r_val=mp2_env%scale_T)
92 512 : CALL section_vals_val_get(mp2_section, "GROUP_SIZE", i_val=mp2_env%mp2_num_proc)
93 512 : CALL section_vals_val_get(mp2_section, "E_GAP", r_val=mp2_env%e_gap)
94 512 : CALL section_vals_val_get(mp2_section, "E_RANGE", r_val=mp2_env%e_range)
95 :
96 512 : CALL section_vals_val_get(mp2_section, "MP2%_SECTION_PARAMETERS_", l_val=do_mp2)
97 512 : CALL section_vals_val_get(mp2_section, "MP2%BIG_SEND", l_val=mp2_env%direct_canonical%big_send)
98 512 : IF (do_mp2) THEN
99 32 : CALL check_method(mp2_env%method)
100 32 : CALL section_vals_val_get(mp2_section, "MP2%METHOD", i_val=mp2_env%method)
101 : END IF
102 :
103 512 : CALL section_vals_val_get(mp2_section, "RI_RPA%_SECTION_PARAMETERS_", l_val=do_rpa)
104 :
105 : !CALL section_vals_val_get(mp2_section, "RI_RPA%SIGMA_FUNCTIONAL",l_val=mp2_env%ri_rpa%do_sigma)
106 512 : CALL section_vals_val_get(mp2_section, "RI_RPA%SIGMA_FUNCTIONAL", i_val=mp2_env%ri_rpa%sigma_param)
107 :
108 512 : IF (do_rpa) THEN
109 250 : CALL check_method(mp2_env%method)
110 250 : mp2_env%method = ri_rpa_method_gpw
111 : END IF
112 512 : CALL section_vals_val_get(mp2_section, "RI_RPA%RPA_NUM_QUAD_POINTS", i_val=mp2_env%ri_rpa%rpa_num_quad_points)
113 512 : CALL section_vals_val_get(mp2_section, "RI_RPA%NUM_INTEG_GROUPS", i_val=mp2_env%ri_rpa%rpa_num_integ_groups)
114 512 : CALL section_vals_val_get(mp2_section, "RI_RPA%MM_STYLE", i_val=mp2_env%ri_rpa%mm_style)
115 512 : CALL section_vals_val_get(mp2_section, "RI_RPA%MINIMAX_QUADRATURE", l_val=mp2_env%ri_rpa%minimax_quad)
116 512 : CALL section_vals_val_get(mp2_section, "RI_RPA%ADMM", l_val=mp2_env%ri_rpa%do_admm)
117 512 : CALL section_vals_val_get(mp2_section, "RI_RPA%SCALE_RPA", r_val=mp2_env%ri_rpa%scale_rpa)
118 512 : mp2_env%ri_rpa%reuse_hfx = .FALSE.
119 :
120 : CALL section_vals_val_get(mp2_section, "RI_RPA%EXCHANGE_CORRECTION%_SECTION_PARAMETERS_", &
121 512 : i_val=mp2_env%ri_rpa%exchange_correction)
122 : CALL section_vals_val_get(mp2_section, "RI_RPA%EXCHANGE_CORRECTION%BLOCK_SIZE", &
123 512 : i_val=mp2_env%ri_rpa%exchange_block_size)
124 : CALL section_vals_val_get(mp2_section, "RI_RPA%EXCHANGE_CORRECTION%USE_HFX_IMPLEMENTATION", &
125 512 : l_val=mp2_env%ri_rpa%use_hfx_implementation)
126 :
127 512 : CALL section_vals_val_get(mp2_section, "RI_RPA%RSE", l_val=mp2_env%ri_rpa%do_rse)
128 :
129 512 : CALL section_vals_val_get(mp2_section, "RI_RPA%PRINT_DGEMM_INFO", l_val=mp2_env%ri_rpa%print_dgemm_info)
130 :
131 512 : NULLIFY (gw_section)
132 512 : gw_section => section_vals_get_subs_vals(mp2_section, "RI_RPA%GW")
133 : CALL section_vals_val_get(gw_section, "_SECTION_PARAMETERS_", &
134 512 : l_val=mp2_env%ri_rpa%do_ri_g0w0)
135 : CALL section_vals_val_get(mp2_section, "RI_RPA%GW%SELF_CONSISTENCY", &
136 512 : i_val=gw_sc)
137 : CALL section_vals_val_get(mp2_section, "RI_RPA%GW%CORR_MOS_OCC", &
138 512 : i_val=mp2_env%ri_g0w0%corr_mos_occ)
139 : CALL section_vals_val_get(mp2_section, "RI_RPA%GW%CORR_MOS_VIRT", &
140 512 : i_val=mp2_env%ri_g0w0%corr_mos_virt)
141 : CALL section_vals_val_get(mp2_section, "RI_RPA%GW%NUMB_POLES", &
142 512 : i_val=mp2_env%ri_g0w0%num_poles)
143 : CALL section_vals_val_get(mp2_section, "RI_RPA%GW%NPARAM_PADE", &
144 512 : i_val=mp2_env%ri_g0w0%nparam_pade)
145 : CALL section_vals_val_get(mp2_section, "RI_RPA%GW%ANALYTIC_CONTINUATION", &
146 512 : i_val=mp2_env%ri_g0w0%analytic_continuation)
147 : CALL section_vals_val_get(mp2_section, "RI_RPA%GW%OMEGA_MAX_FIT", &
148 512 : r_val=mp2_env%ri_g0w0%omega_max_fit)
149 : CALL section_vals_val_get(mp2_section, "RI_RPA%GW%CROSSING_SEARCH", &
150 512 : i_val=mp2_env%ri_g0w0%crossing_search)
151 : CALL section_vals_val_get(mp2_section, "RI_RPA%GW%FERMI_LEVEL_OFFSET", &
152 512 : r_val=mp2_env%ri_g0w0%fermi_level_offset)
153 : CALL section_vals_val_get(mp2_section, "RI_RPA%GW%HEDIN_SHIFT", &
154 512 : l_val=mp2_env%ri_g0w0%do_hedin_shift)
155 : CALL section_vals_val_get(mp2_section, "RI_RPA%GW%EV_GW_ITER", &
156 512 : i_val=mp2_env%ri_g0w0%iter_evGW)
157 512 : IF (gw_sc == evGW) mp2_env%ri_g0w0%iter_evGW = 10
158 : CALL section_vals_val_get(mp2_section, "RI_RPA%GW%SC_GW0_ITER", &
159 512 : i_val=mp2_env%ri_g0w0%iter_sc_GW0)
160 512 : IF (gw_sc == evGW0) mp2_env%ri_g0w0%iter_sc_GW0 = 10
161 : CALL section_vals_val_get(mp2_section, "RI_RPA%GW%EPS_ITER", &
162 512 : r_val=mp2_env%ri_g0w0%eps_iter)
163 : CALL section_vals_val_get(mp2_section, "RI_RPA%GW%PRINT_EXX", &
164 512 : i_val=mp2_env%ri_g0w0%print_exx)
165 : CALL section_vals_val_get(mp2_section, "RI_RPA%GW%PRINT_SELF_ENERGY", &
166 512 : l_val=mp2_env%ri_g0w0%print_self_energy)
167 : CALL section_vals_val_get(mp2_section, "RI_RPA%GW%RI_SIGMA_X", &
168 512 : l_val=mp2_env%ri_g0w0%do_ri_Sigma_x)
169 : CALL section_vals_val_get(mp2_section, "RI_RPA%GW%COHSEX", &
170 512 : i_val=mp2_env%ri_g0w0%cohsex_flavor)
171 512 : mp2_env%ri_g0w0%do_static_cohsex = (mp2_env%ri_g0w0%cohsex_flavor /= cohsex_off)
172 : CALL section_vals_val_get(mp2_section, "RI_RPA%GW%COHSEX_SCALE_OCC", &
173 512 : r_val=mp2_env%ri_g0w0%cohsex_scale_occ)
174 : CALL section_vals_val_get(mp2_section, "RI_RPA%GW%COHSEX_SCALE_VIRT", &
175 512 : r_val=mp2_env%ri_g0w0%cohsex_scale_virt)
176 :
177 512 : NULLIFY (r_vals)
178 : CALL section_vals_val_get(mp2_section, "RI_RPA%GW%IC_CORR_LIST", &
179 512 : r_vals=r_vals)
180 1536 : ALLOCATE (mp2_env%ri_g0w0%ic_corr_list(1)%array(SIZE(r_vals)))
181 1024 : mp2_env%ri_g0w0%ic_corr_list(1)%array(:) = r_vals(:)
182 512 : NULLIFY (r_vals)
183 : CALL section_vals_val_get(mp2_section, "RI_RPA%GW%IC_CORR_LIST_BETA", &
184 512 : r_vals=r_vals)
185 1536 : ALLOCATE (mp2_env%ri_g0w0%ic_corr_list(2)%array(SIZE(r_vals)))
186 1024 : mp2_env%ri_g0w0%ic_corr_list(2)%array(:) = r_vals(:)
187 : CALL section_vals_val_get(mp2_section, "RI_RPA%GW%GAMMA_ONLY_SIGMA", &
188 512 : l_val=mp2_env%ri_g0w0%do_gamma_only_sigma)
189 : CALL section_vals_val_get(mp2_section, "RI_RPA%GW%UPDATE_XC_ENERGY", &
190 512 : l_val=mp2_env%ri_g0w0%update_xc_energy)
191 : CALL section_vals_val_get(mp2_section, "RI_RPA%GW%REGULARIZATION_MINIMAX", &
192 512 : r_val=mp2_env%ri_g0w0%regularization_minimax)
193 : CALL section_vals_val_get(mp2_section, "RI_RPA%GW%SOC", &
194 512 : i_val=mp2_env%ri_g0w0%soc_type)
195 : CALL section_vals_val_get(mp2_section, "RI_RPA%GW%SOC_ENERGY_WINDOW", &
196 512 : r_val=mp2_env%ri_g0w0%soc_energy_window)
197 :
198 512 : NULLIFY (bse_section)
199 512 : bse_section => section_vals_get_subs_vals(mp2_section, "RI_RPA%GW%BSE")
200 512 : CALL read_bse_section(bse_section, mp2_env%bse)
201 :
202 : CALL section_vals_val_get(mp2_section, "RI_RPA%GW%IMAGE_CHARGE_MODEL", &
203 512 : l_val=mp2_env%ri_g0w0%do_ic_model)
204 : CALL section_vals_val_get(mp2_section, "RI_RPA%GW%IC%PRINT_IC_LIST", &
205 512 : l_val=mp2_env%ri_g0w0%print_ic_values)
206 : CALL section_vals_val_get(mp2_section, "RI_RPA%GW%IC%EPS_DIST", &
207 512 : r_val=mp2_env%ri_g0w0%eps_dist)
208 :
209 : CALL section_vals_val_get(mp2_section, "RI_RPA%GW%PERIODIC_CORRECTION", &
210 512 : l_val=mp2_env%ri_g0w0%do_periodic)
211 : CALL section_vals_val_get(mp2_section, "RI_RPA%GW%PERIODIC_CORRECTION%KPOINTS", &
212 512 : i_vals=mp2_env%ri_g0w0%kp_grid)
213 : CALL section_vals_val_get(mp2_section, "RI_RPA%GW%PERIODIC_CORRECTION%NUM_KP_GRIDS", &
214 512 : i_val=mp2_env%ri_g0w0%num_kp_grids)
215 : CALL section_vals_val_get(mp2_section, "RI_RPA%GW%PERIODIC_CORRECTION%EPS_KPOINT", &
216 512 : r_val=mp2_env%ri_g0w0%eps_kpoint)
217 : CALL section_vals_val_get(mp2_section, "RI_RPA%GW%PERIODIC_CORRECTION%MO_COEFF_GAMMA", &
218 512 : l_val=mp2_env%ri_g0w0%do_mo_coeff_gamma)
219 : CALL section_vals_val_get(mp2_section, "RI_RPA%GW%PERIODIC_CORRECTION%AVERAGE_DEGENERATE_LEVELS", &
220 512 : l_val=mp2_env%ri_g0w0%do_average_deg_levels)
221 : CALL section_vals_val_get(mp2_section, "RI_RPA%GW%PERIODIC_CORRECTION%EPS_EIGENVAL", &
222 512 : r_val=mp2_env%ri_g0w0%eps_eigenval)
223 : CALL section_vals_val_get(mp2_section, "RI_RPA%GW%PERIODIC_CORRECTION%EXTRAPOLATE_KPOINTS", &
224 512 : l_val=mp2_env%ri_g0w0%do_extra_kpoints)
225 : CALL section_vals_val_get(mp2_section, "RI_RPA%GW%PERIODIC_CORRECTION%DO_AUX_BAS_GW", &
226 512 : l_val=mp2_env%ri_g0w0%do_aux_bas_gw)
227 : CALL section_vals_val_get(mp2_section, "RI_RPA%GW%PERIODIC_CORRECTION%FRACTION_AUX_MOS", &
228 512 : r_val=mp2_env%ri_g0w0%frac_aux_mos)
229 : CALL section_vals_val_get(mp2_section, "RI_RPA%GW%PERIODIC_CORRECTION%NUM_OMEGA_POINTS", &
230 512 : i_val=mp2_env%ri_g0w0%num_omega_points)
231 :
232 : CALL section_vals_val_get(mp2_section, "RI_RPA%GW%KPOINT_SET%NPOINTS", &
233 512 : i_val=mp2_env%ri_g0w0%n_kp_in_kp_line)
234 : CALL section_vals_val_get(mp2_section, "RI_RPA%GW%KPOINT_SET%SPECIAL_POINT", &
235 512 : n_rep_val=mp2_env%ri_g0w0%n_special_kp)
236 1038 : ALLOCATE (mp2_env%ri_g0w0%xkp_special_kp(3, mp2_env%ri_g0w0%n_special_kp))
237 540 : DO i_special_kp = 1, mp2_env%ri_g0w0%n_special_kp
238 : CALL section_vals_val_get(mp2_section, "RI_RPA%GW%KPOINT_SET%SPECIAL_POINT", &
239 28 : i_rep_val=i_special_kp, c_vals=string_pointer)
240 28 : CPASSERT(SIZE(string_pointer(:), 1) == 3)
241 624 : DO i = 1, 3
242 : CALL read_float_object(string_pointer(i), &
243 : mp2_env%ri_g0w0%xkp_special_kp(i, i_special_kp), &
244 84 : error_message)
245 112 : IF (LEN_TRIM(error_message) > 0) CPABORT(TRIM(error_message))
246 : END DO
247 : END DO
248 :
249 : CALL section_vals_val_get(mp2_section, "RI_RPA%GW%KPOINTS_SELF_ENERGY", &
250 512 : i_vals=mp2_env%ri_g0w0%kp_grid_Sigma)
251 :
252 : CALL section_vals_val_get(mp2_section, "RI_RPA%GW%PRINT%GW_DOS%LOWER_BOUND", &
253 512 : r_val=mp2_env%ri_g0w0%dos_lower)
254 : CALL section_vals_val_get(mp2_section, "RI_RPA%GW%PRINT%GW_DOS%UPPER_BOUND", &
255 512 : r_val=mp2_env%ri_g0w0%dos_upper)
256 : CALL section_vals_val_get(mp2_section, "RI_RPA%GW%PRINT%GW_DOS%STEP", &
257 512 : r_val=mp2_env%ri_g0w0%dos_prec)
258 : CALL section_vals_val_get(mp2_section, "RI_RPA%GW%PRINT%GW_DOS%MIN_LEVEL_SPECTRAL", &
259 512 : i_val=mp2_env%ri_g0w0%dos_min)
260 : CALL section_vals_val_get(mp2_section, "RI_RPA%GW%PRINT%GW_DOS%MAX_LEVEL_SPECTRAL", &
261 512 : i_val=mp2_env%ri_g0w0%dos_max)
262 : CALL section_vals_val_get(mp2_section, "RI_RPA%GW%PRINT%GW_DOS%MIN_LEVEL_SELF_ENERGY", &
263 512 : i_val=mp2_env%ri_g0w0%min_level_self_energy)
264 : CALL section_vals_val_get(mp2_section, "RI_RPA%GW%PRINT%GW_DOS%MAX_LEVEL_SELF_ENERGY", &
265 512 : i_val=mp2_env%ri_g0w0%max_level_self_energy)
266 : CALL section_vals_val_get(mp2_section, "RI_RPA%GW%PRINT%GW_DOS%BROADENING", &
267 512 : r_val=mp2_env%ri_g0w0%dos_eta)
268 :
269 : mp2_env%ri_g0w0%do_kpoints_Sigma = mp2_env%ri_g0w0%n_special_kp > 0 .OR. &
270 : mp2_env%ri_g0w0%kp_grid_Sigma(1)* &
271 : mp2_env%ri_g0w0%kp_grid_Sigma(2)* &
272 512 : mp2_env%ri_g0w0%kp_grid_Sigma(3) > 0
273 :
274 : mp2_env%ri_g0w0%print_local_bandgap = BTEST(cp_print_key_should_output(logger%iter_info, &
275 : mp2_section, "RI_RPA%GW%PRINT%LOCAL_BANDGAP"), &
276 512 : cp_p_file)
277 : CALL section_vals_val_get(mp2_section, "RI_RPA%GW%PRINT%LOCAL_BANDGAP%ENERGY_WINDOW", &
278 512 : r_val=mp2_env%ri_g0w0%energy_window_print_loc_bandgap)
279 : CALL section_vals_val_get(mp2_section, "RI_RPA%GW%PRINT%LOCAL_BANDGAP%ENERGY_SPACING", &
280 512 : r_val=mp2_env%ri_g0w0%energy_spacing_print_loc_bandgap)
281 : CALL section_vals_val_get(mp2_section, "RI_RPA%GW%PRINT%LOCAL_BANDGAP%LDOS_THRESHOLD_GAP", &
282 512 : r_val=mp2_env%ri_g0w0%ldos_thresh_print_loc_bandgap)
283 : CALL section_vals_val_get(mp2_section, "RI_RPA%GW%PRINT%LOCAL_BANDGAP%STRIDE", &
284 512 : i_vals=mp2_env%ri_g0w0%stride_loc_bandgap)
285 :
286 512 : NULLIFY (low_scaling_section)
287 512 : low_scaling_section => section_vals_get_subs_vals(mp2_section, "LOW_SCALING")
288 : CALL section_vals_val_get(low_scaling_section, "_SECTION_PARAMETERS_", &
289 512 : l_val=mp2_env%do_im_time)
290 :
291 512 : CALL section_vals_val_get(low_scaling_section, "MEMORY_CUT", i_val=mp2_env%ri_rpa_im_time%cut_memory)
292 512 : CALL section_vals_val_get(low_scaling_section, "MEMORY_INFO", l_val=mp2_env%ri_rpa_im_time%memory_info)
293 512 : CALL section_vals_val_get(low_scaling_section, "EPS_FILTER", r_val=mp2_env%ri_rpa_im_time%eps_filter)
294 512 : CALL section_vals_val_get(low_scaling_section, "EPS_STORAGE_SCALING", r_val=mp2_env%ri_rpa_im_time%eps_compress)
295 512 : mp2_env%ri_rpa_im_time%eps_compress = mp2_env%ri_rpa_im_time%eps_compress*mp2_env%ri_rpa_im_time%eps_filter
296 512 : mp2_env%ri_rpa_im_time%eps_compress = MAX(mp2_env%ri_rpa_im_time%eps_compress, 1.0E-16_dp)
297 512 : CALL section_vals_val_get(low_scaling_section, "EPS_FILTER_FACTOR", r_val=mp2_env%ri_rpa_im_time%eps_filter_factor)
298 :
299 : CALL section_vals_val_get(low_scaling_section, "DO_KPOINTS", &
300 512 : l_val=mp2_env%ri_rpa_im_time%do_im_time_kpoints)
301 : CALL section_vals_val_get(low_scaling_section, "KPOINTS", &
302 512 : i_vals=mp2_env%ri_rpa_im_time%kp_grid)
303 2048 : mp2_env%ri_rpa_im_time%do_kpoints_from_Gamma = SUM(mp2_env%ri_rpa_im_time%kp_grid) > 0
304 512 : IF (mp2_env%ri_rpa_im_time%do_kpoints_from_Gamma) THEN
305 16 : CPASSERT(mp2_env%ri_g0w0%do_kpoints_Sigma)
306 : END IF
307 : CALL section_vals_val_get(low_scaling_section, "KPOINT_WEIGHTS_W", &
308 512 : i_val=mp2_env%ri_rpa_im_time%kpoint_weights_W_method)
309 : CALL section_vals_val_get(low_scaling_section, "EXPONENT_TAILORED_WEIGHTS", &
310 512 : r_val=mp2_env%ri_rpa_im_time%exp_tailored_weights)
311 : CALL section_vals_val_get(low_scaling_section, "REGULARIZATION_RI", &
312 512 : r_val=mp2_env%ri_rpa_im_time%regularization_RI)
313 : CALL section_vals_val_get(low_scaling_section, "EPS_EIGVAL_S", &
314 512 : r_val=mp2_env%ri_rpa_im_time%eps_eigval_S)
315 : CALL section_vals_val_get(low_scaling_section, "EPS_EIGVAL_S_GAMMA", &
316 512 : r_val=mp2_env%ri_rpa_im_time%eps_eigval_S_Gamma)
317 : CALL section_vals_val_get(low_scaling_section, "MAKE_CHI_POS_DEFINITE", &
318 512 : l_val=mp2_env%ri_rpa_im_time%make_chi_pos_definite)
319 : CALL section_vals_val_get(low_scaling_section, "MAKE_OVERLAP_MAT_AO_POS_DEFINITE", &
320 512 : l_val=mp2_env%ri_rpa_im_time%make_overlap_mat_ao_pos_definite)
321 : CALL section_vals_val_get(low_scaling_section, "TRUNC_COULOMB_RI_X", &
322 512 : l_val=mp2_env%ri_rpa_im_time%trunc_coulomb_ri_x)
323 : CALL section_vals_val_get(low_scaling_section, "DO_EXTRAPOLATE_KPOINTS", &
324 512 : l_val=mp2_env%ri_rpa_im_time%do_extrapolate_kpoints)
325 : CALL section_vals_val_get(low_scaling_section, "REL_CUTOFF_TRUNC_COULOMB_RI_X", &
326 512 : r_val=mp2_env%ri_rpa_im_time%rel_cutoff_trunc_coulomb_ri_x)
327 : CALL section_vals_val_get(low_scaling_section, "K_MESH_G_FACTOR", &
328 512 : i_val=mp2_env%ri_rpa_im_time%k_mesh_g_factor)
329 :
330 : CALL section_vals_val_get(low_scaling_section, "KEEP_QUADRATURE", &
331 512 : l_val=mp2_env%ri_rpa_im_time%keep_quad)
332 :
333 : CALL section_vals_val_get(low_scaling_section, "MIN_BLOCK_SIZE", &
334 512 : i_val=mp2_env%ri_rpa_im_time%min_bsize)
335 :
336 : CALL section_vals_val_get(low_scaling_section, "MIN_BLOCK_SIZE_MO", &
337 512 : i_val=mp2_env%ri_rpa_im_time%min_bsize_mo)
338 :
339 512 : CALL section_vals_val_get(mp2_section, "RI_SOS_MP2%_SECTION_PARAMETERS_", l_val=do_ri_sos_mp2)
340 512 : IF (do_ri_sos_mp2) THEN
341 44 : CALL check_method(mp2_env%method)
342 44 : mp2_env%method = ri_mp2_laplace
343 : END IF
344 512 : CALL section_vals_val_get(mp2_section, "RI_SOS_MP2%QUADRATURE_POINTS", i_val=mp2_env%ri_laplace%n_quadrature)
345 512 : CALL section_vals_val_get(mp2_section, "RI_SOS_MP2%NUM_INTEG_GROUPS", i_val=mp2_env%ri_laplace%num_integ_groups)
346 :
347 512 : CALL section_vals_val_get(mp2_section, "RI_MP2%_SECTION_PARAMETERS_", l_val=do_ri_mp2)
348 512 : IF (do_ri_mp2) THEN
349 180 : CALL check_method(mp2_env%method)
350 180 : mp2_env%method = ri_mp2_method_gpw
351 : END IF
352 512 : CALL section_vals_val_get(mp2_section, "RI_MP2%BLOCK_SIZE", i_val=mp2_env%ri_mp2%block_size)
353 512 : CALL section_vals_val_get(mp2_section, "RI_MP2%NUMBER_INTEGRATION_GROUPS", i_val=mp2_env%ri_mp2%number_integration_groups)
354 512 : CALL section_vals_val_get(mp2_section, "RI_MP2%PRINT_DGEMM_INFO", l_val=mp2_env%ri_mp2%print_dgemm_info)
355 :
356 512 : CALL section_vals_val_get(mp2_section, "RI%ROW_BLOCK", i_val=mp2_env%block_size_row)
357 512 : CALL section_vals_val_get(mp2_section, "RI%COL_BLOCK", i_val=mp2_env%block_size_col)
358 512 : CALL section_vals_val_get(mp2_section, "RI%CALC_COND_NUM", l_val=mp2_env%calc_PQ_cond_num)
359 512 : CALL section_vals_val_get(mp2_section, "RI%DO_SVD", l_val=mp2_env%do_svd)
360 512 : CALL section_vals_val_get(mp2_section, "RI%EPS_SVD", r_val=mp2_env%eps_svd)
361 512 : CALL section_vals_val_get(mp2_section, "RI%ERI_BLKSIZE", i_vals=mp2_env%eri_blksize)
362 512 : CALL section_vals_val_get(mp2_section, "RI%RI_METRIC%POTENTIAL_TYPE", i_val=mp2_env%ri_metric%potential_type)
363 512 : CALL section_vals_val_get(mp2_section, "RI%RI_METRIC%OMEGA", r_val=mp2_env%ri_metric%omega)
364 512 : CALL section_vals_val_get(mp2_section, "RI%RI_METRIC%EPS_RANGE", r_val=mp2_env%eps_range)
365 512 : CALL section_vals_val_get(mp2_section, "RI%RI_METRIC%CUTOFF_RADIUS", r_val=mp2_env%ri_metric%cutoff_radius)
366 512 : CALL section_vals_val_get(mp2_section, "RI%RI_METRIC%T_C_G_DATA", c_val=mp2_env%ri_metric%filename)
367 512 : IF (mp2_env%ri_metric%potential_type == do_potential_short) THEN
368 0 : CALL erfc_cutoff(mp2_env%eps_range, mp2_env%ri_metric%omega, mp2_env%ri_metric%cutoff_radius)
369 : END IF
370 :
371 512 : CALL section_vals_val_get(mp2_section, "RI%OPT_RI_BASIS%_SECTION_PARAMETERS_", l_val=do_opt_ri_basis)
372 512 : IF (do_opt_ri_basis) THEN
373 6 : CALL check_method(mp2_env%method)
374 6 : mp2_env%method = mp2_ri_optimize_basis
375 : END IF
376 : CALL section_vals_val_get(mp2_section, "RI%OPT_RI_BASIS%DELTA_I_REL", &
377 512 : r_val=mp2_env%ri_opt_param%DI_rel)
378 : CALL section_vals_val_get(mp2_section, "RI%OPT_RI_BASIS%DELTA_RI", &
379 512 : r_val=mp2_env%ri_opt_param%DRI)
380 : CALL section_vals_val_get(mp2_section, "RI%OPT_RI_BASIS%EPS_DERIV", &
381 512 : r_val=mp2_env%ri_opt_param%eps_step)
382 : CALL section_vals_val_get(mp2_section, "RI%OPT_RI_BASIS%MAX_ITER", &
383 512 : i_val=mp2_env%ri_opt_param%max_num_iter)
384 : CALL section_vals_val_get(mp2_section, "RI%OPT_RI_BASIS%BASIS_SIZE", &
385 512 : i_val=mp2_env%ri_opt_param%basis_quality)
386 512 : NULLIFY (tmplist)
387 : CALL section_vals_val_get(mp2_section, "RI%OPT_RI_BASIS%NUM_FUNC", &
388 512 : i_vals=tmplist)
389 512 : IF (tmplist(1) > 0) THEN
390 6 : ALLOCATE (mp2_env%ri_opt_param%RI_nset_per_l(0:SIZE(tmplist) - 1))
391 10 : mp2_env%ri_opt_param%RI_nset_per_l = 0
392 10 : DO ival = 1, SIZE(tmplist)
393 10 : mp2_env%ri_opt_param%RI_nset_per_l(ival - 1) = tmplist(ival)
394 : END DO
395 : END IF
396 :
397 512 : CALL section_vals_val_get(mp2_section, "INTEGRALS%ERI_METHOD", i_val=mp2_env%eri_method)
398 512 : CALL section_vals_val_get(mp2_section, "INTEGRALS%SIZE_LATTICE_SUM", i_val=mp2_env%mp2_gpw%size_lattice_sum)
399 512 : CALL section_vals_val_get(mp2_section, "INTEGRALS%WFC_GPW%EPS_FILTER", r_val=mp2_env%mp2_gpw%eps_filter)
400 512 : CALL section_vals_val_get(mp2_section, "INTEGRALS%WFC_GPW%EPS_GRID", r_val=mp2_env%mp2_gpw%eps_grid)
401 512 : CALL section_vals_val_get(mp2_section, "INTEGRALS%WFC_GPW%CUTOFF", r_val=mp2_env%mp2_gpw%cutoff)
402 512 : CALL section_vals_val_get(mp2_section, "INTEGRALS%WFC_GPW%REL_CUTOFF", r_val=mp2_env%mp2_gpw%relative_cutoff)
403 512 : CALL section_vals_val_get(mp2_section, "INTEGRALS%WFC_GPW%PRINT_LEVEL", i_val=mp2_env%mp2_gpw%print_level)
404 512 : CALL section_vals_val_get(mp2_section, "INTEGRALS%WFC_GPW%EPS_PGF_ORB_S", r_val=mp2_env%mp2_gpw%eps_pgf_orb_S)
405 : CALL section_vals_val_get(mp2_section, "INTEGRALS%INTERACTION_POTENTIAL%POTENTIAL_TYPE", &
406 512 : i_val=mp2_env%potential_parameter%potential_type)
407 : CALL section_vals_val_get(mp2_section, "INTEGRALS%INTERACTION_POTENTIAL%TRUNCATION_RADIUS", &
408 512 : r_val=mp2_env%potential_parameter%cutoff_radius)
409 : CALL section_vals_val_get(mp2_section, "INTEGRALS%INTERACTION_POTENTIAL%POTENTIAL_DATA", &
410 512 : c_val=mp2_env%potential_parameter%filename)
411 : CALL section_vals_val_get(mp2_section, "INTEGRALS%INTERACTION_POTENTIAL%OMEGA", &
412 512 : r_val=mp2_env%potential_parameter%omega)
413 : CALL section_vals_val_get(mp2_section, "INTEGRALS%INTERACTION_POTENTIAL%SCALE_COULOMB", &
414 512 : r_val=mp2_env%potential_parameter%scale_coulomb)
415 : CALL section_vals_val_get(mp2_section, "INTEGRALS%INTERACTION_POTENTIAL%SCALE_LONGRANGE", &
416 512 : r_val=mp2_env%potential_parameter%scale_longrange)
417 :
418 : NULLIFY (mp2_env%eri_mme_param)
419 12800 : ALLOCATE (mp2_env%eri_mme_param)
420 :
421 512 : IF (mp2_env%eri_method == do_eri_mme) THEN
422 34 : eri_mme_section => section_vals_get_subs_vals(mp2_section, "INTEGRALS%ERI_MME")
423 34 : CALL cp_eri_mme_init_read_input(eri_mme_section, mp2_env%eri_mme_param)
424 : END IF
425 :
426 : ! Set some parameters in case of P screening
427 512 : mp2_env%not_last_hfx = .TRUE.
428 512 : mp2_env%p_screen = .TRUE.
429 :
430 : ! Set the CPHF section
431 512 : CALL section_vals_val_get(mp2_section, "CANONICAL_GRADIENTS%FREE_HFX_BUFFER", l_val=mp2_env%ri_grad%free_hfx_buffer)
432 512 : CALL section_vals_val_get(mp2_section, "CANONICAL_GRADIENTS%EPS_CANONICAL", r_val=mp2_env%ri_grad%eps_canonical)
433 512 : CALL section_vals_val_get(mp2_section, "CANONICAL_GRADIENTS%DOT_PRODUCT_BLKSIZE", i_val=mp2_env%ri_grad%dot_blksize)
434 512 : CALL section_vals_val_get(mp2_section, "CANONICAL_GRADIENTS%MAX_PARALLEL_COMM", i_val=mp2_env%ri_grad%max_parallel_comm)
435 512 : cphf_section => section_vals_get_subs_vals(mp2_section, "CANONICAL_GRADIENTS%CPHF")
436 512 : IF (ASSOCIATED(cphf_section)) THEN
437 512 : CALL section_vals_val_get(cphf_section, "MAX_ITER", i_val=mp2_env%ri_grad%cphf_max_num_iter)
438 512 : CALL section_vals_val_get(cphf_section, "EPS_CONV", r_val=mp2_env%ri_grad%cphf_eps_conv)
439 512 : CALL section_vals_val_get(cphf_section, "SCALE_STEP_SIZE", r_val=mp2_env%ri_grad%scale_step_size)
440 512 : CALL section_vals_val_get(cphf_section, "SOLVER_METHOD", i_val=mp2_env%ri_grad%z_solver_method)
441 512 : CALL section_vals_val_get(cphf_section, "RESTART_EVERY", i_val=mp2_env%ri_grad%cphf_restart)
442 512 : CALL section_vals_val_get(cphf_section, "ENFORCE_DECREASE", l_val=mp2_env%ri_grad%enforce_decrease)
443 512 : CALL section_vals_val_get(cphf_section, "RECALC_RESIDUAL", l_val=mp2_env%ri_grad%recalc_residual)
444 512 : CALL section_vals_val_get(cphf_section, "DO_POLAK_RIBIERE", l_val=mp2_env%ri_grad%polak_ribiere)
445 : END IF
446 :
447 : ! print some info about the MP2 parameters
448 : unit_nr = cp_print_key_unit_nr(logger, mp2_section, "PRINT", &
449 512 : extension=".mp2Log")
450 512 : IF ((mp2_env%method /= mp2_method_none) .AND. unit_nr > 0) THEN
451 256 : WRITE (unit_nr, '(T2,A)') ""
452 265 : SELECT CASE (mp2_env%method)
453 : CASE (mp2_method_direct)
454 9 : WRITE (unit_nr, '(T2,A)') "MP2| using direct canonical MP2"
455 : CASE (mp2_method_gpw)
456 7 : WRITE (unit_nr, '(T2,A)') "MP2| using MP2 GPW style"
457 : CASE (ri_mp2_method_gpw)
458 90 : WRITE (unit_nr, '(T2,A)') "MP2| using RI-MP2-GPW"
459 : CASE (ri_rpa_method_gpw)
460 125 : WRITE (unit_nr, '(T2,A)') "RI-RPA| using GPW style"
461 : CASE (ri_mp2_laplace)
462 22 : WRITE (unit_nr, '(T2,A)') "RI-SOS-Laplace-MP2| using GPW style"
463 : CASE (mp2_ri_optimize_basis)
464 3 : WRITE (unit_nr, '(T2,A)') "MP2| Optimize RI auxiliary basis"
465 : CASE DEFAULT
466 256 : CPABORT("Unknown MP2 method")
467 : END SELECT
468 256 : WRITE (unit_nr, '(T2,A)') ""
469 256 : CALL m_flush(unit_nr)
470 : END IF
471 :
472 : CALL cp_print_key_finished_output(unit_nr, logger, mp2_section, &
473 512 : "PRINT")
474 :
475 512 : CALL timestop(handle)
476 :
477 3584 : END SUBROUTINE read_mp2_section
478 :
479 : ! **************************************************************************************************
480 : !> \brief ...
481 : !> \param method ...
482 : ! **************************************************************************************************
483 512 : SUBROUTINE check_method(method)
484 : INTEGER, INTENT(IN) :: method
485 :
486 : CHARACTER(len=*), PARAMETER :: routineN = 'check_method'
487 :
488 : INTEGER :: handle
489 :
490 512 : CALL timeset(routineN, handle)
491 :
492 512 : IF (method /= mp2_method_none) THEN
493 0 : CPABORT("Please use not more than one method to compute the correlation energy.")
494 : END IF
495 :
496 512 : CALL timestop(handle)
497 :
498 512 : END SUBROUTINE check_method
499 : END MODULE mp2_setup
|