Tinker9 70bd052 (Thu Nov 9 12:11:35 2023 -0800)
Loading...
Searching...
No Matches
pair_charge.h
1#pragma once
2#include "ff/elec.h"
3#include "math/const.h"
4#include "math/libfunc.h"
5#include "math/switch.h"
6#include "seq/add.h"
7#include "seq/seq.h"
8
9namespace tinker {
10#pragma acc routine seq
11template <class Ver, class ETYP>
13void pair_charge(real r, real xr, real yr, real zr, real cscale, real chgi,
14 real chgk, real ebuffer, real f, real aewald, real cut, real off,
15 real& restrict grdx, real& restrict grdy, real& restrict grdz,
16 int& restrict ctl, real& restrict etl, real& restrict vtlxx,
17 real& restrict vtlxy, real& restrict vtlxz, real& restrict vtlyy,
18 real& restrict vtlyz, real& restrict vtlzz)
19{
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>();
25 MAYBE_UNUSED real e, dedx, dedy, dedz;
26
27 if CONSTEXPR (eq<ETYP, EWALD>()) {
28 real fik = f * chgi * chgk;
29 real rew = aewald * r;
30 real erfterm = REAL_ERFC(rew);
31 real rb = r + ebuffer;
32 real invrb = REAL_RECIP(rb);
33
34 if CONSTEXPR (do_e) e = fik * invrb * erfterm;
35 if CONSTEXPR (do_g) {
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;
40 de *= -fik;
41 de *= invr;
42 dedx = de * xr;
43 dedy = de * yr;
44 dedz = de * zr;
45 }
46 } else if CONSTEXPR (eq<ETYP, NON_EWALD>() || taper_flag) {
47 real fik = cscale * f * chgi * chgk;
48 real rb = r + ebuffer;
49 real invrb = REAL_RECIP(rb);
50
51 // always calculate e
52 e = fik * invrb;
53 MAYBE_UNUSED real de, invr;
54 if CONSTEXPR (do_g) {
55 invr = REAL_RECIP(r);
56 real invrb2 = invrb * invrb;
57 de = -fik * invrb2;
58 }
59
60 // shifted energy switching
61 //
62 // empirical (?) 7th degree additive switching function
63 // e = taper (e - shift) + trans
64 //
65 // cut = A; off = B; x = (r - A) / (B - A); s = B - A
66 //
67 // shift = fik / ((A + B)/2)
68 //
69 // trans = coef poly(x)
70 // coef = fik (1/A - 1/B) / 9.3
71 // poly(x) = 64 x^3 - 217 x^4 + 267 x^5 - 139 x^6 + 25 x^7
72 // = x^3 (1-x)^3 (64 - 25 x)
73 //
74 // dtrans = coef poly'(x) / s; dtrans = d/dr trans
75 // poly'(x) = x^2 (1-x)^2 (25 x - 12) (7 x - 16)
76
77 if CONSTEXPR (taper_flag) {
78 // shifted energy
79 real shift = fik * 2 * REAL_RECIP(cut + off);
80 e -= shift;
81
82 // switching
83 if (r > cut) {
84 real taper, dtaper;
85 switchTaper5<do_g>(r, cut, off, taper, dtaper);
86
87 real trans, dtrans;
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;
92 real y = (1 - x) * x;
93 trans = coef * y * y * y * (64 - 25 * x);
94 if CONSTEXPR (do_g) {
95 dtrans = y * y * (25 * x - 12) * (7 * x - 16);
96 dtrans *= coef * invs;
97 }
98
99 if CONSTEXPR (do_g) de = e * dtaper + de * taper + dtrans;
100 if CONSTEXPR (do_e) e = e * taper + trans;
101 }
102 }
103
104 if CONSTEXPR (do_g) {
105 de *= invr;
106 dedx = de * xr;
107 dedy = de * yr;
108 dedz = de * zr;
109 }
110 }
111
112 if CONSTEXPR (do_a) {
113 // ci and ck may be zero
114 if (e != 0) {
115 // scale = 1.0 -- count +1 scale = 0.4 or 0.0 -- impossible
116 // scale = -0.6 -- count +0 scale = -1.0 -- count -1
117 if (cscale == 1)
118 ctl += 1;
119 else if (cscale == -1)
120 ctl -= 1;
121 }
122 }
123 if CONSTEXPR (do_e) etl += e;
124 if CONSTEXPR (do_g) {
125 grdx += dedx;
126 grdy += dedy;
127 grdz += dedz;
128 }
129 if CONSTEXPR (do_v) {
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;
136 vtlxx += vxx;
137 vtlxy += vyx;
138 vtlxz += vzx;
139 vtlyy += vyy;
140 vtlyz += vzy;
141 vtlzz += vzz;
142 }
143}
144
145#pragma acc routine seq
146template <bool DO_G, class ETYP, int SCALE>
148void pair_chg_v2(real r, real invr, //
149 real cscale, real chgi, real chgk, real f, real aewald, real eccut,
150 real ecoff, real& restrict ec, real& restrict dec)
151{
152 if (r > ecoff) {
153 ec = 0;
154 if CONSTEXPR (DO_G) dec = 0;
155 return;
156 }
157 real fik = f * chgi * chgk;
158 if CONSTEXPR (eq<ETYP, EWALD>()) {
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;
164 if CONSTEXPR (DO_G) {
165 constexpr real two = 2.0f / sqrtpi;
166 dec = erfterm * invr + two * aewald * expterm;
167 dec *= -fik * invr;
168 }
169 } else if CONSTEXPR (eq<ETYP, NON_EWALD_TAPER>()) {
170 if CONSTEXPR (SCALE != 1) fik *= cscale;
171 ec = fik * invr;
172 if CONSTEXPR (DO_G) dec = -ec * invr;
173
174 // shift energy
175 real shift = fik * 2 * REAL_RECIP(eccut + ecoff);
176 ec -= shift;
177 if (r > eccut) {
178 real taper, dtaper;
179 switchTaper5<DO_G>(r, eccut, ecoff, taper, dtaper);
180 real trans, dtrans;
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;
185 real y = (1 - x) * x;
186 trans = coef * y * y * y * (64 - 25 * x);
187 if CONSTEXPR (DO_G) {
188 dtrans = y * y * (25 * x - 12) * (7 * x - 16);
189 dtrans *= coef * invs;
190 dec = ec * dtaper + dec * taper + dtrans;
191 }
192 ec = ec * taper + trans;
193 }
194 }
195}
196
197#pragma acc routine seq
198template <bool DO_G, class ETYP, int SCALE>
200void pair_chg_v3(real r, real cscale, real chgi, real chgk, real ebuffer,
201 real f, real aewald, real eccut, real ecoff, real& restrict ec,
202 real& restrict dec)
203{
204 real fik = f * chgi * chgk;
205 real rb = r + ebuffer;
206 real invrb = REAL_RECIP(rb);
207 if CONSTEXPR (eq<ETYP, EWALD>()) {
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;
213 if CONSTEXPR (DO_G) {
214 constexpr real two = 2.0f / sqrtpi;
215 dec = erfterm * invrb + two * aewald * expterm;
216 dec *= -fik * invrb;
217 }
218 } else if CONSTEXPR (eq<ETYP, NON_EWALD_TAPER>()) {
219 if CONSTEXPR (SCALE != 1) fik *= cscale;
220 ec = fik * invrb;
221 if CONSTEXPR (DO_G) dec = -ec * invrb;
222
223 // shift energy
224 real shift = fik * 2 * REAL_RECIP(eccut + ecoff);
225 ec -= shift;
226 if (r > eccut) {
227 real taper, dtaper;
228 switchTaper5<DO_G>(r, eccut, ecoff, taper, dtaper);
229 real trans, dtrans;
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;
234 real y = (1 - x) * x;
235 trans = coef * y * y * y * (64 - 25 * x);
236 if CONSTEXPR (DO_G) {
237 dtrans = y * y * (25 * x - 12) * (7 * x - 16);
238 dtrans *= coef * invs;
239 dec = ec * dtaper + dec * taper + dtrans;
240 }
241 ec = ec * taper + trans;
242 }
243 }
244}
245}
#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
Definition: testrt.h:9
EnergyBuffer ec
__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
real ebuffer