Commit 5e3a0a05 authored by Peter Eastman's avatar Peter Eastman
Browse files

Began implementing triclinic boxes for reference AmoebaMultipoleForce (not yet debugged)

parent 3b2579a5
...@@ -640,17 +640,17 @@ AmoebaReferenceMultipoleForce* ReferenceCalcAmoebaMultipoleForceKernel::setupAmo ...@@ -640,17 +640,17 @@ AmoebaReferenceMultipoleForce* ReferenceCalcAmoebaMultipoleForceKernel::setupAmo
} else if( usePme ) { } else if( usePme ) {
AmoebaReferencePmeMultipoleForce* amoebaReferencePmeMultipoleForce = new AmoebaReferencePmeMultipoleForce( ); AmoebaReferencePmeMultipoleForce* amoebaReferencePmeMultipoleForce = new AmoebaReferencePmeMultipoleForce( );
amoebaReferencePmeMultipoleForce->setAlphaEwald( alphaEwald ); amoebaReferencePmeMultipoleForce->setAlphaEwald( alphaEwald );
amoebaReferencePmeMultipoleForce->setCutoffDistance( cutoffDistance ); amoebaReferencePmeMultipoleForce->setCutoffDistance( cutoffDistance );
amoebaReferencePmeMultipoleForce->setPmeGridDimensions( pmeGridDimension ); amoebaReferencePmeMultipoleForce->setPmeGridDimensions( pmeGridDimension );
RealVec& box = extractBoxSize(context); RealVec* boxVectors = extractBoxVectors(context);
double minAllowedSize = 1.999999*cutoffDistance; double minAllowedSize = 1.999999*cutoffDistance;
if (box[0] < minAllowedSize || box[1] < minAllowedSize || box[2] < minAllowedSize){ if (boxVectors[0][0] < minAllowedSize || boxVectors[1][1] < minAllowedSize || boxVectors[2][2] < minAllowedSize){
throw OpenMMException("The periodic box size has decreased to less than twice the nonbonded cutoff."); throw OpenMMException("The periodic box size has decreased to less than twice the nonbonded cutoff.");
} }
amoebaReferencePmeMultipoleForce->setPeriodicBoxSize(box); amoebaReferencePmeMultipoleForce->setPeriodicBoxSize(boxVectors);
amoebaReferenceMultipoleForce = static_cast<AmoebaReferenceMultipoleForce*>(amoebaReferencePmeMultipoleForce); amoebaReferenceMultipoleForce = static_cast<AmoebaReferenceMultipoleForce*>(amoebaReferencePmeMultipoleForce);
} else { } else {
amoebaReferenceMultipoleForce = new AmoebaReferenceMultipoleForce( AmoebaReferenceMultipoleForce::NoCutoff ); amoebaReferenceMultipoleForce = new AmoebaReferenceMultipoleForce( AmoebaReferenceMultipoleForce::NoCutoff );
......
...@@ -591,6 +591,16 @@ protected: ...@@ -591,6 +591,16 @@ protected:
RealOpenMM dampingFactor; RealOpenMM dampingFactor;
RealOpenMM polarity; RealOpenMM polarity;
}; };
/**
* Particle parameters transformed into fractional coordinates
*/
class TransformedMultipole {
public:
RealOpenMM charge;
RealVec dipole;
RealOpenMM quadrupole[6];
};
/* /*
* Helper class used in calculating induced dipoles * Helper class used in calculating induced dipoles
...@@ -618,6 +628,7 @@ protected: ...@@ -618,6 +628,7 @@ protected:
RealOpenMM _mScale[5]; RealOpenMM _mScale[5];
RealOpenMM _uScale[5]; RealOpenMM _uScale[5];
std::vector<TransformedMultipole> _transformed;
std::vector<RealVec> _fixedMultipoleField; std::vector<RealVec> _fixedMultipoleField;
std::vector<RealVec> _fixedMultipoleFieldPolar; std::vector<RealVec> _fixedMultipoleFieldPolar;
std::vector<RealVec> _inducedDipole; std::vector<RealVec> _inducedDipole;
...@@ -1327,9 +1338,9 @@ public: ...@@ -1327,9 +1338,9 @@ public:
/** /**
* Set periodic box size. * Set periodic box size.
* *
* @param boxSize box dimensions * @param vectors the vectors defining the periodic box
*/ */
void setPeriodicBoxSize(RealVec& boxSize); void setPeriodicBoxSize(OpenMM::RealVec* vectors);
private: private:
...@@ -1340,8 +1351,8 @@ private: ...@@ -1340,8 +1351,8 @@ private:
RealOpenMM _cutoffDistance; RealOpenMM _cutoffDistance;
RealOpenMM _cutoffDistanceSquared; RealOpenMM _cutoffDistanceSquared;
RealVec _invPeriodicBoxSize; RealVec _recipBoxVectors[3];
RealVec _periodicBoxSize; RealVec _periodicBoxVectors[3];
int _totalGridSize; int _totalGridSize;
IntVec _pmeGridDimensions; IntVec _pmeGridDimensions;
...@@ -1382,12 +1393,6 @@ private: ...@@ -1382,12 +1393,6 @@ private:
*/ */
void getPeriodicDelta(RealVec& deltaR) const; void getPeriodicDelta(RealVec& deltaR) const;
/**
* Get PME scale.
*
*/
void getPmeScale(RealVec& scale) const;
/** /**
* Calculate damped inverse distances. * Calculate damped inverse distances.
* *
...@@ -1460,7 +1465,6 @@ private: ...@@ -1460,7 +1465,6 @@ private:
/** /**
* Compute induced dipole grid value. * Compute induced dipole grid value.
* *
* @param particleData vector of particle positions and parameters (charge, labFrame dipoles, quadrupoles, ...)
* @param particleGridIndices particle grid indices * @param particleGridIndices particle grid indices
* @param scale integer grid dimension/box size for each dimension * @param scale integer grid dimension/box size for each dimension
* @param ix x-dimension offset value * @param ix x-dimension offset value
...@@ -1469,8 +1473,17 @@ private: ...@@ -1469,8 +1473,17 @@ private:
* @param inputInducedDipole induced dipole value * @param inputInducedDipole induced dipole value
* @param inputInducedDipolePolar induced dipole value * @param inputInducedDipolePolar induced dipole value
*/ */
RealOpenMM computeFixedMultipolesGridValue(const vector<MultipoleParticleData>& particleData, RealOpenMM computeFixedMultipolesGridValue(const int2& particleGridIndices, int ix, int iy, const IntVec& gridPoint) const;
const int2& particleGridIndices, const RealVec& scale, int ix, int iy, const IntVec& gridPoint) const;
/**
* Transform multipoles from cartesian coordinates to fractional coordinates.
*/
void transformMultipolesToFractionalCoordinates(const vector<MultipoleParticleData>& particleData);
/**
* Transform potential from fractional coordinates to cartesian coordinates.
*/
void transformPotentialToCartesianCoordinates(const std::vector<RealOpenMM>& fphi, std::vector<RealOpenMM>& cphi) const;
/** /**
* Spread fixed multipoles onto PME grid. * Spread fixed multipoles onto PME grid.
...@@ -1568,7 +1581,7 @@ private: ...@@ -1568,7 +1581,7 @@ private:
* @param inputInducedDipole induced dipole value * @param inputInducedDipole induced dipole value
* @param inputInducedDipolePolar induced dipole polar value * @param inputInducedDipolePolar induced dipole polar value
*/ */
t_complex computeInducedDipoleGridValue(const int2& atomIndices, const RealVec& scale, int ix, int iy, const IntVec& gridPoint, t_complex computeInducedDipoleGridValue(const int2& atomIndices, const RealVec* fracToCart, int ix, int iy, const IntVec& gridPoint,
const std::vector<RealVec>& inputInducedDipole, const std::vector<RealVec>& inputInducedDipole,
const std::vector<RealVec>& inputInducedDipolePolar) const; const std::vector<RealVec>& inputInducedDipolePolar) const;
......
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