1
1
#pragma once
2
- #include " ff/hippomod.h"
2
+ #include " ff/hippo/expolscr.h"
3
+ #include " math/sinhc.h"
3
4
#include " math/switch.h"
4
- #include " seq/damp_hippo .h"
5
+ #include " seq/seq .h"
5
6
6
7
namespace tinker {
7
8
#pragma acc routine seq
9
+ template <bool DO_G>
8
10
SEQ_CUDA
9
- inline void pair_alterpol (ExpolScr scrtyp, real r, real r2, real pscale, real cut, real off,
10
- real xr, real yr, real zr, real springi, real sizi, real alphai, real springk, real sizk,
11
- real alphak, real ks2i[3 ][3 ], real ks2k[3 ][3 ])
11
+ inline void damp_expl (ExpolScr scrtyp, real& restrict s2, real& restrict ds2, real r, real sizik,
12
+ real alphai, real alphak)
13
+ {
14
+ constexpr real inv2 = 1 . / 2 , inv3 = 1 . / 3 ;
15
+ constexpr real one = 1 .;
16
+
17
+ if (scrtyp == ExpolScr::S2U) {
18
+ real alphaik, dmpik2, dampik, dampik2, expik, s;
19
+ alphaik = REAL_SQRT (alphai * alphak);
20
+ dmpik2 = inv2 * alphaik;
21
+ dampik = dmpik2 * r;
22
+ dampik2 = dampik * dampik;
23
+ expik = REAL_EXP (-dampik);
24
+ s = (one + dampik + dampik2 * inv3) * expik;
25
+ s2 = s * s;
26
+ if (DO_G) ds2 = s * (-alphaik * inv3) * (dampik + dampik2) * expik;
27
+ } else if (scrtyp == ExpolScr::S2) {
28
+ real pfac = 2 / (alphai + alphak);
29
+ real r2 = r * r;
30
+ pfac = pfac * pfac;
31
+ pfac = pfac * alphai * alphak;
32
+ pfac = pfac * pfac * pfac;
33
+ pfac *= r2;
34
+
35
+ real a = alphai * r / 2 , b = alphak * r / 2 ;
36
+ real c = (a + b) / 2 , d = (b - a) / 2 ;
37
+ real expmc = REAL_EXP (-c);
38
+
39
+ real c2 = c * c;
40
+ real d2 = d * d;
41
+ real c2d2 = (c * d) * (c * d);
42
+ real f1d, f2d, f3d;
43
+ fsinhc3 (d, f1d, f2d, f3d);
44
+
45
+ real s;
46
+ s = f1d * (c + 1 ) + f2d * c2;
47
+ s /= r;
48
+ s *= expmc;
49
+ s2 = pfac * s * s;
50
+
51
+ if (DO_G) {
52
+ real ds;
53
+ ds = f1d * c2 + f2d * ((c - 2 ) * c2 - (c + 1 ) * d2) - f3d * c2d2;
54
+ ds /= -r2;
55
+ ds *= expmc;
56
+ ds2 = pfac * 2 * s * ds;
57
+ }
58
+
59
+ } else if (scrtyp == ExpolScr::G) {
60
+ real alphaik = REAL_SQRT (alphai * alphak);
61
+ s2 = REAL_EXP (-alphaik / (real)10 * r * r);
62
+ if (DO_G) ds2 = (-alphaik / (real)5 ) * r * s2;
63
+ }
64
+
65
+ s2 = sizik * s2;
66
+ if (DO_G) ds2 = sizik * ds2;
67
+ }
68
+
69
+ SEQ_ROUTINE
70
+ inline void pair_alterpol (ExpolScr scrtyp, real r, real pscale, real cut, real off, real xr,
71
+ real yr, real zr, real springi, real sizi, real alphai, real springk, real sizk, real alphak,
72
+ real ks2i[3 ][3 ], real ks2k[3 ][3 ])
12
73
{
13
- real cut2 = cut * cut;
14
74
real sizik = sizi * sizk;
15
75
real s2;
16
76
real ds2;
17
- bool do_g = false ;
18
77
19
- damp_expl (scrtyp, s2, ds2, r, sizik, alphai, alphak, do_g);
78
+ constexpr bool DO_G = false ;
79
+ damp_expl<DO_G>(scrtyp, s2, ds2, r, sizik, alphai, alphak);
20
80
21
- if (r2 > cut2 ) {
81
+ if (r > cut ) {
22
82
real taper, dtaper;
23
83
switchTaper5<0 >(r, cut, off, taper, dtaper);
24
84
s2 = s2 * taper;
@@ -28,40 +88,35 @@ inline void pair_alterpol(ExpolScr scrtyp, real r, real r2, real pscale, real cu
28
88
p33i = springi * s2 * pscale;
29
89
p33k = springk * s2 * pscale;
30
90
31
- real ai[3 ], ak[ 3 ];
91
+ real ai[3 ]; // ak = -ai
32
92
33
93
ai[0 ] = xr / r;
34
94
ai[1 ] = yr / r;
35
95
ai[2 ] = zr / r;
36
96
37
- ak[0 ] = -ai[0 ];
38
- ak[1 ] = -ai[1 ];
39
- ak[2 ] = -ai[2 ];
40
97
#pragma acc loop seq
41
98
for (int i = 0 ; i < 3 ; ++i) {
42
99
#pragma acc loop seq
43
100
for (int j = 0 ; j < 3 ; ++j) {
44
101
ks2i[j][i] = p33i * ai[i] * ai[j];
45
- ks2k[j][i] = p33k * ak [i] * ak [j];
102
+ ks2k[j][i] = p33k * ai [i] * ai [j]; // ak_i * ak_j = ai_i * ai_j
46
103
}
47
104
}
48
105
}
49
106
50
- #pragma acc routine seq
51
- SEQ_CUDA
52
- inline void pair_dexpol (ExpolScr scrtyp, real r, real r2, real pscale, real cut, real off, real xr,
53
- real yr, real zr, real uix, real uiy, real uiz, real ukx, real uky, real ukz, real springi,
54
- real sizi, real alphai, real springk, real sizk, real alphak, const real f, real frc[3 ])
107
+ SEQ_ROUTINE
108
+ inline void pair_dexpol (ExpolScr scrtyp, real r, real pscale, real cut, real off, real xr, real yr,
109
+ real zr, real uix, real uiy, real uiz, real ukx, real uky, real ukz, real springi, real sizi,
110
+ real alphai, real springk, real sizk, real alphak, const real f, real frc[3 ])
55
111
{
56
- real cut2 = cut * cut;
57
112
real sizik = sizi * sizk;
58
113
real s2;
59
114
real ds2;
60
- bool do_g = true ;
61
115
62
- damp_expl (scrtyp, s2, ds2, r, sizik, alphai, alphak, do_g);
116
+ constexpr bool DO_G = true ;
117
+ damp_expl<DO_G>(scrtyp, s2, ds2, r, sizik, alphai, alphak);
63
118
64
- if (r2 > cut2 ) {
119
+ if (r > cut ) {
65
120
real taper, dtaper;
66
121
switchTaper5<1 >(r, cut, off, taper, dtaper);
67
122
ds2 = ds2 * taper + s2 * dtaper;
@@ -73,7 +128,7 @@ inline void pair_dexpol(ExpolScr scrtyp, real r, real r2, real pscale, real cut,
73
128
real ds2k = springk * ds2 * pscale;
74
129
75
130
// compute rotation matrix
76
- real ai[3 ][3 ], ak[ 3 ][ 3 ] ;
131
+ real ai[3 ][3 ];
77
132
ai[0 ][2 ] = xr / r;
78
133
ai[1 ][2 ] = yr / r;
79
134
ai[2 ][2 ] = zr / r;
@@ -97,26 +152,18 @@ inline void pair_dexpol(ExpolScr scrtyp, real r, real r2, real pscale, real cut,
97
152
ai[0 ][1 ] = ai[2 ][0 ] * ai[1 ][2 ] - ai[1 ][0 ] * ai[2 ][2 ];
98
153
ai[1 ][1 ] = ai[0 ][0 ] * ai[2 ][2 ] - ai[2 ][0 ] * ai[0 ][2 ];
99
154
ai[2 ][1 ] = ai[1 ][0 ] * ai[0 ][2 ] - ai[0 ][0 ] * ai[1 ][2 ];
100
- ak[0 ][0 ] = ai[0 ][0 ];
101
- ak[1 ][0 ] = ai[1 ][0 ];
102
- ak[2 ][0 ] = ai[2 ][0 ];
103
- ak[0 ][1 ] = -ai[0 ][1 ];
104
- ak[1 ][1 ] = -ai[1 ][1 ];
105
- ak[2 ][1 ] = -ai[2 ][1 ];
106
- ak[0 ][2 ] = -ai[0 ][2 ];
107
- ak[1 ][2 ] = -ai[1 ][2 ];
108
- ak[2 ][2 ] = -ai[2 ][2 ];
155
+ // ak[][0] = ai[][0], ak[][1] = -ai[][1], ak[][2] = -ai[][2]
109
156
110
157
// local frame force
111
158
real frcil[3 ], frckl[3 ];
112
159
real uixl = uix * ai[0 ][0 ] + uiy * ai[1 ][0 ] + uiz * ai[2 ][0 ];
113
160
real uiyl = uix * ai[0 ][1 ] + uiy * ai[1 ][1 ] + uiz * ai[2 ][1 ];
114
161
real uizl = uix * ai[0 ][2 ] + uiy * ai[1 ][2 ] + uiz * ai[2 ][2 ];
115
- real ukxl = -(ukx * ak [0 ][0 ] + uky * ak [1 ][0 ] + ukz * ak [2 ][0 ]);
116
- real ukyl = -( ukx * ak [0 ][1 ] + uky * ak [1 ][1 ] + ukz * ak [2 ][1 ]) ;
117
- real ukzl = -( ukx * ak [0 ][2 ] + uky * ak [1 ][2 ] + ukz * ak [2 ][2 ]) ;
118
- frcil[2 ] = REAL_POW ( uizl, 2 ) * ds2i;
119
- frckl[2 ] = REAL_POW ( ukzl, 2 ) * ds2k;
162
+ real ukxl = -(ukx * ai [0 ][0 ] + uky * ai [1 ][0 ] + ukz * ai [2 ][0 ]);
163
+ real ukyl = ukx * ai [0 ][1 ] + uky * ai [1 ][1 ] + ukz * ai [2 ][1 ];
164
+ real ukzl = ukx * ai [0 ][2 ] + uky * ai [1 ][2 ] + ukz * ai [2 ][2 ];
165
+ frcil[2 ] = uizl * uizl * ds2i;
166
+ frckl[2 ] = ukzl * ukzl * ds2k;
120
167
// local frame torque
121
168
constexpr real two = 2 .;
122
169
real tqxil = two * uiyl * uizl * s2i;
@@ -132,9 +179,9 @@ inline void pair_dexpol(ExpolScr scrtyp, real r, real r2, real pscale, real cut,
132
179
real frcxi = ai[0 ][0 ] * frcil[0 ] + ai[0 ][1 ] * frcil[1 ] + ai[0 ][2 ] * frcil[2 ];
133
180
real frcyi = ai[1 ][0 ] * frcil[0 ] + ai[1 ][1 ] * frcil[1 ] + ai[1 ][2 ] * frcil[2 ];
134
181
real frczi = ai[2 ][0 ] * frcil[0 ] + ai[2 ][1 ] * frcil[1 ] + ai[2 ][2 ] * frcil[2 ];
135
- real frcxk = ak [0 ][0 ] * frckl[0 ] + ak [0 ][1 ] * frckl[1 ] + ak [0 ][2 ] * frckl[2 ];
136
- real frcyk = ak [1 ][0 ] * frckl[0 ] + ak [1 ][1 ] * frckl[1 ] + ak [1 ][2 ] * frckl[2 ];
137
- real frczk = ak [2 ][0 ] * frckl[0 ] + ak [2 ][1 ] * frckl[1 ] + ak [2 ][2 ] * frckl[2 ];
182
+ real frcxk = ai [0 ][0 ] * frckl[0 ] - ai [0 ][1 ] * frckl[1 ] - ai [0 ][2 ] * frckl[2 ];
183
+ real frcyk = ai [1 ][0 ] * frckl[0 ] - ai [1 ][1 ] * frckl[1 ] - ai [1 ][2 ] * frckl[2 ];
184
+ real frczk = ai [2 ][0 ] * frckl[0 ] - ai [2 ][1 ] * frckl[1 ] - ai [2 ][2 ] * frckl[2 ];
138
185
frc[0 ] = f * (frcxk - frcxi);
139
186
frc[1 ] = f * (frcyk - frcyi);
140
187
frc[2 ] = f * (frczk - frczi);
0 commit comments