LCOV - code coverage report
Current view: top level - src - mp2_setup.F (source / functions) Hit Total Coverage
Test: CP2K Regtests (git:9843133) Lines: 252 254 99.2 %
Date: 2024-05-10 06:53:45 Functions: 2 2 100.0 %

          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

Generated by: LCOV version 1.15