2#include "seq/damp_hippo.h"
3#include "seq/pair_mpole.h"
7template <
bool do_e,
bool do_g,
class ETYP,
int CFLX>
18 real r = REAL_SQRT(r2);
19 real invr1 = REAL_RECIP(r);
20 real rr2 = invr1 * invr1;
29 real rr5 = 3 * rr3 * rr2;
30 real rr7 = 5 * rr5 * rr2;
31 real rr9 = 7 * rr7 * rr2;
36 real dir = dix * xr + diy * yr + diz * zr;
37 real qix = qixx * xr + qixy * yr + qixz * zr;
38 real qiy = qixy * xr + qiyy * yr + qiyz * zr;
39 real qiz = qixz * xr + qiyz * yr + qizz * zr;
40 real qir = qix * xr + qiy * yr + qiz * zr;
41 real dkr = dkx * xr + dky * yr + dkz * zr;
42 real qkx = qkxx * xr + qkxy * yr + qkxz * zr;
43 real qky = qkxy * xr + qkyy * yr + qkyz * zr;
44 real qkz = qkxz * xr + qkyz * yr + qkzz * zr;
45 real qkr = qkx * xr + qky * yr + qkz * zr;
46 real dik = dix * dkx + diy * dky + diz * dkz;
47 real qik = qix * qkx + qiy * qky + qiz * qkz;
48 real diqk = dix * qkx + diy * qky + diz * qkz;
49 real dkqi = dkx * qix + dky * qiy + dkz * qiz;
50 real qiqk = 2 * (qixy * qkxy + qixz * qkxz + qiyz * qkyz) + qixx * qkxx
51 + qiyy * qkyy + qizz * qkzz;
54 real term1 = corei * corek;
55 real term1i = corek * vali;
56 real term2i = corek * dir;
57 real term3i = corek * qir;
58 real term1k = corei * valk;
59 real term2k = -corei * dkr;
60 real term3k = corei * qkr;
61 real term1ik = vali * valk;
62 real term2ik = valk * dir - vali * dkr + dik;
63 real term3ik = vali * qkr + valk * qir - dir * dkr
64 + 2 * (dkqi - diqk + qiqk);
65 real term4ik = dir * qkr - dkr * qir - 4 * qik;
66 real term5ik = qir * qkr;
68 real rr1i, rr3i, rr5i, rr7i, rr1k, rr3k, rr5k, rr7k, rr1ik, rr3ik, rr5ik,
73 damp_pole_v2<11>(dmpik, dmpi, dmpk, r, alphai, alphak);
75 damp_pole_v2<9>(dmpik, dmpi, dmpk, r, alphai, alphak);
81 damp_ewald<6>(bn, r, invr1, rr2, aewald);
83 damp_ewald<5>(bn, r, invr1, rr2, aewald);
92 }
else if CONSTEXPR (eq<ETYP, NON_EWALD>()) {
101 rr1i = bn[0] - (1 - mscale * dmpi[0]) * rr1;
102 rr3i = bn[1] - (1 - mscale * dmpi[1]) * rr3;
103 rr5i = bn[2] - (1 - mscale * dmpi[2]) * rr5;
104 rr7i = bn[3] - (1 - mscale * dmpi[3]) * rr7;
105 rr1k = bn[0] - (1 - mscale * dmpk[0]) * rr1;
106 rr3k = bn[1] - (1 - mscale * dmpk[1]) * rr3;
107 rr5k = bn[2] - (1 - mscale * dmpk[2]) * rr5;
108 rr7k = bn[3] - (1 - mscale * dmpk[3]) * rr7;
109 rr1ik = bn[0] - (1 - mscale * dmpik[0]) * rr1;
110 rr3ik = bn[1] - (1 - mscale * dmpik[1]) * rr3;
111 rr5ik = bn[2] - (1 - mscale * dmpik[2]) * rr5;
112 rr7ik = bn[3] - (1 - mscale * dmpik[3]) * rr7;
113 rr9ik = bn[4] - (1 - mscale * dmpik[4]) * rr9;
114 if CONSTEXPR (do_g) rr11ik = bn[5] - (1 - mscale * dmpik[5]) * rr11;
115 rr1 = bn[0] - (1 - mscale) * rr1;
116 rr3 = bn[1] - (1 - mscale) * rr3;
119 e = term1 * rr1 + term4ik * rr7ik + term5ik * rr9ik + term1i * rr1i
120 + term1k * rr1k + term1ik * rr1ik + term2i * rr3i + term2k * rr3k
121 + term2ik * rr3ik + term3i * rr5i + term3k * rr5k + term3ik * rr5ik;
126 real qixk = qixx * qkx + qixy * qky + qixz * qkz;
127 real qiyk = qixy * qkx + qiyy * qky + qiyz * qkz;
128 real qizk = qixz * qkx + qiyz * qky + qizz * qkz;
129 real qkxi = qkxx * qix + qkxy * qiy + qkxz * qiz;
130 real qkyi = qkxy * qix + qkyy * qiy + qkyz * qiz;
131 real qkzi = qkxz * qix + qkyz * qiy + qkzz * qiz;
133 real diqkx = dix * qkxx + diy * qkxy + diz * qkxz;
134 real diqky = dix * qkxy + diy * qkyy + diz * qkyz;
135 real diqkz = dix * qkxz + diy * qkyz + diz * qkzz;
136 real dkqix = dkx * qixx + dky * qixy + dkz * qixz;
137 real dkqiy = dkx * qixy + dky * qiyy + dkz * qiyz;
138 real dkqiz = dkx * qixz + dky * qiyz + dkz * qizz;
140 real de = term1 * rr3 + term4ik * rr9ik + term5ik * rr11ik + term1i * rr3i
141 + term1k * rr3k + term1ik * rr3ik + term2i * rr5i + term2k * rr5k
142 + term2ik * rr5ik + term3i * rr7i + term3k * rr7k + term3ik * rr7ik;
144 term1 = -corek * rr3i - valk * rr3ik + dkr * rr5ik - qkr * rr7ik;
145 real term2 = corei * rr3k + vali * rr3ik + dir * rr5ik + qir * rr7ik;
146 real term3 = 2 * rr5ik;
148 * (corek * rr5i + valk * rr5ik - dkr * rr7ik + qkr * rr9ik);
150 * (corei * rr5k + vali * rr5ik + dir * rr7ik + qir * rr9ik);
151 real term6 = 4 * rr7ik;
154 real t1i = corek * rr1i + valk * rr1ik;
155 real t1k = corei * rr1k + vali * rr1ik;
156 real t2i = -dkr * rr3ik;
157 real t2k = dir * rr3ik;
158 real t3i = qkr * rr5ik;
159 real t3k = qir * rr5ik;
160 poti = t1i + t2i + t3i;
161 potk = t1k + t2k + t3k;
164 pgrad.frcx = de * xr + term1 * dix + term2 * dkx + term3 * (diqkx - dkqix)
165 + term4 * qix + term5 * qkx + term6 * (qixk + qkxi);
166 pgrad.frcy = de * yr + term1 * diy + term2 * dky + term3 * (diqky - dkqiy)
167 + term4 * qiy + term5 * qky + term6 * (qiyk + qkyi);
168 pgrad.frcz = de * zr + term1 * diz + term2 * dkz + term3 * (diqkz - dkqiz)
169 + term4 * qiz + term5 * qkz + term6 * (qizk + qkzi);
172 real dirx = diy * zr - diz * yr;
173 real diry = diz * xr - dix * zr;
174 real dirz = dix * yr - diy * xr;
175 real dkrx = dky * zr - dkz * yr;
176 real dkry = dkz * xr - dkx * zr;
177 real dkrz = dkx * yr - dky * xr;
178 real dikx = diy * dkz - diz * dky;
179 real diky = diz * dkx - dix * dkz;
180 real dikz = dix * dky - diy * dkx;
182 real qirx = qiz * yr - qiy * zr;
183 real qiry = qix * zr - qiz * xr;
184 real qirz = qiy * xr - qix * yr;
185 real qkrx = qkz * yr - qky * zr;
186 real qkry = qkx * zr - qkz * xr;
187 real qkrz = qky * xr - qkx * yr;
188 real qikx = qky * qiz - qkz * qiy;
189 real qiky = qkz * qix - qkx * qiz;
190 real qikz = qkx * qiy - qky * qix;
192 real qikrx = qizk * yr - qiyk * zr;
193 real qikry = qixk * zr - qizk * xr;
194 real qikrz = qiyk * xr - qixk * yr;
195 real qkirx = qkzi * yr - qkyi * zr;
196 real qkiry = qkxi * zr - qkzi * xr;
197 real qkirz = qkyi * xr - qkxi * yr;
199 real diqkrx = diqkz * yr - diqky * zr;
200 real diqkry = diqkx * zr - diqkz * xr;
201 real diqkrz = diqky * xr - diqkx * yr;
202 real dkqirx = dkqiz * yr - dkqiy * zr;
203 real dkqiry = dkqix * zr - dkqiz * xr;
204 real dkqirz = dkqiy * xr - dkqix * yr;
206 real dqikx = diy * qkz - diz * qky + dky * qiz - dkz * qiy
208 * (qixy * qkxz + qiyy * qkyz + qiyz * qkzz - qixz * qkxy
209 - qiyz * qkyy - qizz * qkyz);
210 real dqiky = diz * qkx - dix * qkz + dkz * qix - dkx * qiz
212 * (qixz * qkxx + qiyz * qkxy + qizz * qkxz - qixx * qkxz
213 - qixy * qkyz - qixz * qkzz);
214 real dqikz = dix * qky - diy * qkx + dkx * qiy - dky * qix
216 * (qixx * qkxy + qixy * qkyy + qixz * qkyz - qixy * qkxx
217 - qiyy * qkxy - qiyz * qkxz);
219 pgrad.ttmi[0] = -rr3ik * dikx + term1 * dirx + term3 * (dqikx + dkqirx)
220 - term4 * qirx - term6 * (qikrx + qikx);
221 pgrad.ttmi[1] = -rr3ik * diky + term1 * diry + term3 * (dqiky + dkqiry)
222 - term4 * qiry - term6 * (qikry + qiky);
223 pgrad.ttmi[2] = -rr3ik * dikz + term1 * dirz + term3 * (dqikz + dkqirz)
224 - term4 * qirz - term6 * (qikrz + qikz);
225 pgrad.ttmk[0] = rr3ik * dikx + term2 * dkrx - term3 * (dqikx + diqkrx)
226 - term5 * qkrx - term6 * (qkirx - qikx);
227 pgrad.ttmk[1] = rr3ik * diky + term2 * dkry - term3 * (dqiky + diqkry)
228 - term5 * qkry - term6 * (qkiry - qiky);
229 pgrad.ttmk[2] = rr3ik * dikz + term2 * dkrz - term3 * (dqikz + diqkrz)
230 - term5 * qkrz - term6 * (qkirz - qikz);
#define SEQ_CUDA
Definition: acc/seqdef.h:12
#define restrict
Definition: macro.h:51
#define CONSTEXPR
Definition: macro.h:61
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 pair_mpole_chgpen(real r2, real xr, real yr, real zr, real mscale, 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 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 f, real aewald, real &__restrict__ e, real &__restrict__ poti, real &__restrict__ potk, PairMPoleGrad &__restrict__ pgrad)
Definition: pair_mpole_chgpen.h:9