"vscode:/vscode.git/clone" did not exist on "1d7ac0e2fbbdc3072b7fe5e20b43cede7b2ea7c2"
Commit 775866b6 authored by peastman's avatar peastman
Browse files

Minor optimizations to CPU version of GBSAOBCForce

parent c97ca97b
...@@ -66,12 +66,12 @@ public: ...@@ -66,12 +66,12 @@ public:
void setSolventDielectric(float dielectric); void setSolventDielectric(float dielectric);
/** /**
* Get the per-particle parameters (atomic radius, scaling factor). * Get the per-particle parameters (offset radius, scaled radius).
*/ */
const std::vector<std::pair<float, float> >& getParticleParameters() const; const std::vector<std::pair<float, float> >& getParticleParameters() const;
/** /**
* Set the per-particle parameters (atomic radius, scaling factor). * Set the per-particle parameters (offset radius, scaled radius).
*/ */
void setParticleParameters(const std::vector<std::pair<float, float> >& params); void setParticleParameters(const std::vector<std::pair<float, float> >& params);
......
...@@ -123,8 +123,7 @@ void CpuGBSAOBCForce::threadComputeForce(ThreadPool& threads, int threadIndex) { ...@@ -123,8 +123,7 @@ void CpuGBSAOBCForce::threadComputeForce(ThreadPool& threads, int threadIndex) {
for (int atomI = start; atomI < end; atomI++) { for (int atomI = start; atomI < end; atomI++) {
fvec4 posI(posq+4*atomI); fvec4 posI(posq+4*atomI);
float radiusI = particleParams[atomI].first; float offsetRadiusI = particleParams[atomI].first;
float offsetRadiusI = radiusI - dielectricOffset;
float radiusIInverse = 1.0f/offsetRadiusI; float radiusIInverse = 1.0f/offsetRadiusI;
float sum = 0.0f; float sum = 0.0f;
for (int atomJ = 0; atomJ < numParticles; atomJ++) { for (int atomJ = 0; atomJ < numParticles; atomJ++) {
...@@ -136,8 +135,7 @@ void CpuGBSAOBCForce::threadComputeForce(ThreadPool& threads, int threadIndex) { ...@@ -136,8 +135,7 @@ void CpuGBSAOBCForce::threadComputeForce(ThreadPool& threads, int threadIndex) {
if (cutoff && r2 >= cutoffDistance*cutoffDistance) if (cutoff && r2 >= cutoffDistance*cutoffDistance)
continue; continue;
float r = sqrtf(r2); float r = sqrtf(r2);
float offsetRadiusJ = particleParams[atomJ].first - dielectricOffset; float scaledRadiusJ = particleParams[atomJ].second;
float scaledRadiusJ = offsetRadiusJ*particleParams[atomJ].second;
float rScaledRadiusJ = r + scaledRadiusJ; float rScaledRadiusJ = r + scaledRadiusJ;
if (offsetRadiusI < rScaledRadiusJ) { if (offsetRadiusI < rScaledRadiusJ) {
float rInverse = 1.0f/r; float rInverse = 1.0f/r;
...@@ -158,6 +156,7 @@ void CpuGBSAOBCForce::threadComputeForce(ThreadPool& threads, int threadIndex) { ...@@ -158,6 +156,7 @@ void CpuGBSAOBCForce::threadComputeForce(ThreadPool& threads, int threadIndex) {
float sum2 = sum*sum; float sum2 = sum*sum;
float sum3 = sum*sum2; float sum3 = sum*sum2;
float tanhSum = tanh(alphaObc*sum - betaObc*sum2 + gammaObc*sum3); float tanhSum = tanh(alphaObc*sum - betaObc*sum2 + gammaObc*sum3);
float radiusI = offsetRadiusI + dielectricOffset;
bornRadii[atomI] = 1.0f/(1.0f/offsetRadiusI - tanhSum/radiusI); bornRadii[atomI] = 1.0f/(1.0f/offsetRadiusI - tanhSum/radiusI);
obcChain[atomI] = offsetRadiusI*(alphaObc - 2.0f*betaObc*sum + 3.0f*gammaObc*sum2); obcChain[atomI] = offsetRadiusI*(alphaObc - 2.0f*betaObc*sum + 3.0f*gammaObc*sum2);
obcChain[atomI] = (1.0f - tanhSum*tanhSum)*obcChain[atomI]/radiusI; obcChain[atomI] = (1.0f - tanhSum*tanhSum)*obcChain[atomI]/radiusI;
...@@ -174,8 +173,9 @@ void CpuGBSAOBCForce::threadComputeForce(ThreadPool& threads, int threadIndex) { ...@@ -174,8 +173,9 @@ void CpuGBSAOBCForce::threadComputeForce(ThreadPool& threads, int threadIndex) {
bornForces[i] = 0.0f; bornForces[i] = 0.0f;
for (int atomI = start; atomI < end; atomI++) { for (int atomI = start; atomI < end; atomI++) {
if (bornRadii[atomI] > 0) { if (bornRadii[atomI] > 0) {
float r = particleParams[atomI].first + probeRadius; float radiusI = particleParams[atomI].first + dielectricOffset;
float ratio6 = powf(particleParams[atomI].first/bornRadii[atomI], 6.0f); float r = radiusI + probeRadius;
float ratio6 = powf(radiusI/bornRadii[atomI], 6.0f);
float saTerm = surfaceAreaFactor*r*r*ratio6; float saTerm = surfaceAreaFactor*r*r*ratio6;
energy += saTerm; energy += saTerm;
bornForces[atomI] = -6.0f*saTerm/bornRadii[atomI]; bornForces[atomI] = -6.0f*saTerm/bornRadii[atomI];
...@@ -239,8 +239,7 @@ void CpuGBSAOBCForce::threadComputeForce(ThreadPool& threads, int threadIndex) { ...@@ -239,8 +239,7 @@ void CpuGBSAOBCForce::threadComputeForce(ThreadPool& threads, int threadIndex) {
for (int i = 0; i < numThreads; i++) for (int i = 0; i < numThreads; i++)
bornForce += threadBornForces[i][atomI]; bornForce += threadBornForces[i][atomI];
bornForce *= bornRadii[atomI]*bornRadii[atomI]*obcChain[atomI]; bornForce *= bornRadii[atomI]*bornRadii[atomI]*obcChain[atomI];
float radiusI = particleParams[atomI].first; float offsetRadiusI = particleParams[atomI].first;
float offsetRadiusI = radiusI - dielectricOffset;
fvec4 posI(posq+4*atomI); fvec4 posI(posq+4*atomI);
fvec4 forceI(0.0f); fvec4 forceI(0.0f);
...@@ -253,8 +252,7 @@ void CpuGBSAOBCForce::threadComputeForce(ThreadPool& threads, int threadIndex) { ...@@ -253,8 +252,7 @@ void CpuGBSAOBCForce::threadComputeForce(ThreadPool& threads, int threadIndex) {
if (cutoff && r2 >= cutoffDistance*cutoffDistance) if (cutoff && r2 >= cutoffDistance*cutoffDistance)
continue; continue;
float r = sqrtf(r2); float r = sqrtf(r2);
float offsetRadiusJ = particleParams[atomJ].first - dielectricOffset; float scaledRadiusJ = particleParams[atomJ].second;
float scaledRadiusJ = offsetRadiusJ*particleParams[atomJ].second;
float scaledRadiusJ2 = scaledRadiusJ*scaledRadiusJ; float scaledRadiusJ2 = scaledRadiusJ*scaledRadiusJ;
float rScaledRadiusJ = r + scaledRadiusJ; float rScaledRadiusJ = r + scaledRadiusJ;
if (offsetRadiusI < rScaledRadiusJ) { if (offsetRadiusI < rScaledRadiusJ) {
......
...@@ -402,7 +402,8 @@ void CpuCalcGBSAOBCForceKernel::initialize(const System& system, const GBSAOBCFo ...@@ -402,7 +402,8 @@ void CpuCalcGBSAOBCForceKernel::initialize(const System& system, const GBSAOBCFo
double charge, radius, scalingFactor; double charge, radius, scalingFactor;
force.getParticleParameters(i, charge, radius, scalingFactor); force.getParticleParameters(i, charge, radius, scalingFactor);
data.posq[4*i+3] = (float) charge; data.posq[4*i+3] = (float) charge;
particleParams[i] = make_pair((float) radius, (float) scalingFactor); radius -= 0.009;
particleParams[i] = make_pair((float) radius, (float) (scalingFactor*radius));
} }
obc.setParticleParameters(particleParams); obc.setParticleParameters(particleParams);
obc.setSolventDielectric((float) force.getSolventDielectric()); obc.setSolventDielectric((float) force.getSolventDielectric());
...@@ -434,7 +435,8 @@ void CpuCalcGBSAOBCForceKernel::copyParametersToContext(ContextImpl& context, co ...@@ -434,7 +435,8 @@ void CpuCalcGBSAOBCForceKernel::copyParametersToContext(ContextImpl& context, co
double charge, radius, scalingFactor; double charge, radius, scalingFactor;
force.getParticleParameters(i, charge, radius, scalingFactor); force.getParticleParameters(i, charge, radius, scalingFactor);
data.posq[4*i+3] = (float) charge; data.posq[4*i+3] = (float) charge;
particleParams[i] = make_pair((float) radius, (float) scalingFactor); radius -= 0.009;
particleParams[i] = make_pair((float) radius, (float) (scalingFactor*radius));
} }
obc.setParticleParameters(particleParams); obc.setParticleParameters(particleParams);
} }
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