void BerendsenThermostatOptimizerState::rescale_velocities() const { MolecularDynamics *md = dynamic_cast<MolecularDynamics *>(get_optimizer()); IMP_INTERNAL_CHECK(md, "Can only use velocity scaling with " "the molecular dynamics optimizer."); double kinetic_temp = md->get_kinetic_temperature(md->get_kinetic_energy()); double rescale = std::sqrt(1.0 + (md->get_last_time_step() / tau_) * (temperature_ / kinetic_temp - 1.0)); for (unsigned int i=0; i< pis_.size(); ++i) { Particle *p = pis_[i]; for (int i = 0; i < 3; ++i) { double velocity = p->get_value(vs_[i]); velocity *= rescale; p->set_value(vs_[i], velocity); } } }