diff --git a/modules/mol/mm/src/state_extractor.cc b/modules/mol/mm/src/state_extractor.cc index 3bb36f7a7b3b143bba9f446c4e0f70c4acf837ae..72043b2aeb190805335c1ba1927d4fe3bb94055a 100644 --- a/modules/mol/mm/src/state_extractor.cc +++ b/modules/mol/mm/src/state_extractor.cc @@ -4,34 +4,37 @@ namespace ost { namespace mol{ namespace mm{ void StateExtractor::ExtractPotentialEnergy(boost::shared_ptr<OpenMM::Context> context, - Real& energy){ + Real& energy){ OpenMM::State s = context->getState(OpenMM::State::Energy); energy = s.getPotentialEnergy(); } void StateExtractor::ExtractKineticEnergy(boost::shared_ptr<OpenMM::Context> context, - Real& energy){ + Real& energy){ OpenMM::State s = context->getState(OpenMM::State::Energy); energy = s.getKineticEnergy(); } void StateExtractor::ExtractEnergy(boost::shared_ptr<OpenMM::Context> context, - Real& energy){ + Real& energy){ OpenMM::State s = context->getState(OpenMM::State::Energy); energy = s.getKineticEnergy() + s.getPotentialEnergy(); } void StateExtractor::ExtractPositions(boost::shared_ptr<OpenMM::Context> context, - geom::Vec3List& positions, bool enforce_periodic_box, bool in_angstrom){ + geom::Vec3List& positions, bool enforce_periodic_box, + bool in_angstrom){ - positions.clear(); + positions.resize(context->getSystem().getNumParticles()); OpenMM::State s = context->getState(OpenMM::State::Positions, enforce_periodic_box); - std::vector<OpenMM::Vec3> p = s.getPositions(); - for(std::vector<OpenMM::Vec3>::iterator i = p.begin(); i != p.end(); ++i){ - positions.push_back(geom::Vec3((*i)[0],(*i)[1],(*i)[2])); + const std::vector<OpenMM::Vec3>& p = s.getPositions(); + int actual_index = 0; + for(std::vector<OpenMM::Vec3>::const_iterator i = p.begin(); i != p.end(); ++i){ + positions[actual_index] = geom::Vec3((*i)[0],(*i)[1],(*i)[2]); + ++actual_index; } if(in_angstrom) positions*=10.0; } @@ -39,22 +42,26 @@ void StateExtractor::ExtractPositions(boost::shared_ptr<OpenMM::Context> context void StateExtractor::ExtractVelocities(boost::shared_ptr<OpenMM::Context> context, geom::Vec3List& velocities){ - velocities.clear(); + velocities.resize(context->getSystem().getNumParticles()); OpenMM::State s = context->getState(OpenMM::State::Velocities); - std::vector<OpenMM::Vec3> v = s.getVelocities(); - for(std::vector<OpenMM::Vec3>::iterator i = v.begin(); i != v.end(); ++i){ - velocities.push_back(geom::Vec3((*i)[0],(*i)[1],(*i)[2])); + const std::vector<OpenMM::Vec3>& v = s.getVelocities(); + int actual_index = 0; + for(std::vector<OpenMM::Vec3>::const_iterator i = v.begin(); i != v.end(); ++i){ + velocities[actual_index] = geom::Vec3((*i)[0],(*i)[1],(*i)[2]); + ++actual_index; } } void StateExtractor::ExtractForces(boost::shared_ptr<OpenMM::Context> context, - geom::Vec3List& forces){ + geom::Vec3List& forces){ - forces.clear(); + forces.resize(context->getSystem().getNumParticles()); OpenMM::State s = context->getState(OpenMM::State::Forces); - std::vector<OpenMM::Vec3> f = s.getForces(); - for(std::vector<OpenMM::Vec3>::iterator i = f.begin(); i != f.end(); ++i){ - forces.push_back(geom::Vec3((*i)[0],(*i)[1],(*i)[2])); + const std::vector<OpenMM::Vec3>& f = s.getForces(); + int actual_index = 0; + for(std::vector<OpenMM::Vec3>::const_iterator i = f.begin(); i != f.end(); ++i){ + forces[actual_index] = geom::Vec3((*i)[0],(*i)[1],(*i)[2]); + ++actual_index; } }