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