4#include "math/libfunc.h"
5#include "math/switch.h"
10#pragma acc routine seq
11template <
class Ver,
class ETYP>
20 constexpr bool do_e = Ver::e;
21 constexpr bool do_a = Ver::a;
22 constexpr bool do_g = Ver::g;
23 constexpr bool do_v = Ver::v;
24 constexpr bool taper_flag = eq<ETYP, NON_EWALD_TAPER>();
28 real fik = f * chgi * chgk;
29 real rew = aewald * r;
30 real erfterm = REAL_ERFC(rew);
32 real invrb = REAL_RECIP(rb);
34 if CONSTEXPR (do_e) e = fik * invrb * erfterm;
36 real invr = REAL_RECIP(r);
37 real invrb2 = invrb * invrb;
38 real de = erfterm * invrb2;
39 de += (2 * aewald /
sqrtpi) * REAL_EXP(-rew * rew) * invrb;
46 }
else if CONSTEXPR (eq<ETYP, NON_EWALD>() || taper_flag) {
47 real fik = cscale * f * chgi * chgk;
49 real invrb = REAL_RECIP(rb);
56 real invrb2 = invrb * invrb;
79 real shift = fik * 2 * REAL_RECIP(cut + off);
85 switchTaper5<do_g>(r, cut, off, taper, dtaper);
88 real coef = fik * (REAL_RECIP(cut) - REAL_RECIP(off))
89 * REAL_RECIP((
real)9.3);
90 real invs = REAL_RECIP(off - cut);
91 real x = (r - cut) * invs;
93 trans = coef *
y *
y *
y * (64 - 25 *
x);
95 dtrans =
y *
y * (25 *
x - 12) * (7 *
x - 16);
96 dtrans *= coef * invs;
99 if CONSTEXPR (do_g) de = e * dtaper + de * taper + dtrans;
100 if CONSTEXPR (do_e) e = e * taper + trans;
119 else if (cscale == -1)
130 real vxx = xr * dedx;
131 real vyx = yr * dedx;
132 real vzx = zr * dedx;
133 real vyy = yr * dedy;
134 real vzy = zr * dedy;
135 real vzz = zr * dedz;
145#pragma acc routine seq
146template <
bool DO_G,
class ETYP,
int SCALE>
157 real fik = f * chgi * chgk;
159 const real rew = aewald * r;
160 const real expterm = REAL_EXP(-rew * rew);
161 real erfterm = REAL_ERFC_V2(rew, expterm);
162 if CONSTEXPR (SCALE != 1) erfterm += cscale - 1;
163 ec = fik * invr * erfterm;
166 dec = erfterm * invr + two * aewald * expterm;
169 }
else if CONSTEXPR (eq<ETYP, NON_EWALD_TAPER>()) {
175 real shift = fik * 2 * REAL_RECIP(eccut + ecoff);
179 switchTaper5<DO_G>(r, eccut, ecoff, taper, dtaper);
181 real coef = fik * (REAL_RECIP(eccut) - REAL_RECIP(ecoff))
182 * REAL_RECIP((
real)9.3);
183 real invs = REAL_RECIP(ecoff - eccut);
184 real x = (r - eccut) * invs;
186 trans = coef *
y *
y *
y * (64 - 25 *
x);
188 dtrans =
y *
y * (25 *
x - 12) * (7 *
x - 16);
189 dtrans *= coef * invs;
190 dec =
ec * dtaper + dec * taper + dtrans;
192 ec =
ec * taper + trans;
197#pragma acc routine seq
198template <
bool DO_G,
class ETYP,
int SCALE>
204 real fik = f * chgi * chgk;
206 real invrb = REAL_RECIP(rb);
208 const real rew = aewald * r;
209 const real expterm = REAL_EXP(-rew * rew);
210 real erfterm = REAL_ERFC_V2(rew, expterm);
211 if CONSTEXPR (SCALE != 1) erfterm += cscale - 1;
212 ec = fik * invrb * erfterm;
215 dec = erfterm * invrb + two * aewald * expterm;
218 }
else if CONSTEXPR (eq<ETYP, NON_EWALD_TAPER>()) {
224 real shift = fik * 2 * REAL_RECIP(eccut + ecoff);
228 switchTaper5<DO_G>(r, eccut, ecoff, taper, dtaper);
230 real coef = fik * (REAL_RECIP(eccut) - REAL_RECIP(ecoff))
231 * REAL_RECIP((
real)9.3);
232 real invs = REAL_RECIP(ecoff - eccut);
233 real x = (r - eccut) * invs;
235 trans = coef *
y *
y *
y * (64 - 25 *
x);
237 dtrans =
y *
y * (25 *
x - 12) * (7 *
x - 16);
238 dtrans *= coef * invs;
239 dec =
ec * dtaper + dec * taper + dtrans;
241 ec =
ec * taper + trans;
#define SEQ_CUDA
Definition: acc/seqdef.h:12
#define MAYBE_UNUSED
Definition: macro.h:75
#define restrict
Definition: macro.h:51
#define CONSTEXPR
Definition: macro.h:61
real * x
Number of the trajectory frames.
real * y
Current coordinates used in energy evaluation and neighbor lists.
constexpr real sqrtpi
Definition: const.h:11
float real
Definition: precision.h:80
__device__ void pair_charge(real r, real xr, real yr, real zr, real cscale, real chgi, real chgk, real ebuffer, real f, real aewald, real cut, real off, real &__restrict__ grdx, real &__restrict__ grdy, real &__restrict__ grdz, int &__restrict__ ctl, real &__restrict__ etl, real &__restrict__ vtlxx, real &__restrict__ vtlxy, real &__restrict__ vtlxz, real &__restrict__ vtlyy, real &__restrict__ vtlyz, real &__restrict__ vtlzz)
Definition: pair_charge.h:13
__device__ void pair_chg_v3(real r, real cscale, real chgi, real chgk, real ebuffer, real f, real aewald, real eccut, real ecoff, real &__restrict__ ec, real &__restrict__ dec)
Definition: pair_charge.h:200
__device__ void pair_chg_v2(real r, real invr, real cscale, real chgi, real chgk, real f, real aewald, real eccut, real ecoff, real &__restrict__ ec, real &__restrict__ dec)
Definition: pair_charge.h:148