62#pragma acc routine seq
63template <
bool do_e,
bool do_g,
class ETYP>
75 real r = REAL_SQRT(r2);
76 real invr1 = REAL_RECIP(r);
77 real rr2 = invr1 * invr1;
89 damp_ewald<5>(bn, r, invr1, rr2, aewald);
91 damp_ewald<6>(bn, r, invr1, rr2, aewald);
98 }
else if CONSTEXPR (eq<ETYP, NON_EWALD>()) {
99 rr1 = mscale * f * invr1;
104 if CONSTEXPR (do_g) rr11 = 9 * rr9 * rr2;
107 real dir = dix * xr + diy * yr + diz * zr;
108 real qix = qixx * xr + qixy * yr + qixz * zr;
109 real qiy = qixy * xr + qiyy * yr + qiyz * zr;
110 real qiz = qixz * xr + qiyz * yr + qizz * zr;
111 real qir = qix * xr + qiy * yr + qiz * zr;
112 real dkr = dkx * xr + dky * yr + dkz * zr;
113 real qkx = qkxx * xr + qkxy * yr + qkxz * zr;
114 real qky = qkxy * xr + qkyy * yr + qkyz * zr;
115 real qkz = qkxz * xr + qkyz * yr + qkzz * zr;
116 real qkr = qkx * xr + qky * yr + qkz * zr;
117 real dik = dix * dkx + diy * dky + diz * dkz;
118 real qik = qix * qkx + qiy * qky + qiz * qkz;
119 real diqk = dix * qkx + diy * qky + diz * qkz;
120 real dkqi = dkx * qix + dky * qiy + dkz * qiz;
121 real qiqk = 2 * (qixy * qkxy + qixz * qkxz + qiyz * qkyz) + qixx * qkxx
122 + qiyy * qkyy + qizz * qkzz;
124 real term1 = ci * ck;
125 real term2 = ck * dir - ci * dkr + dik;
126 real term3 = ci * qkr + ck * qir - dir * dkr + 2 * (dkqi - diqk + qiqk);
127 real term4 = dir * qkr - dkr * qir - 4 * qik;
128 real term5 = qir * qkr;
131 e = term1 * rr1 + term2 * rr3 + term3 * rr5 + term4 * rr7 + term5 * rr9;
138 real qixk = qixx * qkx + qixy * qky + qixz * qkz;
139 real qiyk = qixy * qkx + qiyy * qky + qiyz * qkz;
140 real qizk = qixz * qkx + qiyz * qky + qizz * qkz;
141 real qkxi = qkxx * qix + qkxy * qiy + qkxz * qiz;
142 real qkyi = qkxy * qix + qkyy * qiy + qkyz * qiz;
143 real qkzi = qkxz * qix + qkyz * qiy + qkzz * qiz;
145 real diqkx = dix * qkxx + diy * qkxy + diz * qkxz;
146 real diqky = dix * qkxy + diy * qkyy + diz * qkyz;
147 real diqkz = dix * qkxz + diy * qkyz + diz * qkzz;
148 real dkqix = dkx * qixx + dky * qixy + dkz * qixz;
149 real dkqiy = dkx * qixy + dky * qiyy + dkz * qiyz;
150 real dkqiz = dkx * qixz + dky * qiyz + dkz * qizz;
152 real de = term1 * rr3 + term2 * rr5 + term3 * rr7 + term4 * rr9
155 term1 = -ck * rr3 + dkr * rr5 - qkr * rr7;
156 term2 = ci * rr3 + dir * rr5 + qir * rr7;
158 term4 = 2 * (-ck * rr5 + dkr * rr7 - qkr * rr9);
159 term5 = 2 * (-ci * rr5 - dir * rr7 - qir * rr9);
160 real term6 = 4 * rr7;
162 pgrad.frcx = de * xr + term1 * dix + term2 * dkx + term3 * (diqkx - dkqix)
163 + term4 * qix + term5 * qkx + term6 * (qixk + qkxi);
164 pgrad.frcy = de * yr + term1 * diy + term2 * dky + term3 * (diqky - dkqiy)
165 + term4 * qiy + term5 * qky + term6 * (qiyk + qkyi);
166 pgrad.frcz = de * zr + term1 * diz + term2 * dkz + term3 * (diqkz - dkqiz)
167 + term4 * qiz + term5 * qkz + term6 * (qizk + qkzi);
171 real dirx = diy * zr - diz * yr;
172 real diry = diz * xr - dix * zr;
173 real dirz = dix * yr - diy * xr;
174 real dkrx = dky * zr - dkz * yr;
175 real dkry = dkz * xr - dkx * zr;
176 real dkrz = dkx * yr - dky * xr;
177 real dikx = diy * dkz - diz * dky;
178 real diky = diz * dkx - dix * dkz;
179 real dikz = dix * dky - diy * dkx;
181 real qirx = qiz * yr - qiy * zr;
182 real qiry = qix * zr - qiz * xr;
183 real qirz = qiy * xr - qix * yr;
184 real qkrx = qkz * yr - qky * zr;
185 real qkry = qkx * zr - qkz * xr;
186 real qkrz = qky * xr - qkx * yr;
187 real qikx = qky * qiz - qkz * qiy;
188 real qiky = qkz * qix - qkx * qiz;
189 real qikz = qkx * qiy - qky * qix;
191 real qikrx = qizk * yr - qiyk * zr;
192 real qikry = qixk * zr - qizk * xr;
193 real qikrz = qiyk * xr - qixk * yr;
194 real qkirx = qkzi * yr - qkyi * zr;
195 real qkiry = qkxi * zr - qkzi * xr;
196 real qkirz = qkyi * xr - qkxi * yr;
198 real diqkrx = diqkz * yr - diqky * zr;
199 real diqkry = diqkx * zr - diqkz * xr;
200 real diqkrz = diqky * xr - diqkx * yr;
201 real dkqirx = dkqiz * yr - dkqiy * zr;
202 real dkqiry = dkqix * zr - dkqiz * xr;
203 real dkqirz = dkqiy * xr - dkqix * yr;
205 real dqikx = diy * qkz - diz * qky + dky * qiz - dkz * qiy
207 * (qixy * qkxz + qiyy * qkyz + qiyz * qkzz - qixz * qkxy
208 - qiyz * qkyy - qizz * qkyz);
209 real dqiky = diz * qkx - dix * qkz + dkz * qix - dkx * qiz
211 * (qixz * qkxx + qiyz * qkxy + qizz * qkxz - qixx * qkxz
212 - qixy * qkyz - qixz * qkzz);
213 real dqikz = dix * qky - diy * qkx + dkx * qiy - dky * qix
215 * (qixx * qkxy + qixy * qkyy + qixz * qkyz - qixy * qkxx
216 - qiyy * qkxy - qiyz * qkxz);
218 pgrad.ttmi[0] = -rr3 * dikx + term1 * dirx + term3 * (dqikx + dkqirx)
219 - term4 * qirx - term6 * (qikrx + qikx);
220 pgrad.ttmi[1] = -rr3 * diky + term1 * diry + term3 * (dqiky + dkqiry)
221 - term4 * qiry - term6 * (qikry + qiky);
222 pgrad.ttmi[2] = -rr3 * dikz + term1 * dirz + term3 * (dqikz + dkqirz)
223 - term4 * qirz - term6 * (qikrz + qikz);
224 pgrad.ttmk[0] = rr3 * dikx + term2 * dkrx - term3 * (dqikx + diqkrx)
225 - term5 * qkrx - term6 * (qkirx - qikx);
226 pgrad.ttmk[1] = rr3 * diky + term2 * dkry - term3 * (dqiky + diqkry)
227 - term5 * qkry - term6 * (qkiry - qiky);
228 pgrad.ttmk[2] = rr3 * dikz + term2 * dkrz - term3 * (dqikz + diqkrz)
229 - term5 * qkrz - term6 * (qkirz - qikz);
233#pragma acc routine seq
234template <
class Ver,
class ETYP>
252 constexpr bool do_e = Ver::e;
253 constexpr bool do_g = Ver::g;
254 constexpr bool do_v = Ver::v;
256 real r = REAL_SQRT(r2);
257 real invr1 = REAL_RECIP(r);
258 real rr2 = invr1 * invr1;
270 damp_ewald<5>(bn, r, invr1, rr2, aewald);
272 damp_ewald<6>(bn, r, invr1, rr2, aewald);
279 }
else if CONSTEXPR (eq<ETYP, NON_EWALD>()) {
280 rr1 = mscale * f * invr1;
285 if CONSTEXPR (do_g) rr11 = 9 * rr9 * rr2;
288 real dir = dix * xr + diy * yr + diz * zr;
289 real qix = qixx * xr + qixy * yr + qixz * zr;
290 real qiy = qixy * xr + qiyy * yr + qiyz * zr;
291 real qiz = qixz * xr + qiyz * yr + qizz * zr;
292 real qir = qix * xr + qiy * yr + qiz * zr;
293 real dkr = dkx * xr + dky * yr + dkz * zr;
294 real qkx = qkxx * xr + qkxy * yr + qkxz * zr;
295 real qky = qkxy * xr + qkyy * yr + qkyz * zr;
296 real qkz = qkxz * xr + qkyz * yr + qkzz * zr;
297 real qkr = qkx * xr + qky * yr + qkz * zr;
298 real dik = dix * dkx + diy * dky + diz * dkz;
299 real qik = qix * qkx + qiy * qky + qiz * qkz;
300 real diqk = dix * qkx + diy * qky + diz * qkz;
301 real dkqi = dkx * qix + dky * qiy + dkz * qiz;
302 real qiqk = 2 * (qixy * qkxy + qixz * qkxz + qiyz * qkyz) + qixx * qkxx
303 + qiyy * qkyy + qizz * qkzz;
305 real term1 = ci * ck;
306 real term2 = ck * dir - ci * dkr + dik;
307 real term3 = ci * qkr + ck * qir - dir * dkr + 2 * (dkqi - diqk + qiqk);
308 real term4 = dir * qkr - dkr * qir - 4 * qik;
309 real term5 = qir * qkr;
312 e = term1 * rr1 + term2 * rr3 + term3 * rr5 + term4 * rr7 + term5 * rr9;
315 real frcx, frcy, frcz;
318 real qixk = qixx * qkx + qixy * qky + qixz * qkz;
319 real qiyk = qixy * qkx + qiyy * qky + qiyz * qkz;
320 real qizk = qixz * qkx + qiyz * qky + qizz * qkz;
321 real qkxi = qkxx * qix + qkxy * qiy + qkxz * qiz;
322 real qkyi = qkxy * qix + qkyy * qiy + qkyz * qiz;
323 real qkzi = qkxz * qix + qkyz * qiy + qkzz * qiz;
325 real diqkx = dix * qkxx + diy * qkxy + diz * qkxz;
326 real diqky = dix * qkxy + diy * qkyy + diz * qkyz;
327 real diqkz = dix * qkxz + diy * qkyz + diz * qkzz;
328 real dkqix = dkx * qixx + dky * qixy + dkz * qixz;
329 real dkqiy = dkx * qixy + dky * qiyy + dkz * qiyz;
330 real dkqiz = dkx * qixz + dky * qiyz + dkz * qizz;
332 real de = term1 * rr3 + term2 * rr5 + term3 * rr7 + term4 * rr9
335 term1 = -ck * rr3 + dkr * rr5 - qkr * rr7;
336 term2 = ci * rr3 + dir * rr5 + qir * rr7;
338 term4 = 2 * (-ck * rr5 + dkr * rr7 - qkr * rr9);
339 term5 = 2 * (-ci * rr5 - dir * rr7 - qir * rr9);
340 real term6 = 4 * rr7;
342 frcx = de * xr + term1 * dix + term2 * dkx + term3 * (diqkx - dkqix)
343 + term4 * qix + term5 * qkx + term6 * (qixk + qkxi);
344 frcy = de * yr + term1 * diy + term2 * dky + term3 * (diqky - dkqiy)
345 + term4 * qiy + term5 * qky + term6 * (qiyk + qkyi);
346 frcz = de * zr + term1 * diz + term2 * dkz + term3 * (diqkz - dkqiz)
347 + term4 * qiz + term5 * qkz + term6 * (qizk + qkzi);
356 real dirx = diy * zr - diz * yr;
357 real diry = diz * xr - dix * zr;
358 real dirz = dix * yr - diy * xr;
359 real dkrx = dky * zr - dkz * yr;
360 real dkry = dkz * xr - dkx * zr;
361 real dkrz = dkx * yr - dky * xr;
362 real dikx = diy * dkz - diz * dky;
363 real diky = diz * dkx - dix * dkz;
364 real dikz = dix * dky - diy * dkx;
366 real qirx = qiz * yr - qiy * zr;
367 real qiry = qix * zr - qiz * xr;
368 real qirz = qiy * xr - qix * yr;
369 real qkrx = qkz * yr - qky * zr;
370 real qkry = qkx * zr - qkz * xr;
371 real qkrz = qky * xr - qkx * yr;
372 real qikx = qky * qiz - qkz * qiy;
373 real qiky = qkz * qix - qkx * qiz;
374 real qikz = qkx * qiy - qky * qix;
376 real qikrx = qizk * yr - qiyk * zr;
377 real qikry = qixk * zr - qizk * xr;
378 real qikrz = qiyk * xr - qixk * yr;
379 real qkirx = qkzi * yr - qkyi * zr;
380 real qkiry = qkxi * zr - qkzi * xr;
381 real qkirz = qkyi * xr - qkxi * yr;
383 real diqkrx = diqkz * yr - diqky * zr;
384 real diqkry = diqkx * zr - diqkz * xr;
385 real diqkrz = diqky * xr - diqkx * yr;
386 real dkqirx = dkqiz * yr - dkqiy * zr;
387 real dkqiry = dkqix * zr - dkqiz * xr;
388 real dkqirz = dkqiy * xr - dkqix * yr;
390 real dqikx = diy * qkz - diz * qky + dky * qiz - dkz * qiy
392 * (qixy * qkxz + qiyy * qkyz + qiyz * qkzz - qixz * qkxy
393 - qiyz * qkyy - qizz * qkyz);
394 real dqiky = diz * qkx - dix * qkz + dkz * qix - dkx * qiz
396 * (qixz * qkxx + qiyz * qkxy + qizz * qkxz - qixx * qkxz
397 - qixy * qkyz - qixz * qkzz);
398 real dqikz = dix * qky - diy * qkx + dkx * qiy - dky * qix
400 * (qixx * qkxy + qixy * qkyy + qixz * qkyz - qixy * qkxx
401 - qiyy * qkxy - qiyz * qkxz);
403 trqxi += -rr3 * dikx + term1 * dirx + term3 * (dqikx + dkqirx)
404 - term4 * qirx - term6 * (qikrx + qikx);
405 trqyi += -rr3 * diky + term1 * diry + term3 * (dqiky + dkqiry)
406 - term4 * qiry - term6 * (qikry + qiky);
407 trqzi += -rr3 * dikz + term1 * dirz + term3 * (dqikz + dkqirz)
408 - term4 * qirz - term6 * (qikrz + qikz);
409 trqxk += rr3 * dikx + term2 * dkrx - term3 * (dqikx + diqkrx)
410 - term5 * qkrx - term6 * (qkirx - qikx);
411 trqyk += rr3 * diky + term2 * dkry - term3 * (dqiky + diqkry)
412 - term5 * qkry - term6 * (qkiry - qiky);
413 trqzk += rr3 * dikz + term2 * dkrz - term3 * (dqikz + diqkrz)
414 - term5 * qkrz - term6 * (qkirz - qikz);
419 vxy = -0.5f * (yr * frcx + xr * frcy);
420 vxz = -0.5f * (zr * frcx + xr * frcz);
422 vyz = -0.5f * (zr * frcy + yr * frcz);
#define SEQ_ROUTINE
Definition: acc/seqdef.h:7
#define SEQ_CUDA
Definition: acc/seqdef.h:12
#define restrict
Definition: macro.h:51
#define CONSTEXPR
Definition: macro.h:61
real frcy
Incomplete x, y, or z gradients of atom i.
Definition: pair_mpole.h:18
real frcx
Incomplete x, y, or z gradients of atom i.
Definition: pair_mpole.h:18
real ttmi[3]
x, y, and z torques on atom i.
Definition: pair_mpole.h:21
real frcz
Incomplete x, y, or z gradients of atom i.
Definition: pair_mpole.h:18
real ttmk[3]
x, y, and z torques on atom k.
Definition: pair_mpole.h:23
__device__ void pair_mpole(real r2, real xr, real yr, real zr, real mscale, real ci, real dix, real diy, real diz, real qixx, real qixy, real qixz, real qiyy, real qiyz, real qizz, real ck, real dkx, real dky, real dkz, real qkxx, real qkxy, real qkxz, real qkyy, real qkyz, real qkzz, real f, real aewald, real &__restrict__ e, PairMPoleGrad &__restrict__ pgrad)
OpenACC pairwise multipole electrostatic energy.
Definition: pair_mpole.h:65
Components of the pairwise multipole electrostatic gradient between atoms i and k,...
Definition: pair_mpole.h:14
float real
Definition: precision.h:80
__device__ void zero(PairMPoleGrad &pgrad)
Definition: pair_mpole.h:27
__device__ void pair_mpole_v2(real r2, real xr, real yr, real zr, real mscale, real ci, real dix, real diy, real diz, real qixx, real qixy, real qixz, real qiyy, real qiyz, real qizz, real ck, real dkx, real dky, real dkz, real qkxx, real qkxy, real qkxz, real qkyy, real qkyz, real qkzz, real f, real aewald, real &__restrict__ frcxi, real &__restrict__ frcyi, real &__restrict__ frczi, real &__restrict__ frcxk, real &__restrict__ frcyk, real &__restrict__ frczk, real &__restrict__ trqxi, real &__restrict__ trqyi, real &__restrict__ trqzi, real &__restrict__ trqxk, real &__restrict__ trqyk, real &__restrict__ trqzk, real &__restrict__ e, real &__restrict__ vxx, real &__restrict__ vxy, real &__restrict__ vxz, real &__restrict__ vyy, real &__restrict__ vyz, real &__restrict__ vzz)
Definition: pair_mpole.h:236