Skip to content
Snippets Groups Projects
Commit 330ec03a authored by Studer Gabriel's avatar Studer Gabriel
Browse files

speedups in state extractor

parent f1e6408b
Branches
Tags
No related merge requests found
...@@ -4,34 +4,37 @@ ...@@ -4,34 +4,37 @@
namespace ost { namespace mol{ namespace mm{ namespace ost { namespace mol{ namespace mm{
void StateExtractor::ExtractPotentialEnergy(boost::shared_ptr<OpenMM::Context> context, void StateExtractor::ExtractPotentialEnergy(boost::shared_ptr<OpenMM::Context> context,
Real& energy){ Real& energy){
OpenMM::State s = context->getState(OpenMM::State::Energy); OpenMM::State s = context->getState(OpenMM::State::Energy);
energy = s.getPotentialEnergy(); energy = s.getPotentialEnergy();
} }
void StateExtractor::ExtractKineticEnergy(boost::shared_ptr<OpenMM::Context> context, void StateExtractor::ExtractKineticEnergy(boost::shared_ptr<OpenMM::Context> context,
Real& energy){ Real& energy){
OpenMM::State s = context->getState(OpenMM::State::Energy); OpenMM::State s = context->getState(OpenMM::State::Energy);
energy = s.getKineticEnergy(); energy = s.getKineticEnergy();
} }
void StateExtractor::ExtractEnergy(boost::shared_ptr<OpenMM::Context> context, void StateExtractor::ExtractEnergy(boost::shared_ptr<OpenMM::Context> context,
Real& energy){ Real& energy){
OpenMM::State s = context->getState(OpenMM::State::Energy); OpenMM::State s = context->getState(OpenMM::State::Energy);
energy = s.getKineticEnergy() + s.getPotentialEnergy(); energy = s.getKineticEnergy() + s.getPotentialEnergy();
} }
void StateExtractor::ExtractPositions(boost::shared_ptr<OpenMM::Context> context, 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); OpenMM::State s = context->getState(OpenMM::State::Positions, enforce_periodic_box);
std::vector<OpenMM::Vec3> p = s.getPositions(); const std::vector<OpenMM::Vec3>& p = s.getPositions();
for(std::vector<OpenMM::Vec3>::iterator i = p.begin(); i != p.end(); ++i){ int actual_index = 0;
positions.push_back(geom::Vec3((*i)[0],(*i)[1],(*i)[2])); 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; if(in_angstrom) positions*=10.0;
} }
...@@ -39,22 +42,26 @@ void StateExtractor::ExtractPositions(boost::shared_ptr<OpenMM::Context> context ...@@ -39,22 +42,26 @@ void StateExtractor::ExtractPositions(boost::shared_ptr<OpenMM::Context> context
void StateExtractor::ExtractVelocities(boost::shared_ptr<OpenMM::Context> context, void StateExtractor::ExtractVelocities(boost::shared_ptr<OpenMM::Context> context,
geom::Vec3List& velocities){ geom::Vec3List& velocities){
velocities.clear(); velocities.resize(context->getSystem().getNumParticles());
OpenMM::State s = context->getState(OpenMM::State::Velocities); OpenMM::State s = context->getState(OpenMM::State::Velocities);
std::vector<OpenMM::Vec3> v = s.getVelocities(); const std::vector<OpenMM::Vec3>& v = s.getVelocities();
for(std::vector<OpenMM::Vec3>::iterator i = v.begin(); i != v.end(); ++i){ int actual_index = 0;
velocities.push_back(geom::Vec3((*i)[0],(*i)[1],(*i)[2])); 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, 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); OpenMM::State s = context->getState(OpenMM::State::Forces);
std::vector<OpenMM::Vec3> f = s.getForces(); const std::vector<OpenMM::Vec3>& f = s.getForces();
for(std::vector<OpenMM::Vec3>::iterator i = f.begin(); i != f.end(); ++i){ int actual_index = 0;
forces.push_back(geom::Vec3((*i)[0],(*i)[1],(*i)[2])); 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;
} }
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment