Commit 82d0ec38 authored by Mark Friedrichs's avatar Mark Friedrichs
Browse files

Added code Amoeba Reference platform to handle polarization type = direct

parent 06089c9a
...@@ -445,6 +445,7 @@ double ReferenceCalcAmoebaTorsionTorsionForceKernel::execute(ContextImpl& contex ...@@ -445,6 +445,7 @@ double ReferenceCalcAmoebaTorsionTorsionForceKernel::execute(ContextImpl& contex
ReferenceCalcAmoebaMultipoleForceKernel::ReferenceCalcAmoebaMultipoleForceKernel(std::string name, const Platform& platform, System& system) : ReferenceCalcAmoebaMultipoleForceKernel::ReferenceCalcAmoebaMultipoleForceKernel(std::string name, const Platform& platform, System& system) :
CalcAmoebaMultipoleForceKernel(name, platform), system(system) { CalcAmoebaMultipoleForceKernel(name, platform), system(system) {
} }
ReferenceCalcAmoebaMultipoleForceKernel::~ReferenceCalcAmoebaMultipoleForceKernel() { ReferenceCalcAmoebaMultipoleForceKernel::~ReferenceCalcAmoebaMultipoleForceKernel() {
...@@ -521,6 +522,12 @@ void ReferenceCalcAmoebaMultipoleForceKernel::initialize(const System& system, c ...@@ -521,6 +522,12 @@ void ReferenceCalcAmoebaMultipoleForceKernel::initialize(const System& system, c
if( nonbondedMethod != 0 && nonbondedMethod != 1 ){ if( nonbondedMethod != 0 && nonbondedMethod != 1 ){
throw OpenMMException("AmoebaMultipoleForce nonbonded method not recognized.\n"); throw OpenMMException("AmoebaMultipoleForce nonbonded method not recognized.\n");
} }
polarizationType = static_cast<int>(force.getPolarizationType());
if( polarizationType != 0 && polarizationType != 1 ){
throw OpenMMException("AmoebaMultipoleForce polarization type not recognized.\n");
}
} }
double ReferenceCalcAmoebaMultipoleForceKernel::execute(ContextImpl& context, bool includeForces, bool includeEnergy) { double ReferenceCalcAmoebaMultipoleForceKernel::execute(ContextImpl& context, bool includeForces, bool includeEnergy) {
...@@ -535,7 +542,7 @@ double ReferenceCalcAmoebaMultipoleForceKernel::execute(ContextImpl& context, bo ...@@ -535,7 +542,7 @@ double ReferenceCalcAmoebaMultipoleForceKernel::execute(ContextImpl& context, bo
charges, dipoles, quadrupoles, tholes, charges, dipoles, quadrupoles, tholes,
dampingFactors, polarity, axisTypes, dampingFactors, polarity, axisTypes,
multipoleAtomZs, multipoleAtomXs, multipoleAtomYs, multipoleAtomZs, multipoleAtomXs, multipoleAtomYs,
multipoleAtomCovalentInfo, forceData); multipoleAtomCovalentInfo, polarizationType, forceData);
return static_cast<double>(energy); return static_cast<double>(energy);
} }
......
...@@ -386,6 +386,7 @@ public: ...@@ -386,6 +386,7 @@ public:
double execute(ContextImpl& context, bool includeForces, bool includeEnergy); double execute(ContextImpl& context, bool includeForces, bool includeEnergy);
private: private:
int numMultipoles; int numMultipoles;
int polarizationType;
std::vector<RealOpenMM> charges; std::vector<RealOpenMM> charges;
std::vector<RealOpenMM> dipoles; std::vector<RealOpenMM> dipoles;
std::vector<RealOpenMM> quadrupoles; std::vector<RealOpenMM> quadrupoles;
......
...@@ -945,7 +945,7 @@ void AmoebaReferenceMultipoleForce::updateInducedDipole( MultipoleParticleData& ...@@ -945,7 +945,7 @@ void AmoebaReferenceMultipoleForce::updateInducedDipole( MultipoleParticleData&
} }
} }
void AmoebaReferenceMultipoleForce::calculateNoCutoffInducedDipoles( std::vector<MultipoleParticleData>& particleData ){ void AmoebaReferenceMultipoleForce::calculateNoCutoffInducedDipoles( int polarizationType, std::vector<MultipoleParticleData>& particleData ){
// --------------------------------------------------------------------------------------- // ---------------------------------------------------------------------------------------
...@@ -984,6 +984,10 @@ void AmoebaReferenceMultipoleForce::calculateNoCutoffInducedDipoles( std::vector ...@@ -984,6 +984,10 @@ void AmoebaReferenceMultipoleForce::calculateNoCutoffInducedDipoles( std::vector
particleData[ii].inducedDipolePolar[2] = particleData[ii].fieldPolar[2]; particleData[ii].inducedDipolePolar[2] = particleData[ii].fieldPolar[2];
} }
if( polarizationType == 1 ){
return;
}
std::vector<RealOpenMM> field( numParticles*3 ); std::vector<RealOpenMM> field( numParticles*3 );
std::vector<RealOpenMM> fieldPolar( numParticles*3 ); std::vector<RealOpenMM> fieldPolar( numParticles*3 );
...@@ -1037,7 +1041,8 @@ void AmoebaReferenceMultipoleForce::calculateNoCutoffInducedDipoles( std::vector ...@@ -1037,7 +1041,8 @@ void AmoebaReferenceMultipoleForce::calculateNoCutoffInducedDipoles( std::vector
return; return;
} }
RealOpenMM AmoebaReferenceMultipoleForce::calculateNoCutoffElectrostaticPairIxn( const MultipoleParticleData& particleI, RealOpenMM AmoebaReferenceMultipoleForce::calculateNoCutoffElectrostaticPairIxn( int polarizationType,
const MultipoleParticleData& particleI,
const MultipoleParticleData& particleK, const MultipoleParticleData& particleK,
RealOpenMM* scalingFactors, std::vector<RealVec>& forces, RealOpenMM* scalingFactors, std::vector<RealVec>& forces,
std::vector<Vec3>& torque ) const { std::vector<Vec3>& torque ) const {
...@@ -1075,6 +1080,7 @@ RealOpenMM AmoebaReferenceMultipoleForce::calculateNoCutoffElectrostaticPairIxn( ...@@ -1075,6 +1080,7 @@ RealOpenMM AmoebaReferenceMultipoleForce::calculateNoCutoffElectrostaticPairIxn(
RealOpenMM gl[9],gli[7],glip[7]; RealOpenMM gl[9],gli[7],glip[7];
RealOpenMM sc[10],sci[8],scip[8]; RealOpenMM sc[10],sci[8],scip[8];
RealOpenMM gf[7],gfi[6],gti[6]; RealOpenMM gf[7],gfi[6],gti[6];
RealOpenMM gfd, fdir[3];
RealOpenMM delta[3]; RealOpenMM delta[3];
getDelta( particleI, particleK, delta ); getDelta( particleI, particleK, delta );
...@@ -1455,8 +1461,7 @@ RealOpenMM AmoebaReferenceMultipoleForce::calculateNoCutoffElectrostaticPairIxn( ...@@ -1455,8 +1461,7 @@ RealOpenMM AmoebaReferenceMultipoleForce::calculateNoCutoffElectrostaticPairIxn(
// correction to convert mutual to direct polarization force // correction to convert mutual to direct polarization force
/* if( polarizationType == 1 ){
if( poltyp .eq. 'DIRECT'){
gfd = 0.5 * (rr5*scip[1]*scale3i gfd = 0.5 * (rr5*scip[1]*scale3i
- rr7*(scip[2]*sci[3]+sci[2]*scip[3])*scale5i); - rr7*(scip[2]*sci[3]+sci[2]*scip[3])*scale5i);
temp5 = 0.5 * rr5 * scale5i; temp5 = 0.5 * rr5 * scale5i;
...@@ -1473,7 +1478,6 @@ RealOpenMM AmoebaReferenceMultipoleForce::calculateNoCutoffElectrostaticPairIxn( ...@@ -1473,7 +1478,6 @@ RealOpenMM AmoebaReferenceMultipoleForce::calculateNoCutoffElectrostaticPairIxn(
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];
} }
*/
// intermediate terms for induced torque on multipoles // intermediate terms for induced torque on multipoles
...@@ -1925,6 +1929,7 @@ RealOpenMM AmoebaReferenceMultipoleForce::calculateNoCutoffElectrostatic( std::v ...@@ -1925,6 +1929,7 @@ RealOpenMM AmoebaReferenceMultipoleForce::calculateNoCutoffElectrostatic( std::v
const std::vector<int>& multipoleAtomZs, const std::vector<int>& multipoleAtomZs,
const std::vector<int>& multipoleAtomXs, const std::vector<int>& multipoleAtomXs,
const std::vector<int>& multipoleAtomYs, const std::vector<int>& multipoleAtomYs,
int polarizationType,
std::vector<RealVec>& forces ) const { std::vector<RealVec>& forces ) const {
// --------------------------------------------------------------------------------------- // ---------------------------------------------------------------------------------------
...@@ -1977,7 +1982,7 @@ RealOpenMM AmoebaReferenceMultipoleForce::calculateNoCutoffElectrostatic( std::v ...@@ -1977,7 +1982,7 @@ RealOpenMM AmoebaReferenceMultipoleForce::calculateNoCutoffElectrostatic( std::v
getScaleFactors( ii, jj, scaleFactors); getScaleFactors( ii, jj, scaleFactors);
} }
energy += calculateNoCutoffElectrostaticPairIxn( particleData[ii], particleData[jj], scaleFactors, forces, torques ); energy += calculateNoCutoffElectrostaticPairIxn( polarizationType, particleData[ii], particleData[jj], scaleFactors, forces, torques );
if( jj <= _maxScaleIndex[ii] ){ if( jj <= _maxScaleIndex[ii] ){
for( unsigned int kk = 0; kk < LAST_SCALE_TYPE_INDEX; kk++ ){ for( unsigned int kk = 0; kk < LAST_SCALE_TYPE_INDEX; kk++ ){
...@@ -2049,6 +2054,7 @@ RealOpenMM AmoebaReferenceMultipoleForce::calculateNoCutoffForceAndEnergy( const ...@@ -2049,6 +2054,7 @@ RealOpenMM AmoebaReferenceMultipoleForce::calculateNoCutoffForceAndEnergy( const
const std::vector<int>& multipoleAtomZs, const std::vector<int>& multipoleAtomZs,
const std::vector<int>& multipoleAtomXs, const std::vector<int>& multipoleAtomXs,
const std::vector<int>& multipoleAtomYs, const std::vector<int>& multipoleAtomYs,
int polarizationType,
std::vector<RealVec>& forces ){ std::vector<RealVec>& forces ){
...@@ -2133,11 +2139,11 @@ RealOpenMM AmoebaReferenceMultipoleForce::calculateNoCutoffForceAndEnergy( const ...@@ -2133,11 +2139,11 @@ RealOpenMM AmoebaReferenceMultipoleForce::calculateNoCutoffForceAndEnergy( const
// get induced dipoles // get induced dipoles
calculateNoCutoffInducedDipoles( particleData ); calculateNoCutoffInducedDipoles( polarizationType, particleData );
// check if induced dipoles converged // check if induced dipoles converged
if( !getMutualInducedDipoleConverged() ){ if( !getMutualInducedDipoleConverged() && polarizationType == 0 ){
std::stringstream message; std::stringstream message;
message << "Induced dipoles did not converge: "; message << "Induced dipoles did not converge: ";
message << " iterations=" << getMutualInducedDipoleIterations(); message << " iterations=" << getMutualInducedDipoleIterations();
...@@ -2145,7 +2151,7 @@ RealOpenMM AmoebaReferenceMultipoleForce::calculateNoCutoffForceAndEnergy( const ...@@ -2145,7 +2151,7 @@ RealOpenMM AmoebaReferenceMultipoleForce::calculateNoCutoffForceAndEnergy( const
throw OpenMMException(message.str()); throw OpenMMException(message.str());
} }
RealOpenMM energy = calculateNoCutoffElectrostatic( particleData, axisTypes, multipoleAtomZs, multipoleAtomXs, multipoleAtomYs, forces ); RealOpenMM energy = calculateNoCutoffElectrostatic( particleData, axisTypes, multipoleAtomZs, multipoleAtomXs, multipoleAtomYs, polarizationType, forces );
return energy; return energy;
...@@ -2164,6 +2170,7 @@ RealOpenMM AmoebaReferenceMultipoleForce::calculateForceAndEnergy( ...@@ -2164,6 +2170,7 @@ RealOpenMM AmoebaReferenceMultipoleForce::calculateForceAndEnergy(
const std::vector<int>& multipoleAtomXs, const std::vector<int>& multipoleAtomXs,
const std::vector<int>& multipoleAtomYs, const std::vector<int>& multipoleAtomYs,
const std::vector< std::vector< std::vector<int> > >& multipoleParticleCovalentInfo, const std::vector< std::vector< std::vector<int> > >& multipoleParticleCovalentInfo,
int polarizationType,
std::vector<RealVec>& forces ){ std::vector<RealVec>& forces ){
...@@ -2171,7 +2178,7 @@ RealOpenMM AmoebaReferenceMultipoleForce::calculateForceAndEnergy( ...@@ -2171,7 +2178,7 @@ RealOpenMM AmoebaReferenceMultipoleForce::calculateForceAndEnergy(
if( getNonbondedMethod() == NoCutoff || 1 ){ if( getNonbondedMethod() == NoCutoff || 1 ){
return calculateNoCutoffForceAndEnergy( particlePositions, charges, dipoles, quadrupoles, tholes, dampingFactors, return calculateNoCutoffForceAndEnergy( particlePositions, charges, dipoles, quadrupoles, tholes, dampingFactors,
polarity, axisTypes, multipoleAtomZs, multipoleAtomXs, multipoleAtomYs, forces ); polarity, axisTypes, multipoleAtomZs, multipoleAtomXs, multipoleAtomYs, polarizationType, forces );
} }
......
...@@ -215,6 +215,7 @@ public: ...@@ -215,6 +215,7 @@ public:
const std::vector<int>& multipoleAtomXs, const std::vector<int>& multipoleAtomXs,
const std::vector<int>& multipoleAtomYs, const std::vector<int>& multipoleAtomYs,
const std::vector< std::vector< std::vector<int> > >& multipoleAtomCovalentInfo, const std::vector< std::vector< std::vector<int> > >& multipoleAtomCovalentInfo,
int polarizationType,
std::vector<OpenMM::RealVec>& forces ); std::vector<OpenMM::RealVec>& forces );
...@@ -456,13 +457,13 @@ private: ...@@ -456,13 +457,13 @@ private:
const std::vector<RealOpenMM>& fieldPolar, const std::vector<RealOpenMM>& fieldPolar,
RealOpenMM& epsilonD, RealOpenMM& epsilonP ) const; RealOpenMM& epsilonD, RealOpenMM& epsilonP ) const;
void calculateNoCutoffInducedDipoles( std::vector<MultipoleParticleData>& particleData ); void calculateNoCutoffInducedDipoles( int polarizationType, std::vector<MultipoleParticleData>& particleData );
void calculateInducedDipoleField( std::vector<MultipoleParticleData>& particleData, void calculateInducedDipoleField( std::vector<MultipoleParticleData>& particleData,
std::vector<RealOpenMM>& field, std::vector<RealOpenMM>& field,
std::vector<RealOpenMM>& fieldPolar ) const; std::vector<RealOpenMM>& fieldPolar ) const;
RealOpenMM calculateNoCutoffElectrostaticPairIxn( const MultipoleParticleData& particleI, RealOpenMM calculateNoCutoffElectrostaticPairIxn( int polarizationType, const MultipoleParticleData& particleI,
const MultipoleParticleData& particleK, const MultipoleParticleData& particleK,
RealOpenMM* scalingFactors, std::vector<OpenMM::RealVec>& forces, std::vector<Vec3>& torque ) const; RealOpenMM* scalingFactors, std::vector<OpenMM::RealVec>& forces, std::vector<Vec3>& torque ) const;
...@@ -495,6 +496,7 @@ private: ...@@ -495,6 +496,7 @@ private:
const std::vector<int>& multipoleAtomZs, const std::vector<int>& multipoleAtomZs,
const std::vector<int>& multipoleAtomXs, const std::vector<int>& multipoleAtomXs,
const std::vector<int>& multipoleAtomYs, const std::vector<int>& multipoleAtomYs,
int polarizationType,
std::vector<OpenMM::RealVec>& forces ) const; std::vector<OpenMM::RealVec>& forces ) const;
/**--------------------------------------------------------------------------------------- /**---------------------------------------------------------------------------------------
...@@ -526,6 +528,7 @@ private: ...@@ -526,6 +528,7 @@ private:
const std::vector<int>& multipoleAtomZs, const std::vector<int>& multipoleAtomZs,
const std::vector<int>& multipoleAtomXs, const std::vector<int>& multipoleAtomXs,
const std::vector<int>& multipoleAtomYs, const std::vector<int>& multipoleAtomYs,
int polarizationType,
std::vector<OpenMM::RealVec>& forces ); std::vector<OpenMM::RealVec>& forces );
}; };
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment