void MolecularDynamics::assign_velocities(Float temperature) { ParticleIndexes ips = get_simulation_particle_indexes(); setup_degrees_of_freedom(ips); ParticlesTemp ps = IMP::internal::get_particle(get_model(), ips); boost::normal_distribution<Float> mrng(0., 1.); boost::variate_generator<RandomNumberGenerator &, boost::normal_distribution<Float> > sampler(random_number_generator, mrng); for (ParticlesTemp::iterator iter = ps.begin(); iter != ps.end(); ++iter) { Particle *p = *iter; LinearVelocity(p).set_velocity(algebra::Vector3D(sampler(), sampler(), sampler())); } Float rescale = sqrt(temperature / get_kinetic_temperature(get_kinetic_energy())); for (ParticlesTemp::iterator iter = ps.begin(); iter != ps.end(); ++iter) { Particle *p = *iter; LinearVelocity v(p); algebra::Vector3D velocity = v.get_velocity(); velocity *= rescale; v.set_velocity(velocity); } }
void MolecularDynamics::assign_velocities(Float temperature) { ParticleIndexes ips=get_simulation_particle_indexes(); setup_degrees_of_freedom(ips); ParticlesTemp ps= IMP::internal::get_particle(get_model(), ips); boost::normal_distribution<Float> mrng(0., 1.); boost::variate_generator<RandomNumberGenerator&, boost::normal_distribution<Float> > sampler(random_number_generator, mrng); for (ParticlesTemp::iterator iter = ps.begin(); iter != ps.end(); ++iter) { Particle *p = *iter; for (int i = 0; i < 3; ++i) { p->set_value(vs_[i], sampler()); } } Float rescale = sqrt(temperature/ get_kinetic_temperature(get_kinetic_energy())); for (ParticlesTemp::iterator iter = ps.begin(); iter != ps.end(); ++iter) { Particle *p = *iter; for (int i = 0; i < 3; ++i) { Float velocity = p->get_value(vs_[i]); velocity *= rescale; p->set_value(vs_[i], velocity); } } }