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); } } }
void LangevinThermostatOptimizerState::rescale_velocities() const { static const double gas_constant = 8.31441e-7; MolecularDynamics *md = dynamic_cast<MolecularDynamics *>(get_optimizer()); double c1 = exp(-gamma_ * md->get_last_time_step()); double c2 = sqrt((1.0 - c1) * gas_constant * temperature_); IMP_INTERNAL_CHECK(md, "Can only use velocity scaling with " "the molecular dynamics optimizer."); boost::normal_distribution<Float> mrng(0., 1.); boost::variate_generator<RandomNumberGenerator &, boost::normal_distribution<Float> > sampler(random_number_generator, mrng); for (unsigned int i = 0; i < pis_.size(); ++i) { Particle *p = pis_[i]; double mass = Mass(p).get_mass(); LinearVelocity lv(p); lv.set_velocity(c1 * lv.get_velocity() + c2 * sqrt((c1 + 1.0) / mass) * algebra::Vector3D(sampler(), sampler(), sampler())); } }
core::MonteCarloMoverResult RevoluteJointMover::do_propose() { IMP_OBJECT_LOG; boost::normal_distribution<double> mrng(0, stddev_); boost::variate_generator<RandomNumberGenerator &, boost::normal_distribution<double> > sampler(random_number_generator, mrng); for (unsigned int i = 0; i < joints_.size(); ++i) { originals_[i] = joints_[i]->get_angle(); joints_[i]->set_angle(originals_[i] + sampler()); } //get changed particles' coordinates ParticleIndexes idx; core::RigidMembers tmp(joints_[0]->get_parent_node().get_rigid_members()); for (unsigned int i = 0; i < tmp.size(); ++i) idx.push_back(tmp[i]->get_index()); for (unsigned int j = 0; j < joints_.size(); ++j) { tmp = joints_[j]->get_child_node().get_rigid_members(); for (unsigned int i = 0; i < tmp.size(); ++i) idx.push_back(tmp[i]->get_index()); } return core::MonteCarloMoverResult(idx, 1.0); }
MonteCarloMoverResult NormalMover::do_propose() { IMP_OBJECT_LOG; boost::normal_distribution<double> mrng(0, stddev_); boost::variate_generator<RandomNumberGenerator &, boost::normal_distribution<double> > sampler(random_number_generator, mrng); for (unsigned int i = 0; i < pis_.size(); ++i) { for (unsigned int j = 0; j < keys_.size(); ++j) { originals_[i][j] = get_model()->get_attribute(keys_[j], pis_[i]); } for (unsigned int j = 0; j < keys_.size(); ++j) { IMP_USAGE_CHECK( get_model()->get_is_optimized(keys_[j], pis_[i]), "NormalMover can't move non-optimized attribute. " << "particle: " << get_model()->get_particle_name(pis_[i]) << "attribute: " << keys_[j]); get_model()->set_attribute(keys_[j], pis_[i], originals_[i][j] + sampler()); } } return MonteCarloMoverResult(pis_, 1.0); }