2#include "ff/evalence.h"
4#include "math/libfunc.h"
26#pragma acc routine seq
43 constexpr bool do_e = Ver::e;
44 constexpr bool do_g = Ver::g;
45 constexpr bool do_v = Ver::v;
47 if CONSTEXPR (do_v) vxx = 0, vyx = 0, vzx = 0, vyy = 0, vzy = 0, vzz = 0;
75 real rab2 = xab * xab + yab * yab + zab * zab;
76 real rcb2 = xcb * xcb + ycb * ycb + zcb * zcb;
78 if (rab2 != 0 && rcb2 != 0) {
79 real xp = ycb * zab - zcb * yab;
80 real yp = zcb * xab - xcb * zab;
81 real zp = xcb * yab - ycb * xab;
82 real rp = REAL_SQRT(xp * xp + yp * yp + zp * zp);
83 rp = REAL_MAX(rp, (
real)0.0001);
84 real dot = xab * xcb + yab * ycb + zab * zcb;
85 real cosine = dot * REAL_RSQRT(rab2 * rcb2);
86 cosine = REAL_MIN((
real)1, REAL_MAX((
real)-1, cosine));
91 real dt = angle - ideal;
104 real sine = REAL_SQRT(1 - cosine * cosine);
105 if CONSTEXPR (do_e) e = factor * force * (1 + cosine);
106 if CONSTEXPR (do_g) deddt = -factor * force * sine;
112 real cosine = REAL_COS(dt);
113 e = factor * force * (1 + cosine);
116 real sine = REAL_SIN(dt);
117 deddt = -factor * force * fold * sine;
122 real terma = -deddt * REAL_RECIP(rab2 * rp);
123 real termc = deddt * REAL_RECIP(rcb2 * rp);
124 real dedxia = terma * (yab * zp - zab * yp);
125 real dedyia = terma * (zab * xp - xab * zp);
126 real dedzia = terma * (xab * yp - yab * xp);
127 real dedxic = termc * (ycb * zp - zcb * yp);
128 real dedyic = termc * (zcb * xp - xcb * zp);
129 real dedzic = termc * (xcb * yp - ycb * xp);
130 real dedxib = -dedxia - dedxic;
131 real dedyib = -dedyia - dedyic;
132 real dedzib = -dedzia - dedzic;
145 vxx = xab * dedxia + xcb * dedxic;
146 vyx = yab * dedxia + ycb * dedxic;
147 vzx = zab * dedxia + zcb * dedxic;
148 vyy = yab * dedyia + ycb * dedyic;
149 vzy = zab * dedyia + zcb * dedyic;
150 vzz = zab * dedzia + zcb * dedzic;
158 real xad = xia - xid;
159 real yad = yia - yid;
160 real zad = zia - zid;
161 real xbd = xib - xid;
162 real ybd = yib - yid;
163 real zbd = zib - zid;
164 real xcd = xic - xid;
165 real ycd = yic - yid;
166 real zcd = zic - zid;
167 real xt = yad * zcd - zad * ycd;
168 real yt = zad * xcd - xad * zcd;
169 real zt = xad * ycd - yad * xcd;
170 real rt2 = xt * xt + yt * yt + zt * zt;
171 real delta = -(xt * xbd + yt * ybd + zt * zbd) * REAL_RECIP(rt2);
172 real xap = xia - xib - xt * delta;
173 real yap = yia - yib - yt * delta;
174 real zap = zia - zib - zt * delta;
175 real xcp = xic - xib - xt * delta;
176 real ycp = yic - yib - yt * delta;
177 real zcp = zic - zib - zt * delta;
178 real rap2 = xap * xap + yap * yap + zap * zap;
179 real rcp2 = xcp * xcp + ycp * ycp + zcp * zcp;
180 if (rap2 != 0 && rcp2 != 0) {
181 real dot = xap * xcp + yap * ycp + zap * zcp;
182 real cosine = dot * REAL_RSQRT(rap2 * rcp2);
183 cosine = REAL_MIN((
real)1, REAL_MAX((
real)-1, cosine));
185 real dt = angle - ideal;
188 real dt4 = dt2 * dt2;
199 real xm = ycp * zap - zcp * yap;
200 real ym = zcp * xap - xcp * zap;
201 real zm = xcp * yap - ycp * xap;
202 real rm = REAL_SQRT(xm * xm + ym * ym + zm * zm);
203 rm = REAL_MAX(rm, (
real)0.0001);
207 real terma = -deddt * REAL_RECIP(rap2 * rm);
208 real termc = deddt * REAL_RECIP(rcp2 * rm);
209 real dedxia = terma * (yap * zm - zap * ym);
210 real dedyia = terma * (zap * xm - xap * zm);
211 real dedzia = terma * (xap * ym - yap * xm);
212 real dedxic = termc * (ycp * zm - zcp * ym);
213 real dedyic = termc * (zcp * xm - xcp * zm);
214 real dedzic = termc * (xcp * ym - ycp * xm);
215 real dedxip = -dedxia - dedxic;
216 real dedyip = -dedyia - dedyic;
217 real dedzip = -dedzia - dedzic;
223 real ptrt2 = (dedxip * xt + dedyip * yt + dedzip * zt)
225 term = (zcd * ybd - ycd * zbd) + delta2 * (yt * zcd - zt * ycd);
226 real dpdxia = delta * (ycd * dedzip - zcd * dedyip) + term * ptrt2;
227 term = (xcd * zbd - zcd * xbd) + delta2 * (zt * xcd - xt * zcd);
228 real dpdyia = delta * (zcd * dedxip - xcd * dedzip) + term * ptrt2;
229 term = (ycd * xbd - xcd * ybd) + delta2 * (xt * ycd - yt * xcd);
230 real dpdzia = delta * (xcd * dedyip - ycd * dedxip) + term * ptrt2;
231 term = (yad * zbd - zad * ybd) + delta2 * (zt * yad - yt * zad);
232 real dpdxic = delta * (zad * dedyip - yad * dedzip) + term * ptrt2;
233 term = (zad * xbd - xad * zbd) + delta2 * (xt * zad - zt * xad);
234 real dpdyic = delta * (xad * dedzip - zad * dedxip) + term * ptrt2;
235 term = (xad * ybd - yad * xbd) + delta2 * (yt * xad - xt * yad);
236 real dpdzic = delta * (yad * dedxip - xad * dedyip) + term * ptrt2;
240 dedxia = dedxia + dpdxia;
241 dedyia = dedyia + dpdyia;
242 dedzia = dedzia + dpdzia;
243 real dedxib = dedxip;
244 real dedyib = dedyip;
245 real dedzib = dedzip;
246 dedxic = dedxic + dpdxic;
247 dedyic = dedyic + dpdyic;
248 dedzic = dedzic + dpdzic;
249 real dedxid = -dedxia - dedxib - dedxic;
250 real dedyid = -dedyia - dedyib - dedyic;
251 real dedzid = -dedzia - dedzib - dedzic;
267 vxx = xad * dedxia + xbd * dedxib + xcd * dedxic;
268 vyx = yad * dedxia + ybd * dedxib + ycd * dedxic;
269 vzx = zad * dedxia + zbd * dedxib + zcd * dedxic;
270 vyy = yad * dedyia + ybd * dedyib + ycd * dedyic;
271 vzy = zad * dedyia + zbd * dedyib + zcd * dedyic;
272 vzz = zad * dedzia + zbd * dedzib + zcd * dedzic;
void atomic_add(T value, T *buffer, size_t offset=0)
Definition: acc/adddef.h:14
#define SEQ_CUDA
Definition: acc/seqdef.h:12
Angle
Definition: evalence.h:68
#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 _1radian
Definition: const.h:17
constexpr real radian
Definition: const.h:14
float real
Definition: precision.h:80
fixed grad_prec
Definition: precision.h:103
__device__ void dk_angle(real &__restrict__ e, real &__restrict__ vxx, real &__restrict__ vyx, real &__restrict__ vzx, real &__restrict__ vyy, real &__restrict__ vzy, real &__restrict__ vzz, grad_prec *__restrict__ deax, grad_prec *__restrict__ deay, grad_prec *__restrict__ deaz, const Angle *__restrict__ angtyp, real angunit, int i, const int(*__restrict__ iang)[4], const real *__restrict__ anat, const real *__restrict__ ak, const real *__restrict__ afld, real cang, real qang, real pang, real sang, const real *__restrict__ x, const real *__restrict__ y, const real *__restrict__ z)
Definition: angle.h:29