Tinker9 70bd052 (Thu Nov 9 12:11:35 2023 -0800)
Loading...
Searching...
No Matches
strtor.h
1#pragma once
2#include "math/libfunc.h"
3#include "seq/add.h"
4#include "seq/seq.h"
5
6namespace tinker {
7#pragma acc routine seq
8template <class Ver>
11 real& restrict vzx, real& restrict vyy, real& restrict vzy,
12 real& restrict vzz,
13
16
17 real storunit, int istrtor, const int (*restrict ist)[4],
18 const real (*restrict kst)[9],
19
20 const real* restrict bl, const int (*restrict itors)[4],
21 const real (*restrict tors1)[4], const real (*restrict tors2)[4],
22 const real (*restrict tors3)[4],
23
24 const real* restrict x, const real* restrict y, const real* restrict z)
25{
26 constexpr bool do_e = Ver::e;
27 constexpr bool do_g = Ver::g;
28 constexpr bool do_v = Ver::v;
29 if CONSTEXPR (do_e) e = 0;
30 if CONSTEXPR (do_v) vxx = 0, vyx = 0, vzx = 0, vyy = 0, vzy = 0, vzz = 0;
31
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];
37
38 real xia = x[ia];
39 real yia = y[ia];
40 real zia = z[ia];
41 real xib = x[ib];
42 real yib = y[ib];
43 real zib = z[ib];
44 real xic = x[ic];
45 real yic = y[ic];
46 real zic = z[ic];
47 real xid = x[id];
48 real yid = y[id];
49 real zid = z[id];
50 real xba = xib - xia;
51 real yba = yib - yia;
52 real zba = zib - zia;
53 real xcb = xic - xib;
54 real ycb = yic - yib;
55 real zcb = zic - zib;
56 real xdc = xid - xic;
57 real ydc = yid - yic;
58 real zdc = zid - zic;
59
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;
66
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);
81
82 real xca = xic - xia;
83 real yca = yic - yia;
84 real zca = zic - zia;
85 real xdb = xid - xib;
86 real ydb = yid - yib;
87 real zdb = zid - zib;
88
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);
91
92 real c1 = tors1[i][2];
93 real s1 = tors1[i][3];
94 real c2 = tors2[i][2];
95 real s2 = tors2[i][3];
96 real c3 = tors3[i][2];
97 real s3 = tors3[i][3];
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);
105
106 real dphi1, dphi2, dphi3;
107 if CONSTEXPR (do_g) {
108 dphi1 = cosine * s1 - sine * c1;
109 dphi2 = 2 * (cosine2 * s2 - sine2 * c2);
110 dphi3 = 3 * (cosine3 * s3 - sine3 * c3);
111 }
112
113 int k;
114 real v1, v2, v3, dr, e1, e2, e3;
115 MAYBE_UNUSED real dedxia, dedyia, dedzia;
116 MAYBE_UNUSED real dedxib, dedyib, dedzib;
117 MAYBE_UNUSED real dedxic, dedyic, dedzic;
118 MAYBE_UNUSED real dedxid, dedyid, dedzid;
119
120 v1 = kst[istrtor][0];
121 v2 = kst[istrtor][1];
122 v3 = kst[istrtor][2];
123 k = ist[istrtor][1];
124 dr = rba - bl[k];
125 e1 = storunit * dr * (v1 * phi1 + v2 * phi2 + v3 * phi3);
126 if CONSTEXPR (do_g) {
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);
138
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;
151 }
152
153 v1 = kst[istrtor][3];
154 v2 = kst[istrtor][4];
155 v3 = kst[istrtor][5];
156 k = ist[istrtor][2];
157 dr = rcb - bl[k];
158 e2 = storunit * dr * (v1 * phi1 + v2 * phi2 + v3 * phi3);
159 if CONSTEXPR (do_g) {
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);
171
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;
184 }
185
186 v1 = kst[istrtor][6];
187 v2 = kst[istrtor][7];
188 v3 = kst[istrtor][8];
189 k = ist[istrtor][3];
190 dr = rdc - bl[k];
191 e3 = storunit * dr * (v1 * phi1 + v2 * phi2 + v3 * phi3);
192 if CONSTEXPR (do_g) {
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);
204
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;
217 }
218
219 if CONSTEXPR (do_e) e = e1 + e2 + e3;
220 if CONSTEXPR (do_g) {
221 atomic_add(dedxia, debtx, ia);
222 atomic_add(dedyia, debty, ia);
223 atomic_add(dedzia, debtz, ia);
224 atomic_add(dedxib, debtx, ib);
225 atomic_add(dedyib, debty, ib);
226 atomic_add(dedzib, debtz, ib);
227 atomic_add(dedxic, debtx, ic);
228 atomic_add(dedyic, debty, ic);
229 atomic_add(dedzic, debtz, ic);
230 atomic_add(dedxid, debtx, id);
231 atomic_add(dedyid, debty, id);
232 atomic_add(dedzid, debtz, id);
233 if CONSTEXPR (do_v) {
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;
240 }
241 }
242}
243}
void atomic_add(T value, T *buffer, size_t offset=0)
Definition: acc/adddef.h:14
#define SEQ_CUDA
Definition: acc/seqdef.h:12
real * bl
#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
real(* kst)[9]
int(* itors)[4]
real(* tors2)[4]
real(* tors1)[4]
grad_prec * debtx
real(* tors3)[4]
int(* ist)[4]
real storunit
grad_prec * debty
grad_prec * debtz
Definition: testrt.h:9
__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