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
92a338cf
Commit
92a338cf
authored
Oct 07, 2010
by
Peter Eastman
Browse files
Optimizations to PME direct space computation
parent
b20978e1
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
708 additions
and
738 deletions
+708
-738
plugins/amoeba/platforms/cuda/src/kernels/kCalculateAmoebaCudaFixedFieldParticle.h
...cuda/src/kernels/kCalculateAmoebaCudaFixedFieldParticle.h
+5
-3
plugins/amoeba/platforms/cuda/src/kernels/kCalculateAmoebaCudaMutualInducedParticle.h
...a/src/kernels/kCalculateAmoebaCudaMutualInducedParticle.h
+10
-6
plugins/amoeba/platforms/cuda/src/kernels/kCalculateAmoebaCudaPmeDirectElectrostatic.cu
...src/kernels/kCalculateAmoebaCudaPmeDirectElectrostatic.cu
+527
-553
plugins/amoeba/platforms/cuda/src/kernels/kCalculateAmoebaCudaPmeDirectElectrostatic.h
.../src/kernels/kCalculateAmoebaCudaPmeDirectElectrostatic.h
+1
-1
plugins/amoeba/platforms/cuda/src/kernels/kCalculateAmoebaCudaPmeFixedEField.cu
...ms/cuda/src/kernels/kCalculateAmoebaCudaPmeFixedEField.cu
+54
-58
plugins/amoeba/platforms/cuda/src/kernels/kCalculateAmoebaCudaPmeFixedEField.h
...rms/cuda/src/kernels/kCalculateAmoebaCudaPmeFixedEField.h
+30
-30
plugins/amoeba/platforms/cuda/src/kernels/kCalculateAmoebaCudaPmeMutualInducedField.cu
.../src/kernels/kCalculateAmoebaCudaPmeMutualInducedField.cu
+55
-61
plugins/amoeba/platforms/cuda/src/kernels/kCalculateAmoebaCudaPmeMutualInducedField.h
...a/src/kernels/kCalculateAmoebaCudaPmeMutualInducedField.h
+26
-26
No files found.
plugins/amoeba/platforms/cuda/src/kernels/kCalculateAmoebaCudaFixedFieldParticle.h
View file @
92a338cf
...
@@ -59,7 +59,8 @@ __device__ static void loadFixedFieldShared( struct FixedFieldParticle* sA, unsi
...
@@ -59,7 +59,8 @@ __device__ static void loadFixedFieldShared( struct FixedFieldParticle* sA, unsi
{
{
// coordinates & charge
// coordinates & charge
sA
->
x
=
cSim
.
pPosq
[
atomI
].
x
;
float4
posq
=
cSim
.
pPosq
[
atomI
];
sA
->
x
=
posq
.
x
;
sA
->
y
=
cSim
.
pPosq
[
atomI
].
y
;
sA
->
y
=
cSim
.
pPosq
[
atomI
].
y
;
sA
->
z
=
cSim
.
pPosq
[
atomI
].
z
;
sA
->
z
=
cSim
.
pPosq
[
atomI
].
z
;
sA
->
q
=
cSim
.
pPosq
[
atomI
].
w
;
sA
->
q
=
cSim
.
pPosq
[
atomI
].
w
;
...
@@ -79,8 +80,9 @@ __device__ static void loadFixedFieldShared( struct FixedFieldParticle* sA, unsi
...
@@ -79,8 +80,9 @@ __device__ static void loadFixedFieldShared( struct FixedFieldParticle* sA, unsi
sA
->
labFrameQuadrupole_YZ
=
cAmoebaSim
.
pLabFrameQuadrupole
[
atomI
*
9
+
5
];
sA
->
labFrameQuadrupole_YZ
=
cAmoebaSim
.
pLabFrameQuadrupole
[
atomI
*
9
+
5
];
sA
->
labFrameQuadrupole_ZZ
=
cAmoebaSim
.
pLabFrameQuadrupole
[
atomI
*
9
+
8
];
sA
->
labFrameQuadrupole_ZZ
=
cAmoebaSim
.
pLabFrameQuadrupole
[
atomI
*
9
+
8
];
sA
->
damp
=
cAmoebaSim
.
pDampingFactorAndThole
[
atomI
].
x
;
float2
dampingFactorAndThole
=
cAmoebaSim
.
pDampingFactorAndThole
[
atomI
];
sA
->
thole
=
cAmoebaSim
.
pDampingFactorAndThole
[
atomI
].
y
;
sA
->
damp
=
dampingFactorAndThole
.
x
;
sA
->
thole
=
dampingFactorAndThole
.
y
;
#ifdef GK
#ifdef GK
sA
->
bornR
=
bornR
[
atomI
];
sA
->
bornR
=
bornR
[
atomI
];
#endif
#endif
...
...
plugins/amoeba/platforms/cuda/src/kernels/kCalculateAmoebaCudaMutualInducedParticle.h
View file @
92a338cf
...
@@ -23,6 +23,8 @@ struct MutualInducedParticle {
...
@@ -23,6 +23,8 @@ struct MutualInducedParticle {
float
fieldS
[
3
];
float
fieldS
[
3
];
float
fieldPolarS
[
3
];
float
fieldPolarS
[
3
];
#else
float
padding
;
#endif
#endif
#ifdef INCLUDE_MI_FIELD_BUFFERS
#ifdef INCLUDE_MI_FIELD_BUFFERS
...
@@ -35,10 +37,11 @@ __device__ static void loadMutualInducedShared( MutualInducedParticle* sA, unsig
...
@@ -35,10 +37,11 @@ __device__ static void loadMutualInducedShared( MutualInducedParticle* sA, unsig
{
{
// coordinates & charge
// coordinates & charge
sA
->
x
=
cSim
.
pPosq
[
atomI
].
x
;
float4
posq
=
cSim
.
pPosq
[
atomI
];
sA
->
y
=
cSim
.
pPosq
[
atomI
].
y
;
sA
->
x
=
posq
.
x
;
sA
->
z
=
cSim
.
pPosq
[
atomI
].
z
;
sA
->
y
=
posq
.
y
;
sA
->
q
=
cSim
.
pPosq
[
atomI
].
w
;
sA
->
z
=
posq
.
z
;
sA
->
q
=
posq
.
w
;
// dipole
// dipole
...
@@ -52,8 +55,9 @@ __device__ static void loadMutualInducedShared( MutualInducedParticle* sA, unsig
...
@@ -52,8 +55,9 @@ __device__ static void loadMutualInducedShared( MutualInducedParticle* sA, unsig
sA
->
inducedDipolePolar
[
1
]
=
cAmoebaSim
.
pInducedDipolePolar
[
atomI
*
3
+
1
];
sA
->
inducedDipolePolar
[
1
]
=
cAmoebaSim
.
pInducedDipolePolar
[
atomI
*
3
+
1
];
sA
->
inducedDipolePolar
[
2
]
=
cAmoebaSim
.
pInducedDipolePolar
[
atomI
*
3
+
2
];
sA
->
inducedDipolePolar
[
2
]
=
cAmoebaSim
.
pInducedDipolePolar
[
atomI
*
3
+
2
];
sA
->
damp
=
cAmoebaSim
.
pDampingFactorAndThole
[
atomI
].
x
;
float2
dampingFactorAndThole
=
cAmoebaSim
.
pDampingFactorAndThole
[
atomI
];
sA
->
thole
=
cAmoebaSim
.
pDampingFactorAndThole
[
atomI
].
y
;
sA
->
damp
=
dampingFactorAndThole
.
x
;
sA
->
thole
=
dampingFactorAndThole
.
y
;
#ifdef GK
#ifdef GK
...
...
plugins/amoeba/platforms/cuda/src/kernels/kCalculateAmoebaCudaPmeDirectElectrostatic.cu
View file @
92a338cf
...
@@ -161,42 +161,6 @@ __device__ void calculatePmeDirectElectrostaticPairIxn_kernel( PmeDirectElectros
...
@@ -161,42 +161,6 @@ __device__ void calculatePmeDirectElectrostaticPairIxn_kernel( PmeDirectElectros
float
e
,
ei
;
float
e
,
ei
;
float
erl
,
erli
;
float
erl
,
erli
;
float
di
[
4
],
qi
[
10
];
float
dk
[
4
],
qk
[
10
];
float
fridmp
[
4
],
findmp
[
4
];
float
ftm2
[
4
],
ftm2i
[
4
];
float
ftm2r
[
4
],
ftm2ri
[
4
];
float
ttm2
[
4
],
ttm3
[
4
];
float
ttm2i
[
4
],
ttm3i
[
4
];
float
ttm2r
[
4
],
ttm3r
[
4
];
float
ttm2ri
[
4
],
ttm3ri
[
4
];
float
dixdk
[
4
];
float
dkxui
[
4
],
dixuk
[
4
];
float
dixukp
[
4
],
dkxuip
[
4
];
float
uixqkr
[
4
],
ukxqir
[
4
];
float
uixqkrp
[
4
],
ukxqirp
[
4
];
float
qiuk
[
4
],
qkui
[
4
];
float
qiukp
[
4
],
qkuip
[
4
];
float
rxqiuk
[
4
],
rxqkui
[
4
];
float
rxqiukp
[
4
],
rxqkuip
[
4
];
float
qidk
[
4
],
qkdi
[
4
];
float
qir
[
4
],
qkr
[
4
];
float
qiqkr
[
4
],
qkqir
[
4
];
float
qixqk
[
4
],
rxqir
[
4
];
float
dixr
[
4
],
dkxr
[
4
];
float
dixqkr
[
4
],
dkxqir
[
4
];
float
rxqkr
[
4
],
qkrxqir
[
4
];
float
rxqikr
[
4
],
rxqkir
[
4
];
float
rxqidk
[
4
],
rxqkdi
[
4
];
float
ddsc3
[
4
],
ddsc5
[
4
];
float
ddsc7
[
4
];
float
bn
[
6
];
float
sc
[
11
],
gl
[
9
];
float
sci
[
9
],
scip
[
9
];
float
gli
[
8
],
glip
[
8
];
float
gf
[
8
],
gfi
[
7
];
float
gfr
[
8
],
gfri
[
7
];
float
gti
[
7
],
gtri
[
7
];
float
conversionFactor
=
(
-
cAmoebaSim
.
electric
/
cAmoebaSim
.
dielec
);
float
conversionFactor
=
(
-
cAmoebaSim
.
electric
/
cAmoebaSim
.
dielec
);
...
@@ -206,19 +170,19 @@ __device__ void calculatePmeDirectElectrostaticPairIxn_kernel( PmeDirectElectros
...
@@ -206,19 +170,19 @@ __device__ void calculatePmeDirectElectrostaticPairIxn_kernel( PmeDirectElectros
float
pti
=
atomI
.
thole
;
float
pti
=
atomI
.
thole
;
float
ci
=
atomI
.
q
;
float
ci
=
atomI
.
q
;
di
[
1
]
=
atomI
.
labFrameDipole
[
0
];
float
di1
=
atomI
.
labFrameDipole
[
0
];
di
[
2
]
=
atomI
.
labFrameDipole
[
1
];
float
di2
=
atomI
.
labFrameDipole
[
1
];
di
[
3
]
=
atomI
.
labFrameDipole
[
2
];
float
di3
=
atomI
.
labFrameDipole
[
2
];
qi
[
1
]
=
atomI
.
labFrameQuadrupole
[
0
];
float
qi1
=
atomI
.
labFrameQuadrupole
[
0
];
qi
[
2
]
=
atomI
.
labFrameQuadrupole
[
1
];
float
qi2
=
atomI
.
labFrameQuadrupole
[
1
];
qi
[
3
]
=
atomI
.
labFrameQuadrupole
[
2
];
float
qi3
=
atomI
.
labFrameQuadrupole
[
2
];
qi
[
4
]
=
atomI
.
labFrameQuadrupole
[
3
];
float
qi4
=
atomI
.
labFrameQuadrupole
[
3
];
qi
[
5
]
=
atomI
.
labFrameQuadrupole
[
4
];
float
qi5
=
atomI
.
labFrameQuadrupole
[
4
];
qi
[
6
]
=
atomI
.
labFrameQuadrupole
[
5
];
float
qi6
=
atomI
.
labFrameQuadrupole
[
5
];
qi
[
7
]
=
atomI
.
labFrameQuadrupole
[
6
];
float
qi7
=
atomI
.
labFrameQuadrupole
[
6
];
qi
[
8
]
=
atomI
.
labFrameQuadrupole
[
7
];
float
qi8
=
atomI
.
labFrameQuadrupole
[
7
];
qi
[
9
]
=
atomI
.
labFrameQuadrupole
[
8
];
float
qi9
=
atomI
.
labFrameQuadrupole
[
8
];
float
xr
=
atomJ
.
x
-
atomI
.
x
;
float
xr
=
atomJ
.
x
-
atomI
.
x
;
float
yr
=
atomJ
.
y
-
atomI
.
y
;
float
yr
=
atomJ
.
y
-
atomI
.
y
;
...
@@ -236,25 +200,25 @@ __device__ void calculatePmeDirectElectrostaticPairIxn_kernel( PmeDirectElectros
...
@@ -236,25 +200,25 @@ __device__ void calculatePmeDirectElectrostaticPairIxn_kernel( PmeDirectElectros
float
r
=
sqrt
(
r2
);
float
r
=
sqrt
(
r2
);
float
ck
=
atomJ
.
q
;
float
ck
=
atomJ
.
q
;
dk
[
1
]
=
atomJ
.
labFrameDipole
[
0
];
float
dk1
=
atomJ
.
labFrameDipole
[
0
];
dk
[
2
]
=
atomJ
.
labFrameDipole
[
1
];
float
dk2
=
atomJ
.
labFrameDipole
[
1
];
dk
[
3
]
=
atomJ
.
labFrameDipole
[
2
];
float
dk3
=
atomJ
.
labFrameDipole
[
2
];
qk
[
1
]
=
atomJ
.
labFrameQuadrupole
[
0
];
float
qk1
=
atomJ
.
labFrameQuadrupole
[
0
];
qk
[
2
]
=
atomJ
.
labFrameQuadrupole
[
1
];
float
qk2
=
atomJ
.
labFrameQuadrupole
[
1
];
qk
[
3
]
=
atomJ
.
labFrameQuadrupole
[
2
];
float
qk3
=
atomJ
.
labFrameQuadrupole
[
2
];
qk
[
4
]
=
atomJ
.
labFrameQuadrupole
[
3
];
float
qk4
=
atomJ
.
labFrameQuadrupole
[
3
];
qk
[
5
]
=
atomJ
.
labFrameQuadrupole
[
4
];
float
qk5
=
atomJ
.
labFrameQuadrupole
[
4
];
qk
[
6
]
=
atomJ
.
labFrameQuadrupole
[
5
];
float
qk6
=
atomJ
.
labFrameQuadrupole
[
5
];
qk
[
7
]
=
atomJ
.
labFrameQuadrupole
[
6
];
float
qk7
=
atomJ
.
labFrameQuadrupole
[
6
];
qk
[
8
]
=
atomJ
.
labFrameQuadrupole
[
7
];
float
qk8
=
atomJ
.
labFrameQuadrupole
[
7
];
qk
[
9
]
=
atomJ
.
labFrameQuadrupole
[
8
];
float
qk9
=
atomJ
.
labFrameQuadrupole
[
8
];
// calculate the real space error function terms;
// calculate the real space error function terms;
float
ralpha
=
cSim
.
alphaEwald
*
r
;
float
ralpha
=
cSim
.
alphaEwald
*
r
;
bn
[
0
]
=
erfc
(
ralpha
)
/
r
;
float
bn0
=
erfc
(
ralpha
)
/
r
;
float
alsq2
=
2.0
f
*
cSim
.
alphaEwald
*
cSim
.
alphaEwald
;
float
alsq2
=
2.0
f
*
cSim
.
alphaEwald
*
cSim
.
alphaEwald
;
float
alsq2n
=
0.0
f
;
float
alsq2n
=
0.0
f
;
...
@@ -264,19 +228,19 @@ __device__ void calculatePmeDirectElectrostaticPairIxn_kernel( PmeDirectElectros
...
@@ -264,19 +228,19 @@ __device__ void calculatePmeDirectElectrostaticPairIxn_kernel( PmeDirectElectros
float
exp2a
=
exp
(
-
(
ralpha
*
ralpha
));
float
exp2a
=
exp
(
-
(
ralpha
*
ralpha
));
alsq2n
*=
alsq2
;
alsq2n
*=
alsq2
;
bn
[
1
]
=
(
bn
[
0
]
+
alsq2n
*
exp2a
)
/
r2
;
float
bn1
=
(
bn
0
+
alsq2n
*
exp2a
)
/
r2
;
alsq2n
*=
alsq2
;
alsq2n
*=
alsq2
;
bn
[
2
]
=
(
3.0
f
*
bn
[
1
]
+
alsq2n
*
exp2a
)
/
r2
;
float
bn2
=
(
3.0
f
*
bn
1
+
alsq2n
*
exp2a
)
/
r2
;
alsq2n
*=
alsq2
;
alsq2n
*=
alsq2
;
bn
[
3
]
=
(
5.0
f
*
bn
[
2
]
+
alsq2n
*
exp2a
)
/
r2
;
float
bn3
=
(
5.0
f
*
bn
2
+
alsq2n
*
exp2a
)
/
r2
;
alsq2n
*=
alsq2
;
alsq2n
*=
alsq2
;
bn
[
4
]
=
(
7.0
f
*
bn
[
3
]
+
alsq2n
*
exp2a
)
/
r2
;
float
bn4
=
(
7.0
f
*
bn
3
+
alsq2n
*
exp2a
)
/
r2
;
alsq2n
*=
alsq2
;
alsq2n
*=
alsq2
;
bn
[
5
]
=
(
9.0
f
*
bn
[
4
]
+
alsq2n
*
exp2a
)
/
r2
;
float
bn5
=
(
9.0
f
*
bn
4
+
alsq2n
*
exp2a
)
/
r2
;
// apply Thole polarization damping to scale factors;
// apply Thole polarization damping to scale factors;
...
@@ -290,17 +254,17 @@ __device__ void calculatePmeDirectElectrostaticPairIxn_kernel( PmeDirectElectros
...
@@ -290,17 +254,17 @@ __device__ void calculatePmeDirectElectrostaticPairIxn_kernel( PmeDirectElectros
float
scale5
=
1.0
f
;
float
scale5
=
1.0
f
;
float
scale7
=
1.0
f
;
float
scale7
=
1.0
f
;
ddsc3
[
1
]
=
0.0
f
;
float
ddsc3
1
=
0.0
f
;
ddsc3
[
2
]
=
0.0
f
;
float
ddsc3
2
=
0.0
f
;
ddsc3
[
3
]
=
0.0
f
;
float
ddsc3
3
=
0.0
f
;
ddsc5
[
1
]
=
0.0
f
;
float
ddsc5
1
=
0.0
f
;
ddsc5
[
2
]
=
0.0
f
;
float
ddsc5
2
=
0.0
f
;
ddsc5
[
3
]
=
0.0
f
;
float
ddsc5
3
=
0.0
f
;
ddsc7
[
1
]
=
0.0
f
;
float
ddsc7
1
=
0.0
f
;
ddsc7
[
2
]
=
0.0
f
;
float
ddsc7
2
=
0.0
f
;
ddsc7
[
3
]
=
0.0
f
;
float
ddsc7
3
=
0.0
f
;
float
pdk
=
atomJ
.
damp
;
float
pdk
=
atomJ
.
damp
;
float
ptk
=
atomJ
.
thole
;
float
ptk
=
atomJ
.
thole
;
...
@@ -318,17 +282,17 @@ __device__ void calculatePmeDirectElectrostaticPairIxn_kernel( PmeDirectElectros
...
@@ -318,17 +282,17 @@ __device__ void calculatePmeDirectElectrostaticPairIxn_kernel( PmeDirectElectros
float
temp5
=
-
damp
;
float
temp5
=
-
damp
;
float
temp7
=
-
0.2
f
-
0.6
f
*
damp
;
float
temp7
=
-
0.2
f
-
0.6
f
*
damp
;
ddsc3
[
1
]
=
temp3
*
xr
;
ddsc3
1
=
temp3
*
xr
;
ddsc3
[
2
]
=
temp3
*
yr
;
ddsc3
2
=
temp3
*
yr
;
ddsc3
[
3
]
=
temp3
*
zr
;
ddsc3
3
=
temp3
*
zr
;
ddsc5
[
1
]
=
temp5
*
ddsc3
[
1
]
;
ddsc5
1
=
temp5
*
ddsc3
1
;
ddsc5
[
2
]
=
temp5
*
ddsc3
[
2
]
;
ddsc5
2
=
temp5
*
ddsc3
2
;
ddsc5
[
3
]
=
temp5
*
ddsc3
[
3
]
;
ddsc5
3
=
temp5
*
ddsc3
3
;
ddsc7
[
1
]
=
temp7
*
ddsc5
[
1
]
;
ddsc7
1
=
temp7
*
ddsc5
1
;
ddsc7
[
2
]
=
temp7
*
ddsc5
[
2
]
;
ddsc7
2
=
temp7
*
ddsc5
2
;
ddsc7
[
3
]
=
temp7
*
ddsc5
[
3
]
;
ddsc7
3
=
temp7
*
ddsc5
3
;
}
}
}
}
...
@@ -345,210 +309,208 @@ __device__ void calculatePmeDirectElectrostaticPairIxn_kernel( PmeDirectElectros
...
@@ -345,210 +309,208 @@ __device__ void calculatePmeDirectElectrostaticPairIxn_kernel( PmeDirectElectros
// construct necessary auxiliary vectors
// construct necessary auxiliary vectors
dixdk
[
1
]
=
di
[
2
]
*
dk
[
3
]
-
di
[
3
]
*
dk
[
2
]
;
float
dixdk
1
=
di
2
*
dk3
-
di3
*
dk2
;
dixdk
[
2
]
=
di
[
3
]
*
dk
[
1
]
-
di
[
1
]
*
dk
[
3
]
;
float
dixdk
2
=
di
3
*
dk1
-
di1
*
dk3
;
dixdk
[
3
]
=
di
[
1
]
*
dk
[
2
]
-
di
[
2
]
*
dk
[
1
]
;
float
dixdk
3
=
di
1
*
dk2
-
di2
*
dk1
;
dixuk
[
1
]
=
di
[
2
]
*
atomJ
.
inducedDipole
[
2
]
-
di
[
3
]
*
atomJ
.
inducedDipole
[
1
];
float
dixuk
1
=
di
2
*
atomJ
.
inducedDipole
[
2
]
-
di
3
*
atomJ
.
inducedDipole
[
1
];
dixuk
[
2
]
=
di
[
3
]
*
atomJ
.
inducedDipole
[
0
]
-
di
[
1
]
*
atomJ
.
inducedDipole
[
2
];
float
dixuk
2
=
di
3
*
atomJ
.
inducedDipole
[
0
]
-
di
1
*
atomJ
.
inducedDipole
[
2
];
dixuk
[
3
]
=
di
[
1
]
*
atomJ
.
inducedDipole
[
1
]
-
di
[
2
]
*
atomJ
.
inducedDipole
[
0
];
float
dixuk
3
=
di
1
*
atomJ
.
inducedDipole
[
1
]
-
di
2
*
atomJ
.
inducedDipole
[
0
];
dkxui
[
1
]
=
dk
[
2
]
*
atomI
.
inducedDipole
[
2
]
-
dk
[
3
]
*
atomI
.
inducedDipole
[
1
];
float
dkxui
1
=
dk
2
*
atomI
.
inducedDipole
[
2
]
-
dk
3
*
atomI
.
inducedDipole
[
1
];
dkxui
[
2
]
=
dk
[
3
]
*
atomI
.
inducedDipole
[
0
]
-
dk
[
1
]
*
atomI
.
inducedDipole
[
2
];
float
dkxui
2
=
dk
3
*
atomI
.
inducedDipole
[
0
]
-
dk
1
*
atomI
.
inducedDipole
[
2
];
dkxui
[
3
]
=
dk
[
1
]
*
atomI
.
inducedDipole
[
1
]
-
dk
[
2
]
*
atomI
.
inducedDipole
[
0
];
float
dkxui
3
=
dk
1
*
atomI
.
inducedDipole
[
1
]
-
dk
2
*
atomI
.
inducedDipole
[
0
];
dixukp
[
1
]
=
di
[
2
]
*
atomJ
.
inducedDipoleP
[
2
]
-
di
[
3
]
*
atomJ
.
inducedDipoleP
[
1
];
float
dixukp
1
=
di
2
*
atomJ
.
inducedDipoleP
[
2
]
-
di
3
*
atomJ
.
inducedDipoleP
[
1
];
dixukp
[
2
]
=
di
[
3
]
*
atomJ
.
inducedDipoleP
[
0
]
-
di
[
1
]
*
atomJ
.
inducedDipoleP
[
2
];
float
dixukp
2
=
di
3
*
atomJ
.
inducedDipoleP
[
0
]
-
di
1
*
atomJ
.
inducedDipoleP
[
2
];
dixukp
[
3
]
=
di
[
1
]
*
atomJ
.
inducedDipoleP
[
1
]
-
di
[
2
]
*
atomJ
.
inducedDipoleP
[
0
];
float
dixukp
3
=
di
1
*
atomJ
.
inducedDipoleP
[
1
]
-
di
2
*
atomJ
.
inducedDipoleP
[
0
];
dkxuip
[
1
]
=
dk
[
2
]
*
atomI
.
inducedDipoleP
[
2
]
-
dk
[
3
]
*
atomI
.
inducedDipoleP
[
1
];
float
dkxuip
1
=
dk
2
*
atomI
.
inducedDipoleP
[
2
]
-
dk
3
*
atomI
.
inducedDipoleP
[
1
];
dkxuip
[
2
]
=
dk
[
3
]
*
atomI
.
inducedDipoleP
[
0
]
-
dk
[
1
]
*
atomI
.
inducedDipoleP
[
2
];
float
dkxuip
2
=
dk
3
*
atomI
.
inducedDipoleP
[
0
]
-
dk
1
*
atomI
.
inducedDipoleP
[
2
];
dkxuip
[
3
]
=
dk
[
1
]
*
atomI
.
inducedDipoleP
[
1
]
-
dk
[
2
]
*
atomI
.
inducedDipoleP
[
0
];
float
dkxuip
3
=
dk
1
*
atomI
.
inducedDipoleP
[
1
]
-
dk
2
*
atomI
.
inducedDipoleP
[
0
];
dixr
[
1
]
=
di
[
2
]
*
zr
-
di
[
3
]
*
yr
;
float
dixr
1
=
di
2
*
zr
-
di
3
*
yr
;
dixr
[
2
]
=
di
[
3
]
*
xr
-
di
[
1
]
*
zr
;
float
dixr
2
=
di
3
*
xr
-
di
1
*
zr
;
dixr
[
3
]
=
di
[
1
]
*
yr
-
di
[
2
]
*
xr
;
float
dixr
3
=
di
1
*
yr
-
di
2
*
xr
;
dkxr
[
1
]
=
dk
[
2
]
*
zr
-
dk
[
3
]
*
yr
;
float
dkxr
1
=
dk
2
*
zr
-
dk
3
*
yr
;
dkxr
[
2
]
=
dk
[
3
]
*
xr
-
dk
[
1
]
*
zr
;
float
dkxr
2
=
dk
3
*
xr
-
dk
1
*
zr
;
dkxr
[
3
]
=
dk
[
1
]
*
yr
-
dk
[
2
]
*
xr
;
float
dkxr
3
=
dk
1
*
yr
-
dk
2
*
xr
;
qir
[
1
]
=
qi
[
1
]
*
xr
+
qi
[
4
]
*
yr
+
qi
[
7
]
*
zr
;
float
qir1
=
qi
1
*
xr
+
qi
4
*
yr
+
qi
7
*
zr
;
qir
[
2
]
=
qi
[
2
]
*
xr
+
qi
[
5
]
*
yr
+
qi
[
8
]
*
zr
;
float
qir2
=
qi
2
*
xr
+
qi
5
*
yr
+
qi
8
*
zr
;
qir
[
3
]
=
qi
[
3
]
*
xr
+
qi
[
6
]
*
yr
+
qi
[
9
]
*
zr
;
float
qir3
=
qi
3
*
xr
+
qi
6
*
yr
+
qi
9
*
zr
;
qkr
[
1
]
=
qk
[
1
]
*
xr
+
qk
[
4
]
*
yr
+
qk
[
7
]
*
zr
;
float
qkr1
=
qk
1
*
xr
+
qk
4
*
yr
+
qk
7
*
zr
;
qkr
[
2
]
=
qk
[
2
]
*
xr
+
qk
[
5
]
*
yr
+
qk
[
8
]
*
zr
;
float
qkr2
=
qk
2
*
xr
+
qk
5
*
yr
+
qk
8
*
zr
;
qkr
[
3
]
=
qk
[
3
]
*
xr
+
qk
[
6
]
*
yr
+
qk
[
9
]
*
zr
;
float
qkr3
=
qk
3
*
xr
+
qk
6
*
yr
+
qk
9
*
zr
;
qiqkr
[
1
]
=
qi
[
1
]
*
qkr
[
1
]
+
qi
[
4
]
*
qkr
[
2
]
+
qi
[
7
]
*
qkr
[
3
]
;
float
qiqkr
1
=
qi
1
*
qkr
1
+
qi
4
*
qkr
2
+
qi
7
*
qkr
3
;
qiqkr
[
2
]
=
qi
[
2
]
*
qkr
[
1
]
+
qi
[
5
]
*
qkr
[
2
]
+
qi
[
8
]
*
qkr
[
3
]
;
float
qiqkr
2
=
qi
2
*
qkr
1
+
qi
5
*
qkr
2
+
qi
8
*
qkr
3
;
qiqkr
[
3
]
=
qi
[
3
]
*
qkr
[
1
]
+
qi
[
6
]
*
qkr
[
2
]
+
qi
[
9
]
*
qkr
[
3
]
;
float
qiqkr
3
=
qi
3
*
qkr
1
+
qi
6
*
qkr
2
+
qi
9
*
qkr
3
;
qkqir
[
1
]
=
qk
[
1
]
*
qir
[
1
]
+
qk
[
4
]
*
qir
[
2
]
+
qk
[
7
]
*
qir
[
3
]
;
float
qkqir
1
=
qk
1
*
qir
1
+
qk
4
*
qir
2
+
qk
7
*
qir
3
;
qkqir
[
2
]
=
qk
[
2
]
*
qir
[
1
]
+
qk
[
5
]
*
qir
[
2
]
+
qk
[
8
]
*
qir
[
3
]
;
float
qkqir
2
=
qk
2
*
qir
1
+
qk
5
*
qir
2
+
qk
8
*
qir
3
;
qkqir
[
3
]
=
qk
[
3
]
*
qir
[
1
]
+
qk
[
6
]
*
qir
[
2
]
+
qk
[
9
]
*
qir
[
3
]
;
float
qkqir
3
=
qk
3
*
qir
1
+
qk
6
*
qir
2
+
qk
9
*
qir
3
;
qixqk
[
1
]
=
qi
[
2
]
*
qk
[
3
]
+
qi
[
5
]
*
qk
[
6
]
+
qi
[
8
]
*
qk
[
9
]
float
qixqk
1
=
qi
2
*
qk3
+
qi5
*
qk6
+
qi8
*
qk9
-
qi
[
3
]
*
qk
[
2
]
-
qi
[
6
]
*
qk
[
5
]
-
qi
[
9
]
*
qk
[
8
]
;
-
qi
3
*
qk2
-
qi6
*
qk5
-
qi9
*
qk8
;
qixqk
[
2
]
=
qi
[
3
]
*
qk
[
1
]
+
qi
[
6
]
*
qk
[
4
]
+
qi
[
9
]
*
qk
[
7
]
float
qixqk
2
=
qi
3
*
qk1
+
qi6
*
qk4
+
qi9
*
qk7
-
qi
[
1
]
*
qk
[
3
]
-
qi
[
4
]
*
qk
[
6
]
-
qi
[
7
]
*
qk
[
9
]
;
-
qi
1
*
qk3
-
qi4
*
qk6
-
qi7
*
qk9
;
qixqk
[
3
]
=
qi
[
1
]
*
qk
[
2
]
+
qi
[
4
]
*
qk
[
5
]
+
qi
[
7
]
*
qk
[
8
]
float
qixqk
3
=
qi
1
*
qk2
+
qi4
*
qk5
+
qi7
*
qk8
-
qi
[
2
]
*
qk
[
1
]
-
qi
[
5
]
*
qk
[
4
]
-
qi
[
8
]
*
qk
[
7
]
;
-
qi
2
*
qk1
-
qi5
*
qk4
-
qi8
*
qk7
;
rxqir
[
1
]
=
yr
*
qir
[
3
]
-
zr
*
qir
[
2
]
;
float
rxqir
1
=
yr
*
qir
3
-
zr
*
qir
2
;
rxqir
[
2
]
=
zr
*
qir
[
1
]
-
xr
*
qir
[
3
]
;
float
rxqir
2
=
zr
*
qir
1
-
xr
*
qir
3
;
rxqir
[
3
]
=
xr
*
qir
[
2
]
-
yr
*
qir
[
1
]
;
float
rxqir
3
=
xr
*
qir
2
-
yr
*
qir
1
;
rxqkr
[
1
]
=
yr
*
qkr
[
3
]
-
zr
*
qkr
[
2
]
;
float
rxqkr
1
=
yr
*
qkr
3
-
zr
*
qkr
2
;
rxqkr
[
2
]
=
zr
*
qkr
[
1
]
-
xr
*
qkr
[
3
]
;
float
rxqkr
2
=
zr
*
qkr
1
-
xr
*
qkr
3
;
rxqkr
[
3
]
=
xr
*
qkr
[
2
]
-
yr
*
qkr
[
1
]
;
float
rxqkr
3
=
xr
*
qkr
2
-
yr
*
qkr
1
;
rxqikr
[
1
]
=
yr
*
qiqkr
[
3
]
-
zr
*
qiqkr
[
2
]
;
float
rxqikr
1
=
yr
*
qiqkr
3
-
zr
*
qiqkr
2
;
rxqikr
[
2
]
=
zr
*
qiqkr
[
1
]
-
xr
*
qiqkr
[
3
]
;
float
rxqikr
2
=
zr
*
qiqkr
1
-
xr
*
qiqkr
3
;
rxqikr
[
3
]
=
xr
*
qiqkr
[
2
]
-
yr
*
qiqkr
[
1
]
;
float
rxqikr
3
=
xr
*
qiqkr
2
-
yr
*
qiqkr
1
;
rxqkir
[
1
]
=
yr
*
qkqir
[
3
]
-
zr
*
qkqir
[
2
]
;
float
rxqkir
1
=
yr
*
qkqir
3
-
zr
*
qkqir
2
;
rxqkir
[
2
]
=
zr
*
qkqir
[
1
]
-
xr
*
qkqir
[
3
]
;
float
rxqkir
2
=
zr
*
qkqir
1
-
xr
*
qkqir
3
;
rxqkir
[
3
]
=
xr
*
qkqir
[
2
]
-
yr
*
qkqir
[
1
]
;
float
rxqkir
3
=
xr
*
qkqir
2
-
yr
*
qkqir
1
;
qkrxqir
[
1
]
=
qkr
[
2
]
*
qir
[
3
]
-
qkr
[
3
]
*
qir
[
2
]
;
float
qkrxqir
1
=
qkr
2
*
qir
3
-
qkr
3
*
qir
2
;
qkrxqir
[
2
]
=
qkr
[
3
]
*
qir
[
1
]
-
qkr
[
1
]
*
qir
[
3
]
;
float
qkrxqir
2
=
qkr
3
*
qir
1
-
qkr
1
*
qir
3
;
qkrxqir
[
3
]
=
qkr
[
1
]
*
qir
[
2
]
-
qkr
[
2
]
*
qir
[
1
]
;
float
qkrxqir
3
=
qkr
1
*
qir
2
-
qkr
2
*
qir
1
;
qidk
[
1
]
=
qi
[
1
]
*
dk
[
1
]
+
qi
[
4
]
*
dk
[
2
]
+
qi
[
7
]
*
dk
[
3
]
;
float
qidk
1
=
qi
1
*
dk1
+
qi4
*
dk2
+
qi7
*
dk3
;
qidk
[
2
]
=
qi
[
2
]
*
dk
[
1
]
+
qi
[
5
]
*
dk
[
2
]
+
qi
[
8
]
*
dk
[
3
]
;
float
qidk
2
=
qi
2
*
dk1
+
qi5
*
dk2
+
qi8
*
dk3
;
qidk
[
3
]
=
qi
[
3
]
*
dk
[
1
]
+
qi
[
6
]
*
dk
[
2
]
+
qi
[
9
]
*
dk
[
3
]
;
float
qidk
3
=
qi
3
*
dk1
+
qi6
*
dk2
+
qi9
*
dk3
;
qkdi
[
1
]
=
qk
[
1
]
*
di
[
1
]
+
qk
[
4
]
*
di
[
2
]
+
qk
[
7
]
*
di
[
3
]
;
float
qkdi
1
=
qk
1
*
di1
+
qk4
*
di2
+
qk7
*
di3
;
qkdi
[
2
]
=
qk
[
2
]
*
di
[
1
]
+
qk
[
5
]
*
di
[
2
]
+
qk
[
8
]
*
di
[
3
]
;
float
qkdi
2
=
qk
2
*
di1
+
qk5
*
di2
+
qk8
*
di3
;
qkdi
[
3
]
=
qk
[
3
]
*
di
[
1
]
+
qk
[
6
]
*
di
[
2
]
+
qk
[
9
]
*
di
[
3
]
;
float
qkdi
3
=
qk
3
*
di1
+
qk6
*
di2
+
qk9
*
di3
;
qiuk
[
1
]
=
qi
[
1
]
*
atomJ
.
inducedDipole
[
0
]
+
qi
[
4
]
*
atomJ
.
inducedDipole
[
1
]
float
qiuk
1
=
qi
1
*
atomJ
.
inducedDipole
[
0
]
+
qi
4
*
atomJ
.
inducedDipole
[
1
]
+
qi
[
7
]
*
atomJ
.
inducedDipole
[
2
];
+
qi
7
*
atomJ
.
inducedDipole
[
2
];
qiuk
[
2
]
=
qi
[
2
]
*
atomJ
.
inducedDipole
[
0
]
+
qi
[
5
]
*
atomJ
.
inducedDipole
[
1
]
float
qiuk
2
=
qi
2
*
atomJ
.
inducedDipole
[
0
]
+
qi
5
*
atomJ
.
inducedDipole
[
1
]
+
qi
[
8
]
*
atomJ
.
inducedDipole
[
2
];
+
qi
8
*
atomJ
.
inducedDipole
[
2
];
qiuk
[
3
]
=
qi
[
3
]
*
atomJ
.
inducedDipole
[
0
]
+
qi
[
6
]
*
atomJ
.
inducedDipole
[
1
]
float
qiuk
3
=
qi
3
*
atomJ
.
inducedDipole
[
0
]
+
qi
6
*
atomJ
.
inducedDipole
[
1
]
+
qi
[
9
]
*
atomJ
.
inducedDipole
[
2
];
+
qi
9
*
atomJ
.
inducedDipole
[
2
];
qkui
[
1
]
=
qk
[
1
]
*
atomI
.
inducedDipole
[
0
]
+
qk
[
4
]
*
atomI
.
inducedDipole
[
1
]
float
qkui
1
=
qk
1
*
atomI
.
inducedDipole
[
0
]
+
qk
4
*
atomI
.
inducedDipole
[
1
]
+
qk
[
7
]
*
atomI
.
inducedDipole
[
2
];
+
qk
7
*
atomI
.
inducedDipole
[
2
];
qkui
[
2
]
=
qk
[
2
]
*
atomI
.
inducedDipole
[
0
]
+
qk
[
5
]
*
atomI
.
inducedDipole
[
1
]
float
qkui
2
=
qk
2
*
atomI
.
inducedDipole
[
0
]
+
qk
5
*
atomI
.
inducedDipole
[
1
]
+
qk
[
8
]
*
atomI
.
inducedDipole
[
2
];
+
qk
8
*
atomI
.
inducedDipole
[
2
];
qkui
[
3
]
=
qk
[
3
]
*
atomI
.
inducedDipole
[
0
]
+
qk
[
6
]
*
atomI
.
inducedDipole
[
1
]
float
qkui
3
=
qk
3
*
atomI
.
inducedDipole
[
0
]
+
qk
6
*
atomI
.
inducedDipole
[
1
]
+
qk
[
9
]
*
atomI
.
inducedDipole
[
2
];
+
qk
9
*
atomI
.
inducedDipole
[
2
];
qiukp
[
1
]
=
qi
[
1
]
*
atomJ
.
inducedDipoleP
[
0
]
+
qi
[
4
]
*
atomJ
.
inducedDipoleP
[
1
]
float
qiukp
1
=
qi
1
*
atomJ
.
inducedDipoleP
[
0
]
+
qi
4
*
atomJ
.
inducedDipoleP
[
1
]
+
qi
[
7
]
*
atomJ
.
inducedDipoleP
[
2
];
+
qi
7
*
atomJ
.
inducedDipoleP
[
2
];
qiukp
[
2
]
=
qi
[
2
]
*
atomJ
.
inducedDipoleP
[
0
]
+
qi
[
5
]
*
atomJ
.
inducedDipoleP
[
1
]
float
qiukp
2
=
qi
2
*
atomJ
.
inducedDipoleP
[
0
]
+
qi
5
*
atomJ
.
inducedDipoleP
[
1
]
+
qi
[
8
]
*
atomJ
.
inducedDipoleP
[
2
];
+
qi
8
*
atomJ
.
inducedDipoleP
[
2
];
qiukp
[
3
]
=
qi
[
3
]
*
atomJ
.
inducedDipoleP
[
0
]
+
qi
[
6
]
*
atomJ
.
inducedDipoleP
[
1
]
float
qiukp
3
=
qi
3
*
atomJ
.
inducedDipoleP
[
0
]
+
qi
6
*
atomJ
.
inducedDipoleP
[
1
]
+
qi
[
9
]
*
atomJ
.
inducedDipoleP
[
2
];
+
qi
9
*
atomJ
.
inducedDipoleP
[
2
];
qkuip
[
1
]
=
qk
[
1
]
*
atomI
.
inducedDipoleP
[
0
]
+
qk
[
4
]
*
atomI
.
inducedDipoleP
[
1
]
float
qkuip
1
=
qk
1
*
atomI
.
inducedDipoleP
[
0
]
+
qk
4
*
atomI
.
inducedDipoleP
[
1
]
+
qk
[
7
]
*
atomI
.
inducedDipoleP
[
2
];
+
qk
7
*
atomI
.
inducedDipoleP
[
2
];
qkuip
[
2
]
=
qk
[
2
]
*
atomI
.
inducedDipoleP
[
0
]
+
qk
[
5
]
*
atomI
.
inducedDipoleP
[
1
]
float
qkuip
2
=
qk
2
*
atomI
.
inducedDipoleP
[
0
]
+
qk
5
*
atomI
.
inducedDipoleP
[
1
]
+
qk
[
8
]
*
atomI
.
inducedDipoleP
[
2
];
+
qk
8
*
atomI
.
inducedDipoleP
[
2
];
qkuip
[
3
]
=
qk
[
3
]
*
atomI
.
inducedDipoleP
[
0
]
+
qk
[
6
]
*
atomI
.
inducedDipoleP
[
1
]
float
qkuip
3
=
qk
3
*
atomI
.
inducedDipoleP
[
0
]
+
qk
6
*
atomI
.
inducedDipoleP
[
1
]
+
qk
[
9
]
*
atomI
.
inducedDipoleP
[
2
];
+
qk
9
*
atomI
.
inducedDipoleP
[
2
];
dixqkr
[
1
]
=
di
[
2
]
*
qkr
[
3
]
-
di
[
3
]
*
qkr
[
2
]
;
float
dixqkr
1
=
di
2
*
qkr
3
-
di
3
*
qkr
2
;
dixqkr
[
2
]
=
di
[
3
]
*
qkr
[
1
]
-
di
[
1
]
*
qkr
[
3
]
;
float
dixqkr
2
=
di
3
*
qkr
1
-
di
1
*
qkr
3
;
dixqkr
[
3
]
=
di
[
1
]
*
qkr
[
2
]
-
di
[
2
]
*
qkr
[
1
]
;
float
dixqkr
3
=
di
1
*
qkr
2
-
di
2
*
qkr
1
;
dkxqir
[
1
]
=
dk
[
2
]
*
qir
[
3
]
-
dk
[
3
]
*
qir
[
2
]
;
float
dkxqir
1
=
dk
2
*
qir
3
-
dk
3
*
qir
2
;
dkxqir
[
2
]
=
dk
[
3
]
*
qir
[
1
]
-
dk
[
1
]
*
qir
[
3
]
;
float
dkxqir
2
=
dk
3
*
qir
1
-
dk
1
*
qir
3
;
dkxqir
[
3
]
=
dk
[
1
]
*
qir
[
2
]
-
dk
[
2
]
*
qir
[
1
]
;
float
dkxqir
3
=
dk
1
*
qir
2
-
dk
2
*
qir
1
;
uixqkr
[
1
]
=
atomI
.
inducedDipole
[
1
]
*
qkr
[
3
]
-
atomI
.
inducedDipole
[
2
]
*
qkr
[
2
]
;
float
uixqkr
1
=
atomI
.
inducedDipole
[
1
]
*
qkr
3
-
atomI
.
inducedDipole
[
2
]
*
qkr
2
;
uixqkr
[
2
]
=
atomI
.
inducedDipole
[
2
]
*
qkr
[
1
]
-
atomI
.
inducedDipole
[
0
]
*
qkr
[
3
]
;
float
uixqkr
2
=
atomI
.
inducedDipole
[
2
]
*
qkr
1
-
atomI
.
inducedDipole
[
0
]
*
qkr
3
;
uixqkr
[
3
]
=
atomI
.
inducedDipole
[
0
]
*
qkr
[
2
]
-
atomI
.
inducedDipole
[
1
]
*
qkr
[
1
]
;
float
uixqkr
3
=
atomI
.
inducedDipole
[
0
]
*
qkr
2
-
atomI
.
inducedDipole
[
1
]
*
qkr
1
;
ukxqir
[
1
]
=
atomJ
.
inducedDipole
[
1
]
*
qir
[
3
]
-
atomJ
.
inducedDipole
[
2
]
*
qir
[
2
]
;
float
ukxqir
1
=
atomJ
.
inducedDipole
[
1
]
*
qir
3
-
atomJ
.
inducedDipole
[
2
]
*
qir
2
;
ukxqir
[
2
]
=
atomJ
.
inducedDipole
[
2
]
*
qir
[
1
]
-
atomJ
.
inducedDipole
[
0
]
*
qir
[
3
]
;
float
ukxqir
2
=
atomJ
.
inducedDipole
[
2
]
*
qir
1
-
atomJ
.
inducedDipole
[
0
]
*
qir
3
;
ukxqir
[
3
]
=
atomJ
.
inducedDipole
[
0
]
*
qir
[
2
]
-
atomJ
.
inducedDipole
[
1
]
*
qir
[
1
]
;
float
ukxqir
3
=
atomJ
.
inducedDipole
[
0
]
*
qir
2
-
atomJ
.
inducedDipole
[
1
]
*
qir
1
;
uixqkrp
[
1
]
=
atomI
.
inducedDipoleP
[
1
]
*
qkr
[
3
]
-
atomI
.
inducedDipoleP
[
2
]
*
qkr
[
2
]
;
float
uixqkrp
1
=
atomI
.
inducedDipoleP
[
1
]
*
qkr
3
-
atomI
.
inducedDipoleP
[
2
]
*
qkr
2
;
uixqkrp
[
2
]
=
atomI
.
inducedDipoleP
[
2
]
*
qkr
[
1
]
-
atomI
.
inducedDipoleP
[
0
]
*
qkr
[
3
]
;
float
uixqkrp
2
=
atomI
.
inducedDipoleP
[
2
]
*
qkr
1
-
atomI
.
inducedDipoleP
[
0
]
*
qkr
3
;
uixqkrp
[
3
]
=
atomI
.
inducedDipoleP
[
0
]
*
qkr
[
2
]
-
atomI
.
inducedDipoleP
[
1
]
*
qkr
[
1
]
;
float
uixqkrp
3
=
atomI
.
inducedDipoleP
[
0
]
*
qkr
2
-
atomI
.
inducedDipoleP
[
1
]
*
qkr
1
;
ukxqirp
[
1
]
=
atomJ
.
inducedDipoleP
[
1
]
*
qir
[
3
]
-
atomJ
.
inducedDipoleP
[
2
]
*
qir
[
2
]
;
float
ukxqirp
1
=
atomJ
.
inducedDipoleP
[
1
]
*
qir
3
-
atomJ
.
inducedDipoleP
[
2
]
*
qir
2
;
ukxqirp
[
2
]
=
atomJ
.
inducedDipoleP
[
2
]
*
qir
[
1
]
-
atomJ
.
inducedDipoleP
[
0
]
*
qir
[
3
]
;
float
ukxqirp
2
=
atomJ
.
inducedDipoleP
[
2
]
*
qir
1
-
atomJ
.
inducedDipoleP
[
0
]
*
qir
3
;
ukxqirp
[
3
]
=
atomJ
.
inducedDipoleP
[
0
]
*
qir
[
2
]
-
atomJ
.
inducedDipoleP
[
1
]
*
qir
[
1
]
;
float
ukxqirp
3
=
atomJ
.
inducedDipoleP
[
0
]
*
qir
2
-
atomJ
.
inducedDipoleP
[
1
]
*
qir
1
;
rxqidk
[
1
]
=
yr
*
qidk
[
3
]
-
zr
*
qidk
[
2
]
;
float
rxqidk
1
=
yr
*
qidk
3
-
zr
*
qidk
2
;
rxqidk
[
2
]
=
zr
*
qidk
[
1
]
-
xr
*
qidk
[
3
]
;
float
rxqidk
2
=
zr
*
qidk
1
-
xr
*
qidk
3
;
rxqidk
[
3
]
=
xr
*
qidk
[
2
]
-
yr
*
qidk
[
1
]
;
float
rxqidk
3
=
xr
*
qidk
2
-
yr
*
qidk
1
;
rxqkdi
[
1
]
=
yr
*
qkdi
[
3
]
-
zr
*
qkdi
[
2
]
;
float
rxqkdi
1
=
yr
*
qkdi
3
-
zr
*
qkdi
2
;
rxqkdi
[
2
]
=
zr
*
qkdi
[
1
]
-
xr
*
qkdi
[
3
]
;
float
rxqkdi
2
=
zr
*
qkdi
1
-
xr
*
qkdi
3
;
rxqkdi
[
3
]
=
xr
*
qkdi
[
2
]
-
yr
*
qkdi
[
1
]
;
float
rxqkdi
3
=
xr
*
qkdi
2
-
yr
*
qkdi
1
;
rxqiuk
[
1
]
=
yr
*
qiuk
[
3
]
-
zr
*
qiuk
[
2
]
;
float
rxqiuk
1
=
yr
*
qiuk
3
-
zr
*
qiuk
2
;
rxqiuk
[
2
]
=
zr
*
qiuk
[
1
]
-
xr
*
qiuk
[
3
]
;
float
rxqiuk
2
=
zr
*
qiuk
1
-
xr
*
qiuk
3
;
rxqiuk
[
3
]
=
xr
*
qiuk
[
2
]
-
yr
*
qiuk
[
1
]
;
float
rxqiuk
3
=
xr
*
qiuk
2
-
yr
*
qiuk
1
;
rxqkui
[
1
]
=
yr
*
qkui
[
3
]
-
zr
*
qkui
[
2
]
;
float
rxqkui
1
=
yr
*
qkui
3
-
zr
*
qkui
2
;
rxqkui
[
2
]
=
zr
*
qkui
[
1
]
-
xr
*
qkui
[
3
]
;
float
rxqkui
2
=
zr
*
qkui
1
-
xr
*
qkui
3
;
rxqkui
[
3
]
=
xr
*
qkui
[
2
]
-
yr
*
qkui
[
1
]
;
float
rxqkui
3
=
xr
*
qkui
2
-
yr
*
qkui
1
;
rxqiukp
[
1
]
=
yr
*
qiukp
[
3
]
-
zr
*
qiukp
[
2
]
;
float
rxqiukp
1
=
yr
*
qiukp
3
-
zr
*
qiukp
2
;
rxqiukp
[
2
]
=
zr
*
qiukp
[
1
]
-
xr
*
qiukp
[
3
]
;
float
rxqiukp
2
=
zr
*
qiukp
1
-
xr
*
qiukp
3
;
rxqiukp
[
3
]
=
xr
*
qiukp
[
2
]
-
yr
*
qiukp
[
1
]
;
float
rxqiukp
3
=
xr
*
qiukp
2
-
yr
*
qiukp
1
;
rxqkuip
[
1
]
=
yr
*
qkuip
[
3
]
-
zr
*
qkuip
[
2
]
;
float
rxqkuip
1
=
yr
*
qkuip
3
-
zr
*
qkuip
2
;
rxqkuip
[
2
]
=
zr
*
qkuip
[
1
]
-
xr
*
qkuip
[
3
]
;
float
rxqkuip
2
=
zr
*
qkuip
1
-
xr
*
qkuip
3
;
rxqkuip
[
3
]
=
xr
*
qkuip
[
2
]
-
yr
*
qkuip
[
1
]
;
float
rxqkuip
3
=
xr
*
qkuip
2
-
yr
*
qkuip
1
;
// calculate the scalar products for permanent components
// calculate the scalar products for permanent components
sc
[
2
]
=
di
[
1
]
*
dk
[
1
]
+
di
[
2
]
*
dk
[
2
]
+
di
[
3
]
*
dk
[
3
]
;
float
sc2
=
di
1
*
dk1
+
di2
*
dk2
+
di3
*
dk3
;
sc
[
3
]
=
di
[
1
]
*
xr
+
di
[
2
]
*
yr
+
di
[
3
]
*
zr
;
float
sc3
=
di
1
*
xr
+
di
2
*
yr
+
di
3
*
zr
;
sc
[
4
]
=
dk
[
1
]
*
xr
+
dk
[
2
]
*
yr
+
dk
[
3
]
*
zr
;
float
sc4
=
dk
1
*
xr
+
dk
2
*
yr
+
dk
3
*
zr
;
sc
[
5
]
=
qir
[
1
]
*
xr
+
qir
[
2
]
*
yr
+
qir
[
3
]
*
zr
;
float
sc5
=
qir
1
*
xr
+
qir
2
*
yr
+
qir
3
*
zr
;
sc
[
6
]
=
qkr
[
1
]
*
xr
+
qkr
[
2
]
*
yr
+
qkr
[
3
]
*
zr
;
float
sc6
=
qkr
1
*
xr
+
qkr
2
*
yr
+
qkr
3
*
zr
;
sc
[
7
]
=
qir
[
1
]
*
dk
[
1
]
+
qir
[
2
]
*
dk
[
2
]
+
qir
[
3
]
*
dk
[
3
]
;
float
sc7
=
qir
1
*
dk1
+
qir2
*
dk2
+
qir3
*
dk3
;
sc
[
8
]
=
qkr
[
1
]
*
di
[
1
]
+
qkr
[
2
]
*
di
[
2
]
+
qkr
[
3
]
*
di
[
3
]
;
float
sc8
=
qkr
1
*
di1
+
qkr2
*
di2
+
qkr3
*
di3
;
sc
[
9
]
=
qir
[
1
]
*
qkr
[
1
]
+
qir
[
2
]
*
qkr
[
2
]
+
qir
[
3
]
*
qkr
[
3
]
;
float
sc9
=
qir
1
*
qkr
1
+
qir
2
*
qkr
2
+
qir
3
*
qkr
3
;
sc
[
10
]
=
qi
[
1
]
*
qk
[
1
]
+
qi
[
2
]
*
qk
[
2
]
+
qi
[
3
]
*
qk
[
3
]
float
sc10
=
qi
1
*
qk1
+
qi2
*
qk2
+
qi3
*
qk3
+
qi
[
4
]
*
qk
[
4
]
+
qi
[
5
]
*
qk
[
5
]
+
qi
[
6
]
*
qk
[
6
]
+
qi
4
*
qk4
+
qi5
*
qk5
+
qi6
*
qk6
+
qi
[
7
]
*
qk
[
7
]
+
qi
[
8
]
*
qk
[
8
]
+
qi
[
9
]
*
qk
[
9
]
;
+
qi
7
*
qk7
+
qi8
*
qk8
+
qi9
*
qk9
;
// calculate the scalar products for induced components
// calculate the scalar products for induced components
sci
[
1
]
=
atomI
.
inducedDipole
[
0
]
*
dk
[
1
]
+
atomI
.
inducedDipole
[
1
]
*
dk
[
2
]
float
sci1
=
atomI
.
inducedDipole
[
0
]
*
dk1
+
atomI
.
inducedDipole
[
1
]
*
dk2
+
atomI
.
inducedDipole
[
2
]
*
dk
[
3
]
+
di
[
1
]
*
atomJ
.
inducedDipole
[
0
]
+
atomI
.
inducedDipole
[
2
]
*
dk3
+
di1
*
atomJ
.
inducedDipole
[
0
]
+
di
[
2
]
*
atomJ
.
inducedDipole
[
1
]
+
di
[
3
]
*
atomJ
.
inducedDipole
[
2
];
+
di2
*
atomJ
.
inducedDipole
[
1
]
+
di3
*
atomJ
.
inducedDipole
[
2
];
sci
[
2
]
=
atomI
.
inducedDipole
[
0
]
*
atomJ
.
inducedDipole
[
0
]
+
atomI
.
inducedDipole
[
1
]
*
atomJ
.
inducedDipole
[
1
]
float
sci3
=
atomI
.
inducedDipole
[
0
]
*
xr
+
atomI
.
inducedDipole
[
1
]
*
yr
+
atomI
.
inducedDipole
[
2
]
*
zr
;
+
atomI
.
inducedDipole
[
2
]
*
atomJ
.
inducedDipole
[
2
];
float
sci4
=
atomJ
.
inducedDipole
[
0
]
*
xr
+
atomJ
.
inducedDipole
[
1
]
*
yr
+
atomJ
.
inducedDipole
[
2
]
*
zr
;
sci
[
3
]
=
atomI
.
inducedDipole
[
0
]
*
xr
+
atomI
.
inducedDipole
[
1
]
*
yr
+
atomI
.
inducedDipole
[
2
]
*
zr
;
float
sci7
=
qir1
*
atomJ
.
inducedDipole
[
0
]
+
qir2
*
atomJ
.
inducedDipole
[
1
]
sci
[
4
]
=
atomJ
.
inducedDipole
[
0
]
*
xr
+
atomJ
.
inducedDipole
[
1
]
*
yr
+
atomJ
.
inducedDipole
[
2
]
*
zr
;
+
qir3
*
atomJ
.
inducedDipole
[
2
];
sci
[
7
]
=
qir
[
1
]
*
atomJ
.
inducedDipole
[
0
]
+
qir
[
2
]
*
atomJ
.
inducedDipole
[
1
]
float
sci8
=
qkr1
*
atomI
.
inducedDipole
[
0
]
+
qkr2
*
atomI
.
inducedDipole
[
1
]
+
qir
[
3
]
*
atomJ
.
inducedDipole
[
2
];
+
qkr3
*
atomI
.
inducedDipole
[
2
];
sci
[
8
]
=
qkr
[
1
]
*
atomI
.
inducedDipole
[
0
]
+
qkr
[
2
]
*
atomI
.
inducedDipole
[
1
]
float
scip1
=
atomI
.
inducedDipoleP
[
0
]
*
dk1
+
atomI
.
inducedDipoleP
[
1
]
*
dk2
+
qkr
[
3
]
*
atomI
.
inducedDipole
[
2
];
+
atomI
.
inducedDipoleP
[
2
]
*
dk3
+
di1
*
atomJ
.
inducedDipoleP
[
0
]
scip
[
1
]
=
atomI
.
inducedDipoleP
[
0
]
*
dk
[
1
]
+
atomI
.
inducedDipoleP
[
1
]
*
dk
[
2
]
+
di2
*
atomJ
.
inducedDipoleP
[
1
]
+
di3
*
atomJ
.
inducedDipoleP
[
2
];
+
atomI
.
inducedDipoleP
[
2
]
*
dk
[
3
]
+
di
[
1
]
*
atomJ
.
inducedDipoleP
[
0
]
float
scip2
=
atomI
.
inducedDipole
[
0
]
*
atomJ
.
inducedDipoleP
[
0
]
+
atomI
.
inducedDipole
[
1
]
*
atomJ
.
inducedDipoleP
[
1
]
+
di
[
2
]
*
atomJ
.
inducedDipoleP
[
1
]
+
di
[
3
]
*
atomJ
.
inducedDipoleP
[
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
.
inducedDipole
[
2
]
*
atomJ
.
inducedDipoleP
[
2
]
+
atomI
.
inducedDipoleP
[
0
]
*
atomJ
.
inducedDipole
[
0
]
+
atomI
.
inducedDipoleP
[
1
]
*
atomJ
.
inducedDipole
[
1
]
+
atomI
.
inducedDipoleP
[
2
]
*
atomJ
.
inducedDipole
[
2
];
+
atomI
.
inducedDipoleP
[
1
]
*
atomJ
.
inducedDipole
[
1
]
+
atomI
.
inducedDipoleP
[
2
]
*
atomJ
.
inducedDipole
[
2
];
scip
[
3
]
=
atomI
.
inducedDipoleP
[
0
]
*
xr
+
atomI
.
inducedDipoleP
[
1
]
*
yr
+
atomI
.
inducedDipoleP
[
2
]
*
zr
;
float
scip
3
=
atomI
.
inducedDipoleP
[
0
]
*
xr
+
atomI
.
inducedDipoleP
[
1
]
*
yr
+
atomI
.
inducedDipoleP
[
2
]
*
zr
;
scip
[
4
]
=
atomJ
.
inducedDipoleP
[
0
]
*
xr
+
atomJ
.
inducedDipoleP
[
1
]
*
yr
+
atomJ
.
inducedDipoleP
[
2
]
*
zr
;
float
scip
4
=
atomJ
.
inducedDipoleP
[
0
]
*
xr
+
atomJ
.
inducedDipoleP
[
1
]
*
yr
+
atomJ
.
inducedDipoleP
[
2
]
*
zr
;
scip
[
7
]
=
qir
[
1
]
*
atomJ
.
inducedDipoleP
[
0
]
+
qir
[
2
]
*
atomJ
.
inducedDipoleP
[
1
]
float
scip
7
=
qir
1
*
atomJ
.
inducedDipoleP
[
0
]
+
qir
2
*
atomJ
.
inducedDipoleP
[
1
]
+
qir
[
3
]
*
atomJ
.
inducedDipoleP
[
2
];
+
qir
3
*
atomJ
.
inducedDipoleP
[
2
];
scip
[
8
]
=
qkr
[
1
]
*
atomI
.
inducedDipoleP
[
0
]
+
qkr
[
2
]
*
atomI
.
inducedDipoleP
[
1
]
float
scip
8
=
qkr
1
*
atomI
.
inducedDipoleP
[
0
]
+
qkr
2
*
atomI
.
inducedDipoleP
[
1
]
+
qkr
[
3
]
*
atomI
.
inducedDipoleP
[
2
];
+
qkr
3
*
atomI
.
inducedDipoleP
[
2
];
// calculate the gl functions for permanent components
// calculate the gl functions for permanent components
gl
[
0
]
=
ci
*
ck
;
float
gl0
=
ci
*
ck
;
gl
[
1
]
=
ck
*
sc
[
3
]
-
ci
*
sc
[
4
]
;
float
gl1
=
ck
*
sc
3
-
ci
*
sc
4
;
gl
[
2
]
=
ci
*
sc
[
6
]
+
ck
*
sc
[
5
]
-
sc
[
3
]
*
sc
[
4
]
;
float
gl2
=
ci
*
sc
6
+
ck
*
sc
5
-
sc
3
*
sc4
;
gl
[
3
]
=
sc
[
3
]
*
sc
[
6
]
-
sc
[
4
]
*
sc
[
5
]
;
float
gl3
=
sc
3
*
sc6
-
sc4
*
sc5
;
gl
[
4
]
=
sc
[
5
]
*
sc
[
6
]
;
float
gl4
=
sc
5
*
sc6
;
gl
[
5
]
=
-
4.0
f
*
sc
[
9
]
;
float
gl5
=
-
4.0
f
*
sc
9
;
gl
[
6
]
=
sc
[
2
]
;
float
gl6
=
sc
2
;
gl
[
7
]
=
2.0
f
*
(
sc
[
7
]
-
sc
[
8
]
);
float
gl7
=
2.0
f
*
(
sc
7
-
sc8
);
gl
[
8
]
=
2.0
f
*
sc
[
10
]
;
float
gl8
=
2.0
f
*
sc10
;
// calculate the gl functions for induced components
// calculate the gl functions for induced components
gli
[
1
]
=
ck
*
sci
[
3
]
-
ci
*
sci
[
4
]
;
float
gli1
=
ck
*
sci
3
-
ci
*
sci
4
;
gli
[
2
]
=
-
sc
[
3
]
*
sci
[
4
]
-
sci
[
3
]
*
sc
[
4
]
;
float
gli2
=
-
sc
3
*
sci
4
-
sci
3
*
sc4
;
gli
[
3
]
=
sci
[
3
]
*
sc
[
6
]
-
sci
[
4
]
*
sc
[
5
]
;
float
gli3
=
sci
3
*
sc6
-
sci4
*
sc5
;
gli
[
6
]
=
sci
[
1
]
;
float
gli6
=
sci
1
;
gli
[
7
]
=
2.0
f
*
(
sci
[
7
]
-
sci
[
8
]
);
float
gli7
=
2.0
f
*
(
sci
7
-
sci
8
);
glip
[
1
]
=
ck
*
scip
[
3
]
-
ci
*
scip
[
4
]
;
float
glip
1
=
ck
*
scip
3
-
ci
*
scip
4
;
glip
[
2
]
=
-
sc
[
3
]
*
scip
[
4
]
-
scip
[
3
]
*
sc
[
4
]
;
float
glip
2
=
-
sc
3
*
scip
4
-
scip
3
*
sc4
;
glip
[
3
]
=
scip
[
3
]
*
sc
[
6
]
-
scip
[
4
]
*
sc
[
5
]
;
float
glip
3
=
scip
3
*
sc6
-
scip4
*
sc5
;
glip
[
6
]
=
scip
[
1
]
;
float
glip
6
=
scip
1
;
glip
[
7
]
=
2.0
f
*
(
scip
[
7
]
-
scip
[
8
]
);
float
glip
7
=
2.0
f
*
(
scip
7
-
scip
8
);
// compute the energy contributions for this interaction
// compute the energy contributions for this interaction
e
=
bn
[
0
]
*
gl
[
0
]
+
bn
[
1
]
*
(
gl
[
1
]
+
gl
[
6
]
)
e
=
bn
0
*
gl0
+
bn
1
*
(
gl
1
+
gl6
)
+
bn
[
2
]
*
(
gl
[
2
]
+
gl
[
7
]
+
gl
[
8
]
)
+
bn
2
*
(
gl
2
+
gl7
+
gl8
)
+
bn
[
3
]
*
(
gl
[
3
]
+
gl
[
5
])
+
bn
[
4
]
*
gl
[
4
]
;
+
bn
3
*
(
gl
3
+
gl5
)
+
bn4
*
gl4
;
ei
=
0.5
f
*
(
bn
[
1
]
*
(
gli
[
1
]
+
gli
[
6
]
)
ei
=
0.5
f
*
(
bn
1
*
(
gli
1
+
gli
6
)
+
bn
[
2
]
*
(
gli
[
2
]
+
gli
[
7
]
)
+
bn
[
3
]
*
gli
[
3
]
);
+
bn
2
*
(
gli
2
+
gli
7
)
+
bn
3
*
gli
3
);
// get the real energy without any screening function
// get the real energy without any screening function
erl
=
rr1
*
gl
[
0
]
+
rr3
*
(
gl
[
1
]
+
gl
[
6
]
)
erl
=
rr1
*
gl
0
+
rr3
*
(
gl
1
+
gl6
)
+
rr5
*
(
gl
[
2
]
+
gl
[
7
]
+
gl
[
8
]
)
+
rr5
*
(
gl
2
+
gl7
+
gl8
)
+
rr7
*
(
gl
[
3
]
+
gl
[
5
]
)
+
rr9
*
gl
[
4
]
;
+
rr7
*
(
gl
3
+
gl5
)
+
rr9
*
gl
4
;
erli
=
0.5
f
*
(
rr3
*
(
gli
[
1
]
+
gli
[
6
]
)
*
psc3
erli
=
0.5
f
*
(
rr3
*
(
gli
1
+
gli
6
)
*
psc3
+
rr5
*
(
gli
[
2
]
+
gli
[
7
]
)
*
psc5
+
rr5
*
(
gli
2
+
gli
7
)
*
psc5
+
rr7
*
gli
[
3
]
*
psc7
);
+
rr7
*
gli
3
*
psc7
);
e
=
e
-
(
1.0
f
-
scalingFactors
[
MScaleIndex
])
*
erl
;
e
=
e
-
(
1.0
f
-
scalingFactors
[
MScaleIndex
])
*
erl
;
ei
=
ei
-
erli
;
ei
=
ei
-
erli
;
...
@@ -561,338 +523,348 @@ __device__ void calculatePmeDirectElectrostaticPairIxn_kernel( PmeDirectElectros
...
@@ -561,338 +523,348 @@ __device__ void calculatePmeDirectElectrostaticPairIxn_kernel( PmeDirectElectros
if (molcule(ii) .eq. molcule(kk)) {
if (molcule(ii) .eq. molcule(kk)) {
eintra = eintra + mscale(kk)*erl*f;
eintra = eintra + mscale(kk)*erl*f;
eintra = eintra + 0.5f*pscale(kk);
eintra = eintra + 0.5f*pscale(kk);
& * (rr3*(gli
[1]
+gli
[6]
)*scale3;
& * (rr3*(gli
1
+gli
6
)*scale3;
& + rr5*(gli
[2]
+gli
[7]
)*scale5;
& + rr5*(gli
2
+gli
7
)*scale5;
& + rr7*gli
[3]
*scale7);
& + rr7*gli
3
*scale7);
}
}
*/
*/
// intermediate variables for permanent force terms
// intermediate variables for permanent force terms
gf
[
1
]
=
bn
[
1
]
*
gl
[
0
]
+
bn
[
2
]
*
(
gl
[
1
]
+
gl
[
6
]
)
float
gf1
=
bn1
*
gl0
+
bn
2
*
(
gl
1
+
gl6
)
+
bn
[
3
]
*
(
gl
[
2
]
+
gl
[
7
]
+
gl
[
8
]
)
+
bn
3
*
(
gl
2
+
gl7
+
gl8
)
+
bn
[
4
]
*
(
gl
[
3
]
+
gl
[
5
])
+
bn
[
5
]
*
gl
[
4
]
;
+
bn
4
*
(
gl
3
+
gl5
)
+
bn5
*
gl4
;
gf
[
2
]
=
-
ck
*
bn
[
1
]
+
sc
[
4
]
*
bn
[
2
]
-
sc
[
6
]
*
bn
[
3
]
;
float
gf2
=
-
ck
*
bn
1
+
sc
4
*
bn2
-
sc6
*
bn3
;
gf
[
3
]
=
ci
*
bn
[
1
]
+
sc
[
3
]
*
bn
[
2
]
+
sc
[
5
]
*
bn
[
3
]
;
float
gf3
=
ci
*
bn
1
+
sc
3
*
bn2
+
sc5
*
bn3
;
gf
[
4
]
=
2.0
f
*
bn
[
2
]
;
float
gf4
=
2.0
f
*
bn
2
;
gf
[
5
]
=
2.0
f
*
(
-
ck
*
bn
[
2
]
+
sc
[
4
]
*
bn
[
3
]
-
sc
[
6
]
*
bn
[
4
]
);
float
gf5
=
2.0
f
*
(
-
ck
*
bn
2
+
sc4
*
bn3
-
sc6
*
bn4
);
gf
[
6
]
=
2.0
f
*
(
-
ci
*
bn
[
2
]
-
sc
[
3
]
*
bn
[
3
]
-
sc
[
5
]
*
bn
[
4
]
);
float
gf6
=
2.0
f
*
(
-
ci
*
bn
2
-
sc3
*
bn3
-
sc5
*
bn4
);
gf
[
7
]
=
4.0
f
*
bn
[
3
]
;
float
gf7
=
4.0
f
*
bn
3
;
gfr
[
1
]
=
rr3
*
gl
[
0
]
+
rr5
*
(
gl
[
1
]
+
gl
[
6
]
)
float
gfr1
=
rr3
*
gl
0
+
rr5
*
(
gl
1
+
gl6
)
+
rr7
*
(
gl
[
2
]
+
gl
[
7
]
+
gl
[
8
]
)
+
rr7
*
(
gl
2
+
gl7
+
gl8
)
+
rr9
*
(
gl
[
3
]
+
gl
[
5
]
)
+
rr11
*
gl
[
4
]
;
+
rr9
*
(
gl
3
+
gl5
)
+
rr11
*
gl
4
;
gfr
[
2
]
=
-
ck
*
rr3
+
sc
[
4
]
*
rr5
-
sc
[
6
]
*
rr7
;
float
gfr2
=
-
ck
*
rr3
+
sc
4
*
rr5
-
sc
6
*
rr7
;
gfr
[
3
]
=
ci
*
rr3
+
sc
[
3
]
*
rr5
+
sc
[
5
]
*
rr7
;
float
gfr3
=
ci
*
rr3
+
sc
3
*
rr5
+
sc
5
*
rr7
;
gfr
[
4
]
=
2.0
f
*
rr5
;
float
gfr4
=
2.0
f
*
rr5
;
gfr
[
5
]
=
2.0
f
*
(
-
ck
*
rr5
+
sc
[
4
]
*
rr7
-
sc
[
6
]
*
rr9
);
float
gfr5
=
2.0
f
*
(
-
ck
*
rr5
+
sc
4
*
rr7
-
sc
6
*
rr9
);
gfr
[
6
]
=
2.0
f
*
(
-
ci
*
rr5
-
sc
[
3
]
*
rr7
-
sc
[
5
]
*
rr9
);
float
gfr6
=
2.0
f
*
(
-
ci
*
rr5
-
sc
3
*
rr7
-
sc
5
*
rr9
);
gfr
[
7
]
=
4.0
f
*
rr7
;
float
gfr7
=
4.0
f
*
rr7
;
// intermediate variables for induced force terms
// intermediate variables for induced force terms
gfi
[
1
]
=
0.5
f
*
bn
[
2
]
*
(
gli
[
1
]
+
glip
[
1
]
+
gli
[
6
]
+
glip
[
6
])
float
gfi1
=
0.5
f
*
bn2
*
(
gli1
+
glip1
+
gli6
+
glip6
)
+
0.5
f
*
bn
[
2
]
*
scip
[
2
]
+
0.5
f
*
bn2
*
scip2
+
0.5
f
*
bn
[
3
]
*
(
gli
[
2
]
+
glip
[
2
]
+
gli
[
7
]
+
glip
[
7
])
+
0.5
f
*
bn3
*
(
gli2
+
glip2
+
gli7
+
glip7
)
-
0.5
f
*
bn
[
3
]
*
(
sci
[
3
]
*
scip
[
4
]
+
scip
[
3
]
*
sci
[
4
])
-
0.5
f
*
bn3
*
(
sci3
*
scip4
+
scip3
*
sci4
)
+
0.5
f
*
bn
[
4
]
*
(
gli
[
3
]
+
glip
[
3
]);
+
0.5
f
*
bn4
*
(
gli3
+
glip3
);
gfi
[
2
]
=
-
ck
*
bn
[
1
]
+
sc
[
4
]
*
bn
[
2
]
-
sc
[
6
]
*
bn
[
3
];
float
gfi2
=
-
ck
*
bn1
+
sc4
*
bn2
-
sc6
*
bn3
;
gfi
[
3
]
=
ci
*
bn
[
1
]
+
sc
[
3
]
*
bn
[
2
]
+
sc
[
5
]
*
bn
[
3
];
float
gfi3
=
ci
*
bn1
+
sc3
*
bn2
+
sc5
*
bn3
;
gfi
[
4
]
=
2.0
f
*
bn
[
2
];
float
gfi4
=
2.0
f
*
bn2
;
gfi
[
5
]
=
bn
[
3
]
*
(
sci
[
4
]
+
scip
[
4
]);
float
gfi5
=
bn3
*
(
sci4
+
scip4
);
gfi
[
6
]
=
-
bn
[
3
]
*
(
sci
[
3
]
+
scip
[
3
]);
float
gfi6
=
-
bn3
*
(
sci3
+
scip3
);
gfri
[
1
]
=
0.5
f
*
rr5
*
((
gli
[
1
]
+
gli
[
6
])
*
psc3
float
gfri1
=
0.5
f
*
rr5
*
((
gli1
+
gli6
)
*
psc3
+
(
glip
[
1
]
+
glip
[
6
])
*
dsc3
+
(
glip1
+
glip6
)
*
dsc3
+
scip
[
2
]
*
usc3
)
+
scip2
*
usc3
)
+
0.5
f
*
rr7
*
((
gli
[
7
]
+
gli
[
2
])
*
psc5
+
0.5
f
*
rr7
*
((
gli7
+
gli2
)
*
psc5
+
(
glip
[
7
]
+
glip
[
2
])
*
dsc5
+
(
glip7
+
glip2
)
*
dsc5
-
(
sci
[
3
]
*
scip
[
4
]
+
scip
[
3
]
*
sci
[
4
])
*
usc5
)
-
(
sci3
*
scip4
+
scip3
*
sci4
)
*
usc5
)
+
0.5
f
*
rr9
*
(
gli
[
3
]
*
psc7
+
glip
[
3
]
*
dsc7
);
+
0.5
f
*
rr9
*
(
gli3
*
psc7
+
glip3
*
dsc7
);
gfri
[
2
]
=
-
rr3
*
ck
+
rr5
*
sc
[
4
]
-
rr7
*
sc
[
6
];
float
gfri4
=
2.0
f
*
rr5
;
gfri
[
3
]
=
rr3
*
ci
+
rr5
*
sc
[
3
]
+
rr7
*
sc
[
5
];
float
gfri5
=
rr7
*
(
sci4
*
psc7
+
scip4
*
dsc7
);
gfri
[
4
]
=
2.0
f
*
rr5
;
float
gfri6
=
-
rr7
*
(
sci3
*
psc7
+
scip3
*
dsc7
);
gfri
[
5
]
=
rr7
*
(
sci
[
4
]
*
psc7
+
scip
[
4
]
*
dsc7
);
gfri
[
6
]
=
-
rr7
*
(
sci
[
3
]
*
psc7
+
scip
[
3
]
*
dsc7
);
// get the permanent force with screening
// get the permanent force with screening
f
tm2
[
1
]
=
gf
[
1
]
*
xr
+
gf
[
2
]
*
di
[
1
]
+
gf
[
3
]
*
dk
[
1
]
f
loat
ftm21
=
gf
1
*
xr
+
gf
2
*
di1
+
gf3
*
dk1
+
gf
[
4
]
*
(
qkdi
[
1
]
-
qidk
[
1
]
)
+
gf
[
5
]
*
qir
[
1
]
+
gf
4
*
(
qkdi
1
-
qidk
1
)
+
gf
5
*
qir
1
+
gf
[
6
]
*
qkr
[
1
]
+
gf
[
7
]
*
(
qiqkr
[
1
]
+
qkqir
[
1
]
);
+
gf
6
*
qkr
1
+
gf
7
*
(
qiqkr
1
+
qkqir
1
);
f
tm2
[
2
]
=
gf
[
1
]
*
yr
+
gf
[
2
]
*
di
[
2
]
+
gf
[
3
]
*
dk
[
2
]
f
loat
ftm22
=
gf
1
*
yr
+
gf
2
*
di2
+
gf3
*
dk2
+
gf
[
4
]
*
(
qkdi
[
2
]
-
qidk
[
2
]
)
+
gf
[
5
]
*
qir
[
2
]
+
gf
4
*
(
qkdi
2
-
qidk
2
)
+
gf
5
*
qir
2
+
gf
[
6
]
*
qkr
[
2
]
+
gf
[
7
]
*
(
qiqkr
[
2
]
+
qkqir
[
2
]
);
+
gf
6
*
qkr
2
+
gf
7
*
(
qiqkr
2
+
qkqir
2
);
f
tm2
[
3
]
=
gf
[
1
]
*
zr
+
gf
[
2
]
*
di
[
3
]
+
gf
[
3
]
*
dk
[
3
]
f
loat
ftm23
=
gf
1
*
zr
+
gf
2
*
di3
+
gf3
*
dk3
+
gf
[
4
]
*
(
qkdi
[
3
]
-
qidk
[
3
]
)
+
gf
[
5
]
*
qir
[
3
]
+
gf
4
*
(
qkdi
3
-
qidk
3
)
+
gf
5
*
qir
3
+
gf
[
6
]
*
qkr
[
3
]
+
gf
[
7
]
*
(
qiqkr
[
3
]
+
qkqir
[
3
]
);
+
gf
6
*
qkr
3
+
gf
7
*
(
qiqkr
3
+
qkqir
3
);
// get the permanent force without screening
// get the permanent force without screening
ftm2r
[
1
]
=
gfr
[
1
]
*
xr
+
gfr
[
2
]
*
di
[
1
]
+
gfr
[
3
]
*
dk
[
1
]
float
ftm2r
1
=
gfr
1
*
xr
+
gfr
2
*
di1
+
gfr3
*
dk1
+
gfr
[
4
]
*
(
qkdi
[
1
]
-
qidk
[
1
]
)
+
gfr
[
5
]
*
qir
[
1
]
+
gfr
4
*
(
qkdi
1
-
qidk
1
)
+
gfr
5
*
qir
1
+
gfr
[
6
]
*
qkr
[
1
]
+
gfr
[
7
]
*
(
qiqkr
[
1
]
+
qkqir
[
1
]
);
+
gfr
6
*
qkr
1
+
gfr
7
*
(
qiqkr
1
+
qkqir
1
);
ftm2r
[
2
]
=
gfr
[
1
]
*
yr
+
gfr
[
2
]
*
di
[
2
]
+
gfr
[
3
]
*
dk
[
2
]
float
ftm2r
2
=
gfr
1
*
yr
+
gfr
2
*
di2
+
gfr3
*
dk2
+
gfr
[
4
]
*
(
qkdi
[
2
]
-
qidk
[
2
]
)
+
gfr
[
5
]
*
qir
[
2
]
+
gfr
4
*
(
qkdi
2
-
qidk
2
)
+
gfr
5
*
qir
2
+
gfr
[
6
]
*
qkr
[
2
]
+
gfr
[
7
]
*
(
qiqkr
[
2
]
+
qkqir
[
2
]
);
+
gfr
6
*
qkr
2
+
gfr
7
*
(
qiqkr
2
+
qkqir
2
);
ftm2r
[
3
]
=
gfr
[
1
]
*
zr
+
gfr
[
2
]
*
di
[
3
]
+
gfr
[
3
]
*
dk
[
3
]
float
ftm2r
3
=
gfr
1
*
zr
+
gfr
2
*
di3
+
gfr3
*
dk3
+
gfr
[
4
]
*
(
qkdi
[
3
]
-
qidk
[
3
]
)
+
gfr
[
5
]
*
qir
[
3
]
+
gfr
4
*
(
qkdi
3
-
qidk
3
)
+
gfr
5
*
qir
3
+
gfr
[
6
]
*
qkr
[
3
]
+
gfr
[
7
]
*
(
qiqkr
[
3
]
+
qkqir
[
3
]
);
+
gfr
6
*
qkr
3
+
gfr
7
*
(
qiqkr
3
+
qkqir
3
);
// get the induced force with screening
// get the induced force with screening
ftm2i
[
1
]
=
gfi
[
1
]
*
xr
+
0.5
f
*
float
ftm2i
1
=
gfi
1
*
xr
+
0.5
f
*
(
gfi
[
2
]
*
(
atomI
.
inducedDipole
[
0
]
+
atomI
.
inducedDipoleP
[
0
])
(
gfi
2
*
(
atomI
.
inducedDipole
[
0
]
+
atomI
.
inducedDipoleP
[
0
])
+
bn
[
2
]
*
(
sci
[
4
]
*
atomI
.
inducedDipoleP
[
0
]
+
scip
[
4
]
*
atomI
.
inducedDipole
[
0
])
+
bn
2
*
(
sci
4
*
atomI
.
inducedDipoleP
[
0
]
+
scip
4
*
atomI
.
inducedDipole
[
0
])
+
gfi
[
3
]
*
(
atomJ
.
inducedDipole
[
0
]
+
atomJ
.
inducedDipoleP
[
0
])
+
gfi
3
*
(
atomJ
.
inducedDipole
[
0
]
+
atomJ
.
inducedDipoleP
[
0
])
+
bn
[
2
]
*
(
sci
[
3
]
*
atomJ
.
inducedDipoleP
[
0
]
+
scip
[
3
]
*
atomJ
.
inducedDipole
[
0
])
+
bn
2
*
(
sci
3
*
atomJ
.
inducedDipoleP
[
0
]
+
scip
3
*
atomJ
.
inducedDipole
[
0
])
+
(
sci
[
4
]
+
scip
[
4
]
)
*
bn
[
2
]
*
di
[
1
]
+
(
sci
4
+
scip
4
)
*
bn
2
*
di1
+
(
sci
[
3
]
+
scip
[
3
]
)
*
bn
[
2
]
*
dk
[
1
]
+
(
sci
3
+
scip
3
)
*
bn
2
*
dk1
+
gfi
[
4
]
*
(
qkui
[
1
]
+
qkuip
[
1
]
-
qiuk
[
1
]
-
qiukp
[
1
]
))
+
gfi
4
*
(
qkui
1
+
qkuip
1
-
qiuk
1
-
qiukp
1
))
+
gfi
[
5
]
*
qir
[
1
]
+
gfi
[
6
]
*
qkr
[
1
]
;
+
gfi
5
*
qir
1
+
gfi
6
*
qkr
1
;
ftm2i
[
2
]
=
gfi
[
1
]
*
yr
+
0.5
f
*
float
ftm2i
2
=
gfi
1
*
yr
+
0.5
f
*
(
gfi
[
2
]
*
(
atomI
.
inducedDipole
[
1
]
+
atomI
.
inducedDipoleP
[
1
])
(
gfi
2
*
(
atomI
.
inducedDipole
[
1
]
+
atomI
.
inducedDipoleP
[
1
])
+
bn
[
2
]
*
(
sci
[
4
]
*
atomI
.
inducedDipoleP
[
1
]
+
scip
[
4
]
*
atomI
.
inducedDipole
[
1
])
+
bn
2
*
(
sci
4
*
atomI
.
inducedDipoleP
[
1
]
+
scip
4
*
atomI
.
inducedDipole
[
1
])
+
gfi
[
3
]
*
(
atomJ
.
inducedDipole
[
1
]
+
atomJ
.
inducedDipoleP
[
1
])
+
gfi
3
*
(
atomJ
.
inducedDipole
[
1
]
+
atomJ
.
inducedDipoleP
[
1
])
+
bn
[
2
]
*
(
sci
[
3
]
*
atomJ
.
inducedDipoleP
[
1
]
+
scip
[
3
]
*
atomJ
.
inducedDipole
[
1
])
+
bn
2
*
(
sci
3
*
atomJ
.
inducedDipoleP
[
1
]
+
scip
3
*
atomJ
.
inducedDipole
[
1
])
+
(
sci
[
4
]
+
scip
[
4
]
)
*
bn
[
2
]
*
di
[
2
]
+
(
sci
4
+
scip
4
)
*
bn
2
*
di2
+
(
sci
[
3
]
+
scip
[
3
]
)
*
bn
[
2
]
*
dk
[
2
]
+
(
sci
3
+
scip
3
)
*
bn
2
*
dk2
+
gfi
[
4
]
*
(
qkui
[
2
]
+
qkuip
[
2
]
-
qiuk
[
2
]
-
qiukp
[
2
]
))
+
gfi
4
*
(
qkui
2
+
qkuip
2
-
qiuk
2
-
qiukp
2
))
+
gfi
[
5
]
*
qir
[
2
]
+
gfi
[
6
]
*
qkr
[
2
]
;
+
gfi
5
*
qir
2
+
gfi
6
*
qkr
2
;
ftm2i
[
3
]
=
gfi
[
1
]
*
zr
+
0.5
f
*
float
ftm2i
3
=
gfi
1
*
zr
+
0.5
f
*
(
gfi
[
2
]
*
(
atomI
.
inducedDipole
[
2
]
+
atomI
.
inducedDipoleP
[
2
])
(
gfi
2
*
(
atomI
.
inducedDipole
[
2
]
+
atomI
.
inducedDipoleP
[
2
])
+
bn
[
2
]
*
(
sci
[
4
]
*
atomI
.
inducedDipoleP
[
2
]
+
scip
[
4
]
*
atomI
.
inducedDipole
[
2
])
+
bn
2
*
(
sci
4
*
atomI
.
inducedDipoleP
[
2
]
+
scip
4
*
atomI
.
inducedDipole
[
2
])
+
gfi
[
3
]
*
(
atomJ
.
inducedDipole
[
2
]
+
atomJ
.
inducedDipoleP
[
2
])
+
gfi
3
*
(
atomJ
.
inducedDipole
[
2
]
+
atomJ
.
inducedDipoleP
[
2
])
+
bn
[
2
]
*
(
sci
[
3
]
*
atomJ
.
inducedDipoleP
[
2
]
+
scip
[
3
]
*
atomJ
.
inducedDipole
[
2
])
+
bn
2
*
(
sci
3
*
atomJ
.
inducedDipoleP
[
2
]
+
scip
3
*
atomJ
.
inducedDipole
[
2
])
+
(
sci
[
4
]
+
scip
[
4
]
)
*
bn
[
2
]
*
di
[
3
]
+
(
sci
4
+
scip
4
)
*
bn
2
*
di3
+
(
sci
[
3
]
+
scip
[
3
]
)
*
bn
[
2
]
*
dk
[
3
]
+
(
sci
3
+
scip
3
)
*
bn
2
*
dk3
+
gfi
[
4
]
*
(
qkui
[
3
]
+
qkuip
[
3
]
-
qiuk
[
3
]
-
qiukp
[
3
]
))
+
gfi
4
*
(
qkui
3
+
qkuip
3
-
qiuk
3
-
qiukp
3
))
+
gfi
[
5
]
*
qir
[
3
]
+
gfi
[
6
]
*
qkr
[
3
]
;
+
gfi
5
*
qir
3
+
gfi
6
*
qkr
3
;
// get the induced force without screening
// get the induced force without screening
ftm2ri
[
1
]
=
gfri
[
1
]
*
xr
+
0.5
f
*
float
ftm2ri
1
=
gfri
1
*
xr
+
0.5
f
*
(
-
rr3
*
ck
*
(
atomI
.
inducedDipole
[
0
]
*
psc3
+
atomI
.
inducedDipoleP
[
0
]
*
dsc3
)
(
-
rr3
*
ck
*
(
atomI
.
inducedDipole
[
0
]
*
psc3
+
atomI
.
inducedDipoleP
[
0
]
*
dsc3
)
+
rr5
*
sc
[
4
]
*
(
atomI
.
inducedDipole
[
0
]
*
psc5
+
atomI
.
inducedDipoleP
[
0
]
*
dsc5
)
+
rr5
*
sc
4
*
(
atomI
.
inducedDipole
[
0
]
*
psc5
+
atomI
.
inducedDipoleP
[
0
]
*
dsc5
)
-
rr7
*
sc
[
6
]
*
(
atomI
.
inducedDipole
[
0
]
*
psc7
+
atomI
.
inducedDipoleP
[
0
]
*
dsc7
))
-
rr7
*
sc
6
*
(
atomI
.
inducedDipole
[
0
]
*
psc7
+
atomI
.
inducedDipoleP
[
0
]
*
dsc7
))
+
(
rr3
*
ci
*
(
atomJ
.
inducedDipole
[
0
]
*
psc3
+
atomJ
.
inducedDipoleP
[
0
]
*
dsc3
)
+
(
rr3
*
ci
*
(
atomJ
.
inducedDipole
[
0
]
*
psc3
+
atomJ
.
inducedDipoleP
[
0
]
*
dsc3
)
+
rr5
*
sc
[
3
]
*
(
atomJ
.
inducedDipole
[
0
]
*
psc5
+
atomJ
.
inducedDipoleP
[
0
]
*
dsc5
)
+
rr5
*
sc
3
*
(
atomJ
.
inducedDipole
[
0
]
*
psc5
+
atomJ
.
inducedDipoleP
[
0
]
*
dsc5
)
+
rr7
*
sc
[
5
]
*
(
atomJ
.
inducedDipole
[
0
]
*
psc7
+
atomJ
.
inducedDipoleP
[
0
]
*
dsc7
))
*
0.5
f
+
rr7
*
sc
5
*
(
atomJ
.
inducedDipole
[
0
]
*
psc7
+
atomJ
.
inducedDipoleP
[
0
]
*
dsc7
))
*
0.5
f
+
rr5
*
usc5
*
(
sci
[
4
]
*
atomI
.
inducedDipoleP
[
0
]
+
scip
[
4
]
*
atomI
.
inducedDipole
[
0
]
+
rr5
*
usc5
*
(
sci
4
*
atomI
.
inducedDipoleP
[
0
]
+
scip
4
*
atomI
.
inducedDipole
[
0
]
+
sci
[
3
]
*
atomJ
.
inducedDipoleP
[
0
]
+
scip
[
3
]
*
atomJ
.
inducedDipole
[
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
*
di
1
+
0.5
f
*
(
sci
[
3
]
*
psc5
+
scip
[
3
]
*
dsc5
)
*
rr5
*
dk
[
1
]
+
0.5
f
*
(
sci
3
*
psc5
+
scip
3
*
dsc5
)
*
rr5
*
dk
1
+
0.5
f
*
gfri
[
4
]
*
((
qkui
[
1
]
-
qiuk
[
1
]
)
*
psc5
+
0.5
f
*
gfri
4
*
((
qkui
1
-
qiuk
1
)
*
psc5
+
(
qkuip
[
1
]
-
qiukp
[
1
]
)
*
dsc5
)
+
(
qkuip
1
-
qiukp
1
)
*
dsc5
)
+
gfri
[
5
]
*
qir
[
1
]
+
gfri
[
6
]
*
qkr
[
1
]
;
+
gfri
5
*
qir
1
+
gfri
6
*
qkr
1
;
ftm2ri
[
2
]
=
gfri
[
1
]
*
yr
+
0.5
f
*
float
ftm2ri
2
=
gfri
1
*
yr
+
0.5
f
*
(
-
rr3
*
ck
*
(
atomI
.
inducedDipole
[
1
]
*
psc3
+
atomI
.
inducedDipoleP
[
1
]
*
dsc3
)
(
-
rr3
*
ck
*
(
atomI
.
inducedDipole
[
1
]
*
psc3
+
atomI
.
inducedDipoleP
[
1
]
*
dsc3
)
+
rr5
*
sc
[
4
]
*
(
atomI
.
inducedDipole
[
1
]
*
psc5
+
atomI
.
inducedDipoleP
[
1
]
*
dsc5
)
+
rr5
*
sc
4
*
(
atomI
.
inducedDipole
[
1
]
*
psc5
+
atomI
.
inducedDipoleP
[
1
]
*
dsc5
)
-
rr7
*
sc
[
6
]
*
(
atomI
.
inducedDipole
[
1
]
*
psc7
+
atomI
.
inducedDipoleP
[
1
]
*
dsc7
))
-
rr7
*
sc
6
*
(
atomI
.
inducedDipole
[
1
]
*
psc7
+
atomI
.
inducedDipoleP
[
1
]
*
dsc7
))
+
(
rr3
*
ci
*
(
atomJ
.
inducedDipole
[
1
]
*
psc3
+
atomJ
.
inducedDipoleP
[
1
]
*
dsc3
)
+
(
rr3
*
ci
*
(
atomJ
.
inducedDipole
[
1
]
*
psc3
+
atomJ
.
inducedDipoleP
[
1
]
*
dsc3
)
+
rr5
*
sc
[
3
]
*
(
atomJ
.
inducedDipole
[
1
]
*
psc5
+
atomJ
.
inducedDipoleP
[
1
]
*
dsc5
)
+
rr5
*
sc
3
*
(
atomJ
.
inducedDipole
[
1
]
*
psc5
+
atomJ
.
inducedDipoleP
[
1
]
*
dsc5
)
+
rr7
*
sc
[
5
]
*
(
atomJ
.
inducedDipole
[
1
]
*
psc7
+
atomJ
.
inducedDipoleP
[
1
]
*
dsc7
))
*
0.5
f
+
rr7
*
sc
5
*
(
atomJ
.
inducedDipole
[
1
]
*
psc7
+
atomJ
.
inducedDipoleP
[
1
]
*
dsc7
))
*
0.5
f
+
rr5
*
usc5
*
(
sci
[
4
]
*
atomI
.
inducedDipoleP
[
1
]
+
scip
[
4
]
*
atomI
.
inducedDipole
[
1
]
+
rr5
*
usc5
*
(
sci
4
*
atomI
.
inducedDipoleP
[
1
]
+
scip
4
*
atomI
.
inducedDipole
[
1
]
+
sci
[
3
]
*
atomJ
.
inducedDipoleP
[
1
]
+
scip
[
3
]
*
atomJ
.
inducedDipole
[
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
*
di
2
+
0.5
f
*
(
sci
[
3
]
*
psc5
+
scip
[
3
]
*
dsc5
)
*
rr5
*
dk
[
2
]
+
0.5
f
*
(
sci
3
*
psc5
+
scip
3
*
dsc5
)
*
rr5
*
dk
2
+
0.5
f
*
gfri
[
4
]
*
((
qkui
[
2
]
-
qiuk
[
2
]
)
*
psc5
+
0.5
f
*
gfri
4
*
((
qkui
2
-
qiuk
2
)
*
psc5
+
(
qkuip
[
2
]
-
qiukp
[
2
]
)
*
dsc5
)
+
(
qkuip
2
-
qiukp
2
)
*
dsc5
)
+
gfri
[
5
]
*
qir
[
2
]
+
gfri
[
6
]
*
qkr
[
2
]
;
+
gfri
5
*
qir
2
+
gfri
6
*
qkr
2
;
ftm2ri
[
3
]
=
gfri
[
1
]
*
zr
+
0.5
f
*
float
ftm2ri
3
=
gfri
1
*
zr
+
0.5
f
*
(
-
rr3
*
ck
*
(
atomI
.
inducedDipole
[
2
]
*
psc3
+
atomI
.
inducedDipoleP
[
2
]
*
dsc3
)
(
-
rr3
*
ck
*
(
atomI
.
inducedDipole
[
2
]
*
psc3
+
atomI
.
inducedDipoleP
[
2
]
*
dsc3
)
+
rr5
*
sc
[
4
]
*
(
atomI
.
inducedDipole
[
2
]
*
psc5
+
atomI
.
inducedDipoleP
[
2
]
*
dsc5
)
+
rr5
*
sc
4
*
(
atomI
.
inducedDipole
[
2
]
*
psc5
+
atomI
.
inducedDipoleP
[
2
]
*
dsc5
)
-
rr7
*
sc
[
6
]
*
(
atomI
.
inducedDipole
[
2
]
*
psc7
+
atomI
.
inducedDipoleP
[
2
]
*
dsc7
))
-
rr7
*
sc
6
*
(
atomI
.
inducedDipole
[
2
]
*
psc7
+
atomI
.
inducedDipoleP
[
2
]
*
dsc7
))
+
(
rr3
*
ci
*
(
atomJ
.
inducedDipole
[
2
]
*
psc3
+
atomJ
.
inducedDipoleP
[
2
]
*
dsc3
)
+
(
rr3
*
ci
*
(
atomJ
.
inducedDipole
[
2
]
*
psc3
+
atomJ
.
inducedDipoleP
[
2
]
*
dsc3
)
+
rr5
*
sc
[
3
]
*
(
atomJ
.
inducedDipole
[
2
]
*
psc5
+
atomJ
.
inducedDipoleP
[
2
]
*
dsc5
)
+
rr5
*
sc
3
*
(
atomJ
.
inducedDipole
[
2
]
*
psc5
+
atomJ
.
inducedDipoleP
[
2
]
*
dsc5
)
+
rr7
*
sc
[
5
]
*
(
atomJ
.
inducedDipole
[
2
]
*
psc7
+
atomJ
.
inducedDipoleP
[
2
]
*
dsc7
))
*
0.5
f
+
rr7
*
sc
5
*
(
atomJ
.
inducedDipole
[
2
]
*
psc7
+
atomJ
.
inducedDipoleP
[
2
]
*
dsc7
))
*
0.5
f
+
rr5
*
usc5
*
(
sci
[
4
]
*
atomI
.
inducedDipoleP
[
2
]
+
scip
[
4
]
*
atomI
.
inducedDipole
[
2
]
+
rr5
*
usc5
*
(
sci
4
*
atomI
.
inducedDipoleP
[
2
]
+
scip
4
*
atomI
.
inducedDipole
[
2
]
+
sci
[
3
]
*
atomJ
.
inducedDipoleP
[
2
]
+
scip
[
3
]
*
atomJ
.
inducedDipole
[
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
*
di
3
+
0.5
f
*
(
sci
[
3
]
*
psc5
+
scip
[
3
]
*
dsc5
)
*
rr5
*
dk
[
3
]
+
0.5
f
*
(
sci
3
*
psc5
+
scip
3
*
dsc5
)
*
rr5
*
dk
3
+
0.5
f
*
gfri
[
4
]
*
((
qkui
[
3
]
-
qiuk
[
3
]
)
*
psc5
+
0.5
f
*
gfri
4
*
((
qkui
3
-
qiuk
3
)
*
psc5
+
(
qkuip
[
3
]
-
qiukp
[
3
]
)
*
dsc5
)
+
(
qkuip
3
-
qiukp
3
)
*
dsc5
)
+
gfri
[
5
]
*
qir
[
3
]
+
gfri
[
6
]
*
qkr
[
3
]
;
+
gfri
5
*
qir
3
+
gfri
6
*
qkr
3
;
// account for partially excluded induced interactions
// account for partially excluded induced interactions
float
temp3
=
0.5
f
*
rr3
*
((
gli
[
1
]
+
gli
[
6
]
)
*
scalingFactors
[
PScaleIndex
]
float
temp3
=
0.5
f
*
rr3
*
((
gli
1
+
gli
6
)
*
scalingFactors
[
PScaleIndex
]
+
(
glip
[
1
]
+
glip
[
6
]
)
*
scalingFactors
[
DScaleIndex
]);
+
(
glip
1
+
glip
6
)
*
scalingFactors
[
DScaleIndex
]);
float
temp5
=
0.5
f
*
rr5
*
((
gli
[
2
]
+
gli
[
7
]
)
*
scalingFactors
[
PScaleIndex
]
float
temp5
=
0.5
f
*
rr5
*
((
gli
2
+
gli
7
)
*
scalingFactors
[
PScaleIndex
]
+
(
glip
[
2
]
+
glip
[
7
]
)
*
scalingFactors
[
DScaleIndex
]);
+
(
glip
2
+
glip
7
)
*
scalingFactors
[
DScaleIndex
]);
float
temp7
=
0.5
f
*
rr7
*
(
gli
[
3
]
*
scalingFactors
[
PScaleIndex
]
float
temp7
=
0.5
f
*
rr7
*
(
gli
3
*
scalingFactors
[
PScaleIndex
]
+
glip
[
3
]
*
scalingFactors
[
DScaleIndex
]);
+
glip
3
*
scalingFactors
[
DScaleIndex
]);
fridmp
[
1
]
=
temp3
*
ddsc3
[
1
]
+
temp5
*
ddsc5
[
1
]
+
temp7
*
ddsc7
[
1
]
;
float
fridmp
1
=
temp3
*
ddsc3
1
+
temp5
*
ddsc5
1
+
temp7
*
ddsc7
1
;
fridmp
[
2
]
=
temp3
*
ddsc3
[
2
]
+
temp5
*
ddsc5
[
2
]
+
temp7
*
ddsc7
[
2
]
;
float
fridmp
2
=
temp3
*
ddsc3
2
+
temp5
*
ddsc5
2
+
temp7
*
ddsc7
2
;
fridmp
[
3
]
=
temp3
*
ddsc3
[
3
]
+
temp5
*
ddsc5
[
3
]
+
temp7
*
ddsc7
[
3
]
;
float
fridmp
3
=
temp3
*
ddsc3
3
+
temp5
*
ddsc5
3
+
temp7
*
ddsc7
3
;
// find some scaling terms for induced-induced force
// find some scaling terms for induced-induced force
temp3
=
0.5
f
*
rr3
*
scalingFactors
[
UScaleIndex
]
*
scip
[
2
]
;
temp3
=
0.5
f
*
rr3
*
scalingFactors
[
UScaleIndex
]
*
scip
2
;
temp5
=
-
0.5
f
*
rr5
*
scalingFactors
[
UScaleIndex
]
*
(
sci
[
3
]
*
scip
[
4
]
+
scip
[
3
]
*
sci
[
4
]
);
temp5
=
-
0.5
f
*
rr5
*
scalingFactors
[
UScaleIndex
]
*
(
sci
3
*
scip
4
+
scip
3
*
sci
4
);
findmp
[
1
]
=
temp3
*
ddsc3
[
1
]
+
temp5
*
ddsc5
[
1
]
;
float
findmp
1
=
temp3
*
ddsc3
1
+
temp5
*
ddsc5
1
;
findmp
[
2
]
=
temp3
*
ddsc3
[
2
]
+
temp5
*
ddsc5
[
2
]
;
float
findmp
2
=
temp3
*
ddsc3
2
+
temp5
*
ddsc5
2
;
findmp
[
3
]
=
temp3
*
ddsc3
[
3
]
+
temp5
*
ddsc5
[
3
]
;
float
findmp
3
=
temp3
*
ddsc3
3
+
temp5
*
ddsc5
3
;
// modify the forces for partially excluded interactions
// modify the forces for partially excluded interactions
ftm2i
[
1
]
=
ftm2i
[
1
]
-
fridmp
[
1
]
-
findmp
[
1
]
;
ftm2i
1
-
=
fridmp
1
-
findmp
1
;
ftm2i
[
2
]
=
ftm2i
[
2
]
-
fridmp
[
2
]
-
findmp
[
2
]
;
ftm2i
2
-
=
fridmp
2
-
findmp
2
;
ftm2i
[
3
]
=
ftm2i
[
3
]
-
fridmp
[
3
]
-
findmp
[
3
]
;
ftm2i
3
-
=
fridmp
3
-
findmp
3
;
// correction to convert mutual to direct polarization force
// correction to convert mutual to direct polarization force
/*
/*
if (poltyp .eq. 'DIRECT') {
if (poltyp .eq. 'DIRECT') {
gfd = 0.5f * (bn
[2]
*scip
[2]
;
gfd = 0.5f * (bn
2
*scip
2
;
& - bn
[3]
*(scip
[3]
*sci
[4]
+sci
[3]
*scip
[4]
));
& - bn
3
*(scip
3
*sci
4
+sci
3
*scip
4
));
gfdr = 0.5f * (rr5*scip
[2]
*usc3;
gfdr = 0.5f * (rr5*scip
2
*usc3;
& - rr7*(scip
[3]
*sci
[4]
;
& - rr7*(scip
3
*sci
4
;
& +sci
[3]
*scip
[4]
)*usc5);
& +sci
3
*scip
4
)*usc5);
ftm2i
[1]
= ftm2i
[1]
- gfd*xr - 0.5f*bn
[2]
*;
ftm2i
1
= ftm2i
1
- gfd*xr - 0.5f*bn
2
*;
& (sci
[4]
*atomI.inducedDipoleP[0]+scip
[4]
*atomI.inducedDipole[0];
& (sci
4
*atomI.inducedDipoleP[0]+scip
4
*atomI.inducedDipole[0];
& +sci
[3]
*atomJ.inducedDipoleP[0]+scip
[3]
*atomJ.inducedDipole[0]);
& +sci
3
*atomJ.inducedDipoleP[0]+scip
3
*atomJ.inducedDipole[0]);
ftm2i
[2]
= ftm2i
[2]
- gfd*yr - 0.5f*bn
[2]
*;
ftm2i
2
= ftm2i
2
- gfd*yr - 0.5f*bn
2
*;
& (sci
[4]
*atomI.inducedDipoleP[1]+scip
[4]
*atomI.inducedDipole[1];
& (sci
4
*atomI.inducedDipoleP[1]+scip
4
*atomI.inducedDipole[1];
& +sci
[3]
*atomJ.inducedDipoleP[1]+scip
[3]
*atomJ.inducedDipole[1]);
& +sci
3
*atomJ.inducedDipoleP[1]+scip
3
*atomJ.inducedDipole[1]);
ftm2i
[3]
= ftm2i
[3]
- gfd*zr - 0.5f*bn
[2]
*;
ftm2i
3
= ftm2i
3
- gfd*zr - 0.5f*bn
2
*;
& (sci
[4]
*atomI.inducedDipoleP[2]+scip
[4]
*atomI.inducedDipole[2];
& (sci
4
*atomI.inducedDipoleP[2]+scip
4
*atomI.inducedDipole[2];
& +sci
[3]
*atomJ.inducedDipoleP[2]+scip
[3]
*atomJ.inducedDipole[2]);
& +sci
3
*atomJ.inducedDipoleP[2]+scip
3
*atomJ.inducedDipole[2]);
fdir
[1]
= gfdr*xr + 0.5f*usc5*rr5*;
fdir
1
= gfdr*xr + 0.5f*usc5*rr5*;
& (sci
[4]
*atomI.inducedDipoleP[0]+scip
[4]
*atomI.inducedDipole[0];
& (sci
4
*atomI.inducedDipoleP[0]+scip
4
*atomI.inducedDipole[0];
& + sci
[3]
*atomJ.inducedDipoleP[0]+scip
[3]
*atomJ.inducedDipole[0]);
& + sci
3
*atomJ.inducedDipoleP[0]+scip
3
*atomJ.inducedDipole[0]);
fdir
[2]
= gfdr*yr + 0.5f*usc5*rr5*;
fdir
2
= gfdr*yr + 0.5f*usc5*rr5*;
& (sci
[4]
*atomI.inducedDipoleP[1]+scip
[4]
*atomI.inducedDipole[1];
& (sci
4
*atomI.inducedDipoleP[1]+scip
4
*atomI.inducedDipole[1];
& + sci
[3]
*atomJ.inducedDipoleP[1]+scip
[3]
*atomJ.inducedDipole[1]);
& + sci
3
*atomJ.inducedDipoleP[1]+scip
3
*atomJ.inducedDipole[1]);
fdir
[3]
= gfdr*zr + 0.5f*usc5*rr5*;
fdir
3
= gfdr*zr + 0.5f*usc5*rr5*;
& (sci
[4]
*atomI.inducedDipoleP[2]+scip
[4]
*atomI.inducedDipole[2];
& (sci
4
*atomI.inducedDipoleP[2]+scip
4
*atomI.inducedDipole[2];
& + sci
[3]
*atomJ.inducedDipoleP[2]+scip
[3]
*atomJ.inducedDipole[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
;
}
}
*/
*/
// intermediate variables for induced torque terms
// intermediate variables for induced torque terms
gti
[
2
]
=
0.5
f
*
bn
[
2
]
*
(
sci
[
4
]
+
scip
[
4
]
);
float
gti2
=
0.5
f
*
bn
2
*
(
sci
4
+
scip
4
);
gti
[
3
]
=
0.5
f
*
bn
[
2
]
*
(
sci
[
3
]
+
scip
[
3
]
);
float
gti3
=
0.5
f
*
bn
2
*
(
sci
3
+
scip
3
);
gti
[
4
]
=
gfi
[
4
]
;
float
gti4
=
gfi
4
;
gti
[
5
]
=
gfi
[
5
]
;
float
gti5
=
gfi
5
;
gti
[
6
]
=
gfi
[
6
]
;
float
gti6
=
gfi
6
;
gtri
[
2
]
=
0.5
f
*
rr5
*
(
sci
[
4
]
*
psc5
+
scip
[
4
]
*
dsc5
);
float
gtri
2
=
0.5
f
*
rr5
*
(
sci
4
*
psc5
+
scip
4
*
dsc5
);
gtri
[
3
]
=
0.5
f
*
rr5
*
(
sci
[
3
]
*
psc5
+
scip
[
3
]
*
dsc5
);
float
gtri
3
=
0.5
f
*
rr5
*
(
sci
3
*
psc5
+
scip
3
*
dsc5
);
gtri
[
4
]
=
gfri
[
4
]
;
float
gtri
4
=
gfri
4
;
gtri
[
5
]
=
gfri
[
5
]
;
float
gtri
5
=
gfri
5
;
gtri
[
6
]
=
gfri
[
6
]
;
float
gtri
6
=
gfri
6
;
// get the permanent torque with screening
// get the permanent torque with screening
ttm2
[
1
]
=
-
bn
[
1
]
*
dixdk
[
1
]
+
gf
[
2
]
*
dixr
[
1
]
float
ttm2
1
=
-
bn
1
*
dixdk
1
+
gf
2
*
dixr
1
+
gf
[
4
]
*
(
dixqkr
[
1
]
+
dkxqir
[
1
]
+
rxqidk
[
1
]
-
2.0
f
*
qixqk
[
1
]
)
+
gf
4
*
(
dixqkr
1
+
dkxqir
1
+
rxqidk
1
-
2.0
f
*
qixqk
1
)
-
gf
[
5
]
*
rxqir
[
1
]
-
gf
[
7
]
*
(
rxqikr
[
1
]
+
qkrxqir
[
1
]
);
-
gf
5
*
rxqir
1
-
gf
7
*
(
rxqikr
1
+
qkrxqir
1
);
ttm2
[
2
]
=
-
bn
[
1
]
*
dixdk
[
2
]
+
gf
[
2
]
*
dixr
[
2
]
float
ttm2
2
=
-
bn
1
*
dixdk
2
+
gf
2
*
dixr
2
+
gf
[
4
]
*
(
dixqkr
[
2
]
+
dkxqir
[
2
]
+
rxqidk
[
2
]
-
2.0
f
*
qixqk
[
2
]
)
+
gf
4
*
(
dixqkr
2
+
dkxqir
2
+
rxqidk
2
-
2.0
f
*
qixqk
2
)
-
gf
[
5
]
*
rxqir
[
2
]
-
gf
[
7
]
*
(
rxqikr
[
2
]
+
qkrxqir
[
2
]
);
-
gf
5
*
rxqir
2
-
gf
7
*
(
rxqikr
2
+
qkrxqir
2
);
ttm2
[
3
]
=
-
bn
[
1
]
*
dixdk
[
3
]
+
gf
[
2
]
*
dixr
[
3
]
float
ttm2
3
=
-
bn
1
*
dixdk
3
+
gf
2
*
dixr
3
+
gf
[
4
]
*
(
dixqkr
[
3
]
+
dkxqir
[
3
]
+
rxqidk
[
3
]
-
2.0
f
*
qixqk
[
3
]
)
+
gf
4
*
(
dixqkr
3
+
dkxqir
3
+
rxqidk
3
-
2.0
f
*
qixqk
3
)
-
gf
[
5
]
*
rxqir
[
3
]
-
gf
[
7
]
*
(
rxqikr
[
3
]
+
qkrxqir
[
3
]
);
-
gf
5
*
rxqir
3
-
gf
7
*
(
rxqikr
3
+
qkrxqir
3
);
ttm3
[
1
]
=
bn
[
1
]
*
dixdk
[
1
]
+
gf
[
3
]
*
dkxr
[
1
]
float
ttm3
1
=
bn
1
*
dixdk
1
+
gf
3
*
dkxr
1
-
gf
[
4
]
*
(
dixqkr
[
1
]
+
dkxqir
[
1
]
+
rxqkdi
[
1
]
-
2.0
f
*
qixqk
[
1
]
)
-
gf
4
*
(
dixqkr
1
+
dkxqir
1
+
rxqkdi
1
-
2.0
f
*
qixqk
1
)
-
gf
[
6
]
*
rxqkr
[
1
]
-
gf
[
7
]
*
(
rxqkir
[
1
]
-
qkrxqir
[
1
]
);
-
gf
6
*
rxqkr
1
-
gf
7
*
(
rxqkir
1
-
qkrxqir
1
);
ttm3
[
2
]
=
bn
[
1
]
*
dixdk
[
2
]
+
gf
[
3
]
*
dkxr
[
2
]
float
ttm3
2
=
bn
1
*
dixdk
2
+
gf
3
*
dkxr
2
-
gf
[
4
]
*
(
dixqkr
[
2
]
+
dkxqir
[
2
]
+
rxqkdi
[
2
]
-
2.0
f
*
qixqk
[
2
]
)
-
gf
4
*
(
dixqkr
2
+
dkxqir
2
+
rxqkdi
2
-
2.0
f
*
qixqk
2
)
-
gf
[
6
]
*
rxqkr
[
2
]
-
gf
[
7
]
*
(
rxqkir
[
2
]
-
qkrxqir
[
2
]
);
-
gf
6
*
rxqkr
2
-
gf
7
*
(
rxqkir
2
-
qkrxqir
2
);
ttm3
[
3
]
=
bn
[
1
]
*
dixdk
[
3
]
+
gf
[
3
]
*
dkxr
[
3
]
float
ttm3
3
=
bn
1
*
dixdk
3
+
gf
3
*
dkxr
3
-
gf
[
4
]
*
(
dixqkr
[
3
]
+
dkxqir
[
3
]
+
rxqkdi
[
3
]
-
2.0
f
*
qixqk
[
3
]
)
-
gf
4
*
(
dixqkr
3
+
dkxqir
3
+
rxqkdi
3
-
2.0
f
*
qixqk
3
)
-
gf
[
6
]
*
rxqkr
[
3
]
-
gf
[
7
]
*
(
rxqkir
[
3
]
-
qkrxqir
[
3
]
);
-
gf
6
*
rxqkr
3
-
gf
7
*
(
rxqkir
3
-
qkrxqir
3
);
// get the permanent torque without screening
// get the permanent torque without screening
ttm2r
[
1
]
=
-
rr3
*
dixdk
[
1
]
+
gfr
[
2
]
*
dixr
[
1
]
-
gfr
[
5
]
*
rxqir
[
1
]
float
ttm2r
1
=
-
rr3
*
dixdk
1
+
gfr
2
*
dixr
1
-
gfr
5
*
rxqir
1
+
gfr
[
4
]
*
(
dixqkr
[
1
]
+
dkxqir
[
1
]
+
rxqidk
[
1
]
-
2.0
f
*
qixqk
[
1
]
)
+
gfr
4
*
(
dixqkr
1
+
dkxqir
1
+
rxqidk
1
-
2.0
f
*
qixqk
1
)
-
gfr
[
7
]
*
(
rxqikr
[
1
]
+
qkrxqir
[
1
]
);
-
gfr
7
*
(
rxqikr
1
+
qkrxqir
1
);
ttm2r
[
2
]
=
-
rr3
*
dixdk
[
2
]
+
gfr
[
2
]
*
dixr
[
2
]
-
gfr
[
5
]
*
rxqir
[
2
]
float
ttm2r
2
=
-
rr3
*
dixdk
2
+
gfr
2
*
dixr
2
-
gfr
5
*
rxqir
2
+
gfr
[
4
]
*
(
dixqkr
[
2
]
+
dkxqir
[
2
]
+
rxqidk
[
2
]
-
2.0
f
*
qixqk
[
2
]
)
+
gfr
4
*
(
dixqkr
2
+
dkxqir
2
+
rxqidk
2
-
2.0
f
*
qixqk
2
)
-
gfr
[
7
]
*
(
rxqikr
[
2
]
+
qkrxqir
[
2
]
);
-
gfr
7
*
(
rxqikr
2
+
qkrxqir
2
);
ttm2r
[
3
]
=
-
rr3
*
dixdk
[
3
]
+
gfr
[
2
]
*
dixr
[
3
]
-
gfr
[
5
]
*
rxqir
[
3
]
float
ttm2r
3
=
-
rr3
*
dixdk
3
+
gfr
2
*
dixr
3
-
gfr
5
*
rxqir
3
+
gfr
[
4
]
*
(
dixqkr
[
3
]
+
dkxqir
[
3
]
+
rxqidk
[
3
]
-
2.0
f
*
qixqk
[
3
]
)
+
gfr
4
*
(
dixqkr
3
+
dkxqir
3
+
rxqidk
3
-
2.0
f
*
qixqk
3
)
-
gfr
[
7
]
*
(
rxqikr
[
3
]
+
qkrxqir
[
3
]
);
-
gfr
7
*
(
rxqikr
3
+
qkrxqir
3
);
ttm3r
[
1
]
=
rr3
*
dixdk
[
1
]
+
gfr
[
3
]
*
dkxr
[
1
]
-
gfr
[
6
]
*
rxqkr
[
1
]
float
ttm3r
1
=
rr3
*
dixdk
1
+
gfr
3
*
dkxr
1
-
gfr
6
*
rxqkr
1
-
gfr
[
4
]
*
(
dixqkr
[
1
]
+
dkxqir
[
1
]
+
rxqkdi
[
1
]
-
2.0
f
*
qixqk
[
1
]
)
-
gfr
4
*
(
dixqkr
1
+
dkxqir
1
+
rxqkdi
1
-
2.0
f
*
qixqk
1
)
-
gfr
[
7
]
*
(
rxqkir
[
1
]
-
qkrxqir
[
1
]
);
-
gfr
7
*
(
rxqkir
1
-
qkrxqir
1
);
ttm3r
[
2
]
=
rr3
*
dixdk
[
2
]
+
gfr
[
3
]
*
dkxr
[
2
]
-
gfr
[
6
]
*
rxqkr
[
2
]
float
ttm3r
2
=
rr3
*
dixdk
2
+
gfr
3
*
dkxr
2
-
gfr
6
*
rxqkr
2
-
gfr
[
4
]
*
(
dixqkr
[
2
]
+
dkxqir
[
2
]
+
rxqkdi
[
2
]
-
2.0
f
*
qixqk
[
2
]
)
-
gfr
4
*
(
dixqkr
2
+
dkxqir
2
+
rxqkdi
2
-
2.0
f
*
qixqk
2
)
-
gfr
[
7
]
*
(
rxqkir
[
2
]
-
qkrxqir
[
2
]
);
-
gfr
7
*
(
rxqkir
2
-
qkrxqir
2
);
ttm3r
[
3
]
=
rr3
*
dixdk
[
3
]
+
gfr
[
3
]
*
dkxr
[
3
]
-
gfr
[
6
]
*
rxqkr
[
3
]
float
ttm3r
3
=
rr3
*
dixdk
3
+
gfr
3
*
dkxr
3
-
gfr
6
*
rxqkr
3
-
gfr
[
4
]
*
(
dixqkr
[
3
]
+
dkxqir
[
3
]
+
rxqkdi
[
3
]
-
2.0
f
*
qixqk
[
3
]
)
-
gfr
4
*
(
dixqkr
3
+
dkxqir
3
+
rxqkdi
3
-
2.0
f
*
qixqk
3
)
-
gfr
[
7
]
*
(
rxqkir
[
3
]
-
qkrxqir
[
3
]
);
-
gfr
7
*
(
rxqkir
3
-
qkrxqir
3
);
// get the induced torque with screening
// get the induced torque with screening
ttm2i
[
1
]
=
-
bn
[
1
]
*
(
dixuk
[
1
]
+
dixukp
[
1
]
)
*
0.5
f
float
ttm2i
1
=
-
bn
1
*
(
dixuk
1
+
dixukp
1
)
*
0.5
f
+
gti
[
2
]
*
dixr
[
1
]
+
gti
[
4
]
*
(
ukxqir
[
1
]
+
rxqiuk
[
1
]
+
gti
2
*
dixr
1
+
gti
4
*
(
ukxqir
1
+
rxqiuk
1
+
ukxqirp
[
1
]
+
rxqiukp
[
1
]
)
*
0.5
f
-
gti
[
5
]
*
rxqir
[
1
]
;
+
ukxqirp
1
+
rxqiukp
1
)
*
0.5
f
-
gti
5
*
rxqir
1
;
ttm2i
[
2
]
=
-
bn
[
1
]
*
(
dixuk
[
2
]
+
dixukp
[
2
]
)
*
0.5
f
float
ttm2i
2
=
-
bn
1
*
(
dixuk
2
+
dixukp
2
)
*
0.5
f
+
gti
[
2
]
*
dixr
[
2
]
+
gti
[
4
]
*
(
ukxqir
[
2
]
+
rxqiuk
[
2
]
+
gti
2
*
dixr
2
+
gti
4
*
(
ukxqir
2
+
rxqiuk
2
+
ukxqirp
[
2
]
+
rxqiukp
[
2
]
)
*
0.5
f
-
gti
[
5
]
*
rxqir
[
2
]
;
+
ukxqirp
2
+
rxqiukp
2
)
*
0.5
f
-
gti
5
*
rxqir
2
;
ttm2i
[
3
]
=
-
bn
[
1
]
*
(
dixuk
[
3
]
+
dixukp
[
3
]
)
*
0.5
f
float
ttm2i
3
=
-
bn
1
*
(
dixuk
3
+
dixukp
3
)
*
0.5
f
+
gti
[
2
]
*
dixr
[
3
]
+
gti
[
4
]
*
(
ukxqir
[
3
]
+
rxqiuk
[
3
]
+
gti
2
*
dixr
3
+
gti
4
*
(
ukxqir
3
+
rxqiuk
3
+
ukxqirp
[
3
]
+
rxqiukp
[
3
]
)
*
0.5
f
-
gti
[
5
]
*
rxqir
[
3
]
;
+
ukxqirp
3
+
rxqiukp
3
)
*
0.5
f
-
gti
5
*
rxqir
3
;
ttm3i
[
1
]
=
-
bn
[
1
]
*
(
dkxui
[
1
]
+
dkxuip
[
1
]
)
*
0.5
f
float
ttm3i
1
=
-
bn
1
*
(
dkxui
1
+
dkxuip
1
)
*
0.5
f
+
gti
[
3
]
*
dkxr
[
1
]
-
gti
[
4
]
*
(
uixqkr
[
1
]
+
rxqkui
[
1
]
+
gti
3
*
dkxr
1
-
gti
4
*
(
uixqkr
1
+
rxqkui
1
+
uixqkrp
[
1
]
+
rxqkuip
[
1
]
)
*
0.5
f
-
gti
[
6
]
*
rxqkr
[
1
]
;
+
uixqkrp
1
+
rxqkuip
1
)
*
0.5
f
-
gti
6
*
rxqkr
1
;
ttm3i
[
2
]
=
-
bn
[
1
]
*
(
dkxui
[
2
]
+
dkxuip
[
2
]
)
*
0.5
f
float
ttm3i
2
=
-
bn
1
*
(
dkxui
2
+
dkxuip
2
)
*
0.5
f
+
gti
[
3
]
*
dkxr
[
2
]
-
gti
[
4
]
*
(
uixqkr
[
2
]
+
rxqkui
[
2
]
+
gti
3
*
dkxr
2
-
gti
4
*
(
uixqkr
2
+
rxqkui
2
+
uixqkrp
[
2
]
+
rxqkuip
[
2
]
)
*
0.5
f
-
gti
[
6
]
*
rxqkr
[
2
]
;
+
uixqkrp
2
+
rxqkuip
2
)
*
0.5
f
-
gti
6
*
rxqkr
2
;
ttm3i
[
3
]
=
-
bn
[
1
]
*
(
dkxui
[
3
]
+
dkxuip
[
3
]
)
*
0.5
f
float
ttm3i
3
=
-
bn
1
*
(
dkxui
3
+
dkxuip
3
)
*
0.5
f
+
gti
[
3
]
*
dkxr
[
3
]
-
gti
[
4
]
*
(
uixqkr
[
3
]
+
rxqkui
[
3
]
+
gti
3
*
dkxr
3
-
gti
4
*
(
uixqkr
3
+
rxqkui
3
+
uixqkrp
[
3
]
+
rxqkuip
[
3
]
)
*
0.5
f
-
gti
[
6
]
*
rxqkr
[
3
]
;
+
uixqkrp
3
+
rxqkuip
3
)
*
0.5
f
-
gti
6
*
rxqkr
3
;
// get the induced torque without screening
// get the induced torque without screening
ttm2ri
[
1
]
=
-
rr3
*
(
dixuk
[
1
]
*
psc3
+
dixukp
[
1
]
*
dsc3
)
*
0.5
f
float
ttm2ri
1
=
-
rr3
*
(
dixuk
1
*
psc3
+
dixukp
1
*
dsc3
)
*
0.5
f
+
gtri
[
2
]
*
dixr
[
1
]
+
gtri
[
4
]
*
((
ukxqir
[
1
]
+
rxqiuk
[
1
]
)
*
psc5
+
gtri
2
*
dixr
1
+
gtri
4
*
((
ukxqir
1
+
rxqiuk
1
)
*
psc5
+
(
ukxqirp
[
1
]
+
rxqiukp
[
1
]
)
*
dsc5
)
*
0.5
f
-
gtri
[
5
]
*
rxqir
[
1
]
;
+
(
ukxqirp
1
+
rxqiukp
1
)
*
dsc5
)
*
0.5
f
-
gtri
5
*
rxqir
1
;
ttm2ri
[
2
]
=
-
rr3
*
(
dixuk
[
2
]
*
psc3
+
dixukp
[
2
]
*
dsc3
)
*
0.5
f
float
ttm2ri
2
=
-
rr3
*
(
dixuk
2
*
psc3
+
dixukp
2
*
dsc3
)
*
0.5
f
+
gtri
[
2
]
*
dixr
[
2
]
+
gtri
[
4
]
*
((
ukxqir
[
2
]
+
rxqiuk
[
2
]
)
*
psc5
+
gtri
2
*
dixr
2
+
gtri
4
*
((
ukxqir
2
+
rxqiuk
2
)
*
psc5
+
(
ukxqirp
[
2
]
+
rxqiukp
[
2
]
)
*
dsc5
)
*
0.5
f
-
gtri
[
5
]
*
rxqir
[
2
]
;
+
(
ukxqirp
2
+
rxqiukp
2
)
*
dsc5
)
*
0.5
f
-
gtri
5
*
rxqir
2
;
ttm2ri
[
3
]
=
-
rr3
*
(
dixuk
[
3
]
*
psc3
+
dixukp
[
3
]
*
dsc3
)
*
0.5
f
float
ttm2ri
3
=
-
rr3
*
(
dixuk
3
*
psc3
+
dixukp
3
*
dsc3
)
*
0.5
f
+
gtri
[
2
]
*
dixr
[
3
]
+
gtri
[
4
]
*
((
ukxqir
[
3
]
+
rxqiuk
[
3
]
)
*
psc5
+
gtri
2
*
dixr
3
+
gtri
4
*
((
ukxqir
3
+
rxqiuk
3
)
*
psc5
+
(
ukxqirp
[
3
]
+
rxqiukp
[
3
]
)
*
dsc5
)
*
0.5
f
-
gtri
[
5
]
*
rxqir
[
3
]
;
+
(
ukxqirp
3
+
rxqiukp
3
)
*
dsc5
)
*
0.5
f
-
gtri
5
*
rxqir
3
;
ttm3ri
[
1
]
=
-
rr3
*
(
dkxui
[
1
]
*
psc3
+
dkxuip
[
1
]
*
dsc3
)
*
0.5
f
float
ttm3ri
1
=
-
rr3
*
(
dkxui
1
*
psc3
+
dkxuip
1
*
dsc3
)
*
0.5
f
+
gtri
[
3
]
*
dkxr
[
1
]
-
gtri
[
4
]
*
((
uixqkr
[
1
]
+
rxqkui
[
1
]
)
*
psc5
+
gtri
3
*
dkxr
1
-
gtri
4
*
((
uixqkr
1
+
rxqkui
1
)
*
psc5
+
(
uixqkrp
[
1
]
+
rxqkuip
[
1
]
)
*
dsc5
)
*
0.5
f
-
gtri
[
6
]
*
rxqkr
[
1
]
;
+
(
uixqkrp
1
+
rxqkuip
1
)
*
dsc5
)
*
0.5
f
-
gtri
6
*
rxqkr
1
;
ttm3ri
[
2
]
=
-
rr3
*
(
dkxui
[
2
]
*
psc3
+
dkxuip
[
2
]
*
dsc3
)
*
0.5
f
float
ttm3ri
2
=
-
rr3
*
(
dkxui
2
*
psc3
+
dkxuip
2
*
dsc3
)
*
0.5
f
+
gtri
[
3
]
*
dkxr
[
2
]
-
gtri
[
4
]
*
((
uixqkr
[
2
]
+
rxqkui
[
2
]
)
*
psc5
+
gtri
3
*
dkxr
2
-
gtri
4
*
((
uixqkr
2
+
rxqkui
2
)
*
psc5
+
(
uixqkrp
[
2
]
+
rxqkuip
[
2
]
)
*
dsc5
)
*
0.5
f
-
gtri
[
6
]
*
rxqkr
[
2
]
;
+
(
uixqkrp
2
+
rxqkuip
2
)
*
dsc5
)
*
0.5
f
-
gtri
6
*
rxqkr
2
;
ttm3ri
[
3
]
=
-
rr3
*
(
dkxui
[
3
]
*
psc3
+
dkxuip
[
3
]
*
dsc3
)
*
0.5
f
float
ttm3ri
3
=
-
rr3
*
(
dkxui
3
*
psc3
+
dkxuip
3
*
dsc3
)
*
0.5
f
+
gtri
[
3
]
*
dkxr
[
3
]
-
gtri
[
4
]
*
((
uixqkr
[
3
]
+
rxqkui
[
3
]
)
*
psc5
+
gtri
3
*
dkxr
3
-
gtri
4
*
((
uixqkr
3
+
rxqkui
3
)
*
psc5
+
(
uixqkrp
[
3
]
+
rxqkuip
[
3
]
)
*
dsc5
)
*
0.5
f
-
gtri
[
6
]
*
rxqkr
[
3
]
;
+
(
uixqkrp
3
+
rxqkuip
3
)
*
dsc5
)
*
0.5
f
-
gtri
6
*
rxqkr
3
;
// handle the case where scaling is used
// handle the case where scaling is used
for
(
int
j
=
1
;
j
<=
3
;
j
++
){
ftm21
=
(
ftm21
-
(
1.0
f
-
scalingFactors
[
MScaleIndex
])
*
ftm2r1
);
ftm2
[
j
]
=
(
ftm2
[
j
]
-
(
1.0
f
-
scalingFactors
[
MScaleIndex
])
*
ftm2r
[
j
]);
ftm2i1
=
(
ftm2i1
-
ftm2ri1
);
ftm2i
[
j
]
=
(
ftm2i
[
j
]
-
ftm2ri
[
j
]);
ttm21
=
(
ttm21
-
(
1.0
f
-
scalingFactors
[
MScaleIndex
])
*
ttm2r1
);
ttm2
[
j
]
=
(
ttm2
[
j
]
-
(
1.0
f
-
scalingFactors
[
MScaleIndex
])
*
ttm2r
[
j
]);
ttm2i1
=
(
ttm2i1
-
ttm2ri1
);
ttm2i
[
j
]
=
(
ttm2i
[
j
]
-
ttm2ri
[
j
]);
ttm31
=
(
ttm31
-
(
1.0
f
-
scalingFactors
[
MScaleIndex
])
*
ttm3r1
);
ttm3
[
j
]
=
(
ttm3
[
j
]
-
(
1.0
f
-
scalingFactors
[
MScaleIndex
])
*
ttm3r
[
j
]);
ttm3i1
=
(
ttm3i1
-
ttm3ri1
);
ttm3i
[
j
]
=
(
ttm3i
[
j
]
-
ttm3ri
[
j
]);
}
ftm22
=
(
ftm22
-
(
1.0
f
-
scalingFactors
[
MScaleIndex
])
*
ftm2r2
);
ftm2i2
=
(
ftm2i2
-
ftm2ri2
);
ttm22
=
(
ttm22
-
(
1.0
f
-
scalingFactors
[
MScaleIndex
])
*
ttm2r2
);
ttm2i2
=
(
ttm2i2
-
ttm2ri2
);
ttm32
=
(
ttm32
-
(
1.0
f
-
scalingFactors
[
MScaleIndex
])
*
ttm3r2
);
ttm3i2
=
(
ttm3i2
-
ttm3ri2
);
ftm23
=
(
ftm23
-
(
1.0
f
-
scalingFactors
[
MScaleIndex
])
*
ftm2r3
);
ftm2i3
=
(
ftm2i3
-
ftm2ri3
);
ttm23
=
(
ttm23
-
(
1.0
f
-
scalingFactors
[
MScaleIndex
])
*
ttm2r3
);
ttm2i3
=
(
ttm2i3
-
ttm2ri3
);
ttm33
=
(
ttm33
-
(
1.0
f
-
scalingFactors
[
MScaleIndex
])
*
ttm3r3
);
ttm3i3
=
(
ttm3i3
-
ttm3ri3
);
// increment gradient due to force and torque on first site;
// increment gradient due to force and torque on first site;
outputForce
[
0
]
=
conversionFactor
*
(
ftm2
[
1
]
+
ftm2i
[
1
]
);
outputForce
[
0
]
=
conversionFactor
*
(
ftm2
1
+
ftm2i
1
);
outputForce
[
1
]
=
conversionFactor
*
(
ftm2
[
2
]
+
ftm2i
[
2
]
);
outputForce
[
1
]
=
conversionFactor
*
(
ftm2
2
+
ftm2i
2
);
outputForce
[
2
]
=
conversionFactor
*
(
ftm2
[
3
]
+
ftm2i
[
3
]
);
outputForce
[
2
]
=
conversionFactor
*
(
ftm2
3
+
ftm2i
3
);
conversionFactor
*=
-
1.0
;
conversionFactor
*=
-
1.0
;
outputTorque
[
0
][
0
]
=
conversionFactor
*
(
ttm2
[
1
]
+
ttm2i
[
1
]
);
outputTorque
[
0
][
0
]
=
conversionFactor
*
(
ttm2
1
+
ttm2i
1
);
outputTorque
[
0
][
1
]
=
conversionFactor
*
(
ttm2
[
2
]
+
ttm2i
[
2
]
);
outputTorque
[
0
][
1
]
=
conversionFactor
*
(
ttm2
2
+
ttm2i
2
);
outputTorque
[
0
][
2
]
=
conversionFactor
*
(
ttm2
[
3
]
+
ttm2i
[
3
]
);
outputTorque
[
0
][
2
]
=
conversionFactor
*
(
ttm2
3
+
ttm2i
3
);
outputTorque
[
1
][
0
]
=
conversionFactor
*
(
ttm3
[
1
]
+
ttm3i
[
1
]
);
outputTorque
[
1
][
0
]
=
conversionFactor
*
(
ttm3
1
+
ttm3i
1
);
outputTorque
[
1
][
1
]
=
conversionFactor
*
(
ttm3
[
2
]
+
ttm3i
[
2
]
);
outputTorque
[
1
][
1
]
=
conversionFactor
*
(
ttm3
2
+
ttm3i
2
);
outputTorque
[
1
][
2
]
=
conversionFactor
*
(
ttm3
[
3
]
+
ttm3i
[
3
]
);
outputTorque
[
1
][
2
]
=
conversionFactor
*
(
ttm3
3
+
ttm3i
3
);
#ifdef AMOEBA_DEBUG
#ifdef AMOEBA_DEBUG
int
debugIndex
=
0
;
int
debugIndex
=
0
;
...
@@ -940,9 +912,9 @@ __device__ void calculatePmeDirectElectrostaticPairIxn_kernel( PmeDirectElectros
...
@@ -940,9 +912,9 @@ __device__ void calculatePmeDirectElectrostaticPairIxn_kernel( PmeDirectElectros
debugIndex++;
debugIndex++;
idTracker += 1.0;
idTracker += 1.0;
debugArray[debugIndex].x = conversionFactor*ftm2
[1]
;
debugArray[debugIndex].x = conversionFactor*ftm2
1
;
debugArray[debugIndex].y = conversionFactor*ftm2
[2]
;
debugArray[debugIndex].y = conversionFactor*ftm2
2
;
debugArray[debugIndex].z = conversionFactor*ftm2
[3]
;
debugArray[debugIndex].z = conversionFactor*ftm2
3
;
debugArray[debugIndex].w = idTracker;
debugArray[debugIndex].w = idTracker;
debugIndex++;
debugIndex++;
*/
*/
...
@@ -956,28 +928,28 @@ __device__ void calculatePmeDirectElectrostaticPairIxn_kernel( PmeDirectElectros
...
@@ -956,28 +928,28 @@ __device__ void calculatePmeDirectElectrostaticPairIxn_kernel( PmeDirectElectros
idTracker
+=
1.0
;
idTracker
+=
1.0
;
debugArray
[
debugIndex
].
x
=
r2
;
debugArray
[
debugIndex
].
x
=
r2
;
debugArray
[
debugIndex
].
y
=
cSim
.
alphaEwald
;
debugArray
[
debugIndex
].
y
=
cSim
.
alphaEwald
;
debugArray
[
debugIndex
].
z
=
conversionFactor
*
fridmp
[
3
]
;
debugArray
[
debugIndex
].
z
=
conversionFactor
*
fridmp
3
;
debugArray
[
debugIndex
].
w
=
115.0
;
debugArray
[
debugIndex
].
w
=
115.0
;
debugIndex
++
;
debugIndex
++
;
idTracker
+=
1.0
;
idTracker
+=
1.0
;
debugArray
[
debugIndex
].
x
=
conversionFactor
*
findmp
[
1
]
;
debugArray
[
debugIndex
].
x
=
conversionFactor
*
findmp
1
;
debugArray
[
debugIndex
].
y
=
conversionFactor
*
findmp
[
2
]
;
debugArray
[
debugIndex
].
y
=
conversionFactor
*
findmp
2
;
debugArray
[
debugIndex
].
z
=
conversionFactor
*
findmp
[
3
]
;
debugArray
[
debugIndex
].
z
=
conversionFactor
*
findmp
3
;
debugArray
[
debugIndex
].
w
=
cSim
.
alphaEwald
+
1.0
f
;
debugArray
[
debugIndex
].
w
=
cSim
.
alphaEwald
+
1.0
f
;
debugIndex
++
;
debugIndex
++
;
idTracker
+=
1.0
;
idTracker
+=
1.0
;
debugArray
[
debugIndex
].
x
=
conversionFactor
*
ttm2
[
1
]
;
debugArray
[
debugIndex
].
x
=
conversionFactor
*
ttm2
1
;
debugArray
[
debugIndex
].
y
=
conversionFactor
*
ttm2
[
2
]
;
debugArray
[
debugIndex
].
y
=
conversionFactor
*
ttm2
2
;
debugArray
[
debugIndex
].
z
=
conversionFactor
*
ttm2
[
3
]
;
debugArray
[
debugIndex
].
z
=
conversionFactor
*
ttm2
3
;
debugArray
[
debugIndex
].
w
=
idTracker
;
debugArray
[
debugIndex
].
w
=
idTracker
;
debugIndex
++
;
debugIndex
++
;
idTracker
+=
1.0
;
idTracker
+=
1.0
;
debugArray
[
debugIndex
].
x
=
conversionFactor
*
ttm2i
[
1
]
;
debugArray
[
debugIndex
].
x
=
conversionFactor
*
ttm2i
1
;
debugArray
[
debugIndex
].
y
=
conversionFactor
*
ttm2i
[
2
]
;
debugArray
[
debugIndex
].
y
=
conversionFactor
*
ttm2i
2
;
debugArray
[
debugIndex
].
z
=
conversionFactor
*
ttm2i
[
3
]
;
debugArray
[
debugIndex
].
z
=
conversionFactor
*
ttm2i
3
;
debugArray
[
debugIndex
].
w
=
idTracker
;
debugArray
[
debugIndex
].
w
=
idTracker
;
#endif
#endif
...
@@ -1015,10 +987,11 @@ for( int ii = 0; ii < 5; ii++ ){
...
@@ -1015,10 +987,11 @@ for( int ii = 0; ii < 5; ii++ ){
__device__
void
loadPmeDirectElectrostaticShared
(
struct
PmeDirectElectrostaticParticle
*
sA
,
unsigned
int
atomI
)
__device__
void
loadPmeDirectElectrostaticShared
(
struct
PmeDirectElectrostaticParticle
*
sA
,
unsigned
int
atomI
)
{
{
// coordinates & charge
// coordinates & charge
sA
->
x
=
cSim
.
pPosq
[
atomI
].
x
;
float4
posq
=
cSim
.
pPosq
[
atomI
];
sA
->
y
=
cSim
.
pPosq
[
atomI
].
y
;
sA
->
x
=
posq
.
x
;
sA
->
z
=
cSim
.
pPosq
[
atomI
].
z
;
sA
->
y
=
posq
.
y
;
sA
->
q
=
cSim
.
pPosq
[
atomI
].
w
;
sA
->
z
=
posq
.
z
;
sA
->
q
=
posq
.
w
;
// lab dipole
// lab dipole
...
@@ -1051,8 +1024,9 @@ __device__ void loadPmeDirectElectrostaticShared( struct PmeDirectElectrostaticP
...
@@ -1051,8 +1024,9 @@ __device__ void loadPmeDirectElectrostaticShared( struct PmeDirectElectrostaticP
sA
->
inducedDipoleP
[
1
]
=
cAmoebaSim
.
pInducedDipolePolar
[
atomI
*
3
+
1
];
sA
->
inducedDipoleP
[
1
]
=
cAmoebaSim
.
pInducedDipolePolar
[
atomI
*
3
+
1
];
sA
->
inducedDipoleP
[
2
]
=
cAmoebaSim
.
pInducedDipolePolar
[
atomI
*
3
+
2
];
sA
->
inducedDipoleP
[
2
]
=
cAmoebaSim
.
pInducedDipolePolar
[
atomI
*
3
+
2
];
sA
->
damp
=
cAmoebaSim
.
pDampingFactorAndThole
[
atomI
].
x
;
float2
dampingFactorAndThole
=
cAmoebaSim
.
pDampingFactorAndThole
[
atomI
];
sA
->
thole
=
cAmoebaSim
.
pDampingFactorAndThole
[
atomI
].
y
;
sA
->
damp
=
dampingFactorAndThole
.
x
;
sA
->
thole
=
dampingFactorAndThole
.
y
;
}
}
...
...
plugins/amoeba/platforms/cuda/src/kernels/kCalculateAmoebaCudaPmeDirectElectrostatic.h
View file @
92a338cf
...
@@ -29,7 +29,7 @@
...
@@ -29,7 +29,7 @@
__global__
__global__
#if (__CUDA_ARCH__ >= 200)
#if (__CUDA_ARCH__ >= 200)
__launch_bounds__
(
384
,
1
)
__launch_bounds__
(
384
,
1
)
#elif (__CUDA_ARCH__ >= 1
3
0)
#elif (__CUDA_ARCH__ >= 1
2
0)
__launch_bounds__
(
128
,
1
)
__launch_bounds__
(
128
,
1
)
#else
#else
__launch_bounds__
(
64
,
1
)
__launch_bounds__
(
64
,
1
)
...
...
plugins/amoeba/platforms/cuda/src/kernels/kCalculateAmoebaCudaPmeFixedEField.cu
View file @
92a338cf
...
@@ -167,7 +167,7 @@ __device__ void sumTempBuffer( FixedFieldParticle& atomI, FixedFieldParticle& at
...
@@ -167,7 +167,7 @@ __device__ void sumTempBuffer( FixedFieldParticle& atomI, FixedFieldParticle& at
}
}
__device__
void
calculateFixedFieldRealSpacePairIxn_kernel
(
FixedFieldParticle
&
atomI
,
FixedFieldParticle
&
atomJ
,
__device__
void
calculateFixedFieldRealSpacePairIxn_kernel
(
FixedFieldParticle
&
atomI
,
FixedFieldParticle
&
atomJ
,
float
dscale
,
float
pscale
,
float
fields
[
4
][
3
]
float
dscale
,
float
pscale
,
float
4
fields
[
3
]
#ifdef AMOEBA_DEBUG
#ifdef AMOEBA_DEBUG
,
float4
*
pullBack
,
float4
*
pullBack
#endif
#endif
...
@@ -192,20 +192,19 @@ __device__ void calculateFixedFieldRealSpacePairIxn_kernel( FixedFieldParticle&
...
@@ -192,20 +192,19 @@ __device__ void calculateFixedFieldRealSpacePairIxn_kernel( FixedFieldParticle&
// calculate the error function damping terms
// calculate the error function damping terms
float
ralpha
=
cSim
.
alphaEwald
*
r
;
float
ralpha
=
cSim
.
alphaEwald
*
r
;
float
bn
[
4
];
bn
[
0
]
=
erfc
(
ralpha
)
/
r
;
float
bn0
=
erfc
(
ralpha
)
/
r
;
float
alsq2
=
2.0
f
*
cSim
.
alphaEwald
*
cSim
.
alphaEwald
;
float
alsq2
=
2.0
f
*
cSim
.
alphaEwald
*
cSim
.
alphaEwald
;
float
alsq2n
=
1.0
f
/
(
cAmoebaSim
.
sqrtPi
*
cSim
.
alphaEwald
);
float
alsq2n
=
1.0
f
/
(
cAmoebaSim
.
sqrtPi
*
cSim
.
alphaEwald
);
float
exp2a
=
exp
(
-
(
ralpha
*
ralpha
));
float
exp2a
=
exp
(
-
(
ralpha
*
ralpha
));
alsq2n
*=
alsq2
;
alsq2n
*=
alsq2
;
bn
[
1
]
=
(
bn
[
0
]
+
alsq2n
*
exp2a
)
/
r2
;
float
bn1
=
(
bn
0
+
alsq2n
*
exp2a
)
/
r2
;
alsq2n
*=
alsq2
;
alsq2n
*=
alsq2
;
bn
[
2
]
=
(
3.0
f
*
bn
[
1
]
+
alsq2n
*
exp2a
)
/
r2
;
float
bn2
=
(
3.0
f
*
bn
1
+
alsq2n
*
exp2a
)
/
r2
;
alsq2n
*=
alsq2
;
alsq2n
*=
alsq2
;
bn
[
3
]
=
(
5.0
f
*
bn
[
2
]
+
alsq2n
*
exp2a
)
/
r2
;
float
bn3
=
(
5.0
f
*
bn
2
+
alsq2n
*
exp2a
)
/
r2
;
// compute the error function scaled and unscaled terms
// compute the error function scaled and unscaled terms
...
@@ -262,99 +261,96 @@ __device__ void calculateFixedFieldRealSpacePairIxn_kernel( FixedFieldParticle&
...
@@ -262,99 +261,96 @@ __device__ void calculateFixedFieldRealSpacePairIxn_kernel( FixedFieldParticle&
float
qkz
=
atomJ
.
labFrameQuadrupole_XZ
*
xr
+
atomJ
.
labFrameQuadrupole_YZ
*
yr
+
atomJ
.
labFrameQuadrupole_ZZ
*
zr
;
float
qkz
=
atomJ
.
labFrameQuadrupole_XZ
*
xr
+
atomJ
.
labFrameQuadrupole_YZ
*
yr
+
atomJ
.
labFrameQuadrupole_ZZ
*
zr
;
float
qkr
=
qkx
*
xr
+
qky
*
yr
+
qkz
*
zr
;
float
qkr
=
qkx
*
xr
+
qky
*
yr
+
qkz
*
zr
;
float
fim
[
3
],
fkm
[
3
];
float
fim0
=
-
xr
*
(
bn1
*
atomJ
.
q
-
bn2
*
dkr
+
bn3
*
qkr
)
float
fid
[
3
],
fkd
[
3
];
-
bn1
*
atomJ
.
labFrameDipole_X
+
2.0
f
*
bn2
*
qkx
;
float
fip
[
3
],
fkp
[
3
];
fim
[
0
]
=
-
xr
*
(
bn
[
1
]
*
atomJ
.
q
-
bn
[
2
]
*
dkr
+
bn
[
3
]
*
qkr
)
-
bn
[
1
]
*
atomJ
.
labFrameDipole_X
+
2.0
f
*
bn
[
2
]
*
qkx
;
f
im
[
1
]
=
-
yr
*
(
bn
[
1
]
*
atomJ
.
q
-
bn
[
2
]
*
dkr
+
bn
[
3
]
*
qkr
)
f
loat
fim1
=
-
yr
*
(
bn
1
*
atomJ
.
q
-
bn
2
*
dkr
+
bn
3
*
qkr
)
-
bn
[
1
]
*
atomJ
.
labFrameDipole_Y
+
2.0
f
*
bn
[
2
]
*
qky
;
-
bn
1
*
atomJ
.
labFrameDipole_Y
+
2.0
f
*
bn
2
*
qky
;
f
im
[
2
]
=
-
zr
*
(
bn
[
1
]
*
atomJ
.
q
-
bn
[
2
]
*
dkr
+
bn
[
3
]
*
qkr
)
f
loat
fim2
=
-
zr
*
(
bn
1
*
atomJ
.
q
-
bn
2
*
dkr
+
bn
3
*
qkr
)
-
bn
[
1
]
*
atomJ
.
labFrameDipole_Z
+
2.0
f
*
bn
[
2
]
*
qkz
;
-
bn
1
*
atomJ
.
labFrameDipole_Z
+
2.0
f
*
bn
2
*
qkz
;
f
km
[
0
]
=
xr
*
(
bn
[
1
]
*
atomI
.
q
+
bn
[
2
]
*
dir
+
bn
[
3
]
*
qir
)
f
loat
fkm0
=
xr
*
(
bn
1
*
atomI
.
q
+
bn
2
*
dir
+
bn
3
*
qir
)
-
bn
[
1
]
*
atomI
.
labFrameDipole_X
-
2.0
f
*
bn
[
2
]
*
qix
;
-
bn
1
*
atomI
.
labFrameDipole_X
-
2.0
f
*
bn
2
*
qix
;
f
km
[
1
]
=
yr
*
(
bn
[
1
]
*
atomI
.
q
+
bn
[
2
]
*
dir
+
bn
[
3
]
*
qir
)
f
loat
fkm1
=
yr
*
(
bn
1
*
atomI
.
q
+
bn
2
*
dir
+
bn
3
*
qir
)
-
bn
[
1
]
*
atomI
.
labFrameDipole_Y
-
2.0
f
*
bn
[
2
]
*
qiy
;
-
bn
1
*
atomI
.
labFrameDipole_Y
-
2.0
f
*
bn
2
*
qiy
;
f
km
[
2
]
=
zr
*
(
bn
[
1
]
*
atomI
.
q
+
bn
[
2
]
*
dir
+
bn
[
3
]
*
qir
)
f
loat
fkm2
=
zr
*
(
bn
1
*
atomI
.
q
+
bn
2
*
dir
+
bn
3
*
qir
)
-
bn
[
1
]
*
atomI
.
labFrameDipole_Z
-
2.0
f
*
bn
[
2
]
*
qiz
;
-
bn
1
*
atomI
.
labFrameDipole_Z
-
2.0
f
*
bn
2
*
qiz
;
f
id
[
0
]
=
-
xr
*
(
drr3
*
atomJ
.
q
-
drr5
*
dkr
+
drr7
*
qkr
)
f
loat
fid0
=
-
xr
*
(
drr3
*
atomJ
.
q
-
drr5
*
dkr
+
drr7
*
qkr
)
-
drr3
*
atomJ
.
labFrameDipole_X
+
2.0
f
*
drr5
*
qkx
;
-
drr3
*
atomJ
.
labFrameDipole_X
+
2.0
f
*
drr5
*
qkx
;
f
id
[
1
]
=
-
yr
*
(
drr3
*
atomJ
.
q
-
drr5
*
dkr
+
drr7
*
qkr
)
f
loat
fid1
=
-
yr
*
(
drr3
*
atomJ
.
q
-
drr5
*
dkr
+
drr7
*
qkr
)
-
drr3
*
atomJ
.
labFrameDipole_Y
+
2.0
f
*
drr5
*
qky
;
-
drr3
*
atomJ
.
labFrameDipole_Y
+
2.0
f
*
drr5
*
qky
;
f
id
[
2
]
=
-
zr
*
(
drr3
*
atomJ
.
q
-
drr5
*
dkr
+
drr7
*
qkr
)
f
loat
fid2
=
-
zr
*
(
drr3
*
atomJ
.
q
-
drr5
*
dkr
+
drr7
*
qkr
)
-
drr3
*
atomJ
.
labFrameDipole_Z
+
2.0
f
*
drr5
*
qkz
;
-
drr3
*
atomJ
.
labFrameDipole_Z
+
2.0
f
*
drr5
*
qkz
;
f
kd
[
0
]
=
xr
*
(
drr3
*
atomI
.
q
+
drr5
*
dir
+
drr7
*
qir
)
f
loat
fkd0
=
xr
*
(
drr3
*
atomI
.
q
+
drr5
*
dir
+
drr7
*
qir
)
-
drr3
*
atomI
.
labFrameDipole_X
-
2.0
f
*
drr5
*
qix
;
-
drr3
*
atomI
.
labFrameDipole_X
-
2.0
f
*
drr5
*
qix
;
f
kd
[
1
]
=
yr
*
(
drr3
*
atomI
.
q
+
drr5
*
dir
+
drr7
*
qir
)
f
loat
fkd1
=
yr
*
(
drr3
*
atomI
.
q
+
drr5
*
dir
+
drr7
*
qir
)
-
drr3
*
atomI
.
labFrameDipole_Y
-
2.0
f
*
drr5
*
qiy
;
-
drr3
*
atomI
.
labFrameDipole_Y
-
2.0
f
*
drr5
*
qiy
;
f
kd
[
2
]
=
zr
*
(
drr3
*
atomI
.
q
+
drr5
*
dir
+
drr7
*
qir
)
f
loat
fkd2
=
zr
*
(
drr3
*
atomI
.
q
+
drr5
*
dir
+
drr7
*
qir
)
-
drr3
*
atomI
.
labFrameDipole_Z
-
2.0
f
*
drr5
*
qiz
;
-
drr3
*
atomI
.
labFrameDipole_Z
-
2.0
f
*
drr5
*
qiz
;
f
ip
[
0
]
=
-
xr
*
(
prr3
*
atomJ
.
q
-
prr5
*
dkr
+
prr7
*
qkr
)
f
loat
fip0
=
-
xr
*
(
prr3
*
atomJ
.
q
-
prr5
*
dkr
+
prr7
*
qkr
)
-
prr3
*
atomJ
.
labFrameDipole_X
+
2.0
f
*
prr5
*
qkx
;
-
prr3
*
atomJ
.
labFrameDipole_X
+
2.0
f
*
prr5
*
qkx
;
f
ip
[
1
]
=
-
yr
*
(
prr3
*
atomJ
.
q
-
prr5
*
dkr
+
prr7
*
qkr
)
f
loat
fip1
=
-
yr
*
(
prr3
*
atomJ
.
q
-
prr5
*
dkr
+
prr7
*
qkr
)
-
prr3
*
atomJ
.
labFrameDipole_Y
+
2.0
f
*
prr5
*
qky
;
-
prr3
*
atomJ
.
labFrameDipole_Y
+
2.0
f
*
prr5
*
qky
;
f
ip
[
2
]
=
-
zr
*
(
prr3
*
atomJ
.
q
-
prr5
*
dkr
+
prr7
*
qkr
)
f
loat
fip2
=
-
zr
*
(
prr3
*
atomJ
.
q
-
prr5
*
dkr
+
prr7
*
qkr
)
-
prr3
*
atomJ
.
labFrameDipole_Z
+
2.0
f
*
prr5
*
qkz
;
-
prr3
*
atomJ
.
labFrameDipole_Z
+
2.0
f
*
prr5
*
qkz
;
f
kp
[
0
]
=
xr
*
(
prr3
*
atomI
.
q
+
prr5
*
dir
+
prr7
*
qir
)
f
loat
fkp0
=
xr
*
(
prr3
*
atomI
.
q
+
prr5
*
dir
+
prr7
*
qir
)
-
prr3
*
atomI
.
labFrameDipole_X
-
2.0
f
*
prr5
*
qix
;
-
prr3
*
atomI
.
labFrameDipole_X
-
2.0
f
*
prr5
*
qix
;
f
kp
[
1
]
=
yr
*
(
prr3
*
atomI
.
q
+
prr5
*
dir
+
prr7
*
qir
)
f
loat
fkp1
=
yr
*
(
prr3
*
atomI
.
q
+
prr5
*
dir
+
prr7
*
qir
)
-
prr3
*
atomI
.
labFrameDipole_Y
-
2.0
f
*
prr5
*
qiy
;
-
prr3
*
atomI
.
labFrameDipole_Y
-
2.0
f
*
prr5
*
qiy
;
f
kp
[
2
]
=
zr
*
(
prr3
*
atomI
.
q
+
prr5
*
dir
+
prr7
*
qir
)
f
loat
fkp2
=
zr
*
(
prr3
*
atomI
.
q
+
prr5
*
dir
+
prr7
*
qir
)
-
prr3
*
atomI
.
labFrameDipole_Z
-
2.0
f
*
prr5
*
qiz
;
-
prr3
*
atomI
.
labFrameDipole_Z
-
2.0
f
*
prr5
*
qiz
;
// increment the field at each site due to this interaction
// increment the field at each site due to this interaction
if
(
r2
<=
cSim
.
nonbondedCutoffSqr
){
if
(
r2
<=
cSim
.
nonbondedCutoffSqr
){
fields
[
0
]
[
0
]
=
fim
[
0
]
-
fid
[
0
]
;
fields
[
0
]
.
x
=
fim
0
-
fid
0
;
fields
[
0
][
1
]
=
fim
[
1
]
-
fid
[
1
]
;
fields
[
1
]
.
x
=
fim
1
-
fid
1
;
fields
[
0
][
2
]
=
fim
[
2
]
-
fid
[
2
]
;
fields
[
2
]
.
x
=
fim
2
-
fid
2
;
fields
[
1
][
0
]
=
fkm
[
0
]
-
fkd
[
0
]
;
fields
[
0
]
.
y
=
fkm
0
-
fkd
0
;
fields
[
1
]
[
1
]
=
fkm
[
1
]
-
fkd
[
1
]
;
fields
[
1
]
.
y
=
fkm
1
-
fkd
1
;
fields
[
1
][
2
]
=
fkm
[
2
]
-
fkd
[
2
]
;
fields
[
2
]
.
y
=
fkm
2
-
fkd
2
;
fields
[
2
][
0
]
=
fim
[
0
]
-
fip
[
0
]
;
fields
[
0
]
.
z
=
fim
0
-
fip
0
;
fields
[
2
][
1
]
=
fim
[
1
]
-
fip
[
1
]
;
fields
[
1
]
.
z
=
fim
1
-
fip
1
;
fields
[
2
]
[
2
]
=
fim
[
2
]
-
fip
[
2
]
;
fields
[
2
]
.
z
=
fim
2
-
fip
2
;
fields
[
3
][
0
]
=
fkm
[
0
]
-
fkp
[
0
]
;
fields
[
0
]
.
w
=
fkm
0
-
fkp
0
;
fields
[
3
][
1
]
=
fkm
[
1
]
-
fkp
[
1
]
;
fields
[
1
]
.
w
=
fkm
1
-
fkp
1
;
fields
[
3
][
2
]
=
fkm
[
2
]
-
fkp
[
2
]
;
fields
[
2
]
.
w
=
fkm
2
-
fkp
2
;
}
else
{
}
else
{
fields
[
0
]
[
0
]
=
0.0
f
;
fields
[
0
]
.
x
=
0.0
f
;
fields
[
1
][
0
]
=
0.0
f
;
fields
[
0
]
.
y
=
0.0
f
;
fields
[
2
][
0
]
=
0.0
f
;
fields
[
0
]
.
z
=
0.0
f
;
fields
[
3
][
0
]
=
0.0
f
;
fields
[
0
]
.
w
=
0.0
f
;
fields
[
0
][
1
]
=
0.0
f
;
fields
[
1
]
.
x
=
0.0
f
;
fields
[
1
]
[
1
]
=
0.0
f
;
fields
[
1
]
.
y
=
0.0
f
;
fields
[
2
][
1
]
=
0.0
f
;
fields
[
1
]
.
z
=
0.0
f
;
fields
[
3
][
1
]
=
0.0
f
;
fields
[
1
]
.
w
=
0.0
f
;
fields
[
0
][
2
]
=
0.0
f
;
fields
[
2
]
.
x
=
0.0
f
;
fields
[
1
][
2
]
=
0.0
f
;
fields
[
2
]
.
y
=
0.0
f
;
fields
[
2
]
[
2
]
=
0.0
f
;
fields
[
2
]
.
z
=
0.0
f
;
fields
[
3
][
2
]
=
0.0
f
;
fields
[
2
]
.
w
=
0.0
f
;
}
}
#ifdef AMOEBA_DEBUG
#ifdef AMOEBA_DEBUG
...
@@ -441,7 +437,7 @@ static void cudaComputeAmoebaPmeDirectFixedEField( amoebaGpuContext amoebaGpu )
...
@@ -441,7 +437,7 @@ static void cudaComputeAmoebaPmeDirectFixedEField( amoebaGpuContext amoebaGpu )
if
(
gpu
->
sm_version
>=
SM_20
)
if
(
gpu
->
sm_version
>=
SM_20
)
maxThreads
=
384
;
maxThreads
=
384
;
else
if
(
gpu
->
sm_version
>=
SM_12
)
else
if
(
gpu
->
sm_version
>=
SM_12
)
maxThreads
=
1
28
;
maxThreads
=
1
92
;
else
else
maxThreads
=
64
;
maxThreads
=
64
;
threadsPerBlock
=
std
::
min
(
getThreadsPerBlock
(
amoebaGpu
,
sizeof
(
FixedFieldParticle
)),
maxThreads
);
threadsPerBlock
=
std
::
min
(
getThreadsPerBlock
(
amoebaGpu
,
sizeof
(
FixedFieldParticle
)),
maxThreads
);
...
...
plugins/amoeba/platforms/cuda/src/kernels/kCalculateAmoebaCudaPmeFixedEField.h
View file @
92a338cf
...
@@ -28,11 +28,11 @@
...
@@ -28,11 +28,11 @@
__global__
__global__
#if (__CUDA_ARCH__ >= 200)
#if (__CUDA_ARCH__ >= 200)
__launch_bounds__
(
GF1XX_NONBOND_THREADS_PER_BLOCK
,
1
)
__launch_bounds__
(
384
,
1
)
#elif (__CUDA_ARCH__ >= 1
3
0)
#elif (__CUDA_ARCH__ >= 1
2
0)
__launch_bounds__
(
GT2XX_NONBOND_THREADS_PER_BLOCK
,
1
)
__launch_bounds__
(
192
,
1
)
#else
#else
__launch_bounds__
(
G8X_NONBOND_THREADS_PER_BLOCK
,
1
)
__launch_bounds__
(
64
,
1
)
#endif
#endif
void
METHOD_NAME
(
kCalculateAmoebaPmeDirectFixedE_Field
,
_kernel
)(
void
METHOD_NAME
(
kCalculateAmoebaPmeDirectFixedE_Field
,
_kernel
)(
unsigned
int
*
workUnit
,
unsigned
int
*
workUnit
,
...
@@ -117,7 +117,7 @@ void METHOD_NAME(kCalculateAmoebaPmeDirectFixedE_Field, _kernel)(
...
@@ -117,7 +117,7 @@ void METHOD_NAME(kCalculateAmoebaPmeDirectFixedE_Field, _kernel)(
getMaskedPScaleFactor
(
j
,
pScaleMask
,
&
pScaleValue
);
getMaskedPScaleFactor
(
j
,
pScaleMask
,
&
pScaleValue
);
}
}
float
ijField
[
4
][
3
];
float
4
ijField
[
3
];
calculateFixedFieldRealSpacePairIxn_kernel
(
localParticle
,
psA
[
j
],
dScaleValue
,
pScaleValue
,
ijField
calculateFixedFieldRealSpacePairIxn_kernel
(
localParticle
,
psA
[
j
],
dScaleValue
,
pScaleValue
,
ijField
#ifdef AMOEBA_DEBUG
#ifdef AMOEBA_DEBUG
,
pullBack
,
pullBack
...
@@ -131,13 +131,13 @@ void METHOD_NAME(kCalculateAmoebaPmeDirectFixedE_Field, _kernel)(
...
@@ -131,13 +131,13 @@ void METHOD_NAME(kCalculateAmoebaPmeDirectFixedE_Field, _kernel)(
// 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
fieldSum
[
0
]
+=
match
?
0
.
0
f
:
ijField
[
0
]
[
0
]
;
fieldSum
[
0
]
+=
match
?
0
.
0
f
:
ijField
[
0
]
.
x
;
fieldSum
[
1
]
+=
match
?
0
.
0
f
:
ijField
[
0
][
1
];
fieldSum
[
1
]
+=
match
?
0
.
0
f
:
ijField
[
1
]
.
x
;
fieldSum
[
2
]
+=
match
?
0
.
0
f
:
ijField
[
0
][
2
];
fieldSum
[
2
]
+=
match
?
0
.
0
f
:
ijField
[
2
]
.
x
;
fieldPolarSum
[
0
]
+=
match
?
0
.
0
f
:
ijField
[
2
][
0
];
fieldPolarSum
[
0
]
+=
match
?
0
.
0
f
:
ijField
[
0
]
.
z
;
fieldPolarSum
[
1
]
+=
match
?
0
.
0
f
:
ijField
[
2
][
1
];
fieldPolarSum
[
1
]
+=
match
?
0
.
0
f
:
ijField
[
1
]
.
z
;
fieldPolarSum
[
2
]
+=
match
?
0
.
0
f
:
ijField
[
2
]
[
2
]
;
fieldPolarSum
[
2
]
+=
match
?
0
.
0
f
:
ijField
[
2
]
.
z
;
#ifdef AMOEBA_DEBUG
#ifdef AMOEBA_DEBUG
if
(
atomI
==
targetAtom
||
targetAtom
==
(
y
+
j
)
){
if
(
atomI
==
targetAtom
||
targetAtom
==
(
y
+
j
)
){
...
@@ -234,7 +234,7 @@ if( atomI == targetAtom || targetAtom == (y+j) ){
...
@@ -234,7 +234,7 @@ if( atomI == targetAtom || targetAtom == (y+j) ){
getMaskedPScaleFactor
(
jIdx
,
pScaleMask
,
&
pScaleValue
);
getMaskedPScaleFactor
(
jIdx
,
pScaleMask
,
&
pScaleValue
);
}
}
float
ijField
[
4
][
3
];
float
4
ijField
[
3
];
calculateFixedFieldRealSpacePairIxn_kernel
(
localParticle
,
psA
[
jIdx
],
dScaleValue
,
pScaleValue
,
ijField
calculateFixedFieldRealSpacePairIxn_kernel
(
localParticle
,
psA
[
jIdx
],
dScaleValue
,
pScaleValue
,
ijField
#ifdef AMOEBA_DEBUG
#ifdef AMOEBA_DEBUG
,
pullBack
,
pullBack
...
@@ -245,35 +245,35 @@ if( atomI == targetAtom || targetAtom == (y+j) ){
...
@@ -245,35 +245,35 @@ if( atomI == targetAtom || targetAtom == (y+j) ){
// 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
fieldSum
[
0
]
+=
outOfBounds
?
0
.
0
f
:
ijField
[
0
]
[
0
]
;
fieldSum
[
0
]
+=
outOfBounds
?
0
.
0
f
:
ijField
[
0
]
.
x
;
fieldSum
[
1
]
+=
outOfBounds
?
0
.
0
f
:
ijField
[
0
][
1
];
fieldSum
[
1
]
+=
outOfBounds
?
0
.
0
f
:
ijField
[
1
]
.
x
;
fieldSum
[
2
]
+=
outOfBounds
?
0
.
0
f
:
ijField
[
0
][
2
];
fieldSum
[
2
]
+=
outOfBounds
?
0
.
0
f
:
ijField
[
2
]
.
x
;
fieldPolarSum
[
0
]
+=
outOfBounds
?
0
.
0
f
:
ijField
[
2
][
0
];
fieldPolarSum
[
0
]
+=
outOfBounds
?
0
.
0
f
:
ijField
[
0
]
.
z
;
fieldPolarSum
[
1
]
+=
outOfBounds
?
0
.
0
f
:
ijField
[
2
][
1
];
fieldPolarSum
[
1
]
+=
outOfBounds
?
0
.
0
f
:
ijField
[
1
]
.
z
;
fieldPolarSum
[
2
]
+=
outOfBounds
?
0
.
0
f
:
ijField
[
2
]
[
2
]
;
fieldPolarSum
[
2
]
+=
outOfBounds
?
0
.
0
f
:
ijField
[
2
]
.
z
;
if
(
flags
==
0xFFFFFFFF
){
if
(
flags
==
0xFFFFFFFF
){
// add to field at atomJ the field due atomI's charge/dipole/quadrupole
// add to field at atomJ the field due atomI's charge/dipole/quadrupole
psA
[
jIdx
].
eField
[
0
]
+=
outOfBounds
?
0
.
0
f
:
ijField
[
1
][
0
];
psA
[
jIdx
].
eField
[
0
]
+=
outOfBounds
?
0
.
0
f
:
ijField
[
0
]
.
y
;
psA
[
jIdx
].
eField
[
1
]
+=
outOfBounds
?
0
.
0
f
:
ijField
[
1
]
[
1
]
;
psA
[
jIdx
].
eField
[
1
]
+=
outOfBounds
?
0
.
0
f
:
ijField
[
1
]
.
y
;
psA
[
jIdx
].
eField
[
2
]
+=
outOfBounds
?
0
.
0
f
:
ijField
[
1
][
2
];
psA
[
jIdx
].
eField
[
2
]
+=
outOfBounds
?
0
.
0
f
:
ijField
[
2
]
.
y
;
psA
[
jIdx
].
eFieldP
[
0
]
+=
outOfBounds
?
0
.
0
f
:
ijField
[
3
][
0
];
psA
[
jIdx
].
eFieldP
[
0
]
+=
outOfBounds
?
0
.
0
f
:
ijField
[
0
]
.
w
;
psA
[
jIdx
].
eFieldP
[
1
]
+=
outOfBounds
?
0
.
0
f
:
ijField
[
3
][
1
];
psA
[
jIdx
].
eFieldP
[
1
]
+=
outOfBounds
?
0
.
0
f
:
ijField
[
1
]
.
w
;
psA
[
jIdx
].
eFieldP
[
2
]
+=
outOfBounds
?
0
.
0
f
:
ijField
[
3
][
2
];
psA
[
jIdx
].
eFieldP
[
2
]
+=
outOfBounds
?
0
.
0
f
:
ijField
[
2
]
.
w
;
}
else
{
}
else
{
sA
[
threadIdx
.
x
].
tempBuffer
[
0
]
=
outOfBounds
?
0
.
0
f
:
ijField
[
1
][
0
];
sA
[
threadIdx
.
x
].
tempBuffer
[
0
]
=
outOfBounds
?
0
.
0
f
:
ijField
[
0
]
.
y
;
sA
[
threadIdx
.
x
].
tempBuffer
[
1
]
=
outOfBounds
?
0
.
0
f
:
ijField
[
1
]
[
1
]
;
sA
[
threadIdx
.
x
].
tempBuffer
[
1
]
=
outOfBounds
?
0
.
0
f
:
ijField
[
1
]
.
y
;
sA
[
threadIdx
.
x
].
tempBuffer
[
2
]
=
outOfBounds
?
0
.
0
f
:
ijField
[
1
][
2
];
sA
[
threadIdx
.
x
].
tempBuffer
[
2
]
=
outOfBounds
?
0
.
0
f
:
ijField
[
2
]
.
y
;
sA
[
threadIdx
.
x
].
tempBufferP
[
0
]
=
outOfBounds
?
0
.
0
f
:
ijField
[
3
][
0
];
sA
[
threadIdx
.
x
].
tempBufferP
[
0
]
=
outOfBounds
?
0
.
0
f
:
ijField
[
0
]
.
w
;
sA
[
threadIdx
.
x
].
tempBufferP
[
1
]
=
outOfBounds
?
0
.
0
f
:
ijField
[
3
][
1
];
sA
[
threadIdx
.
x
].
tempBufferP
[
1
]
=
outOfBounds
?
0
.
0
f
:
ijField
[
1
]
.
w
;
sA
[
threadIdx
.
x
].
tempBufferP
[
2
]
=
outOfBounds
?
0
.
0
f
:
ijField
[
3
][
2
];
sA
[
threadIdx
.
x
].
tempBufferP
[
2
]
=
outOfBounds
?
0
.
0
f
:
ijField
[
2
]
.
w
;
if
(
tgx
%
2
==
0
){
if
(
tgx
%
2
==
0
){
sumTempBuffer
(
sA
[
threadIdx
.
x
],
sA
[
threadIdx
.
x
+
1
]
);
sumTempBuffer
(
sA
[
threadIdx
.
x
],
sA
[
threadIdx
.
x
+
1
]
);
...
...
plugins/amoeba/platforms/cuda/src/kernels/kCalculateAmoebaCudaPmeMutualInducedField.cu
View file @
92a338cf
...
@@ -55,7 +55,7 @@ __device__ void sumTempBuffer( MutualInducedParticle& atomI, MutualInducedPartic
...
@@ -55,7 +55,7 @@ __device__ void sumTempBuffer( MutualInducedParticle& atomI, MutualInducedPartic
// file includes FixedFieldParticle struct definition/load/unload struct and body kernel for fixed E-field
// file includes FixedFieldParticle struct definition/load/unload struct and body kernel for fixed E-field
__device__
void
calculatePmeDirectMutualInducedFieldPairIxn_kernel
(
MutualInducedParticle
&
atomI
,
MutualInducedParticle
&
atomJ
,
__device__
void
calculatePmeDirectMutualInducedFieldPairIxn_kernel
(
MutualInducedParticle
&
atomI
,
MutualInducedParticle
&
atomJ
,
float
uscale
,
float
fields
[
4
][
3
]
float
uscale
,
float
4
fields
[
3
]
#ifdef AMOEBA_DEBUG
#ifdef AMOEBA_DEBUG
,
float4
*
pullBack
,
float4
*
pullBack
#endif
#endif
...
@@ -80,17 +80,16 @@ __device__ void calculatePmeDirectMutualInducedFieldPairIxn_kernel( MutualInduce
...
@@ -80,17 +80,16 @@ __device__ void calculatePmeDirectMutualInducedFieldPairIxn_kernel( MutualInduce
// calculate the error function damping terms
// calculate the error function damping terms
float
ralpha
=
cSim
.
alphaEwald
*
r
;
float
ralpha
=
cSim
.
alphaEwald
*
r
;
float
bn
[
3
];
bn
[
0
]
=
erfc
(
ralpha
)
/
r
;
float
bn0
=
erfc
(
ralpha
)
/
r
;
float
alsq2
=
2.0
f
*
cSim
.
alphaEwald
*
cSim
.
alphaEwald
;
float
alsq2
=
2.0
f
*
cSim
.
alphaEwald
*
cSim
.
alphaEwald
;
float
alsq2n
=
1.0
f
/
(
cAmoebaSim
.
sqrtPi
*
cSim
.
alphaEwald
);
float
alsq2n
=
1.0
f
/
(
cAmoebaSim
.
sqrtPi
*
cSim
.
alphaEwald
);
float
exp2a
=
exp
(
-
(
ralpha
*
ralpha
));
float
exp2a
=
exp
(
-
(
ralpha
*
ralpha
));
alsq2n
*=
alsq2
;
alsq2n
*=
alsq2
;
bn
[
1
]
=
(
bn
[
0
]
+
alsq2n
*
exp2a
)
/
r2
;
float
bn1
=
(
bn
0
+
alsq2n
*
exp2a
)
/
r2
;
alsq2n
*=
alsq2
;
alsq2n
*=
alsq2
;
bn
[
2
]
=
(
3.0
f
*
bn
[
1
]
+
alsq2n
*
exp2a
)
/
r2
;
float
bn2
=
(
3.0
f
*
bn
1
+
alsq2n
*
exp2a
)
/
r2
;
// compute the error function scaled and unscaled terms
// compute the error function scaled and unscaled terms
...
@@ -124,81 +123,76 @@ __device__ void calculatePmeDirectMutualInducedFieldPairIxn_kernel( MutualInduce
...
@@ -124,81 +123,76 @@ __device__ void calculatePmeDirectMutualInducedFieldPairIxn_kernel( MutualInduce
float
puir
=
atomI
.
inducedDipolePolar
[
0
]
*
xr
+
atomI
.
inducedDipolePolar
[
1
]
*
yr
+
atomI
.
inducedDipolePolar
[
2
]
*
zr
;
float
puir
=
atomI
.
inducedDipolePolar
[
0
]
*
xr
+
atomI
.
inducedDipolePolar
[
1
]
*
yr
+
atomI
.
inducedDipolePolar
[
2
]
*
zr
;
float
pukr
=
atomJ
.
inducedDipolePolar
[
0
]
*
xr
+
atomJ
.
inducedDipolePolar
[
1
]
*
yr
+
atomJ
.
inducedDipolePolar
[
2
]
*
zr
;
float
pukr
=
atomJ
.
inducedDipolePolar
[
0
]
*
xr
+
atomJ
.
inducedDipolePolar
[
1
]
*
yr
+
atomJ
.
inducedDipolePolar
[
2
]
*
zr
;
float
fimd
[
3
],
fkmd
[
3
];
bn1
*=
-
1.0
f
;
float
fimp
[
3
],
fkmp
[
3
];
float
fid
[
3
],
fkd
[
3
];
float
fip
[
3
],
fkp
[
3
];
bn
[
1
]
*=
-
1.0
f
;
float
fimd0
=
bn1
*
atomJ
.
inducedDipole
[
0
]
+
bn2
*
dukr
*
xr
;
float
fimd1
=
bn1
*
atomJ
.
inducedDipole
[
1
]
+
bn2
*
dukr
*
yr
;
float
fimd2
=
bn1
*
atomJ
.
inducedDipole
[
2
]
+
bn2
*
dukr
*
zr
;
f
imd
[
0
]
=
bn
[
1
]
*
atom
J
.
inducedDipole
[
0
]
+
bn
[
2
]
*
du
k
r
*
xr
;
f
loat
fkmd0
=
bn
1
*
atom
I
.
inducedDipole
[
0
]
+
bn
2
*
du
i
r
*
xr
;
f
imd
[
1
]
=
bn
[
1
]
*
atom
J
.
inducedDipole
[
1
]
+
bn
[
2
]
*
du
k
r
*
yr
;
f
loat
fkmd1
=
bn
1
*
atom
I
.
inducedDipole
[
1
]
+
bn
2
*
du
i
r
*
yr
;
f
imd
[
2
]
=
bn
[
1
]
*
atom
J
.
inducedDipole
[
2
]
+
bn
[
2
]
*
du
k
r
*
zr
;
f
loat
fkmd2
=
bn
1
*
atom
I
.
inducedDipole
[
2
]
+
bn
2
*
du
i
r
*
zr
;
f
kmd
[
0
]
=
bn
[
1
]
*
atom
I
.
inducedDipole
[
0
]
+
bn
[
2
]
*
dui
r
*
xr
;
f
loat
fimp0
=
bn
1
*
atom
J
.
inducedDipole
Polar
[
0
]
+
bn2
*
puk
r
*
xr
;
f
kmd
[
1
]
=
bn
[
1
]
*
atom
I
.
inducedDipole
[
1
]
+
bn
[
2
]
*
dui
r
*
yr
;
f
loat
fimp1
=
bn
1
*
atom
J
.
inducedDipole
Polar
[
1
]
+
bn2
*
puk
r
*
yr
;
f
kmd
[
2
]
=
bn
[
1
]
*
atom
I
.
inducedDipole
[
2
]
+
bn
[
2
]
*
dui
r
*
zr
;
f
loat
fimp2
=
bn
1
*
atom
J
.
inducedDipole
Polar
[
2
]
+
bn2
*
puk
r
*
zr
;
fimp
[
0
]
=
bn
[
1
]
*
atomJ
.
inducedDipolePolar
[
0
]
+
bn
[
2
]
*
pukr
*
xr
;
float
fkmp0
=
bn1
*
atomI
.
inducedDipolePolar
[
0
]
+
bn2
*
puir
*
xr
;
fimp
[
1
]
=
bn
[
1
]
*
atomJ
.
inducedDipolePolar
[
1
]
+
bn
[
2
]
*
pukr
*
yr
;
float
fkmp1
=
bn1
*
atomI
.
inducedDipolePolar
[
1
]
+
bn2
*
puir
*
yr
;
fimp
[
2
]
=
bn
[
1
]
*
atomJ
.
inducedDipolePolar
[
2
]
+
bn
[
2
]
*
pukr
*
zr
;
float
fkmp2
=
bn1
*
atomI
.
inducedDipolePolar
[
2
]
+
bn2
*
puir
*
zr
;
fkmp
[
0
]
=
bn
[
1
]
*
atomI
.
inducedDipolePolar
[
0
]
+
bn
[
2
]
*
puir
*
xr
;
fkmp
[
1
]
=
bn
[
1
]
*
atomI
.
inducedDipolePolar
[
1
]
+
bn
[
2
]
*
puir
*
yr
;
fkmp
[
2
]
=
bn
[
1
]
*
atomI
.
inducedDipolePolar
[
2
]
+
bn
[
2
]
*
puir
*
zr
;
rr3
*=
-
1.0
f
;;
rr3
*=
-
1.0
f
;;
f
id
[
0
]
=
rr3
*
atomJ
.
inducedDipole
[
0
]
+
rr5
*
dukr
*
xr
;
f
loat
fid0
=
rr3
*
atomJ
.
inducedDipole
[
0
]
+
rr5
*
dukr
*
xr
;
f
id
[
1
]
=
rr3
*
atomJ
.
inducedDipole
[
1
]
+
rr5
*
dukr
*
yr
;
f
loat
fid1
=
rr3
*
atomJ
.
inducedDipole
[
1
]
+
rr5
*
dukr
*
yr
;
f
id
[
2
]
=
rr3
*
atomJ
.
inducedDipole
[
2
]
+
rr5
*
dukr
*
zr
;
f
loat
fid2
=
rr3
*
atomJ
.
inducedDipole
[
2
]
+
rr5
*
dukr
*
zr
;
f
kd
[
0
]
=
rr3
*
atomI
.
inducedDipole
[
0
]
+
rr5
*
duir
*
xr
;
f
loat
fkd0
=
rr3
*
atomI
.
inducedDipole
[
0
]
+
rr5
*
duir
*
xr
;
f
kd
[
1
]
=
rr3
*
atomI
.
inducedDipole
[
1
]
+
rr5
*
duir
*
yr
;
f
loat
fkd1
=
rr3
*
atomI
.
inducedDipole
[
1
]
+
rr5
*
duir
*
yr
;
f
kd
[
2
]
=
rr3
*
atomI
.
inducedDipole
[
2
]
+
rr5
*
duir
*
zr
;
f
loat
fkd2
=
rr3
*
atomI
.
inducedDipole
[
2
]
+
rr5
*
duir
*
zr
;
f
ip
[
0
]
=
rr3
*
atomJ
.
inducedDipolePolar
[
0
]
+
rr5
*
pukr
*
xr
;
f
loat
fip0
=
rr3
*
atomJ
.
inducedDipolePolar
[
0
]
+
rr5
*
pukr
*
xr
;
f
ip
[
1
]
=
rr3
*
atomJ
.
inducedDipolePolar
[
1
]
+
rr5
*
pukr
*
yr
;
f
loat
fip1
=
rr3
*
atomJ
.
inducedDipolePolar
[
1
]
+
rr5
*
pukr
*
yr
;
f
ip
[
2
]
=
rr3
*
atomJ
.
inducedDipolePolar
[
2
]
+
rr5
*
pukr
*
zr
;
f
loat
fip2
=
rr3
*
atomJ
.
inducedDipolePolar
[
2
]
+
rr5
*
pukr
*
zr
;
f
kp
[
0
]
=
rr3
*
atomI
.
inducedDipolePolar
[
0
]
+
rr5
*
puir
*
xr
;
f
loat
fkp0
=
rr3
*
atomI
.
inducedDipolePolar
[
0
]
+
rr5
*
puir
*
xr
;
f
kp
[
1
]
=
rr3
*
atomI
.
inducedDipolePolar
[
1
]
+
rr5
*
puir
*
yr
;
f
loat
fkp1
=
rr3
*
atomI
.
inducedDipolePolar
[
1
]
+
rr5
*
puir
*
yr
;
f
kp
[
2
]
=
rr3
*
atomI
.
inducedDipolePolar
[
2
]
+
rr5
*
puir
*
zr
;
f
loat
fkp2
=
rr3
*
atomI
.
inducedDipolePolar
[
2
]
+
rr5
*
puir
*
zr
;
// increment the field at each site due to this interaction
// increment the field at each site due to this interaction
if
(
r2
<=
cSim
.
nonbondedCutoffSqr
){
if
(
r2
<=
cSim
.
nonbondedCutoffSqr
){
fields
[
0
]
[
0
]
=
fimd
[
0
]
-
fid
[
0
]
;
fields
[
0
]
.
x
=
fimd
0
-
fid
0
;
fields
[
1
][
0
]
=
fkmd
[
0
]
-
fkd
[
0
]
;
fields
[
0
]
.
y
=
fkmd
0
-
fkd
0
;
fields
[
2
][
0
]
=
fimp
[
0
]
-
fip
[
0
]
;
fields
[
0
]
.
z
=
fimp
0
-
fip
0
;
fields
[
3
][
0
]
=
fkmp
[
0
]
-
fkp
[
0
]
;
fields
[
0
]
.
w
=
fkmp
0
-
fkp
0
;
fields
[
0
][
1
]
=
fimd
[
1
]
-
fid
[
1
]
;
fields
[
1
]
.
x
=
fimd
1
-
fid
1
;
fields
[
1
]
[
1
]
=
fkmd
[
1
]
-
fkd
[
1
]
;
fields
[
1
]
.
y
=
fkmd
1
-
fkd
1
;
fields
[
2
][
1
]
=
fimp
[
1
]
-
fip
[
1
]
;
fields
[
1
]
.
z
=
fimp
1
-
fip
1
;
fields
[
3
][
1
]
=
fkmp
[
1
]
-
fkp
[
1
]
;
fields
[
1
]
.
w
=
fkmp
1
-
fkp
1
;
fields
[
0
][
2
]
=
fimd
[
2
]
-
fid
[
2
]
;
fields
[
2
]
.
x
=
fimd
2
-
fid
2
;
fields
[
1
][
2
]
=
fkmd
[
2
]
-
fkd
[
2
]
;
fields
[
2
]
.
y
=
fkmd
2
-
fkd
2
;
fields
[
2
]
[
2
]
=
fimp
[
2
]
-
fip
[
2
]
;
fields
[
2
]
.
z
=
fimp
2
-
fip
2
;
fields
[
3
][
2
]
=
fkmp
[
2
]
-
fkp
[
2
]
;
fields
[
2
]
.
w
=
fkmp
2
-
fkp
2
;
}
else
{
}
else
{
fields
[
0
]
[
0
]
=
0.0
f
;
fields
[
0
]
.
x
=
0.0
f
;
fields
[
1
][
0
]
=
0.0
f
;
fields
[
0
]
.
y
=
0.0
f
;
fields
[
2
][
0
]
=
0.0
f
;
fields
[
0
]
.
z
=
0.0
f
;
fields
[
3
][
0
]
=
0.0
f
;
fields
[
0
]
.
w
=
0.0
f
;
fields
[
0
][
1
]
=
0.0
f
;
fields
[
1
]
.
x
=
0.0
f
;
fields
[
1
]
[
1
]
=
0.0
f
;
fields
[
1
]
.
y
=
0.0
f
;
fields
[
2
][
1
]
=
0.0
f
;
fields
[
1
]
.
z
=
0.0
f
;
fields
[
3
][
1
]
=
0.0
f
;
fields
[
1
]
.
w
=
0.0
f
;
fields
[
0
][
2
]
=
0.0
f
;
fields
[
2
]
.
x
=
0.0
f
;
fields
[
1
][
2
]
=
0.0
f
;
fields
[
2
]
.
y
=
0.0
f
;
fields
[
2
]
[
2
]
=
0.0
f
;
fields
[
2
]
.
z
=
0.0
f
;
fields
[
3
][
2
]
=
0.0
f
;
fields
[
2
]
.
w
=
0.0
f
;
}
}
#ifdef AMOEBA_DEBUG
#ifdef AMOEBA_DEBUG
pullBack
[
0
].
x
=
xr
;
pullBack
[
0
].
x
=
xr
;
...
@@ -207,8 +201,8 @@ __device__ void calculatePmeDirectMutualInducedFieldPairIxn_kernel( MutualInduce
...
@@ -207,8 +201,8 @@ __device__ void calculatePmeDirectMutualInducedFieldPairIxn_kernel( MutualInduce
pullBack
[
0
].
w
=
r2
;
pullBack
[
0
].
w
=
r2
;
pullBack
[
1
].
x
=
alsq2
;
pullBack
[
1
].
x
=
alsq2
;
pullBack
[
1
].
y
=
bn
[
0
]
;
pullBack
[
1
].
y
=
bn
0
;
pullBack
[
1
].
z
=
bn
[
2
]
;
pullBack
[
1
].
z
=
bn
2
;
pullBack
[
1
].
w
=
exp2a
;
pullBack
[
1
].
w
=
exp2a
;
/*
/*
...
...
plugins/amoeba/platforms/cuda/src/kernels/kCalculateAmoebaCudaPmeMutualInducedField.h
View file @
92a338cf
...
@@ -100,7 +100,7 @@ void METHOD_NAME(kCalculateAmoebaPmeMutualInducedField, _kernel)(
...
@@ -100,7 +100,7 @@ void METHOD_NAME(kCalculateAmoebaPmeMutualInducedField, _kernel)(
for
(
unsigned
int
j
=
0
;
j
<
GRID
;
j
++
)
for
(
unsigned
int
j
=
0
;
j
<
GRID
;
j
++
)
{
{
float
ijField
[
4
][
3
];
float
4
ijField
[
3
];
// load coords, charge, ...
// load coords, charge, ...
...
@@ -114,13 +114,13 @@ void METHOD_NAME(kCalculateAmoebaPmeMutualInducedField, _kernel)(
...
@@ -114,13 +114,13 @@ void METHOD_NAME(kCalculateAmoebaPmeMutualInducedField, _kernel)(
// add to field at atomI the field due atomJ's dipole
// add to field at atomI the field due atomJ's dipole
fieldSum
[
0
]
+=
mask
?
ijField
[
0
]
[
0
]
:
0
.
0
f
;
fieldSum
[
0
]
+=
mask
?
ijField
[
0
]
.
x
:
0
.
0
f
;
fieldSum
[
1
]
+=
mask
?
ijField
[
0
][
1
]
:
0
.
0
f
;
fieldSum
[
1
]
+=
mask
?
ijField
[
1
]
.
x
:
0
.
0
f
;
fieldSum
[
2
]
+=
mask
?
ijField
[
0
][
2
]
:
0
.
0
f
;
fieldSum
[
2
]
+=
mask
?
ijField
[
2
]
.
x
:
0
.
0
f
;
fieldPolarSum
[
0
]
+=
mask
?
ijField
[
2
][
0
]
:
0
.
0
f
;
fieldPolarSum
[
0
]
+=
mask
?
ijField
[
0
]
.
z
:
0
.
0
f
;
fieldPolarSum
[
1
]
+=
mask
?
ijField
[
2
][
1
]
:
0
.
0
f
;
fieldPolarSum
[
1
]
+=
mask
?
ijField
[
1
]
.
z
:
0
.
0
f
;
fieldPolarSum
[
2
]
+=
mask
?
ijField
[
2
]
[
2
]
:
0
.
0
f
;
fieldPolarSum
[
2
]
+=
mask
?
ijField
[
2
]
.
z
:
0
.
0
f
;
#ifdef AMOEBA_DEBUG
#ifdef AMOEBA_DEBUG
if
(
atomI
==
targetAtom
||
(
y
+
j
)
==
targetAtom
){
if
(
atomI
==
targetAtom
||
(
y
+
j
)
==
targetAtom
){
...
@@ -233,7 +233,7 @@ if( atomI == targetAtom || (y+j) == targetAtom ){
...
@@ -233,7 +233,7 @@ if( atomI == targetAtom || (y+j) == targetAtom ){
{
{
unsigned
int
jIdx
=
(
flags
==
0xFFFFFFFF
)
?
tj
:
j
;
unsigned
int
jIdx
=
(
flags
==
0xFFFFFFFF
)
?
tj
:
j
;
float
ijField
[
4
][
3
];
float
4
ijField
[
3
];
// load coords, charge, ...
// load coords, charge, ...
...
@@ -247,39 +247,39 @@ if( atomI == targetAtom || (y+j) == targetAtom ){
...
@@ -247,39 +247,39 @@ if( atomI == targetAtom || (y+j) == targetAtom ){
// add to field at atomI the field due atomJ's dipole
// add to field at atomI the field due atomJ's dipole
fieldSum
[
0
]
+=
mask
?
ijField
[
0
]
[
0
]
:
0
.
0
f
;
fieldSum
[
0
]
+=
mask
?
ijField
[
0
]
.
x
:
0
.
0
f
;
fieldSum
[
1
]
+=
mask
?
ijField
[
0
][
1
]
:
0
.
0
f
;
fieldSum
[
1
]
+=
mask
?
ijField
[
1
]
.
x
:
0
.
0
f
;
fieldSum
[
2
]
+=
mask
?
ijField
[
0
][
2
]
:
0
.
0
f
;
fieldSum
[
2
]
+=
mask
?
ijField
[
2
]
.
x
:
0
.
0
f
;
// add to polar field at atomI the field due atomJ's dipole
// add to polar field at atomI the field due atomJ's dipole
fieldPolarSum
[
0
]
+=
mask
?
ijField
[
2
][
0
]
:
0
.
0
f
;
fieldPolarSum
[
0
]
+=
mask
?
ijField
[
0
]
.
z
:
0
.
0
f
;
fieldPolarSum
[
1
]
+=
mask
?
ijField
[
2
][
1
]
:
0
.
0
f
;
fieldPolarSum
[
1
]
+=
mask
?
ijField
[
1
]
.
z
:
0
.
0
f
;
fieldPolarSum
[
2
]
+=
mask
?
ijField
[
2
]
[
2
]
:
0
.
0
f
;
fieldPolarSum
[
2
]
+=
mask
?
ijField
[
2
]
.
z
:
0
.
0
f
;
// add to field at atomJ the field due atomI's dipole
// add to field at atomJ the field due atomI's dipole
if
(
flags
==
0xFFFFFFFF
){
if
(
flags
==
0xFFFFFFFF
){
psA
[
jIdx
].
field
[
0
]
+=
mask
?
ijField
[
1
][
0
]
:
0
.
0
f
;
psA
[
jIdx
].
field
[
0
]
+=
mask
?
ijField
[
0
]
.
y
:
0
.
0
f
;
psA
[
jIdx
].
field
[
1
]
+=
mask
?
ijField
[
1
]
[
1
]
:
0
.
0
f
;
psA
[
jIdx
].
field
[
1
]
+=
mask
?
ijField
[
1
]
.
y
:
0
.
0
f
;
psA
[
jIdx
].
field
[
2
]
+=
mask
?
ijField
[
1
][
2
]
:
0
.
0
f
;
psA
[
jIdx
].
field
[
2
]
+=
mask
?
ijField
[
2
]
.
y
:
0
.
0
f
;
// add to polar field at atomJ the field due atomI's dipole
// add to polar field at atomJ the field due atomI's dipole
psA
[
jIdx
].
fieldPolar
[
0
]
+=
mask
?
ijField
[
3
][
0
]
:
0
.
0
f
;
psA
[
jIdx
].
fieldPolar
[
0
]
+=
mask
?
ijField
[
0
]
.
w
:
0
.
0
f
;
psA
[
jIdx
].
fieldPolar
[
1
]
+=
mask
?
ijField
[
3
][
1
]
:
0
.
0
f
;
psA
[
jIdx
].
fieldPolar
[
1
]
+=
mask
?
ijField
[
1
]
.
w
:
0
.
0
f
;
psA
[
jIdx
].
fieldPolar
[
2
]
+=
mask
?
ijField
[
3
][
2
]
:
0
.
0
f
;
psA
[
jIdx
].
fieldPolar
[
2
]
+=
mask
?
ijField
[
2
]
.
w
:
0
.
0
f
;
}
else
{
}
else
{
sA
[
threadIdx
.
x
].
tempBuffer
[
0
]
=
mask
?
0
.
0
f
:
ijField
[
1
][
0
];
sA
[
threadIdx
.
x
].
tempBuffer
[
0
]
=
mask
?
0
.
0
f
:
ijField
[
0
]
.
y
;
sA
[
threadIdx
.
x
].
tempBuffer
[
1
]
=
mask
?
0
.
0
f
:
ijField
[
1
]
[
1
]
;
sA
[
threadIdx
.
x
].
tempBuffer
[
1
]
=
mask
?
0
.
0
f
:
ijField
[
1
]
.
y
;
sA
[
threadIdx
.
x
].
tempBuffer
[
2
]
=
mask
?
0
.
0
f
:
ijField
[
1
][
2
];
sA
[
threadIdx
.
x
].
tempBuffer
[
2
]
=
mask
?
0
.
0
f
:
ijField
[
2
]
.
y
;
sA
[
threadIdx
.
x
].
tempBufferP
[
0
]
=
mask
?
0
.
0
f
:
ijField
[
3
][
0
];
sA
[
threadIdx
.
x
].
tempBufferP
[
0
]
=
mask
?
0
.
0
f
:
ijField
[
0
]
.
w
;
sA
[
threadIdx
.
x
].
tempBufferP
[
1
]
=
mask
?
0
.
0
f
:
ijField
[
3
][
1
];
sA
[
threadIdx
.
x
].
tempBufferP
[
1
]
=
mask
?
0
.
0
f
:
ijField
[
1
]
.
w
;
sA
[
threadIdx
.
x
].
tempBufferP
[
2
]
=
mask
?
0
.
0
f
:
ijField
[
3
][
2
];
sA
[
threadIdx
.
x
].
tempBufferP
[
2
]
=
mask
?
0
.
0
f
:
ijField
[
2
]
.
w
;
if
(
tgx
%
2
==
0
){
if
(
tgx
%
2
==
0
){
sumTempBuffer
(
sA
[
threadIdx
.
x
],
sA
[
threadIdx
.
x
+
1
]
);
sumTempBuffer
(
sA
[
threadIdx
.
x
],
sA
[
threadIdx
.
x
+
1
]
);
...
...
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