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

Refactored ForceImpl, lots of KernelImpl subclasses, and other related classes...

Refactored ForceImpl, lots of KernelImpl subclasses, and other related classes to avoid redundant calculations when requesting a State with both forces and energies
parent 767ea1bd
...@@ -56,8 +56,7 @@ public: ...@@ -56,8 +56,7 @@ public:
void updateContextState(ContextImpl& context) { void updateContextState(ContextImpl& context) {
// This force field doesn't update the state directly. // This force field doesn't update the state directly.
} }
void calcForces(ContextImpl& context); double calcForcesAndEnergy(ContextImpl& context, bool includeForces, bool includeEnergy);
double calcEnergy(ContextImpl& context);
std::map<std::string, double> getDefaultParameters() { std::map<std::string, double> getDefaultParameters() {
return std::map<std::string, double>(); // This force field doesn't define any parameters. return std::map<std::string, double>(); // This force field doesn't define any parameters.
} }
......
...@@ -63,7 +63,7 @@ vector<string> BrownianIntegrator::getKernelNames() { ...@@ -63,7 +63,7 @@ vector<string> BrownianIntegrator::getKernelNames() {
void BrownianIntegrator::step(int steps) { void BrownianIntegrator::step(int steps) {
for (int i = 0; i < steps; ++i) { for (int i = 0; i < steps; ++i) {
context->updateContextState(); context->updateContextState();
context->calcForces(); context->calcForcesAndEnergy(true, false);
dynamic_cast<IntegrateBrownianStepKernel&>(kernel.getImpl()).execute(*context, *this); dynamic_cast<IntegrateBrownianStepKernel&>(kernel.getImpl()).execute(*context, *this);
} }
} }
...@@ -52,12 +52,8 @@ void CMAPTorsionForceImpl::initialize(ContextImpl& context) { ...@@ -52,12 +52,8 @@ void CMAPTorsionForceImpl::initialize(ContextImpl& context) {
dynamic_cast<CalcCMAPTorsionForceKernel&>(kernel.getImpl()).initialize(context.getSystem(), owner); dynamic_cast<CalcCMAPTorsionForceKernel&>(kernel.getImpl()).initialize(context.getSystem(), owner);
} }
void CMAPTorsionForceImpl::calcForces(ContextImpl& context) { double CMAPTorsionForceImpl::calcForcesAndEnergy(ContextImpl& context, bool includeForces, bool includeEnergy) {
dynamic_cast<CalcCMAPTorsionForceKernel&>(kernel.getImpl()).executeForces(context); return dynamic_cast<CalcCMAPTorsionForceKernel&>(kernel.getImpl()).execute(context, includeForces, includeEnergy);
}
double CMAPTorsionForceImpl::calcEnergy(ContextImpl& context) {
return dynamic_cast<CalcCMAPTorsionForceKernel&>(kernel.getImpl()).executeEnergy(context);
} }
vector<string> CMAPTorsionForceImpl::getKernelNames() { vector<string> CMAPTorsionForceImpl::getKernelNames() {
......
...@@ -82,11 +82,14 @@ State Context::getState(int types) const { ...@@ -82,11 +82,14 @@ State Context::getState(int types) const {
Vec3 periodicBoxSize[3]; Vec3 periodicBoxSize[3];
impl->getPeriodicBoxVectors(periodicBoxSize[0], periodicBoxSize[1], periodicBoxSize[2]); impl->getPeriodicBoxVectors(periodicBoxSize[0], periodicBoxSize[1], periodicBoxSize[2]);
state.setPeriodicBoxVectors(periodicBoxSize[0], periodicBoxSize[1], periodicBoxSize[2]); state.setPeriodicBoxVectors(periodicBoxSize[0], periodicBoxSize[1], periodicBoxSize[2]);
if (types&State::Energy) bool includeForces = types&State::Forces;
state.setEnergy(impl->calcKineticEnergy(), impl->calcPotentialEnergy()); bool includeEnergy = types&State::Energy;
if (types&State::Forces) { if (includeForces || includeEnergy) {
impl->calcForces(); double energy = impl->calcForcesAndEnergy(includeForces, includeEnergy);
impl->getForces(state.updForces()); if (includeEnergy)
state.setEnergy(impl->calcKineticEnergy(), energy);
if (includeForces)
impl->getForces(state.updForces());
} }
if (types&State::Parameters) { if (types&State::Parameters) {
for (map<string, double>::const_iterator iter = impl->parameters.begin(); iter != impl->parameters.end(); iter++) for (map<string, double>::const_iterator iter = impl->parameters.begin(); iter != impl->parameters.end(); iter++)
......
...@@ -148,28 +148,20 @@ void ContextImpl::applyConstraints(double tol) { ...@@ -148,28 +148,20 @@ void ContextImpl::applyConstraints(double tol) {
dynamic_cast<ApplyConstraintsKernel&>(applyConstraintsKernel.getImpl()).apply(*this, tol); dynamic_cast<ApplyConstraintsKernel&>(applyConstraintsKernel.getImpl()).apply(*this, tol);
} }
void ContextImpl::calcForces() { double ContextImpl::calcForcesAndEnergy(bool includeForces, bool includeEnergy) {
CalcForcesAndEnergyKernel& kernel = dynamic_cast<CalcForcesAndEnergyKernel&>(initializeForcesKernel.getImpl()); CalcForcesAndEnergyKernel& kernel = dynamic_cast<CalcForcesAndEnergyKernel&>(initializeForcesKernel.getImpl());
kernel.beginForceComputation(*this); double energy = 0.0;
kernel.beginComputation(*this, includeForces, includeEnergy);
for (int i = 0; i < (int) forceImpls.size(); ++i) for (int i = 0; i < (int) forceImpls.size(); ++i)
forceImpls[i]->calcForces(*this); energy += forceImpls[i]->calcForcesAndEnergy(*this, includeForces, includeEnergy);
kernel.finishForceComputation(*this); energy += kernel.finishComputation(*this, includeForces, includeEnergy);
return energy;
} }
double ContextImpl::calcKineticEnergy() { double ContextImpl::calcKineticEnergy() {
return dynamic_cast<CalcKineticEnergyKernel&>(kineticEnergyKernel.getImpl()).execute(*this); return dynamic_cast<CalcKineticEnergyKernel&>(kineticEnergyKernel.getImpl()).execute(*this);
} }
double ContextImpl::calcPotentialEnergy() {
CalcForcesAndEnergyKernel& kernel = dynamic_cast<CalcForcesAndEnergyKernel&>(initializeForcesKernel.getImpl());
kernel.beginEnergyComputation(*this);
double energy = 0.0;
for (int i = 0; i < (int) forceImpls.size(); ++i)
energy += forceImpls[i]->calcEnergy(*this);
energy += kernel.finishEnergyComputation(*this);
return energy;
}
void ContextImpl::updateContextState() { void ContextImpl::updateContextState() {
for (int i = 0; i < (int) forceImpls.size(); ++i) for (int i = 0; i < (int) forceImpls.size(); ++i)
forceImpls[i]->updateContextState(*this); forceImpls[i]->updateContextState(*this);
......
...@@ -88,12 +88,8 @@ void CustomAngleForceImpl::initialize(ContextImpl& context) { ...@@ -88,12 +88,8 @@ void CustomAngleForceImpl::initialize(ContextImpl& context) {
dynamic_cast<CalcCustomAngleForceKernel&>(kernel.getImpl()).initialize(context.getSystem(), owner); dynamic_cast<CalcCustomAngleForceKernel&>(kernel.getImpl()).initialize(context.getSystem(), owner);
} }
void CustomAngleForceImpl::calcForces(ContextImpl& context) { double CustomAngleForceImpl::calcForcesAndEnergy(ContextImpl& context, bool includeForces, bool includeEnergy) {
dynamic_cast<CalcCustomAngleForceKernel&>(kernel.getImpl()).executeForces(context); return dynamic_cast<CalcCustomAngleForceKernel&>(kernel.getImpl()).execute(context, includeForces, includeEnergy);
}
double CustomAngleForceImpl::calcEnergy(ContextImpl& context) {
return dynamic_cast<CalcCustomAngleForceKernel&>(kernel.getImpl()).executeEnergy(context);
} }
vector<string> CustomAngleForceImpl::getKernelNames() { vector<string> CustomAngleForceImpl::getKernelNames() {
......
...@@ -82,12 +82,8 @@ void CustomBondForceImpl::initialize(ContextImpl& context) { ...@@ -82,12 +82,8 @@ void CustomBondForceImpl::initialize(ContextImpl& context) {
dynamic_cast<CalcCustomBondForceKernel&>(kernel.getImpl()).initialize(context.getSystem(), owner); dynamic_cast<CalcCustomBondForceKernel&>(kernel.getImpl()).initialize(context.getSystem(), owner);
} }
void CustomBondForceImpl::calcForces(ContextImpl& context) { double CustomBondForceImpl::calcForcesAndEnergy(ContextImpl& context, bool includeForces, bool includeEnergy) {
dynamic_cast<CalcCustomBondForceKernel&>(kernel.getImpl()).executeForces(context); return dynamic_cast<CalcCustomBondForceKernel&>(kernel.getImpl()).execute(context, includeForces, includeEnergy);
}
double CustomBondForceImpl::calcEnergy(ContextImpl& context) {
return dynamic_cast<CalcCustomBondForceKernel&>(kernel.getImpl()).executeEnergy(context);
} }
vector<string> CustomBondForceImpl::getKernelNames() { vector<string> CustomBondForceImpl::getKernelNames() {
......
...@@ -76,12 +76,8 @@ void CustomExternalForceImpl::initialize(ContextImpl& context) { ...@@ -76,12 +76,8 @@ void CustomExternalForceImpl::initialize(ContextImpl& context) {
dynamic_cast<CalcCustomExternalForceKernel&>(kernel.getImpl()).initialize(context.getSystem(), owner); dynamic_cast<CalcCustomExternalForceKernel&>(kernel.getImpl()).initialize(context.getSystem(), owner);
} }
void CustomExternalForceImpl::calcForces(ContextImpl& context) { double CustomExternalForceImpl::calcForcesAndEnergy(ContextImpl& context, bool includeForces, bool includeEnergy) {
dynamic_cast<CalcCustomExternalForceKernel&>(kernel.getImpl()).executeForces(context); return dynamic_cast<CalcCustomExternalForceKernel&>(kernel.getImpl()).execute(context, includeForces, includeEnergy);
}
double CustomExternalForceImpl::calcEnergy(ContextImpl& context) {
return dynamic_cast<CalcCustomExternalForceKernel&>(kernel.getImpl()).executeEnergy(context);
} }
vector<string> CustomExternalForceImpl::getKernelNames() { vector<string> CustomExternalForceImpl::getKernelNames() {
......
...@@ -105,12 +105,8 @@ void CustomGBForceImpl::initialize(ContextImpl& context) { ...@@ -105,12 +105,8 @@ void CustomGBForceImpl::initialize(ContextImpl& context) {
dynamic_cast<CalcCustomGBForceKernel&>(kernel.getImpl()).initialize(context.getSystem(), owner); dynamic_cast<CalcCustomGBForceKernel&>(kernel.getImpl()).initialize(context.getSystem(), owner);
} }
void CustomGBForceImpl::calcForces(ContextImpl& context) { double CustomGBForceImpl::calcForcesAndEnergy(ContextImpl& context, bool includeForces, bool includeEnergy) {
dynamic_cast<CalcCustomGBForceKernel&>(kernel.getImpl()).executeForces(context); return dynamic_cast<CalcCustomGBForceKernel&>(kernel.getImpl()).execute(context, includeForces, includeEnergy);
}
double CustomGBForceImpl::calcEnergy(ContextImpl& context) {
return dynamic_cast<CalcCustomGBForceKernel&>(kernel.getImpl()).executeEnergy(context);
} }
vector<string> CustomGBForceImpl::getKernelNames() { vector<string> CustomGBForceImpl::getKernelNames() {
......
...@@ -178,12 +178,8 @@ void CustomHbondForceImpl::initialize(ContextImpl& context) { ...@@ -178,12 +178,8 @@ void CustomHbondForceImpl::initialize(ContextImpl& context) {
dynamic_cast<CalcCustomHbondForceKernel&>(kernel.getImpl()).initialize(context.getSystem(), owner); dynamic_cast<CalcCustomHbondForceKernel&>(kernel.getImpl()).initialize(context.getSystem(), owner);
} }
void CustomHbondForceImpl::calcForces(ContextImpl& context) { double CustomHbondForceImpl::calcForcesAndEnergy(ContextImpl& context, bool includeForces, bool includeEnergy) {
dynamic_cast<CalcCustomHbondForceKernel&>(kernel.getImpl()).executeForces(context); return dynamic_cast<CalcCustomHbondForceKernel&>(kernel.getImpl()).execute(context, includeForces, includeEnergy);
}
double CustomHbondForceImpl::calcEnergy(ContextImpl& context) {
return dynamic_cast<CalcCustomHbondForceKernel&>(kernel.getImpl()).executeEnergy(context);
} }
vector<string> CustomHbondForceImpl::getKernelNames() { vector<string> CustomHbondForceImpl::getKernelNames() {
......
...@@ -105,12 +105,8 @@ void CustomNonbondedForceImpl::initialize(ContextImpl& context) { ...@@ -105,12 +105,8 @@ void CustomNonbondedForceImpl::initialize(ContextImpl& context) {
dynamic_cast<CalcCustomNonbondedForceKernel&>(kernel.getImpl()).initialize(context.getSystem(), owner); dynamic_cast<CalcCustomNonbondedForceKernel&>(kernel.getImpl()).initialize(context.getSystem(), owner);
} }
void CustomNonbondedForceImpl::calcForces(ContextImpl& context) { double CustomNonbondedForceImpl::calcForcesAndEnergy(ContextImpl& context, bool includeForces, bool includeEnergy) {
dynamic_cast<CalcCustomNonbondedForceKernel&>(kernel.getImpl()).executeForces(context); return dynamic_cast<CalcCustomNonbondedForceKernel&>(kernel.getImpl()).execute(context, includeForces, includeEnergy);
}
double CustomNonbondedForceImpl::calcEnergy(ContextImpl& context) {
return dynamic_cast<CalcCustomNonbondedForceKernel&>(kernel.getImpl()).executeEnergy(context);
} }
vector<string> CustomNonbondedForceImpl::getKernelNames() { vector<string> CustomNonbondedForceImpl::getKernelNames() {
......
...@@ -94,12 +94,8 @@ void CustomTorsionForceImpl::initialize(ContextImpl& context) { ...@@ -94,12 +94,8 @@ void CustomTorsionForceImpl::initialize(ContextImpl& context) {
dynamic_cast<CalcCustomTorsionForceKernel&>(kernel.getImpl()).initialize(context.getSystem(), owner); dynamic_cast<CalcCustomTorsionForceKernel&>(kernel.getImpl()).initialize(context.getSystem(), owner);
} }
void CustomTorsionForceImpl::calcForces(ContextImpl& context) { double CustomTorsionForceImpl::calcForcesAndEnergy(ContextImpl& context, bool includeForces, bool includeEnergy) {
dynamic_cast<CalcCustomTorsionForceKernel&>(kernel.getImpl()).executeForces(context); return dynamic_cast<CalcCustomTorsionForceKernel&>(kernel.getImpl()).execute(context, includeForces, includeEnergy);
}
double CustomTorsionForceImpl::calcEnergy(ContextImpl& context) {
return dynamic_cast<CalcCustomTorsionForceKernel&>(kernel.getImpl()).executeEnergy(context);
} }
vector<string> CustomTorsionForceImpl::getKernelNames() { vector<string> CustomTorsionForceImpl::getKernelNames() {
......
...@@ -55,12 +55,8 @@ void GBSAOBCForceImpl::initialize(ContextImpl& context) { ...@@ -55,12 +55,8 @@ void GBSAOBCForceImpl::initialize(ContextImpl& context) {
dynamic_cast<CalcGBSAOBCForceKernel&>(kernel.getImpl()).initialize(context.getSystem(), owner); dynamic_cast<CalcGBSAOBCForceKernel&>(kernel.getImpl()).initialize(context.getSystem(), owner);
} }
void GBSAOBCForceImpl::calcForces(ContextImpl& context) { double GBSAOBCForceImpl::calcForcesAndEnergy(ContextImpl& context, bool includeForces, bool includeEnergy) {
dynamic_cast<CalcGBSAOBCForceKernel&>(kernel.getImpl()).executeForces(context); return dynamic_cast<CalcGBSAOBCForceKernel&>(kernel.getImpl()).execute(context, includeForces, includeEnergy);
}
double GBSAOBCForceImpl::calcEnergy(ContextImpl& context) {
return dynamic_cast<CalcGBSAOBCForceKernel&>(kernel.getImpl()).executeEnergy(context);
} }
std::vector<std::string> GBSAOBCForceImpl::getKernelNames() { std::vector<std::string> GBSAOBCForceImpl::getKernelNames() {
......
...@@ -239,12 +239,8 @@ void GBVIForceImpl::findScaledRadii( int numberOfParticles, const std::vector<st ...@@ -239,12 +239,8 @@ void GBVIForceImpl::findScaledRadii( int numberOfParticles, const std::vector<st
} }
void GBVIForceImpl::calcForces(ContextImpl& context) { double GBVIForceImpl::calcForcesAndEnergy(ContextImpl& context, bool includeForces, bool includeEnergy) {
dynamic_cast<CalcGBVIForceKernel&>(kernel.getImpl()).executeForces(context); return dynamic_cast<CalcGBVIForceKernel&>(kernel.getImpl()).execute(context, includeForces, includeEnergy);
}
double GBVIForceImpl::calcEnergy(ContextImpl& context) {
return dynamic_cast<CalcGBVIForceKernel&>(kernel.getImpl()).executeEnergy(context);
} }
std::vector<std::string> GBVIForceImpl::getKernelNames() { std::vector<std::string> GBVIForceImpl::getKernelNames() {
......
...@@ -49,12 +49,8 @@ void HarmonicAngleForceImpl::initialize(ContextImpl& context) { ...@@ -49,12 +49,8 @@ void HarmonicAngleForceImpl::initialize(ContextImpl& context) {
dynamic_cast<CalcHarmonicAngleForceKernel&>(kernel.getImpl()).initialize(context.getSystem(), owner); dynamic_cast<CalcHarmonicAngleForceKernel&>(kernel.getImpl()).initialize(context.getSystem(), owner);
} }
void HarmonicAngleForceImpl::calcForces(ContextImpl& context) { double HarmonicAngleForceImpl::calcForcesAndEnergy(ContextImpl& context, bool includeForces, bool includeEnergy) {
dynamic_cast<CalcHarmonicAngleForceKernel&>(kernel.getImpl()).executeForces(context); return dynamic_cast<CalcHarmonicAngleForceKernel&>(kernel.getImpl()).execute(context, includeForces, includeEnergy);
}
double HarmonicAngleForceImpl::calcEnergy(ContextImpl& context) {
return dynamic_cast<CalcHarmonicAngleForceKernel&>(kernel.getImpl()).executeEnergy(context);
} }
std::vector<std::string> HarmonicAngleForceImpl::getKernelNames() { std::vector<std::string> HarmonicAngleForceImpl::getKernelNames() {
......
...@@ -49,12 +49,8 @@ void HarmonicBondForceImpl::initialize(ContextImpl& context) { ...@@ -49,12 +49,8 @@ void HarmonicBondForceImpl::initialize(ContextImpl& context) {
dynamic_cast<CalcHarmonicBondForceKernel&>(kernel.getImpl()).initialize(context.getSystem(), owner); dynamic_cast<CalcHarmonicBondForceKernel&>(kernel.getImpl()).initialize(context.getSystem(), owner);
} }
void HarmonicBondForceImpl::calcForces(ContextImpl& context) { double HarmonicBondForceImpl::calcForcesAndEnergy(ContextImpl& context, bool includeForces, bool includeEnergy) {
dynamic_cast<CalcHarmonicBondForceKernel&>(kernel.getImpl()).executeForces(context); return dynamic_cast<CalcHarmonicBondForceKernel&>(kernel.getImpl()).execute(context, includeForces, includeEnergy);
}
double HarmonicBondForceImpl::calcEnergy(ContextImpl& context) {
return dynamic_cast<CalcHarmonicBondForceKernel&>(kernel.getImpl()).executeEnergy(context);
} }
std::vector<std::string> HarmonicBondForceImpl::getKernelNames() { std::vector<std::string> HarmonicBondForceImpl::getKernelNames() {
......
...@@ -63,7 +63,7 @@ vector<string> LangevinIntegrator::getKernelNames() { ...@@ -63,7 +63,7 @@ vector<string> LangevinIntegrator::getKernelNames() {
void LangevinIntegrator::step(int steps) { void LangevinIntegrator::step(int steps) {
for (int i = 0; i < steps; ++i) { for (int i = 0; i < steps; ++i) {
context->updateContextState(); context->updateContextState();
context->calcForces(); context->calcForcesAndEnergy(true, false);
dynamic_cast<IntegrateLangevinStepKernel&>(kernel.getImpl()).execute(*context, *this); dynamic_cast<IntegrateLangevinStepKernel&>(kernel.getImpl()).execute(*context, *this);
} }
} }
...@@ -98,12 +98,8 @@ void NonbondedForceImpl::initialize(ContextImpl& context) { ...@@ -98,12 +98,8 @@ void NonbondedForceImpl::initialize(ContextImpl& context) {
dynamic_cast<CalcNonbondedForceKernel&>(kernel.getImpl()).initialize(context.getSystem(), owner); dynamic_cast<CalcNonbondedForceKernel&>(kernel.getImpl()).initialize(context.getSystem(), owner);
} }
void NonbondedForceImpl::calcForces(ContextImpl& context) { double NonbondedForceImpl::calcForcesAndEnergy(ContextImpl& context, bool includeForces, bool includeEnergy) {
dynamic_cast<CalcNonbondedForceKernel&>(kernel.getImpl()).executeForces(context); return dynamic_cast<CalcNonbondedForceKernel&>(kernel.getImpl()).execute(context, includeForces, includeEnergy);
}
double NonbondedForceImpl::calcEnergy(ContextImpl& context) {
return dynamic_cast<CalcNonbondedForceKernel&>(kernel.getImpl()).executeEnergy(context);
} }
std::vector<std::string> NonbondedForceImpl::getKernelNames() { std::vector<std::string> NonbondedForceImpl::getKernelNames() {
......
...@@ -49,12 +49,8 @@ void PeriodicTorsionForceImpl::initialize(ContextImpl& context) { ...@@ -49,12 +49,8 @@ void PeriodicTorsionForceImpl::initialize(ContextImpl& context) {
dynamic_cast<CalcPeriodicTorsionForceKernel&>(kernel.getImpl()).initialize(context.getSystem(), owner); dynamic_cast<CalcPeriodicTorsionForceKernel&>(kernel.getImpl()).initialize(context.getSystem(), owner);
} }
void PeriodicTorsionForceImpl::calcForces(ContextImpl& context) { double PeriodicTorsionForceImpl::calcForcesAndEnergy(ContextImpl& context, bool includeForces, bool includeEnergy) {
dynamic_cast<CalcPeriodicTorsionForceKernel&>(kernel.getImpl()).executeForces(context); return dynamic_cast<CalcPeriodicTorsionForceKernel&>(kernel.getImpl()).execute(context, includeForces, includeEnergy);
}
double PeriodicTorsionForceImpl::calcEnergy(ContextImpl& context) {
return dynamic_cast<CalcPeriodicTorsionForceKernel&>(kernel.getImpl()).executeEnergy(context);
} }
std::vector<std::string> PeriodicTorsionForceImpl::getKernelNames() { std::vector<std::string> PeriodicTorsionForceImpl::getKernelNames() {
......
...@@ -49,12 +49,8 @@ void RBTorsionForceImpl::initialize(ContextImpl& context) { ...@@ -49,12 +49,8 @@ void RBTorsionForceImpl::initialize(ContextImpl& context) {
dynamic_cast<CalcRBTorsionForceKernel&>(kernel.getImpl()).initialize(context.getSystem(), owner); dynamic_cast<CalcRBTorsionForceKernel&>(kernel.getImpl()).initialize(context.getSystem(), owner);
} }
void RBTorsionForceImpl::calcForces(ContextImpl& context) { double RBTorsionForceImpl::calcForcesAndEnergy(ContextImpl& context, bool includeForces, bool includeEnergy) {
dynamic_cast<CalcRBTorsionForceKernel&>(kernel.getImpl()).executeForces(context); return dynamic_cast<CalcRBTorsionForceKernel&>(kernel.getImpl()).execute(context, includeForces, includeEnergy);
}
double RBTorsionForceImpl::calcEnergy(ContextImpl& context) {
return dynamic_cast<CalcRBTorsionForceKernel&>(kernel.getImpl()).executeEnergy(context);
} }
std::vector<std::string> RBTorsionForceImpl::getKernelNames() { std::vector<std::string> RBTorsionForceImpl::getKernelNames() {
......
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