Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
tsoc
openmm
Commits
e9a2857a
Commit
e9a2857a
authored
Feb 08, 2019
by
Peter Eastman
Browse files
Fixed inconsistency in computing Ewald self energy
parent
81bad1bc
Changes
4
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
26 additions
and
16 deletions
+26
-16
platforms/cuda/src/CudaKernels.cpp
platforms/cuda/src/CudaKernels.cpp
+8
-5
platforms/cuda/src/kernels/nonbondedParameters.cu
platforms/cuda/src/kernels/nonbondedParameters.cu
+5
-3
platforms/opencl/src/OpenCLKernels.cpp
platforms/opencl/src/OpenCLKernels.cpp
+8
-5
platforms/opencl/src/kernels/nonbondedParameters.cl
platforms/opencl/src/kernels/nonbondedParameters.cl
+5
-3
No files found.
platforms/cuda/src/CudaKernels.cpp
View file @
e9a2857a
...
...
@@ -2117,6 +2117,7 @@ double CudaCalcNonbondedForceKernel::execute(ContextImpl& context, bool includeF
cuEventRecord(paramsSyncEvent, cu.getCurrentStream());
cuStreamWaitEvent(pmeStream, paramsSyncEvent, 0);
}
if (hasOffsets)
energy = 0.0; // The Ewald self energy was computed in the kernel.
recomputeParams = false;
}
...
...
@@ -2348,12 +2349,14 @@ void CudaCalcNonbondedForceKernel::copyParametersToContext(ContextImpl& context,
ewaldSelfEnergy = 0.0;
if (nonbondedMethod == Ewald || nonbondedMethod == PME || nonbondedMethod == LJPME) {
if (cu.getContextIndex() == 0) {
for (int i = 0; i < force.getNumParticles(); i++) {
ewaldSelfEnergy -= baseParticleParamVec[i].x*baseParticleParamVec[i].x*ONE_4PI_EPS0*alpha/sqrt(M_PI);
if (doLJPME)
ewaldSelfEnergy += baseParticleParamVec[i].z*pow(baseParticleParamVec[i].y*dispersionAlpha, 6)/3.0;
}
}
}
if (force.getUseDispersionCorrection() && cu.getContextIndex() == 0 && (nonbondedMethod == CutoffPeriodic || nonbondedMethod == Ewald || nonbondedMethod == PME))
dispersionCoefficient = NonbondedForceImpl::calcDispersionCorrection(context.getSystem(), force);
cu.invalidateMolecules();
...
...
platforms/cuda/src/kernels/nonbondedParameters.cu
View file @
e9a2857a
...
...
@@ -31,12 +31,14 @@ extern "C" __global__ void computeParameters(mixed* __restrict__ energyBuffer, b
charge
[
i
]
=
params
.
x
;
#endif
sigmaEpsilon
[
i
]
=
make_float2
(
0.5
f
*
params
.
y
,
2
*
SQRT
(
params
.
z
));
#ifdef INCLUDE_EWALD
#ifdef HAS_OFFSETS
#ifdef INCLUDE_EWALD
energy
-=
EWALD_SELF_ENERGY_SCALE
*
params
.
x
*
params
.
x
;
#endif
#ifdef INCLUDE_LJPME
#endif
#ifdef INCLUDE_LJPME
real
sig3
=
params
.
y
*
params
.
y
*
params
.
y
;
energy
+=
LJPME_SELF_ENERGY_SCALE
*
sig3
*
sig3
*
params
.
z
;
#endif
#endif
}
...
...
platforms/opencl/src/OpenCLKernels.cpp
View file @
e9a2857a
...
...
@@ -2181,6 +2181,7 @@ double OpenCLCalcNonbondedForceKernel::execute(ContextImpl& context, bool includ
cl.getQueue().enqueueMarker(&events[0]);
pmeQueue.enqueueWaitForEvents(events);
}
if (hasOffsets)
energy = 0.0; // The Ewald self energy was computed in the kernel.
recomputeParams = false;
}
...
...
@@ -2487,12 +2488,14 @@ void OpenCLCalcNonbondedForceKernel::copyParametersToContext(ContextImpl& contex
ewaldSelfEnergy = 0.0;
if (nonbondedMethod == Ewald || nonbondedMethod == PME || nonbondedMethod == LJPME) {
if (cl.getContextIndex() == 0) {
for (int i = 0; i < force.getNumParticles(); i++) {
ewaldSelfEnergy -= baseParticleParamVec[i].x*baseParticleParamVec[i].x*ONE_4PI_EPS0*alpha/sqrt(M_PI);
if (doLJPME)
ewaldSelfEnergy += baseParticleParamVec[i].z*pow(baseParticleParamVec[i].y*dispersionAlpha, 6)/3.0;
}
}
}
if (force.getUseDispersionCorrection() && cl.getContextIndex() == 0 && (nonbondedMethod == CutoffPeriodic || nonbondedMethod == Ewald || nonbondedMethod == PME))
dispersionCoefficient = NonbondedForceImpl::calcDispersionCorrection(context.getSystem(), force);
cl.invalidateMolecules(info);
...
...
platforms/opencl/src/kernels/nonbondedParameters.cl
View file @
e9a2857a
...
...
@@ -31,12 +31,14 @@ __kernel void computeParameters(__global mixed* restrict energyBuffer, int inclu
charge[i]
=
params.x
;
#
endif
sigmaEpsilon[i]
=
(
float2
)
(
0.5f*params.y,
2*SQRT
(
params.z
))
;
#
ifdef
INCLUDE_EWALD
#
ifdef
HAS_OFFSETS
#
ifdef
INCLUDE_EWALD
energy
-=
EWALD_SELF_ENERGY_SCALE*params.x*params.x
;
#
endif
#
ifdef
INCLUDE_LJPME
#
endif
#
ifdef
INCLUDE_LJPME
real
sig3
=
params.y*params.y*params.y
;
energy
+=
LJPME_SELF_ENERGY_SCALE*sig3*sig3*params.z
;
#
endif
#
endif
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment