2#include "seq/damp_hippo.h"
3#include "seq/pair_polar.h"
7template <
bool do_e,
bool do_g,
class ETYP,
int CFLX>
18 real dir = dix * xr + diy * yr + diz * zr;
19 real qix = qixx * xr + qixy * yr + qixz * zr;
20 real qiy = qixy * xr + qiyy * yr + qiyz * zr;
21 real qiz = qixz * xr + qiyz * yr + qizz * zr;
22 real qir = qix * xr + qiy * yr + qiz * zr;
23 real dkr = dkx * xr + dky * yr + dkz * zr;
24 real qkx = qkxx * xr + qkxy * yr + qkxz * zr;
25 real qky = qkxy * xr + qkyy * yr + qkyz * zr;
26 real qkz = qkxz * xr + qkyz * yr + qkzz * zr;
27 real qkr = qkx * xr + qky * yr + qkz * zr;
28 real uir = uix * xr + uiy * yr + uiz * zr;
29 real ukr = ukx * xr + uky * yr + ukz * zr;
31 real r = REAL_SQRT(r2);
32 real invr1 = REAL_RECIP(r);
33 real rr2 = invr1 * invr1;
37 real rr5 = 3 * rr3 * rr2;
38 real rr7 = 5 * rr5 * rr2;
39 real rr9 = 7 * rr7 * rr2;
42 real dmpi[5], dmpk[5];
45 real rr3core, rr5core, rr3i, rr5i, rr7i, rr9i;
46 real rr3k, rr5k, rr7k, rr9k, rr5ik, rr7ik;
47 real dsr3i, dsr5i, dsr7i, dsr3k, dsr5k, dsr7k;
50 damp_ewald<5>(bn, r, invr1, rr2, aewald);
51 damp_pole_v2<11>(dmpik, dmpi, dmpk, r, alphai, alphak);
53 damp_ewald<4>(bn, r, invr1, rr2, aewald);
54 damp_pole_v2<9>(dmpik, dmpi, dmpk, r, alphai, alphak);
61 }
else if CONSTEXPR (eq<ETYP, NON_EWALD>()) {
63 damp_pole_v2<11>(dmpik, dmpi, dmpk, r, alphai, alphak);
65 damp_pole_v2<9>(dmpik, dmpi, dmpk, r, alphai, alphak);
74 rr3core = bn[1] - (1 - dscale) * rr3;
75 rr5core = bn[2] - (1 - dscale) * rr5;
76 rr3i = bn[1] - (1 - dscale * dmpi[1]) * rr3;
77 rr5i = bn[2] - (1 - dscale * dmpi[2]) * rr5;
78 rr7i = bn[3] - (1 - dscale * dmpi[3]) * rr7;
79 rr9i = bn[4] - (1 - dscale * dmpi[4]) * rr9;
80 rr3k = bn[1] - (1 - dscale * dmpk[1]) * rr3;
81 rr5k = bn[2] - (1 - dscale * dmpk[2]) * rr5;
82 rr7k = bn[3] - (1 - dscale * dmpk[3]) * rr7;
83 rr9k = bn[4] - (1 - dscale * dmpk[4]) * rr9;
84 rr5ik = bn[2] - (1 - wscale * dmpik[2]) * rr5;
85 rr7ik = bn[3] - (1 - wscale * dmpik[3]) * rr7;
95 real diu = dix * ukx + diy * uky + diz * ukz;
96 real qiu = qix * ukx + qiy * uky + qiz * ukz;
97 real dku = dkx * uix + dky * uiy + dkz * uiz;
98 real qku = qkx * uix + qky * uiy + qkz * uiz;
99 e = uir * (corek * rr3core + valk * rr3k)
100 - ukr * (corei * rr3core + vali * rr3i) + diu * rr3i + dku * rr3k
101 + 2 * (qiu * rr5i - qku * rr5k) - dkr * uir * rr5k - dir * ukr * rr5i
102 + qkr * uir * rr7k - qir * ukr * rr7i;
107 real tix3 = dsr3i * ukx;
108 real tiy3 = dsr3i * uky;
109 real tiz3 = dsr3i * ukz;
110 real tkx3 = dsr3k * uix;
111 real tky3 = dsr3k * uiy;
112 real tkz3 = dsr3k * uiz;
113 real tuir = -dsr5i * ukr;
114 real tukr = -dsr5k * uir;
121 pgrad.ufldi[0] = (tix3 + xr * tuir);
122 pgrad.ufldi[1] = (tiy3 + yr * tuir);
123 pgrad.ufldi[2] = (tiz3 + zr * tuir);
124 pgrad.ufldk[0] = (tkx3 + xr * tukr);
125 pgrad.ufldk[1] = (tky3 + yr * tukr);
126 pgrad.ufldk[2] = (tkz3 + zr * tukr);
130 real tix5 = 2 * (dsr5i * ukx);
131 real tiy5 = 2 * (dsr5i * uky);
132 real tiz5 = 2 * (dsr5i * ukz);
133 real tkx5 = 2 * (dsr5k * uix);
134 real tky5 = 2 * (dsr5k * uiy);
135 real tkz5 = 2 * (dsr5k * uiz);
139 pgrad.dufldi[0] = (xr * tix5 + xr * xr * tuir);
140 pgrad.dufldi[1] = (xr * tiy5 + yr * tix5 + 2 * xr * yr * tuir);
141 pgrad.dufldi[2] = (yr * tiy5 + yr * yr * tuir);
142 pgrad.dufldi[3] = (xr * tiz5 + zr * tix5 + 2 * xr * zr * tuir);
143 pgrad.dufldi[4] = (yr * tiz5 + zr * tiy5 + 2 * yr * zr * tuir);
144 pgrad.dufldi[5] = (zr * tiz5 + zr * zr * tuir);
145 pgrad.dufldk[0] = (-xr * tkx5 - xr * xr * tukr);
146 pgrad.dufldk[1] = (-xr * tky5 - yr * tkx5 - 2 * xr * yr * tukr);
147 pgrad.dufldk[2] = (-yr * tky5 - yr * yr * tukr);
148 pgrad.dufldk[3] = (-xr * tkz5 - zr * tkx5 - 2 * xr * zr * tukr);
149 pgrad.dufldk[4] = (-yr * tkz5 - zr * tky5 - 2 * yr * zr * tukr);
150 pgrad.dufldk[5] = (-zr * tkz5 - zr * zr * tukr);
154 real term1i, term2i, term3i, term4i, term5i, term6i, term1core;
156 real term1k, term2k, term3k, term4k, term5k, term6k;
159 term1i = rr3i - rr5i * xr * xr;
160 term1core = rr3core - rr5core * xr * xr;
161 term2i = 2 * rr5i * xr;
162 term3i = rr7i * xr * xr - rr5i;
164 term5i = 5 * rr7i * xr;
165 term6i = rr9i * xr * xr;
166 term1k = rr3k - rr5k * xr * xr;
167 term2k = 2 * rr5k * xr;
168 term3k = rr7k * xr * xr - rr5k;
170 term5k = 5 * rr7k * xr;
171 term6k = rr9k * xr * xr;
172 real tixx = vali * term1i + corei * term1core + dix * term2i
173 - dir * term3i - qixx * term4i + qix * term5i - qir * term6i
174 + (qiy * yr + qiz * zr) * rr7i;
175 real tkxx = valk * term1k + corek * term1core - dkx * term2k
176 + dkr * term3k - qkxx * term4k + qkx * term5k - qkr * term6k
177 + (qky * yr + qkz * zr) * rr7k;
178 term1i = rr3i - rr5i * yr * yr;
179 term1core = rr3core - rr5core * yr * yr;
180 term2i = 2 * rr5i * yr;
181 term3i = rr7i * yr * yr - rr5i;
183 term5i = 5 * rr7i * yr;
184 term6i = rr9i * yr * yr;
185 term1k = rr3k - rr5k * yr * yr;
186 term2k = 2 * rr5k * yr;
187 term3k = rr7k * yr * yr - rr5k;
189 term5k = 5 * rr7k * yr;
190 term6k = rr9k * yr * yr;
191 real tiyy = vali * term1i + corei * term1core + diy * term2i
192 - dir * term3i - qiyy * term4i + qiy * term5i - qir * term6i
193 + (qix * xr + qiz * zr) * rr7i;
194 real tkyy = valk * term1k + corek * term1core - dky * term2k
195 + dkr * term3k - qkyy * term4k + qky * term5k - qkr * term6k
196 + (qkx * xr + qkz * zr) * rr7k;
197 term1i = rr3i - rr5i * zr * zr;
198 term1core = rr3core - rr5core * zr * zr;
199 term2i = 2 * rr5i * zr;
200 term3i = rr7i * zr * zr - rr5i;
202 term5i = 5 * rr7i * zr;
203 term6i = rr9i * zr * zr;
204 term1k = rr3k - rr5k * zr * zr;
205 term2k = 2 * rr5k * zr;
206 term3k = rr7k * zr * zr - rr5k;
208 term5k = 5 * rr7k * zr;
209 term6k = rr9k * zr * zr;
210 real tizz = vali * term1i + corei * term1core + diz * term2i
211 - dir * term3i - qizz * term4i + qiz * term5i - qir * term6i
212 + (qix * xr + qiy * yr) * rr7i;
213 real tkzz = valk * term1k + corek * term1core - dkz * term2k
214 + dkr * term3k - qkzz * term4k + qkz * term5k - qkr * term6k
215 + (qkx * xr + qky * yr) * rr7k;
217 term1i = yr * term2i;
218 term1core = rr5core * xr * yr;
220 term4i = yr * (rr7i * xr);
222 term6i = 2 * rr7i * xr;
223 term7i = 2 * rr7i * yr;
224 term8i = yr * rr9i * xr;
226 term1k = yr * term2k;
228 term4k = yr * (rr7k * xr);
230 term6k = 2 * rr7k * xr;
231 term7k = 2 * rr7k * yr;
232 term8k = yr * rr9k * xr;
233 real tixy = -vali * term1i - corei * term1core + diy * term2i
234 + dix * term3i - dir * term4i - qixy * term5i + qiy * term6i
235 + qix * term7i - qir * term8i;
236 real tkxy = -valk * term1k - corek * term1core - dky * term2k
237 - dkx * term3k + dkr * term4k - qkxy * term5k + qky * term6k
238 + qkx * term7k - qkr * term8k;
241 term1i = zr * term2i;
242 term1core = rr5core * xr * zr;
244 term4i = zr * (rr7i * xr);
246 term6i = 2 * rr7i * xr;
247 term7i = 2 * rr7i * zr;
248 term8i = zr * rr9i * xr;
250 term1k = zr * term2k;
252 term4k = zr * (rr7k * xr);
254 term6k = 2 * rr7k * xr;
255 term7k = 2 * rr7k * zr;
256 term8k = zr * rr9k * xr;
257 real tixz = -vali * term1i - corei * term1core + diz * term2i
258 + dix * term3i - dir * term4i - qixz * term5i + qiz * term6i
259 + qix * term7i - qir * term8i;
260 real tkxz = -valk * term1k - corek * term1core - dkz * term2k
261 - dkx * term3k + dkr * term4k - qkxz * term5k + qkz * term6k
262 + qkx * term7k - qkr * term8k;
265 term1i = zr * term2i;
266 term1core = rr5core * yr * zr;
268 term4i = zr * (rr7i * yr);
270 term6i = 2 * rr7i * yr;
271 term7i = 2 * rr7i * zr;
272 term8i = zr * rr9i * yr;
274 term1k = zr * term2k;
276 term4k = zr * (rr7k * yr);
278 term6k = 2 * rr7k * yr;
279 term7k = 2 * rr7k * zr;
280 term8k = zr * rr9k * yr;
281 real tiyz = -vali * term1i - corei * term1core + diz * term2i
282 + diy * term3i - dir * term4i - qiyz * term5i + qiz * term6i
283 + qiy * term7i - qir * term8i;
284 real tkyz = -valk * term1k - corek * term1core - dkz * term2k
285 - dky * term3k + dkr * term4k - qkyz * term5k + qkz * term6k
286 + qky * term7k - qkr * term8k;
290 depx = tixx * ukx + tixy * uky + tixz * ukz - tkxx * uix - tkxy * uiy
292 depy = tixy * ukx + tiyy * uky + tiyz * ukz - tkxy * uix - tkyy * uiy
294 depz = tixz * ukx + tiyz * uky + tizz * ukz - tkxz * uix - tkyz * uiy
297 pgrad.frcx = 2 *
depx;
298 pgrad.frcy = 2 *
depy;
299 pgrad.frcz = 2 *
depz;
303 real term1 = 2 * rr5ik;
304 real term2 = term1 * xr;
305 real term3 = rr5ik - rr7ik * xr * xr;
306 tixx = uix * term2 + uir * term3;
307 tkxx = ukx * term2 + ukr * term3;
309 term3 = rr5ik - rr7ik * yr * yr;
310 tiyy = uiy * term2 + uir * term3;
311 tkyy = uky * term2 + ukr * term3;
313 term3 = rr5ik - rr7ik * zr * zr;
314 tizz = uiz * term2 + uir * term3;
315 tkzz = ukz * term2 + ukr * term3;
318 term3 = yr * (rr7ik * xr);
319 tixy = uix * term1 + uiy * term2 - uir * term3;
320 tkxy = ukx * term1 + uky * term2 - ukr * term3;
322 term3 = zr * (rr7ik * xr);
323 tixz = uix * term1 + uiz * term2 - uir * term3;
324 tkxz = ukx * term1 + ukz * term2 - ukr * term3;
326 term3 = zr * (rr7ik * yr);
327 tiyz = uiy * term1 + uiz * term2 - uir * term3;
328 tkyz = uky * term1 + ukz * term2 - ukr * term3;
330 depx = tixx * ukx + tixy * uky + tixz * ukz + tkxx * uix + tkxy * uiy
332 depy = tixy * ukx + tiyy * uky + tiyz * ukz + tkxy * uix + tkyy * uiy
334 depz = tixz * ukx + tiyz * uky + tizz * ukz + tkxz * uix + tkyz * uiy
#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_polar_chgpen(real r2, real xr, real yr, real zr, real dscale, real wscale, real ci, real dix, real diy, real diz, real corei, real vali, real alphai, real qixx, real qixy, real qixz, real qiyy, real qiyz, real qizz, real uix, real uiy, real uiz, real ck, real dkx, real dky, real dkz, real corek, real valk, real alphak, real qkxx, real qkxy, real qkxz, real qkyy, real qkyz, real qkzz, real ukx, real uky, real ukz, real f, real aewald, real &__restrict__ e, real &__restrict__ poti, real &__restrict__ potk, PairPolarGrad &__restrict__ pgrad)
Definition: pair_polar_chgpen.h:9
Definition: pair_polar.h:8