Commit f6d209af authored by Peter Eastman's avatar Peter Eastman
Browse files

Fixed errors with multipoles set to ZOnly mode

parent 1f78252a
...@@ -24,13 +24,19 @@ extern "C" __global__ void computeLabFrameMoments(real4* __restrict__ posq, int4 ...@@ -24,13 +24,19 @@ extern "C" __global__ void computeLabFrameMoments(real4* __restrict__ posq, int4
// code common to ZThenX and Bisector // code common to ZThenX and Bisector
int4 particles = multipoleParticles[atom]; int4 particles = multipoleParticles[atom];
if (particles.x >= 0 && particles.z >= 0) { if (particles.z >= 0) {
real4 thisParticlePos = posq[atom]; real4 thisParticlePos = posq[atom];
real4 posZ = posq[particles.z]; real4 posZ = posq[particles.z];
real3 vectorZ = make_real3(posZ.x-thisParticlePos.x, posZ.y-thisParticlePos.y, posZ.z-thisParticlePos.z); real3 vectorZ = make_real3(posZ.x-thisParticlePos.x, posZ.y-thisParticlePos.y, posZ.z-thisParticlePos.z);
real4 posX = posq[particles.x];
real3 vectorX = make_real3(posX.x-thisParticlePos.x, posX.y-thisParticlePos.y, posX.z-thisParticlePos.z);
int axisType = particles.w; int axisType = particles.w;
real4 posX;
real3 vectorX;
if (axisType >= 4)
vectorX = make_real3((real) 0.1f);
else {
posX = posq[particles.x];
vectorX = make_real3(posX.x-thisParticlePos.x, posX.y-thisParticlePos.y, posX.z-thisParticlePos.z);
}
/* /*
z-only z-only
...@@ -108,8 +114,6 @@ extern "C" __global__ void computeLabFrameMoments(real4* __restrict__ posq, int4 ...@@ -108,8 +114,6 @@ extern "C" __global__ void computeLabFrameMoments(real4* __restrict__ posq, int4
} }
} }
else if (axisType >= 4)
vectorX = make_real3((real) 0.1f);
// x = x - (x.z)z // x = x - (x.z)z
......
...@@ -397,8 +397,8 @@ void AmoebaReferenceMultipoleForce::checkChiral(vector<MultipoleParticleData>& p ...@@ -397,8 +397,8 @@ void AmoebaReferenceMultipoleForce::checkChiral(vector<MultipoleParticleData>& p
} }
void AmoebaReferenceMultipoleForce::applyRotationMatrixToParticle( MultipoleParticleData& particleI, void AmoebaReferenceMultipoleForce::applyRotationMatrixToParticle( MultipoleParticleData& particleI,
const MultipoleParticleData& particleZ, const MultipoleParticleData* particleZ,
const MultipoleParticleData& particleX, const MultipoleParticleData* particleX,
MultipoleParticleData* particleY, MultipoleParticleData* particleY,
int axisType) const int axisType) const
{ {
...@@ -410,14 +410,20 @@ void AmoebaReferenceMultipoleForce::applyRotationMatrixToParticle( Multipol ...@@ -410,14 +410,20 @@ void AmoebaReferenceMultipoleForce::applyRotationMatrixToParticle( Multipol
// this atom and the axis atom // this atom and the axis atom
RealVec vectorY; RealVec vectorX, vectorY;
RealVec vectorZ = particleZ.position - particleI.position; RealVec vectorZ = particleZ->position - particleI.position;
RealVec vectorX = particleX.position - particleI.position;
normalizeRealVec(vectorZ); normalizeRealVec(vectorZ);
// branch based on axis type // branch based on axis type
if (axisType == AmoebaMultipoleForce::ZOnly) {
// z-only
vectorX = RealVec(0.1, 0.1, 0.1);
}
else {
vectorX = particleX->position - particleI.position;
if (axisType == AmoebaMultipoleForce::Bisector) { if (axisType == AmoebaMultipoleForce::Bisector) {
// bisector // bisector
...@@ -427,8 +433,8 @@ void AmoebaReferenceMultipoleForce::applyRotationMatrixToParticle( Multipol ...@@ -427,8 +433,8 @@ void AmoebaReferenceMultipoleForce::applyRotationMatrixToParticle( Multipol
normalizeRealVec(vectorX); normalizeRealVec(vectorX);
vectorZ += vectorX; vectorZ += vectorX;
normalizeRealVec(vectorZ); normalizeRealVec(vectorZ);
}
} else if (axisType == AmoebaMultipoleForce::ZBisect) { else if (axisType == AmoebaMultipoleForce::ZBisect) {
// z-bisect // z-bisect
...@@ -441,8 +447,8 @@ void AmoebaReferenceMultipoleForce::applyRotationMatrixToParticle( Multipol ...@@ -441,8 +447,8 @@ void AmoebaReferenceMultipoleForce::applyRotationMatrixToParticle( Multipol
vectorX += vectorY; vectorX += vectorY;
normalizeRealVec(vectorX); normalizeRealVec(vectorX);
}
} else if (axisType == AmoebaMultipoleForce::ThreeFold) { else if (axisType == AmoebaMultipoleForce::ThreeFold) {
// 3-fold // 3-fold
...@@ -455,13 +461,7 @@ void AmoebaReferenceMultipoleForce::applyRotationMatrixToParticle( Multipol ...@@ -455,13 +461,7 @@ void AmoebaReferenceMultipoleForce::applyRotationMatrixToParticle( Multipol
vectorZ += vectorX + vectorY; vectorZ += vectorX + vectorY;
normalizeRealVec(vectorZ); normalizeRealVec(vectorZ);
}
} else if (axisType == AmoebaMultipoleForce::ZOnly) {
// z-only
vectorX = RealVec(0.1, 0.1, 0.1);
} }
RealOpenMM dot = vectorZ.dot(vectorX); RealOpenMM dot = vectorZ.dot(vectorX);
...@@ -652,8 +652,9 @@ void AmoebaReferenceMultipoleForce::applyRotationMatrix(vector<MultipoleParticle ...@@ -652,8 +652,9 @@ void AmoebaReferenceMultipoleForce::applyRotationMatrix(vector<MultipoleParticle
{ {
for (unsigned int ii = 0; ii < _numParticles; ii++) { for (unsigned int ii = 0; ii < _numParticles; ii++) {
if (multipoleAtomZs[ii] >= 0 && multipoleAtomXs[ii] >= 0) { if (multipoleAtomZs[ii] >= 0) {
applyRotationMatrixToParticle(particleData[ii], particleData[multipoleAtomZs[ii]], particleData[multipoleAtomXs[ii]], applyRotationMatrixToParticle(particleData[ii], &particleData[multipoleAtomZs[ii]],
multipoleAtomXs[ii] > -1 ? &particleData[multipoleAtomXs[ii]] : NULL,
multipoleAtomYs[ii] > -1 ? &particleData[multipoleAtomYs[ii]] : NULL, axisTypes[ii]); multipoleAtomYs[ii] > -1 ? &particleData[multipoleAtomYs[ii]] : NULL, axisTypes[ii]);
} }
} }
......
...@@ -900,8 +900,8 @@ protected: ...@@ -900,8 +900,8 @@ protected:
* @param axisType axis type * @param axisType axis type
*/ */
void applyRotationMatrixToParticle( MultipoleParticleData& particleI, void applyRotationMatrixToParticle( MultipoleParticleData& particleI,
const MultipoleParticleData& particleZ, const MultipoleParticleData* particleZ,
const MultipoleParticleData& particleX, const MultipoleParticleData* particleX,
MultipoleParticleData* particleY, int axisType) const; MultipoleParticleData* particleY, int axisType) const;
/** /**
......
...@@ -4907,7 +4907,7 @@ class AmoebaMultipoleGenerator(object): ...@@ -4907,7 +4907,7 @@ class AmoebaMultipoleGenerator(object):
bondedAtomZ = data.atoms[bondedAtomZIndex] bondedAtomZ = data.atoms[bondedAtomZIndex]
if (kx == 0 and kz == bondedAtomZType): if (kx == 0 and kz == bondedAtomZType):
kz = bondedAtomZIndex zaxis = bondedAtomZIndex
savedMultipoleDict = multipoleDict savedMultipoleDict = multipoleDict
hit = 5 hit = 5
......
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