2#include "math/libfunc.h"
26 constexpr bool do_e = Ver::e;
27 constexpr bool do_g = Ver::g;
28 constexpr bool do_v = Ver::v;
30 if CONSTEXPR (do_v) vxx = 0, vyx = 0, vzx = 0, vyy = 0, vzy = 0, vzz = 0;
32 const int i =
ist[istrtor][0];
33 const int ia =
itors[i][0];
34 const int ib =
itors[i][1];
35 const int ic =
itors[i][2];
36 const int id =
itors[i][3];
60 real rba = REAL_SQRT(xba * xba + yba * yba + zba * zba);
61 real rcb = REAL_SQRT(xcb * xcb + ycb * ycb + zcb * zcb);
62 real rdc = REAL_SQRT(xdc * xdc + ydc * ydc + zdc * zdc);
63 real rmin = REAL_MIN(rba, rcb);
64 rmin = REAL_MIN(rmin, rdc);
65 if (rmin == 0)
return;
67 real xt = yba * zcb - ycb * zba;
68 real yt = zba * xcb - zcb * xba;
69 real zt = xba * ycb - xcb * yba;
70 real xu = ycb * zdc - ydc * zcb;
71 real yu = zcb * xdc - zdc * xcb;
72 real zu = xcb * ydc - xdc * ycb;
73 real xtu = yt * zu - yu * zt;
74 real ytu = zt * xu - zu * xt;
75 real ztu = xt * yu - xu * yt;
76 real rt2 = xt * xt + yt * yt + zt * zt;
77 rt2 = REAL_MAX(rt2, (
real)0.000001);
78 real ru2 = xu * xu + yu * yu + zu * zu;
79 ru2 = REAL_MAX(ru2, (
real)0.000001);
80 real rtru = REAL_SQRT(rt2 * ru2);
89 real cosine = (xt * xu + yt * yu + zt * zu) * REAL_RECIP(rtru);
90 real sine = (xcb * xtu + ycb * ytu + zcb * ztu) * REAL_RECIP(rcb * rtru);
98 real cosine2 = cosine * cosine - sine * sine;
99 real sine2 = 2 * cosine * sine;
100 real cosine3 = cosine * cosine2 - sine * sine2;
101 real sine3 = cosine * sine2 + sine * cosine2;
102 real phi1 = 1 + (cosine * c1 + sine * s1);
103 real phi2 = 1 + (cosine2 * c2 + sine2 * s2);
104 real phi3 = 1 + (cosine3 * c3 + sine3 * s3);
106 real dphi1, dphi2, dphi3;
108 dphi1 = cosine * s1 - sine * c1;
109 dphi2 = 2 * (cosine2 * s2 - sine2 * c2);
110 dphi3 = 3 * (cosine3 * s3 - sine3 * c3);
114 real v1, v2, v3, dr, e1, e2, e3;
120 v1 =
kst[istrtor][0];
121 v2 =
kst[istrtor][1];
122 v3 =
kst[istrtor][2];
125 e1 =
storunit * dr * (v1 * phi1 + v2 * phi2 + v3 * phi3);
127 real dedphi =
storunit * dr * (v1 * dphi1 + v2 * dphi2 + v3 * dphi3);
128 real ddr =
storunit * (v1 * phi1 + v2 * phi2 + v3 * phi3) / rba;
129 real ddrdx = xba * ddr;
130 real ddrdy = yba * ddr;
131 real ddrdz = zba * ddr;
132 real dedxt = dedphi * (yt * zcb - ycb * zt) / (rt2 * rcb);
133 real dedyt = dedphi * (zt * xcb - zcb * xt) / (rt2 * rcb);
134 real dedzt = dedphi * (xt * ycb - xcb * yt) / (rt2 * rcb);
135 real dedxu = -dedphi * (yu * zcb - ycb * zu) / (ru2 * rcb);
136 real dedyu = -dedphi * (zu * xcb - zcb * xu) / (ru2 * rcb);
137 real dedzu = -dedphi * (xu * ycb - xcb * yu) / (ru2 * rcb);
139 dedxia = zcb * dedyt - ycb * dedzt - ddrdx;
140 dedyia = xcb * dedzt - zcb * dedxt - ddrdy;
141 dedzia = ycb * dedxt - xcb * dedyt - ddrdz;
142 dedxib = yca * dedzt - zca * dedyt + zdc * dedyu - ydc * dedzu + ddrdx;
143 dedyib = zca * dedxt - xca * dedzt + xdc * dedzu - zdc * dedxu + ddrdy;
144 dedzib = xca * dedyt - yca * dedxt + ydc * dedxu - xdc * dedyu + ddrdz;
145 dedxic = zba * dedyt - yba * dedzt + ydb * dedzu - zdb * dedyu;
146 dedyic = xba * dedzt - zba * dedxt + zdb * dedxu - xdb * dedzu;
147 dedzic = yba * dedxt - xba * dedyt + xdb * dedyu - ydb * dedxu;
148 dedxid = zcb * dedyu - ycb * dedzu;
149 dedyid = xcb * dedzu - zcb * dedxu;
150 dedzid = ycb * dedxu - xcb * dedyu;
153 v1 =
kst[istrtor][3];
154 v2 =
kst[istrtor][4];
155 v3 =
kst[istrtor][5];
158 e2 =
storunit * dr * (v1 * phi1 + v2 * phi2 + v3 * phi3);
160 real dedphi =
storunit * dr * (v1 * dphi1 + v2 * dphi2 + v3 * dphi3);
161 real ddr =
storunit * (v1 * phi1 + v2 * phi2 + v3 * phi3) / rcb;
162 real ddrdx = xcb * ddr;
163 real ddrdy = ycb * ddr;
164 real ddrdz = zcb * ddr;
165 real dedxt = dedphi * (yt * zcb - ycb * zt) / (rt2 * rcb);
166 real dedyt = dedphi * (zt * xcb - zcb * xt) / (rt2 * rcb);
167 real dedzt = dedphi * (xt * ycb - xcb * yt) / (rt2 * rcb);
168 real dedxu = -dedphi * (yu * zcb - ycb * zu) / (ru2 * rcb);
169 real dedyu = -dedphi * (zu * xcb - zcb * xu) / (ru2 * rcb);
170 real dedzu = -dedphi * (xu * ycb - xcb * yu) / (ru2 * rcb);
172 dedxia += zcb * dedyt - ycb * dedzt;
173 dedyia += xcb * dedzt - zcb * dedxt;
174 dedzia += ycb * dedxt - xcb * dedyt;
175 dedxib += yca * dedzt - zca * dedyt + zdc * dedyu - ydc * dedzu - ddrdx;
176 dedyib += zca * dedxt - xca * dedzt + xdc * dedzu - zdc * dedxu - ddrdy;
177 dedzib += xca * dedyt - yca * dedxt + ydc * dedxu - xdc * dedyu - ddrdz;
178 dedxic += zba * dedyt - yba * dedzt + ydb * dedzu - zdb * dedyu + ddrdx;
179 dedyic += xba * dedzt - zba * dedxt + zdb * dedxu - xdb * dedzu + ddrdy;
180 dedzic += yba * dedxt - xba * dedyt + xdb * dedyu - ydb * dedxu + ddrdz;
181 dedxid += zcb * dedyu - ycb * dedzu;
182 dedyid += xcb * dedzu - zcb * dedxu;
183 dedzid += ycb * dedxu - xcb * dedyu;
186 v1 =
kst[istrtor][6];
187 v2 =
kst[istrtor][7];
188 v3 =
kst[istrtor][8];
191 e3 =
storunit * dr * (v1 * phi1 + v2 * phi2 + v3 * phi3);
193 real dedphi =
storunit * dr * (v1 * dphi1 + v2 * dphi2 + v3 * dphi3);
194 real ddr =
storunit * (v1 * phi1 + v2 * phi2 + v3 * phi3) / rdc;
195 real ddrdx = xdc * ddr;
196 real ddrdy = ydc * ddr;
197 real ddrdz = zdc * ddr;
198 real dedxt = dedphi * (yt * zcb - ycb * zt) / (rt2 * rcb);
199 real dedyt = dedphi * (zt * xcb - zcb * xt) / (rt2 * rcb);
200 real dedzt = dedphi * (xt * ycb - xcb * yt) / (rt2 * rcb);
201 real dedxu = -dedphi * (yu * zcb - ycb * zu) / (ru2 * rcb);
202 real dedyu = -dedphi * (zu * xcb - zcb * xu) / (ru2 * rcb);
203 real dedzu = -dedphi * (xu * ycb - xcb * yu) / (ru2 * rcb);
205 dedxia += zcb * dedyt - ycb * dedzt;
206 dedyia += xcb * dedzt - zcb * dedxt;
207 dedzia += ycb * dedxt - xcb * dedyt;
208 dedxib += yca * dedzt - zca * dedyt + zdc * dedyu - ydc * dedzu;
209 dedyib += zca * dedxt - xca * dedzt + xdc * dedzu - zdc * dedxu;
210 dedzib += xca * dedyt - yca * dedxt + ydc * dedxu - xdc * dedyu;
211 dedxic += zba * dedyt - yba * dedzt + ydb * dedzu - zdb * dedyu - ddrdx;
212 dedyic += xba * dedzt - zba * dedxt + zdb * dedxu - xdb * dedzu - ddrdy;
213 dedzic += yba * dedxt - xba * dedyt + xdb * dedyu - ydb * dedxu - ddrdz;
214 dedxid += zcb * dedyu - ycb * dedzu + ddrdx;
215 dedyid += xcb * dedzu - zcb * dedxu + ddrdy;
216 dedzid += ycb * dedxu - xcb * dedyu + ddrdz;
234 vxx = xcb * (dedxic + dedxid) - xba * dedxia + xdc * dedxid;
235 vyx = ycb * (dedxic + dedxid) - yba * dedxia + ydc * dedxid;
236 vzx = zcb * (dedxic + dedxid) - zba * dedxia + zdc * dedxid;
237 vyy = ycb * (dedyic + dedyid) - yba * dedyia + ydc * dedyid;
238 vzy = zcb * (dedyic + dedyid) - zba * dedyia + zdc * dedyid;
239 vzz = zcb * (dedzic + dedzid) - zba * dedzia + zdc * dedzid;
void atomic_add(T value, T *buffer, size_t offset=0)
Definition: acc/adddef.h:14
#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 * z
Current coordinates used in energy evaluation and neighbor lists.
real * x
Number of the trajectory frames.
real * y
Current coordinates used in energy evaluation and neighbor lists.
float real
Definition: precision.h:80
fixed grad_prec
Definition: precision.h:103
__device__ void dk_strtor(real &__restrict__ e, real &__restrict__ vxx, real &__restrict__ vyx, real &__restrict__ vzx, real &__restrict__ vyy, real &__restrict__ vzy, real &__restrict__ vzz, grad_prec *__restrict__ debtx, grad_prec *__restrict__ debty, grad_prec *__restrict__ debtz, real storunit, int istrtor, const int(*__restrict__ ist)[4], const real(*__restrict__ kst)[9], const real *__restrict__ bl, const int(*__restrict__ itors)[4], const real(*__restrict__ tors1)[4], const real(*__restrict__ tors2)[4], const real(*__restrict__ tors3)[4], const real *__restrict__ x, const real *__restrict__ y, const real *__restrict__ z)
Definition: strtor.h:10