2#include "ff/hippo/expolscr.h"
4#include "math/switch.h"
14 constexpr real inv2 = 1. / 2, inv3 = 1. / 3;
15 constexpr real one = 1.;
18 real alphaik, dmpik2, dampik, dampik2, expik, s;
19 alphaik = REAL_SQRT(alphai * alphak);
20 dmpik2 = inv2 * alphaik;
22 dampik2 = dampik * dampik;
23 expik = REAL_EXP(-dampik);
24 s = (one + dampik + dampik2 * inv3) * expik;
26 if (DO_G) ds2 = s * (-alphaik * inv3) * (dampik + dampik2) * expik;
28 real pfac = 2 / (alphai + alphak);
31 pfac = pfac * alphai * alphak;
32 pfac = pfac * pfac * pfac;
35 real a = alphai * r / 2, b = alphak * r / 2;
36 real c = (a + b) / 2, d = (b - a) / 2;
37 real expmc = REAL_EXP(-c);
41 real c2d2 = (c * d) * (c * d);
46 s = f1d * (c + 1) + f2d * c2;
53 ds = f1d * c2 + f2d * ((c - 2) * c2 - (c + 1) * d2) - f3d * c2d2;
56 ds2 = pfac * 2 * s * ds;
60 real alphaik = REAL_SQRT(alphai * alphak);
61 s2 = REAL_EXP(-alphaik / (
real)10 * r * r);
62 if (DO_G) ds2 = (-alphaik / (
real)5) * r * s2;
66 if (DO_G) ds2 = sizik * ds2;
74 real sizik = sizi * sizk;
78 constexpr bool DO_G =
false;
79 damp_expl<DO_G>(
scrtyp, s2, ds2, r, sizik, alphai, alphak);
83 switchTaper5<0>(r, cut, off, taper, dtaper);
88 p33i = springi * s2 * pscale;
89 p33k = springk * s2 * pscale;
98#pragma acc loop seq collapse(2)
100 for (
int i = 0; i < 3; ++i) {
101 for (
int j = 0; j < 3; ++j) {
102 ks2i[j][i] = p33i * ai[i] * ai[j];
103 ks2k[j][i] = p33k * ai[i] * ai[j];
114 real sizik = sizi * sizk;
118 constexpr bool DO_G =
true;
119 damp_expl<DO_G>(
scrtyp, s2, ds2, r, sizik, alphai, alphak);
123 switchTaper5<1>(r, cut, off, taper, dtaper);
124 ds2 = ds2 * taper + s2 * dtaper;
127 real s2i = springi * s2 * pscale;
128 real s2k = springk * s2 * pscale;
129 real ds2i = springi * ds2 * pscale;
130 real ds2k = springk * ds2 * pscale;
141 real eps = 0.70710678;
142 if (fabs(dot) > eps) {
147 xr = xr - dot * ai[0][2];
148 yr = yr - dot * ai[1][2];
149 zr = zr - dot * ai[2][2];
150 real dr = REAL_SQRT(xr * xr + yr * yr + zr * zr);
154 ai[0][1] = ai[2][0] * ai[1][2] - ai[1][0] * ai[2][2];
155 ai[1][1] = ai[0][0] * ai[2][2] - ai[2][0] * ai[0][2];
156 ai[2][1] = ai[1][0] * ai[0][2] - ai[0][0] * ai[1][2];
160 real frcil[3], frckl[3];
161 real uixl = uix * ai[0][0] + uiy * ai[1][0] + uiz * ai[2][0];
162 real uiyl = uix * ai[0][1] + uiy * ai[1][1] + uiz * ai[2][1];
163 real uizl = uix * ai[0][2] + uiy * ai[1][2] + uiz * ai[2][2];
164 real ukxl = -(ukx * ai[0][0] + uky * ai[1][0] + ukz * ai[2][0]);
165 real ukyl = ukx * ai[0][1] + uky * ai[1][1] + ukz * ai[2][1];
166 real ukzl = ukx * ai[0][2] + uky * ai[1][2] + ukz * ai[2][2];
167 frcil[2] = uizl * uizl * ds2i;
168 frckl[2] = ukzl * ukzl * ds2k;
170 constexpr real two = 2.;
171 real tqxil = two * uiyl * uizl * s2i;
172 real tqyil = -two * uixl * uizl * s2i;
173 real tqxkl = two * ukyl * ukzl * s2k;
174 real tqykl = -two * ukxl * ukzl * s2k;
176 frcil[0] = -tqyil / r;
177 frcil[1] = tqxil / r;
178 frckl[0] = -tqykl / r;
179 frckl[1] = tqxkl / r;
181 real frcxi = ai[0][0] * frcil[0] + ai[0][1] * frcil[1] + ai[0][2] * frcil[2];
182 real frcyi = ai[1][0] * frcil[0] + ai[1][1] * frcil[1] + ai[1][2] * frcil[2];
183 real frczi = ai[2][0] * frcil[0] + ai[2][1] * frcil[1] + ai[2][2] * frcil[2];
184 real frcxk = ai[0][0] * frckl[0] - ai[0][1] * frckl[1] - ai[0][2] * frckl[2];
185 real frcyk = ai[1][0] * frckl[0] - ai[1][1] * frckl[1] - ai[1][2] * frckl[2];
186 real frczk = ai[2][0] * frckl[0] - ai[2][1] * frckl[1] - ai[2][2] * frckl[2];
187 frc[0] = f * (frcxk - frcxi);
188 frc[1] = f * (frcyk - frcyi);
189 frc[2] = f * (frczk - frczi);
#define SEQ_ROUTINE
Definition: acc/seqdef.h:7
#define SEQ_CUDA
Definition: acc/seqdef.h:12
#define restrict
Definition: macro.h:51
__device__ void fsinhc3(T d, T &__restrict__ f1d, T &__restrict__ f2d, T &__restrict__ f3d)
Definition: sinhc.h:294
float real
Definition: precision.h:80
__device__ void damp_expl(ExpolScr scrtyp, real &__restrict__ s2, real &__restrict__ ds2, real r, real sizik, real alphai, real alphak)
Definition: pair_alterpol.h:11
__device__ void pair_alterpol(ExpolScr scrtyp, real r, real pscale, real cut, real off, real xr, real yr, real zr, real springi, real sizi, real alphai, real springk, real sizk, real alphak, real ks2i[3][3], real ks2k[3][3])
Definition: pair_alterpol.h:70
__device__ void pair_dexpol(ExpolScr scrtyp, real r, real pscale, real cut, real off, real xr, real yr, real zr, real uix, real uiy, real uiz, real ukx, real uky, real ukz, real springi, real sizi, real alphai, real springk, real sizk, real alphak, const real f, real frc[3])
Definition: pair_alterpol.h:109
ExpolScr
Definition: expolscr.h:5