Tinker9 70bd052 (Thu Nov 9 12:11:35 2023 -0800)
Loading...
Searching...
No Matches
pair_alterpol.h
1#pragma once
2#include "ff/hippo/expolscr.h"
3#include "math/sinhc.h"
4#include "math/switch.h"
5#include "seq/seq.h"
6
7namespace tinker {
8#pragma acc routine seq
9template <bool DO_G>
12 real r, real sizik, 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
70inline void pair_alterpol(ExpolScr scrtyp, real r, real pscale, real cut,
71 real off, real xr, real yr, real zr, real springi, real sizi, real alphai,
72 real springk, real sizk, real alphak, real ks2i[3][3], real ks2k[3][3])
73{
74 real sizik = sizi * sizk;
75 real s2;
76 real ds2;
77
78 constexpr bool DO_G = false;
79 damp_expl<DO_G>(scrtyp, s2, ds2, r, sizik, alphai, alphak);
80
81 if (r > cut) {
82 real taper, dtaper;
83 switchTaper5<0>(r, cut, off, taper, dtaper);
84 s2 = s2 * taper;
85 }
86
87 real p33i, p33k;
88 p33i = springi * s2 * pscale;
89 p33k = springk * s2 * pscale;
90
91 real ai[3]; // ak = -ai
92
93 ai[0] = xr / r;
94 ai[1] = yr / r;
95 ai[2] = zr / r;
96
97#if _OPENACC
98#pragma acc loop seq collapse(2)
99#endif
100 for (int i = 0; i < 3; ++i) {
101 for (int j = 0; j < 3; ++j) {
102 ks2i[j][i] = p33i * ai[i] * ai[j];
103 ks2k[j][i] = p33k * ai[i] * ai[j]; // ak_i * ak_j = ai_i * ai_j
104 }
105 }
106}
107
109inline void pair_dexpol(ExpolScr scrtyp, real r, real pscale, real cut,
110 real off, real xr, real yr, real zr, real uix, real uiy, real uiz, real ukx,
111 real uky, real ukz, real springi, real sizi, real alphai, real springk,
112 real sizk, real alphak, const real f, real frc[3])
113{
114 real sizik = sizi * sizk;
115 real s2;
116 real ds2;
117
118 constexpr bool DO_G = true;
119 damp_expl<DO_G>(scrtyp, s2, ds2, r, sizik, alphai, alphak);
120
121 if (r > cut) {
122 real taper, dtaper;
123 switchTaper5<1>(r, cut, off, taper, dtaper);
124 ds2 = ds2 * taper + s2 * dtaper;
125 s2 = s2 * taper;
126 }
127 real s2i = springi * s2 * pscale;
128 real s2k = springk * s2 * pscale;
129 real ds2i = springi * ds2 * pscale;
130 real ds2k = springk * ds2 * pscale;
131
132 // compute rotation matrix
133 real ai[3][3];
134 ai[0][2] = xr / r;
135 ai[1][2] = yr / r;
136 ai[2][2] = zr / r;
137 xr = 1.;
138 yr = 0.;
139 zr = 0.;
140 real dot = ai[0][2];
141 real eps = 0.70710678; // 1/sqrt(2)
142 if (fabs(dot) > eps) {
143 xr = 0.;
144 yr = 1.;
145 dot = ai[1][2];
146 }
147 xr = xr - dot * ai[0][2];
148 yr = yr - dot * ai[1][2];
149 zr = zr - dot * ai[2][2];
150 real dr = REAL_SQRT(xr * xr + yr * yr + zr * zr);
151 ai[0][0] = xr / dr;
152 ai[1][0] = yr / dr;
153 ai[2][0] = zr / dr;
154 ai[0][1] = ai[2][0] * ai[1][2] - ai[1][0] * ai[2][2];
155 ai[1][1] = ai[0][0] * ai[2][2] - ai[2][0] * ai[0][2];
156 ai[2][1] = ai[1][0] * ai[0][2] - ai[0][0] * ai[1][2];
157 // ak[][0] = ai[][0], ak[][1] = -ai[][1], ak[][2] = -ai[][2]
158
159 // local frame force
160 real frcil[3], frckl[3];
161 real uixl = uix * ai[0][0] + uiy * ai[1][0] + uiz * ai[2][0];
162 real uiyl = uix * ai[0][1] + uiy * ai[1][1] + uiz * ai[2][1];
163 real uizl = uix * ai[0][2] + uiy * ai[1][2] + uiz * ai[2][2];
164 real ukxl = -(ukx * ai[0][0] + uky * ai[1][0] + ukz * ai[2][0]);
165 real ukyl = ukx * ai[0][1] + uky * ai[1][1] + ukz * ai[2][1];
166 real ukzl = ukx * ai[0][2] + uky * ai[1][2] + ukz * ai[2][2];
167 frcil[2] = uizl * uizl * ds2i;
168 frckl[2] = ukzl * ukzl * ds2k;
169 // local frame torque
170 constexpr real two = 2.;
171 real tqxil = two * uiyl * uizl * s2i;
172 real tqyil = -two * uixl * uizl * s2i;
173 real tqxkl = two * ukyl * ukzl * s2k;
174 real tqykl = -two * ukxl * ukzl * s2k;
175 // convert local frame torques to local frame forces
176 frcil[0] = -tqyil / r;
177 frcil[1] = tqxil / r;
178 frckl[0] = -tqykl / r;
179 frckl[1] = tqxkl / r;
180 // rotate force to global frame
181 real frcxi = ai[0][0] * frcil[0] + ai[0][1] * frcil[1] + ai[0][2] * frcil[2];
182 real frcyi = ai[1][0] * frcil[0] + ai[1][1] * frcil[1] + ai[1][2] * frcil[2];
183 real frczi = ai[2][0] * frcil[0] + ai[2][1] * frcil[1] + ai[2][2] * frcil[2];
184 real frcxk = ai[0][0] * frckl[0] - ai[0][1] * frckl[1] - ai[0][2] * frckl[2];
185 real frcyk = ai[1][0] * frckl[0] - ai[1][1] * frckl[1] - ai[1][2] * frckl[2];
186 real frczk = ai[2][0] * frckl[0] - ai[2][1] * frckl[1] - ai[2][2] * frckl[2];
187 frc[0] = f * (frcxk - frcxi);
188 frc[1] = f * (frcyk - frcyi);
189 frc[2] = f * (frczk - frczi);
190}
191}
#define SEQ_ROUTINE
Definition: acc/seqdef.h:7
#define SEQ_CUDA
Definition: acc/seqdef.h:12
#define restrict
Definition: macro.h:51
__device__ void fsinhc3(T d, T &__restrict__ f1d, T &__restrict__ f2d, T &__restrict__ f3d)
Definition: sinhc.h:294
float real
Definition: precision.h:80
Definition: testrt.h:9
__device__ void damp_expl(ExpolScr scrtyp, real &__restrict__ s2, real &__restrict__ ds2, real r, real sizik, real alphai, real alphak)
Definition: pair_alterpol.h:11
ExpolScr scrtyp
__device__ void pair_alterpol(ExpolScr scrtyp, real r, real pscale, real cut, real off, real xr, real yr, real zr, real springi, real sizi, real alphai, real springk, real sizk, real alphak, real ks2i[3][3], real ks2k[3][3])
Definition: pair_alterpol.h:70
__device__ void pair_dexpol(ExpolScr scrtyp, real r, real pscale, real cut, real off, real xr, real yr, real zr, real uix, real uiy, real uiz, real ukx, real uky, real ukz, real springi, real sizi, real alphai, real springk, real sizk, real alphak, const real f, real frc[3])
Definition: pair_alterpol.h:109
ExpolScr
Definition: expolscr.h:5