diff --git a/modules/mol/mm/src/steep.cc b/modules/mol/mm/src/steep.cc index b33d5fb09823dbbd4a8c718f21627dc78d24eb24..05c4d96d3489a90c90f468c22a6627cdb1f3a113 100644 --- a/modules/mol/mm/src/steep.cc +++ b/modules/mol/mm/src/steep.cc @@ -3,14 +3,17 @@ namespace ost{ namespace mol{ namespace mm{ -void Steep::Minimize(OpenMM::Context& context, double tolerance, uint max_iterations) { +bool Steep::Minimize(OpenMM::Context& context, double tolerance, uint max_iterations) { const OpenMM::System& system = context.getSystem(); if(system.getNumConstraints() > 0){ throw ost::Error("Cannot handle constraints in steepest descent, use lbgfs instead!"); } - if( tolerance < 0.0 ){ + if( tolerance <= 0.0 ){ throw ost::Error("tolerance value must be greater 0.0!"); //also important to avoid zero division error when calculating normalization factor for forces } + + bool converged = false; + OpenMM::State state = context.getState(OpenMM::State::Energy | OpenMM::State::Forces | OpenMM::State::Positions); std::vector<OpenMM::Vec3> positions = state.getPositions(); std::vector<OpenMM::Vec3> new_positions = positions; @@ -35,7 +38,10 @@ void Steep::Minimize(OpenMM::Context& context, double tolerance, uint max_iterat max_length = std::max(max_length,forces[*j].dot(forces[*j])); } max_length = sqrt(max_length); - if(max_length <= tolerance) break; + if(max_length <= tolerance){ + converged = true; + break; + } factor = 1.0/max_length; for(std::vector<uint>::iterator j = non_zero_mass_particles.begin(); j != non_zero_mass_particles.end(); ++j){ @@ -62,5 +68,6 @@ void Steep::Minimize(OpenMM::Context& context, double tolerance, uint max_iterat } } context.setPositions(positions); + return converged; } }}}//ns diff --git a/modules/mol/mm/src/steep.hh b/modules/mol/mm/src/steep.hh index 567f46583b7289d492ff703f75adea2a84fafea6..c4fac44949989a9a936ada894d1a9ab84deba768 100644 --- a/modules/mol/mm/src/steep.hh +++ b/modules/mol/mm/src/steep.hh @@ -22,7 +22,7 @@ namespace ost { namespace mol { namespace mm{ class Steep { public: - static void Minimize(OpenMM::Context& context, double tolerance = 100, uint maxIterations = 1000); + static bool Minimize(OpenMM::Context& context, double tolerance = 100, uint maxIterations = 1000); }; }}}