3#include "math/libfunc.h"
4#include "math/switch.h"
6#include "seq/damp_hippodisp.h"
7#include "seq/pair_vlambda.h"
11#pragma acc routine seq
12template <
bool DO_G,
class DTYP,
int SCALE>
35#if TINKER_REAL_SIZE == 8
37#elif TINKER_REAL_SIZE == 4
41 real diff = REAL_ABS(ai -
ak);
43 real rr6 = rr2 * rr2 * rr2;
46 real expi = REAL_EXP(-di);
47 real expk = REAL_EXP(-dk);
49 real damp = 1, ddamp = 0;
53 real ti = ak2 * REAL_RECIP((
ak + ai) * (
ak - ai));
54 real tk = ai2 * REAL_RECIP((ai +
ak) * (ai -
ak));
57 real termi = ((di / 2 + b1) / 2 * di + b1) * di + b1;
58 real termk = ((dk / 2 + a1) / 2 * dk + a1) * dk + a1;
59 termi *= ti * ti * expi;
60 termk *= tk * tk * expk;
61 damp = 1 - termi - termk;
64 real a2 = (di - 1) / 4 + tk;
65 real b2 = (dk - 1) / 4 + ti;
66 a2 *= ai * di2 * ti * ti * expi;
67 b2 *=
ak * dk2 * tk * tk * expk;
71 ai = (ai +
ak) * 0.5f;
75 real term = ((((di + 5) * di + 17) * di / 96 + 0.5f) * di + 1) * di + 1;
76 damp = 1 - term * expi;
78 ddamp = ai * expi * di2 * ((di2 - 3) * di - 3) / 96;
85 real ralpha2 = r2 * aewald * aewald;
86 real term = 1 + ralpha2 + 0.5f * ralpha2 * ralpha2;
87 real expterm = REAL_EXP(-ralpha2);
88 real expa = expterm * term;
89 e = -ci * ck * rr6 * (dspscale * damp * damp + expa - 1);
91 real rterm = -ralpha2 * ralpha2 * ralpha2 * rr1 * expterm;
92 de = -6 * e * rr1 - ci * ck * rr6 * (rterm + 2 * dspscale * damp * ddamp);
94 }
else if CONSTEXPR (eq<DTYP, NON_EWALD_TAPER>()) {
98 de = de * damp * damp + 2 * e * damp * ddamp;
103 switchTaper5<DO_G>(r, edcut, edoff, taper, dtaper);
105 de = e * dtaper + de * taper;
114#pragma acc routine seq
115template <
bool DO_G,
class DTYP,
int SCALE,
int SOFTCORE>
139 real rr2 = rr1 * rr1;
140 real rr6 = rr2 * rr2 * rr2;
141 real dmpik[2], damp, ddamp;
142 damp_hippodisp<DO_G>(dmpik, r, rr1, ai,
ak);
152 real vlambda2 = vlambda * vlambda;
153 real vlambda3 = vlambda2 * vlambda;
154 real vterm = (vlambda2 * vlambda2) / REAL_SQRT(1.0 + vlambda2 - vlambda3);
159 real ralpha2 = r2 * aewald * aewald;
160 real term = 1 + ralpha2 + 0.5f * ralpha2 * ralpha2;
161 real expterm = REAL_EXP(-ralpha2);
162 real expa = expterm * term;
163 e = -ci * ck * rr6 * (dspscale * damp * damp + expa - 1);
165 real rterm = -ralpha2 * ralpha2 * ralpha2 * rr1 * expterm;
166 de = -6 * e * rr1 - ci * ck * rr6 * (rterm + 2 * dspscale * damp * ddamp);
168 }
else if CONSTEXPR (eq<DTYP, NON_EWALD_TAPER>()) {
172 de = de * damp * damp + 2 * e * damp * ddamp;
177 switchTaper5<DO_G>(r, edcut, edoff, taper, dtaper);
179 de = e * dtaper + de * taper;
#define SEQ_CUDA
Definition: acc/seqdef.h:12
#define restrict
Definition: macro.h:51
#define CONSTEXPR
Definition: macro.h:61
float real
Definition: precision.h:80
__device__ void pair_disp_obsolete(real r, real r2, real rr1, real dspscale, real aewald, real ci, real ai, real ck, real ak, real edcut, real edoff, real &__restrict__ e, real &__restrict__ de)
Definition: pair_disp.h:14
__device__ void pair_disp(real r, real r2, real rr1, real dspscale, real aewald, real ci, real ai, real ck, real ak, real vlambda, real edcut, real edoff, real &__restrict__ e, real &__restrict__ de)
Definition: pair_disp.h:117