LCOV - code coverage report
Current view: top level - src - qmmm_per_elpot.F (source / functions) Hit Total Coverage
Test: CP2K Regtests (git:0de0cc2) Lines: 149 165 90.3 %
Date: 2024-03-28 07:31:50 Functions: 3 3 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 Setting up the potential for QM/MM periodic boundary conditions calculations
      10             : !> \par History
      11             : !>      07.2005 created [tlaino]
      12             : !> \author Teodoro Laino
      13             : ! **************************************************************************************************
      14             : MODULE qmmm_per_elpot
      15             :    USE ao_util,                         ONLY: exp_radius
      16             :    USE cell_types,                      ONLY: cell_type
      17             :    USE cp_log_handling,                 ONLY: cp_get_default_logger,&
      18             :                                               cp_logger_get_default_io_unit,&
      19             :                                               cp_logger_type
      20             :    USE cp_output_handling,              ONLY: cp_print_key_finished_output,&
      21             :                                               cp_print_key_unit_nr
      22             :    USE ewald_environment_types,         ONLY: ewald_env_create,&
      23             :                                               ewald_env_get,&
      24             :                                               ewald_env_set,&
      25             :                                               ewald_environment_type,&
      26             :                                               read_ewald_section
      27             :    USE ewald_pw_types,                  ONLY: ewald_pw_create,&
      28             :                                               ewald_pw_type
      29             :    USE ewald_spline_util,               ONLY: Setup_Ewald_Spline
      30             :    USE input_constants,                 ONLY: do_qmmm_coulomb,&
      31             :                                               do_qmmm_gauss,&
      32             :                                               do_qmmm_pcharge,&
      33             :                                               do_qmmm_swave
      34             :    USE input_section_types,             ONLY: section_vals_get_subs_vals,&
      35             :                                               section_vals_type,&
      36             :                                               section_vals_val_get
      37             :    USE kinds,                           ONLY: dp
      38             :    USE mathconstants,                   ONLY: pi
      39             :    USE message_passing,                 ONLY: mp_para_env_type
      40             :    USE pw_poisson_types,                ONLY: do_ewald_ewald,&
      41             :                                               do_ewald_none,&
      42             :                                               do_ewald_pme,&
      43             :                                               do_ewald_spme
      44             :    USE qmmm_gaussian_types,             ONLY: qmmm_gaussian_p_type,&
      45             :                                               qmmm_gaussian_type
      46             :    USE qmmm_types_low,                  ONLY: qmmm_per_pot_p_type,&
      47             :                                               qmmm_per_pot_type,&
      48             :                                               qmmm_pot_p_type
      49             : #include "./base/base_uses.f90"
      50             : 
      51             :    IMPLICIT NONE
      52             :    PRIVATE
      53             : 
      54             :    LOGICAL, PRIVATE, PARAMETER :: debug_this_module = .TRUE.
      55             :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qmmm_per_elpot'
      56             :    PUBLIC :: qmmm_per_potential_init, qmmm_ewald_potential_init
      57             : 
      58             : CONTAINS
      59             : 
      60             : ! **************************************************************************************************
      61             : !> \brief Initialize the QMMM potential stored on vector,
      62             : !>      according the qmmm_coupl_type
      63             : !> \param qmmm_coupl_type ...
      64             : !> \param per_potentials ...
      65             : !> \param potentials ...
      66             : !> \param pgfs ...
      67             : !> \param qm_cell_small ...
      68             : !> \param mm_cell ...
      69             : !> \param para_env ...
      70             : !> \param compatibility ...
      71             : !> \param qmmm_periodic ...
      72             : !> \param print_section ...
      73             : !> \param eps_mm_rspace ...
      74             : !> \param maxchrg ...
      75             : !> \param ncp ...
      76             : !> \param ncpl ...
      77             : !> \par History
      78             : !>      09.2004 created [tlaino]
      79             : !> \author Teodoro Laino
      80             : ! **************************************************************************************************
      81          40 :    SUBROUTINE qmmm_per_potential_init(qmmm_coupl_type, per_potentials, potentials, &
      82             :                                       pgfs, qm_cell_small, mm_cell, para_env, compatibility, qmmm_periodic, print_section, &
      83             :                                       eps_mm_rspace, maxchrg, ncp, ncpl)
      84             :       INTEGER, INTENT(IN)                                :: qmmm_coupl_type
      85             :       TYPE(qmmm_per_pot_p_type), DIMENSION(:), POINTER   :: per_potentials
      86             :       TYPE(qmmm_pot_p_type), DIMENSION(:), POINTER       :: potentials
      87             :       TYPE(qmmm_gaussian_p_type), DIMENSION(:), POINTER  :: pgfs
      88             :       TYPE(cell_type), POINTER                           :: qm_cell_small, mm_cell
      89             :       TYPE(mp_para_env_type), POINTER                    :: para_env
      90             :       LOGICAL, INTENT(IN)                                :: compatibility
      91             :       TYPE(section_vals_type), POINTER                   :: qmmm_periodic, print_section
      92             :       REAL(KIND=dp), INTENT(IN)                          :: eps_mm_rspace, maxchrg
      93             :       INTEGER, INTENT(IN)                                :: ncp(3), ncpl(3)
      94             : 
      95             :       INTEGER                                            :: I, idim, ig, ig_start, iw, ix, iy, iz, &
      96             :                                                             K, Kmax(3), n_rep_real(3), &
      97             :                                                             n_rep_real_val, ncoarsel, ncoarset, &
      98             :                                                             Ndim, output_unit
      99          40 :       INTEGER, DIMENSION(:), POINTER                     :: mm_atom_index
     100             :       REAL(KIND=dp)                                      :: Ak, alpha, box(3), Fac(3), fs, g, g2, &
     101             :                                                             Gk, Gmax, mymaxradius, npl, npt, &
     102             :                                                             Prefactor, rc, rc2, Rmax, tmp, vec(3), &
     103             :                                                             vol
     104          40 :       REAL(KIND=dp), DIMENSION(:), POINTER               :: gx, gy, gz, Lg
     105             :       TYPE(cp_logger_type), POINTER                      :: logger
     106             :       TYPE(qmmm_gaussian_type), POINTER                  :: pgf
     107             : 
     108          40 :       NULLIFY (Lg, gx, gy, gz)
     109         160 :       ncoarset = PRODUCT(ncp)
     110         160 :       ncoarsel = PRODUCT(ncpl)
     111          40 :       logger => cp_get_default_logger()
     112          40 :       output_unit = cp_logger_get_default_io_unit(logger)
     113             :       Rmax = SQRT(mm_cell%hmat(1, 1)**2 + &
     114             :                   mm_cell%hmat(2, 2)**2 + &
     115             :                   mm_cell%hmat(3, 3)**2)
     116          40 :       CALL section_vals_val_get(qmmm_periodic, "GMAX", r_val=Gmax)
     117          40 :       CALL section_vals_val_get(qmmm_periodic, "REPLICA", i_val=n_rep_real_val)
     118         160 :       fac = 2.0e0_dp*Pi/(/mm_cell%hmat(1, 1), mm_cell%hmat(2, 2), mm_cell%hmat(3, 3)/)
     119         160 :       Kmax = CEILING(Gmax/Fac)
     120             :       Vol = mm_cell%hmat(1, 1)* &
     121             :             mm_cell%hmat(2, 2)* &
     122          40 :             mm_cell%hmat(3, 3)
     123          40 :       Ndim = (Kmax(1) + 1)*(2*Kmax(2) + 1)*(2*Kmax(3) + 1)
     124          40 :       ig_start = 1
     125         160 :       n_rep_real = n_rep_real_val
     126          40 :       IF (compatibility .AND. (qmmm_coupl_type == do_qmmm_gauss)) ig_start = 2
     127             : 
     128          40 :       CPASSERT(.NOT. ASSOCIATED(per_potentials))
     129         120 :       ALLOCATE (per_potentials(SIZE(pgfs)))
     130          40 :       CPASSERT(SIZE(pgfs) == SIZE(potentials))
     131         106 :       Potential_Type: DO K = 1, SIZE(pgfs)
     132             : 
     133          66 :          rc = pgfs(K)%pgf%Elp_Radius
     134          66 :          ALLOCATE (per_potentials(K)%Pot)
     135          66 :          SELECT CASE (qmmm_coupl_type)
     136             :          CASE (do_qmmm_coulomb, do_qmmm_pcharge)
     137             :             ! Not yet implemented for this case
     138           0 :             CPABORT("")
     139             :          CASE (do_qmmm_gauss, do_qmmm_swave)
     140         198 :             ALLOCATE (Lg(Ndim))
     141         198 :             ALLOCATE (gx(Ndim))
     142         198 :             ALLOCATE (gy(Ndim))
     143         264 :             ALLOCATE (gz(Ndim))
     144             :          END SELECT
     145             : 
     146       62796 :          LG = 0.0_dp
     147       62796 :          gx = 0.0_dp
     148       62796 :          gy = 0.0_dp
     149       62796 :          gz = 0.0_dp
     150             : 
     151           0 :          SELECT CASE (qmmm_coupl_type)
     152             :          CASE (do_qmmm_coulomb, do_qmmm_pcharge)
     153             :             ! Not yet implemented for this case
     154           0 :             CPABORT("")
     155             :          CASE (do_qmmm_gauss, do_qmmm_swave)
     156          66 :             pgf => pgfs(K)%pgf
     157          66 :             idim = 0
     158         412 :             DO ix = 0, kmax(1)
     159        4654 :                DO iy = -kmax(2), kmax(2)
     160       67318 :                   DO iz = -kmax(3), kmax(3)
     161       62730 :                      idim = idim + 1
     162       62730 :                      IF (ix == 0 .AND. iy == 0 .AND. iz == 0) THEN
     163         418 :                         DO Ig = ig_start, pgf%number_of_gaussians
     164         352 :                            Gk = pgf%Gk(Ig)
     165         352 :                            Ak = pgf%Ak(Ig)*Pi**(3.0_dp/2.0_dp)*Gk**3.0_dp
     166         418 :                            LG(idim) = LG(idim) - Ak
     167             :                         END DO
     168             :                      ELSE
     169       62664 :                         fs = 2.0_dp; IF (ix == 0) fs = 1.0_dp
     170      250656 :                         vec = fac*(/REAL(ix, KIND=dp), REAL(iy, KIND=dp), REAL(iz, KIND=dp)/)
     171      250656 :                         g2 = DOT_PRODUCT(vec, vec)
     172       62664 :                         rc2 = rc*rc
     173       62664 :                         g = SQRT(g2)
     174       62664 :                         IF (qmmm_coupl_type == do_qmmm_gauss) THEN
     175       62664 :                            LG(idim) = 4.0_dp*Pi/g2*EXP(-(g2*rc2)/4.0_dp)
     176           0 :                         ELSEIF (qmmm_coupl_type == do_qmmm_swave) THEN
     177           0 :                            tmp = 4.0_dp/rc2
     178           0 :                            LG(idim) = 4.0_dp*Pi*tmp**2/(g2*(g2 + tmp)**2)
     179             :                         END IF
     180      386924 :                         DO Ig = ig_start, pgf%number_of_gaussians
     181      324260 :                            Gk = pgf%Gk(Ig)
     182      324260 :                            Ak = pgf%Ak(Ig)*Pi**(3.0_dp/2.0_dp)*Gk**3.0_dp
     183      386924 :                            LG(idim) = LG(idim) - Ak*EXP(-(g*Gk)**2.0_dp/4.0_dp)
     184             :                         END DO
     185             :                      END IF
     186       62730 :                      LG(idim) = fs*LG(idim)*1.0_dp/Vol
     187       62730 :                      gx(idim) = fac(1)*REAL(ix, KIND=dp)
     188       62730 :                      gy(idim) = fac(2)*REAL(iy, KIND=dp)
     189       66972 :                      gz(idim) = fac(3)*REAL(iz, KIND=dp)
     190             :                   END DO
     191             :                END DO
     192             :             END DO
     193             : 
     194         186 :             IF (ALL(n_rep_real == -1)) THEN
     195          40 :                mymaxradius = 0.0_dp
     196         276 :                DO I = 1, pgf%number_of_gaussians
     197         276 :                   IF (pgf%Gk(I) /= 0.0_dp) THEN
     198         236 :                      alpha = 1.0_dp/pgf%Gk(I)
     199         236 :                      alpha = alpha*alpha
     200         236 :                      Prefactor = pgf%Ak(I)*maxchrg
     201         236 :                      mymaxradius = MAX(mymaxradius, exp_radius(0, alpha, eps_mm_rspace, Prefactor, rlow=mymaxradius))
     202             :                   END IF
     203             :                END DO
     204          40 :                box(1) = (qm_cell_small%hmat(1, 1) - mm_cell%hmat(1, 1))/2.0_dp
     205          40 :                box(2) = (qm_cell_small%hmat(2, 2) - mm_cell%hmat(2, 2))/2.0_dp
     206          40 :                box(3) = (qm_cell_small%hmat(3, 3) - mm_cell%hmat(3, 3))/2.0_dp
     207         160 :                IF (ANY(box > 0.0_dp)) THEN
     208           0 :                   CPABORT("")
     209             :                END IF
     210          40 :                n_rep_real(1) = CEILING((box(1) + mymaxradius)/mm_cell%hmat(1, 1))
     211          40 :                n_rep_real(2) = CEILING((box(2) + mymaxradius)/mm_cell%hmat(2, 2))
     212          40 :                n_rep_real(3) = CEILING((box(3) + mymaxradius)/mm_cell%hmat(3, 3))
     213             :             END IF
     214             : 
     215             :          CASE DEFAULT
     216           0 :             DEALLOCATE (per_potentials(K)%Pot)
     217           0 :             IF (output_unit > 0) WRITE (output_unit, '(A)') " QMMM Periodic Potential - not Initialized!"
     218          66 :             CYCLE Potential_Type
     219             :          END SELECT
     220             : 
     221          66 :          NULLIFY (mm_atom_index)
     222         198 :          ALLOCATE (mm_atom_index(SIZE(potentials(K)%pot%mm_atom_index)))
     223        1606 :          mm_atom_index = potentials(K)%pot%mm_atom_index
     224             : 
     225          66 :          NULLIFY (per_potentials(K)%Pot%LG, per_potentials(K)%Pot%mm_atom_index, &
     226          66 :                   per_potentials(K)%Pot%gx, per_potentials(K)%Pot%gy, per_potentials(K)%Pot%gz)
     227             :          CALL qmmm_per_pot_type_create(per_potentials(K)%Pot, LG=LG, gx=gx, gy=gy, gz=gz, &
     228             :                                        Gmax=Gmax, Kmax=Kmax, n_rep_real=n_rep_real, &
     229             :                                        Fac=Fac, mm_atom_index=mm_atom_index, &
     230             :                                        mm_cell=mm_cell, para_env=para_env, &
     231          66 :                                        qmmm_per_section=qmmm_periodic, print_section=print_section)
     232             : 
     233             :          iw = cp_print_key_unit_nr(logger, print_section, "PERIODIC_INFO", &
     234          66 :                                    extension=".log")
     235          66 :          IF (iw > 0) THEN
     236          37 :             npt = REAL(ncoarset, KIND=dp)*REAL(ndim, KIND=dp)*REAL(SIZE(mm_atom_index), KIND=dp)
     237          37 :             npl = REAL(ncoarsel, KIND=dp)*REAL(ndim, KIND=dp)*REAL(SIZE(mm_atom_index), KIND=dp)
     238          37 :             WRITE (UNIT=iw, FMT="(/,T2,A)") REPEAT("-", 79)
     239          37 :             WRITE (UNIT=iw, FMT="(T2,A,T20,A,T80,A)") "-", "QMMM PERIODIC BOUNDARY CONDITION INFO", "-"
     240          37 :             WRITE (UNIT=iw, FMT="(T2,A)") REPEAT("-", 79)
     241          37 :             WRITE (UNIT=iw, FMT="(T2,A,T10,A,F15.6,T50,A,3I5,T80,A)") "-", "RADIUS  =", rc, "REPLICA =", n_rep_real, "-"
     242       34343 :             WRITE (UNIT=iw, FMT="(T2,A,T10,A,F15.6,T50,A,I15,T80,A)") "-", "MINGVAL =", MINVAL(ABS(Lg)), &
     243          74 :                "GPOINTS =", ndim, "-"
     244          37 :             WRITE (UNIT=iw, FMT="(T2,A,T10,A,3I5,T50,A,3I5,T80,A)") "-", "NCOARSL =", ncpl, &
     245          74 :                "NCOARST =", ncp, "-"
     246          37 :             WRITE (UNIT=iw, FMT="(T2,A,T10,A,F15.0,T50,A,F15.0,T80,A)") "-", "NFLOP-L ~", npl, &
     247          74 :                "NFLOP-T ~", npt, "-"
     248          37 :             WRITE (UNIT=iw, FMT="(T2,A)") REPEAT("-", 79)
     249             :          END IF
     250             :          CALL cp_print_key_finished_output(iw, logger, print_section, &
     251         106 :                                            "PERIODIC_INFO")
     252             : 
     253             :       END DO Potential_Type
     254             : 
     255          80 :    END SUBROUTINE qmmm_per_potential_init
     256             : 
     257             : ! **************************************************************************************************
     258             : !> \brief Creates the qmmm_pot_type structure
     259             : !> \param Pot ...
     260             : !> \param LG ...
     261             : !> \param gx ...
     262             : !> \param gy ...
     263             : !> \param gz ...
     264             : !> \param GMax ...
     265             : !> \param Kmax ...
     266             : !> \param n_rep_real ...
     267             : !> \param Fac ...
     268             : !> \param mm_atom_index ...
     269             : !> \param mm_cell ...
     270             : !> \param para_env ...
     271             : !> \param qmmm_per_section ...
     272             : !> \param print_section ...
     273             : !> \par History
     274             : !>      09.2004 created [tlaino]
     275             : !> \author Teodoro Laino
     276             : ! **************************************************************************************************
     277          66 :    SUBROUTINE qmmm_per_pot_type_create(Pot, LG, gx, gy, gz, GMax, Kmax, n_rep_real, &
     278             :                                        Fac, mm_atom_index, mm_cell, para_env, qmmm_per_section, print_section)
     279             :       TYPE(qmmm_per_pot_type), POINTER                   :: Pot
     280             :       REAL(KIND=dp), DIMENSION(:), POINTER               :: LG, gx, gy, gz
     281             :       REAL(KIND=dp), INTENT(IN)                          :: Gmax
     282             :       INTEGER, INTENT(IN)                                :: Kmax(3), n_rep_real(3)
     283             :       REAL(KIND=dp), INTENT(IN)                          :: Fac(3)
     284             :       INTEGER, DIMENSION(:), POINTER                     :: mm_atom_index
     285             :       TYPE(cell_type), POINTER                           :: mm_cell
     286             :       TYPE(mp_para_env_type), POINTER                    :: para_env
     287             :       TYPE(section_vals_type), POINTER                   :: qmmm_per_section, print_section
     288             : 
     289             :       INTEGER                                            :: npts(3)
     290          66 :       INTEGER, DIMENSION(:), POINTER                     :: ngrids
     291             :       REAL(KIND=dp)                                      :: hmat(3, 3)
     292             :       TYPE(section_vals_type), POINTER                   :: grid_print_section
     293             : 
     294          66 :       Pot%LG => LG
     295          66 :       Pot%gx => gx
     296          66 :       Pot%gy => gy
     297          66 :       Pot%gz => gz
     298          66 :       Pot%mm_atom_index => mm_atom_index
     299          66 :       Pot%Gmax = Gmax
     300         264 :       Pot%Kmax = Kmax
     301         264 :       Pot%n_rep_real = n_rep_real
     302         264 :       Pot%Fac = Fac
     303             :       !
     304             :       ! Setting Up Fit Procedure
     305             :       !
     306          66 :       NULLIFY (Pot%pw_grid)
     307          66 :       NULLIFY (Pot%pw_pool)
     308          66 :       NULLIFY (Pot%TabLR, ngrids)
     309          66 :       CALL section_vals_val_get(qmmm_per_section, "ngrids", i_vals=ngrids)
     310         264 :       npts = ngrids
     311         858 :       hmat = mm_cell%hmat
     312             : 
     313          66 :       grid_print_section => section_vals_get_subs_vals(print_section, "GRID_INFORMATION")
     314             :       CALL Setup_Ewald_Spline(pw_grid=Pot%pw_grid, pw_pool=Pot%pw_pool, coeff=Pot%TabLR, &
     315             :                               LG=LG, gx=gx, gy=gy, gz=gz, hmat=hmat, npts=npts, param_section=qmmm_per_section, &
     316          66 :                               tag="qmmm", para_env=para_env, print_section=grid_print_section)
     317             : 
     318          66 :    END SUBROUTINE qmmm_per_pot_type_create
     319             : 
     320             : ! **************************************************************************************************
     321             : !> \brief Initialize the QMMM Ewald potential needed for QM-QM Coupling using
     322             : !>      point charges
     323             : !> \param ewald_env ...
     324             : !> \param ewald_pw ...
     325             : !> \param qmmm_coupl_type ...
     326             : !> \param mm_cell ...
     327             : !> \param para_env ...
     328             : !> \param qmmm_periodic ...
     329             : !> \param print_section ...
     330             : !> \par History
     331             : !>      10.2014 created [JGH]
     332             : !> \author JGH
     333             : ! **************************************************************************************************
     334          16 :    SUBROUTINE qmmm_ewald_potential_init(ewald_env, ewald_pw, qmmm_coupl_type, mm_cell, para_env, &
     335             :                                         qmmm_periodic, print_section)
     336             :       TYPE(ewald_environment_type), POINTER              :: ewald_env
     337             :       TYPE(ewald_pw_type), POINTER                       :: ewald_pw
     338             :       INTEGER, INTENT(IN)                                :: qmmm_coupl_type
     339             :       TYPE(cell_type), POINTER                           :: mm_cell
     340             :       TYPE(mp_para_env_type), POINTER                    :: para_env
     341             :       TYPE(section_vals_type), POINTER                   :: qmmm_periodic, print_section
     342             : 
     343             :       INTEGER                                            :: ewald_type, gmax(3), iw, o_spline, ounit
     344             :       LOGICAL                                            :: do_multipoles
     345             :       REAL(KIND=dp)                                      :: alpha, rcut
     346             :       TYPE(cp_logger_type), POINTER                      :: logger
     347             :       TYPE(section_vals_type), POINTER                   :: ewald_print_section, ewald_section, &
     348             :                                                             poisson_section
     349             : 
     350           8 :       logger => cp_get_default_logger()
     351           8 :       ounit = cp_logger_get_default_io_unit(logger)
     352           8 :       CPASSERT(.NOT. ASSOCIATED(ewald_env))
     353           8 :       CPASSERT(.NOT. ASSOCIATED(ewald_pw))
     354             : 
     355             :       ! Create Ewald environments
     356           8 :       poisson_section => section_vals_get_subs_vals(qmmm_periodic, "POISSON")
     357         112 :       ALLOCATE (ewald_env)
     358           8 :       CALL ewald_env_create(ewald_env, para_env)
     359           8 :       CALL ewald_env_set(ewald_env, poisson_section=poisson_section)
     360           8 :       ewald_section => section_vals_get_subs_vals(poisson_section, "EWALD")
     361           8 :       CALL read_ewald_section(ewald_env, ewald_section)
     362           8 :       ewald_print_section => section_vals_get_subs_vals(print_section, "GRID_INFORMATION")
     363           8 :       ALLOCATE (ewald_pw)
     364           8 :       CALL ewald_pw_create(ewald_pw, ewald_env, mm_cell, mm_cell, print_section=ewald_print_section)
     365             : 
     366             :       CALL ewald_env_get(ewald_env, ewald_type=ewald_type, do_multipoles=do_multipoles, &
     367           8 :                          gmax=gmax, o_spline=o_spline, alpha=alpha, rcut=rcut)
     368           8 :       IF (do_multipoles) &
     369           0 :          CPABORT("No multipole force fields allowed in QM-QM Ewald long range correction")
     370             : 
     371           8 :       SELECT CASE (qmmm_coupl_type)
     372             :       CASE (do_qmmm_coulomb)
     373           0 :          CPABORT("QM-QM long range correction not possible with COULOMB coupling")
     374             :       CASE (do_qmmm_pcharge)
     375             :          ! OK
     376             :       CASE (do_qmmm_gauss, do_qmmm_swave)
     377           0 :          CPABORT("QM-QM long range correction not possible with GAUSS/SWAVE coupling")
     378             :       CASE DEFAULT
     379             :          ! We should never get to this point
     380           8 :          CPABORT("")
     381             :       END SELECT
     382             : 
     383           8 :       iw = cp_print_key_unit_nr(logger, print_section, "PERIODIC_INFO", extension=".log")
     384           8 :       IF (iw > 0) THEN
     385           2 :          WRITE (UNIT=iw, FMT="(/,T2,A)") REPEAT("-", 79)
     386           2 :          WRITE (UNIT=iw, FMT="(T2,A,T20,A,T80,A)") "-", "QMMM PERIODIC BOUNDARY CONDITION INFO", "-"
     387           2 :          WRITE (UNIT=iw, FMT="(T2,A,T25,A,T80,A)") "-", "QM-QM Long Range Correction", "-"
     388           2 :          WRITE (UNIT=iw, FMT="(T2,A)") REPEAT("-", 79)
     389           0 :          SELECT CASE (ewald_type)
     390             :          CASE (do_ewald_none)
     391           0 :             CPABORT("QM-QM long range correction not compatible with Ewald=NONE")
     392             :          CASE (do_ewald_pme)
     393           0 :             CPABORT("QM-QM long range correction not possible with Ewald=PME")
     394             :          CASE (do_ewald_ewald)
     395           0 :             CPABORT("QM-QM long range correction not possible with Ewald method")
     396             :          CASE (do_ewald_spme)
     397           2 :             WRITE (UNIT=iw, FMT="(T2,A,T35,A,T75,A,T80,A)") "-", "Ewald type", "SPME", "-"
     398           2 :             WRITE (UNIT=iw, FMT="(T2,A,T35,A,T61,3I6,T80,A)") "-", "GMAX values", gmax, "-"
     399           2 :             WRITE (UNIT=iw, FMT="(T2,A,T35,A,T73,I6,T80,A)") "-", "Spline order", o_spline, "-"
     400           2 :             WRITE (UNIT=iw, FMT="(T2,A,T35,A,T67,F12.4,T80,A)") "-", "Alpha value", alpha, "-"
     401           4 :             WRITE (UNIT=iw, FMT="(T2,A,T35,A,T67,F12.4,T80,A)") "-", "Real space cutoff value", rcut, "-"
     402             :          END SELECT
     403           2 :          WRITE (UNIT=iw, FMT="(T2,A)") REPEAT("-", 79)
     404             :       END IF
     405           8 :       CALL cp_print_key_finished_output(iw, logger, print_section, "PERIODIC_INFO")
     406             : 
     407           8 :    END SUBROUTINE qmmm_ewald_potential_init
     408             : 
     409             : END MODULE qmmm_per_elpot

Generated by: LCOV version 1.15