Tinker9 70bd052 (Thu Nov 9 12:11:35 2023 -0800)
Loading...
Searching...
No Matches
imptor.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 itorunit, int i, const int (*restrict iitors)[4],
18 const real (*restrict itors1)[4], const real (*restrict itors2)[4],
19 const real (*restrict itors3)[4],
20
21 const real* restrict x, const real* restrict y, const real* restrict z)
22{
23 constexpr bool do_e = Ver::e;
24 constexpr bool do_g = Ver::g;
25 constexpr bool do_v = Ver::v;
26 if CONSTEXPR (do_e) e = 0;
27 if CONSTEXPR (do_v) vxx = 0, vyx = 0, vzx = 0, vyy = 0, vzy = 0, vzz = 0;
28
29 const int ia = iitors[i][0];
30 const int ib = iitors[i][1];
31 const int ic = iitors[i][2];
32 const int id = iitors[i][3];
33
34 real xia = x[ia];
35 real yia = y[ia];
36 real zia = z[ia];
37 real xib = x[ib];
38 real yib = y[ib];
39 real zib = z[ib];
40 real xic = x[ic];
41 real yic = y[ic];
42 real zic = z[ic];
43 real xid = x[id];
44 real yid = y[id];
45 real zid = z[id];
46 real xba = xib - xia;
47 real yba = yib - yia;
48 real zba = zib - zia;
49 real xcb = xic - xib;
50 real ycb = yic - yib;
51 real zcb = zic - zib;
52 real xdc = xid - xic;
53 real ydc = yid - yic;
54 real zdc = zid - zic;
55
56 real xt = yba * zcb - ycb * zba;
57 real yt = zba * xcb - zcb * xba;
58 real zt = xba * ycb - xcb * yba;
59 real xu = ycb * zdc - ydc * zcb;
60 real yu = zcb * xdc - zdc * xcb;
61 real zu = xcb * ydc - xdc * ycb;
62 real xtu = yt * zu - yu * zt;
63 real ytu = zt * xu - zu * xt;
64 real ztu = xt * yu - xu * yt;
65 real rt2 = xt * xt + yt * yt + zt * zt;
66 real ru2 = xu * xu + yu * yu + zu * zu;
67 real rtru = REAL_SQRT(rt2 * ru2);
68
69 if (rtru != 0) {
70 real rcb = REAL_SQRT(xcb * xcb + ycb * ycb + zcb * zcb);
71 real cosine = (xt * xu + yt * yu + zt * zu) * REAL_RECIP(rtru);
72 real sine = (xcb * xtu + ycb * ytu + zcb * ztu) * REAL_RECIP(rcb * rtru);
73
74 real v1 = itors1[i][0];
75 real c1 = itors1[i][2];
76 real s1 = itors1[i][3];
77 real v2 = itors2[i][0];
78 real c2 = itors2[i][2];
79 real s2 = itors2[i][3];
80 real v3 = itors3[i][0];
81 real c3 = itors3[i][2];
82 real s3 = itors3[i][3];
83
84 real cosine2 = cosine * cosine - sine * sine;
85 real sine2 = 2 * cosine * sine;
86 real cosine3 = cosine * cosine2 - sine * sine2;
87 real sine3 = cosine * sine2 + sine * cosine2;
88 real phi1 = 1 + (cosine * c1 + sine * s1);
89 real phi2 = 1 + (cosine2 * c2 + sine2 * s2);
90 real phi3 = 1 + (cosine3 * c3 + sine3 * s3);
91
92 if CONSTEXPR (do_e) {
93 e = itorunit * (v1 * phi1 + v2 * phi2 + v3 * phi3);
94 }
95
96 if CONSTEXPR (do_g) {
97 real dphi1 = (cosine * s1 - sine * c1);
98 real dphi2 = 2 * (cosine2 * s2 - sine2 * c2);
99 real dphi3 = 3 * (cosine3 * s3 - sine3 * c3);
100 real dedphi = itorunit * (v1 * dphi1 + v2 * dphi2 + v3 * dphi3);
101
102 real xca = xic - xia;
103 real yca = yic - yia;
104 real zca = zic - zia;
105 real xdb = xid - xib;
106 real ydb = yid - yib;
107 real zdb = zid - zib;
108
109 real inv1 = REAL_RECIP(rt2 * rcb);
110 real inv2 = REAL_RECIP(ru2 * rcb);
111 real dedxt = dedphi * (yt * zcb - ycb * zt) * inv1;
112 real dedyt = dedphi * (zt * xcb - zcb * xt) * inv1;
113 real dedzt = dedphi * (xt * ycb - xcb * yt) * inv1;
114 real dedxu = -dedphi * (yu * zcb - ycb * zu) * inv2;
115 real dedyu = -dedphi * (zu * xcb - zcb * xu) * inv2;
116 real dedzu = -dedphi * (xu * ycb - xcb * yu) * inv2;
117
118 real dedxia = zcb * dedyt - ycb * dedzt;
119 real dedyia = xcb * dedzt - zcb * dedxt;
120 real dedzia = ycb * dedxt - xcb * dedyt;
121 real dedxib = yca * dedzt - zca * dedyt + zdc * dedyu - ydc * dedzu;
122 real dedyib = zca * dedxt - xca * dedzt + xdc * dedzu - zdc * dedxu;
123 real dedzib = xca * dedyt - yca * dedxt + ydc * dedxu - xdc * dedyu;
124 real dedxic = zba * dedyt - yba * dedzt + ydb * dedzu - zdb * dedyu;
125 real dedyic = xba * dedzt - zba * dedxt + zdb * dedxu - xdb * dedzu;
126 real dedzic = yba * dedxt - xba * dedyt + xdb * dedyu - ydb * dedxu;
127 real dedxid = zcb * dedyu - ycb * dedzu;
128 real dedyid = xcb * dedzu - zcb * dedxu;
129 real dedzid = ycb * dedxu - xcb * dedyu;
130
131 atomic_add(dedxia, deitx, ia);
132 atomic_add(dedyia, deity, ia);
133 atomic_add(dedzia, deitz, ia);
134 atomic_add(dedxib, deitx, ib);
135 atomic_add(dedyib, deity, ib);
136 atomic_add(dedzib, deitz, ib);
137 atomic_add(dedxic, deitx, ic);
138 atomic_add(dedyic, deity, ic);
139 atomic_add(dedzic, deitz, ic);
140 atomic_add(dedxid, deitx, id);
141 atomic_add(dedyid, deity, id);
142 atomic_add(dedzid, deitz, id);
143
144 if CONSTEXPR (do_v) {
145 vxx = xcb * (dedxic + dedxid) - xba * dedxia + xdc * dedxid;
146 vyx = ycb * (dedxic + dedxid) - yba * dedxia + ydc * dedxid;
147 vzx = zcb * (dedxic + dedxid) - zba * dedxia + zdc * dedxid;
148 vyy = ycb * (dedyic + dedyid) - yba * dedyia + ydc * dedyid;
149 vzy = zcb * (dedyic + dedyid) - zba * dedyia + zdc * dedyid;
150 vzz = zcb * (dedzic + dedzid) - zba * dedzia + zdc * dedzid;
151 }
152 }
153 }
154}
155}
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 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(* itors1)[4]
int(* iitors)[4]
real(* itors2)[4]
real itorunit
grad_prec * deity
grad_prec * deitx
real(* itors3)[4]
grad_prec * deitz
Definition: testrt.h:9
__device__ void dk_imptor(real &__restrict__ e, real &__restrict__ vxx, real &__restrict__ vyx, real &__restrict__ vzx, real &__restrict__ vyy, real &__restrict__ vzy, real &__restrict__ vzz, grad_prec *__restrict__ deitx, grad_prec *__restrict__ deity, grad_prec *__restrict__ deitz, real itorunit, int i, const int(*__restrict__ iitors)[4], const real(*__restrict__ itors1)[4], const real(*__restrict__ itors2)[4], const real(*__restrict__ itors3)[4], const real *__restrict__ x, const real *__restrict__ y, const real *__restrict__ z)
Definition: imptor.h:10