1!--------------------------------------------------------------------------------------------------!
2!   CP2K: A general program to perform molecular dynamics simulations                              !
3!   Copyright (C) 2000 - 2020  CP2K developers group                                               !
4!--------------------------------------------------------------------------------------------------!
5
6! **************************************************************************************************
7!> \brief Types needed for MP2 calculations
8!> \par History
9!>       2011.05 created [Mauro Del Ben]
10!> \author MDB
11! **************************************************************************************************
12MODULE mp2_setup
13   USE cp_eri_mme_interface,            ONLY: cp_eri_mme_init_read_input
14   USE cp_log_handling,                 ONLY: cp_get_default_logger,&
15                                              cp_logger_type
16   USE cp_output_handling,              ONLY: cp_print_key_finished_output,&
17                                              cp_print_key_unit_nr
18   USE input_constants,                 ONLY: &
19        do_eri_mme, do_potential_short, mp2_method_direct, mp2_method_gpw, mp2_method_none, &
20        mp2_ri_optimize_basis, ri_mp2_laplace, ri_mp2_method_gpw, ri_rpa_method_gpw
21   USE input_section_types,             ONLY: section_vals_get_subs_vals,&
22                                              section_vals_type,&
23                                              section_vals_val_get
24   USE mathlib,                         ONLY: erfc_cutoff
25   USE mp2_types,                       ONLY: mp2_method_direct,&
26                                              mp2_method_gpw,&
27                                              mp2_method_none,&
28                                              mp2_ri_optimize_basis,&
29                                              mp2_type,&
30                                              ri_mp2_laplace,&
31                                              ri_mp2_method_gpw,&
32                                              ri_rpa_method_gpw
33#include "./base/base_uses.f90"
34
35   IMPLICIT NONE
36
37   PRIVATE
38
39   CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'mp2_setup'
40
41   PUBLIC :: read_mp2_section
42
43CONTAINS
44
45! **************************************************************************************************
46!> \brief ...
47!> \param input ...
48!> \param mp2_env ...
49! **************************************************************************************************
50   SUBROUTINE read_mp2_section(input, mp2_env)
51      TYPE(section_vals_type), POINTER                   :: input
52      TYPE(mp2_type), INTENT(INOUT)                      :: mp2_env
53
54      CHARACTER(len=*), PARAMETER :: routineN = 'read_mp2_section', &
55         routineP = moduleN//':'//routineN
56
57      INTEGER                                            :: handle, ival, unit_nr
58      INTEGER, DIMENSION(:), POINTER                     :: tmplist
59      LOGICAL                                            :: do_mp2, do_opt_ri_basis, do_ri_mp2, &
60                                                            do_ri_sos_mp2, do_rpa
61      TYPE(cp_logger_type), POINTER                      :: logger
62      TYPE(section_vals_type), POINTER                   :: eri_mme_section, gw_section, &
63                                                            im_time_test_section, &
64                                                            low_scaling_section, mp2_section
65
66      CALL timeset(routineN, handle)
67      logger => cp_get_default_logger()
68
69      mp2_section => section_vals_get_subs_vals(input, "DFT%XC%WF_CORRELATION")
70
71      mp2_env%method = mp2_method_none
72
73      ! should come from input
74      CALL section_vals_val_get(mp2_section, "MEMORY", r_val=mp2_env%mp2_memory)
75      CALL section_vals_val_get(mp2_section, "SCALE_S", r_val=mp2_env%scale_S)
76      CALL section_vals_val_get(mp2_section, "SCALE_T", r_val=mp2_env%scale_T)
77      CALL section_vals_val_get(mp2_section, "GROUP_SIZE", i_val=mp2_env%mp2_num_proc)
78
79      CALL section_vals_val_get(mp2_section, "MP2%_SECTION_PARAMETERS_", l_val=do_mp2)
80      CALL section_vals_val_get(mp2_section, "MP2%BIG_SEND", l_val=mp2_env%direct_canonical%big_send)
81      IF (do_mp2) THEN
82         CALL check_method(mp2_env%method)
83         CALL section_vals_val_get(mp2_section, "MP2%METHOD", i_val=mp2_env%method)
84      END IF
85
86      CALL section_vals_val_get(mp2_section, "RI_RPA%_SECTION_PARAMETERS_", l_val=do_rpa)
87      IF (do_rpa) THEN
88         CALL check_method(mp2_env%method)
89         mp2_env%method = ri_rpa_method_gpw
90      END IF
91      CALL section_vals_val_get(mp2_section, "RI_RPA%RPA_NUM_QUAD_POINTS", i_val=mp2_env%ri_rpa%rpa_num_quad_points)
92      CALL section_vals_val_get(mp2_section, "RI_RPA%SIZE_FREQ_INTEG_GROUP", i_val=mp2_env%ri_rpa%rpa_integ_group_size)
93      CALL section_vals_val_get(mp2_section, "RI_RPA%MM_STYLE", i_val=mp2_env%ri_rpa%mm_style)
94      CALL section_vals_val_get(mp2_section, "RI_RPA%MINIMAX_QUADRATURE", l_val=mp2_env%ri_rpa%minimax_quad)
95      CALL section_vals_val_get(mp2_section, "RI_RPA%ADMM", l_val=mp2_env%ri_rpa%do_admm)
96      CALL section_vals_val_get(mp2_section, "RI_RPA%SCALE_RPA", r_val=mp2_env%ri_rpa%scale_rpa)
97
98      CALL section_vals_val_get(mp2_section, "RI_RPA%AXK", l_val=mp2_env%ri_rpa%do_ri_axk)
99
100      CALL section_vals_val_get(mp2_section, "RI_RPA%RSE", l_val=mp2_env%ri_rpa%do_rse)
101
102      NULLIFY (gw_section)
103      gw_section => section_vals_get_subs_vals(mp2_section, "RI_RPA%GW")
104      CALL section_vals_val_get(gw_section, "_SECTION_PARAMETERS_", &
105                                l_val=mp2_env%ri_rpa%do_ri_g0w0)
106      CALL section_vals_val_get(mp2_section, "RI_RPA%GW%CORR_MOS_OCC", &
107                                i_val=mp2_env%ri_g0w0%corr_mos_occ)
108      CALL section_vals_val_get(mp2_section, "RI_RPA%GW%CORR_MOS_VIRT", &
109                                i_val=mp2_env%ri_g0w0%corr_mos_virt)
110      CALL section_vals_val_get(mp2_section, "RI_RPA%GW%NUMB_POLES", &
111                                i_val=mp2_env%ri_g0w0%num_poles)
112      CALL section_vals_val_get(mp2_section, "RI_RPA%GW%NPARAM_PADE", &
113                                i_val=mp2_env%ri_g0w0%nparam_pade)
114      CALL section_vals_val_get(mp2_section, "RI_RPA%GW%ANALYTIC_CONTINUATION", &
115                                i_val=mp2_env%ri_g0w0%analytic_continuation)
116      CALL section_vals_val_get(mp2_section, "RI_RPA%GW%OMEGA_MAX_FIT", &
117                                r_val=mp2_env%ri_g0w0%omega_max_fit)
118      CALL section_vals_val_get(mp2_section, "RI_RPA%GW%CROSSING_SEARCH", &
119                                i_val=mp2_env%ri_g0w0%crossing_search)
120      CALL section_vals_val_get(mp2_section, "RI_RPA%GW%FERMI_LEVEL_OFFSET", &
121                                r_val=mp2_env%ri_g0w0%fermi_level_offset)
122      CALL section_vals_val_get(mp2_section, "RI_RPA%GW%EV_GW_ITER", &
123                                i_val=mp2_env%ri_g0w0%iter_evGW)
124      CALL section_vals_val_get(mp2_section, "RI_RPA%GW%SC_GW0_ITER", &
125                                i_val=mp2_env%ri_g0w0%iter_sc_GW0)
126      CALL section_vals_val_get(mp2_section, "RI_RPA%GW%EPS_ITER", &
127                                r_val=mp2_env%ri_g0w0%eps_iter)
128      CALL section_vals_val_get(mp2_section, "RI_RPA%GW%PRINT_EXX", &
129                                i_val=mp2_env%ri_g0w0%print_exx)
130      CALL section_vals_val_get(mp2_section, "RI_RPA%GW%RI_SIGMA_X", &
131                                l_val=mp2_env%ri_g0w0%do_ri_Sigma_x)
132      CALL section_vals_val_get(mp2_section, "RI_RPA%GW%IC_CORR_LIST", &
133                                r_vals=mp2_env%ri_g0w0%ic_corr_list)
134      CALL section_vals_val_get(mp2_section, "RI_RPA%GW%IC_CORR_LIST_BETA", &
135                                r_vals=mp2_env%ri_g0w0%ic_corr_list_beta)
136      CALL section_vals_val_get(mp2_section, "RI_RPA%GW%GAMMA_ONLY_SIGMA", &
137                                l_val=mp2_env%ri_g0w0%do_gamma_only_sigma)
138
139      CALL section_vals_val_get(mp2_section, "RI_RPA%GW%BSE", &
140                                l_val=mp2_env%ri_g0w0%do_bse)
141      CALL section_vals_val_get(mp2_section, "RI_RPA%GW%BSE%NUM_Z_VECTORS", &
142                                i_val=mp2_env%ri_g0w0%num_z_vectors)
143      CALL section_vals_val_get(mp2_section, "RI_RPA%GW%BSE%THRESHOLD_MIN_TRANS", &
144                                r_val=mp2_env%ri_g0w0%eps_min_trans)
145      CALL section_vals_val_get(mp2_section, "RI_RPA%GW%BSE%MAX_ITER", &
146                                i_val=mp2_env%ri_g0w0%max_iter_bse)
147
148      CALL section_vals_val_get(mp2_section, "RI_RPA%GW%IMAGE_CHARGE_MODEL", &
149                                l_val=mp2_env%ri_g0w0%do_ic_model)
150      CALL section_vals_val_get(mp2_section, "RI_RPA%GW%IC%PRINT_IC_LIST", &
151                                l_val=mp2_env%ri_g0w0%print_ic_values)
152      CALL section_vals_val_get(mp2_section, "RI_RPA%GW%IC%EPS_DIST", &
153                                r_val=mp2_env%ri_g0w0%eps_dist)
154
155      CALL section_vals_val_get(mp2_section, "RI_RPA%GW%PERIODIC", &
156                                l_val=mp2_env%ri_g0w0%do_periodic)
157      CALL section_vals_val_get(mp2_section, "RI_RPA%GW%PERIODIC%KPOINTS", &
158                                i_vals=mp2_env%ri_g0w0%kp_grid)
159      CALL section_vals_val_get(mp2_section, "RI_RPA%GW%PERIODIC%NUM_KP_GRIDS", &
160                                i_val=mp2_env%ri_g0w0%num_kp_grids)
161      CALL section_vals_val_get(mp2_section, "RI_RPA%GW%PERIODIC%EPS_KPOINT", &
162                                r_val=mp2_env%ri_g0w0%eps_kpoint)
163      CALL section_vals_val_get(mp2_section, "RI_RPA%GW%PERIODIC%MO_COEFF_GAMMA", &
164                                l_val=mp2_env%ri_g0w0%do_mo_coeff_gamma)
165      CALL section_vals_val_get(mp2_section, "RI_RPA%GW%PERIODIC%AVERAGE_DEGENERATE_LEVELS", &
166                                l_val=mp2_env%ri_g0w0%do_average_deg_levels)
167      CALL section_vals_val_get(mp2_section, "RI_RPA%GW%PERIODIC%EPS_EIGENVAL", &
168                                r_val=mp2_env%ri_g0w0%eps_eigenval)
169      CALL section_vals_val_get(mp2_section, "RI_RPA%GW%PERIODIC%EXTRAPOLATE_KPOINTS", &
170                                l_val=mp2_env%ri_g0w0%do_extra_kpoints)
171      CALL section_vals_val_get(mp2_section, "RI_RPA%GW%PERIODIC%DO_AUX_BAS_GW", &
172                                l_val=mp2_env%ri_g0w0%do_aux_bas_gw)
173      CALL section_vals_val_get(mp2_section, "RI_RPA%GW%PERIODIC%FRACTION_AUX_MOS", &
174                                r_val=mp2_env%ri_g0w0%frac_aux_mos)
175      CALL section_vals_val_get(mp2_section, "RI_RPA%GW%PERIODIC%NUM_OMEGA_POINTS", &
176                                i_val=mp2_env%ri_g0w0%num_omega_points)
177
178      CALL section_vals_val_get(mp2_section, "RI_RPA%GW%PRINT%SELF_ENERGY", &
179                                l_val=mp2_env%ri_g0w0%print_self_energy)
180
181      NULLIFY (low_scaling_section)
182      low_scaling_section => section_vals_get_subs_vals(mp2_section, "LOW_SCALING")
183      CALL section_vals_val_get(low_scaling_section, "_SECTION_PARAMETERS_", &
184                                l_val=mp2_env%do_im_time)
185
186      CALL section_vals_val_get(low_scaling_section, "MEMORY_CUT", i_val=mp2_env%ri_rpa_im_time%cut_memory)
187      CALL section_vals_val_get(low_scaling_section, "MEMORY_INFO", l_val=mp2_env%ri_rpa_im_time%memory_info)
188      CALL section_vals_val_get(low_scaling_section, "EPS_FILTER", r_val=mp2_env%ri_rpa_im_time%eps_filter)
189      CALL section_vals_val_get(low_scaling_section, "EPS_FILTER_FACTOR", r_val=mp2_env%ri_rpa_im_time%eps_filter_factor)
190
191      CALL section_vals_val_get(low_scaling_section, "DO_KPOINTS", &
192                                l_val=mp2_env%ri_rpa_im_time%do_im_time_kpoints)
193      CALL section_vals_val_get(low_scaling_section, "CUTOFF_W", &
194                                r_val=mp2_env%ri_rpa_im_time%cutoff)
195      CALL section_vals_val_get(low_scaling_section, "KPOINTS", &
196                                i_vals=mp2_env%ri_rpa_im_time%kp_grid)
197      CALL section_vals_val_get(low_scaling_section, "EXP_KPOINTS", &
198                                r_val=mp2_env%ri_rpa_im_time%exp_kpoints)
199
200      CALL section_vals_val_get(low_scaling_section, "MIN_BLOCK_SIZE", &
201                                i_val=mp2_env%ri_rpa_im_time%min_bsize)
202
203      NULLIFY (im_time_test_section)
204      im_time_test_section => section_vals_get_subs_vals(low_scaling_section, "TEST")
205
206      CALL section_vals_val_get(im_time_test_section, "_SECTION_PARAMETERS_", &
207                                l_val=mp2_env%ri_rpa_im_time%group_size_internal)
208
209      mp2_env%ri_rpa_im_time%group_size_internal = .NOT. mp2_env%ri_rpa_im_time%group_size_internal
210
211      IF (.NOT. mp2_env%ri_rpa_im_time%group_size_internal) THEN
212         CALL section_vals_val_get(im_time_test_section, "GROUP_SIZE_3c", &
213                                   i_val=mp2_env%ri_rpa_im_time%group_size_3c)
214         CALL section_vals_val_get(im_time_test_section, "GROUP_SIZE_P", &
215                                   i_val=mp2_env%ri_rpa_im_time%group_size_P)
216      ENDIF
217
218      CALL section_vals_val_get(mp2_section, "RI_SOS_MP2%_SECTION_PARAMETERS_", l_val=do_ri_sos_mp2)
219      IF (do_ri_sos_mp2) THEN
220         CALL check_method(mp2_env%method)
221         mp2_env%method = ri_mp2_laplace
222      END IF
223      CALL section_vals_val_get(mp2_section, "RI_SOS_MP2%QUADRATURE_POINTS", i_val=mp2_env%ri_laplace%n_quadrature)
224      CALL section_vals_val_get(mp2_section, "RI_SOS_MP2%SIZE_INTEG_GROUP", i_val=mp2_env%ri_laplace%integ_group_size)
225
226      CALL section_vals_val_get(mp2_section, "RI_MP2%_SECTION_PARAMETERS_", l_val=do_ri_mp2)
227      IF (do_ri_mp2) THEN
228         CALL check_method(mp2_env%method)
229         mp2_env%method = ri_mp2_method_gpw
230      END IF
231      CALL section_vals_val_get(mp2_section, "RI_MP2%BLOCK_SIZE", i_val=mp2_env%ri_mp2%block_size)
232      CALL section_vals_val_get(mp2_section, "RI_MP2%EPS_CANONICAL", r_val=mp2_env%ri_mp2%eps_canonical)
233      CALL section_vals_val_get(mp2_section, "RI_MP2%FREE_HFX_BUFFER", l_val=mp2_env%ri_mp2%free_hfx_buffer)
234
235      CALL section_vals_val_get(mp2_section, "RI_MP2%CPHF%MAX_ITER", i_val=mp2_env%ri_grad%cphf_max_num_iter)
236      CALL section_vals_val_get(mp2_section, "RI_MP2%CPHF%EPS_CONV", r_val=mp2_env%ri_grad%cphf_eps_conv)
237
238      CALL section_vals_val_get(mp2_section, "RI%ROW_BLOCK", i_val=mp2_env%block_size_row)
239      CALL section_vals_val_get(mp2_section, "RI%COL_BLOCK", i_val=mp2_env%block_size_col)
240      CALL section_vals_val_get(mp2_section, "RI%CALC_COND_NUM", l_val=mp2_env%calc_PQ_cond_num)
241      CALL section_vals_val_get(mp2_section, "RI%DO_SVD", l_val=mp2_env%do_svd)
242      CALL section_vals_val_get(mp2_section, "RI%EPS_SVD", r_val=mp2_env%eps_svd)
243      CALL section_vals_val_get(mp2_section, "RI%ERI_BLKSIZE", i_vals=mp2_env%eri_blksize)
244      CALL section_vals_val_get(mp2_section, "RI%RI_METRIC%POTENTIAL_TYPE", i_val=mp2_env%ri_metric%potential_type)
245      CALL section_vals_val_get(mp2_section, "RI%RI_METRIC%OMEGA", r_val=mp2_env%ri_metric%omega)
246      CALL section_vals_val_get(mp2_section, "RI%RI_METRIC%EPS_RANGE", r_val=mp2_env%eps_range)
247      CALL section_vals_val_get(mp2_section, "RI%RI_METRIC%CUTOFF_RADIUS", r_val=mp2_env%ri_metric%cutoff_radius)
248      CALL section_vals_val_get(mp2_section, "RI%RI_METRIC%T_C_G_DATA", c_val=mp2_env%ri_metric%filename)
249      IF (mp2_env%ri_metric%potential_type == do_potential_short) THEN
250         CALL erfc_cutoff(mp2_env%eps_range, mp2_env%ri_metric%omega, mp2_env%ri_metric%cutoff_radius)
251      ENDIF
252
253      CALL section_vals_val_get(mp2_section, "RI%OPT_RI_BASIS%_SECTION_PARAMETERS_", l_val=do_opt_ri_basis)
254      IF (do_opt_ri_basis) THEN
255         CALL check_method(mp2_env%method)
256         mp2_env%method = mp2_ri_optimize_basis
257      END IF
258      CALL section_vals_val_get(mp2_section, "RI%OPT_RI_BASIS%DELTA_I_REL", &
259                                r_val=mp2_env%ri_opt_param%DI_rel)
260      CALL section_vals_val_get(mp2_section, "RI%OPT_RI_BASIS%DELTA_RI", &
261                                r_val=mp2_env%ri_opt_param%DRI)
262      CALL section_vals_val_get(mp2_section, "RI%OPT_RI_BASIS%EPS_DERIV", &
263                                r_val=mp2_env%ri_opt_param%eps_step)
264      CALL section_vals_val_get(mp2_section, "RI%OPT_RI_BASIS%MAX_ITER", &
265                                i_val=mp2_env%ri_opt_param%max_num_iter)
266      CALL section_vals_val_get(mp2_section, "RI%OPT_RI_BASIS%BASIS_SIZE", &
267                                i_val=mp2_env%ri_opt_param%basis_quality)
268      NULLIFY (tmplist)
269      CALL section_vals_val_get(mp2_section, "RI%OPT_RI_BASIS%NUM_FUNC", &
270                                i_vals=tmplist)
271      IF (tmplist(1) > 0) THEN
272         ALLOCATE (mp2_env%ri_opt_param%RI_nset_per_l(0:SIZE(tmplist) - 1))
273         mp2_env%ri_opt_param%RI_nset_per_l = 0
274         DO ival = 1, SIZE(tmplist)
275            mp2_env%ri_opt_param%RI_nset_per_l(ival - 1) = tmplist(ival)
276         END DO
277      END IF
278
279      CALL section_vals_val_get(mp2_section, "INTEGRALS%ERI_METHOD", i_val=mp2_env%eri_method)
280      CALL section_vals_val_get(mp2_section, "INTEGRALS%SIZE_LATTICE_SUM", i_val=mp2_env%mp2_gpw%size_lattice_sum)
281      CALL section_vals_val_get(mp2_section, "INTEGRALS%WFC_GPW%EPS_FILTER", r_val=mp2_env%mp2_gpw%eps_filter)
282      CALL section_vals_val_get(mp2_section, "INTEGRALS%WFC_GPW%EPS_GRID", r_val=mp2_env%mp2_gpw%eps_grid)
283      CALL section_vals_val_get(mp2_section, "INTEGRALS%WFC_GPW%CUTOFF", r_val=mp2_env%mp2_gpw%cutoff)
284      CALL section_vals_val_get(mp2_section, "INTEGRALS%WFC_GPW%REL_CUTOFF", r_val=mp2_env%mp2_gpw%relative_cutoff)
285      CALL section_vals_val_get(mp2_section, "INTEGRALS%WFC_GPW%PRINT_LEVEL", i_val=mp2_env%mp2_gpw%print_level)
286      CALL section_vals_val_get(mp2_section, "INTEGRALS%WFC_GPW%EPS_PGF_ORB_S", r_val=mp2_env%mp2_gpw%eps_pgf_orb_S)
287      CALL section_vals_val_get(mp2_section, "INTEGRALS%INTERACTION_POTENTIAL%POTENTIAL_TYPE", &
288                                i_val=mp2_env%potential_parameter%potential_type)
289      CALL section_vals_val_get(mp2_section, "INTEGRALS%INTERACTION_POTENTIAL%TRUNCATION_RADIUS", &
290                                r_val=mp2_env%potential_parameter%cutoff_radius)
291      CALL section_vals_val_get(mp2_section, "INTEGRALS%INTERACTION_POTENTIAL%TShPSC_DATA", &
292                                c_val=mp2_env%potential_parameter%filename)
293      CALL section_vals_val_get(mp2_section, "INTEGRALS%INTERACTION_POTENTIAL%OMEGA", &
294                                r_val=mp2_env%potential_parameter%omega)
295
296      NULLIFY (mp2_env%eri_mme_param)
297      ALLOCATE (mp2_env%eri_mme_param)
298
299      IF (mp2_env%eri_method .EQ. do_eri_mme) THEN
300         eri_mme_section => section_vals_get_subs_vals(mp2_section, "INTEGRALS%ERI_MME")
301         CALL cp_eri_mme_init_read_input(eri_mme_section, mp2_env%eri_mme_param)
302      ENDIF
303
304      ! Set some parameters in case of P screening
305      mp2_env%not_last_hfx = .TRUE.
306      mp2_env%p_screen = .TRUE.
307
308      ! print some info about the MP2 parameters
309      unit_nr = cp_print_key_unit_nr(logger, mp2_section, "MP2%MP2_INFO", &
310                                     extension=".mp2Log")
311      IF ((mp2_env%method .NE. mp2_method_none) .AND. unit_nr > 0) THEN
312         WRITE (unit_nr, '(T2,A)') ""
313         SELECT CASE (mp2_env%method)
314         CASE (mp2_method_direct)
315            WRITE (unit_nr, '(T2,A)') "MP2| using direct canonical MP2"
316         CASE (mp2_method_gpw)
317            WRITE (unit_nr, '(T2,A)') "MP2| using MP2 GPW style"
318         CASE (ri_mp2_method_gpw)
319            WRITE (unit_nr, '(T2,A)') "MP2| using RI-MP2-GPW"
320         CASE (ri_rpa_method_gpw)
321            WRITE (unit_nr, '(T2,A)') "RI-RPA| using GPW style"
322         CASE (ri_mp2_laplace)
323            WRITE (unit_nr, '(T2,A)') "RI-SOS-Laplace-MP2| using GPW style"
324         CASE (mp2_ri_optimize_basis)
325            WRITE (unit_nr, '(T2,A)') "MP2| Optimize RI auxiliary basis"
326         CASE DEFAULT
327            CPABORT("")
328         END SELECT
329         WRITE (unit_nr, '(T2,A)') ""
330      ENDIF
331
332      CALL cp_print_key_finished_output(unit_nr, logger, mp2_section, &
333                                        "MP2%MP2_INFO")
334
335      CALL timestop(handle)
336
337   END SUBROUTINE read_mp2_section
338
339! **************************************************************************************************
340!> \brief ...
341!> \param method ...
342! **************************************************************************************************
343   SUBROUTINE check_method(method)
344      INTEGER, INTENT(IN)                                :: method
345
346      CHARACTER(len=*), PARAMETER :: routineN = 'check_method', routineP = moduleN//':'//routineN
347
348      INTEGER                                            :: handle
349
350      CALL timeset(routineN, handle)
351
352      IF (method .NE. mp2_method_none) THEN
353         CPABORT("Please use not more than one method to compute the correlation energy.")
354      END IF
355
356      CALL timestop(handle)
357
358   END SUBROUTINE check_method
359END MODULE mp2_setup
360