Commit 9480ec98 authored by peastman's avatar peastman Committed by GitHub
Browse files

Merge pull request #1646 from peastman/zonly

Fixed errors with multipoles set to ZOnly mode
parents 1f78252a f6d209af
...@@ -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,58 +410,58 @@ void AmoebaReferenceMultipoleForce::applyRotationMatrixToParticle( Multipol ...@@ -410,58 +410,58 @@ 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::Bisector) { if (axisType == AmoebaMultipoleForce::ZOnly) {
// bisector
// dx = dx1 + dx2 (in TINKER code)
normalizeRealVec(vectorX);
vectorZ += vectorX;
normalizeRealVec(vectorZ);
} else if (axisType == AmoebaMultipoleForce::ZBisect) { // z-only
// z-bisect
// dx = dx1 + dx2 (in TINKER code) vectorX = RealVec(0.1, 0.1, 0.1);
}
else {
vectorX = particleX->position - particleI.position;
if (axisType == AmoebaMultipoleForce::Bisector) {
normalizeRealVec(vectorX); // bisector
vectorY = particleY->position - particleI.position; // dx = dx1 + dx2 (in TINKER code)
normalizeRealVec(vectorY);
vectorX += vectorY; normalizeRealVec(vectorX);
normalizeRealVec(vectorX); vectorZ += vectorX;
normalizeRealVec(vectorZ);
}
else if (axisType == AmoebaMultipoleForce::ZBisect) {
} else if (axisType == AmoebaMultipoleForce::ThreeFold) { // z-bisect
// 3-fold // dx = dx1 + dx2 (in TINKER code)
// dx = dx1 + dx2 + dx3 (in TINKER code) normalizeRealVec(vectorX);
normalizeRealVec(vectorX); vectorY = particleY->position - particleI.position;
normalizeRealVec(vectorY);
vectorY = particleY->position - particleI.position; vectorX += vectorY;
normalizeRealVec(vectorY); normalizeRealVec(vectorX);
}
else if (axisType == AmoebaMultipoleForce::ThreeFold) {
vectorZ += vectorX + vectorY; // 3-fold
normalizeRealVec(vectorZ);
} else if (axisType == AmoebaMultipoleForce::ZOnly) { // dx = dx1 + dx2 + dx3 (in TINKER code)
// z-only normalizeRealVec(vectorX);
vectorX = RealVec(0.1, 0.1, 0.1); vectorY = particleY->position - particleI.position;
normalizeRealVec(vectorY);
vectorZ += vectorX + vectorY;
normalizeRealVec(vectorZ);
}
} }
RealOpenMM dot = vectorZ.dot(vectorX); RealOpenMM dot = vectorZ.dot(vectorX);
...@@ -652,9 +652,10 @@ void AmoebaReferenceMultipoleForce::applyRotationMatrix(vector<MultipoleParticle ...@@ -652,9 +652,10 @@ 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]],
multipoleAtomYs[ii] > -1 ? &particleData[multipoleAtomYs[ii]] : NULL, axisTypes[ii]); multipoleAtomXs[ii] > -1 ? &particleData[multipoleAtomXs[ii]] : NULL,
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