2#include "ff/evalence.h"
4#include "math/libfunc.h"
22#pragma acc routine seq
38 constexpr bool do_e = Ver::e;
39 constexpr bool do_g = Ver::g;
40 constexpr bool do_v = Ver::v;
42 if CONSTEXPR (do_v) vxx = 0, vyx = 0, vzx = 0, vyy = 0, vzy = 0, vzz = 0;
45 const int i =
iopb[iopbend];
46 const int ia =
iang[i][0];
47 const int ib =
iang[i][1];
48 const int ic =
iang[i][2];
49 const int id =
iang[i][3];
88 rab2 = xab * xab + yab * yab + zab * zab;
89 rcb2 = xcb * xcb + ycb * ycb + zcb * zcb;
91 - (xab * xcb + yab * ycb + zab * zcb)
92 * (xab * xcb + yab * ycb + zab * zcb);
93 if CONSTEXPR (do_g) dot = xab * xcb + yab * ycb + zab * zcb;
98 rad2 = xad * xad + yad * yad + zad * zad;
99 rcd2 = xcd * xcd + ycd * ycd + zcd * zcd;
101 - (xad * xcd + yad * ycd + zad * zcd)
102 * (xad * xcd + yad * ycd + zad * zcd);
103 if CONSTEXPR (do_g) dot = xad * xcd + yad * ycd + zad * zcd;
108 real ee = xdb * (yab * zcb - zab * ycb) + ydb * (zab * xcb - xab * zcb)
109 + zdb * (xab * ycb - yab * xcb);
110 real rdb2 = xdb * xdb + ydb * ydb + zdb * zdb;
111 rdb2 = REAL_MAX(rdb2, (
real)0.0001);
114 real sine = REAL_ABS(ee) * REAL_RSQRT(cc * rdb2);
115 sine = REAL_MIN((
real)1, sine);
120 real dt4 = dt2 * dt2;
130 real dedcos = -deddt * REAL_SIGN((
real)1, ee)
131 * REAL_RSQRT(cc * rdb2 - ee * ee);
132 real term = ee * REAL_RECIP(cc);
133 real dccdxia, dccdyia, dccdzia;
134 real dccdxic, dccdyic, dccdzic;
135 real dccdxid, dccdyid, dccdzid;
137 dccdxia = (xab * rcb2 - xcb * dot) * term;
138 dccdyia = (yab * rcb2 - ycb * dot) * term;
139 dccdzia = (zab * rcb2 - zcb * dot) * term;
140 dccdxic = (xcb * rab2 - xab * dot) * term;
141 dccdyic = (ycb * rab2 - yab * dot) * term;
142 dccdzic = (zcb * rab2 - zab * dot) * term;
147 dccdxia = (xad * rcd2 - xcd * dot) * term;
148 dccdyia = (yad * rcd2 - ycd * dot) * term;
149 dccdzia = (zad * rcd2 - zcd * dot) * term;
150 dccdxic = (xcd * rad2 - xad * dot) * term;
151 dccdyic = (ycd * rad2 - yad * dot) * term;
152 dccdzic = (zcd * rad2 - zad * dot) * term;
153 dccdxid = -dccdxia - dccdxic;
154 dccdyid = -dccdyia - dccdyic;
155 dccdzid = -dccdzia - dccdzic;
158 term = ee * REAL_RECIP(rdb2);
159 real deedxia = ydb * zcb - zdb * ycb;
160 real deedyia = zdb * xcb - xdb * zcb;
161 real deedzia = xdb * ycb - ydb * xcb;
162 real deedxic = yab * zdb - zab * ydb;
163 real deedyic = zab * xdb - xab * zdb;
164 real deedzic = xab * ydb - yab * xdb;
165 real deedxid = ycb * zab - zcb * yab + xdb * term;
166 real deedyid = zcb * xab - xcb * zab + ydb * term;
167 real deedzid = xcb * yab - ycb * xab + zdb * term;
171 real dedxia = dedcos * (dccdxia + deedxia);
172 real dedyia = dedcos * (dccdyia + deedyia);
173 real dedzia = dedcos * (dccdzia + deedzia);
174 real dedxic = dedcos * (dccdxic + deedxic);
175 real dedyic = dedcos * (dccdyic + deedyic);
176 real dedzic = dedcos * (dccdzic + deedzic);
177 real dedxid = dedcos * (dccdxid + deedxid);
178 real dedyid = dedcos * (dccdyid + deedyid);
179 real dedzid = dedcos * (dccdzid + deedzid);
180 real dedxib = -dedxia - dedxic - dedxid;
181 real dedyib = -dedyia - dedyic - dedyid;
182 real dedzib = -dedzia - dedzic - dedzid;
198 vxx = xab * dedxia + xcb * dedxic + xdb * dedxid;
199 vyx = yab * dedxia + ycb * dedxic + ydb * dedxid;
200 vzx = zab * dedxia + zcb * dedxic + zdb * dedxid;
201 vyy = yab * dedyia + ycb * dedyic + ydb * dedyid;
202 vzy = zab * dedyia + zcb * dedyic + zdb * dedyid;
203 vzz = zab * dedzia + zcb * dedzic + zdb * 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
OPBend
Definition: evalence.h:76
#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
__device__ void dk_opbend(real &__restrict__ e, real &__restrict__ vxx, real &__restrict__ vyx, real &__restrict__ vzx, real &__restrict__ vyy, real &__restrict__ vzy, real &__restrict__ vzz, grad_prec *__restrict__ deopbx, grad_prec *__restrict__ deopby, grad_prec *__restrict__ deopbz, OPBend opbtyp, real opbunit, int iopbend, const int *__restrict__ iopb, const real *__restrict__ opbk, const int(*__restrict__ iang)[4], real copb, real qopb, real popb, real sopb, const real *__restrict__ x, const real *__restrict__ y, const real *__restrict__ z)
Definition: opbend.h:25