def evolve_model(self): convert_nbody = nbody_system.nbody_to_si( 1.0 | units.MSun, 149.5e6 | units.km) hermite = Hermite(convert_nbody) hermite.initialize_code() hermite.parameters.epsilon_squared = 0.0 | units.AU**2 stars = self.new_system_of_sun_and_earth() earth = stars[1] sun = stars[0] Earth = blender.Primitives.sphere(10, 10, 0.1) # Make the earth avatar Sun = blender.Primitives.sphere(32, 32, 1) # Make the sun avatar hermite.particles.add_particles(stars) for i in range(1*365): hermite.evolve_model(i | units.day) hermite.particles.copy_values_of_all_attributes_to(stars) # update avatar positions: Earth.loc = ( 1*earth.position.value_in(units.AU)[0], 1*earth.position.value_in(units.AU)[1], earth.position.value_in(units.AU)[2]) Sun.loc = ( 1*sun.position.value_in(units.AU)[0], 1*sun.position.value_in(units.AU)[1], sun.position.value_in(units.AU)[2]) blender.Redraw() hermite.print_refs() hermite.stop()
def evolve_model(self): convert_nbody = nbody_system.nbody_to_si(1.0 | units.MSun, 149.5e6 | units.km) hermite = Hermite(convert_nbody) hermite.initialize_code() hermite.parameters.epsilon_squared = 0.0 | units.AU**2 stars = self.new_system_of_sun_and_earth() earth = stars[1] sun = stars[0] Earth = blender.Primitives.sphere(10, 10, 0.1) # Make the earth avatar Sun = blender.Primitives.sphere(32, 32, 1) # Make the sun avatar hermite.particles.add_particles(stars) for i in range(1 * 365): hermite.evolve_model(i | units.day) hermite.particles.copy_values_of_all_attributes_to(stars) # update avatar positions: Earth.loc = (1 * earth.position.value_in(units.AU)[0], 1 * earth.position.value_in(units.AU)[1], earth.position.value_in(units.AU)[2]) Sun.loc = (1 * sun.position.value_in(units.AU)[0], 1 * sun.position.value_in(units.AU)[1], sun.position.value_in(units.AU)[2]) blender.Redraw() hermite.print_refs() hermite.stop()
def test12(self): particles = datamodel.Particles(2) particles.x = [0.0, 1.00] | nbody_system.length particles.y = [0.0, 0.0] | nbody_system.length particles.z = [0.0, 0.0] | nbody_system.length particles.radius = 0.005 | nbody_system.length particles.vx = [5.1, 0.0] | nbody_system.speed particles.vy = [0.0, 0.0] | nbody_system.speed particles.vz = [0.0, 0.0] | nbody_system.speed particles.mass = [0.1, 0.1] | nbody_system.mass instance = Hermite() instance.initialize_code() instance.parameters.stopping_conditions_out_of_box_size = .5 | nbody_system.length self.assertEquals( instance.parameters.stopping_conditions_out_of_box_size, .5 | nbody_system.length) instance.particles.add_particles(particles) instance.stopping_conditions.out_of_box_detection.enable() instance.evolve_model(0.1 | nbody_system.time) self.assertTrue( instance.stopping_conditions.out_of_box_detection.is_set()) self.assertAlmostEqual( instance.stopping_conditions.out_of_box_detection.particles(0).x, 1.0 | nbody_system.length, 3) instance.stop()
def test18(self): particles = datamodel.Particles(2) particles.x = [0.0,1.0] | nbody_system.length particles.y = 0.0 | nbody_system.length particles.z = 0.0 | nbody_system.length particles.vx = 0.0 | nbody_system.speed particles.vy = 0.0 | nbody_system.speed particles.vz = 0.0 | nbody_system.speed particles.mass = 1.0 | nbody_system.mass instance = Hermite() instance.particles.add_particles(particles) instance.commit_particles() self.assertEquals(instance.particles[0].radius, 0.0 | nbody_system.length) instance.parameters.end_time_accuracy_factor = 1.0 instance.evolve_model(0.1 | nbody_system.time) self.assertAlmostRelativeEquals(instance.model_time, 0.10563767746 |nbody_system.time, 5) instance.parameters.end_time_accuracy_factor = -1.0 instance.evolve_model(0.3 | nbody_system.time) self.assertAlmostRelativeEquals(instance.model_time, 0.266758127609 |nbody_system.time, 5) instance.parameters.end_time_accuracy_factor = 0.0 instance.evolve_model(0.4 | nbody_system.time) self.assertAlmostRelativeEquals(instance.model_time, 0.4 |nbody_system.time, 6) instance.parameters.end_time_accuracy_factor = -0.5 instance.evolve_model(0.5 | nbody_system.time) self.assertAlmostRelativeEquals(instance.model_time, 0.48974930698 |nbody_system.time, 6) instance.parameters.end_time_accuracy_factor = +0.5 instance.evolve_model(0.6 | nbody_system.time) self.assertAlmostRelativeEquals(instance.model_time, 0.6042733579 |nbody_system.time, 6) instance.stop()
def simulate_system_until(particles, end_time): convert_nbody = nbody_system.nbody_to_si( 1.0 | units.MSun, 149.5e6 | units.km) instance = Hermite(convert_nbody) instance.parameters.epsilon_squared = 0.0 | units.AU**2 instance.particles.add_particles(particles) t0 = 0 | units.day dt = 10 | units.day t = t0 earth = instance.particles[1] x_values = quantities.AdaptingVectorQuantity() y_values = quantities.AdaptingVectorQuantity() while t < end_time: instance.evolve_model(t) x_values.append(earth.x) y_values.append(earth.y) t += dt instance.stop() return x_values, y_values
def test13(self): particles = plummer.new_plummer_model(31) instance = Hermite(number_of_workers=1) #, debugger="xterm") instance.initialize_code() instance.parameters.epsilon_squared = 0.01 | nbody_system.length**2 instance.particles.add_particles(particles) instance.evolve_model(0.1 | nbody_system.time) instance.synchronize_model() expected_positions = instance.particles.position instance.stop() positions_per_workers = [] for n in [2, 3, 4, 5]: instance = Hermite(number_of_workers=n) instance.initialize_code() instance.parameters.epsilon_squared = 0.01 | nbody_system.length**2 instance.particles.add_particles(particles) instance.evolve_model(0.1 | nbody_system.time) instance.synchronize_model() positions_per_workers.append(instance.particles.position) instance.stop() for index, n in enumerate([2, 3, 4, 5]): self.assertAlmostEqual(expected_positions, positions_per_workers[index], 15)
def evolve_system(particles): """ Evolves the system using the Hermite integrator. Parameters ---------- particles: amuse.datamodel.particles.Particles instance """ times = numpy.linspace(0.0001, args.time, args.steps) |u.yr intr = Hermite(nbody_to_si(particles.total_mass(), 1 | u.AU)) intr.particles.add_particles(particles) energy_begin = intr.get_total_energy() if args.dt is not None: intr.set_dt_param(args.dt) for t in times: intr.evolve_model(t) energy_error = (intr.get_total_energy() - energy_begin)/energy_begin print(intr.get_time_step().in_(u.day), intr.get_time().in_(u.yr)) print(energy_error) print("energy error:{}".format(energy_error)) intr.stop()
def simulate_small_cluster(number_of_stars=1000, end_time=40 | nbody_system.time, number_of_workers=1): particles = new_plummer_model(number_of_stars) particles.scale_to_standard() gravity = Hermite(number_of_workers=number_of_workers) gravity.parameters.epsilon_squared = 0.15 | nbody_system.length**2 gravity.particles.add_particles(particles) from_gravity_to_model = gravity.particles.new_channel_to(particles) time = 0.0 * end_time total_energy_at_t0 = gravity.kinetic_energy + gravity.potential_energy positions_at_different_times = [] positions_at_different_times.append(particles.position) times = [] times.append(time) print("evolving the model until t = " + str(end_time)) while time < end_time: time += end_time / 3.0 gravity.evolve_model(time) from_gravity_to_model.copy() positions_at_different_times.append(particles.position) times.append(time) print_log(time, gravity, particles, total_energy_at_t0) gravity.stop() return times, positions_at_different_times
def evolve_system(particles): """ Evolves the system using the Hermite integrator. Parameters ---------- particles: amuse.datamodel.particles.Particles instance """ times = numpy.linspace(0.0001, args.time, args.steps) | u.yr intr = Hermite(nbody_to_si(particles.total_mass(), 1 | u.AU)) intr.particles.add_particles(particles) energy_begin = intr.get_total_energy() if args.dt is not None: intr.set_dt_param(args.dt) for t in times: intr.evolve_model(t) energy_error = (intr.get_total_energy() - energy_begin) / energy_begin print(intr.get_time_step().in_(u.day), intr.get_time().in_(u.yr)) print(energy_error) print("energy error:{}".format(energy_error)) intr.stop()
def test3(self): convert_nbody = nbody_system.nbody_to_si(1.0 | units.MSun, 149.5e6 | units.km) instance = Hermite(convert_nbody) instance.initialize_code() instance.parameters.epsilon_squared = 0.00001 | units.AU**2 instance.dt_dia = 5000 stars = datamodel.Stars(2) star1 = stars[0] star2 = stars[1] star1.mass = units.MSun(1.0) star1.position = units.AU(numpy.array((-1.0,0.0,0.0))) star1.velocity = units.AUd(numpy.array((0.0,0.0,0.0))) star1.radius = units.RSun(1.0) star2.mass = units.MSun(1.0) star2.position = units.AU(numpy.array((1.0,0.0,0.0))) star2.velocity = units.AUd(numpy.array((0.0,0.0,0.0))) star2.radius = units.RSun(100.0) instance.particles.add_particles(stars) for x in range(1,2000,10): instance.evolve_model(x | units.day) instance.particles.copy_values_of_all_attributes_to(stars) stars.savepoint() instance.stop()
def test3(self): convert_nbody = nbody_system.nbody_to_si(1.0 | units.MSun, 149.5e6 | units.km) instance = Hermite(convert_nbody) instance.initialize_code() instance.parameters.epsilon_squared = 0.00001 | units.AU**2 instance.dt_dia = 5000 stars = datamodel.Stars(2) star1 = stars[0] star2 = stars[1] star1.mass = units.MSun(1.0) star1.position = units.AU(numpy.array((-1.0, 0.0, 0.0))) star1.velocity = units.AUd(numpy.array((0.0, 0.0, 0.0))) star1.radius = units.RSun(1.0) star2.mass = units.MSun(1.0) star2.position = units.AU(numpy.array((1.0, 0.0, 0.0))) star2.velocity = units.AUd(numpy.array((0.0, 0.0, 0.0))) star2.radius = units.RSun(100.0) instance.particles.add_particles(stars) for x in range(1, 2000, 10): instance.evolve_model(x | units.day) instance.particles.copy_values_of_all_attributes_to(stars) stars.savepoint() instance.stop()
def test13(self): particles = plummer.new_plummer_model(31) instance = Hermite(number_of_workers=1)#, debugger="xterm") instance.initialize_code() instance.parameters.epsilon_squared = 0.01 | nbody_system.length ** 2 instance.particles.add_particles(particles) instance.evolve_model(0.1 | nbody_system.time) instance.synchronize_model() expected_positions = instance.particles.position instance.stop() positions_per_workers = [] for n in [2,3,4,5]: instance = Hermite(number_of_workers=n) instance.initialize_code() instance.parameters.epsilon_squared = 0.01 | nbody_system.length ** 2 instance.particles.add_particles(particles) instance.evolve_model(0.1 | nbody_system.time) instance.synchronize_model() positions_per_workers.append(instance.particles.position) instance.stop() for index, n in enumerate([2,3,4,5]): self.assertAlmostEqual(expected_positions, positions_per_workers[index], 15)
def simulate_system_until(particles, end_time): convert_nbody = nbody_system.nbody_to_si(1.0 | units.MSun, 149.5e6 | units.km) instance = Hermite(convert_nbody) instance.parameters.epsilon_squared = 0.0 | units.AU**2 instance.particles.add_particles(particles) t0 = 0 | units.day dt = 10 | units.day t = t0 earth = instance.particles[1] x_values = quantities.AdaptingVectorQuantity() y_values = quantities.AdaptingVectorQuantity() while t < end_time: instance.evolve_model(t) x_values.append(earth.x) y_values.append(earth.y) t += dt instance.stop() return x_values, y_values
def test22(self): hermite = Hermite() hermite.parameters.epsilon_squared = 0.0 | nbody_system.length**2 particles = datamodel.Particles(2) particles.position = ([0, 0, 0], [1, 0, 0]) | nbody_system.length particles.velocity = ([-2, 0, 0], [2, 0, 0]) | nbody_system.speed particles.radius = 0 | nbody_system.length particles.mass = 0.1 | nbody_system.mass hermite.particles.add_particles(particles) hermite.stopping_conditions.out_of_box_detection.enable() hermite.parameters.stopping_conditions_out_of_box_size = 2 | nbody_system.length hermite.parameters.stopping_conditions_out_of_box_use_center_of_mass = False hermite.evolve_model(1 | nbody_system.time) print hermite.particles.x print hermite.particles.key, particles[1].key print hermite.stopping_conditions.out_of_box_detection.particles(0) self.assertTrue( hermite.stopping_conditions.out_of_box_detection.is_set()) self.assertEquals( len(hermite.stopping_conditions.out_of_box_detection.particles(0)), 1) self.assertEquals( hermite.stopping_conditions.out_of_box_detection.particles(0) [0].key, particles[1].key) hermite.stop()
def test8(self): print "Testing Hermite collision_detection" particles = datamodel.Particles(7) particles.mass = 0.001 | nbody_system.mass particles.radius = 0.01 | nbody_system.length particles.x = [-101.0, -100.0, -0.5, 0.5, 100.0, 101.0, 104.0] | nbody_system.length particles.y = 0 | nbody_system.length particles.z = 0 | nbody_system.length particles.velocity = [[2, 0, 0], [-2, 0, 0]]*3 + [[-4, 0, 0]] | nbody_system.speed instance = Hermite() instance.initialize_code() instance.parameters.set_defaults() instance.particles.add_particles(particles) collisions = instance.stopping_conditions.collision_detection collisions.enable() instance.evolve_model(1.0 | nbody_system.time) self.assertTrue(collisions.is_set()) self.assertTrue(instance.model_time < 0.5 | nbody_system.time) self.assertEquals(len(collisions.particles(0)), 3) self.assertEquals(len(collisions.particles(1)), 3) self.assertEquals(len(particles - collisions.particles(0) - collisions.particles(1)), 1) self.assertEquals(abs(collisions.particles(0).x - collisions.particles(1).x) <= (collisions.particles(0).radius + collisions.particles(1).radius), [True, True, True]) sticky_merged = datamodel.Particles(len(collisions.particles(0))) sticky_merged.mass = collisions.particles(0).mass + collisions.particles(1).mass sticky_merged.radius = collisions.particles(0).radius for p1, p2, merged in zip(collisions.particles(0), collisions.particles(1), sticky_merged): merged.position = (p1 + p2).center_of_mass() merged.velocity = (p1 + p2).center_of_mass_velocity() print instance.model_time print instance.particles instance.particles.remove_particles(collisions.particles(0) + collisions.particles(1)) instance.particles.add_particles(sticky_merged) instance.evolve_model(1.0 | nbody_system.time) print print instance.model_time print instance.particles self.assertTrue(collisions.is_set()) self.assertTrue(instance.model_time < 1.0 | nbody_system.time) self.assertEquals(len(collisions.particles(0)), 1) self.assertEquals(len(collisions.particles(1)), 1) self.assertEquals(len(instance.particles - collisions.particles(0) - collisions.particles(1)), 2) self.assertEquals(abs(collisions.particles(0).x - collisions.particles(1).x) <= (collisions.particles(0).radius + collisions.particles(1).radius), [True]) instance.stop()
def test19(self): particles = datamodel.Particles(2) particles.x = [0.0,200.0] | nbody_system.length particles.y = 0.0 | nbody_system.length particles.z = 0.0 | nbody_system.length particles.vx = 0.0 | nbody_system.speed particles.vy = 0.0 | nbody_system.speed particles.vz = 0.0 | nbody_system.speed particles.mass = 1.0 | nbody_system.mass instance = Hermite() instance.particles.add_particles(particles) instance.commit_particles() self.assertEquals(instance.particles[0].radius, 0.0 | nbody_system.length) instance.parameters.end_time_accuracy_factor = 0.0 instance.evolve_model(0.1 | nbody_system.time) self.assertAlmostRelativeEquals(instance.model_time, 0.1 |nbody_system.time, 5) instance.stop()
def test7(self): print "Test7: Testing effect of Hermite parameter epsilon_squared" convert_nbody = nbody_system.nbody_to_si(1.0 | units.MSun, 1.0 | units.AU) particles = datamodel.Particles(2) sun = particles[0] sun.mass = 1.0 | units.MSun sun.position = [0.0, 0.0, 0.0] | units.AU sun.velocity = [0.0, 0.0, 0.0] | units.AU / units.yr sun.radius = 1.0 | units.RSun earth = particles[1] earth.mass = 5.9736e24 | units.kg earth.radius = 6371.0 | units.km earth.position = [0.0, 1.0, 0.0] | units.AU earth.velocity = [2.0 * numpy.pi, -0.0001, 0.0] | units.AU / units.yr initial_direction = math.atan((earth.velocity[0] / earth.velocity[1])) final_direction = [] for log_eps2 in range(-9, 10, 2): instance = Hermite(convert_nbody) instance.parameters.end_time_accuracy_factor = 0.0 instance.parameters.epsilon_squared = 10.0**log_eps2 | units.AU**2 instance.particles.add_particles(particles) instance.commit_particles() instance.evolve_model(0.25 | units.yr) final_direction.append( math.atan((instance.particles[1].velocity[0] / instance.particles[1].velocity[1]))) instance.stop() # Small values of epsilon_squared should result in normal earth-sun dynamics: rotation of 90 degrees self.assertAlmostEquals(abs(final_direction[0]), abs(initial_direction + math.pi / 2.0), 2) # Large values of epsilon_squared should result in ~ no interaction self.assertAlmostEquals(final_direction[-1], initial_direction, 2) # Outcome is most sensitive to epsilon_squared when epsilon_squared = d(earth, sun)^2 delta = [ abs(final_direction[i + 1] - final_direction[i]) for i in range(len(final_direction) - 1) ] self.assertEquals(delta[len(final_direction) // 2 - 1], max(delta))
G = 6.63784e-11 cm_to_m = 1. / 100. msun_to_g = 1.988e33 pc_to_m = 3.08567758128e16 gcm_to_msunpc = 5.03e-34 * (3.086e18)**2 def print_log(time, gravity, particles, total_energy_at_t0): kinetic_energy = gravity.kinetic_energy potential_energy = gravity.potential_energy total_energy_at_this_time = kinetic_energy + potential_energy print "time : " , time print "energy error : " , (total_energy_at_this_time - total_energy_at_t0) / total_energy_at_t0 def simulate_small_cluster( number_of_stars = 1000., end_time = 40 | nbody_system.time, number_of_workers = 1 ): #convert_nbody = nbody_system.nbody_to_si(number_of_stars | units.MSun, 1. | units.parsec)
def test23(self): hermite = Hermite() hermite.parameters.epsilon_squared = 0.0 | nbody_system.length**2 particles = datamodel.Particles(1) particles.position = ([0,0,0] )| nbody_system.length particles.velocity = ([1,0,0] )| nbody_system.speed particles.radius = 0| nbody_system.length particles.mass = 0.1| nbody_system.mass hermite.particles.add_particles(particles) hermite.evolve_model(1 | nbody_system.time) print hermite.particles.x self.assertAlmostRelativeEquals(hermite.model_time, 1 | nbody_system.time) self.assertAlmostRelativeEquals(hermite.particles[0].x, 1 | nbody_system.length) hermite.evolve_model(1.5 | nbody_system.time) print hermite.particles.x self.assertAlmostRelativeEquals(hermite.model_time, 1.5 | nbody_system.time) self.assertAlmostRelativeEquals(hermite.particles[0].x, 1.5 | nbody_system.length) hermite.stop()
def test2(self): convert_nbody = nbody_system.nbody_to_si(1.0 | units.MSun, 149.5e6 | units.km) instance = Hermite(convert_nbody) instance.initialize_code() instance.parameters.epsilon_squared = 0.0 | units.AU**2 instance.dt_dia = 5000 stars = self.new_system_of_sun_and_earth() earth = stars[1] instance.particles.add_particles(stars) for x in range(1, 500, 10): instance.evolve_model(x | units.day) instance.particles.copy_values_of_all_attributes_to(stars) stars.savepoint() if HAS_MATPLOTLIB: figure = pyplot.figure() plot = figure.add_subplot(1,1,1) x_points = earth.get_timeline_of_attribute("x") y_points = earth.get_timeline_of_attribute("y") x_points_in_AU = map(lambda (t,x) : x.value_in(units.AU), x_points) y_points_in_AU = map(lambda (t,x) : x.value_in(units.AU), y_points) plot.scatter(x_points_in_AU,y_points_in_AU, color = "b", marker = 'o') plot.set_xlim(-1.5, 1.5) plot.set_ylim(-1.5, 1.5) test_results_path = self.get_path_to_results() output_file = os.path.join(test_results_path, "hermite-earth-sun2.svg") figure.savefig(output_file) instance.cleanup_code() instance.stop()
def test10(self): convert_nbody = nbody_system.nbody_to_si(1.0 | units.MSun, 149.5e6 | units.km) instance = Hermite(convert_nbody) instance.initialize_code() instance.parameters.epsilon_squared = 0.0 | units.AU**2 instance.parameters.stopping_conditions_number_of_steps = 10 self.assertEquals(instance.parameters.stopping_conditions_number_of_steps,10) stars = self.new_system_of_sun_and_earth() earth = stars[1] instance.particles.add_particles(stars) instance.stopping_conditions.number_of_steps_detection.enable() instance.evolve_model(365.0 | units.day) self.assertTrue(instance.stopping_conditions.number_of_steps_detection.is_set()) instance.particles.copy_values_of_all_attributes_to(stars) instance.cleanup_code() instance.stop()
def test12(self): particles = datamodel.Particles(2) particles.x = [0.0,1.00] | nbody_system.length particles.y = [0.0,0.0] | nbody_system.length particles.z = [0.0,0.0] | nbody_system.length particles.radius = 0.005 | nbody_system.length particles.vx = [5.1,0.0] | nbody_system.speed particles.vy = [0.0,0.0] | nbody_system.speed particles.vz = [0.0,0.0]| nbody_system.speed particles.mass = [0.1,0.1] | nbody_system.mass instance = Hermite() instance.initialize_code() instance.parameters.stopping_conditions_out_of_box_size = .5 | nbody_system.length self.assertEquals(instance.parameters.stopping_conditions_out_of_box_size, .5 | nbody_system.length) instance.particles.add_particles(particles) instance.stopping_conditions.out_of_box_detection.enable() instance.evolve_model(0.1 | nbody_system.time) self.assertTrue(instance.stopping_conditions.out_of_box_detection.is_set()) self.assertAlmostEqual(instance.stopping_conditions.out_of_box_detection.particles(0).x, 1.0 |nbody_system.length, 3) instance.stop()
def test1(self): convert_nbody = nbody_system.nbody_to_si(1.0 | units.MSun, 149.5e6 | units.km) hermite = Hermite(convert_nbody) hermite.initialize_code() hermite.parameters.epsilon_squared = 0.0 | units.AU**2 hermite.parameters.end_time_accuracy_factor = 0.0 hermite.dt_dia = 5000 stars = self.new_system_of_sun_and_earth() earth = stars[1] hermite.particles.add_particles(stars) hermite.evolve_model(365.0 | units.day) hermite.particles.copy_values_of_all_attributes_to(stars) position_at_start = earth.position.value_in(units.AU)[0] position_after_full_rotation = earth.position.value_in(units.AU)[0] self.assertAlmostRelativeEqual(position_at_start, position_after_full_rotation, 6) hermite.evolve_model(365.0 + (365.0 / 2) | units.day) hermite.particles.copy_values_of_all_attributes_to(stars) position_after_half_a_rotation = earth.position.value_in(units.AU)[0] self.assertAlmostRelativeEqual(-position_at_start, position_after_half_a_rotation, 3) hermite.evolve_model(365.0 + (365.0 / 2) + (365.0 / 4) | units.day) hermite.particles.copy_values_of_all_attributes_to(stars) position_after_half_a_rotation = earth.position.value_in(units.AU)[1] self.assertAlmostRelativeEqual(-position_at_start, position_after_half_a_rotation, 3) hermite.cleanup_code() hermite.stop()
def test11(self): particles = datamodel.Particles(2) particles.x = [0.0,10.0] | nbody_system.length particles.y = 0 | nbody_system.length particles.z = 0 | nbody_system.length particles.radius = 0.005 | nbody_system.length particles.vx = 0 | nbody_system.speed particles.vy = 0 | nbody_system.speed particles.vz = 0 | nbody_system.speed particles.mass = 1.0 | nbody_system.mass instance = Hermite() instance.initialize_code() instance.parameters.stopping_conditions_number_of_steps = 2 self.assertEquals(instance.parameters.stopping_conditions_number_of_steps, 2) instance.particles.add_particles(particles) instance.stopping_conditions.number_of_steps_detection.enable() instance.evolve_model(10 | nbody_system.time) self.assertTrue(instance.stopping_conditions.number_of_steps_detection.is_set()) self.assertTrue(instance.model_time < 10 | nbody_system.time) instance.stop()
def test22(self): hermite = Hermite() hermite.parameters.epsilon_squared = 0.0 | nbody_system.length**2 particles = datamodel.Particles(2) particles.position = ([0,0,0], [1,0,0] )| nbody_system.length particles.velocity = ([-2,0,0], [2,0,0] )| nbody_system.speed particles.radius = 0| nbody_system.length particles.mass = 0.1| nbody_system.mass hermite.particles.add_particles(particles) hermite.stopping_conditions.out_of_box_detection.enable() hermite.parameters.stopping_conditions_out_of_box_size = 2 | nbody_system.length hermite.parameters.stopping_conditions_out_of_box_use_center_of_mass = False hermite.evolve_model(1 | nbody_system.time) print hermite.particles.x print hermite.particles.key, particles[1].key print hermite.stopping_conditions.out_of_box_detection.particles(0) self.assertTrue(hermite.stopping_conditions.out_of_box_detection.is_set()) self.assertEquals(len(hermite.stopping_conditions.out_of_box_detection.particles(0)), 1) self.assertEquals(hermite.stopping_conditions.out_of_box_detection.particles(0)[0].key, particles[1].key) hermite.stop()
def evolve_system_with_massloss(particles, mass_sequence, time_sequence, datahandler): """ Parameters ---------- particles: a two-body system mass_sequence: sequence of masses time_sequence: sequence of times datahandler: HDF5HandlerAmuse context manager """ h = datahandler intr = Hermite(nbody_to_si(particles.total_mass(), 1 | u.AU)) intr.particles.add_particles(particles) h.append(particles[0].period0, "period0") for mass, time in zip(mass_sequence, time_sequence): intr.particles.move_to_center() intr.evolve_model(time) intr.particles[0].mass = mass h.append(intr.particles.center_of_mass(), "CM_position") h.append(intr.particles.center_of_mass_velocity(), "CM_velocity") h.append(intr.particles.position, "position") h.append(intr.particles.velocity, "velocity") h.append(intr.particles.mass, "mass") h.append(intr.particles.kinetic_energy(), "kinetic_energy") h.append(intr.particles.potential_energy(), "potential_energy") h.append(intr.get_total_energy(), "total_energy") h.append(time, "time") h.append(semimajoraxis_from_binary(intr.particles), "sma") h.append(eccentricity_from_binary(intr.particles), "eccentricity") intr.stop()
def simulate_small_cluster( number_of_stars=1000, end_time=40 | nbody_system.time, number_of_workers=1 ): particles = new_plummer_model(number_of_stars) particles.scale_to_standard() gravity = Hermite(number_of_workers=number_of_workers) gravity.parameters.epsilon_squared = 0.15 | nbody_system.length ** 2 gravity.particles.add_particles(particles) from_gravity_to_model = gravity.particles.new_channel_to(particles) time = 0.0 * end_time total_energy_at_t0 = gravity.kinetic_energy + gravity.potential_energy positions_at_different_times = [] positions_at_different_times.append(particles.position) times = [] times.append(time) print("evolving the model until t = " + str(end_time)) while time < end_time: time += end_time / 3.0 gravity.evolve_model(time) from_gravity_to_model.copy() positions_at_different_times.append(particles.position) times.append(time) print_log(time, gravity, particles, total_energy_at_t0) gravity.stop() return times, positions_at_different_times
def supernova_in_binary_nbody(M0, m0, a0, tsn): stars = make_circular_binary(M0, m0, a0) M, m, a, e, ta_out, inc, lan_out, aop_out = orbital_elements_from_binary( stars, G=constants.G) print "Initial binary: a=", a.in_( units.AU), "e=", e, "M=", stars[0].mass, "and m=", stars[1].mass converter = nbody_system.nbody_to_si(M+m, a) gravity = Hermite(converter) gravity.particles.add_particles(stars) print "Integrate binary to t=", tsn.in_(units.day) gravity.evolve_model(tsn) M, m, a, e, ta_out, inc, lan_out, aop_out = orbital_elements_from_binary( stars, G=constants.G) print "Pre supernova orbit: a=", a.in_(units.AU), "e=", e stars[0].mass *= 0.1 print "Reduce stellar mass to: M=", stars[0].mass, "and m=", stars[1].mass v_kick = (0, 0, 0) | units.kms stars[0].velocity += v_kick gravity.evolve_model(2*tsn) M, m, a, e, ta_out, inc, lan_out, aop_out = orbital_elements_from_binary( stars, G=constants.G) print "Post supernova orbit: a=", a.in_(units.AU), "e=", e r0 = a a_ana = post_supernova_semimajor_axis( M0, m0, stars[0].mass, stars[1].mass, a, r0) e_ana = post_supernova_eccentricity( M0, m0, stars[0].mass, stars[1].mass, a, r0) print( "Analytic solution to post orbit orbital parameters: a=", a_ana, "e=", e_ana, ) gravity.stop()
def test7(self): print "Test7: Testing effect of Hermite parameter epsilon_squared" convert_nbody = nbody_system.nbody_to_si(1.0 | units.MSun, 1.0 | units.AU) particles = datamodel.Particles(2) sun = particles[0] sun.mass = 1.0 | units.MSun sun.position = [0.0, 0.0, 0.0] | units.AU sun.velocity = [0.0, 0.0, 0.0] | units.AU / units.yr sun.radius = 1.0 | units.RSun earth = particles[1] earth.mass = 5.9736e24 | units.kg earth.radius = 6371.0 | units.km earth.position = [0.0, 1.0, 0.0] | units.AU earth.velocity = [2.0*numpy.pi, -0.0001, 0.0] | units.AU / units.yr initial_direction = math.atan((earth.velocity[0]/earth.velocity[1])) final_direction = [] for log_eps2 in range(-9,10,2): instance = Hermite(convert_nbody) instance.parameters.end_time_accuracy_factor = 0.0 instance.parameters.epsilon_squared = 10.0**log_eps2 | units.AU ** 2 instance.particles.add_particles(particles) instance.commit_particles() instance.evolve_model(0.25 | units.yr) final_direction.append(math.atan((instance.particles[1].velocity[0]/ instance.particles[1].velocity[1]))) instance.stop() # Small values of epsilon_squared should result in normal earth-sun dynamics: rotation of 90 degrees self.assertAlmostEquals(abs(final_direction[0]), abs(initial_direction+math.pi/2.0), 2) # Large values of epsilon_squared should result in ~ no interaction self.assertAlmostEquals(final_direction[-1], initial_direction, 2) # Outcome is most sensitive to epsilon_squared when epsilon_squared = d(earth, sun)^2 delta = [abs(final_direction[i+1]-final_direction[i]) for i in range(len(final_direction)-1)] self.assertEquals(delta[len(final_direction)//2 -1], max(delta))
def test20(self): convert_nbody = nbody_system.nbody_to_si(1.0 | units.MSun, 149.5e6 | units.km) hermite = Hermite(convert_nbody) hermite.initialize_code() hermite.parameters.epsilon_squared = 0.0 | units.AU**2 hermite.parameters.end_time_accuracy_factor = 0.0 hermite.parameters.is_time_reversed_allowed = True stars = self.new_system_of_sun_and_earth() earth = stars[1] hermite.particles.add_particles(stars) hermite.evolve_model(365.0 | units.day) hermite.particles.copy_values_of_all_attributes_to(stars) position_at_start = earth.position.value_in(units.AU)[0] position_after_full_rotation = earth.position.value_in(units.AU)[0] self.assertAlmostRelativeEqual(position_at_start, position_after_full_rotation, 6) hermite.evolve_model(365.0 - (365.0 / 2) | units.day) hermite.particles.copy_values_of_all_attributes_to(stars) position_after_half_a_rotation_backward = earth.position.value_in(units.AU)[0] self.assertAlmostRelativeEqual(-position_at_start, position_after_half_a_rotation_backward, 4) hermite.evolve_model(365.0 | units.day) position_at_start = earth.position.value_in(units.AU)[0] position_after_full_rotation = earth.position.value_in(units.AU)[0] self.assertAlmostRelativeEqual(position_at_start, position_after_full_rotation, 6) hermite.cleanup_code() hermite.stop()
instance = Hermite(convert_nbody) instance.particles.add_particles(particles) channelp = instance.particles.new_channel_to(particles) start = 0 |units.yr end = 150 | units.yr step = 10|units.day timerange = VectorQuantity.arange(start, end, step) masses = []|units.MSun for i, time in enumerate(timerange): instance.evolve_model(time) channelp.copy() particles.savepoint(time) if (i % 220 == 0): instance.particles[0].mass = simulate_massloss(time) masses.append(instance.particles[0].mass) instance.stop() particle = particles[1] t, pos = particle.get_timeline_of_attribute_as_vector("position") distances = pos.lengths().as_quantity_in(units.AU) plot(timerange, distances , timerange, masses)
def run(self, run_num): print("Setting up run %d..." % (run_num)) # Create group for run run_group = self.hdf5_file.create_group(str(run_num)) # create nbody converter thing? convert_nbody = nbody_system.nbody_to_si(100.0 | units.MSun, 1 | units.parsec) # initialize particle datamodel stars = Particles() print(" Initializing and populating clusters...") # populate/initialize clusters, add to particle model for c in self.clusters: c.populate() stars.add_particles(c.plummer) print(" Done!") # initialize codes # initialize hermite print(" Initializing hermite...") hermite_code = Hermite(convert_nbody) hermite_code.particles.add_particles(stars) detect_coll = hermite_code.stopping_conditions.collision_detection detect_coll.enable() print(" Done!") print(" Initializing SSE...") sse_code = SSE() sse_code.particles.add_particles(stars) print("Done!\n") # actually run the simulation! print("===== Run #%d =====" % (run_num)) t = 0 # time i = 1 # iteration num c = 1 # collision num while(t < self.runtime): print(" Time (Myr): %d" % (t)) print(" Simulating...") # evolve model hermite_code.evolve_model(t | units.Myr) sse_code.evolve_model(t | units.Myr) hermite_code.particles.copy_values_of_attribute_to("position", sse_code.particles) sse_code.particles.synchronize_to(hermite_code.particles) if detect_coll.is_set(): print("Detected a collision!!") print(detect_coll.particles(0)) coll_f = open(sub_folder + "/collision-" + str(c) + "_time" + str(t) + ".txt") coll_f.write( detect_coll.particles(0) ) coll_f.close() c += 1 # somehow put a log # also... eventually, "pause" the rest of the simulation and simulate the collision somehow #sse_code.particles.copy_values_of_attribute_to("mass", hermite_code.particles) #sse_code.particles.copy_values_of_attribute_to("stellar_type", hermite_code.particles) #sse_code.particles.copy_values_of_attribute_to("age", hermite_code.particles) #sse_code.particles.copy_values_of_attribute_to("luminosity", hermite_code.particles) #sse_code.particles.copy_values_of_attribute_to("temperature", hermite_code.particles) #sse_code.particles.copy_values_of_attribute_to("radius", hermite_code.particles) hermite_code.particles.mass = sse_code.particles.mass print(" Done.") # output to csv print(" Outputting to HDF5...") #file_name = sub_folder + "/data-" + str(i) + "_time-" + str(t) + ".txt" self.write_to_hdf5_file(run_group, i, t, stars) print(" Done.") #print(" Creating plot...") #plot_name = "System at " + str(t) + " Myr" #plot_path = sub_folder + "/plot-" + str(i) + "_time-" + str(t) + ".png" #plot_data(plot_name, plot_path, hermite_code.particles) #print(" Done.") t += self.timestep i += 1 print("Run complete.\n")
) subplot.set_xlim(-1, 1) subplot.set_ylim(-1, 1) subplot.set_xlabel('x (nbody length)') subplot.set_ylabel('y (nbody length)') pyplot.show() if __name__ == "__main__": numpy.random.seed(1212) particles = new_cluster(128) code = Hermite() code.particles.add_particles(particles) stopping_condition = code.stopping_conditions.collision_detection stopping_condition.enable() code.evolve_model(4 | nbody_system.time) if not stopping_condition.is_set(): raise Exception( "No stopping collision detected in the given timeframe.") plot_particles_and_highlight_collision( particles, stopping_condition.particles(0), stopping_condition.particles(1))
instance.initialize_code() instance.particles.add_particles(particles) instance.commit_particles() channelp = instance.particles.new_channel_to(particles) start = 0 |units.yr end = 150 | units.yr step = 10|units.day timerange = VectorQuantity.arange(start, end, step) masses = []|units.MSun for i, time in enumerate(timerange): instance.evolve_model(time) channelp.copy() particles.savepoint(time) if (i % 220 == 0): instance.particles[0].mass = simulate_massloss(time) masses.append(instance.particles[0].mass) instance.stop() particle = particles[1] t, pos = particle.get_timeline_of_attribute_as_vector("position") distances = pos.lengths().as_quantity_in(units.AU) plot(timerange, distances , timerange, masses)
) subplot.set_xlim(-1, 1) subplot.set_ylim(-1, 1) subplot.set_xlabel('x (nbody length)') subplot.set_ylabel('y (nbody length)') pyplot.show() if __name__ == "__main__": numpy.random.seed(1212) particles = new_cluster(128) code = Hermite() code.particles.add_particles(particles) stopping_condition = code.stopping_conditions.collision_detection stopping_condition.enable() code.evolve_model(4 | nbody_system.time) if not stopping_condition.is_set(): raise Exception( "No stopping collision detected in the given timeframe.") plot_particles_and_highlight_collision(particles, stopping_condition.particles(0), stopping_condition.particles(1))