11#pragma once
2- #include " ff/hippomod.h"
2+ #include " ff/hippo/expolscr.h"
3+ #include " math/sinhc.h"
34#include " math/switch.h"
4- #include " seq/damp_hippo .h"
5+ #include " seq/seq .h"
56
67namespace tinker {
78#pragma acc routine seq
9+ template <bool DO_G>
810SEQ_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 ])
1273{
13- real cut2 = cut * cut;
1474 real sizik = sizi * sizk;
1575 real s2;
1676 real ds2;
17- bool do_g = false ;
1877
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);
2080
21- if (r2 > cut2 ) {
81+ if (r > cut ) {
2282 real taper, dtaper;
2383 switchTaper5<0 >(r, cut, off, taper, dtaper);
2484 s2 = s2 * taper;
@@ -28,40 +88,35 @@ inline void pair_alterpol(ExpolScr scrtyp, real r, real r2, real pscale, real cu
2888 p33i = springi * s2 * pscale;
2989 p33k = springk * s2 * pscale;
3090
31- real ai[3 ], ak[ 3 ];
91+ real ai[3 ]; // ak = -ai
3292
3393 ai[0 ] = xr / r;
3494 ai[1 ] = yr / r;
3595 ai[2 ] = zr / r;
3696
37- ak[0 ] = -ai[0 ];
38- ak[1 ] = -ai[1 ];
39- ak[2 ] = -ai[2 ];
4097 #pragma acc loop seq
4198 for (int i = 0 ; i < 3 ; ++i) {
4299 #pragma acc loop seq
43100 for (int j = 0 ; j < 3 ; ++j) {
44101 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
46103 }
47104 }
48105}
49106
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 ])
55111{
56- real cut2 = cut * cut;
57112 real sizik = sizi * sizk;
58113 real s2;
59114 real ds2;
60- bool do_g = true ;
61115
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);
63118
64- if (r2 > cut2 ) {
119+ if (r > cut ) {
65120 real taper, dtaper;
66121 switchTaper5<1 >(r, cut, off, taper, dtaper);
67122 ds2 = ds2 * taper + s2 * dtaper;
@@ -73,7 +128,7 @@ inline void pair_dexpol(ExpolScr scrtyp, real r, real r2, real pscale, real cut,
73128 real ds2k = springk * ds2 * pscale;
74129
75130 // compute rotation matrix
76- real ai[3 ][3 ], ak[ 3 ][ 3 ] ;
131+ real ai[3 ][3 ];
77132 ai[0 ][2 ] = xr / r;
78133 ai[1 ][2 ] = yr / r;
79134 ai[2 ][2 ] = zr / r;
@@ -97,26 +152,18 @@ inline void pair_dexpol(ExpolScr scrtyp, real r, real r2, real pscale, real cut,
97152 ai[0 ][1 ] = ai[2 ][0 ] * ai[1 ][2 ] - ai[1 ][0 ] * ai[2 ][2 ];
98153 ai[1 ][1 ] = ai[0 ][0 ] * ai[2 ][2 ] - ai[2 ][0 ] * ai[0 ][2 ];
99154 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]
109156
110157 // local frame force
111158 real frcil[3 ], frckl[3 ];
112159 real uixl = uix * ai[0 ][0 ] + uiy * ai[1 ][0 ] + uiz * ai[2 ][0 ];
113160 real uiyl = uix * ai[0 ][1 ] + uiy * ai[1 ][1 ] + uiz * ai[2 ][1 ];
114161 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;
120167 // local frame torque
121168 constexpr real two = 2 .;
122169 real tqxil = two * uiyl * uizl * s2i;
@@ -132,9 +179,9 @@ inline void pair_dexpol(ExpolScr scrtyp, real r, real r2, real pscale, real cut,
132179 real frcxi = ai[0 ][0 ] * frcil[0 ] + ai[0 ][1 ] * frcil[1 ] + ai[0 ][2 ] * frcil[2 ];
133180 real frcyi = ai[1 ][0 ] * frcil[0 ] + ai[1 ][1 ] * frcil[1 ] + ai[1 ][2 ] * frcil[2 ];
134181 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 ];
138185 frc[0 ] = f * (frcxk - frcxi);
139186 frc[1 ] = f * (frcyk - frcyi);
140187 frc[2 ] = f * (frczk - frczi);
0 commit comments