Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
tsoc
openmm
Commits
f11d445b
Commit
f11d445b
authored
Aug 09, 2010
by
Peter Eastman
Browse files
Optimizations to KirkwoodEDiff kernel
parent
21ab511a
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
288 additions
and
455 deletions
+288
-455
plugins/amoeba/platforms/cuda/src/kernels/kCalculateAmoebaCudaKirkwoodEDiff.cu
...rms/cuda/src/kernels/kCalculateAmoebaCudaKirkwoodEDiff.cu
+235
-337
plugins/amoeba/platforms/cuda/src/kernels/kCalculateAmoebaCudaKirkwoodEDiff.h
...orms/cuda/src/kernels/kCalculateAmoebaCudaKirkwoodEDiff.h
+53
-118
No files found.
plugins/amoeba/platforms/cuda/src/kernels/kCalculateAmoebaCudaKirkwoodEDiff.cu
View file @
f11d445b
...
@@ -89,56 +89,6 @@ __device__ void loadKirkwoodEDiffShared( struct KirkwoodEDiffParticle* sA, unsig
...
@@ -89,56 +89,6 @@ __device__ void loadKirkwoodEDiffShared( struct KirkwoodEDiffParticle* sA, unsig
}
}
// load struct and arrays w/ shared data in sA
__device__
void
loadKirkwoodEDiffData
(
struct
KirkwoodEDiffParticle
*
sA
,
float4
*
jCoord
,
float
*
jDipole
,
float
*
jQuadrupole
,
float
*
jInducedDipole
,
float
*
jInducedDipolePolar
,
float
*
jInducedDipoleS
,
float
*
jInducedDipolePolarS
)
{
// load coords, charge, ...
jCoord
->
x
=
sA
->
x
;
jCoord
->
y
=
sA
->
y
;
jCoord
->
z
=
sA
->
z
;
jCoord
->
w
=
sA
->
q
;
jDipole
[
0
]
=
sA
->
labFrameDipole
[
0
];
jDipole
[
1
]
=
sA
->
labFrameDipole
[
1
];
jDipole
[
2
]
=
sA
->
labFrameDipole
[
2
];
jQuadrupole
[
0
]
=
sA
->
labFrameQuadrupole_XX
;
jQuadrupole
[
1
]
=
sA
->
labFrameQuadrupole_XY
;
jQuadrupole
[
2
]
=
sA
->
labFrameQuadrupole_XZ
;
jQuadrupole
[
3
]
=
sA
->
labFrameQuadrupole_XY
;
jQuadrupole
[
4
]
=
sA
->
labFrameQuadrupole_YY
;
jQuadrupole
[
5
]
=
sA
->
labFrameQuadrupole_YZ
;
jQuadrupole
[
6
]
=
sA
->
labFrameQuadrupole_XZ
;
jQuadrupole
[
7
]
=
sA
->
labFrameQuadrupole_YZ
;
jQuadrupole
[
8
]
=
sA
->
labFrameQuadrupole_ZZ
;
jInducedDipole
[
0
]
=
sA
->
inducedDipole
[
0
];
jInducedDipole
[
1
]
=
sA
->
inducedDipole
[
1
];
jInducedDipole
[
2
]
=
sA
->
inducedDipole
[
2
];
jInducedDipolePolar
[
0
]
=
sA
->
inducedDipoleP
[
0
];
jInducedDipolePolar
[
1
]
=
sA
->
inducedDipoleP
[
1
];
jInducedDipolePolar
[
2
]
=
sA
->
inducedDipoleP
[
2
];
jInducedDipoleS
[
0
]
=
sA
->
inducedDipoleS
[
0
];
jInducedDipoleS
[
1
]
=
sA
->
inducedDipoleS
[
1
];
jInducedDipoleS
[
2
]
=
sA
->
inducedDipoleS
[
2
];
jInducedDipolePolarS
[
0
]
=
sA
->
inducedDipolePS
[
0
];
jInducedDipolePolarS
[
1
]
=
sA
->
inducedDipolePS
[
1
];
jInducedDipolePolarS
[
2
]
=
sA
->
inducedDipolePS
[
2
];
}
/*****************************************************************************
/*****************************************************************************
ediff1 correct vacuum to SCRF derivatives
ediff1 correct vacuum to SCRF derivatives
...
@@ -148,15 +98,7 @@ __device__ void loadKirkwoodEDiffData( struct KirkwoodEDiffParticle* sA,
...
@@ -148,15 +98,7 @@ __device__ void loadKirkwoodEDiffData( struct KirkwoodEDiffParticle* sA,
******************************************************************************/
******************************************************************************/
__device__
void
calculateKirkwoodEDiffPairIxn_kernel
(
float4
atomCoordinatesI
,
float4
atomCoordinatesJ
,
__device__
void
calculateKirkwoodEDiffPairIxn_kernel
(
KirkwoodEDiffParticle
&
atomI
,
KirkwoodEDiffParticle
&
atomJ
,
float
dampingFactorI
,
float
dampingFactorJ
,
float
tholeI
,
float
tholeJ
,
float
*
labFrameDipoleI
,
float
*
labFrameDipoleJ
,
float
*
labFrameQuadrupoleI
,
float
*
labFrameQuadrupoleJ
,
float
*
uindI
,
float
*
uindJ
,
float
*
uinpI
,
float
*
uinpJ
,
float
*
uindsI
,
float
*
uindsJ
,
float
*
uinpsI
,
float
*
uinpsJ
,
float
pscale
,
float
dscale
,
float
pscale
,
float
dscale
,
float
*
outputEnergy
,
float
*
outputForce
,
float
*
outputEnergy
,
float
*
outputForce
,
float
*
outputTorqueI
,
float
*
outputTorqueJ
float
*
outputTorqueI
,
float
*
outputTorqueJ
...
@@ -167,22 +109,18 @@ __device__ void calculateKirkwoodEDiffPairIxn_kernel( float4 atomCoordinatesI,
...
@@ -167,22 +109,18 @@ __device__ void calculateKirkwoodEDiffPairIxn_kernel( float4 atomCoordinatesI,
//float f;
//float f;
//float gfd;
//float gfd;
float
damp
;
float
scale3
,
scale5
;
float
scale3
,
scale5
;
float
scale7
;
float
scale7
;
//float scale9;
//float scale9;
float
xr
,
yr
,
zr
;
float
psc3
,
psc5
,
psc7
;
float
psc3
,
psc5
,
psc7
;
//float psc9;
//float psc9;
float
dsc3
,
dsc5
,
dsc7
;
float
dsc3
,
dsc5
,
dsc7
;
//float dsc9;
//float dsc9;
float
scale3i
,
scale5i
;
float
scale3i
,
scale5i
;
//float scale7i;
//float scale7i;
float
r
,
r2
,
rr1
,
rr3
;
float
r
,
rr1
,
rr3
;
float
rr5
,
rr7
,
rr9
;
float
rr5
,
rr7
,
rr9
;
float
pdi
,
pgamma
;
float
pgamma
;
float
ci
,
di
[
4
],
qi
[
10
];
float
ck
,
dk
[
4
],
qk
[
10
];
float
fridmp
[
4
],
findmp
[
4
];
float
fridmp
[
4
],
findmp
[
4
];
float
ftm2i
[
4
];
float
ftm2i
[
4
];
float
ttm2i
[
4
],
ttm3i
[
4
];
float
ttm2i
[
4
],
ttm3i
[
4
];
...
@@ -213,7 +151,7 @@ __device__ void calculateKirkwoodEDiffPairIxn_kernel( float4 atomCoordinatesI,
...
@@ -213,7 +151,7 @@ __device__ void calculateKirkwoodEDiffPairIxn_kernel( float4 atomCoordinatesI,
float
sc
[
11
];
float
sc
[
11
];
float
sci
[
9
],
scip
[
9
];
float
sci
[
9
],
scip
[
9
];
float
gfi
[
7
],
gti
[
7
];
float
gfi
[
7
],
gti
[
7
];
float
uscale
;
const
float
uscale
=
1.0
f
;
// float ftm1i(4,maxatm);
// float ftm1i(4,maxatm);
// float ttm1i(4,maxatm);
// float ttm1i(4,maxatm);
...
@@ -222,54 +160,14 @@ __device__ void calculateKirkwoodEDiffPairIxn_kernel( float4 atomCoordinatesI,
...
@@ -222,54 +160,14 @@ __device__ void calculateKirkwoodEDiffPairIxn_kernel( float4 atomCoordinatesI,
// set conversion factor, cutoff and scaling coefficients
// set conversion factor, cutoff and scaling coefficients
//f = cAmoebaSim.electric / cAmoebaSim.dwater;
//f = cAmoebaSim.electric / cAmoebaSim.dwater;
pdi
=
dampingFactorI
;
uscale
=
1.0
f
;
// atom I
ci
=
atomCoordinatesI
.
w
;
di
[
1
]
=
labFrameDipoleI
[
0
];
di
[
2
]
=
labFrameDipoleI
[
1
];
di
[
3
]
=
labFrameDipoleI
[
2
];
qi
[
1
]
=
labFrameQuadrupoleI
[
0
];
qi
[
2
]
=
labFrameQuadrupoleI
[
1
];
qi
[
3
]
=
labFrameQuadrupoleI
[
2
];
qi
[
4
]
=
labFrameQuadrupoleI
[
3
];
qi
[
5
]
=
labFrameQuadrupoleI
[
4
];
qi
[
6
]
=
labFrameQuadrupoleI
[
5
];
qi
[
7
]
=
labFrameQuadrupoleI
[
6
];
qi
[
8
]
=
labFrameQuadrupoleI
[
7
];
qi
[
9
]
=
labFrameQuadrupoleI
[
8
];
// atom J
ck
=
atomCoordinatesJ
.
w
;
dk
[
1
]
=
labFrameDipoleJ
[
0
];
dk
[
2
]
=
labFrameDipoleJ
[
1
];
dk
[
3
]
=
labFrameDipoleJ
[
2
];
qk
[
1
]
=
labFrameQuadrupoleJ
[
0
];
qk
[
2
]
=
labFrameQuadrupoleJ
[
1
];
qk
[
3
]
=
labFrameQuadrupoleJ
[
2
];
qk
[
4
]
=
labFrameQuadrupoleJ
[
3
];
qk
[
5
]
=
labFrameQuadrupoleJ
[
4
];
qk
[
6
]
=
labFrameQuadrupoleJ
[
5
];
qk
[
7
]
=
labFrameQuadrupoleJ
[
6
];
qk
[
8
]
=
labFrameQuadrupoleJ
[
7
];
qk
[
9
]
=
labFrameQuadrupoleJ
[
8
];
// deltaR
// deltaR
xr
=
atom
CoordinatesJ
.
x
-
atomCoordinates
I
.
x
;
float
xr
=
atom
J
.
x
-
atom
I
.
x
;
yr
=
atom
CoordinatesJ
.
y
-
atomCoordinates
I
.
y
;
float
yr
=
atom
J
.
y
-
atom
I
.
y
;
zr
=
atom
CoordinatesJ
.
z
-
atomCoordinates
I
.
z
;
float
zr
=
atom
J
.
z
-
atom
I
.
z
;
r2
=
xr
*
xr
+
yr
*
yr
+
zr
*
zr
;
float
r2
=
xr
*
xr
+
yr
*
yr
+
zr
*
zr
;
if
(
r2
>
cAmoebaSim
.
scalingDistanceCutoff
){
if
(
r2
>
cAmoebaSim
.
scalingDistanceCutoff
){
}
}
...
@@ -299,9 +197,9 @@ __device__ void calculateKirkwoodEDiffPairIxn_kernel( float4 atomCoordinatesI,
...
@@ -299,9 +197,9 @@ __device__ void calculateKirkwoodEDiffPairIxn_kernel( float4 atomCoordinatesI,
// apply Thole polarization damping to scale factors
// apply Thole polarization damping to scale factors
damp
=
pdi
*
dampingFactorJ
;
float
damp
=
atomI
.
damp
*
atomJ
.
damp
;
if
(
damp
!=
0.0
f
){
if
(
damp
!=
0.0
f
){
pgamma
=
thole
J
>
thole
I
?
thole
I
:
thole
J
;
pgamma
=
atomJ
.
thole
>
atomI
.
thole
?
atomI
.
thole
:
atomJ
.
thole
;
float
ratio
=
(
r
/
damp
);
float
ratio
=
(
r
/
damp
);
damp
=
-
pgamma
*
ratio
*
ratio
*
ratio
;
damp
=
-
pgamma
*
ratio
*
ratio
*
ratio
;
if
(
damp
>
-
50.0
f
){
if
(
damp
>
-
50.0
f
){
...
@@ -343,44 +241,44 @@ __device__ void calculateKirkwoodEDiffPairIxn_kernel( float4 atomCoordinatesI,
...
@@ -343,44 +241,44 @@ __device__ void calculateKirkwoodEDiffPairIxn_kernel( float4 atomCoordinatesI,
// construct auxiliary vectors for permanent terms
// construct auxiliary vectors for permanent terms
#if 0
#if 0
dixdk[1] =
di[2]*dk[3] - di[3]*dk[2
];
dixdk[1] =
atomI.labFrameDipole[1]*atomJ.labFrameDipole[2] - atomI.labFrameDipole[2]*atomJ.labFrameDipole[1
];
dixdk[2] =
di[3]*dk[1] - di[1]*dk[3
];
dixdk[2] =
atomI.labFrameDipole[2]*atomJ.labFrameDipole[0] - atomI.labFrameDipole[0]*atomJ.labFrameDipole[2
];
dixdk[3] =
di[1]*dk[2] - di[2]*dk[1
];
dixdk[3] =
atomI.labFrameDipole[0]*atomJ.labFrameDipole[1] - atomI.labFrameDipole[1]*atomJ.labFrameDipole[0
];
#endif
#endif
dixr
[
1
]
=
di
[
2
]
*
zr
-
di
[
3
]
*
yr
;
dixr
[
1
]
=
atomI
.
labFrameDipole
[
1
]
*
zr
-
atomI
.
labFrameDipole
[
2
]
*
yr
;
dixr
[
2
]
=
di
[
3
]
*
xr
-
di
[
1
]
*
zr
;
dixr
[
2
]
=
atomI
.
labFrameDipole
[
2
]
*
xr
-
atomI
.
labFrameDipole
[
0
]
*
zr
;
dixr
[
3
]
=
di
[
1
]
*
yr
-
di
[
2
]
*
xr
;
dixr
[
3
]
=
atomI
.
labFrameDipole
[
0
]
*
yr
-
atomI
.
labFrameDipole
[
1
]
*
xr
;
dkxr
[
1
]
=
dk
[
2
]
*
zr
-
dk
[
3
]
*
yr
;
dkxr
[
1
]
=
atomJ
.
labFrameDipole
[
1
]
*
zr
-
atomJ
.
labFrameDipole
[
2
]
*
yr
;
dkxr
[
2
]
=
dk
[
3
]
*
xr
-
dk
[
1
]
*
zr
;
dkxr
[
2
]
=
atomJ
.
labFrameDipole
[
2
]
*
xr
-
atomJ
.
labFrameDipole
[
0
]
*
zr
;
dkxr
[
3
]
=
dk
[
1
]
*
yr
-
dk
[
2
]
*
xr
;
dkxr
[
3
]
=
atomJ
.
labFrameDipole
[
0
]
*
yr
-
atomJ
.
labFrameDipole
[
1
]
*
xr
;
qir
[
1
]
=
qi
[
1
]
*
xr
+
qi
[
4
]
*
yr
+
qi
[
7
]
*
zr
;
qir
[
1
]
=
atomI
.
labFrameQuadrupole_XX
*
xr
+
atomI
.
labFrameQuadrupole_XY
*
yr
+
atomI
.
labFrameQuadrupole_XZ
*
zr
;
qir
[
2
]
=
qi
[
2
]
*
xr
+
qi
[
5
]
*
yr
+
qi
[
8
]
*
zr
;
qir
[
2
]
=
atomI
.
labFrameQuadrupole_XY
*
xr
+
atomI
.
labFrameQuadrupole_YY
*
yr
+
atomI
.
labFrameQuadrupole_YZ
*
zr
;
qir
[
3
]
=
qi
[
3
]
*
xr
+
qi
[
6
]
*
yr
+
qi
[
9
]
*
zr
;
qir
[
3
]
=
atomI
.
labFrameQuadrupole_XZ
*
xr
+
atomI
.
labFrameQuadrupole_YZ
*
yr
+
atomI
.
labFrameQuadrupole_ZZ
*
zr
;
qkr
[
1
]
=
qk
[
1
]
*
xr
+
qk
[
4
]
*
yr
+
qk
[
7
]
*
zr
;
qkr
[
1
]
=
atomJ
.
labFrameQuadrupole_XX
*
xr
+
atomJ
.
labFrameQuadrupole_XY
*
yr
+
atomJ
.
labFrameQuadrupole_XZ
*
zr
;
qkr
[
2
]
=
qk
[
2
]
*
xr
+
qk
[
5
]
*
yr
+
qk
[
8
]
*
zr
;
qkr
[
2
]
=
atomJ
.
labFrameQuadrupole_XY
*
xr
+
atomJ
.
labFrameQuadrupole_YY
*
yr
+
atomJ
.
labFrameQuadrupole_YZ
*
zr
;
qkr
[
3
]
=
qk
[
3
]
*
xr
+
qk
[
6
]
*
yr
+
qk
[
9
]
*
zr
;
qkr
[
3
]
=
atomJ
.
labFrameQuadrupole_XZ
*
xr
+
atomJ
.
labFrameQuadrupole_YZ
*
yr
+
atomJ
.
labFrameQuadrupole_ZZ
*
zr
;
#if 0
#if 0
qiqkr[1] =
qi[1]*qkr[1] + qi[4]*qkr[2] + qi[7]
*qkr[3];
qiqkr[1] =
atomI.labFrameQuadrupole_XX*qkr[1] + atomI.labFrameQuadrupole_XY*qkr[2] + atomI.labFrameQuadrupole_XZ
*qkr[3];
qiqkr[2] =
qi[2]*qkr[1] + qi[5]*qkr[2] + qi[8]
*qkr[3];
qiqkr[2] =
atomI.labFrameQuadrupole_XY*qkr[1] + atomI.labFrameQuadrupole_YY*qkr[2] + atomI.labFrameQuadrupole_YZ
*qkr[3];
qiqkr[3] =
qi[3]*qkr[1] + qi[6]*qkr[2] + qi[9]
*qkr[3];
qiqkr[3] =
atomI.labFrameQuadrupole_XZ*qkr[1] + atomI.labFrameQuadrupole_YZ*qkr[2] + atomI.labFrameQuadrupole_ZZ
*qkr[3];
qkqir[1] =
qk[1]*qir[1] + qk[4]*qir[2] + qk[7]
*qir[3];
qkqir[1] =
atomJ.labFrameQuadrupole_XX*qir[1] + atomJ.labFrameQuadrupole_XY*qir[2] + atomJ.labFrameQuadrupole_XZ
*qir[3];
qkqir[2] =
qk[2]*qir[1] + qk[5]*qir[2] + qk[8]
*qir[3];
qkqir[2] =
atomJ.labFrameQuadrupole_XY*qir[1] + atomJ.labFrameQuadrupole_YY*qir[2] + atomJ.labFrameQuadrupole_YZ
*qir[3];
qkqir[3] =
qk[3]*qir[1] + qk[6]*qir[2] + qk[9]
*qir[3];
qkqir[3] =
atomJ.labFrameQuadrupole_XZ*qir[1] + atomJ.labFrameQuadrupole_YZ*qir[2] + atomJ.labFrameQuadrupole_ZZ
*qir[3];
qixqk[1] =
qi[2]*qk[3] + qi[5]*qk[6] + qi[8]*qk[9]
-
qixqk[1] =
atomI.labFrameQuadrupole_XY*atomJ.labFrameQuadrupole_XZ + atomI.labFrameQuadrupole_YY*atomJ.labFrameQuadrupole_YZ + atomI.labFrameQuadrupole_YZ*atomJ.labFrameQuadrupole_ZZ
-
qi[3]*qk[2] - qi[6]*qk[5] - qi[9]*qk[8]
;
atomI.labFrameQuadrupole_XZ*atomJ.labFrameQuadrupole_XY - atomI.labFrameQuadrupole_YZ*atomJ.labFrameQuadrupole_YY - atomI.labFrameQuadrupole_ZZ*atomJ.labFrameQuadrupole_YZ
;
qixqk[2] =
qi[3]*qk[1] + qi[6]*qk[4] + qi[9]*qk[7]
-
qixqk[2] =
atomI.labFrameQuadrupole_XZ*atomJ.labFrameQuadrupole_XX + atomI.labFrameQuadrupole_YZ*atomJ.labFrameQuadrupole_XY + atomI.labFrameQuadrupole_ZZ*atomJ.labFrameQuadrupole_XZ
-
qi[1]*qk[3] - qi[4]*qk[6] - qi[7]*qk[9]
;
atomI.labFrameQuadrupole_XX*atomJ.labFrameQuadrupole_XZ - atomI.labFrameQuadrupole_XY*atomJ.labFrameQuadrupole_YZ - atomI.labFrameQuadrupole_XZ*atomJ.labFrameQuadrupole_ZZ
;
qixqk[3] =
qi[1]*qk[2] + qi[4]*qk[5] + qi[7]*qk[8]
-
qixqk[3] =
atomI.labFrameQuadrupole_XX*atomJ.labFrameQuadrupole_XY + atomI.labFrameQuadrupole_XY*atomJ.labFrameQuadrupole_YY + atomI.labFrameQuadrupole_XZ*atomJ.labFrameQuadrupole_YZ
-
qi[2]*qk[1] - qi[5]*qk[4] - qi[8]*qk[7]
;
atomI.labFrameQuadrupole_XY*atomJ.labFrameQuadrupole_XX - atomI.labFrameQuadrupole_YY*atomJ.labFrameQuadrupole_XY - atomI.labFrameQuadrupole_YZ*atomJ.labFrameQuadrupole_XZ
;
#endif
#endif
rxqir
[
1
]
=
yr
*
qir
[
3
]
-
zr
*
qir
[
2
];
rxqir
[
1
]
=
yr
*
qir
[
3
]
-
zr
*
qir
[
2
];
...
@@ -404,21 +302,21 @@ __device__ void calculateKirkwoodEDiffPairIxn_kernel( float4 atomCoordinatesI,
...
@@ -404,21 +302,21 @@ __device__ void calculateKirkwoodEDiffPairIxn_kernel( float4 atomCoordinatesI,
qkrxqir[2] = qkr[3]*qir[1] - qkr[1]*qir[3];
qkrxqir[2] = qkr[3]*qir[1] - qkr[1]*qir[3];
qkrxqir[3] = qkr[1]*qir[2] - qkr[2]*qir[1];
qkrxqir[3] = qkr[1]*qir[2] - qkr[2]*qir[1];
qidk[1] =
qi[1]*dk[1] + qi[4]*dk[2] + qi[7]*dk[3
];
qidk[1] =
atomI.labFrameQuadrupole_XX*atomJ.labFrameDipole[0] + atomI.labFrameQuadrupole_XY*atomJ.labFrameDipole[1] + atomI.labFrameQuadrupole_XZ*atomJ.labFrameDipole[2
];
qidk[2] =
qi[2]*dk[1] + qi[5]*dk[2] + qi[8]*dk[3
];
qidk[2] =
atomI.labFrameQuadrupole_XY*atomJ.labFrameDipole[0] + atomI.labFrameQuadrupole_YY*atomJ.labFrameDipole[1] + atomI.labFrameQuadrupole_YZ*atomJ.labFrameDipole[2
];
qidk[3] =
qi[3]*dk[1] + qi[6]*dk[2] + qi[9]*dk[3
];
qidk[3] =
atomI.labFrameQuadrupole_XZ*atomJ.labFrameDipole[0] + atomI.labFrameQuadrupole_YZ*atomJ.labFrameDipole[1] + atomI.labFrameQuadrupole_ZZ*atomJ.labFrameDipole[2
];
qkdi[1] =
qk[1]*di[1] + qk[4]*di[2] + qk[7]*di[3
];
qkdi[1] =
atomJ.labFrameQuadrupole_XX*atomI.labFrameDipole[0] + atomJ.labFrameQuadrupole_XY*atomI.labFrameDipole[1] + atomJ.labFrameQuadrupole_XZ*atomI.labFrameDipole[2
];
qkdi[2] =
qk[2]*di[1] + qk[5]*di[2] + qk[8]*di[3
];
qkdi[2] =
atomJ.labFrameQuadrupole_XY*atomI.labFrameDipole[0] + atomJ.labFrameQuadrupole_YY*atomI.labFrameDipole[1] + atomJ.labFrameQuadrupole_YZ*atomI.labFrameDipole[2
];
qkdi[3] =
qk[3]*di[1] + qk[6]*di[2] + qk[9]*di[3
];
qkdi[3] =
atomJ.labFrameQuadrupole_XZ*atomI.labFrameDipole[0] + atomJ.labFrameQuadrupole_YZ*atomI.labFrameDipole[1] + atomJ.labFrameQuadrupole_ZZ*atomI.labFrameDipole[2
];
dixqkr[1] =
di[2]*qkr[3] - di[3
]*qkr[2];
dixqkr[1] =
atomI.labFrameDipole[1]*qkr[3] - atomI.labFrameDipole[2
]*qkr[2];
dixqkr[2] =
di[3]*qkr[1] - di[1
]*qkr[3];
dixqkr[2] =
atomI.labFrameDipole[2]*qkr[1] - atomI.labFrameDipole[0
]*qkr[3];
dixqkr[3] =
di[1]*qkr[2] - di[2
]*qkr[1];
dixqkr[3] =
atomI.labFrameDipole[0]*qkr[2] - atomI.labFrameDipole[1
]*qkr[1];
dkxqir[1] =
dk[2]*qir[3] - dk[3
]*qir[2];
dkxqir[1] =
atomJ.labFrameDipole[1]*qir[3] - atomJ.labFrameDipole[2
]*qir[2];
dkxqir[2] =
dk[3]*qir[1] - dk[1
]*qir[3];
dkxqir[2] =
atomJ.labFrameDipole[2]*qir[1] - atomJ.labFrameDipole[0
]*qir[3];
dkxqir[3] =
dk[1]*qir[2] - dk[2
]*qir[1];
dkxqir[3] =
atomJ.labFrameDipole[0]*qir[2] - atomJ.labFrameDipole[1
]*qir[1];
rxqidk[1] = yr*qidk[3] - zr*qidk[2];
rxqidk[1] = yr*qidk[3] - zr*qidk[2];
rxqidk[2] = zr*qidk[1] - xr*qidk[3];
rxqidk[2] = zr*qidk[1] - xr*qidk[3];
...
@@ -431,60 +329,60 @@ __device__ void calculateKirkwoodEDiffPairIxn_kernel( float4 atomCoordinatesI,
...
@@ -431,60 +329,60 @@ __device__ void calculateKirkwoodEDiffPairIxn_kernel( float4 atomCoordinatesI,
// get intermediate variables for permanent energy terms
// get intermediate variables for permanent energy terms
sc
[
3
]
=
di
[
1
]
*
xr
+
di
[
2
]
*
yr
+
di
[
3
]
*
zr
;
sc
[
3
]
=
atomI
.
labFrameDipole
[
0
]
*
xr
+
atomI
.
labFrameDipole
[
1
]
*
yr
+
atomI
.
labFrameDipole
[
2
]
*
zr
;
sc
[
4
]
=
dk
[
1
]
*
xr
+
dk
[
2
]
*
yr
+
dk
[
3
]
*
zr
;
sc
[
4
]
=
atomJ
.
labFrameDipole
[
0
]
*
xr
+
atomJ
.
labFrameDipole
[
1
]
*
yr
+
atomJ
.
labFrameDipole
[
2
]
*
zr
;
sc
[
5
]
=
qir
[
1
]
*
xr
+
qir
[
2
]
*
yr
+
qir
[
3
]
*
zr
;
sc
[
5
]
=
qir
[
1
]
*
xr
+
qir
[
2
]
*
yr
+
qir
[
3
]
*
zr
;
sc
[
6
]
=
qkr
[
1
]
*
xr
+
qkr
[
2
]
*
yr
+
qkr
[
3
]
*
zr
;
sc
[
6
]
=
qkr
[
1
]
*
xr
+
qkr
[
2
]
*
yr
+
qkr
[
3
]
*
zr
;
// construct auxiliary vectors for induced terms
// construct auxiliary vectors for induced terms
dixuk
[
1
]
=
di
[
2
]
*
uindsJ
[
2
]
-
di
[
3
]
*
uindsJ
[
1
];
dixuk
[
1
]
=
atomI
.
labFrameDipole
[
1
]
*
atomJ
.
inducedDipoleS
[
2
]
-
atomI
.
labFrameDipole
[
2
]
*
atomJ
.
inducedDipoleS
[
1
];
dixuk
[
2
]
=
di
[
3
]
*
uindsJ
[
0
]
-
di
[
1
]
*
uindsJ
[
2
];
dixuk
[
2
]
=
atomI
.
labFrameDipole
[
2
]
*
atomJ
.
inducedDipoleS
[
0
]
-
atomI
.
labFrameDipole
[
0
]
*
atomJ
.
inducedDipoleS
[
2
];
dixuk
[
3
]
=
di
[
1
]
*
uindsJ
[
1
]
-
di
[
2
]
*
uindsJ
[
0
];
dixuk
[
3
]
=
atomI
.
labFrameDipole
[
0
]
*
atomJ
.
inducedDipoleS
[
1
]
-
atomI
.
labFrameDipole
[
1
]
*
atomJ
.
inducedDipoleS
[
0
];
dkxui
[
1
]
=
dk
[
2
]
*
uindsI
[
2
]
-
dk
[
3
]
*
uindsI
[
1
];
dkxui
[
1
]
=
atomJ
.
labFrameDipole
[
1
]
*
atomI
.
inducedDipoleS
[
2
]
-
atomJ
.
labFrameDipole
[
2
]
*
atomI
.
inducedDipoleS
[
1
];
dkxui
[
2
]
=
dk
[
3
]
*
uindsI
[
0
]
-
dk
[
1
]
*
uindsI
[
2
];
dkxui
[
2
]
=
atomJ
.
labFrameDipole
[
2
]
*
atomI
.
inducedDipoleS
[
0
]
-
atomJ
.
labFrameDipole
[
0
]
*
atomI
.
inducedDipoleS
[
2
];
dkxui
[
3
]
=
dk
[
1
]
*
uindsI
[
1
]
-
dk
[
2
]
*
uindsI
[
0
];
dkxui
[
3
]
=
atomJ
.
labFrameDipole
[
0
]
*
atomI
.
inducedDipoleS
[
1
]
-
atomJ
.
labFrameDipole
[
1
]
*
atomI
.
inducedDipoleS
[
0
];
dixukp
[
1
]
=
di
[
2
]
*
uinpsJ
[
2
]
-
di
[
3
]
*
uinpsJ
[
1
];
dixukp
[
1
]
=
atomI
.
labFrameDipole
[
1
]
*
atomJ
.
inducedDipolePS
[
2
]
-
atomI
.
labFrameDipole
[
2
]
*
atomJ
.
inducedDipolePS
[
1
];
dixukp
[
2
]
=
di
[
3
]
*
uinpsJ
[
0
]
-
di
[
1
]
*
uinpsJ
[
2
];
dixukp
[
2
]
=
atomI
.
labFrameDipole
[
2
]
*
atomJ
.
inducedDipolePS
[
0
]
-
atomI
.
labFrameDipole
[
0
]
*
atomJ
.
inducedDipolePS
[
2
];
dixukp
[
3
]
=
di
[
1
]
*
uinpsJ
[
1
]
-
di
[
2
]
*
uinpsJ
[
0
];
dixukp
[
3
]
=
atomI
.
labFrameDipole
[
0
]
*
atomJ
.
inducedDipolePS
[
1
]
-
atomI
.
labFrameDipole
[
1
]
*
atomJ
.
inducedDipolePS
[
0
];
dkxuip
[
1
]
=
dk
[
2
]
*
uinpsI
[
2
]
-
dk
[
3
]
*
uinpsI
[
1
];
dkxuip
[
1
]
=
atomJ
.
labFrameDipole
[
1
]
*
atomI
.
inducedDipolePS
[
2
]
-
atomJ
.
labFrameDipole
[
2
]
*
atomI
.
inducedDipolePS
[
1
];
dkxuip
[
2
]
=
dk
[
3
]
*
uinpsI
[
0
]
-
dk
[
1
]
*
uinpsI
[
2
];
dkxuip
[
2
]
=
atomJ
.
labFrameDipole
[
2
]
*
atomI
.
inducedDipolePS
[
0
]
-
atomJ
.
labFrameDipole
[
0
]
*
atomI
.
inducedDipolePS
[
2
];
dkxuip
[
3
]
=
dk
[
1
]
*
uinpsI
[
1
]
-
dk
[
2
]
*
uinpsI
[
0
];
dkxuip
[
3
]
=
atomJ
.
labFrameDipole
[
0
]
*
atomI
.
inducedDipolePS
[
1
]
-
atomJ
.
labFrameDipole
[
1
]
*
atomI
.
inducedDipolePS
[
0
];
qiuk
[
1
]
=
qi
[
1
]
*
uindsJ
[
0
]
+
qi
[
4
]
*
uindsJ
[
1
]
+
qi
[
7
]
*
uindsJ
[
2
];
qiuk
[
1
]
=
atomI
.
labFrameQuadrupole_XX
*
atomJ
.
inducedDipoleS
[
0
]
+
atomI
.
labFrameQuadrupole_XY
*
atomJ
.
inducedDipoleS
[
1
]
+
atomI
.
labFrameQuadrupole_XZ
*
atomJ
.
inducedDipoleS
[
2
];
qiuk
[
2
]
=
qi
[
2
]
*
uindsJ
[
0
]
+
qi
[
5
]
*
uindsJ
[
1
]
+
qi
[
8
]
*
uindsJ
[
2
];
qiuk
[
2
]
=
atomI
.
labFrameQuadrupole_XY
*
atomJ
.
inducedDipoleS
[
0
]
+
atomI
.
labFrameQuadrupole_YY
*
atomJ
.
inducedDipoleS
[
1
]
+
atomI
.
labFrameQuadrupole_YZ
*
atomJ
.
inducedDipoleS
[
2
];
qiuk
[
3
]
=
qi
[
3
]
*
uindsJ
[
0
]
+
qi
[
6
]
*
uindsJ
[
1
]
+
qi
[
9
]
*
uindsJ
[
2
];
qiuk
[
3
]
=
atomI
.
labFrameQuadrupole_XZ
*
atomJ
.
inducedDipoleS
[
0
]
+
atomI
.
labFrameQuadrupole_YZ
*
atomJ
.
inducedDipoleS
[
1
]
+
atomI
.
labFrameQuadrupole_ZZ
*
atomJ
.
inducedDipoleS
[
2
];
qkui
[
1
]
=
qk
[
1
]
*
uindsI
[
0
]
+
qk
[
4
]
*
uindsI
[
1
]
+
qk
[
7
]
*
uindsI
[
2
];
qkui
[
1
]
=
atomJ
.
labFrameQuadrupole_XX
*
atomI
.
inducedDipoleS
[
0
]
+
atomJ
.
labFrameQuadrupole_XY
*
atomI
.
inducedDipoleS
[
1
]
+
atomJ
.
labFrameQuadrupole_XZ
*
atomI
.
inducedDipoleS
[
2
];
qkui
[
2
]
=
qk
[
2
]
*
uindsI
[
0
]
+
qk
[
5
]
*
uindsI
[
1
]
+
qk
[
8
]
*
uindsI
[
2
];
qkui
[
2
]
=
atomJ
.
labFrameQuadrupole_XY
*
atomI
.
inducedDipoleS
[
0
]
+
atomJ
.
labFrameQuadrupole_YY
*
atomI
.
inducedDipoleS
[
1
]
+
atomJ
.
labFrameQuadrupole_YZ
*
atomI
.
inducedDipoleS
[
2
];
qkui
[
3
]
=
qk
[
3
]
*
uindsI
[
0
]
+
qk
[
6
]
*
uindsI
[
1
]
+
qk
[
9
]
*
uindsI
[
2
];
qkui
[
3
]
=
atomJ
.
labFrameQuadrupole_XZ
*
atomI
.
inducedDipoleS
[
0
]
+
atomJ
.
labFrameQuadrupole_YZ
*
atomI
.
inducedDipoleS
[
1
]
+
atomJ
.
labFrameQuadrupole_ZZ
*
atomI
.
inducedDipoleS
[
2
];
qiukp
[
1
]
=
qi
[
1
]
*
uinpsJ
[
0
]
+
qi
[
4
]
*
uinpsJ
[
1
]
+
qi
[
7
]
*
uinpsJ
[
2
];
qiukp
[
1
]
=
atomI
.
labFrameQuadrupole_XX
*
atomJ
.
inducedDipolePS
[
0
]
+
atomI
.
labFrameQuadrupole_XY
*
atomJ
.
inducedDipolePS
[
1
]
+
atomI
.
labFrameQuadrupole_XZ
*
atomJ
.
inducedDipolePS
[
2
];
qiukp
[
2
]
=
qi
[
2
]
*
uinpsJ
[
0
]
+
qi
[
5
]
*
uinpsJ
[
1
]
+
qi
[
8
]
*
uinpsJ
[
2
];
qiukp
[
2
]
=
atomI
.
labFrameQuadrupole_XY
*
atomJ
.
inducedDipolePS
[
0
]
+
atomI
.
labFrameQuadrupole_YY
*
atomJ
.
inducedDipolePS
[
1
]
+
atomI
.
labFrameQuadrupole_YZ
*
atomJ
.
inducedDipolePS
[
2
];
qiukp
[
3
]
=
qi
[
3
]
*
uinpsJ
[
0
]
+
qi
[
6
]
*
uinpsJ
[
1
]
+
qi
[
9
]
*
uinpsJ
[
2
];
qiukp
[
3
]
=
atomI
.
labFrameQuadrupole_XZ
*
atomJ
.
inducedDipolePS
[
0
]
+
atomI
.
labFrameQuadrupole_YZ
*
atomJ
.
inducedDipolePS
[
1
]
+
atomI
.
labFrameQuadrupole_ZZ
*
atomJ
.
inducedDipolePS
[
2
];
qkuip
[
1
]
=
qk
[
1
]
*
uinpsI
[
0
]
+
qk
[
4
]
*
uinpsI
[
1
]
+
qk
[
7
]
*
uinpsI
[
2
];
qkuip
[
1
]
=
atomJ
.
labFrameQuadrupole_XX
*
atomI
.
inducedDipolePS
[
0
]
+
atomJ
.
labFrameQuadrupole_XY
*
atomI
.
inducedDipolePS
[
1
]
+
atomJ
.
labFrameQuadrupole_XZ
*
atomI
.
inducedDipolePS
[
2
];
qkuip
[
2
]
=
qk
[
2
]
*
uinpsI
[
0
]
+
qk
[
5
]
*
uinpsI
[
1
]
+
qk
[
8
]
*
uinpsI
[
2
];
qkuip
[
2
]
=
atomJ
.
labFrameQuadrupole_XY
*
atomI
.
inducedDipolePS
[
0
]
+
atomJ
.
labFrameQuadrupole_YY
*
atomI
.
inducedDipolePS
[
1
]
+
atomJ
.
labFrameQuadrupole_YZ
*
atomI
.
inducedDipolePS
[
2
];
qkuip
[
3
]
=
qk
[
3
]
*
uinpsI
[
0
]
+
qk
[
6
]
*
uinpsI
[
1
]
+
qk
[
9
]
*
uinpsI
[
2
];
qkuip
[
3
]
=
atomJ
.
labFrameQuadrupole_XZ
*
atomI
.
inducedDipolePS
[
0
]
+
atomJ
.
labFrameQuadrupole_YZ
*
atomI
.
inducedDipolePS
[
1
]
+
atomJ
.
labFrameQuadrupole_ZZ
*
atomI
.
inducedDipolePS
[
2
];
uixqkr
[
1
]
=
uindsI
[
1
]
*
qkr
[
3
]
-
uindsI
[
2
]
*
qkr
[
2
];
uixqkr
[
1
]
=
atomI
.
inducedDipoleS
[
1
]
*
qkr
[
3
]
-
atomI
.
inducedDipoleS
[
2
]
*
qkr
[
2
];
uixqkr
[
2
]
=
uindsI
[
2
]
*
qkr
[
1
]
-
uindsI
[
0
]
*
qkr
[
3
];
uixqkr
[
2
]
=
atomI
.
inducedDipoleS
[
2
]
*
qkr
[
1
]
-
atomI
.
inducedDipoleS
[
0
]
*
qkr
[
3
];
uixqkr
[
3
]
=
uindsI
[
0
]
*
qkr
[
2
]
-
uindsI
[
1
]
*
qkr
[
1
];
uixqkr
[
3
]
=
atomI
.
inducedDipoleS
[
0
]
*
qkr
[
2
]
-
atomI
.
inducedDipoleS
[
1
]
*
qkr
[
1
];
ukxqir
[
1
]
=
uindsJ
[
1
]
*
qir
[
3
]
-
uindsJ
[
2
]
*
qir
[
2
];
ukxqir
[
1
]
=
atomJ
.
inducedDipoleS
[
1
]
*
qir
[
3
]
-
atomJ
.
inducedDipoleS
[
2
]
*
qir
[
2
];
ukxqir
[
2
]
=
uindsJ
[
2
]
*
qir
[
1
]
-
uindsJ
[
0
]
*
qir
[
3
];
ukxqir
[
2
]
=
atomJ
.
inducedDipoleS
[
2
]
*
qir
[
1
]
-
atomJ
.
inducedDipoleS
[
0
]
*
qir
[
3
];
ukxqir
[
3
]
=
uindsJ
[
0
]
*
qir
[
2
]
-
uindsJ
[
1
]
*
qir
[
1
];
ukxqir
[
3
]
=
atomJ
.
inducedDipoleS
[
0
]
*
qir
[
2
]
-
atomJ
.
inducedDipoleS
[
1
]
*
qir
[
1
];
uixqkrp
[
1
]
=
uinpsI
[
1
]
*
qkr
[
3
]
-
uinpsI
[
2
]
*
qkr
[
2
];
uixqkrp
[
1
]
=
atomI
.
inducedDipolePS
[
1
]
*
qkr
[
3
]
-
atomI
.
inducedDipolePS
[
2
]
*
qkr
[
2
];
uixqkrp
[
2
]
=
uinpsI
[
2
]
*
qkr
[
1
]
-
uinpsI
[
0
]
*
qkr
[
3
];
uixqkrp
[
2
]
=
atomI
.
inducedDipolePS
[
2
]
*
qkr
[
1
]
-
atomI
.
inducedDipolePS
[
0
]
*
qkr
[
3
];
uixqkrp
[
3
]
=
uinpsI
[
0
]
*
qkr
[
2
]
-
uinpsI
[
1
]
*
qkr
[
1
];
uixqkrp
[
3
]
=
atomI
.
inducedDipolePS
[
0
]
*
qkr
[
2
]
-
atomI
.
inducedDipolePS
[
1
]
*
qkr
[
1
];
ukxqirp
[
1
]
=
uinpsJ
[
1
]
*
qir
[
3
]
-
uinpsJ
[
2
]
*
qir
[
2
];
ukxqirp
[
1
]
=
atomJ
.
inducedDipolePS
[
1
]
*
qir
[
3
]
-
atomJ
.
inducedDipolePS
[
2
]
*
qir
[
2
];
ukxqirp
[
2
]
=
uinpsJ
[
2
]
*
qir
[
1
]
-
uinpsJ
[
0
]
*
qir
[
3
];
ukxqirp
[
2
]
=
atomJ
.
inducedDipolePS
[
2
]
*
qir
[
1
]
-
atomJ
.
inducedDipolePS
[
0
]
*
qir
[
3
];
ukxqirp
[
3
]
=
uinpsJ
[
0
]
*
qir
[
2
]
-
uinpsJ
[
1
]
*
qir
[
1
];
ukxqirp
[
3
]
=
atomJ
.
inducedDipolePS
[
0
]
*
qir
[
2
]
-
atomJ
.
inducedDipolePS
[
1
]
*
qir
[
1
];
rxqiuk
[
1
]
=
yr
*
qiuk
[
3
]
-
zr
*
qiuk
[
2
];
rxqiuk
[
1
]
=
yr
*
qiuk
[
3
]
-
zr
*
qiuk
[
2
];
rxqiuk
[
2
]
=
zr
*
qiuk
[
1
]
-
xr
*
qiuk
[
3
];
rxqiuk
[
2
]
=
zr
*
qiuk
[
1
]
-
xr
*
qiuk
[
3
];
...
@@ -504,41 +402,41 @@ __device__ void calculateKirkwoodEDiffPairIxn_kernel( float4 atomCoordinatesI,
...
@@ -504,41 +402,41 @@ __device__ void calculateKirkwoodEDiffPairIxn_kernel( float4 atomCoordinatesI,
// get intermediate variables for induction energy terms
// get intermediate variables for induction energy terms
sci
[
1
]
=
uindsI
[
0
]
*
dk
[
1
]
+
uindsI
[
1
]
*
dk
[
2
]
+
sci
[
1
]
=
atomI
.
inducedDipoleS
[
0
]
*
atomJ
.
labFrameDipole
[
0
]
+
atomI
.
inducedDipoleS
[
1
]
*
atomJ
.
labFrameDipole
[
1
]
+
uindsI
[
2
]
*
dk
[
3
]
+
di
[
1
]
*
uindsJ
[
0
]
+
atomI
.
inducedDipoleS
[
2
]
*
atomJ
.
labFrameDipole
[
2
]
+
atomI
.
labFrameDipole
[
0
]
*
atomJ
.
inducedDipoleS
[
0
]
+
di
[
2
]
*
uindsJ
[
1
]
+
di
[
3
]
*
uindsJ
[
2
];
atomI
.
labFrameDipole
[
1
]
*
atomJ
.
inducedDipoleS
[
1
]
+
atomI
.
labFrameDipole
[
2
]
*
atomJ
.
inducedDipoleS
[
2
];
sci
[
2
]
=
uindsI
[
0
]
*
uindsJ
[
0
]
+
uindsI
[
1
]
*
uindsJ
[
1
]
+
uindsI
[
2
]
*
uindsJ
[
2
];
sci
[
2
]
=
atomI
.
inducedDipoleS
[
0
]
*
atomJ
.
inducedDipoleS
[
0
]
+
atomI
.
inducedDipoleS
[
1
]
*
atomJ
.
inducedDipoleS
[
1
]
+
atomI
.
inducedDipoleS
[
2
]
*
atomJ
.
inducedDipoleS
[
2
];
sci
[
3
]
=
uindsI
[
0
]
*
xr
+
uindsI
[
1
]
*
yr
+
uindsI
[
2
]
*
zr
;
sci
[
3
]
=
atomI
.
inducedDipoleS
[
0
]
*
xr
+
atomI
.
inducedDipoleS
[
1
]
*
yr
+
atomI
.
inducedDipoleS
[
2
]
*
zr
;
sci
[
4
]
=
uindsJ
[
0
]
*
xr
+
uindsJ
[
1
]
*
yr
+
uindsJ
[
2
]
*
zr
;
sci
[
4
]
=
atomJ
.
inducedDipoleS
[
0
]
*
xr
+
atomJ
.
inducedDipoleS
[
1
]
*
yr
+
atomJ
.
inducedDipoleS
[
2
]
*
zr
;
sci
[
7
]
=
qir
[
1
]
*
uindsJ
[
0
]
+
qir
[
2
]
*
uindsJ
[
1
]
+
qir
[
3
]
*
uindsJ
[
2
];
sci
[
7
]
=
qir
[
1
]
*
atomJ
.
inducedDipoleS
[
0
]
+
qir
[
2
]
*
atomJ
.
inducedDipoleS
[
1
]
+
qir
[
3
]
*
atomJ
.
inducedDipoleS
[
2
];
sci
[
8
]
=
qkr
[
1
]
*
uindsI
[
0
]
+
qkr
[
2
]
*
uindsI
[
1
]
+
qkr
[
3
]
*
uindsI
[
2
];
sci
[
8
]
=
qkr
[
1
]
*
atomI
.
inducedDipoleS
[
0
]
+
qkr
[
2
]
*
atomI
.
inducedDipoleS
[
1
]
+
qkr
[
3
]
*
atomI
.
inducedDipoleS
[
2
];
scip
[
1
]
=
uinpsI
[
0
]
*
dk
[
1
]
+
uinpsI
[
1
]
*
dk
[
2
]
+
scip
[
1
]
=
atomI
.
inducedDipolePS
[
0
]
*
atomJ
.
labFrameDipole
[
0
]
+
atomI
.
inducedDipolePS
[
1
]
*
atomJ
.
labFrameDipole
[
1
]
+
uinpsI
[
2
]
*
dk
[
3
]
+
di
[
1
]
*
uinpsJ
[
0
]
+
atomI
.
inducedDipolePS
[
2
]
*
atomJ
.
labFrameDipole
[
2
]
+
atomI
.
labFrameDipole
[
0
]
*
atomJ
.
inducedDipolePS
[
0
]
+
di
[
2
]
*
uinpsJ
[
1
]
+
di
[
3
]
*
uinpsJ
[
2
];
atomI
.
labFrameDipole
[
1
]
*
atomJ
.
inducedDipolePS
[
1
]
+
atomI
.
labFrameDipole
[
2
]
*
atomJ
.
inducedDipolePS
[
2
];
scip
[
2
]
=
uindsI
[
0
]
*
uinpsJ
[
0
]
+
uindsI
[
1
]
*
uinpsJ
[
1
]
+
scip
[
2
]
=
atomI
.
inducedDipoleS
[
0
]
*
atomJ
.
inducedDipolePS
[
0
]
+
atomI
.
inducedDipoleS
[
1
]
*
atomJ
.
inducedDipolePS
[
1
]
+
uindsI
[
2
]
*
uinpsJ
[
2
]
+
uinpsI
[
0
]
*
uindsJ
[
0
]
+
atomI
.
inducedDipoleS
[
2
]
*
atomJ
.
inducedDipolePS
[
2
]
+
atomI
.
inducedDipolePS
[
0
]
*
atomJ
.
inducedDipoleS
[
0
]
+
uinpsI
[
1
]
*
uindsJ
[
1
]
+
uinpsI
[
2
]
*
uindsJ
[
2
];
atomI
.
inducedDipolePS
[
1
]
*
atomJ
.
inducedDipoleS
[
1
]
+
atomI
.
inducedDipolePS
[
2
]
*
atomJ
.
inducedDipoleS
[
2
];
scip
[
3
]
=
uinpsI
[
0
]
*
xr
+
uinpsI
[
1
]
*
yr
+
uinpsI
[
2
]
*
zr
;
scip
[
3
]
=
atomI
.
inducedDipolePS
[
0
]
*
xr
+
atomI
.
inducedDipolePS
[
1
]
*
yr
+
atomI
.
inducedDipolePS
[
2
]
*
zr
;
scip
[
4
]
=
uinpsJ
[
0
]
*
xr
+
uinpsJ
[
1
]
*
yr
+
uinpsJ
[
2
]
*
zr
;
scip
[
4
]
=
atomJ
.
inducedDipolePS
[
0
]
*
xr
+
atomJ
.
inducedDipolePS
[
1
]
*
yr
+
atomJ
.
inducedDipolePS
[
2
]
*
zr
;
scip
[
7
]
=
qir
[
1
]
*
uinpsJ
[
0
]
+
qir
[
2
]
*
uinpsJ
[
1
]
+
qir
[
3
]
*
uinpsJ
[
2
];
scip
[
7
]
=
qir
[
1
]
*
atomJ
.
inducedDipolePS
[
0
]
+
qir
[
2
]
*
atomJ
.
inducedDipolePS
[
1
]
+
qir
[
3
]
*
atomJ
.
inducedDipolePS
[
2
];
scip
[
8
]
=
qkr
[
1
]
*
uinpsI
[
0
]
+
qkr
[
2
]
*
uinpsI
[
1
]
+
qkr
[
3
]
*
uinpsI
[
2
];
scip
[
8
]
=
qkr
[
1
]
*
atomI
.
inducedDipolePS
[
0
]
+
qkr
[
2
]
*
atomI
.
inducedDipolePS
[
1
]
+
qkr
[
3
]
*
atomI
.
inducedDipolePS
[
2
];
// calculate the gl functions for potential energy
// calculate the gl functions for potential energy
gli
[
1
]
=
ck
*
sci
[
3
]
-
ci
*
sci
[
4
];
gli
[
1
]
=
atomJ
.
q
*
sci
[
3
]
-
atomI
.
q
*
sci
[
4
];
gli
[
2
]
=
-
sc
[
3
]
*
sci
[
4
]
-
sci
[
3
]
*
sc
[
4
];
gli
[
2
]
=
-
sc
[
3
]
*
sci
[
4
]
-
sci
[
3
]
*
sc
[
4
];
gli
[
3
]
=
sci
[
3
]
*
sc
[
6
]
-
sci
[
4
]
*
sc
[
5
];
gli
[
3
]
=
sci
[
3
]
*
sc
[
6
]
-
sci
[
4
]
*
sc
[
5
];
gli
[
6
]
=
sci
[
1
];
gli
[
6
]
=
sci
[
1
];
gli
[
7
]
=
2.0
f
*
(
sci
[
7
]
-
sci
[
8
]);
gli
[
7
]
=
2.0
f
*
(
sci
[
7
]
-
sci
[
8
]);
glip
[
1
]
=
ck
*
scip
[
3
]
-
ci
*
scip
[
4
];
glip
[
1
]
=
atomJ
.
q
*
scip
[
3
]
-
atomI
.
q
*
scip
[
4
];
glip
[
2
]
=
-
sc
[
3
]
*
scip
[
4
]
-
scip
[
3
]
*
sc
[
4
];
glip
[
2
]
=
-
sc
[
3
]
*
scip
[
4
]
-
scip
[
3
]
*
sc
[
4
];
glip
[
3
]
=
scip
[
3
]
*
sc
[
6
]
-
scip
[
4
]
*
sc
[
5
];
glip
[
3
]
=
scip
[
3
]
*
sc
[
6
]
-
scip
[
4
]
*
sc
[
5
];
glip
[
6
]
=
scip
[
1
];
glip
[
6
]
=
scip
[
1
];
...
@@ -559,8 +457,8 @@ __device__ void calculateKirkwoodEDiffPairIxn_kernel( float4 atomCoordinatesI,
...
@@ -559,8 +457,8 @@ __device__ void calculateKirkwoodEDiffPairIxn_kernel( float4 atomCoordinatesI,
(
sci
[
3
]
*
scip
[
4
]
+
scip
[
3
]
*
sci
[
4
])
*
scale5i
)
+
(
sci
[
3
]
*
scip
[
4
]
+
scip
[
3
]
*
sci
[
4
])
*
scale5i
)
+
0.5
f
*
rr9
*
(
gli
[
3
]
*
psc7
+
glip
[
3
]
*
dsc7
);
0.5
f
*
rr9
*
(
gli
[
3
]
*
psc7
+
glip
[
3
]
*
dsc7
);
gfi
[
2
]
=
-
rr3
*
ck
+
rr5
*
sc
[
4
]
-
rr7
*
sc
[
6
];
gfi
[
2
]
=
-
rr3
*
atomJ
.
q
+
rr5
*
sc
[
4
]
-
rr7
*
sc
[
6
];
gfi
[
3
]
=
rr3
*
ci
+
rr5
*
sc
[
3
]
+
rr7
*
sc
[
5
];
gfi
[
3
]
=
rr3
*
atomI
.
q
+
rr5
*
sc
[
3
]
+
rr7
*
sc
[
5
];
gfi
[
4
]
=
2.0
f
*
rr5
;
gfi
[
4
]
=
2.0
f
*
rr5
;
gfi
[
5
]
=
rr7
*
(
sci
[
4
]
*
psc7
+
scip
[
4
]
*
dsc7
);
gfi
[
5
]
=
rr7
*
(
sci
[
4
]
*
psc7
+
scip
[
4
]
*
dsc7
);
gfi
[
6
]
=
-
rr7
*
(
sci
[
3
]
*
psc7
+
scip
[
3
]
*
dsc7
);
gfi
[
6
]
=
-
rr7
*
(
sci
[
3
]
*
psc7
+
scip
[
3
]
*
dsc7
);
...
@@ -568,46 +466,46 @@ __device__ void calculateKirkwoodEDiffPairIxn_kernel( float4 atomCoordinatesI,
...
@@ -568,46 +466,46 @@ __device__ void calculateKirkwoodEDiffPairIxn_kernel( float4 atomCoordinatesI,
// get the induced force;
// get the induced force;
ftm2i
[
1
]
=
gfi
[
1
]
*
xr
+
0.5
f
*
ftm2i
[
1
]
=
gfi
[
1
]
*
xr
+
0.5
f
*
(
-
rr3
*
ck
*
(
uindsI
[
0
]
*
psc3
+
uinpsI
[
0
]
*
dsc3
)
(
-
rr3
*
atomJ
.
q
*
(
atomI
.
inducedDipoleS
[
0
]
*
psc3
+
atomI
.
inducedDipolePS
[
0
]
*
dsc3
)
+
rr5
*
sc
[
4
]
*
(
uindsI
[
0
]
*
psc5
+
uinpsI
[
0
]
*
dsc5
)
+
rr5
*
sc
[
4
]
*
(
atomI
.
inducedDipoleS
[
0
]
*
psc5
+
atomI
.
inducedDipolePS
[
0
]
*
dsc5
)
-
rr7
*
sc
[
6
]
*
(
uindsI
[
0
]
*
psc7
+
uinpsI
[
0
]
*
dsc7
))
-
rr7
*
sc
[
6
]
*
(
atomI
.
inducedDipoleS
[
0
]
*
psc7
+
atomI
.
inducedDipolePS
[
0
]
*
dsc7
))
+
(
rr3
*
ci
*
(
uindsJ
[
0
]
*
psc3
+
uinpsJ
[
0
]
*
dsc3
)
+
(
rr3
*
atomI
.
q
*
(
atomJ
.
inducedDipoleS
[
0
]
*
psc3
+
atomJ
.
inducedDipolePS
[
0
]
*
dsc3
)
+
rr5
*
sc
[
3
]
*
(
uindsJ
[
0
]
*
psc5
+
uinpsJ
[
0
]
*
dsc5
)
+
rr5
*
sc
[
3
]
*
(
atomJ
.
inducedDipoleS
[
0
]
*
psc5
+
atomJ
.
inducedDipolePS
[
0
]
*
dsc5
)
+
rr7
*
sc
[
5
]
*
(
uindsJ
[
0
]
*
psc7
+
uinpsJ
[
0
]
*
dsc7
))
*
0.5
f
+
rr7
*
sc
[
5
]
*
(
atomJ
.
inducedDipoleS
[
0
]
*
psc7
+
atomJ
.
inducedDipolePS
[
0
]
*
dsc7
))
*
0.5
f
+
rr5
*
scale5i
*
(
sci
[
4
]
*
uinpsI
[
0
]
+
scip
[
4
]
*
uindsI
[
0
]
+
rr5
*
scale5i
*
(
sci
[
4
]
*
atomI
.
inducedDipolePS
[
0
]
+
scip
[
4
]
*
atomI
.
inducedDipoleS
[
0
]
+
sci
[
3
]
*
uinpsJ
[
0
]
+
scip
[
3
]
*
uindsJ
[
0
])
*
0.5
f
+
sci
[
3
]
*
atomJ
.
inducedDipolePS
[
0
]
+
scip
[
3
]
*
atomJ
.
inducedDipoleS
[
0
])
*
0.5
f
+
0.5
f
*
(
sci
[
4
]
*
psc5
+
scip
[
4
]
*
dsc5
)
*
rr5
*
di
[
1
]
+
0.5
f
*
(
sci
[
4
]
*
psc5
+
scip
[
4
]
*
dsc5
)
*
rr5
*
atomI
.
labFrameDipole
[
0
]
+
0.5
f
*
(
sci
[
3
]
*
psc5
+
scip
[
3
]
*
dsc5
)
*
rr5
*
dk
[
1
]
+
0.5
f
*
(
sci
[
3
]
*
psc5
+
scip
[
3
]
*
dsc5
)
*
rr5
*
atomJ
.
labFrameDipole
[
0
]
+
0.5
f
*
gfi
[
4
]
*
((
qkui
[
1
]
-
qiuk
[
1
])
*
psc5
+
0.5
f
*
gfi
[
4
]
*
((
qkui
[
1
]
-
qiuk
[
1
])
*
psc5
+
(
qkuip
[
1
]
-
qiukp
[
1
])
*
dsc5
)
+
(
qkuip
[
1
]
-
qiukp
[
1
])
*
dsc5
)
+
gfi
[
5
]
*
qir
[
1
]
+
gfi
[
6
]
*
qkr
[
1
];
+
gfi
[
5
]
*
qir
[
1
]
+
gfi
[
6
]
*
qkr
[
1
];
ftm2i
[
2
]
=
gfi
[
1
]
*
yr
+
0.5
f
*
ftm2i
[
2
]
=
gfi
[
1
]
*
yr
+
0.5
f
*
(
-
rr3
*
ck
*
(
uindsI
[
1
]
*
psc3
+
uinpsI
[
1
]
*
dsc3
)
(
-
rr3
*
atomJ
.
q
*
(
atomI
.
inducedDipoleS
[
1
]
*
psc3
+
atomI
.
inducedDipolePS
[
1
]
*
dsc3
)
+
rr5
*
sc
[
4
]
*
(
uindsI
[
1
]
*
psc5
+
uinpsI
[
1
]
*
dsc5
)
+
rr5
*
sc
[
4
]
*
(
atomI
.
inducedDipoleS
[
1
]
*
psc5
+
atomI
.
inducedDipolePS
[
1
]
*
dsc5
)
-
rr7
*
sc
[
6
]
*
(
uindsI
[
1
]
*
psc7
+
uinpsI
[
1
]
*
dsc7
))
-
rr7
*
sc
[
6
]
*
(
atomI
.
inducedDipoleS
[
1
]
*
psc7
+
atomI
.
inducedDipolePS
[
1
]
*
dsc7
))
+
(
rr3
*
ci
*
(
uindsJ
[
1
]
*
psc3
+
uinpsJ
[
1
]
*
dsc3
)
+
(
rr3
*
atomI
.
q
*
(
atomJ
.
inducedDipoleS
[
1
]
*
psc3
+
atomJ
.
inducedDipolePS
[
1
]
*
dsc3
)
+
rr5
*
sc
[
3
]
*
(
uindsJ
[
1
]
*
psc5
+
uinpsJ
[
1
]
*
dsc5
)
+
rr5
*
sc
[
3
]
*
(
atomJ
.
inducedDipoleS
[
1
]
*
psc5
+
atomJ
.
inducedDipolePS
[
1
]
*
dsc5
)
+
rr7
*
sc
[
5
]
*
(
uindsJ
[
1
]
*
psc7
+
uinpsJ
[
1
]
*
dsc7
))
*
0.5
f
+
rr7
*
sc
[
5
]
*
(
atomJ
.
inducedDipoleS
[
1
]
*
psc7
+
atomJ
.
inducedDipolePS
[
1
]
*
dsc7
))
*
0.5
f
+
rr5
*
scale5i
*
(
sci
[
4
]
*
uinpsI
[
1
]
+
scip
[
4
]
*
uindsI
[
1
]
+
rr5
*
scale5i
*
(
sci
[
4
]
*
atomI
.
inducedDipolePS
[
1
]
+
scip
[
4
]
*
atomI
.
inducedDipoleS
[
1
]
+
sci
[
3
]
*
uinpsJ
[
1
]
+
scip
[
3
]
*
uindsJ
[
1
])
*
0.5
f
+
sci
[
3
]
*
atomJ
.
inducedDipolePS
[
1
]
+
scip
[
3
]
*
atomJ
.
inducedDipoleS
[
1
])
*
0.5
f
+
0.5
f
*
(
sci
[
4
]
*
psc5
+
scip
[
4
]
*
dsc5
)
*
rr5
*
di
[
2
]
+
0.5
f
*
(
sci
[
4
]
*
psc5
+
scip
[
4
]
*
dsc5
)
*
rr5
*
atomI
.
labFrameDipole
[
1
]
+
0.5
f
*
(
sci
[
3
]
*
psc5
+
scip
[
3
]
*
dsc5
)
*
rr5
*
dk
[
2
]
+
0.5
f
*
(
sci
[
3
]
*
psc5
+
scip
[
3
]
*
dsc5
)
*
rr5
*
atomJ
.
labFrameDipole
[
1
]
+
0.5
f
*
gfi
[
4
]
*
((
qkui
[
2
]
-
qiuk
[
2
])
*
psc5
+
0.5
f
*
gfi
[
4
]
*
((
qkui
[
2
]
-
qiuk
[
2
])
*
psc5
+
(
qkuip
[
2
]
-
qiukp
[
2
])
*
dsc5
)
+
(
qkuip
[
2
]
-
qiukp
[
2
])
*
dsc5
)
+
gfi
[
5
]
*
qir
[
2
]
+
gfi
[
6
]
*
qkr
[
2
];
+
gfi
[
5
]
*
qir
[
2
]
+
gfi
[
6
]
*
qkr
[
2
];
ftm2i
[
3
]
=
gfi
[
1
]
*
zr
+
0.5
f
*
ftm2i
[
3
]
=
gfi
[
1
]
*
zr
+
0.5
f
*
(
-
rr3
*
ck
*
(
uindsI
[
2
]
*
psc3
+
uinpsI
[
2
]
*
dsc3
)
(
-
rr3
*
atomJ
.
q
*
(
atomI
.
inducedDipoleS
[
2
]
*
psc3
+
atomI
.
inducedDipolePS
[
2
]
*
dsc3
)
+
rr5
*
sc
[
4
]
*
(
uindsI
[
2
]
*
psc5
+
uinpsI
[
2
]
*
dsc5
)
+
rr5
*
sc
[
4
]
*
(
atomI
.
inducedDipoleS
[
2
]
*
psc5
+
atomI
.
inducedDipolePS
[
2
]
*
dsc5
)
-
rr7
*
sc
[
6
]
*
(
uindsI
[
2
]
*
psc7
+
uinpsI
[
2
]
*
dsc7
))
-
rr7
*
sc
[
6
]
*
(
atomI
.
inducedDipoleS
[
2
]
*
psc7
+
atomI
.
inducedDipolePS
[
2
]
*
dsc7
))
+
(
rr3
*
ci
*
(
uindsJ
[
2
]
*
psc3
+
uinpsJ
[
2
]
*
dsc3
)
+
(
rr3
*
atomI
.
q
*
(
atomJ
.
inducedDipoleS
[
2
]
*
psc3
+
atomJ
.
inducedDipolePS
[
2
]
*
dsc3
)
+
rr5
*
sc
[
3
]
*
(
uindsJ
[
2
]
*
psc5
+
uinpsJ
[
2
]
*
dsc5
)
+
rr5
*
sc
[
3
]
*
(
atomJ
.
inducedDipoleS
[
2
]
*
psc5
+
atomJ
.
inducedDipolePS
[
2
]
*
dsc5
)
+
rr7
*
sc
[
5
]
*
(
uindsJ
[
2
]
*
psc7
+
uinpsJ
[
2
]
*
dsc7
))
*
0.5
f
+
rr7
*
sc
[
5
]
*
(
atomJ
.
inducedDipoleS
[
2
]
*
psc7
+
atomJ
.
inducedDipolePS
[
2
]
*
dsc7
))
*
0.5
f
+
rr5
*
scale5i
*
(
sci
[
4
]
*
uinpsI
[
2
]
+
scip
[
4
]
*
uindsI
[
2
]
+
rr5
*
scale5i
*
(
sci
[
4
]
*
atomI
.
inducedDipolePS
[
2
]
+
scip
[
4
]
*
atomI
.
inducedDipoleS
[
2
]
+
sci
[
3
]
*
uinpsJ
[
2
]
+
scip
[
3
]
*
uindsJ
[
2
])
*
0.5
f
+
sci
[
3
]
*
atomJ
.
inducedDipolePS
[
2
]
+
scip
[
3
]
*
atomJ
.
inducedDipoleS
[
2
])
*
0.5
f
+
0.5
f
*
(
sci
[
4
]
*
psc5
+
scip
[
4
]
*
dsc5
)
*
rr5
*
di
[
3
]
+
0.5
f
*
(
sci
[
4
]
*
psc5
+
scip
[
4
]
*
dsc5
)
*
rr5
*
atomI
.
labFrameDipole
[
2
]
+
0.5
f
*
(
sci
[
3
]
*
psc5
+
scip
[
3
]
*
dsc5
)
*
rr5
*
dk
[
3
]
+
0.5
f
*
(
sci
[
3
]
*
psc5
+
scip
[
3
]
*
dsc5
)
*
rr5
*
atomJ
.
labFrameDipole
[
2
]
+
0.5
f
*
gfi
[
4
]
*
((
qkui
[
3
]
-
qiuk
[
3
])
*
psc5
+
0.5
f
*
gfi
[
4
]
*
((
qkui
[
3
]
-
qiuk
[
3
])
*
psc5
+
(
qkuip
[
3
]
-
qiukp
[
3
])
*
dsc5
)
+
(
qkuip
[
3
]
-
qiukp
[
3
])
*
dsc5
)
+
gfi
[
5
]
*
qir
[
3
]
+
gfi
[
6
]
*
qkr
[
3
];
+
gfi
[
5
]
*
qir
[
3
]
+
gfi
[
6
]
*
qkr
[
3
];
...
@@ -656,14 +554,14 @@ __device__ void calculateKirkwoodEDiffPairIxn_kernel( float4 atomCoordinatesI,
...
@@ -656,14 +554,14 @@ __device__ void calculateKirkwoodEDiffPairIxn_kernel( float4 atomCoordinatesI,
gfd = 0.5f * (rr5*scip[2]*scale3i;
gfd = 0.5f * (rr5*scip[2]*scale3i;
& - rr7*(scip[3]*sci[4]+sci[3]*scip[4])*scale5i);
& - rr7*(scip[3]*sci[4]+sci[3]*scip[4])*scale5i);
fdir[1] = gfd*xr + 0.5f*rr5*scale5i;
fdir[1] = gfd*xr + 0.5f*rr5*scale5i;
& * (sci[4]*
uinpsI[0]+scip[4]*uindsI
[0];
& * (sci[4]*
atomI.inducedDipolePS[0]+scip[4]*atomI.inducedDipoleS
[0];
& +sci[3]*
uinpsJ[0]+scip[3]*uindsJ
[0]);
& +sci[3]*
atomJ.inducedDipolePS[0]+scip[3]*atomJ.inducedDipoleS
[0]);
fdir[2] = gfd*yr + 0.5f*rr5*scale5i;
fdir[2] = gfd*yr + 0.5f*rr5*scale5i;
& * (sci[4]*
uinpsI[1]+scip[4]*uindsI
[1];
& * (sci[4]*
atomI.inducedDipolePS[1]+scip[4]*atomI.inducedDipoleS
[1];
& +sci[3]*
uinpsJ[1]+scip[3]*uindsJ
[1]);
& +sci[3]*
atomJ.inducedDipolePS[1]+scip[3]*atomJ.inducedDipoleS
[1]);
fdir[3] = gfd*zr + 0.5f*rr5*scale5i;
fdir[3] = gfd*zr + 0.5f*rr5*scale5i;
& * (sci[4]*
uinpsI[2]+scip[4]*uindsI
[2];
& * (sci[4]*
atomI.inducedDipolePS[2]+scip[4]*atomI.inducedDipoleS
[2];
& +sci[3]*
uinpsJ[2]+scip[3]*uindsJ
[2]);
& +sci[3]*
atomJ.inducedDipolePS[2]+scip[3]*atomJ.inducedDipoleS
[2]);
ftm2i[1] = ftm2i[1] - fdir[1] + findmp[1];
ftm2i[1] = ftm2i[1] - fdir[1] + findmp[1];
ftm2i[2] = ftm2i[2] - fdir[2] + findmp[2];
ftm2i[2] = ftm2i[2] - fdir[2] + findmp[2];
ftm2i[3] = ftm2i[3] - fdir[3] + findmp[3];
ftm2i[3] = ftm2i[3] - fdir[3] + findmp[3];
...
@@ -739,53 +637,53 @@ __device__ void calculateKirkwoodEDiffPairIxn_kernel( float4 atomCoordinatesI,
...
@@ -739,53 +637,53 @@ __device__ void calculateKirkwoodEDiffPairIxn_kernel( float4 atomCoordinatesI,
// construct auxiliary vectors for induced terms
// construct auxiliary vectors for induced terms
dixuk
[
1
]
=
di
[
2
]
*
uindJ
[
2
]
-
di
[
3
]
*
uindJ
[
1
];
dixuk
[
1
]
=
atomI
.
labFrameDipole
[
1
]
*
atomJ
.
inducedDipole
[
2
]
-
atomI
.
labFrameDipole
[
2
]
*
atomJ
.
inducedDipole
[
1
];
dixuk
[
2
]
=
di
[
3
]
*
uindJ
[
0
]
-
di
[
1
]
*
uindJ
[
2
];
dixuk
[
2
]
=
atomI
.
labFrameDipole
[
2
]
*
atomJ
.
inducedDipole
[
0
]
-
atomI
.
labFrameDipole
[
0
]
*
atomJ
.
inducedDipole
[
2
];
dixuk
[
3
]
=
di
[
1
]
*
uindJ
[
1
]
-
di
[
2
]
*
uindJ
[
0
];
dixuk
[
3
]
=
atomI
.
labFrameDipole
[
0
]
*
atomJ
.
inducedDipole
[
1
]
-
atomI
.
labFrameDipole
[
1
]
*
atomJ
.
inducedDipole
[
0
];
dkxui
[
1
]
=
dk
[
2
]
*
uindI
[
2
]
-
dk
[
3
]
*
uindI
[
1
];
dkxui
[
1
]
=
atomJ
.
labFrameDipole
[
1
]
*
atomI
.
inducedDipole
[
2
]
-
atomJ
.
labFrameDipole
[
2
]
*
atomI
.
inducedDipole
[
1
];
dkxui
[
2
]
=
dk
[
3
]
*
uindI
[
0
]
-
dk
[
1
]
*
uindI
[
2
];
dkxui
[
2
]
=
atomJ
.
labFrameDipole
[
2
]
*
atomI
.
inducedDipole
[
0
]
-
atomJ
.
labFrameDipole
[
0
]
*
atomI
.
inducedDipole
[
2
];
dkxui
[
3
]
=
dk
[
1
]
*
uindI
[
1
]
-
dk
[
2
]
*
uindI
[
0
];
dkxui
[
3
]
=
atomJ
.
labFrameDipole
[
0
]
*
atomI
.
inducedDipole
[
1
]
-
atomJ
.
labFrameDipole
[
1
]
*
atomI
.
inducedDipole
[
0
];
dixukp
[
1
]
=
di
[
2
]
*
uinpJ
[
2
]
-
di
[
3
]
*
uinpJ
[
1
];
dixukp
[
1
]
=
atomI
.
labFrameDipole
[
1
]
*
atomJ
.
inducedDipoleP
[
2
]
-
atomI
.
labFrameDipole
[
2
]
*
atomJ
.
inducedDipoleP
[
1
];
dixukp
[
2
]
=
di
[
3
]
*
uinpJ
[
0
]
-
di
[
1
]
*
uinpJ
[
2
];
dixukp
[
2
]
=
atomI
.
labFrameDipole
[
2
]
*
atomJ
.
inducedDipoleP
[
0
]
-
atomI
.
labFrameDipole
[
0
]
*
atomJ
.
inducedDipoleP
[
2
];
dixukp
[
3
]
=
di
[
1
]
*
uinpJ
[
1
]
-
di
[
2
]
*
uinpJ
[
0
];
dixukp
[
3
]
=
atomI
.
labFrameDipole
[
0
]
*
atomJ
.
inducedDipoleP
[
1
]
-
atomI
.
labFrameDipole
[
1
]
*
atomJ
.
inducedDipoleP
[
0
];
dkxuip
[
1
]
=
dk
[
2
]
*
uinpI
[
2
]
-
dk
[
3
]
*
uinpI
[
1
];
dkxuip
[
1
]
=
atomJ
.
labFrameDipole
[
1
]
*
atomI
.
inducedDipoleP
[
2
]
-
atomJ
.
labFrameDipole
[
2
]
*
atomI
.
inducedDipoleP
[
1
];
dkxuip
[
2
]
=
dk
[
3
]
*
uinpI
[
0
]
-
dk
[
1
]
*
uinpI
[
2
];
dkxuip
[
2
]
=
atomJ
.
labFrameDipole
[
2
]
*
atomI
.
inducedDipoleP
[
0
]
-
atomJ
.
labFrameDipole
[
0
]
*
atomI
.
inducedDipoleP
[
2
];
dkxuip
[
3
]
=
dk
[
1
]
*
uinpI
[
1
]
-
dk
[
2
]
*
uinpI
[
0
];
dkxuip
[
3
]
=
atomJ
.
labFrameDipole
[
0
]
*
atomI
.
inducedDipoleP
[
1
]
-
atomJ
.
labFrameDipole
[
1
]
*
atomI
.
inducedDipoleP
[
0
];
qiuk
[
1
]
=
qi
[
1
]
*
uindJ
[
0
]
+
qi
[
4
]
*
uindJ
[
1
]
+
qi
[
7
]
*
uindJ
[
2
];
qiuk
[
1
]
=
atomI
.
labFrameQuadrupole_XX
*
atomJ
.
inducedDipole
[
0
]
+
atomI
.
labFrameQuadrupole_XY
*
atomJ
.
inducedDipole
[
1
]
+
atomI
.
labFrameQuadrupole_XZ
*
atomJ
.
inducedDipole
[
2
];
qiuk
[
2
]
=
qi
[
2
]
*
uindJ
[
0
]
+
qi
[
5
]
*
uindJ
[
1
]
+
qi
[
8
]
*
uindJ
[
2
];
qiuk
[
2
]
=
atomI
.
labFrameQuadrupole_XY
*
atomJ
.
inducedDipole
[
0
]
+
atomI
.
labFrameQuadrupole_YY
*
atomJ
.
inducedDipole
[
1
]
+
atomI
.
labFrameQuadrupole_YZ
*
atomJ
.
inducedDipole
[
2
];
qiuk
[
3
]
=
qi
[
3
]
*
uindJ
[
0
]
+
qi
[
6
]
*
uindJ
[
1
]
+
qi
[
9
]
*
uindJ
[
2
];
qiuk
[
3
]
=
atomI
.
labFrameQuadrupole_XZ
*
atomJ
.
inducedDipole
[
0
]
+
atomI
.
labFrameQuadrupole_YZ
*
atomJ
.
inducedDipole
[
1
]
+
atomI
.
labFrameQuadrupole_ZZ
*
atomJ
.
inducedDipole
[
2
];
qkui
[
1
]
=
qk
[
1
]
*
uindI
[
0
]
+
qk
[
4
]
*
uindI
[
1
]
+
qk
[
7
]
*
uindI
[
2
];
qkui
[
1
]
=
atomJ
.
labFrameQuadrupole_XX
*
atomI
.
inducedDipole
[
0
]
+
atomJ
.
labFrameQuadrupole_XY
*
atomI
.
inducedDipole
[
1
]
+
atomJ
.
labFrameQuadrupole_XZ
*
atomI
.
inducedDipole
[
2
];
qkui
[
2
]
=
qk
[
2
]
*
uindI
[
0
]
+
qk
[
5
]
*
uindI
[
1
]
+
qk
[
8
]
*
uindI
[
2
];
qkui
[
2
]
=
atomJ
.
labFrameQuadrupole_XY
*
atomI
.
inducedDipole
[
0
]
+
atomJ
.
labFrameQuadrupole_YY
*
atomI
.
inducedDipole
[
1
]
+
atomJ
.
labFrameQuadrupole_YZ
*
atomI
.
inducedDipole
[
2
];
qkui
[
3
]
=
qk
[
3
]
*
uindI
[
0
]
+
qk
[
6
]
*
uindI
[
1
]
+
qk
[
9
]
*
uindI
[
2
];
qkui
[
3
]
=
atomJ
.
labFrameQuadrupole_XZ
*
atomI
.
inducedDipole
[
0
]
+
atomJ
.
labFrameQuadrupole_YZ
*
atomI
.
inducedDipole
[
1
]
+
atomJ
.
labFrameQuadrupole_ZZ
*
atomI
.
inducedDipole
[
2
];
qiukp
[
1
]
=
qi
[
1
]
*
uinpJ
[
0
]
+
qi
[
4
]
*
uinpJ
[
1
]
+
qi
[
7
]
*
uinpJ
[
2
];
qiukp
[
1
]
=
atomI
.
labFrameQuadrupole_XX
*
atomJ
.
inducedDipoleP
[
0
]
+
atomI
.
labFrameQuadrupole_XY
*
atomJ
.
inducedDipoleP
[
1
]
+
atomI
.
labFrameQuadrupole_XZ
*
atomJ
.
inducedDipoleP
[
2
];
qiukp
[
2
]
=
qi
[
2
]
*
uinpJ
[
0
]
+
qi
[
5
]
*
uinpJ
[
1
]
+
qi
[
8
]
*
uinpJ
[
2
];
qiukp
[
2
]
=
atomI
.
labFrameQuadrupole_XY
*
atomJ
.
inducedDipoleP
[
0
]
+
atomI
.
labFrameQuadrupole_YY
*
atomJ
.
inducedDipoleP
[
1
]
+
atomI
.
labFrameQuadrupole_YZ
*
atomJ
.
inducedDipoleP
[
2
];
qiukp
[
3
]
=
qi
[
3
]
*
uinpJ
[
0
]
+
qi
[
6
]
*
uinpJ
[
1
]
+
qi
[
9
]
*
uinpJ
[
2
];
qiukp
[
3
]
=
atomI
.
labFrameQuadrupole_XZ
*
atomJ
.
inducedDipoleP
[
0
]
+
atomI
.
labFrameQuadrupole_YZ
*
atomJ
.
inducedDipoleP
[
1
]
+
atomI
.
labFrameQuadrupole_ZZ
*
atomJ
.
inducedDipoleP
[
2
];
qkuip
[
1
]
=
qk
[
1
]
*
uinpI
[
0
]
+
qk
[
4
]
*
uinpI
[
1
]
+
qk
[
7
]
*
uinpI
[
2
];
qkuip
[
1
]
=
atomJ
.
labFrameQuadrupole_XX
*
atomI
.
inducedDipoleP
[
0
]
+
atomJ
.
labFrameQuadrupole_XY
*
atomI
.
inducedDipoleP
[
1
]
+
atomJ
.
labFrameQuadrupole_XZ
*
atomI
.
inducedDipoleP
[
2
];
qkuip
[
2
]
=
qk
[
2
]
*
uinpI
[
0
]
+
qk
[
5
]
*
uinpI
[
1
]
+
qk
[
8
]
*
uinpI
[
2
];
qkuip
[
2
]
=
atomJ
.
labFrameQuadrupole_XY
*
atomI
.
inducedDipoleP
[
0
]
+
atomJ
.
labFrameQuadrupole_YY
*
atomI
.
inducedDipoleP
[
1
]
+
atomJ
.
labFrameQuadrupole_YZ
*
atomI
.
inducedDipoleP
[
2
];
qkuip
[
3
]
=
qk
[
3
]
*
uinpI
[
0
]
+
qk
[
6
]
*
uinpI
[
1
]
+
qk
[
9
]
*
uinpI
[
2
];
qkuip
[
3
]
=
atomJ
.
labFrameQuadrupole_XZ
*
atomI
.
inducedDipoleP
[
0
]
+
atomJ
.
labFrameQuadrupole_YZ
*
atomI
.
inducedDipoleP
[
1
]
+
atomJ
.
labFrameQuadrupole_ZZ
*
atomI
.
inducedDipoleP
[
2
];
uixqkr
[
1
]
=
uindI
[
1
]
*
qkr
[
3
]
-
uindI
[
2
]
*
qkr
[
2
];
uixqkr
[
1
]
=
atomI
.
inducedDipole
[
1
]
*
qkr
[
3
]
-
atomI
.
inducedDipole
[
2
]
*
qkr
[
2
];
uixqkr
[
2
]
=
uindI
[
2
]
*
qkr
[
1
]
-
uindI
[
0
]
*
qkr
[
3
];
uixqkr
[
2
]
=
atomI
.
inducedDipole
[
2
]
*
qkr
[
1
]
-
atomI
.
inducedDipole
[
0
]
*
qkr
[
3
];
uixqkr
[
3
]
=
uindI
[
0
]
*
qkr
[
2
]
-
uindI
[
1
]
*
qkr
[
1
];
uixqkr
[
3
]
=
atomI
.
inducedDipole
[
0
]
*
qkr
[
2
]
-
atomI
.
inducedDipole
[
1
]
*
qkr
[
1
];
ukxqir
[
1
]
=
uindJ
[
1
]
*
qir
[
3
]
-
uindJ
[
2
]
*
qir
[
2
];
ukxqir
[
1
]
=
atomJ
.
inducedDipole
[
1
]
*
qir
[
3
]
-
atomJ
.
inducedDipole
[
2
]
*
qir
[
2
];
ukxqir
[
2
]
=
uindJ
[
2
]
*
qir
[
1
]
-
uindJ
[
0
]
*
qir
[
3
];
ukxqir
[
2
]
=
atomJ
.
inducedDipole
[
2
]
*
qir
[
1
]
-
atomJ
.
inducedDipole
[
0
]
*
qir
[
3
];
ukxqir
[
3
]
=
uindJ
[
0
]
*
qir
[
2
]
-
uindJ
[
1
]
*
qir
[
1
];
ukxqir
[
3
]
=
atomJ
.
inducedDipole
[
0
]
*
qir
[
2
]
-
atomJ
.
inducedDipole
[
1
]
*
qir
[
1
];
uixqkrp
[
1
]
=
uinpI
[
1
]
*
qkr
[
3
]
-
uinpI
[
2
]
*
qkr
[
2
];
uixqkrp
[
1
]
=
atomI
.
inducedDipoleP
[
1
]
*
qkr
[
3
]
-
atomI
.
inducedDipoleP
[
2
]
*
qkr
[
2
];
uixqkrp
[
2
]
=
uinpI
[
2
]
*
qkr
[
1
]
-
uinpI
[
0
]
*
qkr
[
3
];
uixqkrp
[
2
]
=
atomI
.
inducedDipoleP
[
2
]
*
qkr
[
1
]
-
atomI
.
inducedDipoleP
[
0
]
*
qkr
[
3
];
uixqkrp
[
3
]
=
uinpI
[
0
]
*
qkr
[
2
]
-
uinpI
[
1
]
*
qkr
[
1
];
uixqkrp
[
3
]
=
atomI
.
inducedDipoleP
[
0
]
*
qkr
[
2
]
-
atomI
.
inducedDipoleP
[
1
]
*
qkr
[
1
];
ukxqirp
[
1
]
=
uinpJ
[
1
]
*
qir
[
3
]
-
uinpJ
[
2
]
*
qir
[
2
];
ukxqirp
[
1
]
=
atomJ
.
inducedDipoleP
[
1
]
*
qir
[
3
]
-
atomJ
.
inducedDipoleP
[
2
]
*
qir
[
2
];
ukxqirp
[
2
]
=
uinpJ
[
2
]
*
qir
[
1
]
-
uinpJ
[
0
]
*
qir
[
3
];
ukxqirp
[
2
]
=
atomJ
.
inducedDipoleP
[
2
]
*
qir
[
1
]
-
atomJ
.
inducedDipoleP
[
0
]
*
qir
[
3
];
ukxqirp
[
3
]
=
uinpJ
[
0
]
*
qir
[
2
]
-
uinpJ
[
1
]
*
qir
[
1
];
ukxqirp
[
3
]
=
atomJ
.
inducedDipoleP
[
0
]
*
qir
[
2
]
-
atomJ
.
inducedDipoleP
[
1
]
*
qir
[
1
];
rxqiuk
[
1
]
=
yr
*
qiuk
[
3
]
-
zr
*
qiuk
[
2
];
rxqiuk
[
1
]
=
yr
*
qiuk
[
3
]
-
zr
*
qiuk
[
2
];
rxqiuk
[
2
]
=
zr
*
qiuk
[
1
]
-
xr
*
qiuk
[
3
];
rxqiuk
[
2
]
=
zr
*
qiuk
[
1
]
-
xr
*
qiuk
[
3
];
...
@@ -805,36 +703,36 @@ __device__ void calculateKirkwoodEDiffPairIxn_kernel( float4 atomCoordinatesI,
...
@@ -805,36 +703,36 @@ __device__ void calculateKirkwoodEDiffPairIxn_kernel( float4 atomCoordinatesI,
// get intermediate variables for induction energy terms
// get intermediate variables for induction energy terms
sci
[
1
]
=
uindI
[
0
]
*
dk
[
1
]
+
uindI
[
1
]
*
dk
[
2
]
sci
[
1
]
=
atomI
.
inducedDipole
[
0
]
*
atomJ
.
labFrameDipole
[
0
]
+
atomI
.
inducedDipole
[
1
]
*
atomJ
.
labFrameDipole
[
1
]
+
uindI
[
2
]
*
dk
[
3
]
+
di
[
1
]
*
uindJ
[
0
]
+
atomI
.
inducedDipole
[
2
]
*
atomJ
.
labFrameDipole
[
2
]
+
atomI
.
labFrameDipole
[
0
]
*
atomJ
.
inducedDipole
[
0
]
+
di
[
2
]
*
uindJ
[
1
]
+
di
[
3
]
*
uindJ
[
2
];
+
atomI
.
labFrameDipole
[
1
]
*
atomJ
.
inducedDipole
[
1
]
+
atomI
.
labFrameDipole
[
2
]
*
atomJ
.
inducedDipole
[
2
];
sci
[
2
]
=
uindI
[
0
]
*
uindJ
[
0
]
+
uindI
[
1
]
*
uindJ
[
1
]
+
uindI
[
2
]
*
uindJ
[
2
];
sci
[
2
]
=
atomI
.
inducedDipole
[
0
]
*
atomJ
.
inducedDipole
[
0
]
+
atomI
.
inducedDipole
[
1
]
*
atomJ
.
inducedDipole
[
1
]
+
atomI
.
inducedDipole
[
2
]
*
atomJ
.
inducedDipole
[
2
];
sci
[
3
]
=
uindI
[
0
]
*
xr
+
uindI
[
1
]
*
yr
+
uindI
[
2
]
*
zr
;
sci
[
3
]
=
atomI
.
inducedDipole
[
0
]
*
xr
+
atomI
.
inducedDipole
[
1
]
*
yr
+
atomI
.
inducedDipole
[
2
]
*
zr
;
sci
[
4
]
=
uindJ
[
0
]
*
xr
+
uindJ
[
1
]
*
yr
+
uindJ
[
2
]
*
zr
;
sci
[
4
]
=
atomJ
.
inducedDipole
[
0
]
*
xr
+
atomJ
.
inducedDipole
[
1
]
*
yr
+
atomJ
.
inducedDipole
[
2
]
*
zr
;
sci
[
7
]
=
qir
[
1
]
*
uindJ
[
0
]
+
qir
[
2
]
*
uindJ
[
1
]
+
qir
[
3
]
*
uindJ
[
2
];
sci
[
7
]
=
qir
[
1
]
*
atomJ
.
inducedDipole
[
0
]
+
qir
[
2
]
*
atomJ
.
inducedDipole
[
1
]
+
qir
[
3
]
*
atomJ
.
inducedDipole
[
2
];
sci
[
8
]
=
qkr
[
1
]
*
uindI
[
0
]
+
qkr
[
2
]
*
uindI
[
1
]
+
qkr
[
3
]
*
uindI
[
2
];
sci
[
8
]
=
qkr
[
1
]
*
atomI
.
inducedDipole
[
0
]
+
qkr
[
2
]
*
atomI
.
inducedDipole
[
1
]
+
qkr
[
3
]
*
atomI
.
inducedDipole
[
2
];
scip
[
1
]
=
uinpI
[
0
]
*
dk
[
1
]
+
uinpI
[
1
]
*
dk
[
2
]
+
uinpI
[
2
]
*
dk
[
3
]
+
di
[
1
]
*
uinpJ
[
0
]
+
di
[
2
]
*
uinpJ
[
1
]
+
di
[
3
]
*
uinpJ
[
2
];
scip
[
1
]
=
atomI
.
inducedDipoleP
[
0
]
*
atomJ
.
labFrameDipole
[
0
]
+
atomI
.
inducedDipoleP
[
1
]
*
atomJ
.
labFrameDipole
[
1
]
+
atomI
.
inducedDipoleP
[
2
]
*
atomJ
.
labFrameDipole
[
2
]
+
atomI
.
labFrameDipole
[
0
]
*
atomJ
.
inducedDipoleP
[
0
]
+
atomI
.
labFrameDipole
[
1
]
*
atomJ
.
inducedDipoleP
[
1
]
+
atomI
.
labFrameDipole
[
2
]
*
atomJ
.
inducedDipoleP
[
2
];
scip
[
2
]
=
uindI
[
0
]
*
uinpJ
[
0
]
+
uindI
[
1
]
*
uinpJ
[
1
]
+
uindI
[
2
]
*
uinpJ
[
2
]
+
uinpI
[
0
]
*
uindJ
[
0
]
+
uinpI
[
1
]
*
uindJ
[
1
]
+
uinpI
[
2
]
*
uindJ
[
2
];
scip
[
2
]
=
atomI
.
inducedDipole
[
0
]
*
atomJ
.
inducedDipoleP
[
0
]
+
atomI
.
inducedDipole
[
1
]
*
atomJ
.
inducedDipoleP
[
1
]
+
atomI
.
inducedDipole
[
2
]
*
atomJ
.
inducedDipoleP
[
2
]
+
atomI
.
inducedDipoleP
[
0
]
*
atomJ
.
inducedDipole
[
0
]
+
atomI
.
inducedDipoleP
[
1
]
*
atomJ
.
inducedDipole
[
1
]
+
atomI
.
inducedDipoleP
[
2
]
*
atomJ
.
inducedDipole
[
2
];
scip
[
3
]
=
uinpI
[
0
]
*
xr
+
uinpI
[
1
]
*
yr
+
uinpI
[
2
]
*
zr
;
scip
[
3
]
=
atomI
.
inducedDipoleP
[
0
]
*
xr
+
atomI
.
inducedDipoleP
[
1
]
*
yr
+
atomI
.
inducedDipoleP
[
2
]
*
zr
;
scip
[
4
]
=
uinpJ
[
0
]
*
xr
+
uinpJ
[
1
]
*
yr
+
uinpJ
[
2
]
*
zr
;
scip
[
4
]
=
atomJ
.
inducedDipoleP
[
0
]
*
xr
+
atomJ
.
inducedDipoleP
[
1
]
*
yr
+
atomJ
.
inducedDipoleP
[
2
]
*
zr
;
scip
[
7
]
=
qir
[
1
]
*
uinpJ
[
0
]
+
qir
[
2
]
*
uinpJ
[
1
]
+
qir
[
3
]
*
uinpJ
[
2
];
scip
[
7
]
=
qir
[
1
]
*
atomJ
.
inducedDipoleP
[
0
]
+
qir
[
2
]
*
atomJ
.
inducedDipoleP
[
1
]
+
qir
[
3
]
*
atomJ
.
inducedDipoleP
[
2
];
scip
[
8
]
=
qkr
[
1
]
*
uinpI
[
0
]
+
qkr
[
2
]
*
uinpI
[
1
]
+
qkr
[
3
]
*
uinpI
[
2
];
scip
[
8
]
=
qkr
[
1
]
*
atomI
.
inducedDipoleP
[
0
]
+
qkr
[
2
]
*
atomI
.
inducedDipoleP
[
1
]
+
qkr
[
3
]
*
atomI
.
inducedDipoleP
[
2
];
// calculate the gl functions for potential energy
// calculate the gl functions for potential energy
gli
[
1
]
=
ck
*
sci
[
3
]
-
ci
*
sci
[
4
];
gli
[
1
]
=
atomJ
.
q
*
sci
[
3
]
-
atomI
.
q
*
sci
[
4
];
gli
[
2
]
=
-
sc
[
3
]
*
sci
[
4
]
-
sci
[
3
]
*
sc
[
4
];
gli
[
2
]
=
-
sc
[
3
]
*
sci
[
4
]
-
sci
[
3
]
*
sc
[
4
];
gli
[
3
]
=
sci
[
3
]
*
sc
[
6
]
-
sci
[
4
]
*
sc
[
5
];
gli
[
3
]
=
sci
[
3
]
*
sc
[
6
]
-
sci
[
4
]
*
sc
[
5
];
gli
[
6
]
=
sci
[
1
];
gli
[
6
]
=
sci
[
1
];
gli
[
7
]
=
2.0
f
*
(
sci
[
7
]
-
sci
[
8
]);
gli
[
7
]
=
2.0
f
*
(
sci
[
7
]
-
sci
[
8
]);
glip
[
1
]
=
ck
*
scip
[
3
]
-
ci
*
scip
[
4
];
glip
[
1
]
=
atomJ
.
q
*
scip
[
3
]
-
atomI
.
q
*
scip
[
4
];
glip
[
2
]
=
-
sc
[
3
]
*
scip
[
4
]
-
scip
[
3
]
*
sc
[
4
];
glip
[
2
]
=
-
sc
[
3
]
*
scip
[
4
]
-
scip
[
3
]
*
sc
[
4
];
glip
[
3
]
=
scip
[
3
]
*
sc
[
6
]
-
scip
[
4
]
*
sc
[
5
];
glip
[
3
]
=
scip
[
3
]
*
sc
[
6
]
-
scip
[
4
]
*
sc
[
5
];
glip
[
6
]
=
scip
[
1
];
glip
[
6
]
=
scip
[
1
];
...
@@ -851,8 +749,8 @@ __device__ void calculateKirkwoodEDiffPairIxn_kernel( float4 atomCoordinatesI,
...
@@ -851,8 +749,8 @@ __device__ void calculateKirkwoodEDiffPairIxn_kernel( float4 atomCoordinatesI,
-
(
sci
[
3
]
*
scip
[
4
]
+
scip
[
3
]
*
sci
[
4
])
*
scale5i
)
-
(
sci
[
3
]
*
scip
[
4
]
+
scip
[
3
]
*
sci
[
4
])
*
scale5i
)
+
0.5
f
*
rr9
*
(
gli
[
3
]
*
psc7
+
glip
[
3
]
*
dsc7
);
+
0.5
f
*
rr9
*
(
gli
[
3
]
*
psc7
+
glip
[
3
]
*
dsc7
);
gfi
[
2
]
=
-
rr3
*
ck
+
rr5
*
sc
[
4
]
-
rr7
*
sc
[
6
];
gfi
[
2
]
=
-
rr3
*
atomJ
.
q
+
rr5
*
sc
[
4
]
-
rr7
*
sc
[
6
];
gfi
[
3
]
=
rr3
*
ci
+
rr5
*
sc
[
3
]
+
rr7
*
sc
[
5
];
gfi
[
3
]
=
rr3
*
atomI
.
q
+
rr5
*
sc
[
3
]
+
rr7
*
sc
[
5
];
gfi
[
4
]
=
2.0
f
*
rr5
;
gfi
[
4
]
=
2.0
f
*
rr5
;
gfi
[
5
]
=
rr7
*
(
sci
[
4
]
*
psc7
+
scip
[
4
]
*
dsc7
);
gfi
[
5
]
=
rr7
*
(
sci
[
4
]
*
psc7
+
scip
[
4
]
*
dsc7
);
gfi
[
6
]
=
-
rr7
*
(
sci
[
3
]
*
psc7
+
scip
[
3
]
*
dsc7
);
gfi
[
6
]
=
-
rr7
*
(
sci
[
3
]
*
psc7
+
scip
[
3
]
*
dsc7
);
...
@@ -860,46 +758,46 @@ __device__ void calculateKirkwoodEDiffPairIxn_kernel( float4 atomCoordinatesI,
...
@@ -860,46 +758,46 @@ __device__ void calculateKirkwoodEDiffPairIxn_kernel( float4 atomCoordinatesI,
// get the induced force
// get the induced force
ftm2i
[
1
]
=
gfi
[
1
]
*
xr
+
0.5
f
*
ftm2i
[
1
]
=
gfi
[
1
]
*
xr
+
0.5
f
*
(
-
rr3
*
ck
*
(
uindI
[
0
]
*
psc3
+
uinpI
[
0
]
*
dsc3
)
(
-
rr3
*
atomJ
.
q
*
(
atomI
.
inducedDipole
[
0
]
*
psc3
+
atomI
.
inducedDipoleP
[
0
]
*
dsc3
)
+
rr5
*
sc
[
4
]
*
(
uindI
[
0
]
*
psc5
+
uinpI
[
0
]
*
dsc5
)
+
rr5
*
sc
[
4
]
*
(
atomI
.
inducedDipole
[
0
]
*
psc5
+
atomI
.
inducedDipoleP
[
0
]
*
dsc5
)
-
rr7
*
sc
[
6
]
*
(
uindI
[
0
]
*
psc7
+
uinpI
[
0
]
*
dsc7
))
-
rr7
*
sc
[
6
]
*
(
atomI
.
inducedDipole
[
0
]
*
psc7
+
atomI
.
inducedDipoleP
[
0
]
*
dsc7
))
+
(
rr3
*
ci
*
(
uindJ
[
0
]
*
psc3
+
uinpJ
[
0
]
*
dsc3
)
+
(
rr3
*
atomI
.
q
*
(
atomJ
.
inducedDipole
[
0
]
*
psc3
+
atomJ
.
inducedDipoleP
[
0
]
*
dsc3
)
+
rr5
*
sc
[
3
]
*
(
uindJ
[
0
]
*
psc5
+
uinpJ
[
0
]
*
dsc5
)
+
rr5
*
sc
[
3
]
*
(
atomJ
.
inducedDipole
[
0
]
*
psc5
+
atomJ
.
inducedDipoleP
[
0
]
*
dsc5
)
+
rr7
*
sc
[
5
]
*
(
uindJ
[
0
]
*
psc7
+
uinpJ
[
0
]
*
dsc7
))
*
0.5
f
+
rr7
*
sc
[
5
]
*
(
atomJ
.
inducedDipole
[
0
]
*
psc7
+
atomJ
.
inducedDipoleP
[
0
]
*
dsc7
))
*
0.5
f
+
rr5
*
scale5i
*
(
sci
[
4
]
*
uinpI
[
0
]
+
scip
[
4
]
*
uindI
[
0
]
+
rr5
*
scale5i
*
(
sci
[
4
]
*
atomI
.
inducedDipoleP
[
0
]
+
scip
[
4
]
*
atomI
.
inducedDipole
[
0
]
+
sci
[
3
]
*
uinpJ
[
0
]
+
scip
[
3
]
*
uindJ
[
0
])
*
0.5
f
+
sci
[
3
]
*
atomJ
.
inducedDipoleP
[
0
]
+
scip
[
3
]
*
atomJ
.
inducedDipole
[
0
])
*
0.5
f
+
0.5
f
*
(
sci
[
4
]
*
psc5
+
scip
[
4
]
*
dsc5
)
*
rr5
*
di
[
1
]
+
0.5
f
*
(
sci
[
4
]
*
psc5
+
scip
[
4
]
*
dsc5
)
*
rr5
*
atomI
.
labFrameDipole
[
0
]
+
0.5
f
*
(
sci
[
3
]
*
psc5
+
scip
[
3
]
*
dsc5
)
*
rr5
*
dk
[
1
]
+
0.5
f
*
(
sci
[
3
]
*
psc5
+
scip
[
3
]
*
dsc5
)
*
rr5
*
atomJ
.
labFrameDipole
[
0
]
+
0.5
f
*
gfi
[
4
]
*
((
qkui
[
1
]
-
qiuk
[
1
])
*
psc5
+
0.5
f
*
gfi
[
4
]
*
((
qkui
[
1
]
-
qiuk
[
1
])
*
psc5
+
(
qkuip
[
1
]
-
qiukp
[
1
])
*
dsc5
)
+
(
qkuip
[
1
]
-
qiukp
[
1
])
*
dsc5
)
+
gfi
[
5
]
*
qir
[
1
]
+
gfi
[
6
]
*
qkr
[
1
];
+
gfi
[
5
]
*
qir
[
1
]
+
gfi
[
6
]
*
qkr
[
1
];
ftm2i
[
2
]
=
gfi
[
1
]
*
yr
+
0.5
f
*
ftm2i
[
2
]
=
gfi
[
1
]
*
yr
+
0.5
f
*
(
-
rr3
*
ck
*
(
uindI
[
1
]
*
psc3
+
uinpI
[
1
]
*
dsc3
)
(
-
rr3
*
atomJ
.
q
*
(
atomI
.
inducedDipole
[
1
]
*
psc3
+
atomI
.
inducedDipoleP
[
1
]
*
dsc3
)
+
rr5
*
sc
[
4
]
*
(
uindI
[
1
]
*
psc5
+
uinpI
[
1
]
*
dsc5
)
+
rr5
*
sc
[
4
]
*
(
atomI
.
inducedDipole
[
1
]
*
psc5
+
atomI
.
inducedDipoleP
[
1
]
*
dsc5
)
-
rr7
*
sc
[
6
]
*
(
uindI
[
1
]
*
psc7
+
uinpI
[
1
]
*
dsc7
))
-
rr7
*
sc
[
6
]
*
(
atomI
.
inducedDipole
[
1
]
*
psc7
+
atomI
.
inducedDipoleP
[
1
]
*
dsc7
))
+
(
rr3
*
ci
*
(
uindJ
[
1
]
*
psc3
+
uinpJ
[
1
]
*
dsc3
)
+
(
rr3
*
atomI
.
q
*
(
atomJ
.
inducedDipole
[
1
]
*
psc3
+
atomJ
.
inducedDipoleP
[
1
]
*
dsc3
)
+
rr5
*
sc
[
3
]
*
(
uindJ
[
1
]
*
psc5
+
uinpJ
[
1
]
*
dsc5
)
+
rr5
*
sc
[
3
]
*
(
atomJ
.
inducedDipole
[
1
]
*
psc5
+
atomJ
.
inducedDipoleP
[
1
]
*
dsc5
)
+
rr7
*
sc
[
5
]
*
(
uindJ
[
1
]
*
psc7
+
uinpJ
[
1
]
*
dsc7
))
*
0.5
f
+
rr7
*
sc
[
5
]
*
(
atomJ
.
inducedDipole
[
1
]
*
psc7
+
atomJ
.
inducedDipoleP
[
1
]
*
dsc7
))
*
0.5
f
+
rr5
*
scale5i
*
(
sci
[
4
]
*
uinpI
[
1
]
+
scip
[
4
]
*
uindI
[
1
]
+
rr5
*
scale5i
*
(
sci
[
4
]
*
atomI
.
inducedDipoleP
[
1
]
+
scip
[
4
]
*
atomI
.
inducedDipole
[
1
]
+
sci
[
3
]
*
uinpJ
[
1
]
+
scip
[
3
]
*
uindJ
[
1
])
*
0.5
f
+
sci
[
3
]
*
atomJ
.
inducedDipoleP
[
1
]
+
scip
[
3
]
*
atomJ
.
inducedDipole
[
1
])
*
0.5
f
+
0.5
f
*
(
sci
[
4
]
*
psc5
+
scip
[
4
]
*
dsc5
)
*
rr5
*
di
[
2
]
+
0.5
f
*
(
sci
[
4
]
*
psc5
+
scip
[
4
]
*
dsc5
)
*
rr5
*
atomI
.
labFrameDipole
[
1
]
+
0.5
f
*
(
sci
[
3
]
*
psc5
+
scip
[
3
]
*
dsc5
)
*
rr5
*
dk
[
2
]
+
0.5
f
*
(
sci
[
3
]
*
psc5
+
scip
[
3
]
*
dsc5
)
*
rr5
*
atomJ
.
labFrameDipole
[
1
]
+
0.5
f
*
gfi
[
4
]
*
((
qkui
[
2
]
-
qiuk
[
2
])
*
psc5
+
0.5
f
*
gfi
[
4
]
*
((
qkui
[
2
]
-
qiuk
[
2
])
*
psc5
+
(
qkuip
[
2
]
-
qiukp
[
2
])
*
dsc5
)
+
(
qkuip
[
2
]
-
qiukp
[
2
])
*
dsc5
)
+
gfi
[
5
]
*
qir
[
2
]
+
gfi
[
6
]
*
qkr
[
2
];
+
gfi
[
5
]
*
qir
[
2
]
+
gfi
[
6
]
*
qkr
[
2
];
ftm2i
[
3
]
=
gfi
[
1
]
*
zr
+
0.5
f
*
ftm2i
[
3
]
=
gfi
[
1
]
*
zr
+
0.5
f
*
(
-
rr3
*
ck
*
(
uindI
[
2
]
*
psc3
+
uinpI
[
2
]
*
dsc3
)
(
-
rr3
*
atomJ
.
q
*
(
atomI
.
inducedDipole
[
2
]
*
psc3
+
atomI
.
inducedDipoleP
[
2
]
*
dsc3
)
+
rr5
*
sc
[
4
]
*
(
uindI
[
2
]
*
psc5
+
uinpI
[
2
]
*
dsc5
)
+
rr5
*
sc
[
4
]
*
(
atomI
.
inducedDipole
[
2
]
*
psc5
+
atomI
.
inducedDipoleP
[
2
]
*
dsc5
)
-
rr7
*
sc
[
6
]
*
(
uindI
[
2
]
*
psc7
+
uinpI
[
2
]
*
dsc7
))
-
rr7
*
sc
[
6
]
*
(
atomI
.
inducedDipole
[
2
]
*
psc7
+
atomI
.
inducedDipoleP
[
2
]
*
dsc7
))
+
(
rr3
*
ci
*
(
uindJ
[
2
]
*
psc3
+
uinpJ
[
2
]
*
dsc3
)
+
(
rr3
*
atomI
.
q
*
(
atomJ
.
inducedDipole
[
2
]
*
psc3
+
atomJ
.
inducedDipoleP
[
2
]
*
dsc3
)
+
rr5
*
sc
[
3
]
*
(
uindJ
[
2
]
*
psc5
+
uinpJ
[
2
]
*
dsc5
)
+
rr5
*
sc
[
3
]
*
(
atomJ
.
inducedDipole
[
2
]
*
psc5
+
atomJ
.
inducedDipoleP
[
2
]
*
dsc5
)
+
rr7
*
sc
[
5
]
*
(
uindJ
[
2
]
*
psc7
+
uinpJ
[
2
]
*
dsc7
))
*
0.5
f
+
rr7
*
sc
[
5
]
*
(
atomJ
.
inducedDipole
[
2
]
*
psc7
+
atomJ
.
inducedDipoleP
[
2
]
*
dsc7
))
*
0.5
f
+
rr5
*
scale5i
*
(
sci
[
4
]
*
uinpI
[
2
]
+
scip
[
4
]
*
uindI
[
2
]
+
rr5
*
scale5i
*
(
sci
[
4
]
*
atomI
.
inducedDipoleP
[
2
]
+
scip
[
4
]
*
atomI
.
inducedDipole
[
2
]
+
sci
[
3
]
*
uinpJ
[
2
]
+
scip
[
3
]
*
uindJ
[
2
])
*
0.5
f
+
sci
[
3
]
*
atomJ
.
inducedDipoleP
[
2
]
+
scip
[
3
]
*
atomJ
.
inducedDipole
[
2
])
*
0.5
f
+
0.5
f
*
(
sci
[
4
]
*
psc5
+
scip
[
4
]
*
dsc5
)
*
rr5
*
di
[
3
]
+
0.5
f
*
(
sci
[
4
]
*
psc5
+
scip
[
4
]
*
dsc5
)
*
rr5
*
atomI
.
labFrameDipole
[
2
]
+
0.5
f
*
(
sci
[
3
]
*
psc5
+
scip
[
3
]
*
dsc5
)
*
rr5
*
dk
[
3
]
+
0.5
f
*
(
sci
[
3
]
*
psc5
+
scip
[
3
]
*
dsc5
)
*
rr5
*
atomJ
.
labFrameDipole
[
2
]
+
0.5
f
*
gfi
[
4
]
*
((
qkui
[
3
]
-
qiuk
[
3
])
*
psc5
+
0.5
f
*
gfi
[
4
]
*
((
qkui
[
3
]
-
qiuk
[
3
])
*
psc5
+
(
qkuip
[
3
]
-
qiukp
[
3
])
*
dsc5
)
+
(
qkuip
[
3
]
-
qiukp
[
3
])
*
dsc5
)
+
gfi
[
5
]
*
qir
[
3
]
+
gfi
[
6
]
*
qkr
[
3
];
+
gfi
[
5
]
*
qir
[
3
]
+
gfi
[
6
]
*
qkr
[
3
];
...
@@ -948,14 +846,14 @@ __device__ void calculateKirkwoodEDiffPairIxn_kernel( float4 atomCoordinatesI,
...
@@ -948,14 +846,14 @@ __device__ void calculateKirkwoodEDiffPairIxn_kernel( float4 atomCoordinatesI,
gfd = 0.5f * (rr5*scip[2]*scale3i;
gfd = 0.5f * (rr5*scip[2]*scale3i;
& - rr7*(scip[3]*sci[4]+sci[3]*scip[4])*scale5i);
& - rr7*(scip[3]*sci[4]+sci[3]*scip[4])*scale5i);
fdir[1] = gfd*xr + 0.5f*rr5*scale5i;
fdir[1] = gfd*xr + 0.5f*rr5*scale5i;
& * (sci[4]*
uinpI[0]+scip[4]*uindI
[0];
& * (sci[4]*
atomI.inducedDipoleP[0]+scip[4]*atomI.inducedDipole
[0];
& +sci[3]*
uinpJ[0]+scip[3]*uindJ
[0]);
& +sci[3]*
atomJ.inducedDipoleP[0]+scip[3]*atomJ.inducedDipole
[0]);
fdir[2] = gfd*yr + 0.5f*rr5*scale5i;
fdir[2] = gfd*yr + 0.5f*rr5*scale5i;
& * (sci[4]*
uinpI[1]+scip[4]*uindI
[1];
& * (sci[4]*
atomI.inducedDipoleP[1]+scip[4]*atomI.inducedDipole
[1];
& +sci[3]*
uinpJ[1]+scip[3]*uindJ
[1]);
& +sci[3]*
atomJ.inducedDipoleP[1]+scip[3]*atomJ.inducedDipole
[1]);
fdir[3] = gfd*zr + 0.5f*rr5*scale5i;
fdir[3] = gfd*zr + 0.5f*rr5*scale5i;
& * (sci[4]*
uinpI[2]+scip[4]*uindI
[2];
& * (sci[4]*
atomI.inducedDipoleP[2]+scip[4]*atomI.inducedDipole
[2];
& +sci[3]*
uinpJ[2]+scip[3]*uindJ
[2]);
& +sci[3]*
atomJ.inducedDipoleP[2]+scip[3]*atomJ.inducedDipole
[2]);
ftm2i[1] = ftm2i[1] - fdir[1] + findmp[1];
ftm2i[1] = ftm2i[1] - fdir[1] + findmp[1];
ftm2i[2] = ftm2i[2] - fdir[2] + findmp[2];
ftm2i[2] = ftm2i[2] - fdir[2] + findmp[2];
ftm2i[3] = ftm2i[3] - fdir[3] + findmp[3];
ftm2i[3] = ftm2i[3] - fdir[3] + findmp[3];
...
...
plugins/amoeba/platforms/cuda/src/kernels/kCalculateAmoebaCudaKirkwoodEDiff.h
View file @
f11d445b
...
@@ -63,14 +63,6 @@ void METHOD_NAME(kCalculateAmoebaCudaKirkwoodEDiff, Forces_kernel)(
...
@@ -63,14 +63,6 @@ void METHOD_NAME(kCalculateAmoebaCudaKirkwoodEDiff, Forces_kernel)(
unsigned
int
end
=
(
warp
+
1
)
*
numWorkUnits
/
totalWarps
;
unsigned
int
end
=
(
warp
+
1
)
*
numWorkUnits
/
totalWarps
;
unsigned
int
lasty
=
0xFFFFFFFF
;
unsigned
int
lasty
=
0xFFFFFFFF
;
float4
jCoord
;
float
jDipole
[
3
];
float
jQuadrupole
[
9
];
float
jInducedDipole
[
3
];
float
jInducedDipolePolar
[
3
];
float
jInducedDipoleS
[
3
];
float
jInducedDipolePolarS
[
3
];
float
totalEnergy
=
0
.
0
f
;
float
totalEnergy
=
0
.
0
f
;
float
tinker_f
=
(
cAmoebaSim
.
electric
/
cAmoebaSim
.
dielec
);
float
tinker_f
=
(
cAmoebaSim
.
electric
/
cAmoebaSim
.
dielec
);
...
@@ -81,9 +73,6 @@ void METHOD_NAME(kCalculateAmoebaCudaKirkwoodEDiff, Forces_kernel)(
...
@@ -81,9 +73,6 @@ void METHOD_NAME(kCalculateAmoebaCudaKirkwoodEDiff, Forces_kernel)(
unsigned
int
y
;
unsigned
int
y
;
bool
bExclusionFlag
;
bool
bExclusionFlag
;
float
forceSum
[
3
];
float
torqueSum
[
3
];
float
force
[
3
];
float
force
[
3
];
float
torqueI
[
3
];
float
torqueI
[
3
];
float
torqueJ
[
3
];
float
torqueJ
[
3
];
...
@@ -100,15 +89,20 @@ void METHOD_NAME(kCalculateAmoebaCudaKirkwoodEDiff, Forces_kernel)(
...
@@ -100,15 +89,20 @@ void METHOD_NAME(kCalculateAmoebaCudaKirkwoodEDiff, Forces_kernel)(
KirkwoodEDiffParticle
*
psA
=
&
sA
[
tbx
];
KirkwoodEDiffParticle
*
psA
=
&
sA
[
tbx
];
unsigned
int
atomI
=
x
+
tgx
;
unsigned
int
atomI
=
x
+
tgx
;
float4
iCoord
=
atomCoord
[
atomI
];
KirkwoodEDiffParticle
localParticle
;
loadKirkwoodEDiffShared
(
&
localParticle
,
atomI
,
atomCoord
,
labFrameDipole
,
labFrameQuadrupole
,
inducedDipole
,
inducedDipolePolar
,
inducedDipoleS
,
inducedDipolePolarS
);
force
Sum
[
0
]
=
0
.
0
f
;
localParticle
.
force
[
0
]
=
0
.
0
f
;
force
Sum
[
1
]
=
0
.
0
f
;
localParticle
.
force
[
1
]
=
0
.
0
f
;
force
Sum
[
2
]
=
0
.
0
f
;
localParticle
.
force
[
2
]
=
0
.
0
f
;
torque
Sum
[
0
]
=
0
.
0
f
;
localParticle
.
torque
[
0
]
=
0
.
0
f
;
torque
Sum
[
1
]
=
0
.
0
f
;
localParticle
.
torque
[
1
]
=
0
.
0
f
;
torque
Sum
[
2
]
=
0
.
0
f
;
localParticle
.
torque
[
2
]
=
0
.
0
f
;
if
(
x
==
y
)
// Handle diagonals uniquely at 50% efficiency
if
(
x
==
y
)
// Handle diagonals uniquely at 50% efficiency
{
{
...
@@ -135,22 +129,8 @@ void METHOD_NAME(kCalculateAmoebaCudaKirkwoodEDiff, Forces_kernel)(
...
@@ -135,22 +129,8 @@ void METHOD_NAME(kCalculateAmoebaCudaKirkwoodEDiff, Forces_kernel)(
unsigned
int
atomJ
=
(
y
+
j
);
unsigned
int
atomJ
=
(
y
+
j
);
// load coords, charge, ...
calculateKirkwoodEDiffPairIxn_kernel
(
localParticle
,
psA
[
j
],
loadKirkwoodEDiffData
(
&
(
psA
[
j
]),
&
jCoord
,
jDipole
,
jQuadrupole
,
jInducedDipole
,
jInducedDipolePolar
,
jInducedDipoleS
,
jInducedDipolePolarS
);
calculateKirkwoodEDiffPairIxn_kernel
(
iCoord
,
jCoord
,
cAmoebaSim
.
pDampingFactorAndThole
[
atomI
].
x
,
psA
[
j
].
damp
,
cAmoebaSim
.
pDampingFactorAndThole
[
atomI
].
y
,
psA
[
j
].
thole
,
&
(
labFrameDipole
[
3
*
atomI
]),
jDipole
,
&
(
labFrameQuadrupole
[
9
*
atomI
]),
jQuadrupole
,
&
(
inducedDipole
[
3
*
atomI
]),
jInducedDipole
,
&
(
inducedDipolePolar
[
3
*
atomI
]),
jInducedDipolePolar
,
&
(
inducedDipoleS
[
3
*
atomI
]),
jInducedDipoleS
,
&
(
inducedDipolePolarS
[
3
*
atomI
]),
jInducedDipolePolarS
,
pScale
,
dScale
,
pScale
,
dScale
,
&
energy
,
force
,
torqueI
,
torqueJ
&
energy
,
force
,
torqueI
,
torqueJ
#ifdef AMOEBA_DEBUG
#ifdef AMOEBA_DEBUG
...
@@ -162,9 +142,9 @@ void METHOD_NAME(kCalculateAmoebaCudaKirkwoodEDiff, Forces_kernel)(
...
@@ -162,9 +142,9 @@ void METHOD_NAME(kCalculateAmoebaCudaKirkwoodEDiff, Forces_kernel)(
// torques include i == j contribution
// torques include i == j contribution
torque
Sum
[
0
]
+=
mask
?
torqueI
[
0
]
:
0
.
0
f
;
localParticle
.
torque
[
0
]
+=
mask
?
torqueI
[
0
]
:
0
.
0
f
;
torque
Sum
[
1
]
+=
mask
?
torqueI
[
1
]
:
0
.
0
f
;
localParticle
.
torque
[
1
]
+=
mask
?
torqueI
[
1
]
:
0
.
0
f
;
torque
Sum
[
2
]
+=
mask
?
torqueI
[
2
]
:
0
.
0
f
;
localParticle
.
torque
[
2
]
+=
mask
?
torqueI
[
2
]
:
0
.
0
f
;
totalEnergy
+=
mask
?
0
.
5
f
*
energy
:
0
.
0
f
;
totalEnergy
+=
mask
?
0
.
5
f
*
energy
:
0
.
0
f
;
...
@@ -172,9 +152,9 @@ void METHOD_NAME(kCalculateAmoebaCudaKirkwoodEDiff, Forces_kernel)(
...
@@ -172,9 +152,9 @@ void METHOD_NAME(kCalculateAmoebaCudaKirkwoodEDiff, Forces_kernel)(
mask
=
(
atomI
==
atomJ
)
?
0
:
mask
;
mask
=
(
atomI
==
atomJ
)
?
0
:
mask
;
force
Sum
[
0
]
+=
mask
?
force
[
0
]
:
0
.
0
f
;
localParticle
.
force
[
0
]
+=
mask
?
force
[
0
]
:
0
.
0
f
;
force
Sum
[
1
]
+=
mask
?
force
[
1
]
:
0
.
0
f
;
localParticle
.
force
[
1
]
+=
mask
?
force
[
1
]
:
0
.
0
f
;
force
Sum
[
2
]
+=
mask
?
force
[
2
]
:
0
.
0
f
;
localParticle
.
force
[
2
]
+=
mask
?
force
[
2
]
:
0
.
0
f
;
#ifdef AMOEBA_DEBUG
#ifdef AMOEBA_DEBUG
...
@@ -210,27 +190,12 @@ if( atomI == targetAtom || atomJ == targetAtom ){
...
@@ -210,27 +190,12 @@ if( atomI == targetAtom || atomJ == targetAtom ){
unsigned
int
atomJ
=
(
y
+
j
);
unsigned
int
atomJ
=
(
y
+
j
);
// load coords, charge, ...
loadKirkwoodEDiffData
(
&
(
psA
[
j
]),
&
jCoord
,
jDipole
,
jQuadrupole
,
jInducedDipole
,
jInducedDipolePolar
,
jInducedDipoleS
,
jInducedDipolePolarS
);
float
pScale
;
float
pScale
;
float
dScale
;
float
dScale
;
getMaskedDScaleFactor
(
j
,
dScaleMask
,
&
dScale
);
getMaskedDScaleFactor
(
j
,
dScaleMask
,
&
dScale
);
getMaskedPScaleFactor
(
j
,
pScaleMask
,
&
pScale
);
getMaskedPScaleFactor
(
j
,
pScaleMask
,
&
pScale
);
calculateKirkwoodEDiffPairIxn_kernel
(
iCoord
,
jCoord
,
calculateKirkwoodEDiffPairIxn_kernel
(
localParticle
,
psA
[
j
],
cAmoebaSim
.
pDampingFactorAndThole
[
atomI
].
x
,
psA
[
j
].
damp
,
cAmoebaSim
.
pDampingFactorAndThole
[
atomI
].
y
,
psA
[
j
].
thole
,
&
(
labFrameDipole
[
3
*
atomI
]),
jDipole
,
&
(
labFrameQuadrupole
[
9
*
atomI
]),
jQuadrupole
,
&
(
inducedDipole
[
3
*
atomI
]),
jInducedDipole
,
&
(
inducedDipolePolar
[
3
*
atomI
]),
jInducedDipolePolar
,
&
(
inducedDipoleS
[
3
*
atomI
]),
jInducedDipoleS
,
&
(
inducedDipolePolarS
[
3
*
atomI
]),
jInducedDipolePolarS
,
pScale
,
dScale
,
pScale
,
dScale
,
&
energy
,
force
,
torqueI
,
torqueJ
&
energy
,
force
,
torqueI
,
torqueJ
#ifdef AMOEBA_DEBUG
#ifdef AMOEBA_DEBUG
...
@@ -242,17 +207,17 @@ if( atomI == targetAtom || atomJ == targetAtom ){
...
@@ -242,17 +207,17 @@ if( atomI == targetAtom || atomJ == targetAtom ){
// torques include i == j contribution
// torques include i == j contribution
torque
Sum
[
0
]
+=
mask
?
torqueI
[
0
]
:
0
.
0
f
;
localParticle
.
torque
[
0
]
+=
mask
?
torqueI
[
0
]
:
0
.
0
f
;
torque
Sum
[
1
]
+=
mask
?
torqueI
[
1
]
:
0
.
0
f
;
localParticle
.
torque
[
1
]
+=
mask
?
torqueI
[
1
]
:
0
.
0
f
;
torque
Sum
[
2
]
+=
mask
?
torqueI
[
2
]
:
0
.
0
f
;
localParticle
.
torque
[
2
]
+=
mask
?
torqueI
[
2
]
:
0
.
0
f
;
totalEnergy
+=
mask
?
0
.
5
f
*
energy
:
0
.
0
f
;
totalEnergy
+=
mask
?
0
.
5
f
*
energy
:
0
.
0
f
;
// add to field at atomI the field due atomJ's charge/dipole/quadrupole
// add to field at atomI the field due atomJ's charge/dipole/quadrupole
force
Sum
[
0
]
+=
mask
?
force
[
0
]
:
0
.
0
f
;
localParticle
.
force
[
0
]
+=
mask
?
force
[
0
]
:
0
.
0
f
;
force
Sum
[
1
]
+=
mask
?
force
[
1
]
:
0
.
0
f
;
localParticle
.
force
[
1
]
+=
mask
?
force
[
1
]
:
0
.
0
f
;
force
Sum
[
2
]
+=
mask
?
force
[
2
]
:
0
.
0
f
;
localParticle
.
force
[
2
]
+=
mask
?
force
[
2
]
:
0
.
0
f
;
#ifdef AMOEBA_DEBUG
#ifdef AMOEBA_DEBUG
...
@@ -280,19 +245,19 @@ if( atomI == targetAtom || atomJ == targetAtom ){
...
@@ -280,19 +245,19 @@ if( atomI == targetAtom || atomJ == targetAtom ){
// scale and write results
// scale and write results
scale3dArray
(
tinker_f
,
force
Sum
);
scale3dArray
(
tinker_f
,
localParticle
.
force
);
scale3dArray
(
tinker_f
,
torque
Sum
);
scale3dArray
(
tinker_f
,
localParticle
.
torque
);
#ifdef USE_OUTPUT_BUFFER_PER_WARP
#ifdef USE_OUTPUT_BUFFER_PER_WARP
unsigned
int
offset
=
3
*
(
x
+
tgx
+
warp
*
cAmoebaSim
.
paddedNumberOfAtoms
);
unsigned
int
offset
=
3
*
(
x
+
tgx
+
warp
*
cAmoebaSim
.
paddedNumberOfAtoms
);
load3dArrayBufferPerWarp
(
offset
,
force
Sum
,
outputForce
);
load3dArrayBufferPerWarp
(
offset
,
localParticle
.
force
,
outputForce
);
load3dArrayBufferPerWarp
(
offset
,
torque
Sum
,
outputTorque
);
load3dArrayBufferPerWarp
(
offset
,
localParticle
.
torque
,
outputTorque
);
#else
#else
unsigned
int
offset
=
3
*
(
x
+
tgx
+
(
x
>>
GRIDBITS
)
*
cAmoebaSim
.
paddedNumberOfAtoms
);
unsigned
int
offset
=
3
*
(
x
+
tgx
+
(
x
>>
GRIDBITS
)
*
cAmoebaSim
.
paddedNumberOfAtoms
);
load3dArray
(
offset
,
force
Sum
,
outputForce
);
load3dArray
(
offset
,
localParticle
.
force
,
outputForce
);
load3dArray
(
offset
,
torque
Sum
,
outputTorque
);
load3dArray
(
offset
,
localParticle
.
torque
,
outputTorque
);
#endif
#endif
...
@@ -329,22 +294,7 @@ if( atomI == targetAtom || atomJ == targetAtom ){
...
@@ -329,22 +294,7 @@ if( atomI == targetAtom || atomJ == targetAtom ){
unsigned
int
atomJ
=
y
+
tj
;
unsigned
int
atomJ
=
y
+
tj
;
// load coords, charge, ...
calculateKirkwoodEDiffPairIxn_kernel
(
localParticle
,
psA
[
tj
],
loadKirkwoodEDiffData
(
&
(
psA
[
tj
]),
&
jCoord
,
jDipole
,
jQuadrupole
,
jInducedDipole
,
jInducedDipolePolar
,
jInducedDipoleS
,
jInducedDipolePolarS
);
calculateKirkwoodEDiffPairIxn_kernel
(
iCoord
,
jCoord
,
cAmoebaSim
.
pDampingFactorAndThole
[
atomI
].
x
,
psA
[
tj
].
damp
,
cAmoebaSim
.
pDampingFactorAndThole
[
atomI
].
y
,
psA
[
tj
].
thole
,
&
(
labFrameDipole
[
3
*
atomI
]),
jDipole
,
&
(
labFrameQuadrupole
[
9
*
atomI
]),
jQuadrupole
,
&
(
inducedDipole
[
3
*
atomI
]),
jInducedDipole
,
&
(
inducedDipolePolar
[
3
*
atomI
]),
jInducedDipolePolar
,
&
(
inducedDipoleS
[
3
*
atomI
]),
jInducedDipoleS
,
&
(
inducedDipolePolarS
[
3
*
atomI
]),
jInducedDipolePolarS
,
pScale
,
dScale
,
pScale
,
dScale
,
&
energy
,
force
,
&
energy
,
force
,
torqueI
,
torqueJ
torqueI
,
torqueJ
...
@@ -358,13 +308,13 @@ if( atomI == targetAtom || atomJ == targetAtom ){
...
@@ -358,13 +308,13 @@ if( atomI == targetAtom || atomJ == targetAtom ){
// add force and torque to atom I due atom J
// add force and torque to atom I due atom J
force
Sum
[
0
]
+=
mask
?
force
[
0
]
:
0
.
0
f
;
localParticle
.
force
[
0
]
+=
mask
?
force
[
0
]
:
0
.
0
f
;
force
Sum
[
1
]
+=
mask
?
force
[
1
]
:
0
.
0
f
;
localParticle
.
force
[
1
]
+=
mask
?
force
[
1
]
:
0
.
0
f
;
force
Sum
[
2
]
+=
mask
?
force
[
2
]
:
0
.
0
f
;
localParticle
.
force
[
2
]
+=
mask
?
force
[
2
]
:
0
.
0
f
;
torque
Sum
[
0
]
+=
mask
?
torqueI
[
0
]
:
0
.
0
f
;
localParticle
.
torque
[
0
]
+=
mask
?
torqueI
[
0
]
:
0
.
0
f
;
torque
Sum
[
1
]
+=
mask
?
torqueI
[
1
]
:
0
.
0
f
;
localParticle
.
torque
[
1
]
+=
mask
?
torqueI
[
1
]
:
0
.
0
f
;
torque
Sum
[
2
]
+=
mask
?
torqueI
[
2
]
:
0
.
0
f
;
localParticle
.
torque
[
2
]
+=
mask
?
torqueI
[
2
]
:
0
.
0
f
;
totalEnergy
+=
mask
?
energy
:
0
.
0
f
;
totalEnergy
+=
mask
?
energy
:
0
.
0
f
;
...
@@ -413,27 +363,12 @@ if( atomI == targetAtom || atomJ == targetAtom ){
...
@@ -413,27 +363,12 @@ if( atomI == targetAtom || atomJ == targetAtom ){
{
{
unsigned
int
atomJ
=
y
+
tj
;
unsigned
int
atomJ
=
y
+
tj
;
// load coords, charge, ...
loadKirkwoodEDiffData
(
&
(
psA
[
tj
]),
&
jCoord
,
jDipole
,
jQuadrupole
,
jInducedDipole
,
jInducedDipolePolar
,
jInducedDipoleS
,
jInducedDipolePolarS
);
float
dScale
;
float
dScale
;
float
pScale
;
float
pScale
;
getMaskedDScaleFactor
(
tj
,
dScaleMask
,
&
dScale
);
getMaskedDScaleFactor
(
tj
,
dScaleMask
,
&
dScale
);
getMaskedPScaleFactor
(
tj
,
pScaleMask
,
&
pScale
);
getMaskedPScaleFactor
(
tj
,
pScaleMask
,
&
pScale
);
calculateKirkwoodEDiffPairIxn_kernel
(
iCoord
,
jCoord
,
calculateKirkwoodEDiffPairIxn_kernel
(
localParticle
,
psA
[
tj
],
cAmoebaSim
.
pDampingFactorAndThole
[
atomI
].
x
,
psA
[
tj
].
damp
,
cAmoebaSim
.
pDampingFactorAndThole
[
atomI
].
y
,
psA
[
tj
].
thole
,
&
(
labFrameDipole
[
3
*
atomI
]),
jDipole
,
&
(
labFrameQuadrupole
[
9
*
atomI
]),
jQuadrupole
,
&
(
inducedDipole
[
3
*
atomI
]),
jInducedDipole
,
&
(
inducedDipolePolar
[
3
*
atomI
]),
jInducedDipolePolar
,
&
(
inducedDipoleS
[
3
*
atomI
]),
jInducedDipoleS
,
&
(
inducedDipolePolarS
[
3
*
atomI
]),
jInducedDipolePolarS
,
pScale
,
dScale
,
pScale
,
dScale
,
&
energy
,
force
,
&
energy
,
force
,
torqueI
,
torqueJ
torqueI
,
torqueJ
...
@@ -447,13 +382,13 @@ if( atomI == targetAtom || atomJ == targetAtom ){
...
@@ -447,13 +382,13 @@ if( atomI == targetAtom || atomJ == targetAtom ){
// add force and torque to atom I due atom J
// add force and torque to atom I due atom J
force
Sum
[
0
]
+=
mask
?
force
[
0
]
:
0
.
0
f
;
localParticle
.
force
[
0
]
+=
mask
?
force
[
0
]
:
0
.
0
f
;
force
Sum
[
1
]
+=
mask
?
force
[
1
]
:
0
.
0
f
;
localParticle
.
force
[
1
]
+=
mask
?
force
[
1
]
:
0
.
0
f
;
force
Sum
[
2
]
+=
mask
?
force
[
2
]
:
0
.
0
f
;
localParticle
.
force
[
2
]
+=
mask
?
force
[
2
]
:
0
.
0
f
;
torque
Sum
[
0
]
+=
mask
?
torqueI
[
0
]
:
0
.
0
f
;
localParticle
.
torque
[
0
]
+=
mask
?
torqueI
[
0
]
:
0
.
0
f
;
torque
Sum
[
1
]
+=
mask
?
torqueI
[
1
]
:
0
.
0
f
;
localParticle
.
torque
[
1
]
+=
mask
?
torqueI
[
1
]
:
0
.
0
f
;
torque
Sum
[
2
]
+=
mask
?
torqueI
[
2
]
:
0
.
0
f
;
localParticle
.
torque
[
2
]
+=
mask
?
torqueI
[
2
]
:
0
.
0
f
;
totalEnergy
+=
mask
?
energy
:
0
.
0
f
;
totalEnergy
+=
mask
?
energy
:
0
.
0
f
;
...
@@ -492,8 +427,8 @@ if( atomI == targetAtom || atomJ == targetAtom ){
...
@@ -492,8 +427,8 @@ if( atomI == targetAtom || atomJ == targetAtom ){
// scale and write results
// scale and write results
scale3dArray
(
tinker_f
,
force
Sum
);
scale3dArray
(
tinker_f
,
localParticle
.
force
);
scale3dArray
(
tinker_f
,
torque
Sum
);
scale3dArray
(
tinker_f
,
localParticle
.
torque
);
scale3dArray
(
tinker_f
,
sA
[
threadIdx
.
x
].
force
);
scale3dArray
(
tinker_f
,
sA
[
threadIdx
.
x
].
force
);
scale3dArray
(
tinker_f
,
sA
[
threadIdx
.
x
].
torque
);
scale3dArray
(
tinker_f
,
sA
[
threadIdx
.
x
].
torque
);
...
@@ -502,8 +437,8 @@ if( atomI == targetAtom || atomJ == targetAtom ){
...
@@ -502,8 +437,8 @@ if( atomI == targetAtom || atomJ == targetAtom ){
unsigned
int
offset
=
3
*
(
x
+
tgx
+
warp
*
cAmoebaSim
.
paddedNumberOfAtoms
);
unsigned
int
offset
=
3
*
(
x
+
tgx
+
warp
*
cAmoebaSim
.
paddedNumberOfAtoms
);
load3dArrayBufferPerWarp
(
offset
,
force
Sum
,
outputForce
);
load3dArrayBufferPerWarp
(
offset
,
localParticle
.
force
,
outputForce
);
load3dArrayBufferPerWarp
(
offset
,
torque
Sum
,
outputTorque
);
load3dArrayBufferPerWarp
(
offset
,
localParticle
.
torque
,
outputTorque
);
offset
=
3
*
(
y
+
tgx
+
warp
*
cAmoebaSim
.
paddedNumberOfAtoms
);
offset
=
3
*
(
y
+
tgx
+
warp
*
cAmoebaSim
.
paddedNumberOfAtoms
);
...
@@ -512,8 +447,8 @@ if( atomI == targetAtom || atomJ == targetAtom ){
...
@@ -512,8 +447,8 @@ if( atomI == targetAtom || atomJ == targetAtom ){
#else
#else
unsigned
int
offset
=
3
*
(
x
+
tgx
+
(
y
>>
GRIDBITS
)
*
cAmoebaSim
.
paddedNumberOfAtoms
);
unsigned
int
offset
=
3
*
(
x
+
tgx
+
(
y
>>
GRIDBITS
)
*
cAmoebaSim
.
paddedNumberOfAtoms
);
load3dArray
(
offset
,
force
Sum
,
outputForce
);
load3dArray
(
offset
,
localParticle
.
force
,
outputForce
);
load3dArray
(
offset
,
torque
Sum
,
outputTorque
);
load3dArray
(
offset
,
localParticle
.
torque
,
outputTorque
);
offset
=
3
*
(
y
+
tgx
+
(
x
>>
GRIDBITS
)
*
cAmoebaSim
.
paddedNumberOfAtoms
);
offset
=
3
*
(
y
+
tgx
+
(
x
>>
GRIDBITS
)
*
cAmoebaSim
.
paddedNumberOfAtoms
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment