def simulate_small_cluster(number_of_stars, end_time=40 | units.Myr, name_of_the_figure="test-2.svg"): random.seed() salpeter_masses = new_salpeter_mass_distribution(number_of_stars) total_mass = salpeter_masses.sum() convert_nbody = nbody_system.nbody_to_si(total_mass, 1.0 | units.parsec) convert_nbody.set_as_default() particles = new_plummer_model(number_of_stars, convert_nbody) gravity = PhiGRAPE(convert_nbody, mode="gpu") gravity.initialize_code() gravity.parameters.timestep_parameter = 0.01 gravity.parameters.initial_timestep_parameter = 0.01 gravity.parameters.epsilon_squared = 0.000001 | units.parsec**2 stellar_evolution = SSE() stellar_evolution.initialize_module_with_default_parameters() #print "setting masses of the stars" particles.radius = 0.0 | units.RSun #comment out to get plummer masses particles.mass = salpeter_masses gravity.particles.add_particles(particles) gravity.initialize_particles(0.0) from_model_to_gravity = particles.new_channel_to(gravity.particles) from_gravity_to_model = gravity.particles.new_channel_to(particles) time = 0.0 | units.Myr particles.savepoint(time) move_particles_to_center_of_mass(particles) kineticEnergy = gravity.kinetic_energy.value_in(units.J) potentialEnergy = gravity.potential_energy.value_in(units.J) ToverV = kineticEnergy / potentialEnergy file.write(str(time.value_in(units.Myr))) file.write(' ') file.write(str(ToverV)) file.write('\n') while time < end_time: time += 0.25 | units.Myr gravity.evolve_model(time) from_gravity_to_model.copy() print "Evolved model to t =", str(time) print "Evolved model to t =", str( convert_nbody.to_nbody(time.value_in(units.Myr) | units.Myr)) kineticEnergy = gravity.kinetic_energy.value_in(units.J) potentialEnergy = gravity.potential_energy.value_in(units.J) ToverV = kineticEnergy / potentialEnergy print "Kin / Pot =", ToverV #print "Particle Mass =", particles[1].mass file.write(str(time.value_in(units.Myr))) file.write(' ') file.write(str(ToverV)) file.write('\n') file.close() if os.path.exists('small.hdf5'): os.remove('small.hdf5') storage = store.StoreHDF("small.hdf5") storage.store(particles) del gravity del stellar_evolution
def simulate_small_cluster(number_of_stars, end_time=40 | units.Myr, name_of_the_figure="test-2.svg"): # numpy.random.seed(1) salpeter_masses = new_salpeter_mass_distribution(number_of_stars) total_mass = salpeter_masses.sum() convert_nbody = nbody_system.nbody_to_si(total_mass, 1.0 | units.parsec) particles = new_plummer_model(number_of_stars, convert_nbody) gravity = BHTree(convert_nbody) gravity.initialize_code() # gravity.parameters.set_defaults() # print gravity.parameters.timestep.as_quantity_in(units.Myr) gravity.parameters.timestep = 0.0001 | units.Myr # tiny! gravity.parameters.epsilon_squared \ = (float(number_of_stars)**(-0.333333) | units.parsec) ** 2 stellar_evolution = SSE() stellar_evolution.initialize_module_with_default_parameters() print "setting masses of the stars" particles.radius = 0.0 | units.RSun particles.mass = salpeter_masses print "initializing the particles" stellar_evolution.particles.add_particles(particles) from_stellar_evolution_to_model \ = stellar_evolution.particles.new_channel_to(particles) from_stellar_evolution_to_model.copy_attributes(["mass"]) print "centering the particles" particles.move_to_center() print "scaling particles to viridial equilibrium" particles.scale_to_standard(convert_nbody) gravity.particles.add_particles(particles) from_model_to_gravity = particles.new_channel_to(gravity.particles) from_gravity_to_model = gravity.particles.new_channel_to(particles) gravity.commit_particles() time = 0.0 | units.Myr particles.savepoint(time) total_energy_at_t0 = gravity.kinetic_energy + gravity.potential_energy print "evolving the model until t = " + str(end_time) while time < end_time: time += 0.25 | units.Myr print "Gravity evolve step starting" gravity_evolve = gravity.evolve_model.async(time) print "Stellar evolution step starting" stellar_evolution_evolve = stellar_evolution.evolve_model(time) print "Stellar evolution step done." gravity_evolve.result() print "Gravity evolve step done." from_gravity_to_model.copy() from_stellar_evolution_to_model.copy_attributes(["mass", "radius"]) particles.savepoint(time) from_model_to_gravity.copy_attributes(["mass"]) total_energy_at_this_time \ = gravity.kinetic_energy + gravity.potential_energy print_log(time, gravity, particles, total_energy_at_t0, total_energy_at_this_time) test_results_path = get_path_to_results() output_file = os.path.join(test_results_path, "small.hdf5") if os.path.exists(output_file): os.remove(output_file) storage = store.StoreHDF(output_file) storage.store(particles) gravity.stop() stellar_evolution.stop() plot_particles(particles, name_of_the_figure)