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
1589d425
"libraries/lepton/vscode:/vscode.git/clone" did not exist on "4c19a4019b369e33b7b686290de9d3791ec02b4a"
Commit
1589d425
authored
Dec 16, 2015
by
Peter Eastman
Browse files
Further cleanup to extrapolated polarization
parent
cd03350c
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
48 additions
and
67 deletions
+48
-67
plugins/amoeba/platforms/reference/src/SimTKReference/AmoebaReferenceMultipoleForce.cpp
...ence/src/SimTKReference/AmoebaReferenceMultipoleForce.cpp
+39
-64
plugins/amoeba/platforms/reference/src/SimTKReference/AmoebaReferenceMultipoleForce.h
...erence/src/SimTKReference/AmoebaReferenceMultipoleForce.h
+9
-3
No files found.
plugins/amoeba/platforms/reference/src/SimTKReference/AmoebaReferenceMultipoleForce.cpp
View file @
1589d425
...
@@ -959,75 +959,50 @@ void AmoebaReferenceMultipoleForce::convergeInduceDipolesBySOR(const vector<Mult
...
@@ -959,75 +959,50 @@ void AmoebaReferenceMultipoleForce::convergeInduceDipolesBySOR(const vector<Mult
void AmoebaReferenceMultipoleForce::convergeInduceDipolesByExtrapolation(const vector<MultipoleParticleData>& particleData, vector<UpdateInducedDipoleFieldStruct>& updateInducedDipoleField) {
void AmoebaReferenceMultipoleForce::convergeInduceDipolesByExtrapolation(const vector<MultipoleParticleData>& particleData, vector<UpdateInducedDipoleFieldStruct>& updateInducedDipoleField) {
_ptDipoleD.clear();
_ptDipoleP.clear();
UpdateInducedDipoleFieldStruct& fieldD = updateInducedDipoleField[0];
UpdateInducedDipoleFieldStruct& fieldP = updateInducedDipoleField[1];
// Start by storing the direct dipoles as PT0
// Start by storing the direct dipoles as PT0
vector<RealVec> thisDipoleD;
vector<RealVec> thisDipoleP;
for (int atom = 0; atom < _numParticles; ++atom) {
thisDipoleD.push_back((*fieldD.inducedDipoles)[atom]);
thisDipoleP.push_back((*fieldP.inducedDipoles)[atom]);
}
_ptDipoleD.push_back(thisDipoleD);
_ptDipoleP.push_back(thisDipoleP);
// Make sure there is some storage available for the field derivatives
int numFields = updateInducedDipoleField.size();
std::vector<RealOpenMM> zeros(6, 0.0);
for (int i = 0; i < numFields; i++) {
fieldD.inducedDipoleFieldGradient.resize(_numParticles);
UpdateInducedDipoleFieldStruct& field = updateInducedDipoleField[i];
fieldP.inducedDipoleFieldGradient.resize(_numParticles);
field.extrapolatedDipoles->resize(_maxPTOrder);
(*field.extrapolatedDipoles)[0].resize(_numParticles);
for (int atom = 0; atom < _numParticles; ++atom)
(*field.extrapolatedDipoles)[0][atom] = (*field.inducedDipoles)[atom];
field.inducedDipoleFieldGradient.resize(_numParticles);
}
// Recursively apply alpha.Tau to the µ_(n) components to generate µ_(n+1), and store the result
// Recursively apply alpha.Tau to the µ_(n) components to generate µ_(n+1), and store the result
vector<RealOpenMM> zeros(6, 0.0);
for (int order = 1; order < _maxPTOrder; ++order) {
for (int order = 1; order < _maxPTOrder; ++order) {
std::fill(fieldD.inducedDipoleFieldGradient.begin(), fieldD.inducedDipoleFieldGradient.end(), zeros);
for (int i = 0; i < numFields; i++)
std::fill(
f
ield
P
.inducedDipoleFieldGradient.begin(),
f
ield
P
.inducedDipoleFieldGradient.end(), zeros);
std::fill(
updateInducedDipoleF
ield
[i]
.inducedDipoleFieldGradient.begin(),
updateInducedDipoleF
ield
[i]
.inducedDipoleFieldGradient.end(), zeros);
calculateInducedDipoleFields(particleData, updateInducedDipoleField);
calculateInducedDipoleFields(particleData, updateInducedDipoleField);
vector<RealVec> thisDipoleD;
for (int i = 0; i < numFields; i++) {
vector<RealVec> thisDipoleP;
UpdateInducedDipoleFieldStruct& field = updateInducedDipoleField[i];
for (int atom = 0; atom < _numParticles; ++atom) {
(*field.extrapolatedDipoles)[order].resize(_numParticles);
(*fieldD.inducedDipoles)[atom] = fieldD.inducedDipoleField[atom] * particleData[atom].polarity;
(*fieldP.inducedDipoles)[atom] = fieldP.inducedDipoleField[atom] * particleData[atom].polarity;
thisDipoleD.push_back((*fieldD.inducedDipoles)[atom]);
thisDipoleP.push_back((*fieldP.inducedDipoles)[atom]);
}
_ptDipoleD.push_back(thisDipoleD);
_ptDipoleP.push_back(thisDipoleP);
vector<RealOpenMM> fieldGradD(6*_numParticles, 0.0);
vector<RealOpenMM> fieldGradP(6*_numParticles, 0.0);
for (int atom = 0; atom < _numParticles; ++atom) {
for (int atom = 0; atom < _numParticles; ++atom) {
for (int component = 0; component < 6; ++component) {
(*field.inducedDipoles)[atom] = field.inducedDipoleField[atom] * particleData[atom].polarity;
fieldGradD[6*atom + component] = fieldD.inducedDipoleFieldGradient[atom][component];
(*field.extrapolatedDipoles)[order][atom] = (*field.inducedDipoles)[atom];
fieldGradP[6*atom + component] = fieldP.inducedDipoleFieldGradient[atom][component];
}
}
vector<RealOpenMM> fieldGrad(6*_numParticles, 0.0);
for (int atom = 0; atom < _numParticles; ++atom)
for (int component = 0; component < 6; ++component)
fieldGrad[6*atom + component] = field.inducedDipoleFieldGradient[atom][component];
field.extrapolatedDipoleFieldGradient->push_back(fieldGrad);
}
}
_ptDipoleFieldGradientD.push_back(fieldGradD);
_ptDipoleFieldGradientP.push_back(fieldGradP);
}
}
// Take a linear combination of the µ_(n) components to form the total dipole
// Take a linear combination of the µ_(n) components to form the total dipole
RealVec zeroVec(0.0, 0.0, 0.0);
std::fill(_inducedDipole.begin(), _inducedDipole.end(), zeroVec);
std::fill(_inducedDipolePolar.begin(), _inducedDipolePolar.end(), zeroVec);
for (int order = 0; order < _maxPTOrder; ++order) {
for (int atom = 0; atom < _numParticles; ++atom) {
_inducedDipole[atom] += _ptDipoleD[order][atom] * _extPartCoefficients[order];
_inducedDipolePolar[atom] += _ptDipoleP[order][atom] * _extPartCoefficients[order];
}
}
// Copy the combined dipoles over to compute the field
for (int i = 0; i < numFields; i++) {
for (int order = 0; order < _maxPTOrder; ++order) {
UpdateInducedDipoleFieldStruct& field = updateInducedDipoleField[i];
for (int atom = 0; atom < _numParticles; ++atom) {
*field.inducedDipoles = vector<RealVec>(_numParticles, RealVec());
(*fieldD.inducedDipoles)[atom] = _inducedDipole[atom];
for (int order = 0; order < _maxPTOrder; ++order)
(*fieldP.inducedDipoles)[atom] = _inducedDipolePolar[
atom
];
for (int atom = 0; atom < _numParticles; ++
atom
)
}
(*field.inducedDipoles)[atom] += (*field.extrapolatedDipoles)[order][atom] * _extPartCoefficients[order];
}
}
calculateInducedDipoleFields(particleData, updateInducedDipoleField);
calculateInducedDipoleFields(particleData, updateInducedDipoleField);
setMutualInducedDipoleConverged(true);
setMutualInducedDipoleConverged(true);
}
}
...
@@ -1158,8 +1133,8 @@ void AmoebaReferenceMultipoleForce::calculateInducedDipoles(const vector<Multipo
...
@@ -1158,8 +1133,8 @@ void AmoebaReferenceMultipoleForce::calculateInducedDipoles(const vector<Multipo
_inducedDipole.resize(_numParticles);
_inducedDipole.resize(_numParticles);
_inducedDipolePolar.resize(_numParticles);
_inducedDipolePolar.resize(_numParticles);
vector<UpdateInducedDipoleFieldStruct> updateInducedDipoleField;
vector<UpdateInducedDipoleFieldStruct> updateInducedDipoleField;
updateInducedDipoleField.push_back(UpdateInducedDipoleFieldStruct(_fixedMultipoleField,
_inducedDipole));
updateInducedDipoleField.push_back(UpdateInducedDipoleFieldStruct(_fixedMultipoleField, _inducedDipole
, _ptDipoleD, _ptDipoleFieldGradientD
));
updateInducedDipoleField.push_back(UpdateInducedDipoleFieldStruct(_fixedMultipoleFieldPolar,
_inducedDipolePolar));
updateInducedDipoleField.push_back(UpdateInducedDipoleFieldStruct(_fixedMultipoleFieldPolar, _inducedDipolePolar
, _ptDipoleP, _ptDipoleFieldGradientP
));
initializeInducedDipoles(updateInducedDipoleField);
initializeInducedDipoles(updateInducedDipoleField);
...
@@ -2156,8 +2131,8 @@ void AmoebaReferenceMultipoleForce::calculateElectrostaticPotential(const vector
...
@@ -2156,8 +2131,8 @@ void AmoebaReferenceMultipoleForce::calculateElectrostaticPotential(const vector
}
}
}
}
AmoebaReferenceMultipoleForce::UpdateInducedDipoleFieldStruct::UpdateInducedDipoleFieldStruct(vector<OpenMM::RealVec>& inputFixed_E_Field, vector<OpenMM::RealVec>& inputInducedDipoles) :
AmoebaReferenceMultipoleForce::UpdateInducedDipoleFieldStruct::UpdateInducedDipoleFieldStruct(vector<OpenMM::RealVec>& inputFixed_E_Field, vector<OpenMM::RealVec>& inputInducedDipoles
, vector<vector<RealVec> >& extrapolatedDipoles, vector<vector<RealOpenMM> >& extrapolatedDipoleFieldGradient
) :
fixedMultipoleField(&inputFixed_E_Field), inducedDipoles(&inputInducedDipoles) {
fixedMultipoleField(&inputFixed_E_Field), inducedDipoles(&inputInducedDipoles)
, extrapolatedDipoles(&extrapolatedDipoles), extrapolatedDipoleFieldGradient(&extrapolatedDipoleFieldGradient)
{
inducedDipoleField.resize(fixedMultipoleField->size());
inducedDipoleField.resize(fixedMultipoleField->size());
}
}
...
@@ -2575,10 +2550,10 @@ void AmoebaReferenceGeneralizedKirkwoodMultipoleForce::calculateInducedDipoles(c
...
@@ -2575,10 +2550,10 @@ void AmoebaReferenceGeneralizedKirkwoodMultipoleForce::calculateInducedDipoles(c
}
}
vector<UpdateInducedDipoleFieldStruct> updateInducedDipoleField;
vector<UpdateInducedDipoleFieldStruct> updateInducedDipoleField;
updateInducedDipoleField.push_back(UpdateInducedDipoleFieldStruct(_fixedMultipoleField,
_inducedDipole));
updateInducedDipoleField.push_back(UpdateInducedDipoleFieldStruct(_fixedMultipoleField, _inducedDipole
, _ptDipoleD, _ptDipoleFieldGradientD
));
updateInducedDipoleField.push_back(UpdateInducedDipoleFieldStruct(_fixedMultipoleFieldPolar,
_inducedDipolePolar));
updateInducedDipoleField.push_back(UpdateInducedDipoleFieldStruct(_fixedMultipoleFieldPolar, _inducedDipolePolar
, _ptDipoleP, _ptDipoleFieldGradientP
));
updateInducedDipoleField.push_back(UpdateInducedDipoleFieldStruct(_gkField,
_inducedDipoleS));
updateInducedDipoleField.push_back(UpdateInducedDipoleFieldStruct(_gkField, _inducedDipoleS
, _ptDipoleDS, _ptDipoleFieldGradientDS
));
updateInducedDipoleField.push_back(UpdateInducedDipoleFieldStruct(gkFieldPolar,
_inducedDipolePolarS));
updateInducedDipoleField.push_back(UpdateInducedDipoleFieldStruct(gkFieldPolar, _inducedDipolePolarS
, _ptDipolePS, _ptDipoleFieldGradientPS
));
convergeInduceDipolesByDIIS(particleData, updateInducedDipoleField);
convergeInduceDipolesByDIIS(particleData, updateInducedDipoleField);
}
}
...
...
plugins/amoeba/platforms/reference/src/SimTKReference/AmoebaReferenceMultipoleForce.h
View file @
1589d425
...
@@ -638,9 +638,11 @@ protected:
...
@@ -638,9 +638,11 @@ protected:
* Helper class used in calculating induced dipoles
* Helper class used in calculating induced dipoles
*/
*/
struct
UpdateInducedDipoleFieldStruct
{
struct
UpdateInducedDipoleFieldStruct
{
UpdateInducedDipoleFieldStruct
(
std
::
vector
<
OpenMM
::
RealVec
>&
inputFixed_E_Field
,
std
::
vector
<
OpenMM
::
RealVec
>&
inputInducedDipoles
);
UpdateInducedDipoleFieldStruct
(
std
::
vector
<
OpenMM
::
RealVec
>&
inputFixed_E_Field
,
std
::
vector
<
OpenMM
::
RealVec
>&
inputInducedDipoles
,
std
::
vector
<
std
::
vector
<
RealVec
>
>&
extrapolatedDipoles
,
std
::
vector
<
std
::
vector
<
RealOpenMM
>
>&
extrapolatedDipoleFieldGradient
);
std
::
vector
<
OpenMM
::
RealVec
>*
fixedMultipoleField
;
std
::
vector
<
OpenMM
::
RealVec
>*
fixedMultipoleField
;
std
::
vector
<
OpenMM
::
RealVec
>*
inducedDipoles
;
std
::
vector
<
OpenMM
::
RealVec
>*
inducedDipoles
;
std
::
vector
<
std
::
vector
<
RealVec
>
>*
extrapolatedDipoles
;
std
::
vector
<
std
::
vector
<
RealOpenMM
>
>*
extrapolatedDipoleFieldGradient
;
std
::
vector
<
OpenMM
::
RealVec
>
inducedDipoleField
;
std
::
vector
<
OpenMM
::
RealVec
>
inducedDipoleField
;
std
::
vector
<
std
::
vector
<
RealOpenMM
>
>
inducedDipoleFieldGradient
;
std
::
vector
<
std
::
vector
<
RealOpenMM
>
>
inducedDipoleFieldGradient
;
};
};
...
@@ -666,8 +668,8 @@ protected:
...
@@ -666,8 +668,8 @@ protected:
std
::
vector
<
RealVec
>
_fixedMultipoleFieldPolar
;
std
::
vector
<
RealVec
>
_fixedMultipoleFieldPolar
;
std
::
vector
<
RealVec
>
_inducedDipole
;
std
::
vector
<
RealVec
>
_inducedDipole
;
std
::
vector
<
RealVec
>
_inducedDipolePolar
;
std
::
vector
<
RealVec
>
_inducedDipolePolar
;
std
::
vector
<
std
::
vector
<
RealVec
>
>
_ptDipoleP
;
std
::
vector
<
std
::
vector
<
RealVec
>
>
_ptDipoleP
;
std
::
vector
<
std
::
vector
<
RealVec
>
>
_ptDipoleD
;
std
::
vector
<
std
::
vector
<
RealVec
>
>
_ptDipoleD
;
std
::
vector
<
std
::
vector
<
RealOpenMM
>
>
_ptDipoleFieldGradientP
;
std
::
vector
<
std
::
vector
<
RealOpenMM
>
>
_ptDipoleFieldGradientP
;
std
::
vector
<
std
::
vector
<
RealOpenMM
>
>
_ptDipoleFieldGradientD
;
std
::
vector
<
std
::
vector
<
RealOpenMM
>
>
_ptDipoleFieldGradientD
;
...
@@ -1223,6 +1225,10 @@ private:
...
@@ -1223,6 +1225,10 @@ private:
std
::
vector
<
RealVec
>
_gkField
;
std
::
vector
<
RealVec
>
_gkField
;
std
::
vector
<
RealVec
>
_inducedDipoleS
;
std
::
vector
<
RealVec
>
_inducedDipoleS
;
std
::
vector
<
RealVec
>
_inducedDipolePolarS
;
std
::
vector
<
RealVec
>
_inducedDipolePolarS
;
std
::
vector
<
std
::
vector
<
RealVec
>
>
_ptDipolePS
;
std
::
vector
<
std
::
vector
<
RealVec
>
>
_ptDipoleDS
;
std
::
vector
<
std
::
vector
<
RealOpenMM
>
>
_ptDipoleFieldGradientPS
;
std
::
vector
<
std
::
vector
<
RealOpenMM
>
>
_ptDipoleFieldGradientDS
;
int
_includeCavityTerm
;
int
_includeCavityTerm
;
RealOpenMM
_probeRadius
;
RealOpenMM
_probeRadius
;
...
...
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