"wrappers/vscode:/vscode.git/clone" did not exist on "58d0c5481159e19a6284f9f6477fd4f0fe1399c8"
Commit c096fa02 authored by peastman's avatar peastman
Browse files

Merge pull request #959 from kyleabeauchamp/intsegfault

Add check for null context inside integrator.step()
parents d557fa41 8be6e843
......@@ -72,6 +72,8 @@ double BrownianIntegrator::computeKineticEnergy() {
}
void BrownianIntegrator::step(int steps) {
if (context == NULL)
throw OpenMMException("This Integrator is not bound to a context!");
for (int i = 0; i < steps; ++i) {
context->updateContextState();
context->calcForcesAndEnergy(true, false);
......
......@@ -94,6 +94,8 @@ double CustomIntegrator::computeKineticEnergy() {
}
void CustomIntegrator::step(int steps) {
if (context == NULL)
throw OpenMMException("This Integrator is not bound to a context!");
globalsAreCurrent = false;
for (int i = 0; i < steps; ++i) {
kernel.getAs<IntegrateCustomStepKernel>().execute(*context, *this, forcesAreValid);
......
......@@ -72,6 +72,8 @@ double LangevinIntegrator::computeKineticEnergy() {
}
void LangevinIntegrator::step(int steps) {
if (context == NULL)
throw OpenMMException("This Integrator is not bound to a context!");
for (int i = 0; i < steps; ++i) {
context->updateContextState();
context->calcForcesAndEnergy(true, false);
......
......@@ -75,6 +75,8 @@ double VariableLangevinIntegrator::computeKineticEnergy() {
}
void VariableLangevinIntegrator::step(int steps) {
if (context == NULL)
throw OpenMMException("This Integrator is not bound to a context!");
for (int i = 0; i < steps; ++i) {
context->updateContextState();
context->calcForcesAndEnergy(true, false);
......@@ -83,6 +85,8 @@ void VariableLangevinIntegrator::step(int steps) {
}
void VariableLangevinIntegrator::stepTo(double time) {
if (context == NULL)
throw OpenMMException("This Integrator is not bound to a context!");
while (time > context->getTime()) {
context->updateContextState();
context->calcForcesAndEnergy(true, false);
......
......@@ -70,6 +70,8 @@ double VariableVerletIntegrator::computeKineticEnergy() {
}
void VariableVerletIntegrator::step(int steps) {
if (context == NULL)
throw OpenMMException("This Integrator is not bound to a context!");
for (int i = 0; i < steps; ++i) {
context->updateContextState();
context->calcForcesAndEnergy(true, false);
......@@ -78,6 +80,8 @@ void VariableVerletIntegrator::step(int steps) {
}
void VariableVerletIntegrator::stepTo(double time) {
if (context == NULL)
throw OpenMMException("This Integrator is not bound to a context!");
while (time > context->getTime()) {
context->updateContextState();
context->calcForcesAndEnergy(true, false);
......
......@@ -69,6 +69,8 @@ double VerletIntegrator::computeKineticEnergy() {
}
void VerletIntegrator::step(int steps) {
if (context == NULL)
throw OpenMMException("This Integrator is not bound to a context!");
for (int i = 0; i < steps; ++i) {
context->updateContextState();
context->calcForcesAndEnergy(true, false);
......
......@@ -89,6 +89,8 @@ double DrudeLangevinIntegrator::computeKineticEnergy() {
}
void DrudeLangevinIntegrator::step(int steps) {
if (context == NULL)
throw OpenMMException("This Integrator is not bound to a context!");
for (int i = 0; i < steps; ++i) {
context->updateContextState();
context->calcForcesAndEnergy(true, false);
......
......@@ -86,6 +86,8 @@ double DrudeSCFIntegrator::computeKineticEnergy() {
}
void DrudeSCFIntegrator::step(int steps) {
if (context == NULL)
throw OpenMMException("This Integrator is not bound to a context!");
for (int i = 0; i < steps; ++i) {
context->updateContextState();
context->calcForcesAndEnergy(true, false);
......
......@@ -100,7 +100,7 @@ State RPMDIntegrator::getState(int copy, int types, bool enforcePeriodicBox, int
// Call setPositions() on the Context so it doesn't think the user is trying to
// run a simulation without setting positions first. These positions will
// immediately get overwritten by the ones stored in this integrator.
vector<Vec3> p(context->getSystem().getNumParticles(), Vec3());
context->getOwner().setPositions(p);
isFirstStep = false;
......@@ -110,7 +110,7 @@ State RPMDIntegrator::getState(int copy, int types, bool enforcePeriodicBox, int
if (enforcePeriodicBox && copy > 0 && (types&State::Positions) != 0) {
// Apply periodic boundary conditions based on copy 0. Otherwise, molecules might end
// up in different places for different copies.
kernel.getAs<IntegrateRPMDStepKernel>().copyToContext(0, *context);
State state2 = context->getOwner().getState(State::Positions, false, groups);
vector<Vec3> positions = state.getPositions();
......@@ -144,9 +144,9 @@ State RPMDIntegrator::getState(int copy, int types, bool enforcePeriodicBox, int
pos[2] -= dz;
}
}
// Construct the new State.
State::StateBuilder builder(state.getTime());
builder.setPositions(positions);
builder.setPeriodicBoxVectors(periodicBoxSize[0], periodicBoxSize[1], periodicBoxSize[2]);
......@@ -168,16 +168,18 @@ double RPMDIntegrator::computeKineticEnergy() {
}
void RPMDIntegrator::step(int steps) {
if (context == NULL)
throw OpenMMException("This Integrator is not bound to a context!");
if (!hasSetPosition) {
// Initialize the positions from the context.
State s = context->getOwner().getState(State::Positions);
for (int i = 0; i < numCopies; i++)
setPositions(i, s.getPositions());
}
if (!hasSetVelocity) {
// Initialize the velocities from the context.
State s = context->getOwner().getState(State::Velocities);
for (int i = 0; i < numCopies; i++)
setVelocities(i, s.getVelocities());
......@@ -186,7 +188,7 @@ void RPMDIntegrator::step(int steps) {
// Call setPositions() on the Context so it doesn't think the user is trying to
// run a simulation without setting positions first. These positions will
// immediately get overwritten by the ones stored in this integrator.
vector<Vec3> p(context->getSystem().getNumParticles(), Vec3());
context->getOwner().setPositions(p);
isFirstStep = false;
......@@ -212,12 +214,12 @@ double RPMDIntegrator::getTotalEnergy() {
State prevState = getState(numCopies-1, State::Positions);
for (int i = 0; i < numCopies; i++) {
// Add the energy of this copy.
State state = getState(i, State::Positions | State::Energy);
energy += state.getKineticEnergy()+state.getPotentialEnergy();
// Add the energy from the springs connecting it to the previous copy.
for (int j = 0; j < numParticles; j++) {
Vec3 delta = state.getPositions()[j]-prevState.getPositions()[j];
energy += 0.5*wn*wn*system.getParticleMass(j)*delta.dot(delta);
......
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