Unverified Commit cfb0882d authored by Evan Pretti's avatar Evan Pretti Committed by GitHub
Browse files

Merge pull request #5013 from epretti/custom-integrator-memory-usage

Don't reinitialize CustomIntegrator on every step when no computations are present
parents 2abeb801 fa0fb1dd
...@@ -43,6 +43,7 @@ class ReferenceCustomDynamics : public ReferenceDynamics { ...@@ -43,6 +43,7 @@ class ReferenceCustomDynamics : public ReferenceDynamics {
private: private:
class DerivFunction; class DerivFunction;
bool initialized;
const OpenMM::CustomIntegrator& integrator; const OpenMM::CustomIntegrator& integrator;
std::vector<double> inverseMasses; std::vector<double> inverseMasses;
std::vector<OpenMM::Vec3> sumBuffer, oldPos; std::vector<OpenMM::Vec3> sumBuffer, oldPos;
......
...@@ -84,7 +84,7 @@ static bool isVectorExpression(const ExpressionTreeNode& node) { ...@@ -84,7 +84,7 @@ static bool isVectorExpression(const ExpressionTreeNode& node) {
--------------------------------------------------------------------------------------- */ --------------------------------------------------------------------------------------- */
ReferenceCustomDynamics::ReferenceCustomDynamics(int numberOfAtoms, const CustomIntegrator& integrator) : ReferenceCustomDynamics::ReferenceCustomDynamics(int numberOfAtoms, const CustomIntegrator& integrator) :
ReferenceDynamics(numberOfAtoms, integrator.getStepSize(), 0.0), integrator(integrator) { ReferenceDynamics(numberOfAtoms, integrator.getStepSize(), 0.0), initialized(false), integrator(integrator) {
sumBuffer.resize(numberOfAtoms); sumBuffer.resize(numberOfAtoms);
oldPos.resize(numberOfAtoms); oldPos.resize(numberOfAtoms);
stepType.resize(integrator.getNumComputations()); stepType.resize(integrator.getNumComputations());
...@@ -195,6 +195,8 @@ void ReferenceCustomDynamics::initialize(ContextImpl& context, vector<double>& m ...@@ -195,6 +195,8 @@ void ReferenceCustomDynamics::initialize(ContextImpl& context, vector<double>& m
perDofVariableIndex.push_back(expressionSet.getVariableIndex(integrator.getPerDofVariableName(i))); perDofVariableIndex.push_back(expressionSet.getVariableIndex(integrator.getPerDofVariableName(i)));
for (int i = 0; i < stepVariable.size(); i++) for (int i = 0; i < stepVariable.size(); i++)
stepVariableIndex.push_back(expressionSet.getVariableIndex(stepVariable[i])); stepVariableIndex.push_back(expressionSet.getVariableIndex(stepVariable[i]));
initialized = true;
} }
ExpressionTreeNode ReferenceCustomDynamics::replaceDerivFunctions(const ExpressionTreeNode& node, ContextImpl& context) { ExpressionTreeNode ReferenceCustomDynamics::replaceDerivFunctions(const ExpressionTreeNode& node, ContextImpl& context) {
...@@ -232,7 +234,7 @@ ExpressionTreeNode ReferenceCustomDynamics::replaceDerivFunctions(const Expressi ...@@ -232,7 +234,7 @@ ExpressionTreeNode ReferenceCustomDynamics::replaceDerivFunctions(const Expressi
void ReferenceCustomDynamics::update(ContextImpl& context, int numberOfAtoms, vector<Vec3>& atomCoordinates, void ReferenceCustomDynamics::update(ContextImpl& context, int numberOfAtoms, vector<Vec3>& atomCoordinates,
vector<Vec3>& velocities, vector<Vec3>& forces, vector<double>& masses, vector<Vec3>& velocities, vector<Vec3>& forces, vector<double>& masses,
map<string, double>& globals, vector<vector<Vec3> >& perDof, bool& forcesAreValid, double tolerance) { map<string, double>& globals, vector<vector<Vec3> >& perDof, bool& forcesAreValid, double tolerance) {
if (invalidatesForces.size() == 0) if (!initialized)
initialize(context, masses, globals); initialize(context, masses, globals);
int numSteps = stepType.size(); int numSteps = stepType.size();
globals.insert(context.getParameters().begin(), context.getParameters().end()); globals.insert(context.getParameters().begin(), context.getParameters().end());
...@@ -458,7 +460,7 @@ void ReferenceCustomDynamics::recordChangedParameters(OpenMM::ContextImpl& conte ...@@ -458,7 +460,7 @@ void ReferenceCustomDynamics::recordChangedParameters(OpenMM::ContextImpl& conte
double ReferenceCustomDynamics::computeKineticEnergy(OpenMM::ContextImpl& context, int numberOfAtoms, std::vector<OpenMM::Vec3>& atomCoordinates, double ReferenceCustomDynamics::computeKineticEnergy(OpenMM::ContextImpl& context, int numberOfAtoms, std::vector<OpenMM::Vec3>& atomCoordinates,
std::vector<OpenMM::Vec3>& velocities, std::vector<OpenMM::Vec3>& forces, std::vector<double>& masses, std::vector<OpenMM::Vec3>& velocities, std::vector<OpenMM::Vec3>& forces, std::vector<double>& masses,
std::map<std::string, double>& globals, std::vector<std::vector<OpenMM::Vec3> >& perDof, bool& forcesAreValid) { std::map<std::string, double>& globals, std::vector<std::vector<OpenMM::Vec3> >& perDof, bool& forcesAreValid) {
if (invalidatesForces.size() == 0) if (!initialized)
initialize(context, masses, globals); initialize(context, masses, globals);
globals.insert(context.getParameters().begin(), context.getParameters().end()); globals.insert(context.getParameters().begin(), context.getParameters().end());
for (auto& global : globals) for (auto& global : globals)
......
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