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