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
454eda76
Commit
454eda76
authored
Jan 14, 2016
by
Saurabh Belsare
Browse files
Added required headers. Still need to actually implement the functions
parent
ad966d1c
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
274 additions
and
269 deletions
+274
-269
plugins/amoeba/openmmapi/include/openmm/AmoebaMultipoleForce.h
...ns/amoeba/openmmapi/include/openmm/AmoebaMultipoleForce.h
+7
-9
plugins/amoeba/openmmapi/include/openmm/amoebaKernels.h
plugins/amoeba/openmmapi/include/openmm/amoebaKernels.h
+13
-12
plugins/amoeba/openmmapi/include/openmm/internal/AmoebaMultipoleForceImpl.h
...nmmapi/include/openmm/internal/AmoebaMultipoleForceImpl.h
+4
-6
plugins/amoeba/openmmapi/src/AmoebaMultipoleForce.cpp
plugins/amoeba/openmmapi/src/AmoebaMultipoleForce.cpp
+25
-21
plugins/amoeba/openmmapi/src/AmoebaMultipoleForceImpl.cpp
plugins/amoeba/openmmapi/src/AmoebaMultipoleForceImpl.cpp
+7
-3
plugins/amoeba/platforms/reference/src/SimTKReference/AmoebaReferenceMultipoleForce.cpp
...ence/src/SimTKReference/AmoebaReferenceMultipoleForce.cpp
+218
-218
No files found.
plugins/amoeba/openmmapi/include/openmm/AmoebaMultipoleForce.h
View file @
454eda76
...
...
@@ -316,15 +316,6 @@ public:
* This can be overridden by explicitly setting an alpha parameter and grid dimensions to use.
*/
void
setEwaldErrorTolerance
(
double
tol
);
/**
* Get the induced dipole moments of all particles.
*
* @param context the Context for which to get the induced dipoles
* @param[out] dipoles the induced dipole moment of particle i is stored into the i'th element
*/
void
getInducedDipoles
(
Context
&
context
,
std
::
vector
<
Vec3
>&
dipoles
);
/**
* Get the fixed dipole moments of all particles in the global reference frame.
*
...
...
@@ -332,6 +323,13 @@ public:
* @param[out] dipoles the fixed dipole moment of particle i is stored into the i'th element
*/
void
getLabFramePermanentDipoles
(
Context
&
context
,
std
::
vector
<
Vec3
>&
dipoles
);
/**
* Get the induced dipole moments of all particles.
*
* @param context the Context for which to get the induced dipoles
* @param[out] dipoles the induced dipole moment of particle i is stored into the i'th element
*/
void
getInducedDipoles
(
Context
&
context
,
std
::
vector
<
Vec3
>&
dipoles
);
/**
* Get the electrostatic potential.
...
...
plugins/amoeba/openmmapi/include/openmm/amoebaKernels.h
View file @
454eda76
...
...
@@ -59,7 +59,7 @@ public:
/**
* Initialize the kernel.
*
*
* @param system the System this kernel will be applied to
* @param force the AmoebaBondForce this kernel will be used for
*/
...
...
@@ -99,7 +99,7 @@ public:
/**
* Initialize the kernel.
*
*
* @param system the System this kernel will be applied to
* @param force the AmoebaAngleForce this kernel will be used for
*/
...
...
@@ -139,7 +139,7 @@ public:
/**
* Initialize the kernel.
*
*
* @param system the System this kernel will be applied to
* @param force the AmoebaInPlaneAngleForce this kernel will be used for
*/
...
...
@@ -179,7 +179,7 @@ public:
/**
* Initialize the kernel.
*
*
* @param system the System this kernel will be applied to
* @param force the PiTorsionForce this kernel will be used for
*/
...
...
@@ -219,7 +219,7 @@ public:
/**
* Initialize the kernel.
*
*
* @param system the System this kernel will be applied to
* @param force the StretchBendForce this kernel will be used for
*/
...
...
@@ -259,7 +259,7 @@ public:
/**
* Initialize the kernel.
*
*
* @param system the System this kernel will be applied to
* @param force the OutOfPlaneBendForce this kernel will be used for
*/
...
...
@@ -299,7 +299,7 @@ public:
/**
* Initialize the kernel.
*
*
* @param system the System this kernel will be applied to
* @param force the TorsionTorsionForce this kernel will be used for
*/
...
...
@@ -332,7 +332,7 @@ public:
/**
* Initialize the kernel.
*
*
* @param system the System this kernel will be applied to
* @param force the MultipoleForce this kernel will be used for
*/
...
...
@@ -348,6 +348,7 @@ public:
*/
virtual
double
execute
(
ContextImpl
&
context
,
bool
includeForces
,
bool
includeEnergy
)
=
0
;
virtual
void
getLabFramePermanentDipoles
(
ContextImpl
&
context
,
std
::
vector
<
Vec3
>&
dipoles
)
=
0
;
virtual
void
getInducedDipoles
(
ContextImpl
&
context
,
std
::
vector
<
Vec3
>&
dipoles
)
=
0
;
virtual
void
getElectrostaticPotential
(
ContextImpl
&
context
,
const
std
::
vector
<
Vec3
>&
inputGrid
,
...
...
@@ -364,7 +365,7 @@ public:
/**
* Get the parameters being used for PME.
*
*
* @param alpha the separation parameter
* @param nx the number of grid points along the X axis
* @param ny the number of grid points along the Y axis
...
...
@@ -389,7 +390,7 @@ public:
/**
* Initialize the kernel.
*
*
* @param system the System this kernel will be applied to
* @param force the GBSAOBCForce this kernel will be used for
*/
...
...
@@ -429,7 +430,7 @@ public:
/**
* Initialize the kernel.
*
*
* @param system the System this kernel will be applied to
* @param force the GBSAOBCForce this kernel will be used for
*/
...
...
@@ -469,7 +470,7 @@ public:
/**
* Initialize the kernel.
*
*
* @param system the System this kernel will be applied to
* @param force the GBSAOBCForce this kernel will be used for
*/
...
...
plugins/amoeba/openmmapi/include/openmm/internal/AmoebaMultipoleForceImpl.h
View file @
454eda76
...
...
@@ -64,7 +64,7 @@ public:
/**
* Get the CovalentMap for an atom
*
*
* @param force AmoebaMultipoleForce force reference
* @param index the index of the atom for which to set parameters
* @param minCovalentIndex minimum covalent index
...
...
@@ -76,15 +76,13 @@ public:
/**
* Get the covalent degree for the CovalentEnd lists
*
*
* @param force AmoebaMultipoleForce force reference
* @param covalentDegree covalent degrees for the CovalentEnd lists
*/
static
void
getCovalentDegree
(
const
AmoebaMultipoleForce
&
force
,
std
::
vector
<
int
>&
covalentDegree
);
void
getInducedDipoles
(
ContextImpl
&
context
,
std
::
vector
<
Vec3
>&
dipoles
);
void
getLabFramePermanentDipoles
(
ContextImpl
&
context
,
std
::
vector
<
Vec3
>&
dipoles
);
void
getInducedDipoles
(
ContextImpl
&
context
,
std
::
vector
<
Vec3
>&
dipoles
);
void
getElectrostaticPotential
(
ContextImpl
&
context
,
const
std
::
vector
<
Vec3
>&
inputGrid
,
std
::
vector
<
double
>&
outputElectrostaticPotential
);
...
...
@@ -92,7 +90,7 @@ public:
void
getSystemMultipoleMoments
(
ContextImpl
&
context
,
std
::
vector
<
double
>&
outputMultipoleMoments
);
void
updateParametersInContext
(
ContextImpl
&
context
);
void
getPMEParameters
(
double
&
alpha
,
int
&
nx
,
int
&
ny
,
int
&
nz
)
const
;
private:
const
AmoebaMultipoleForce
&
owner
;
...
...
plugins/amoeba/openmmapi/src/AmoebaMultipoleForce.cpp
View file @
454eda76
...
...
@@ -69,19 +69,19 @@ void AmoebaMultipoleForce::setCutoffDistance(double distance) {
cutoffDistance
=
distance
;
}
double
AmoebaMultipoleForce
::
getAEwald
()
const
{
return
aewald
;
}
void
AmoebaMultipoleForce
::
setAEwald
(
double
inputAewald
)
{
aewald
=
inputAewald
;
}
int
AmoebaMultipoleForce
::
getPmeBSplineOrder
()
const
{
return
pmeBSplineOrder
;
}
void
AmoebaMultipoleForce
::
getPmeGridDimensions
(
std
::
vector
<
int
>&
gridDimension
)
const
{
double
AmoebaMultipoleForce
::
getAEwald
()
const
{
return
aewald
;
}
void
AmoebaMultipoleForce
::
setAEwald
(
double
inputAewald
)
{
aewald
=
inputAewald
;
}
int
AmoebaMultipoleForce
::
getPmeBSplineOrder
()
const
{
return
pmeBSplineOrder
;
}
void
AmoebaMultipoleForce
::
getPmeGridDimensions
(
std
::
vector
<
int
>&
gridDimension
)
const
{
if
(
gridDimension
.
size
()
<
3
)
{
gridDimension
.
resize
(
3
);
}
...
...
@@ -93,15 +93,15 @@ void AmoebaMultipoleForce::getPmeGridDimensions(std::vector<int>& gridDimension)
gridDimension
[
0
]
=
gridDimension
[
1
]
=
gridDimension
[
2
]
=
0
;
}
return
;
}
}
void
AmoebaMultipoleForce
::
setPmeGridDimensions
(
const
std
::
vector
<
int
>&
gridDimension
)
{
pmeGridDimension
.
resize
(
3
);
pmeGridDimension
[
0
]
=
gridDimension
[
0
];
pmeGridDimension
[
1
]
=
gridDimension
[
1
];
pmeGridDimension
[
2
]
=
gridDimension
[
2
];
return
;
}
}
void
AmoebaMultipoleForce
::
getPMEParametersInContext
(
const
Context
&
context
,
double
&
alpha
,
int
&
nx
,
int
&
ny
,
int
&
nz
)
const
{
dynamic_cast
<
const
AmoebaMultipoleForceImpl
&>
(
getImplInContext
(
context
)).
getPMEParameters
(
alpha
,
nx
,
ny
,
nz
);
...
...
@@ -131,13 +131,13 @@ void AmoebaMultipoleForce::setEwaldErrorTolerance(double tol) {
ewaldErrorTol
=
tol
;
}
int
AmoebaMultipoleForce
::
addMultipole
(
double
charge
,
const
std
::
vector
<
double
>&
molecularDipole
,
const
std
::
vector
<
double
>&
molecularQuadrupole
,
int
axisType
,
int
AmoebaMultipoleForce
::
addMultipole
(
double
charge
,
const
std
::
vector
<
double
>&
molecularDipole
,
const
std
::
vector
<
double
>&
molecularQuadrupole
,
int
axisType
,
int
multipoleAtomZ
,
int
multipoleAtomX
,
int
multipoleAtomY
,
double
thole
,
double
dampingFactor
,
double
polarity
)
{
multipoles
.
push_back
(
MultipoleInfo
(
charge
,
molecularDipole
,
molecularQuadrupole
,
axisType
,
multipoleAtomZ
,
multipoleAtomX
,
multipoleAtomY
,
thole
,
dampingFactor
,
polarity
));
return
multipoles
.
size
()
-
1
;
}
void
AmoebaMultipoleForce
::
getMultipoleParameters
(
int
index
,
double
&
charge
,
std
::
vector
<
double
>&
molecularDipole
,
std
::
vector
<
double
>&
molecularQuadrupole
,
void
AmoebaMultipoleForce
::
getMultipoleParameters
(
int
index
,
double
&
charge
,
std
::
vector
<
double
>&
molecularDipole
,
std
::
vector
<
double
>&
molecularQuadrupole
,
int
&
axisType
,
int
&
multipoleAtomZ
,
int
&
multipoleAtomX
,
int
&
multipoleAtomY
,
double
&
thole
,
double
&
dampingFactor
,
double
&
polarity
)
const
{
charge
=
multipoles
[
index
].
charge
;
...
...
@@ -167,7 +167,7 @@ void AmoebaMultipoleForce::getMultipoleParameters(int index, double& charge, std
polarity
=
multipoles
[
index
].
polarity
;
}
void
AmoebaMultipoleForce
::
setMultipoleParameters
(
int
index
,
double
charge
,
const
std
::
vector
<
double
>&
molecularDipole
,
const
std
::
vector
<
double
>&
molecularQuadrupole
,
void
AmoebaMultipoleForce
::
setMultipoleParameters
(
int
index
,
double
charge
,
const
std
::
vector
<
double
>&
molecularDipole
,
const
std
::
vector
<
double
>&
molecularQuadrupole
,
int
axisType
,
int
multipoleAtomZ
,
int
multipoleAtomX
,
int
multipoleAtomY
,
double
thole
,
double
dampingFactor
,
double
polarity
)
{
multipoles
[
index
].
charge
=
charge
;
...
...
@@ -230,8 +230,12 @@ void AmoebaMultipoleForce::getCovalentMaps(int index, std::vector< std::vector<i
}
}
void
AmoebaMultipoleForce
::
getInducedDipoles
(
Context
&
context
,
vector
<
Vec3
>&
dipoles
)
{
dynamic_cast
<
AmoebaMultipoleForceImpl
&>
(
getImplInContext
(
context
)).
getInducedDipoles
(
getContextImpl
(
context
),
dipoles
);
void
AmoebaMultipoleForce
::
getLabFramePermanentDipoles
(
Context
&
context
,
vector
<
Vec3
>&
dipoles
)
{
dynamic_cast
<
AmoebaMultipoleForceImpl
&>
(
getImplInContext
(
context
)).
getLabFramePermanentDipoles
(
getContextImpl
(
context
),
dipoles
);
}
void
AmoebaMultipoleForce
::
getLabFramePermanentDipoles
(
Context
&
context
,
vector
<
Vec3
>&
dipoles
)
{
dynamic_cast
<
AmoebaMultipoleForceImpl
&>
(
getImplInContext
(
context
)).
getLabFramePermanentDipoles
(
getContextImpl
(
context
),
dipoles
);
}
void
AmoebaMultipoleForce
::
getElectrostaticPotential
(
const
std
::
vector
<
Vec3
>&
inputGrid
,
Context
&
context
,
std
::
vector
<
double
>&
outputElectrostaticPotential
)
{
...
...
plugins/amoeba/openmmapi/src/AmoebaMultipoleForceImpl.cpp
View file @
454eda76
...
...
@@ -61,7 +61,7 @@ void AmoebaMultipoleForceImpl::initialize(ContextImpl& context) {
double
cutoff
=
owner
.
getCutoffDistance
();
if
(
cutoff
>
0.5
*
boxVectors
[
0
][
0
]
||
cutoff
>
0.5
*
boxVectors
[
1
][
1
]
||
cutoff
>
0.5
*
boxVectors
[
2
][
2
])
throw
OpenMMException
(
"AmoebaMultipoleForce: The cutoff distance cannot be greater than half the periodic box size."
);
}
}
double
quadrupoleValidationTolerance
=
1.0e-05
;
for
(
int
ii
=
0
;
ii
<
system
.
getNumParticles
();
ii
++
)
{
...
...
@@ -170,7 +170,7 @@ void AmoebaMultipoleForceImpl::getCovalentRange(const AmoebaMultipoleForce& forc
*
maxCovalentIndex
=
covalentList
[
ii
];
}
}
}
}
return
;
}
...
...
@@ -179,10 +179,14 @@ void AmoebaMultipoleForceImpl::getCovalentDegree(const AmoebaMultipoleForce& for
const
int
*
CovalentDegrees
=
AmoebaMultipoleForceImpl
::
getCovalentDegrees
();
for
(
unsigned
int
kk
=
0
;
kk
<
AmoebaMultipoleForce
::
CovalentEnd
;
kk
++
)
{
covalentDegree
[
kk
]
=
CovalentDegrees
[
kk
];
}
}
return
;
}
void
AmoebaMultipoleForceImpl
::
getLabFramePermanentDipoles
(
ContextImpl
&
context
,
vector
<
Vec3
>&
dipoles
)
{
kernel
.
getAs
<
CalcAmoebaMultipoleForceKernel
>
().
getLabFramePermanentDipoles
(
context
,
dipoles
);
}
void
AmoebaMultipoleForceImpl
::
getInducedDipoles
(
ContextImpl
&
context
,
vector
<
Vec3
>&
dipoles
)
{
kernel
.
getAs
<
CalcAmoebaMultipoleForceKernel
>
().
getInducedDipoles
(
context
,
dipoles
);
}
...
...
plugins/amoeba/platforms/reference/src/SimTKReference/AmoebaReferenceMultipoleForce.cpp
View file @
454eda76
...
...
@@ -35,7 +35,7 @@ using namespace OpenMM;
AmoebaReferenceMultipoleForce
::
AmoebaReferenceMultipoleForce
()
:
_nonbondedMethod
(
NoCutoff
),
_numParticles
(
0
),
_numParticles
(
0
),
_electric
(
138.9354558456
),
_dielectric
(
1.0
),
_mutualInducedDipoleConverged
(
0
),
...
...
@@ -51,7 +51,7 @@ AmoebaReferenceMultipoleForce::AmoebaReferenceMultipoleForce() :
AmoebaReferenceMultipoleForce
::
AmoebaReferenceMultipoleForce
(
NonbondedMethod
nonbondedMethod
)
:
_nonbondedMethod
(
nonbondedMethod
),
_numParticles
(
0
),
_numParticles
(
0
),
_electric
(
138.9354558456
),
_dielectric
(
1.0
),
_mutualInducedDipoleConverged
(
0
),
...
...
@@ -97,7 +97,7 @@ void AmoebaReferenceMultipoleForce::initialize()
_uScale
[
index
++
]
=
1.0
;
}
AmoebaReferenceMultipoleForce
::
NonbondedMethod
AmoebaReferenceMultipoleForce
::
getNonbondedMethod
()
const
AmoebaReferenceMultipoleForce
::
NonbondedMethod
AmoebaReferenceMultipoleForce
::
getNonbondedMethod
()
const
{
return
_nonbondedMethod
;
}
...
...
@@ -107,7 +107,7 @@ void AmoebaReferenceMultipoleForce::setNonbondedMethod(AmoebaReferenceMultipoleF
_nonbondedMethod
=
nonbondedMethod
;
}
AmoebaReferenceMultipoleForce
::
PolarizationType
AmoebaReferenceMultipoleForce
::
getPolarizationType
()
const
AmoebaReferenceMultipoleForce
::
PolarizationType
AmoebaReferenceMultipoleForce
::
getPolarizationType
()
const
{
return
_polarizationType
;
}
...
...
@@ -117,7 +117,7 @@ void AmoebaReferenceMultipoleForce::setPolarizationType(AmoebaReferenceMultipole
_polarizationType
=
polarizationType
;
}
int
AmoebaReferenceMultipoleForce
::
getMutualInducedDipoleConverged
()
const
int
AmoebaReferenceMultipoleForce
::
getMutualInducedDipoleConverged
()
const
{
return
_mutualInducedDipoleConverged
;
}
...
...
@@ -127,7 +127,7 @@ void AmoebaReferenceMultipoleForce::setMutualInducedDipoleConverged(int mutualIn
_mutualInducedDipoleConverged
=
mutualInducedDipoleConverged
;
}
int
AmoebaReferenceMultipoleForce
::
getMutualInducedDipoleIterations
()
const
int
AmoebaReferenceMultipoleForce
::
getMutualInducedDipoleIterations
()
const
{
return
_mutualInducedDipoleIterations
;
}
...
...
@@ -137,7 +137,7 @@ void AmoebaReferenceMultipoleForce::setMutualInducedDipoleIterations(int mutualI
_mutualInducedDipoleIterations
=
mutualInducedDipoleIterations
;
}
RealOpenMM
AmoebaReferenceMultipoleForce
::
getMutualInducedDipoleEpsilon
()
const
RealOpenMM
AmoebaReferenceMultipoleForce
::
getMutualInducedDipoleEpsilon
()
const
{
return
_mutualInducedDipoleEpsilon
;
}
...
...
@@ -147,7 +147,7 @@ void AmoebaReferenceMultipoleForce::setMutualInducedDipoleEpsilon(RealOpenMM mut
_mutualInducedDipoleEpsilon
=
mutualInducedDipoleEpsilon
;
}
int
AmoebaReferenceMultipoleForce
::
getMaximumMutualInducedDipoleIterations
()
const
int
AmoebaReferenceMultipoleForce
::
getMaximumMutualInducedDipoleIterations
()
const
{
return
_maximumMutualInducedDipoleIterations
;
}
...
...
@@ -157,7 +157,7 @@ void AmoebaReferenceMultipoleForce::setMaximumMutualInducedDipoleIterations(int
_maximumMutualInducedDipoleIterations
=
maximumMutualInducedDipoleIterations
;
}
RealOpenMM
AmoebaReferenceMultipoleForce
::
getMutualInducedDipoleTargetEpsilon
()
const
RealOpenMM
AmoebaReferenceMultipoleForce
::
getMutualInducedDipoleTargetEpsilon
()
const
{
return
_mutualInducedDipoleTargetEpsilon
;
}
...
...
@@ -172,7 +172,7 @@ void AmoebaReferenceMultipoleForce::setupScaleMaps(const vector< vector< vector<
/* Setup for scaling maps:
*
* _scaleMaps[particleIndex][ScaleType] = map, where map[covalentIndex] = scaleFactor
* _scaleMaps[particleIndex][ScaleType] = map, where map[covalentIndex] = scaleFactor
* _maxScaleIndex[particleIndex] = max covalent index for particleIndex
*
* multipoleParticleCovalentInfo[ii][jj], jj =0,1,2,3 contains covalent indices (c12, c13, c14, c15)
...
...
@@ -208,8 +208,8 @@ void AmoebaReferenceMultipoleForce::setupScaleMaps(const vector< vector< vector<
hit
=
1
;
}
}
}
}
_scaleMaps
[
ii
][
P_SCALE
][
covalentIndex
]
=
hit
?
0.5
*
_pScale
[
jj
+
1
]
:
_pScale
[
jj
+
1
];
_scaleMaps
[
ii
][
M_SCALE
][
covalentIndex
]
=
_mScale
[
jj
+
1
];
_maxScaleIndex
[
ii
]
=
_maxScaleIndex
[
ii
]
<
covalentIndex
?
covalentIndex
:
_maxScaleIndex
[
ii
];
...
...
@@ -231,7 +231,7 @@ void AmoebaReferenceMultipoleForce::setupScaleMaps(const vector< vector< vector<
}
}
RealOpenMM
AmoebaReferenceMultipoleForce
::
getMultipoleScaleFactor
(
unsigned
int
particleI
,
unsigned
int
particleJ
,
ScaleType
scaleType
)
const
RealOpenMM
AmoebaReferenceMultipoleForce
::
getMultipoleScaleFactor
(
unsigned
int
particleI
,
unsigned
int
particleJ
,
ScaleType
scaleType
)
const
{
MapIntRealOpenMM
scaleMap
=
_scaleMaps
[
particleI
][
scaleType
];
...
...
@@ -243,13 +243,13 @@ RealOpenMM AmoebaReferenceMultipoleForce::getMultipoleScaleFactor(unsigned int p
}
}
void
AmoebaReferenceMultipoleForce
::
getDScaleAndPScale
(
unsigned
int
particleI
,
unsigned
int
particleJ
,
RealOpenMM
&
dScale
,
RealOpenMM
&
pScale
)
const
void
AmoebaReferenceMultipoleForce
::
getDScaleAndPScale
(
unsigned
int
particleI
,
unsigned
int
particleJ
,
RealOpenMM
&
dScale
,
RealOpenMM
&
pScale
)
const
{
dScale
=
getMultipoleScaleFactor
(
particleI
,
particleJ
,
D_SCALE
);
pScale
=
getMultipoleScaleFactor
(
particleI
,
particleJ
,
P_SCALE
);
}
void
AmoebaReferenceMultipoleForce
::
getMultipoleScaleFactors
(
unsigned
int
particleI
,
unsigned
int
particleJ
,
vector
<
RealOpenMM
>&
scaleFactors
)
const
void
AmoebaReferenceMultipoleForce
::
getMultipoleScaleFactors
(
unsigned
int
particleI
,
unsigned
int
particleJ
,
vector
<
RealOpenMM
>&
scaleFactors
)
const
{
scaleFactors
[
D_SCALE
]
=
getMultipoleScaleFactor
(
particleI
,
particleJ
,
D_SCALE
);
scaleFactors
[
P_SCALE
]
=
getMultipoleScaleFactor
(
particleI
,
particleJ
,
P_SCALE
);
...
...
@@ -257,7 +257,7 @@ void AmoebaReferenceMultipoleForce::getMultipoleScaleFactors(unsigned int partic
scaleFactors
[
U_SCALE
]
=
getMultipoleScaleFactor
(
particleI
,
particleJ
,
U_SCALE
);
}
RealOpenMM
AmoebaReferenceMultipoleForce
::
normalizeRealVec
(
RealVec
&
vectorToNormalize
)
const
RealOpenMM
AmoebaReferenceMultipoleForce
::
normalizeRealVec
(
RealVec
&
vectorToNormalize
)
const
{
RealOpenMM
norm
=
SQRT
(
vectorToNormalize
.
dot
(
vectorToNormalize
));
if
(
norm
>
0.0
)
{
...
...
@@ -266,26 +266,26 @@ RealOpenMM AmoebaReferenceMultipoleForce::normalizeRealVec(RealVec& vectorToNorm
return
norm
;
}
void
AmoebaReferenceMultipoleForce
::
initializeRealOpenMMVector
(
vector
<
RealOpenMM
>&
vectorToInitialize
)
const
void
AmoebaReferenceMultipoleForce
::
initializeRealOpenMMVector
(
vector
<
RealOpenMM
>&
vectorToInitialize
)
const
{
RealOpenMM
zero
=
0.0
;
vectorToInitialize
.
resize
(
_numParticles
);
std
::
fill
(
vectorToInitialize
.
begin
(),
vectorToInitialize
.
end
(),
zero
);
}
void
AmoebaReferenceMultipoleForce
::
initializeRealVecVector
(
vector
<
RealVec
>&
vectorToInitialize
)
const
void
AmoebaReferenceMultipoleForce
::
initializeRealVecVector
(
vector
<
RealVec
>&
vectorToInitialize
)
const
{
vectorToInitialize
.
resize
(
_numParticles
);
RealVec
zeroVec
(
0.0
,
0.0
,
0.0
);
std
::
fill
(
vectorToInitialize
.
begin
(),
vectorToInitialize
.
end
(),
zeroVec
);
}
void
AmoebaReferenceMultipoleForce
::
copyRealVecVector
(
const
vector
<
OpenMM
::
RealVec
>&
inputVector
,
vector
<
OpenMM
::
RealVec
>&
outputVector
)
const
{
void
AmoebaReferenceMultipoleForce
::
copyRealVecVector
(
const
vector
<
OpenMM
::
RealVec
>&
inputVector
,
vector
<
OpenMM
::
RealVec
>&
outputVector
)
const
{
outputVector
.
resize
(
inputVector
.
size
());
for
(
unsigned
int
ii
=
0
;
ii
<
inputVector
.
size
();
ii
++
)
{
outputVector
[
ii
]
=
inputVector
[
ii
];
}
}
}
void
AmoebaReferenceMultipoleForce
::
loadParticleData
(
const
vector
<
RealVec
>&
particlePositions
,
...
...
@@ -295,9 +295,9 @@ void AmoebaReferenceMultipoleForce::loadParticleData(const vector<RealVec>& part
const
vector
<
RealOpenMM
>&
tholes
,
const
vector
<
RealOpenMM
>&
dampingFactors
,
const
vector
<
RealOpenMM
>&
polarity
,
vector
<
MultipoleParticleData
>&
particleData
)
const
vector
<
MultipoleParticleData
>&
particleData
)
const
{
particleData
.
resize
(
_numParticles
);
for
(
unsigned
int
ii
=
0
;
ii
<
_numParticles
;
ii
++
)
{
...
...
@@ -343,8 +343,8 @@ void AmoebaReferenceMultipoleForce::zeroFixedMultipoleFields()
}
void
AmoebaReferenceMultipoleForce
::
checkChiralCenterAtParticle
(
MultipoleParticleData
&
particleI
,
int
axisType
,
MultipoleParticleData
&
particleZ
,
MultipoleParticleData
&
particleX
,
MultipoleParticleData
&
particleY
)
const
MultipoleParticleData
&
particleZ
,
MultipoleParticleData
&
particleX
,
MultipoleParticleData
&
particleY
)
const
{
if
(
axisType
==
AmoebaMultipoleForce
::
ZThenX
||
particleY
.
particleIndex
==
-
1
)
{
...
...
@@ -372,7 +372,7 @@ void AmoebaReferenceMultipoleForce::checkChiral(vector<MultipoleParticleData>& p
const
vector
<
int
>&
multipoleAtomXs
,
const
vector
<
int
>&
multipoleAtomYs
,
const
vector
<
int
>&
multipoleAtomZs
,
const
vector
<
int
>&
axisTypes
)
const
const
vector
<
int
>&
axisTypes
)
const
{
for
(
unsigned
int
ii
=
0
;
ii
<
_numParticles
;
ii
++
)
{
if
(
multipoleAtomYs
[
ii
]
>
-
1
)
{
...
...
@@ -388,7 +388,7 @@ void AmoebaReferenceMultipoleForce::applyRotationMatrixToParticle( Multipol
const
MultipoleParticleData
&
particleZ
,
const
MultipoleParticleData
&
particleX
,
MultipoleParticleData
*
particleY
,
int
axisType
)
const
int
axisType
)
const
{
// handle case where rotation matrix is identity (e.g. single ion)
...
...
@@ -403,25 +403,25 @@ void AmoebaReferenceMultipoleForce::applyRotationMatrixToParticle( Multipol
RealVec
vectorX
=
particleX
.
position
-
particleI
.
position
;
normalizeRealVec
(
vectorZ
);
// branch based on axis type
if
(
axisType
==
AmoebaMultipoleForce
::
Bisector
)
{
// bisector
// dx = dx1 + dx2 (in TINKER code)
normalizeRealVec
(
vectorX
);
vectorZ
+=
vectorX
;
normalizeRealVec
(
vectorZ
);
}
else
if
(
axisType
==
AmoebaMultipoleForce
::
ZBisect
)
{
// z-bisect
// dx = dx1 + dx2 (in TINKER code)
normalizeRealVec
(
vectorX
);
vectorY
=
particleY
->
position
-
particleI
.
position
;
...
...
@@ -429,13 +429,13 @@ void AmoebaReferenceMultipoleForce::applyRotationMatrixToParticle( Multipol
vectorX
+=
vectorY
;
normalizeRealVec
(
vectorX
);
}
else
if
(
axisType
==
AmoebaMultipoleForce
::
ThreeFold
)
{
// 3-fold
// dx = dx1 + dx2 + dx3 (in TINKER code)
normalizeRealVec
(
vectorX
);
vectorY
=
particleY
->
position
-
particleI
.
position
;
...
...
@@ -443,15 +443,15 @@ void AmoebaReferenceMultipoleForce::applyRotationMatrixToParticle( Multipol
vectorZ
+=
vectorX
+
vectorY
;
normalizeRealVec
(
vectorZ
);
}
else
if
(
axisType
==
AmoebaMultipoleForce
::
ZOnly
)
{
// z-only
vectorX
=
RealVec
(
0.1
,
0.1
,
0.1
);
}
RealOpenMM
dot
=
vectorZ
.
dot
(
vectorX
);
vectorX
-=
vectorZ
*
dot
;
...
...
@@ -461,7 +461,7 @@ void AmoebaReferenceMultipoleForce::applyRotationMatrixToParticle( Multipol
RealVec
rotationMatrix
[
3
];
rotationMatrix
[
0
]
=
vectorX
;
rotationMatrix
[
1
]
=
vectorY
;
rotationMatrix
[
2
]
=
vectorZ
;
rotationMatrix
[
2
]
=
vectorZ
;
RealVec
labDipole
;
for
(
int
ii
=
0
;
ii
<
3
;
ii
++
)
{
...
...
@@ -471,7 +471,7 @@ void AmoebaReferenceMultipoleForce::applyRotationMatrixToParticle( Multipol
}
}
particleI
.
dipole
=
labDipole
;
RealOpenMM
mPole
[
3
][
3
];
RealOpenMM
rPole
[
3
][
3
]
=
{
{
0.0
,
0.0
,
0.0
},
{
0.0
,
0.0
,
0.0
},
...
...
@@ -488,7 +488,7 @@ void AmoebaReferenceMultipoleForce::applyRotationMatrixToParticle( Multipol
mPole
[
2
][
0
]
=
particleI
.
quadrupole
[
QXZ
];
mPole
[
2
][
1
]
=
particleI
.
quadrupole
[
QYZ
];
mPole
[
2
][
2
]
=
particleI
.
quadrupole
[
QZZ
];
for
(
int
ii
=
0
;
ii
<
3
;
ii
++
)
{
for
(
int
jj
=
ii
;
jj
<
3
;
jj
++
)
{
for
(
int
kk
=
0
;
kk
<
3
;
kk
++
)
{
...
...
@@ -498,7 +498,7 @@ void AmoebaReferenceMultipoleForce::applyRotationMatrixToParticle( Multipol
}
}
}
particleI
.
quadrupole
[
QXX
]
=
rPole
[
0
][
0
];
particleI
.
quadrupole
[
QXY
]
=
rPole
[
0
][
1
];
particleI
.
quadrupole
[
QXZ
]
=
rPole
[
0
][
2
];
...
...
@@ -636,7 +636,7 @@ void AmoebaReferenceMultipoleForce::applyRotationMatrix(vector<MultipoleParticle
const
vector
<
int
>&
multipoleAtomXs
,
const
vector
<
int
>&
multipoleAtomYs
,
const
vector
<
int
>&
multipoleAtomZs
,
const
vector
<
int
>&
axisTypes
)
const
const
vector
<
int
>&
axisTypes
)
const
{
for
(
unsigned
int
ii
=
0
;
ii
<
_numParticles
;
ii
++
)
{
...
...
@@ -649,19 +649,19 @@ void AmoebaReferenceMultipoleForce::applyRotationMatrix(vector<MultipoleParticle
void
AmoebaReferenceMultipoleForce
::
getAndScaleInverseRs
(
RealOpenMM
dampI
,
RealOpenMM
dampJ
,
RealOpenMM
tholeI
,
RealOpenMM
tholeJ
,
RealOpenMM
r
,
vector
<
RealOpenMM
>&
rrI
)
const
RealOpenMM
r
,
vector
<
RealOpenMM
>&
rrI
)
const
{
RealOpenMM
rI
=
1.0
/
r
;
RealOpenMM
r2I
=
rI
*
rI
;
rrI
[
0
]
=
rI
*
r2I
;
RealOpenMM
constantFactor
=
3.0
;
for
(
unsigned
int
ii
=
1
;
ii
<
rrI
.
size
();
ii
++
)
{
for
(
unsigned
int
ii
=
1
;
ii
<
rrI
.
size
();
ii
++
)
{
rrI
[
ii
]
=
constantFactor
*
rrI
[
ii
-
1
]
*
r2I
;
constantFactor
+=
2.0
;
}
RealOpenMM
damp
=
dampI
*
dampJ
;
if
(
damp
!=
0.0
)
{
RealOpenMM
pgamma
=
tholeI
<
tholeJ
?
tholeI
:
tholeJ
;
...
...
@@ -669,7 +669,7 @@ void AmoebaReferenceMultipoleForce::getAndScaleInverseRs(RealOpenMM dampI, RealO
ratio
=
ratio
*
ratio
*
ratio
;
damp
=
-
pgamma
*
ratio
;
if
(
damp
>
-
50.0
)
{
if
(
damp
>
-
50.0
)
{
RealOpenMM
dampExp
=
EXP
(
damp
);
rrI
[
0
]
*=
1.0
-
dampExp
;
...
...
@@ -683,7 +683,7 @@ void AmoebaReferenceMultipoleForce::getAndScaleInverseRs(RealOpenMM dampI, RealO
void
AmoebaReferenceMultipoleForce
::
calculateFixedMultipoleFieldPairIxn
(
const
MultipoleParticleData
&
particleI
,
const
MultipoleParticleData
&
particleJ
,
RealOpenMM
dScale
,
RealOpenMM
pScale
)
RealOpenMM
dScale
,
RealOpenMM
pScale
)
{
if
(
particleI
.
particleIndex
==
particleJ
.
particleIndex
)
...
...
@@ -693,9 +693,9 @@ void AmoebaReferenceMultipoleForce::calculateFixedMultipoleFieldPairIxn(const Mu
RealOpenMM
r
=
SQRT
(
deltaR
.
dot
(
deltaR
));
vector
<
RealOpenMM
>
rrI
(
3
);
// get scaling factors, if needed
getAndScaleInverseRs
(
particleI
.
dampingFactor
,
particleJ
.
dampingFactor
,
particleI
.
thole
,
particleJ
.
thole
,
r
,
rrI
);
RealOpenMM
rr3
=
rrI
[
0
];
...
...
@@ -710,8 +710,8 @@ void AmoebaReferenceMultipoleForce::calculateFixedMultipoleFieldPairIxn(const Mu
qDotDelta
[
1
]
=
deltaR
[
0
]
*
particleJ
.
quadrupole
[
QXY
]
+
deltaR
[
1
]
*
particleJ
.
quadrupole
[
QYY
]
+
deltaR
[
2
]
*
particleJ
.
quadrupole
[
QYZ
];
qDotDelta
[
2
]
=
deltaR
[
0
]
*
particleJ
.
quadrupole
[
QXZ
]
+
deltaR
[
1
]
*
particleJ
.
quadrupole
[
QYZ
]
+
deltaR
[
2
]
*
particleJ
.
quadrupole
[
QZZ
];
RealOpenMM
dipoleDelta
=
particleJ
.
dipole
.
dot
(
deltaR
);
RealOpenMM
qdpoleDelta
=
qDotDelta
.
dot
(
deltaR
);
RealOpenMM
dipoleDelta
=
particleJ
.
dipole
.
dot
(
deltaR
);
RealOpenMM
qdpoleDelta
=
qDotDelta
.
dot
(
deltaR
);
RealOpenMM
factor
=
rr3
*
particleJ
.
charge
-
rr5
*
dipoleDelta
+
rr7
*
qdpoleDelta
;
RealVec
field
=
deltaR
*
factor
+
particleJ
.
dipole
*
rr3
-
qDotDelta
*
rr5_2
;
...
...
@@ -719,17 +719,17 @@ void AmoebaReferenceMultipoleForce::calculateFixedMultipoleFieldPairIxn(const Mu
unsigned
int
particleIndex
=
particleI
.
particleIndex
;
_fixedMultipoleField
[
particleIndex
]
-=
field
*
dScale
;
_fixedMultipoleFieldPolar
[
particleIndex
]
-=
field
*
pScale
;
// field at particle J due multipoles at particle I
qDotDelta
[
0
]
=
deltaR
[
0
]
*
particleI
.
quadrupole
[
QXX
]
+
deltaR
[
1
]
*
particleI
.
quadrupole
[
QXY
]
+
deltaR
[
2
]
*
particleI
.
quadrupole
[
QXZ
];
qDotDelta
[
1
]
=
deltaR
[
0
]
*
particleI
.
quadrupole
[
QXY
]
+
deltaR
[
1
]
*
particleI
.
quadrupole
[
QYY
]
+
deltaR
[
2
]
*
particleI
.
quadrupole
[
QYZ
];
qDotDelta
[
2
]
=
deltaR
[
0
]
*
particleI
.
quadrupole
[
QXZ
]
+
deltaR
[
1
]
*
particleI
.
quadrupole
[
QYZ
]
+
deltaR
[
2
]
*
particleI
.
quadrupole
[
QZZ
];
dipoleDelta
=
particleI
.
dipole
.
dot
(
deltaR
);
qdpoleDelta
=
qDotDelta
.
dot
(
deltaR
);
dipoleDelta
=
particleI
.
dipole
.
dot
(
deltaR
);
qdpoleDelta
=
qDotDelta
.
dot
(
deltaR
);
factor
=
rr3
*
particleI
.
charge
+
rr5
*
dipoleDelta
+
rr7
*
qdpoleDelta
;
field
=
deltaR
*
factor
-
particleI
.
dipole
*
rr3
-
qDotDelta
*
rr5_2
;
particleIndex
=
particleJ
.
particleIndex
;
_fixedMultipoleField
[
particleIndex
]
+=
field
*
dScale
;
...
...
@@ -748,7 +748,7 @@ void AmoebaReferenceMultipoleForce::calculateFixedMultipoleField(const vector<Mu
for
(
unsigned
int
jj
=
ii
;
jj
<
_numParticles
;
jj
++
)
{
// if site jj is less than max covalent scaling index then get/apply scaling constants
// otherwise add unmodified field and fieldPolar to particle fields
// otherwise add unmodified field and fieldPolar to particle fields
RealOpenMM
dScale
,
pScale
;
if
(
jj
<=
_maxScaleIndex
[
ii
])
{
...
...
@@ -775,13 +775,13 @@ void AmoebaReferenceMultipoleForce::initializeInducedDipoles(vector<UpdateInduce
}
}
void
AmoebaReferenceMultipoleForce
::
calculateInducedDipolePairIxn
(
unsigned
int
particleI
,
void
AmoebaReferenceMultipoleForce
::
calculateInducedDipolePairIxn
(
unsigned
int
particleI
,
unsigned
int
particleJ
,
RealOpenMM
rr3
,
RealOpenMM
rr5
,
const
RealVec
&
deltaR
,
const
vector
<
RealVec
>&
inducedDipole
,
vector
<
RealVec
>&
field
)
const
vector
<
RealVec
>&
field
)
const
{
RealOpenMM
dDotDelta
=
rr5
*
(
inducedDipole
[
particleJ
].
dot
(
deltaR
));
...
...
@@ -790,7 +790,7 @@ void AmoebaReferenceMultipoleForce::calculateInducedDipolePairIxn(unsigned int p
field
[
particleJ
]
+=
inducedDipole
[
particleI
]
*
rr3
+
deltaR
*
dDotDelta
;
}
void
AmoebaReferenceMultipoleForce
::
calculateInducedDipolePairIxns
(
const
MultipoleParticleData
&
particleI
,
void
AmoebaReferenceMultipoleForce
::
calculateInducedDipolePairIxns
(
const
MultipoleParticleData
&
particleI
,
const
MultipoleParticleData
&
particleJ
,
vector
<
UpdateInducedDipoleFieldStruct
>&
updateInducedDipoleFields
)
{
...
...
@@ -801,13 +801,13 @@ void AmoebaReferenceMultipoleForce::calculateInducedDipolePairIxns(const Multipo
RealVec
deltaR
=
particleJ
.
position
-
particleI
.
position
;
RealOpenMM
r
=
SQRT
(
deltaR
.
dot
(
deltaR
));
vector
<
RealOpenMM
>
rrI
(
2
);
getAndScaleInverseRs
(
particleI
.
dampingFactor
,
particleJ
.
dampingFactor
,
particleI
.
thole
,
particleJ
.
thole
,
r
,
rrI
);
RealOpenMM
rr3
=
-
rrI
[
0
];
RealOpenMM
rr5
=
rrI
[
1
];
for
(
unsigned
int
ii
=
0
;
ii
<
updateInducedDipoleFields
.
size
();
ii
++
)
{
calculateInducedDipolePairIxn
(
particleI
.
particleIndex
,
particleJ
.
particleIndex
,
rr3
,
rr5
,
deltaR
,
*
updateInducedDipoleFields
[
ii
].
inducedDipoles
,
updateInducedDipoleFields
[
ii
].
inducedDipoleField
);
...
...
@@ -816,13 +816,13 @@ void AmoebaReferenceMultipoleForce::calculateInducedDipolePairIxns(const Multipo
void
AmoebaReferenceMultipoleForce
::
calculateInducedDipoleFields
(
const
vector
<
MultipoleParticleData
>&
particleData
,
vector
<
UpdateInducedDipoleFieldStruct
>&
updateInducedDipoleFields
)
{
// Initialize the fields to zero.
RealVec
zeroVec
(
0.0
,
0.0
,
0.0
);
for
(
unsigned
int
ii
=
0
;
ii
<
updateInducedDipoleFields
.
size
();
ii
++
)
std
::
fill
(
updateInducedDipoleFields
[
ii
].
inducedDipoleField
.
begin
(),
updateInducedDipoleFields
[
ii
].
inducedDipoleField
.
end
(),
zeroVec
);
// Add fields from all induced dipoles.
for
(
unsigned
int
ii
=
0
;
ii
<
particleData
.
size
();
ii
++
)
for
(
unsigned
int
jj
=
ii
;
jj
<
particleData
.
size
();
jj
++
)
calculateInducedDipolePairIxns
(
particleData
[
ii
],
particleData
[
jj
],
updateInducedDipoleFields
);
...
...
@@ -832,7 +832,7 @@ RealOpenMM AmoebaReferenceMultipoleForce::updateInducedDipoleFields(const vector
vector
<
UpdateInducedDipoleFieldStruct
>&
updateInducedDipoleFields
)
{
// Calculate the fields coming from induced dipoles.
calculateInducedDipoleFields
(
particleData
,
updateInducedDipoleFields
);
// Update the induced dipoles and calculate the convergence factor, maxEpsilon
...
...
@@ -843,7 +843,7 @@ RealOpenMM AmoebaReferenceMultipoleForce::updateInducedDipoleFields(const vector
*
updateInducedDipoleFields
[
kk
].
fixedMultipoleField
,
updateInducedDipoleFields
[
kk
].
inducedDipoleField
,
*
updateInducedDipoleFields
[
kk
].
inducedDipoles
);
maxEpsilon
=
epsilon
>
maxEpsilon
?
epsilon
:
maxEpsilon
;
}
...
...
@@ -878,11 +878,11 @@ void AmoebaReferenceMultipoleForce::convergeInduceDipolesBySOR(const vector<Mult
// loop until (1) induced dipoles are converged or
// (2) iterations == max iterations or
// (3) convergence factor (spsilon) increases
// (3) convergence factor (spsilon) increases
while
(
!
done
)
{
RealOpenMM
epsilon
=
updateInducedDipoleFields
(
particleData
,
updateInducedDipoleField
);
RealOpenMM
epsilon
=
updateInducedDipoleFields
(
particleData
,
updateInducedDipoleField
);
epsilon
=
_polarSOR
*
_debye
*
SQRT
(
epsilon
/
(
static_cast
<
RealOpenMM
>
(
_numParticles
)));
if
(
epsilon
<
getMutualInducedDipoleTargetEpsilon
())
{
...
...
@@ -907,11 +907,11 @@ void AmoebaReferenceMultipoleForce::convergeInduceDipolesByDIIS(const vector<Mul
int
maxPrevious
=
20
;
for
(
int
iteration
=
0
;
;
iteration
++
)
{
// Compute the field from the induced dipoles.
calculateInducedDipoleFields
(
particleData
,
updateInducedDipoleField
);
calculateInducedDipoleFields
(
particleData
,
updateInducedDipoleField
);
// Record the current dipoles and the errors in them.
RealOpenMM
maxEpsilon
=
0
;
prevErrors
.
push_back
(
vector
<
RealVec
>
());
prevErrors
.
back
().
resize
(
_numParticles
);
...
...
@@ -933,9 +933,9 @@ void AmoebaReferenceMultipoleForce::convergeInduceDipolesByDIIS(const vector<Mul
maxEpsilon
=
epsilon
;
}
maxEpsilon
=
_debye
*
SQRT
(
maxEpsilon
/
_numParticles
);
// Decide whether to stop or continue iterating.
if
(
maxEpsilon
<
getMutualInducedDipoleTargetEpsilon
())
setMutualInducedDipoleConverged
(
true
);
if
(
maxEpsilon
<
getMutualInducedDipoleTargetEpsilon
()
||
iteration
==
getMaximumMutualInducedDipoleIterations
())
{
...
...
@@ -943,9 +943,9 @@ void AmoebaReferenceMultipoleForce::convergeInduceDipolesByDIIS(const vector<Mul
setMutualInducedDipoleIterations
(
iteration
);
return
;
}
// Select the new dipoles.
if
(
prevErrors
.
size
()
>
maxPrevious
)
{
prevErrors
.
erase
(
prevErrors
.
begin
());
for
(
int
k
=
0
;
k
<
numFields
;
k
++
)
...
...
@@ -972,9 +972,9 @@ void AmoebaReferenceMultipoleForce::computeDIISCoefficients(const vector<vector<
coefficients
[
0
]
=
1
;
return
;
}
// Create the DIIS matrix.
int
rank
=
steps
+
1
;
Array2D
<
double
>
b
(
rank
,
rank
);
b
[
0
][
0
]
=
0
;
...
...
@@ -987,9 +987,9 @@ void AmoebaReferenceMultipoleForce::computeDIISCoefficients(const vector<vector<
sum
+=
prevErrors
[
i
][
k
].
dot
(
prevErrors
[
j
][
k
]);
b
[
i
+
1
][
j
+
1
]
=
b
[
j
+
1
][
i
+
1
]
=
sum
;
}
// Solve using SVD. Since the right hand side is (-1, 0, 0, 0, ...), this is simpler than the general case.
JAMA
::
SVD
<
double
>
svd
(
b
);
Array2D
<
double
>
u
,
v
;
svd
.
getU
(
u
);
...
...
@@ -1002,7 +1002,7 @@ void AmoebaReferenceMultipoleForce::computeDIISCoefficients(const vector<vector<
for
(
int
j
=
0
;
j
<
effectiveRank
;
j
++
)
d
-=
u
[
0
][
j
]
*
v
[
i
][
j
]
/
s
[
j
];
coefficients
[
i
-
1
]
=
d
;
}
}
}
void
AmoebaReferenceMultipoleForce
::
calculateInducedDipoles
(
const
vector
<
MultipoleParticleData
>&
particleData
)
...
...
@@ -1014,12 +1014,12 @@ void AmoebaReferenceMultipoleForce::calculateInducedDipoles(const vector<Multipo
calculateFixedMultipoleField
(
particleData
);
// initialize inducedDipoles
// if polarization type is 'Direct', then return after initializing; otherwise
// if polarization type is 'Direct', then return after initializing; otherwise
// converge induced dipoles.
for
(
unsigned
int
ii
=
0
;
ii
<
_numParticles
;
ii
++
)
{
_fixedMultipoleField
[
ii
]
*=
particleData
[
ii
].
polarity
;
_fixedMultipoleFieldPolar
[
ii
]
*=
particleData
[
ii
].
polarity
;
_fixedMultipoleFieldPolar
[
ii
]
*=
particleData
[
ii
].
polarity
;
}
_inducedDipole
.
resize
(
_numParticles
);
...
...
@@ -1045,7 +1045,7 @@ RealOpenMM AmoebaReferenceMultipoleForce::calculateElectrostaticPairIxn(const Mu
const
MultipoleParticleData
&
particleK
,
const
vector
<
RealOpenMM
>&
scalingFactors
,
vector
<
RealVec
>&
forces
,
vector
<
RealVec
>&
torque
)
const
vector
<
RealVec
>&
torque
)
const
{
unsigned
int
iIndex
=
particleI
.
particleIndex
;
unsigned
int
kIndex
=
particleK
.
particleIndex
;
...
...
@@ -1438,9 +1438,9 @@ void AmoebaReferenceMultipoleForce::mapTorqueToForceForParticle(const MultipoleP
const
MultipoleParticleData
&
particleV
,
MultipoleParticleData
*
particleW
,
int
axisType
,
const
Vec3
&
torque
,
vector
<
RealVec
>&
forces
)
const
vector
<
RealVec
>&
forces
)
const
{
static
const
int
U
=
0
;
static
const
int
V
=
1
;
static
const
int
W
=
2
;
...
...
@@ -1454,17 +1454,17 @@ void AmoebaReferenceMultipoleForce::mapTorqueToForceForParticle(const MultipoleP
static
const
int
VS
=
10
;
static
const
int
WS
=
11
;
static
const
int
LastVectorIndex
=
12
;
static
const
int
X
=
0
;
static
const
int
Y
=
1
;
static
const
int
Z
=
2
;
static
const
int
I
=
3
;
RealOpenMM
norms
[
LastVectorIndex
];
RealOpenMM
angles
[
LastVectorIndex
][
2
];
// ---------------------------------------------------------------------------------------
// get coordinates of this atom and the z & x axis atoms
// compute the vector between the atoms and 1/sqrt(d2), d2 is distance between
// this atom and the axis atom
...
...
@@ -1486,12 +1486,12 @@ void AmoebaReferenceMultipoleForce::mapTorqueToForceForParticle(const MultipoleP
vectorW
=
vectorU
.
cross
(
vectorV
);
}
norms
[
W
]
=
normalizeRealVec
(
vectorW
);
RealVec
vectorUV
,
vectorUW
,
vectorVW
;
vectorUV
=
vectorV
.
cross
(
vectorU
);
vectorUW
=
vectorW
.
cross
(
vectorU
);
vectorVW
=
vectorW
.
cross
(
vectorV
);
norms
[
UV
]
=
normalizeRealVec
(
vectorUV
);
norms
[
UW
]
=
normalizeRealVec
(
vectorUW
);
norms
[
VW
]
=
normalizeRealVec
(
vectorVW
);
...
...
@@ -1501,7 +1501,7 @@ void AmoebaReferenceMultipoleForce::mapTorqueToForceForParticle(const MultipoleP
angles
[
UV
][
0
]
=
vectorU
.
dot
(
vectorV
);
angles
[
UV
][
1
]
=
SQRT
(
1.0
-
angles
[
UV
][
0
]
*
angles
[
UV
][
0
]);
angles
[
UW
][
0
]
=
vectorU
.
dot
(
vectorW
);
angles
[
UW
][
1
]
=
SQRT
(
1.0
-
angles
[
UW
][
0
]
*
angles
[
UW
][
0
]);
...
...
@@ -1515,26 +1515,26 @@ void AmoebaReferenceMultipoleForce::mapTorqueToForceForParticle(const MultipoleP
dphi
*=
-
1.0
;
// branch based on axis type
if
(
axisType
==
AmoebaMultipoleForce
::
ZThenX
||
axisType
==
AmoebaMultipoleForce
::
Bisector
)
{
RealOpenMM
factor1
;
RealOpenMM
factor2
;
RealOpenMM
factor3
;
RealOpenMM
factor4
;
RealOpenMM
half
=
0.5
;
factor1
=
dphi
[
V
]
/
(
norms
[
U
]
*
angles
[
UV
][
1
]);
factor2
=
dphi
[
W
]
/
(
norms
[
U
]);
factor3
=
-
dphi
[
U
]
/
(
norms
[
V
]
*
angles
[
UV
][
1
]);
if
(
axisType
==
AmoebaMultipoleForce
::
Bisector
)
{
if
(
axisType
==
AmoebaMultipoleForce
::
Bisector
)
{
factor2
*=
half
;
factor4
=
half
*
dphi
[
W
]
/
(
norms
[
V
]);
}
else
{
factor4
=
0.0
;
}
for
(
int
ii
=
0
;
ii
<
3
;
ii
++
)
{
double
forceU
=
vectorUV
[
ii
]
*
factor1
+
factor2
*
vectorUW
[
ii
];
forces
[
particleU
.
particleIndex
][
ii
]
-=
forceU
;
...
...
@@ -1547,7 +1547,7 @@ void AmoebaReferenceMultipoleForce::mapTorqueToForceForParticle(const MultipoleP
}
else
if
(
axisType
==
AmoebaMultipoleForce
::
ZBisect
)
{
RealVec
vectorR
=
vectorV
+
vectorW
;
RealVec
vectorR
=
vectorV
+
vectorW
;
RealVec
vectorS
=
vectorU
.
cross
(
vectorR
);
norms
[
R
]
=
normalizeRealVec
(
vectorR
);
...
...
@@ -1574,7 +1574,7 @@ void AmoebaReferenceMultipoleForce::mapTorqueToForceForParticle(const MultipoleP
angles
[
WS
][
0
]
=
vectorW
.
dot
(
vectorS
);
angles
[
WS
][
1
]
=
SQRT
(
1.0
-
angles
[
WS
][
0
]
*
angles
[
WS
][
0
]);
RealVec
t1
=
vectorV
-
vectorS
*
angles
[
VS
][
0
];
RealVec
t2
=
vectorW
-
vectorS
*
angles
[
WS
][
0
];
...
...
@@ -1656,7 +1656,7 @@ void AmoebaReferenceMultipoleForce::mapTorqueToForce(vector<MultipoleParticleDat
const
vector
<
int
>&
multipoleAtomZs
,
const
vector
<
int
>&
axisTypes
,
vector
<
RealVec
>&
torques
,
vector
<
RealVec
>&
forces
)
const
vector
<
RealVec
>&
forces
)
const
{
// map torques to forces
...
...
@@ -1666,7 +1666,7 @@ void AmoebaReferenceMultipoleForce::mapTorqueToForce(vector<MultipoleParticleDat
mapTorqueToForceForParticle
(
particleData
[
ii
],
particleData
[
multipoleAtomZs
[
ii
]],
particleData
[
multipoleAtomXs
[
ii
]],
multipoleAtomYs
[
ii
]
>
-
1
?
&
particleData
[
multipoleAtomYs
[
ii
]]
:
NULL
,
axisTypes
[
ii
],
torques
[
ii
],
forces
);
axisTypes
[
ii
],
torques
[
ii
],
forces
);
}
}
}
...
...
@@ -1680,7 +1680,7 @@ RealOpenMM AmoebaReferenceMultipoleForce::calculateElectrostatic(const vector<Mu
vector
<
RealOpenMM
>
scaleFactors
(
LAST_SCALE_TYPE_INDEX
);
for
(
unsigned
int
kk
=
0
;
kk
<
scaleFactors
.
size
();
kk
++
)
{
scaleFactors
[
kk
]
=
1.0
;
}
}
// main loop over particle pairs
...
...
@@ -1878,7 +1878,7 @@ void AmoebaReferenceMultipoleForce::calculateAmoebaSystemMultipoleMoments(const
}
// convert the quadrupole from traced to traceless form
outputMultipoleMoments
.
resize
(
13
);
RealOpenMM
qave
=
(
xxqdp
+
yyqdp
+
zzqdp
)
/
3.0
;
outputMultipoleMoments
[
4
]
=
0.5
*
(
xxqdp
-
qave
);
...
...
@@ -1901,7 +1901,7 @@ void AmoebaReferenceMultipoleForce::calculateAmoebaSystemMultipoleMoments(const
outputMultipoleMoments
[
7
]
=
outputMultipoleMoments
[
5
];
outputMultipoleMoments
[
10
]
=
outputMultipoleMoments
[
6
];
outputMultipoleMoments
[
11
]
=
outputMultipoleMoments
[
9
];
RealOpenMM
debye
=
4.80321
;
outputMultipoleMoments
[
0
]
=
netchg
;
...
...
@@ -1910,16 +1910,16 @@ void AmoebaReferenceMultipoleForce::calculateAmoebaSystemMultipoleMoments(const
outputMultipoleMoments
[
1
]
=
dpl
[
0
];
outputMultipoleMoments
[
2
]
=
dpl
[
1
];
outputMultipoleMoments
[
3
]
=
dpl
[
2
];
debye
*=
3.0
;
for
(
unsigned
int
ii
=
4
;
ii
<
13
;
ii
++
)
{
outputMultipoleMoments
[
ii
]
*=
100.0
*
debye
;
}
}
RealOpenMM
AmoebaReferenceMultipoleForce
::
calculateElectrostaticPotentialForParticleGridPoint
(
const
MultipoleParticleData
&
particleI
,
const
RealVec
&
gridPoint
)
const
RealOpenMM
AmoebaReferenceMultipoleForce
::
calculateElectrostaticPotentialForParticleGridPoint
(
const
MultipoleParticleData
&
particleI
,
const
RealVec
&
gridPoint
)
const
{
RealVec
deltaR
=
particleI
.
position
-
gridPoint
;
getPeriodicDelta
(
deltaR
);
...
...
@@ -1961,7 +1961,7 @@ void AmoebaReferenceMultipoleForce::calculateElectrostaticPotential(const vector
{
// setup, including calculating induced dipoles
// initialize potential
// initialize potential
// calculate contribution of each particle to potential at grid point
// apply prefactor
...
...
@@ -1988,14 +1988,14 @@ void AmoebaReferenceMultipoleForce::calculateElectrostaticPotential(const vector
}
AmoebaReferenceMultipoleForce
::
UpdateInducedDipoleFieldStruct
::
UpdateInducedDipoleFieldStruct
(
vector
<
OpenMM
::
RealVec
>&
inputFixed_E_Field
,
vector
<
OpenMM
::
RealVec
>&
inputInducedDipoles
)
:
fixedMultipoleField
(
&
inputFixed_E_Field
),
inducedDipoles
(
&
inputInducedDipoles
)
{
fixedMultipoleField
(
&
inputFixed_E_Field
),
inducedDipoles
(
&
inputInducedDipoles
)
{
inducedDipoleField
.
resize
(
fixedMultipoleField
->
size
());
}
}
AmoebaReferenceGeneralizedKirkwoodMultipoleForce
::
AmoebaReferenceGeneralizedKirkwoodMultipoleForce
(
AmoebaReferenceGeneralizedKirkwoodForce
*
amoebaReferenceGeneralizedKirkwoodForce
)
:
AmoebaReferenceMultipoleForce
(
NoCutoff
),
_amoebaReferenceGeneralizedKirkwoodForce
(
amoebaReferenceGeneralizedKirkwoodForce
),
_gkc
(
2.455
)
_gkc
(
2.455
)
{
RealOpenMM
solventDielectric
=
_amoebaReferenceGeneralizedKirkwoodForce
->
getSolventDielectric
();
...
...
@@ -2016,33 +2016,33 @@ AmoebaReferenceGeneralizedKirkwoodMultipoleForce::AmoebaReferenceGeneralizedKirk
for
(
unsigned
int
ii
=
0
;
ii
<
_scaledRadii
.
size
();
ii
++
)
{
_scaledRadii
[
ii
]
*=
_atomicRadii
[
ii
];
}
}
}
AmoebaReferenceGeneralizedKirkwoodMultipoleForce
::~
AmoebaReferenceGeneralizedKirkwoodMultipoleForce
()
{
delete
_amoebaReferenceGeneralizedKirkwoodForce
;
};
int
AmoebaReferenceGeneralizedKirkwoodMultipoleForce
::
getIncludeCavityTerm
()
const
{
return
_includeCavityTerm
;
};
RealOpenMM
AmoebaReferenceGeneralizedKirkwoodMultipoleForce
::
getProbeRadius
()
const
RealOpenMM
AmoebaReferenceGeneralizedKirkwoodMultipoleForce
::
getProbeRadius
()
const
{
return
_probeRadius
;
};
RealOpenMM
AmoebaReferenceGeneralizedKirkwoodMultipoleForce
::
getSurfaceAreaFactor
()
const
RealOpenMM
AmoebaReferenceGeneralizedKirkwoodMultipoleForce
::
getSurfaceAreaFactor
()
const
{
return
_surfaceAreaFactor
;
};
RealOpenMM
AmoebaReferenceGeneralizedKirkwoodMultipoleForce
::
getDielectricOffset
()
const
RealOpenMM
AmoebaReferenceGeneralizedKirkwoodMultipoleForce
::
getDielectricOffset
()
const
{
return
_dielectricOffset
;
};
void
AmoebaReferenceGeneralizedKirkwoodMultipoleForce
::
zeroFixedMultipoleFields
()
{
this
->
AmoebaReferenceMultipoleForce
::
zeroFixedMultipoleFields
();
...
...
@@ -2057,7 +2057,7 @@ void AmoebaReferenceGeneralizedKirkwoodMultipoleForce::calculateFixedMultipoleFi
this
->
AmoebaReferenceMultipoleForce
::
calculateFixedMultipoleFieldPairIxn
(
particleI
,
particleJ
,
dScale
,
pScale
);
// get deltaR, R2, and R between 2 atoms
RealVec
deltaR
=
particleJ
.
position
-
particleI
.
position
;
RealOpenMM
r
=
SQRT
(
deltaR
.
dot
(
deltaR
));
RealOpenMM
rb2
=
_bornRadii
[
particleI
.
particleIndex
]
*
_bornRadii
[
particleJ
.
particleIndex
];
...
...
@@ -2067,36 +2067,36 @@ void AmoebaReferenceGeneralizedKirkwoodMultipoleForce::calculateFixedMultipoleFi
RealOpenMM
uxi
=
particleI
.
dipole
[
0
];
RealOpenMM
uyi
=
particleI
.
dipole
[
1
];
RealOpenMM
uzi
=
particleI
.
dipole
[
2
];
RealOpenMM
qxxi
=
particleI
.
quadrupole
[
QXX
];
RealOpenMM
qxyi
=
particleI
.
quadrupole
[
QXY
];
RealOpenMM
qxzi
=
particleI
.
quadrupole
[
QXZ
];
RealOpenMM
qyyi
=
particleI
.
quadrupole
[
QYY
];
RealOpenMM
qyzi
=
particleI
.
quadrupole
[
QYZ
];
RealOpenMM
qzzi
=
particleI
.
quadrupole
[
QZZ
];
RealOpenMM
xr
=
deltaR
[
0
];
RealOpenMM
yr
=
deltaR
[
1
];
RealOpenMM
zr
=
deltaR
[
2
];
RealOpenMM
ck
=
particleJ
.
charge
;
RealOpenMM
xr2
=
xr
*
xr
;
RealOpenMM
yr2
=
yr
*
yr
;
RealOpenMM
zr2
=
zr
*
zr
;
RealOpenMM
r2
=
xr2
+
yr2
+
zr2
;
RealOpenMM
uxk
=
particleJ
.
dipole
[
0
];
RealOpenMM
uyk
=
particleJ
.
dipole
[
1
];
RealOpenMM
uzk
=
particleJ
.
dipole
[
2
];
RealOpenMM
qxxk
=
particleJ
.
quadrupole
[
QXX
];
RealOpenMM
qxyk
=
particleJ
.
quadrupole
[
QXY
];
RealOpenMM
qxzk
=
particleJ
.
quadrupole
[
QXZ
];
RealOpenMM
qyyk
=
particleJ
.
quadrupole
[
QYY
];
RealOpenMM
qyzk
=
particleJ
.
quadrupole
[
QYZ
];
RealOpenMM
qzzk
=
particleJ
.
quadrupole
[
QZZ
];
RealOpenMM
expterm
=
EXP
(
-
r2
/
(
_gkc
*
rb2
));
RealOpenMM
expc
=
expterm
/
_gkc
;
RealOpenMM
dexpc
=
-
2.0
/
(
_gkc
*
rb2
);
...
...
@@ -2284,11 +2284,11 @@ void AmoebaReferenceGeneralizedKirkwoodMultipoleForce::calculateFixedMultipoleFi
void
AmoebaReferenceGeneralizedKirkwoodMultipoleForce
::
calculateInducedDipolePairGkIxn
(
const
MultipoleParticleData
&
particleI
,
const
MultipoleParticleData
&
particleJ
,
const
vector
<
OpenMM
::
RealVec
>&
inputFields
,
vector
<
OpenMM
::
RealVec
>&
outputFields
)
const
vector
<
OpenMM
::
RealVec
>&
outputFields
)
const
{
RealOpenMM
a
[
3
][
3
];
RealVec
deltaR
=
particleJ
.
position
-
particleI
.
position
;
RealOpenMM
r
=
SQRT
(
deltaR
.
dot
(
deltaR
));
...
...
@@ -2306,7 +2306,7 @@ void AmoebaReferenceGeneralizedKirkwoodMultipoleForce::calculateInducedDipolePai
RealOpenMM
r2
=
xr2
+
yr2
+
zr2
;
RealOpenMM
expterm
=
EXP
(
-
r2
/
(
_gkc
*
rb2
));
RealOpenMM
expc
=
expterm
/
_gkc
;
RealOpenMM
expc
=
expterm
/
_gkc
;
RealOpenMM
gf2
=
1.0
/
(
r2
+
rb2
*
expterm
);
RealOpenMM
gf
=
SQRT
(
gf2
);
...
...
@@ -2317,7 +2317,7 @@ void AmoebaReferenceGeneralizedKirkwoodMultipoleForce::calculateInducedDipolePai
RealVec
duks
=
inputFields
[
jIndex
];
// reaction potential auxiliary terms
a
[
1
][
0
]
=
-
gf3
;
a
[
2
][
0
]
=
3.0
*
gf5
;
...
...
@@ -2325,22 +2325,22 @@ void AmoebaReferenceGeneralizedKirkwoodMultipoleForce::calculateInducedDipolePai
RealOpenMM
expc1
=
1.0
-
expc
;
a
[
1
][
1
]
=
expc1
*
a
[
2
][
0
];
// unweighted dipole reaction potential gradient tensor
RealVec
gux
,
guy
,
guz
;
gux
[
0
]
=
(
a
[
1
][
0
]
+
xr2
*
a
[
1
][
1
]);
gux
[
1
]
=
xr
*
yr
*
a
[
1
][
1
];
gux
[
2
]
=
xr
*
zr
*
a
[
1
][
1
];
guy
[
0
]
=
gux
[
1
];
guy
[
1
]
=
(
a
[
1
][
0
]
+
yr2
*
a
[
1
][
1
]);
guy
[
2
]
=
yr
*
zr
*
a
[
1
][
1
];
guz
[
0
]
=
gux
[
2
];
guz
[
1
]
=
guy
[
2
];
guz
[
2
]
=
(
a
[
1
][
0
]
+
zr2
*
a
[
1
][
1
]);
outputFields
[
iIndex
][
0
]
+=
_fd
*
duks
.
dot
(
gux
);
outputFields
[
iIndex
][
1
]
+=
_fd
*
duks
.
dot
(
guy
);
outputFields
[
iIndex
][
2
]
+=
_fd
*
duks
.
dot
(
guz
);
...
...
@@ -2387,8 +2387,8 @@ void AmoebaReferenceGeneralizedKirkwoodMultipoleForce::calculateInducedDipoles(c
for
(
unsigned
int
ii
=
0
;
ii
<
_numParticles
;
ii
++
)
{
_fixedMultipoleField
[
ii
]
*=
particleData
[
ii
].
polarity
;
_fixedMultipoleFieldPolar
[
ii
]
*=
particleData
[
ii
].
polarity
;
_gkField
[
ii
]
*=
particleData
[
ii
].
polarity
;
_fixedMultipoleFieldPolar
[
ii
]
*=
particleData
[
ii
].
polarity
;
_gkField
[
ii
]
*=
particleData
[
ii
].
polarity
;
_inducedDipole
[
ii
]
=
_fixedMultipoleField
[
ii
];
_inducedDipolePolar
[
ii
]
=
_fixedMultipoleFieldPolar
[
ii
];
...
...
@@ -2418,7 +2418,7 @@ RealOpenMM AmoebaReferenceGeneralizedKirkwoodMultipoleForce::calculateKirkwoodPa
const
MultipoleParticleData
&
particleJ
,
vector
<
RealVec
>&
forces
,
vector
<
RealVec
>&
torques
,
vector
<
RealOpenMM
>&
dBorn
)
const
vector
<
RealOpenMM
>&
dBorn
)
const
{
RealOpenMM
e
,
ei
;
...
...
@@ -2469,9 +2469,9 @@ RealOpenMM AmoebaReferenceGeneralizedKirkwoodMultipoleForce::calculateKirkwoodPa
szi
=
_inducedDipoleS
[
iIndex
][
2
]
+
_inducedDipolePolarS
[
iIndex
][
2
];
// decide whether to compute the current interaction
RealVec
deltaR
=
particleJ
.
position
-
particleI
.
position
;
RealOpenMM
r
=
SQRT
(
deltaR
.
dot
(
deltaR
));
RealOpenMM
r
=
SQRT
(
deltaR
.
dot
(
deltaR
));
xr
=
deltaR
[
0
];
yr
=
deltaR
[
1
];
...
...
@@ -3863,7 +3863,7 @@ RealOpenMM AmoebaReferenceGeneralizedKirkwoodMultipoleForce::calculateElectrosta
vector
<
RealOpenMM
>
scaleFactors
(
LAST_SCALE_TYPE_INDEX
);
for
(
unsigned
int
kk
=
0
;
kk
<
scaleFactors
.
size
();
kk
++
)
{
scaleFactors
[
kk
]
=
1.0
;
}
}
RealOpenMM
eDiffEnergy
=
0.0
;
for
(
unsigned
int
ii
=
0
;
ii
<
particleData
.
size
();
ii
++
)
{
...
...
@@ -3889,7 +3889,7 @@ RealOpenMM AmoebaReferenceGeneralizedKirkwoodMultipoleForce::calculateElectrosta
}
void
AmoebaReferenceGeneralizedKirkwoodMultipoleForce
::
calculateGrycukChainRulePairIxn
(
const
MultipoleParticleData
&
particleI
,
const
MultipoleParticleData
&
particleJ
,
const
vector
<
RealOpenMM
>&
dBorn
,
vector
<
RealVec
>&
forces
)
const
const
vector
<
RealOpenMM
>&
dBorn
,
vector
<
RealVec
>&
forces
)
const
{
unsigned
int
iIndex
=
particleI
.
particleIndex
;
unsigned
int
jIndex
=
particleJ
.
particleIndex
;
...
...
@@ -3937,7 +3937,7 @@ void AmoebaReferenceGeneralizedKirkwoodMultipoleForce::calculateGrycukChainRuleP
uik
=
r
+
sk
;
uik4
=
uik
*
uik
;
uik4
=
uik4
*
uik4
;
de
-=
0.25
*
M_PI
*
(
sk2
+
4.0
*
sk
*
r
+
r2
)
/
(
r2
*
uik4
);
RealOpenMM
dbr
=
term
*
de
/
r
;
de
=
dbr
*
dBorn
[
iIndex
];
...
...
@@ -3946,7 +3946,7 @@ void AmoebaReferenceGeneralizedKirkwoodMultipoleForce::calculateGrycukChainRuleP
forces
[
jIndex
]
+=
deltaR
*
de
;
}
RealOpenMM
AmoebaReferenceGeneralizedKirkwoodMultipoleForce
::
calculateCavityTermEnergyAndForces
(
vector
<
RealOpenMM
>&
dBorn
)
const
RealOpenMM
AmoebaReferenceGeneralizedKirkwoodMultipoleForce
::
calculateCavityTermEnergyAndForces
(
vector
<
RealOpenMM
>&
dBorn
)
const
{
RealOpenMM
energy
=
0.0
;
...
...
@@ -3973,7 +3973,7 @@ RealOpenMM AmoebaReferenceGeneralizedKirkwoodMultipoleForce::calculateKirkwoodED
const
MultipoleParticleData
&
particleJ
,
RealOpenMM
pscale
,
RealOpenMM
dscale
,
vector
<
RealVec
>&
forces
,
vector
<
RealVec
>&
torques
)
const
vector
<
RealVec
>&
torques
)
const
{
static
const
RealOpenMM
uscale
=
1.0
;
...
...
@@ -4022,7 +4022,7 @@ RealOpenMM AmoebaReferenceGeneralizedKirkwoodMultipoleForce::calculateKirkwoodED
RealOpenMM
ddsc7_3
=
0.0
;
// apply Thole polarization damping to scale factors
RealOpenMM
damp
=
particleI
.
dampingFactor
*
particleJ
.
dampingFactor
;
if
(
damp
!=
0.0
)
{
pgamma
=
particleJ
.
thole
>
particleI
.
thole
?
particleI
.
thole
:
particleJ
.
thole
;
...
...
@@ -4059,9 +4059,9 @@ RealOpenMM AmoebaReferenceGeneralizedKirkwoodMultipoleForce::calculateKirkwoodED
psc3
=
scale3
*
pscale
;
psc5
=
scale5
*
pscale
;
psc7
=
scale7
*
pscale
;
// construct auxiliary vectors for permanent terms
RealOpenMM
dixr1
=
particleI
.
dipole
[
1
]
*
zr
-
particleI
.
dipole
[
2
]
*
yr
;
RealOpenMM
dixr2
=
particleI
.
dipole
[
2
]
*
xr
-
particleI
.
dipole
[
0
]
*
zr
;
RealOpenMM
dixr3
=
particleI
.
dipole
[
0
]
*
yr
-
particleI
.
dipole
[
1
]
*
xr
;
...
...
@@ -4087,14 +4087,14 @@ RealOpenMM AmoebaReferenceGeneralizedKirkwoodMultipoleForce::calculateKirkwoodED
RealOpenMM
rxqkr3
=
xr
*
qkr2
-
yr
*
qkr1
;
// get intermediate variables for permanent energy terms
RealOpenMM
sc3
=
particleI
.
dipole
[
0
]
*
xr
+
particleI
.
dipole
[
1
]
*
yr
+
particleI
.
dipole
[
2
]
*
zr
;
RealOpenMM
sc4
=
particleJ
.
dipole
[
0
]
*
xr
+
particleJ
.
dipole
[
1
]
*
yr
+
particleJ
.
dipole
[
2
]
*
zr
;
RealOpenMM
sc5
=
qir1
*
xr
+
qir2
*
yr
+
qir3
*
zr
;
RealOpenMM
sc6
=
qkr1
*
xr
+
qkr2
*
yr
+
qkr3
*
zr
;
// construct auxiliary vectors for induced terms
RealOpenMM
dixuk1
=
particleI
.
dipole
[
1
]
*
_inducedDipoleS
[
jIndex
][
2
]
-
particleI
.
dipole
[
2
]
*
_inducedDipoleS
[
jIndex
][
1
];
RealOpenMM
dixuk2
=
particleI
.
dipole
[
2
]
*
_inducedDipoleS
[
jIndex
][
0
]
-
particleI
.
dipole
[
0
]
*
_inducedDipoleS
[
jIndex
][
2
];
RealOpenMM
dixuk3
=
particleI
.
dipole
[
0
]
*
_inducedDipoleS
[
jIndex
][
1
]
-
particleI
.
dipole
[
1
]
*
_inducedDipoleS
[
jIndex
][
0
];
...
...
@@ -4158,7 +4158,7 @@ RealOpenMM AmoebaReferenceGeneralizedKirkwoodMultipoleForce::calculateKirkwoodED
RealOpenMM
rxqkuip1
=
yr
*
qkuip3
-
zr
*
qkuip2
;
RealOpenMM
rxqkuip2
=
zr
*
qkuip1
-
xr
*
qkuip3
;
RealOpenMM
rxqkuip3
=
xr
*
qkuip2
-
yr
*
qkuip1
;
// get intermediate variables for induction energy terms
RealOpenMM
sci1
=
_inducedDipoleS
[
iIndex
][
0
]
*
particleJ
.
dipole
[
0
]
+
_inducedDipoleS
[
iIndex
][
1
]
*
particleJ
.
dipole
[
1
]
+
...
...
@@ -4216,7 +4216,7 @@ RealOpenMM AmoebaReferenceGeneralizedKirkwoodMultipoleForce::calculateKirkwoodED
RealOpenMM
gfi6
=
-
rr7
*
(
sci3
*
psc7
+
scip3
*
dsc7
);
// get the induced force
RealOpenMM
ftm2i1
=
gfi1
*
xr
+
0.5
*
(
-
rr3
*
particleJ
.
charge
*
(
_inducedDipoleS
[
iIndex
][
0
]
*
psc3
+
_inducedDipolePolarS
[
iIndex
][
0
]
*
dsc3
)
+
rr5
*
sc4
*
(
_inducedDipoleS
[
iIndex
][
0
]
*
psc5
+
_inducedDipolePolarS
[
iIndex
][
0
]
*
dsc5
)
...
...
@@ -4231,7 +4231,7 @@ RealOpenMM AmoebaReferenceGeneralizedKirkwoodMultipoleForce::calculateKirkwoodED
+
0.5
*
gfi4
*
((
qkui1
-
qiuk1
)
*
psc5
+
(
qkuip1
-
qiukp1
)
*
dsc5
)
+
gfi5
*
qir1
+
gfi6
*
qkr1
;
RealOpenMM
ftm2i2
=
gfi1
*
yr
+
0.5
*
(
-
rr3
*
particleJ
.
charge
*
(
_inducedDipoleS
[
iIndex
][
1
]
*
psc3
+
_inducedDipolePolarS
[
iIndex
][
1
]
*
dsc3
)
+
rr5
*
sc4
*
(
_inducedDipoleS
[
iIndex
][
1
]
*
psc5
+
_inducedDipolePolarS
[
iIndex
][
1
]
*
dsc5
)
...
...
@@ -4261,7 +4261,7 @@ RealOpenMM AmoebaReferenceGeneralizedKirkwoodMultipoleForce::calculateKirkwoodED
+
0.5
*
gfi4
*
((
qkui3
-
qiuk3
)
*
psc5
+
(
qkuip3
-
qiukp3
)
*
dsc5
)
+
gfi5
*
qir3
+
gfi6
*
qkr3
;
// intermediate values needed for partially excluded interactions
RealOpenMM
fridmp1
=
0.5
*
(
rr3
*
((
gli1
+
gli6
)
*
pscale
...
...
@@ -4283,7 +4283,7 @@ RealOpenMM AmoebaReferenceGeneralizedKirkwoodMultipoleForce::calculateKirkwoodED
+
rr7
*
(
gli3
*
pscale
+
glip3
*
dscale
)
*
ddsc7_3
);
// get the induced-induced derivative terms
RealOpenMM
findmp1
=
0.5
*
uscale
*
(
scip2
*
rr3
*
ddsc3_1
-
rr5
*
ddsc5_1
*
(
sci3
*
scip4
+
scip3
*
sci4
));
...
...
@@ -4309,12 +4309,12 @@ RealOpenMM AmoebaReferenceGeneralizedKirkwoodMultipoleForce::calculateKirkwoodED
ftm2i1
-=
fdir1
-
findmp1
;
ftm2i2
-=
fdir2
-
findmp2
;
ftm2i3
-=
fdir3
-
findmp3
;
}
// now perform the torque calculation
// intermediate terms for torque between multipoles i and j
RealOpenMM
gti2
=
0.5
*
(
sci4
*
psc5
+
scip4
*
dsc5
)
*
rr5
;
RealOpenMM
gti3
=
0.5
*
(
sci3
*
psc5
+
scip3
*
dsc5
)
*
rr5
;
RealOpenMM
gti4
=
gfi4
;
...
...
@@ -4346,7 +4346,7 @@ RealOpenMM AmoebaReferenceGeneralizedKirkwoodMultipoleForce::calculateKirkwoodED
RealOpenMM
ttm3i3
=
-
rr3
*
(
dkxui3
*
psc3
+
dkxuip3
*
dsc3
)
*
0.5
+
gti3
*
dkxr3
-
gti4
*
((
uixqkr3
+
rxqkui3
)
*
psc5
+
(
uixqkrp3
+
rxqkuip3
)
*
dsc5
)
*
0.5
-
gti6
*
rxqkr3
;
// update force and torque
RealVec
force
,
torqueI
,
torqueJ
;
...
...
@@ -4610,7 +4610,7 @@ RealOpenMM AmoebaReferenceGeneralizedKirkwoodMultipoleForce::calculateKirkwoodED
+
gti3
*
dkxr3
-
gti4
*
((
uixqkr3
+
rxqkui3
)
*
psc5
+
(
uixqkrp3
+
rxqkuip3
)
*
dsc5
)
*
0.5
-
gti6
*
rxqkr3
;
// update force and torque
// update force and torque
force
[
0
]
+=
ftm2i1
;
force
[
1
]
+=
ftm2i2
;
...
...
@@ -4635,13 +4635,13 @@ const RealOpenMM AmoebaReferencePmeMultipoleForce::SQRT_PI = 1.77245385091;
AmoebaReferencePmeMultipoleForce
::
AmoebaReferencePmeMultipoleForce
()
:
AmoebaReferenceMultipoleForce
(
PME
),
_cutoffDistance
(
1.0
),
_cutoffDistanceSquared
(
1.0
),
_pmeGridSize
(
0
),
_totalGridSize
(
0
),
_alphaEwald
(
0.0
)
_pmeGridSize
(
0
),
_totalGridSize
(
0
),
_alphaEwald
(
0.0
)
{
_fftplan
=
NULL
;
_pmeGrid
=
NULL
;
_pmeGridDimensions
=
IntVec
(
-
1
,
-
1
,
-
1
);
}
}
AmoebaReferencePmeMultipoleForce
::~
AmoebaReferencePmeMultipoleForce
()
{
...
...
@@ -4652,19 +4652,19 @@ AmoebaReferencePmeMultipoleForce::~AmoebaReferencePmeMultipoleForce()
delete
_pmeGrid
;
}
};
RealOpenMM
AmoebaReferencePmeMultipoleForce
::
getCutoffDistance
()
const
RealOpenMM
AmoebaReferencePmeMultipoleForce
::
getCutoffDistance
()
const
{
return
_cutoffDistance
;
};
void
AmoebaReferencePmeMultipoleForce
::
setCutoffDistance
(
RealOpenMM
cutoffDistance
)
{
_cutoffDistance
=
cutoffDistance
;
_cutoffDistanceSquared
=
cutoffDistance
*
cutoffDistance
;
};
RealOpenMM
AmoebaReferencePmeMultipoleForce
::
getAlphaEwald
()
const
RealOpenMM
AmoebaReferencePmeMultipoleForce
::
getAlphaEwald
()
const
{
return
_alphaEwald
;
};
...
...
@@ -4674,7 +4674,7 @@ void AmoebaReferencePmeMultipoleForce::setAlphaEwald(RealOpenMM alphaEwald)
_alphaEwald
=
alphaEwald
;
};
void
AmoebaReferencePmeMultipoleForce
::
getPmeGridDimensions
(
vector
<
int
>&
pmeGridDimensions
)
const
void
AmoebaReferencePmeMultipoleForce
::
getPmeGridDimensions
(
vector
<
int
>&
pmeGridDimensions
)
const
{
pmeGridDimensions
.
resize
(
3
);
...
...
@@ -4687,7 +4687,7 @@ void AmoebaReferencePmeMultipoleForce::getPmeGridDimensions(vector<int>& pmeGrid
void
AmoebaReferencePmeMultipoleForce
::
setPmeGridDimensions
(
vector
<
int
>&
pmeGridDimensions
)
{
if
((
pmeGridDimensions
[
0
]
==
_pmeGridDimensions
[
0
])
&&
if
((
pmeGridDimensions
[
0
]
==
_pmeGridDimensions
[
0
])
&&
(
pmeGridDimensions
[
1
]
==
_pmeGridDimensions
[
1
])
&&
(
pmeGridDimensions
[
2
]
==
_pmeGridDimensions
[
2
]))
return
;
...
...
@@ -4761,9 +4761,9 @@ void AmoebaReferencePmeMultipoleForce::initializePmeGrid()
for
(
int
jj
=
0
;
jj
<
_totalGridSize
;
jj
++
)
{
_pmeGrid
[
jj
].
re
=
_pmeGrid
[
jj
].
im
=
0.0
;
}
}
}
void
AmoebaReferencePmeMultipoleForce
::
getPeriodicDelta
(
RealVec
&
deltaR
)
const
void
AmoebaReferencePmeMultipoleForce
::
getPeriodicDelta
(
RealVec
&
deltaR
)
const
{
deltaR
-=
_periodicBoxVectors
[
2
]
*
FLOOR
(
deltaR
[
2
]
*
_recipBoxVectors
[
2
][
2
]
+
0.5
);
deltaR
-=
_periodicBoxVectors
[
1
]
*
FLOOR
(
deltaR
[
1
]
*
_recipBoxVectors
[
1
][
1
]
+
0.5
);
...
...
@@ -4773,8 +4773,8 @@ void AmoebaReferencePmeMultipoleForce::getPeriodicDelta(RealVec& deltaR) const
void
AmoebaReferencePmeMultipoleForce
::
getDampedInverseDistances
(
const
MultipoleParticleData
&
particleI
,
const
MultipoleParticleData
&
particleJ
,
RealOpenMM
dscale
,
RealOpenMM
pscale
,
RealOpenMM
r
,
RealVec
&
dampedDInverseDistances
,
RealVec
&
dampedPInverseDistances
)
const
RealVec
&
dampedDInverseDistances
,
RealVec
&
dampedPInverseDistances
)
const
{
RealVec
scaleFactor
=
RealVec
(
1.0
,
1.0
,
1.0
);
...
...
@@ -4792,8 +4792,8 @@ void AmoebaReferencePmeMultipoleForce::getDampedInverseDistances(const Multipole
scaleFactor
[
0
]
=
1.0
-
expdamp
;
scaleFactor
[
1
]
=
1.0
-
expdamp
*
(
1.0
-
damp
);
scaleFactor
[
2
]
=
1.0
-
expdamp
*
(
1.0
-
damp
+
(
0.6
f
*
damp
*
damp
));
}
}
}
}
RealVec
dampedDScale
=
scaleFactor
*
dscale
;
RealOpenMM
r2
=
r
*
r
;
...
...
@@ -4808,7 +4808,7 @@ void AmoebaReferencePmeMultipoleForce::getDampedInverseDistances(const Multipole
dampedPInverseDistances
=
dampedDInverseDistances
;
}
else
{
RealVec
dampedPScale
=
scaleFactor
*
pscale
;
dampedPInverseDistances
[
0
]
=
(
1.0
-
dampedPScale
[
0
])
/
r3
;
dampedPInverseDistances
[
0
]
=
(
1.0
-
dampedPScale
[
0
])
/
r3
;
dampedPInverseDistances
[
1
]
=
3.0
*
(
1.0
-
dampedPScale
[
1
])
/
r5
;
dampedPInverseDistances
[
2
]
=
15.0
*
(
1.0
-
dampedPScale
[
2
])
/
r7
;
}
...
...
@@ -4976,7 +4976,7 @@ void AmoebaReferencePmeMultipoleForce::calculateFixedMultipoleFieldPairIxn(const
RealVec
qj
=
RealVec
(
qxJ
.
dot
(
deltaR
),
qyJ
.
dot
(
deltaR
),
qzJ
.
dot
(
deltaR
));
RealOpenMM
qjr
=
qj
.
dot
(
deltaR
);
RealVec
fim
=
qj
*
(
2.0
*
bn2
)
-
particleJ
.
dipole
*
bn1
-
deltaR
*
(
bn1
*
particleJ
.
charge
-
bn2
*
djr
+
bn3
*
qjr
);
RealVec
fjm
=
qi
*
(
-
2.0
*
bn2
)
-
particleI
.
dipole
*
bn1
+
deltaR
*
(
bn1
*
particleI
.
charge
+
bn2
*
dir
+
bn3
*
qir
);
...
...
@@ -5105,7 +5105,7 @@ void AmoebaReferencePmeMultipoleForce::computeBSplinePoint(vector<RealOpenMM4>&
/**
* Compute b-spline coefficients.
*/
void
AmoebaReferencePmeMultipoleForce
::
computeAmoebaBsplines
(
const
vector
<
MultipoleParticleData
>&
particleData
)
void
AmoebaReferencePmeMultipoleForce
::
computeAmoebaBsplines
(
const
vector
<
MultipoleParticleData
>&
particleData
)
{
// get the B-spline coefficients for each multipole site
...
...
@@ -5127,7 +5127,7 @@ void AmoebaReferencePmeMultipoleForce::computeAmoebaBsplines(const vector<Multip
_thetai
[
jj
][
ii
*
AMOEBA_PME_ORDER
+
kk
]
=
thetaiTemp
[
kk
];
}
}
// Record the grid point.
_iGrid
[
ii
]
=
igrid
;
...
...
@@ -5136,7 +5136,7 @@ void AmoebaReferencePmeMultipoleForce::computeAmoebaBsplines(const vector<Multip
void
AmoebaReferencePmeMultipoleForce
::
transformMultipolesToFractionalCoordinates
(
const
vector
<
MultipoleParticleData
>&
particleData
)
{
// Build matrices for transforming the dipoles and quadrupoles.
RealVec
a
[
3
];
for
(
int
i
=
0
;
i
<
3
;
i
++
)
for
(
int
j
=
0
;
j
<
3
;
j
++
)
...
...
@@ -5172,7 +5172,7 @@ void AmoebaReferencePmeMultipoleForce::transformMultipolesToFractionalCoordinate
void
AmoebaReferencePmeMultipoleForce
::
transformPotentialToCartesianCoordinates
(
const
vector
<
RealOpenMM
>&
fphi
,
vector
<
RealOpenMM
>&
cphi
)
const
{
// Build a matrix for transforming the potential.
RealVec
a
[
3
];
for
(
int
i
=
0
;
i
<
3
;
i
++
)
for
(
int
j
=
0
;
j
<
3
;
j
++
)
...
...
@@ -5194,9 +5194,9 @@ void AmoebaReferencePmeMultipoleForce::transformPotentialToCartesianCoordinates(
b
[
i
][
j
]
+=
a
[
index1
[
i
]][
index2
[
j
]]
*
a
[
index2
[
i
]][
index1
[
j
]];
}
}
// Transform the potential.
for
(
int
i
=
0
;
i
<
_numParticles
;
i
++
)
{
cphi
[
10
*
i
]
=
fphi
[
20
*
i
];
cphi
[
10
*
i
+
1
]
=
a
[
0
][
0
]
*
fphi
[
20
*
i
+
1
]
+
a
[
0
][
1
]
*
fphi
[
20
*
i
+
2
]
+
a
[
0
][
2
]
*
fphi
[
20
*
i
+
3
];
...
...
@@ -5210,18 +5210,18 @@ void AmoebaReferencePmeMultipoleForce::transformPotentialToCartesianCoordinates(
}
}
void
AmoebaReferencePmeMultipoleForce
::
spreadFixedMultipolesOntoGrid
(
const
vector
<
MultipoleParticleData
>&
particleData
)
void
AmoebaReferencePmeMultipoleForce
::
spreadFixedMultipolesOntoGrid
(
const
vector
<
MultipoleParticleData
>&
particleData
)
{
transformMultipolesToFractionalCoordinates
(
particleData
);
// Clear the grid.
for
(
int
gridIndex
=
0
;
gridIndex
<
_totalGridSize
;
gridIndex
++
)
_pmeGrid
[
gridIndex
]
=
t_complex
(
0
,
0
);
// Loop over atoms and spread them on the grid.
for
(
int
atomIndex
=
0
;
atomIndex
<
_numParticles
;
atomIndex
++
)
{
RealOpenMM
atomCharge
=
_transformed
[
atomIndex
].
charge
;
RealVec
atomDipole
=
RealVec
(
_transformed
[
atomIndex
].
dipole
[
0
],
...
...
@@ -5405,19 +5405,19 @@ void AmoebaReferencePmeMultipoleForce::computeFixedPotentialFromGrid()
void
AmoebaReferencePmeMultipoleForce
::
spreadInducedDipolesOnGrid
(
const
vector
<
RealVec
>&
inputInducedDipole
,
const
vector
<
RealVec
>&
inputInducedDipolePolar
)
{
// Create the matrix to convert from Cartesian to fractional coordinates.
RealVec
cartToFrac
[
3
];
for
(
int
i
=
0
;
i
<
3
;
i
++
)
for
(
int
j
=
0
;
j
<
3
;
j
++
)
cartToFrac
[
j
][
i
]
=
_pmeGridDimensions
[
j
]
*
_recipBoxVectors
[
i
][
j
];
// Clear the grid.
for
(
int
gridIndex
=
0
;
gridIndex
<
_totalGridSize
;
gridIndex
++
)
_pmeGrid
[
gridIndex
]
=
t_complex
(
0
,
0
);
// Loop over atoms and spread them on the grid.
for
(
int
atomIndex
=
0
;
atomIndex
<
_numParticles
;
atomIndex
++
)
{
RealVec
inducedDipole
=
RealVec
(
inputInducedDipole
[
atomIndex
][
0
]
*
cartToFrac
[
0
][
0
]
+
inputInducedDipole
[
atomIndex
][
1
]
*
cartToFrac
[
0
][
1
]
+
inputInducedDipole
[
atomIndex
][
2
]
*
cartToFrac
[
0
][
2
],
inputInducedDipole
[
atomIndex
][
0
]
*
cartToFrac
[
1
][
0
]
+
inputInducedDipole
[
atomIndex
][
1
]
*
cartToFrac
[
1
][
1
]
+
inputInducedDipole
[
atomIndex
][
2
]
*
cartToFrac
[
1
][
2
],
...
...
@@ -5432,7 +5432,7 @@ void AmoebaReferencePmeMultipoleForce::spreadInducedDipolesOnGrid(const vector<R
int
y
=
(
gridPoint
[
1
]
+
iy
)
%
_pmeGridDimensions
[
1
];
for
(
int
iz
=
0
;
iz
<
AMOEBA_PME_ORDER
;
iz
++
)
{
int
z
=
(
gridPoint
[
2
]
+
iz
)
%
_pmeGridDimensions
[
2
];
RealOpenMM4
t
=
_thetai
[
0
][
atomIndex
*
AMOEBA_PME_ORDER
+
ix
];
RealOpenMM4
u
=
_thetai
[
1
][
atomIndex
*
AMOEBA_PME_ORDER
+
iy
];
RealOpenMM4
v
=
_thetai
[
2
][
atomIndex
*
AMOEBA_PME_ORDER
+
iz
];
...
...
@@ -5654,7 +5654,7 @@ void AmoebaReferencePmeMultipoleForce::computeInducedPotentialFromGrid()
}
RealOpenMM
AmoebaReferencePmeMultipoleForce
::
computeReciprocalSpaceFixedMultipoleForceAndEnergy
(
const
vector
<
MultipoleParticleData
>&
particleData
,
vector
<
RealVec
>&
forces
,
vector
<
RealVec
>&
torques
)
const
vector
<
RealVec
>&
forces
,
vector
<
RealVec
>&
torques
)
const
{
RealOpenMM
multipole
[
10
];
const
int
deriv1
[]
=
{
1
,
4
,
7
,
8
,
10
,
15
,
17
,
13
,
14
,
19
};
...
...
@@ -5734,7 +5734,7 @@ RealOpenMM AmoebaReferencePmeMultipoleForce::computeReciprocalSpaceFixedMultipol
*/
RealOpenMM
AmoebaReferencePmeMultipoleForce
::
computeReciprocalSpaceInducedDipoleForceAndEnergy
(
AmoebaReferenceMultipoleForce
::
PolarizationType
polarizationType
,
const
vector
<
MultipoleParticleData
>&
particleData
,
vector
<
RealVec
>&
forces
,
vector
<
RealVec
>&
torques
)
const
vector
<
RealVec
>&
forces
,
vector
<
RealVec
>&
torques
)
const
{
RealOpenMM
multipole
[
10
];
...
...
@@ -5820,7 +5820,7 @@ RealOpenMM AmoebaReferencePmeMultipoleForce::computeReciprocalSpaceInducedDipole
f
[
0
]
+=
(
inducedDipole
[
k
]
+
inducedDipolePolar
[
k
])
*
_phi
[
20
*
i
+
j1
];
f
[
1
]
+=
(
inducedDipole
[
k
]
+
inducedDipolePolar
[
k
])
*
_phi
[
20
*
i
+
j2
];
f
[
2
]
+=
(
inducedDipole
[
k
]
+
inducedDipolePolar
[
k
])
*
_phi
[
20
*
i
+
j3
];
if
(
polarizationType
==
AmoebaReferenceMultipoleForce
::
Mutual
)
{
f
[
0
]
+=
(
inducedDipole
[
k
]
*
_phip
[
10
*
i
+
j1
]
+
inducedDipolePolar
[
k
]
*
_phid
[
10
*
i
+
j1
]);
...
...
@@ -5899,13 +5899,13 @@ void AmoebaReferencePmeMultipoleForce::calculateInducedDipoleFields(const vector
vector
<
UpdateInducedDipoleFieldStruct
>&
updateInducedDipoleFields
)
{
// Initialize the fields to zero.
RealVec
zeroVec
(
0.0
,
0.0
,
0.0
);
for
(
unsigned
int
ii
=
0
;
ii
<
updateInducedDipoleFields
.
size
();
ii
++
)
std
::
fill
(
updateInducedDipoleFields
[
ii
].
inducedDipoleField
.
begin
(),
updateInducedDipoleFields
[
ii
].
inducedDipoleField
.
end
(),
zeroVec
);
// Add fields from direct space interactions.
for
(
unsigned
int
ii
=
0
;
ii
<
particleData
.
size
();
ii
++
)
{
for
(
unsigned
int
jj
=
ii
+
1
;
jj
<
particleData
.
size
();
jj
++
)
{
calculateDirectInducedDipolePairIxns
(
particleData
[
ii
],
particleData
[
jj
],
updateInducedDipoleFields
);
...
...
@@ -5916,7 +5916,7 @@ void AmoebaReferencePmeMultipoleForce::calculateInducedDipoleFields(const vector
calculateReciprocalSpaceInducedDipoleField
(
updateInducedDipoleFields
);
// self ixn
// self ixn
RealOpenMM
term
=
(
4.0
/
3.0
)
*
(
_alphaEwald
*
_alphaEwald
*
_alphaEwald
)
/
SQRT_PI
;
for
(
unsigned
int
ii
=
0
;
ii
<
updateInducedDipoleFields
.
size
();
ii
++
)
{
...
...
@@ -5924,7 +5924,7 @@ void AmoebaReferencePmeMultipoleForce::calculateInducedDipoleFields(const vector
vector
<
RealVec
>&
field
=
updateInducedDipoleFields
[
ii
].
inducedDipoleField
;
for
(
unsigned
int
jj
=
0
;
jj
<
particleData
.
size
();
jj
++
)
{
field
[
jj
]
+=
inducedDipoles
[
jj
]
*
term
;
}
}
}
}
...
...
@@ -5932,7 +5932,7 @@ void AmoebaReferencePmeMultipoleForce::calculateDirectInducedDipolePairIxn(unsig
RealOpenMM
preFactor1
,
RealOpenMM
preFactor2
,
const
RealVec
&
delta
,
const
vector
<
RealVec
>&
inducedDipole
,
vector
<
RealVec
>&
field
)
const
vector
<
RealVec
>&
field
)
const
{
// field at i due induced dipole at j
...
...
@@ -5952,7 +5952,7 @@ void AmoebaReferencePmeMultipoleForce::calculateDirectInducedDipolePairIxns(cons
{
// compute the real space portion of the Ewald summation
RealOpenMM
uscale
=
1.0
;
RealVec
deltaR
=
particleJ
.
position
-
particleI
.
position
;
...
...
@@ -6013,10 +6013,10 @@ void AmoebaReferencePmeMultipoleForce::calculateDirectInducedDipolePairIxns(cons
calculateDirectInducedDipolePairIxn
(
particleI
.
particleIndex
,
particleJ
.
particleIndex
,
preFactor1
,
preFactor2
,
deltaR
,
*
updateInducedDipoleFields
[
ii
].
inducedDipoles
,
updateInducedDipoleFields
[
ii
].
inducedDipoleField
);
}
}
}
RealOpenMM
AmoebaReferencePmeMultipoleForce
::
calculatePmeSelfEnergy
(
const
vector
<
MultipoleParticleData
>&
particleData
)
const
RealOpenMM
AmoebaReferencePmeMultipoleForce
::
calculatePmeSelfEnergy
(
const
vector
<
MultipoleParticleData
>&
particleData
)
const
{
RealOpenMM
cii
=
0.0
;
RealOpenMM
dii
=
0.0
;
...
...
@@ -6044,7 +6044,7 @@ RealOpenMM AmoebaReferencePmeMultipoleForce::calculatePmeSelfEnergy(const vector
}
void
AmoebaReferencePmeMultipoleForce
::
calculatePmeSelfTorque
(
const
vector
<
MultipoleParticleData
>&
particleData
,
vector
<
RealVec
>&
torques
)
const
vector
<
RealVec
>&
torques
)
const
{
RealOpenMM
term
=
(
2.0
/
3.0
)
*
(
_electric
/
_dielectric
)
*
(
_alphaEwald
*
_alphaEwald
*
_alphaEwald
)
/
SQRT_PI
;
for
(
unsigned
int
ii
=
0
;
ii
<
_numParticles
;
ii
++
)
{
...
...
@@ -6058,11 +6058,11 @@ void AmoebaReferencePmeMultipoleForce::calculatePmeSelfTorque(const vector<Multi
}
}
RealOpenMM
AmoebaReferencePmeMultipoleForce
::
calculatePmeDirectElectrostaticPairIxn
(
const
MultipoleParticleData
&
particleI
,
RealOpenMM
AmoebaReferencePmeMultipoleForce
::
calculatePmeDirectElectrostaticPairIxn
(
const
MultipoleParticleData
&
particleI
,
const
MultipoleParticleData
&
particleJ
,
const
vector
<
RealOpenMM
>&
scalingFactors
,
vector
<
RealVec
>&
forces
,
vector
<
RealVec
>&
torques
)
const
vector
<
RealVec
>&
torques
)
const
{
unsigned
int
iIndex
=
particleI
.
particleIndex
;
...
...
@@ -6483,7 +6483,7 @@ RealOpenMM AmoebaReferencePmeMultipoleForce::calculateElectrostatic(const vector
vector
<
RealOpenMM
>
scaleFactors
(
LAST_SCALE_TYPE_INDEX
);
for
(
unsigned
int
kk
=
0
;
kk
<
scaleFactors
.
size
();
kk
++
)
{
scaleFactors
[
kk
]
=
1.0
;
}
}
// loop over particle pairs for direct space interactions
...
...
@@ -6508,6 +6508,6 @@ RealOpenMM AmoebaReferencePmeMultipoleForce::calculateElectrostatic(const vector
energy
+=
computeReciprocalSpaceInducedDipoleForceAndEnergy
(
getPolarizationType
(),
particleData
,
forces
,
torques
);
energy
+=
computeReciprocalSpaceFixedMultipoleForceAndEnergy
(
particleData
,
forces
,
torques
);
energy
+=
calculatePmeSelfEnergy
(
particleData
);
return
energy
;
}
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