11#pragma once
2+ #include " ff/hippomod.h"
23#include " math/switch.h"
34#include " seq/damp_hippo.h"
4- #include " ff/hippomod.h"
55
66namespace tinker {
77#pragma acc routine seq
88SEQ_CUDA
9- inline void pair_alterpol (ExpolScr scrtyp, real r, real r2, real pscale, real cut, real off, real xr, real yr, real zr,
10- real springi, real sizi, real alphai, real springk, real sizk, real alphak ,
11- real ks2i[3 ][3 ], real ks2k[3 ][3 ])
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 ])
1212{
1313 real cut2 = cut * cut;
1414 real sizik = sizi * sizk;
1515 real s2;
1616 real ds2;
17+ bool do_g = false ;
1718
18- damp_expl (scrtyp, s2, ds2, r, sizik, alphai, alphak);
19+ damp_expl (scrtyp, s2, ds2, r, sizik, alphai, alphak, do_g );
1920
2021 if (r2 > cut2) {
2122 real taper, dtaper;
2223 switchTaper5<0 >(r, cut, off, taper, dtaper);
2324 s2 = s2 * taper;
2425 }
26+
2527 real p33i, p33k;
2628 p33i = springi * s2 * pscale;
2729 p33k = springk * s2 * pscale;
@@ -44,4 +46,95 @@ inline void pair_alterpol(ExpolScr scrtyp, real r, real r2, real pscale, real cu
4446 }
4547 }
4648}
49+
50+ inline void pair_dexpol (ExpolScr scrtyp, real r, real r2, real pscale, real cut, real off, real xr,
51+ real yr, real zr, real uix, real uiy, real uiz, real ukx, real uky, real ukz, real springi,
52+ real sizi, real alphai, real springk, real sizk, real alphak, const real f, real frc[3 ])
53+ {
54+ real cut2 = cut * cut;
55+ real sizik = sizi * sizk;
56+ real s2;
57+ real ds2;
58+ bool do_g = true ;
59+
60+ damp_expl (scrtyp, s2, ds2, r, sizik, alphai, alphak, do_g);
61+
62+ if (r2 > cut2) {
63+ real taper, dtaper;
64+ switchTaper5<1 >(r, cut, off, taper, dtaper);
65+ s2 = s2 * taper;
66+ ds2 = ds2 * taper + s2 * dtaper;
67+ }
68+ real s2i = springi * s2 * pscale;
69+ real s2k = springk * s2 * pscale;
70+ real ds2i = springi * ds2 * pscale;
71+ real ds2k = springk * ds2 * pscale;
72+
73+ // compute rotation matrix
74+ real ai[3 ][3 ], ak[3 ][3 ];
75+ ai[0 ][2 ] = xr / r;
76+ ai[1 ][2 ] = yr / r;
77+ ai[2 ][2 ] = zr / r;
78+ xr = 1 .;
79+ yr = 0 .;
80+ zr = 0 .;
81+ real dot = ai[0 ][2 ];
82+ real eps = 1 . / REAL_SQRT (2 );
83+ if (abs (dot) >= eps) {
84+ xr = 0 .;
85+ yr = 1 .;
86+ dot = ai[1 ][2 ];
87+ }
88+ xr = xr - dot * ai[0 ][2 ];
89+ yr = yr - dot * ai[1 ][2 ];
90+ zr = zr - dot * ai[2 ][2 ];
91+ r = REAL_SQRT (xr * xr + yr * yr + zr * zr);
92+ ai[0 ][0 ] = xr / r;
93+ ai[1 ][0 ] = yr / r;
94+ ai[2 ][0 ] = zr / r;
95+ ai[0 ][1 ] = ai[2 ][0 ] * ai[1 ][2 ] - ai[1 ][0 ] * ai[2 ][2 ];
96+ ai[1 ][1 ] = ai[0 ][0 ] * ai[2 ][2 ] - ai[2 ][0 ] * ai[0 ][2 ];
97+ ai[2 ][1 ] = ai[1 ][0 ] * ai[0 ][2 ] - ai[0 ][0 ] * ai[1 ][2 ];
98+ ak[0 ][0 ] = ai[0 ][0 ];
99+ ak[1 ][0 ] = ai[1 ][0 ];
100+ ak[2 ][0 ] = ai[2 ][0 ];
101+ ak[0 ][1 ] = -ai[0 ][1 ];
102+ ak[1 ][1 ] = -ai[1 ][1 ];
103+ ak[2 ][1 ] = -ai[2 ][1 ];
104+ ak[0 ][2 ] = -ai[0 ][2 ];
105+ ak[1 ][2 ] = -ai[1 ][2 ];
106+ ak[2 ][2 ] = -ai[2 ][2 ];
107+
108+ // local frame force
109+ real frcil[3 ], frckl[3 ];
110+ real uixl = uix * ai[0 ][0 ] + uiy * ai[1 ][0 ] + uiz * ai[2 ][0 ];
111+ real uiyl = uix * ai[0 ][1 ] + uiy * ai[1 ][1 ] + uiz * ai[2 ][1 ];
112+ real uizl = uix * ai[0 ][2 ] + uiy * ai[1 ][2 ] + uiz * ai[2 ][2 ];
113+ real ukxl = -(ukx * ak[0 ][0 ] + uky * ak[1 ][0 ] + ukz * ak[2 ][0 ]);
114+ real ukyl = -(ukx * ak[0 ][1 ] + uky * ak[1 ][1 ] + ukz * ak[2 ][1 ]);
115+ real ukzl = -(ukx * ak[0 ][2 ] + uky * ak[1 ][2 ] + ukz * ak[2 ][2 ]);
116+ frcil[2 ] = REAL_POW (uizl, 2 ) * ds2i;
117+ frckl[2 ] = REAL_POW (ukzl, 2 ) * ds2k;
118+ // local frame torque
119+ constexpr real two = 2 .;
120+ real tqxil = two * uiyl * uizl * s2i;
121+ real tqyil = -two * uixl * uizl * s2i;
122+ real tqxkl = two * ukyl * ukzl * s2k;
123+ real tqykl = -two * ukxl * ukzl * s2k;
124+ // convert local frame torques to local frame forces
125+ frcil[0 ] = -tqyil / r;
126+ frcil[1 ] = tqxil / r;
127+ frckl[0 ] = -tqykl / r;
128+ frckl[1 ] = tqxkl / r;
129+ // rotate force to global frame
130+ real frcxi = ai[0 ][0 ] * frcil[0 ] + ai[0 ][1 ] * frcil[1 ] + ai[0 ][2 ] * frcil[2 ];
131+ real frcyi = ai[1 ][0 ] * frcil[0 ] + ai[1 ][1 ] * frcil[1 ] + ai[1 ][2 ] * frcil[2 ];
132+ real frczi = ai[2 ][0 ] * frcil[0 ] + ai[2 ][1 ] * frcil[1 ] + ai[2 ][2 ] * frcil[2 ];
133+ real frcxk = ak[0 ][0 ] * frckl[0 ] + ak[0 ][1 ] * frckl[1 ] + ak[0 ][2 ] * frckl[2 ];
134+ real frcyk = ak[1 ][0 ] * frckl[0 ] + ak[1 ][1 ] * frckl[1 ] + ak[1 ][2 ] * frckl[2 ];
135+ real frczk = ak[2 ][0 ] * frckl[0 ] + ak[2 ][1 ] * frckl[1 ] + ak[2 ][2 ] * frckl[2 ];
136+ frc[0 ] = f * (frcxk - frcxi);
137+ frc[1 ] = f * (frcyk - frcyi);
138+ frc[2 ] = f * (frczk - frczi);
139+ }
47140}
0 commit comments