3#include "math/libfunc.h"
6#include <tinker/detail/ktrtor.hh>
12 real d1 = x1u - x1l; \
13 real d2 = x2u - x2l; \
15 real y1[4], y2[4], y12[4]; \
17 y1[0] = d1 * y1i[0]; \
18 y1[1] = d1 * y1i[1]; \
19 y1[2] = d1 * y1i[2]; \
20 y1[3] = d1 * y1i[3]; \
21 y2[0] = d2 * y2i[0]; \
22 y2[1] = d2 * y2i[1]; \
23 y2[2] = d2 * y2i[2]; \
24 y2[3] = d2 * y2i[3]; \
25 y12[0] = d12 * y12i[0]; \
26 y12[1] = d12 * y12i[1]; \
27 y12[2] = d12 * y12i[2]; \
28 y12[3] = d12 * y12i[3]; \
32 c[0][2] = 3 * (y[3] - y[0]) - (2 * y2[0] + y2[3]); \
33 c[0][3] = 2 * (y[0] - y[3]) + y2[0] + y2[3]; \
36 c[1][2] = 3 * (y1[3] - y1[0]) - (2 * y12[0] + y12[3]); \
37 c[1][3] = 2 * (y1[0] - y1[3]) + y12[0] + y12[3]; \
38 c[2][0] = 3 * (y[1] - y[0]) - (2 * y1[0] + y1[1]); \
39 c[2][1] = 3 * (y2[1] - y2[0]) - (2 * y12[0] + y12[1]); \
40 c[2][2] = 9 * (y[0] - y[1] + y[2] - y[3]) + 6 * y1[0] + 3 * y1[1] \
41 - 3 * y1[2] - 6 * y1[3] + 6 * y2[0] - 6 * y2[1] - 3 * y2[2] + 3 * y2[3] \
42 + 4 * y12[0] + 2 * y12[1] + y12[2] + 2 * y12[3]; \
43 c[2][3] = 6 * (y[1] - y[0] + y[3] - y[2]) + -4 * y1[0] - 2 * y1[1] \
44 + 2 * y1[2] + 4 * y1[3] + -3 * y2[0] + 3 * y2[1] + 3 * y2[2] - 3 * y2[3] \
45 - 2 * y12[0] - y12[1] - y12[2] - 2 * y12[3]; \
46 c[3][0] = 2 * (y[0] - y[1]) + y1[0] + y1[1]; \
47 c[3][1] = 2 * (y2[0] - y2[1]) + y12[0] + y12[1]; \
48 c[3][2] = 6 * (y[1] - y[0] + y[3] - y[2]) \
49 + 3 * (y1[2] + y1[3] - y1[0] - y1[1]) \
50 + 2 * (2 * (y2[1] - y2[0]) + y2[2] - y2[3]) + -2 * (y12[0] + y12[1]) \
52 c[3][3] = 4 * (y[0] - y[1] + y[2] - y[3]) \
53 + 2 * (y1[0] + y1[1] - y1[2] - y1[3]) \
54 + 2 * (y2[0] - y2[1] - y2[2] + y2[3]) + y12[0] + y12[1] + y12[2] \
57 real t = (x1 - x1l) * REAL_RECIP(x1u - x1l); \
58 real u = (x2 - x2l) * REAL_RECIP(x2u - x2l)
60#define BCUCOF_ANSY__ \
61 real ay = ((c[3][3] * u + c[3][2]) * u + c[3][1]) * u + c[3][0]; \
62 ay = t * ay + ((c[2][3] * u + c[2][2]) * u + c[2][1]) * u + c[2][0]; \
63 ay = t * ay + ((c[1][3] * u + c[1][2]) * u + c[1][1]) * u + c[1][0]; \
64 ay = t * ay + ((c[0][3] * u + c[0][2]) * u + c[0][1]) * u + c[0][0]
86 real day1 = (3 * c[3][3] * t + 2 * c[2][3]) * t + c[1][3];
87 day1 = u * day1 + (3 * c[3][2] * t + 2 * c[2][2]) * t + c[1][2];
88 day1 = u * day1 + (3 * c[3][1] * t + 2 * c[2][1]) * t + c[1][1];
89 day1 = u * day1 + (3 * c[3][0] * t + 2 * c[2][0]) * t + c[1][0];
90 day1 *= REAL_RECIP(x1u - x1l);
93 real day2 = (3 * c[3][3] * u + 2 * c[3][2]) * u + c[3][1];
94 day2 = t * day2 + (3 * c[2][3] * u + 2 * c[2][2]) * u + c[2][1];
95 day2 = t * day2 + (3 * c[1][3] * u + 2 * c[1][2]) * u + c[1][1];
96 day2 = t * day2 + (3 * c[0][3] * u + 2 * c[0][2]) * u + c[0][1];
97 day2 *= REAL_RECIP(x2u - x2l);
103#pragma acc routine seq
126 constexpr bool do_e = Ver::e;
127 constexpr bool do_g = Ver::g;
128 constexpr bool do_v = Ver::v;
130 if CONSTEXPR (do_v) vxx = 0, vyx = 0, vzx = 0, vyy = 0, vzy = 0, vzz = 0;
132 real ftt[4], ft12[4], ft1[4], ft2[4];
134 int i =
itt[itortor][0];
135 int k =
itt[itortor][1];
136 int ia, ib, ic, id, ie;
140 if (
itt[itortor][2] == 0) {
171 real xba = xib - xia;
172 real yba = yib - yia;
173 real zba = zib - zia;
174 real xcb = xic - xib;
175 real ycb = yic - yib;
176 real zcb = zic - zib;
177 real xdc = xid - xic;
178 real ydc = yid - yic;
179 real zdc = zid - zic;
180 real xed = xie - xid;
181 real yed = yie - yid;
182 real zed = zie - zid;
184 real xt = yba * zcb - ycb * zba;
185 real yt = zba * xcb - zcb * xba;
186 real zt = xba * ycb - xcb * yba;
187 real xu = ycb * zdc - ydc * zcb;
188 real yu = zcb * xdc - zdc * xcb;
189 real zu = xcb * ydc - xdc * ycb;
190 real rt2 = xt * xt + yt * yt + zt * zt;
191 real ru2 = xu * xu + yu * yu + zu * zu;
192 real rtru = REAL_SQRT(rt2 * ru2);
193 real xv = ydc * zed - yed * zdc;
194 real yv = zdc * xed - zed * xdc;
195 real zv = xdc * yed - xed * ydc;
196 real rv2 = xv * xv + yv * yv + zv * zv;
197 real rurv = REAL_SQRT(ru2 * rv2);
199 if (rtru != 0 && rurv != 0) {
202 real rcb = REAL_SQRT(xcb * xcb + ycb * ycb + zcb * zcb);
203 real cosine1 = (xt * xu + yt * yu + zt * zu) * REAL_RECIP(rtru);
204 cosine1 = REAL_MIN((
real)1, REAL_MAX((
real)-1, cosine1));
205 sign = xba * xu + yba * yu + zba * zu;
207 real value1 = angle1;
209 real rdc = REAL_SQRT(xdc * xdc + ydc * ydc + zdc * zdc);
210 real cosine2 = (xu * xv + yu * yv + zu * zv) * REAL_RECIP(rurv);
211 cosine2 = REAL_MIN((
real)1, REAL_MAX((
real)-1, cosine2));
212 sign = xcb * xv + ycb * yv + zcb * zv;
214 real value2 = angle2;
222 real xac =
x[chk_ia] -
x[ic];
223 real yac =
y[chk_ia] -
y[ic];
224 real zac =
z[chk_ia] -
z[ic];
225 real c1 = -ycb * zdc + zcb * ydc;
226 real c2 = ydc * zac - zdc * yac;
227 real c3 = -yac * zcb + zac * ycb;
228 vol = xac * c1 - xcb * c2 + xdc * c3;
235 sign = (vol < 0 ? -1 : 1);
236 value1 = (vol < 0 ? -value1 : value1);
237 value2 = (vol < 0 ? -value2 : value2);
239 if (value1 < -180) value1 += 360;
240 if (value1 >= 180) value1 -= 360;
241 if (value2 < -180) value2 += 360;
242 if (value2 >= 180) value2 -= 360;
249 int xlo = REAL_FLOOR((value1 + 180) * (tnxk - 1) * REAL_RECIP(360));
250 int ylo = REAL_FLOOR((value2 + 180) * (
tny[k] - 1) * REAL_RECIP(360));
256 int pos2 = (ylo + 1) * tnxk + xlo;
257 int pos1 = pos2 - tnxk;
258 ftt[0] =
tbf[k][pos1];
259 ftt[1] =
tbf[k][pos1 + 1];
260 ftt[2] =
tbf[k][pos2 + 1];
261 ftt[3] =
tbf[k][pos2];
262 ft1[0] =
tbx[k][pos1];
263 ft1[1] =
tbx[k][pos1 + 1];
264 ft1[2] =
tbx[k][pos2 + 1];
265 ft1[3] =
tbx[k][pos2];
266 ft2[0] =
tby[k][pos1];
267 ft2[1] =
tby[k][pos1 + 1];
268 ft2[2] =
tby[k][pos2 + 1];
269 ft2[3] =
tby[k][pos2];
270 ft12[0] =
tbxy[k][pos1];
271 ft12[1] =
tbxy[k][pos1 + 1];
272 ft12[2] =
tbxy[k][pos2 + 1];
273 ft12[3] =
tbxy[k][pos2];
275 real dedang1, dedang2;
277 bcuint1(ftt, ft1, ft2, ft12, x1l, x1u, y1l, y1u, value1, value2, e,
280 bcuint0(ftt, ft1, ft2, ft12, x1l, x1u, y1l, y1u, value1, value2, e);
291 real xca = xic - xia;
292 real yca = yic - yia;
293 real zca = zic - zia;
294 real xdb = xid - xib;
295 real ydb = yid - yib;
296 real zdb = zid - zib;
298 real rt2cb_inv = REAL_RECIP(rt2 * rcb);
299 real ru2cb_inv = REAL_RECIP(ru2 * rcb);
300 real dedxt = dedang1 * (yt * zcb - ycb * zt) * rt2cb_inv;
301 real dedyt = dedang1 * (zt * xcb - zcb * xt) * rt2cb_inv;
302 real dedzt = dedang1 * (xt * ycb - xcb * yt) * rt2cb_inv;
303 real dedxu = -dedang1 * (yu * zcb - ycb * zu) * ru2cb_inv;
304 real dedyu = -dedang1 * (zu * xcb - zcb * xu) * ru2cb_inv;
305 real dedzu = -dedang1 * (xu * ycb - xcb * yu) * ru2cb_inv;
309 real dedxia = zcb * dedyt - ycb * dedzt;
310 real dedyia = xcb * dedzt - zcb * dedxt;
311 real dedzia = ycb * dedxt - xcb * dedyt;
312 real dedxib = yca * dedzt - zca * dedyt + zdc * dedyu - ydc * dedzu;
313 real dedyib = zca * dedxt - xca * dedzt + xdc * dedzu - zdc * dedxu;
314 real dedzib = xca * dedyt - yca * dedxt + ydc * dedxu - xdc * dedyu;
315 real dedxic = zba * dedyt - yba * dedzt + ydb * dedzu - zdb * dedyu;
316 real dedyic = xba * dedzt - zba * dedxt + zdb * dedxu - xdb * dedzu;
317 real dedzic = yba * dedxt - xba * dedyt + xdb * dedyu - ydb * dedxu;
318 real dedxid = zcb * dedyu - ycb * dedzu;
319 real dedyid = xcb * dedzu - zcb * dedxu;
320 real dedzid = ycb * dedxu - xcb * dedyu;
324 real xec = xie - xic;
325 real yec = yie - yic;
326 real zec = zie - zic;
328 real ru2dc_inv = REAL_RECIP(ru2 * rdc);
329 real rv2dc_inv = REAL_RECIP(rv2 * rdc);
330 real dedxu2 = dedang2 * (yu * zdc - ydc * zu) * ru2dc_inv;
331 real dedyu2 = dedang2 * (zu * xdc - zdc * xu) * ru2dc_inv;
332 real dedzu2 = dedang2 * (xu * ydc - xdc * yu) * ru2dc_inv;
333 real dedxv2 = -dedang2 * (yv * zdc - ydc * zv) * rv2dc_inv;
334 real dedyv2 = -dedang2 * (zv * xdc - zdc * xv) * rv2dc_inv;
335 real dedzv2 = -dedang2 * (xv * ydc - xdc * yv) * rv2dc_inv;
339 real dedxib2 = zdc * dedyu2 - ydc * dedzu2;
340 real dedyib2 = xdc * dedzu2 - zdc * dedxu2;
341 real dedzib2 = ydc * dedxu2 - xdc * dedyu2;
342 real dedxic2 = ydb * dedzu2 - zdb * dedyu2 + zed * dedyv2
344 real dedyic2 = zdb * dedxu2 - xdb * dedzu2 + xed * dedzv2
346 real dedzic2 = xdb * dedyu2 - ydb * dedxu2 + yed * dedxv2
348 real dedxid2 = zcb * dedyu2 - ycb * dedzu2 + yec * dedzv2
350 real dedyid2 = xcb * dedzu2 - zcb * dedxu2 + zec * dedxv2
352 real dedzid2 = ycb * dedxu2 - xcb * dedyu2 + xec * dedyv2
354 real dedxie2 = zdc * dedyv2 - ydc * dedzv2;
355 real dedyie2 = xdc * dedzv2 - zdc * dedxv2;
356 real dedzie2 = ydc * dedxv2 - xdc * dedyv2;
375 vxx = xcb * (dedxic + dedxid) - xba * dedxia + xdc * dedxid;
376 vyx = ycb * (dedxic + dedxid) - yba * dedxia + ydc * dedxid;
377 vzx = zcb * (dedxic + dedxid) - zba * dedxia + zdc * dedxid;
378 vyy = ycb * (dedyic + dedyid) - yba * dedyia + ydc * dedyid;
379 vzy = zcb * (dedyic + dedyid) - zba * dedyia + zdc * dedyid;
380 vzz = zcb * (dedzic + dedzid) - zba * dedzia + zdc * dedzid;
381 real vxx2 = xdc * (dedxid2 + dedxie2) - xcb * dedxib2
383 real vyx2 = ydc * (dedxid2 + dedxie2) - ycb * dedxib2
385 real vzx2 = zdc * (dedxid2 + dedxie2) - zcb * dedxib2
387 real vyy2 = ydc * (dedyid2 + dedyie2) - ycb * dedyib2
389 real vzy2 = zdc * (dedyid2 + dedyie2) - zcb * dedyib2
391 real vzz2 = zdc * (dedzid2 + dedzie2) - zcb * dedzib2
394 vxx += vxx2, vyx += vyx2, vzx += vzx2, vyy += vyy2, vzy += vzy2,
void atomic_add(T value, T *buffer, size_t offset=0)
Definition: acc/adddef.h:14
#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 * 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.
constexpr real radian
Definition: const.h:14
float real
Definition: precision.h:80
fixed grad_prec
Definition: precision.h:103
real(* tby)[ktrtor::maxtgrd2]
real(* tbxy)[ktrtor::maxtgrd2]
real(* tty)[ktrtor::maxtgrd]
real(* ttx)[ktrtor::maxtgrd]
real(* tbx)[ktrtor::maxtgrd2]
real(* tbf)[ktrtor::maxtgrd2]
__device__ void dk_tortor(real &__restrict__ e, real &__restrict__ vxx, real &__restrict__ vyx, real &__restrict__ vzx, real &__restrict__ vyy, real &__restrict__ vzy, real &__restrict__ vzz, grad_prec *__restrict__ dettx, grad_prec *__restrict__ detty, grad_prec *__restrict__ dettz, real ttorunit, int itortor, const int(*__restrict__ itt)[3], const int(*__restrict__ ibitor)[5], const int *__restrict__ chkttor_ia_, const int *__restrict__ tnx, const int *__restrict__ tny, const real(*__restrict__ ttx)[ktrtor::maxtgrd], const real(*__restrict__ tty)[ktrtor::maxtgrd], const real(*__restrict__ tbf)[ktrtor::maxtgrd2], const real(*__restrict__ tbx)[ktrtor::maxtgrd2], const real(*__restrict__ tby)[ktrtor::maxtgrd2], const real(*__restrict__ tbxy)[ktrtor::maxtgrd2], const real *__restrict__ x, const real *__restrict__ y, const real *__restrict__ z)
Definition: tortor.h:106