Skip to content

Commit 6ed07f8

Browse files
committed
working on expol gradient
1 parent cd82586 commit 6ed07f8

File tree

5 files changed

+259
-51
lines changed

5 files changed

+259
-51
lines changed

include/ff/hippo/expol.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ namespace tinker {
66
void expolData(RcOp);
77

88
void alterpol(real (*polscale)[3][3], real (*polinv)[3][3]);
9-
void dexpol();
9+
void dexpol(const real (*uind)[3], grad_prec* depx, grad_prec* depy, grad_prec* depz,
10+
VirialBuffer restrict vir_ep);
1011

1112
enum class ExpolScr
1213
{

include/seq/damp_hippo.h

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -613,24 +613,26 @@ inline void damp_rep(real* restrict dmpik, real r, real rr1, real r2, real rr3,
613613

614614
#pragma acc routine seq
615615
SEQ_CUDA
616-
inline void damp_expl(
617-
ExpolScr scrtyp, real& restrict s2, real& restrict ds2, real r, real sizik, real alphai, real alphak)
616+
inline void damp_expl(ExpolScr scrtyp, real& restrict s2, real& restrict ds2, real r, real sizik,
617+
real alphai, real alphak, bool do_g)
618618
{
619619
real alphaik, dmpik2, dampik, dampik2, expik, s;
620620

621621
if (scrtyp == ExpolScr::S2U) {
622622
alphaik = REAL_SQRT(alphai * alphak);
623-
real inv2 = 1. / 2, inv3 = 1. / 3;
624-
real one = 1.;
623+
constexpr real inv2 = 1. / 2, inv3 = 1. / 3;
624+
constexpr real one = 1.;
625625
dmpik2 = inv2 * alphaik;
626626
dampik = dmpik2 * r;
627627
dampik2 = dampik * dampik;
628628
expik = REAL_EXP(-dampik);
629629
s = (one + dampik + dampik2 * inv3) * expik;
630630
s2 = s * s;
631-
ds2 = s * (-alphaik * inv3) * (dampik + dampik2) * expik;
631+
if (do_g)
632+
ds2 = s * (-alphaik * inv3) * (dampik + dampik2) * expik;
632633
}
633634
s2 = sizik * s2;
634-
ds2 = sizik * ds2;
635+
if (do_g)
636+
ds2 = sizik * ds2;
635637
}
636638
}

include/seq/pair_alterpol.h

Lines changed: 98 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,29 @@
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

66
namespace tinker {
77
#pragma acc routine seq
88
SEQ_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

Comments
 (0)