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_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 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_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 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 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 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 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 test15(self): particles = datamodel.Particles(2) particles.x = [0.0,10.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) p = datamodel.Particle( x = 1.0 | nbody_system.length, y = 2.0 | nbody_system.length, z = 3.0 | nbody_system.length, vx = 1.0 | nbody_system.speed, vy = 2.0 | nbody_system.speed, vz = 3.0 | nbody_system.speed, mass = 1.0 | nbody_system.mass, radius = 4.0 | nbody_system.length, ) instance.particles.add_particle(p) self.assertEquals(instance.particles[0].radius, 0.0 | nbody_system.length) self.assertEquals(instance.particles[1].radius, 0.0 | nbody_system.length) self.assertEquals(instance.particles[2].radius, 4.0 | nbody_system.length) instance.stop()
def test6(self): print "Test6: Testing Hermite parameters" convert_nbody = nbody_system.nbody_to_si(1.0 | units.yr, 1.0 | units.AU) instance = Hermite(convert_nbody) value = instance.get_eps2() self.assertEquals(0.0 | units.AU**2 , value) self.assertAlmostEquals(0.0 | units.AU**2, instance.parameters.epsilon_squared, in_units=units.AU**2) for x in [0.01, 0.1, 0.2]: instance.parameters.epsilon_squared = x | units.AU**2 self.assertAlmostEquals(x | units.AU**2, instance.parameters.epsilon_squared, in_units=units.AU**2) value = instance.get_dt_param() self.assertEquals(0.03 , value) self.assertAlmostEquals(0.03 , instance.parameters.dt_param) for x in [0.001, 0.01, 0.1]: instance.parameters.dt_param = x self.assertAlmostEquals(x, instance.parameters.dt_param) value = instance.get_dt_dia() self.assertAlmostEquals(1.0 | units.yr, value) self.assertAlmostEquals(1.0 | units.yr, instance.parameters.dt_dia, in_units=units.yr) for x in [0.1, 10.0, 100.0]: instance.parameters.dt_dia = x | units.yr self.assertAlmostEquals(x | units.yr, instance.parameters.dt_dia, in_units=units.yr) value = instance.get_begin_time() self.assertEquals(0.0| units.yr, value) self.assertAlmostEquals(0.0 | units.yr, instance.parameters.begin_time, in_units=units.yr) for x in [1.0, 10.0, 100.0]: instance.parameters.begin_time = x | units.yr self.assertAlmostEquals(x | units.yr, instance.parameters.begin_time, in_units=units.yr) 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 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 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 test5(self): convert_nbody = nbody_system.nbody_to_si(5.0 | units.kg, 10.0 | units.m) instance = Hermite(convert_nbody) instance.initialize_code() particles = datamodel.Particles(2) self.assertEquals(len(instance.particles), 0) particles.mass = [15.0, 30.0] | units.kg particles.radius = [10.0, 20.0] | units.m particles.position = [[10.0, 20.0, 30.0], [20.0, 40.0, 60.0]] | units.m particles.velocity = [[0.0, 0.0, 0.0], [0.0, 0.0, 0.0] ] | units.m / units.s instance.particles.add_particles(particles) self.assertEquals(len(instance.particles), 2) instance.set_state(1, 16 | units.kg, 20.0 | units.m, 40.0 | units.m, 60.0 | units.m, 1.0 | units.ms, 1.0 | units.ms, 1.0 | units.ms, 20.0 | units.m) curr_state = instance.get_state(1) for expected, actual in zip([ 16 | units.kg, 20.0 | units.m, 40.0 | units.m, 60.0 | units.m, 1.0 | units.ms, 1.0 | units.ms, 1.0 | units.ms, 20.0 | units.m ], curr_state): self.assertAlmostRelativeEquals(expected, actual) instance.stop() self.assertEquals(curr_state[0], 16 | units.kg, 8)
def test15(self): particles = datamodel.Particles(2) particles.x = [0.0, 10.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) p = datamodel.Particle( x=1.0 | nbody_system.length, y=2.0 | nbody_system.length, z=3.0 | nbody_system.length, vx=1.0 | nbody_system.speed, vy=2.0 | nbody_system.speed, vz=3.0 | nbody_system.speed, mass=1.0 | nbody_system.mass, radius=4.0 | nbody_system.length, ) instance.particles.add_particle(p) self.assertEquals(instance.particles[0].radius, 0.0 | nbody_system.length) self.assertEquals(instance.particles[1].radius, 0.0 | nbody_system.length) self.assertEquals(instance.particles[2].radius, 4.0 | nbody_system.length) 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 test5(self): convert_nbody = nbody_system.nbody_to_si(5.0 | units.kg, 10.0 | units.m) instance = Hermite(convert_nbody) instance.initialize_code() particles = datamodel.Particles(2) self.assertEquals(len(instance.particles), 0) particles.mass = [15.0, 30.0] | units.kg particles.radius = [10.0, 20.0] | units.m particles.position = [[10.0, 20.0, 30.0], [20.0, 40.0, 60.0]] | units.m particles.velocity = [[0.0, 0.0, 0.0], [0.0, 0.0, 0.0]] | units.m / units.s instance.particles.add_particles(particles) self.assertEquals(len(instance.particles), 2) instance.set_state(1, 16|units.kg, 20.0|units.m, 40.0|units.m, 60.0|units.m, 1.0|units.ms, 1.0|units.ms, 1.0|units.ms , 20.0|units.m) curr_state = instance.get_state(1) for expected, actual in zip([16|units.kg, 20.0|units.m, 40.0|units.m, 60.0|units.m, 1.0|units.ms, 1.0|units.ms, 1.0|units.ms , 20.0|units.m], curr_state): self.assertAlmostRelativeEquals(expected, actual) instance.stop() self.assertEquals(curr_state[0], 16|units.kg, 8)
def test4(self): convert_nbody = nbody_system.nbody_to_si(5.0 | units.kg, 10.0 | units.m) instance = Hermite(convert_nbody) instance.initialize_code() particles = datamodel.Particles(2) self.assertEquals(len(instance.particles), 0) particles.mass = [15.0, 30.0] | units.kg particles.radius = [10.0, 20.0] | units.m particles.position = [[10.0, 20.0, 30.0], [20.0, 40.0, 60.0]] | units.m particles.velocity = [[0.0, 0.0, 0.0], [0.0, 0.0, 0.0]] | units.m / units.s instance.particles.add_particles(particles) self.assertEquals(len(instance.particles), 2) instance.particles.mass = [17.0, 33.0] | units.kg self.assertEquals(instance.get_mass(0), 17.0| units.kg) self.assertEquals(instance.get_mass(1), 33.0| units.kg) instance.stop()
def test6(self): print "Test6: Testing Hermite parameters" convert_nbody = nbody_system.nbody_to_si(1.0 | units.yr, 1.0 | units.AU) instance = Hermite(convert_nbody) value = instance.get_eps2() self.assertEquals(0.0 | units.AU**2 , value) self.assertAlmostEquals(0.0 | units.AU**2, instance.parameters.epsilon_squared, in_units=units.AU**2) for x in [0.01, 0.1, 0.2]: instance.parameters.epsilon_squared = x | units.AU**2 self.assertAlmostEquals(x | units.AU**2, instance.parameters.epsilon_squared, in_units=units.AU**2) value = instance.get_dt_param() self.assertEquals(0.03 , value) self.assertAlmostEquals(0.03 , instance.parameters.dt_param) for x in [0.001, 0.01, 0.1]: instance.parameters.dt_param = x self.assertAlmostEquals(x, instance.parameters.dt_param) value = instance.get_dt_dia() self.assertAlmostEquals(1.0 | units.yr, value) self.assertAlmostEquals(1.0 | units.yr, instance.parameters.dt_dia, in_units=units.yr) for x in [0.1, 10.0, 100.0]: instance.parameters.dt_dia = x | units.yr self.assertAlmostEquals(x | units.yr, instance.parameters.dt_dia, in_units=units.yr) value = instance.get_begin_time() self.assertEquals(0.0| units.yr, value) self.assertAlmostEquals(0.0 | units.yr, instance.parameters.begin_time, in_units=units.yr) for x in [1.0, 10.0, 100.0]: instance.parameters.begin_time = x | units.yr self.assertAlmostEquals(x | units.yr, instance.parameters.begin_time, in_units=units.yr) 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 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 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 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 test24(self): hermite = Hermite(reuse_worker = True) channel1 = hermite.legacy_interface.channel hermite.stop() hermite = Hermite(reuse_worker = True) channel2 = hermite.legacy_interface.channel hermite.stop() self.assertEquals(id(channel1), id(channel2))
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 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 test17(self): particles = new_plummer_model(50) particles.scale_to_standard() instance = Hermite() instance.parameters.epsilon_squared = 0.22000 | nbody_system.length**2 instance.particles.add_particles(particles) self.assertEquals(len(instance.particles), 50) instance.reset() self.assertAlmostRelativeEquals(instance.parameters.epsilon_squared , 0.22000 | nbody_system.length**2) self.assertEquals(len(instance.particles), 0) instance.particles.add_particles(particles) self.assertEquals(len(instance.particles), 50) 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 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 test14(self): instance = Hermite() instance.initialize_code() instance.parameters.epsilon_squared = 0.00001 | nbody_system.length**2 particles = datamodel.Particles(2) particles.mass = [1.0, 1.0] | nbody_system.mass particles.radius = [0.0001, 0.0001] | nbody_system.length particles.position = [[0.0, 0.0, 0.0], [2.0, 0.0, 0.0] ] | nbody_system.length particles.velocity = [[0.0, 0.0, 0.0], [0.0, 0.0, 0.0] ] | nbody_system.speed instance.particles.add_particles(particles) zero = 0.0 | nbody_system.length fx, fy, fz = instance.get_gravity_at_point(zero, 1.0 | nbody_system.length, zero, zero) self.assertAlmostEqual(fx, 0.0 | nbody_system.acceleration, 6) self.assertAlmostEqual(fy, 0.0 | nbody_system.acceleration, 6) self.assertAlmostEqual(fz, 0.0 | nbody_system.acceleration, 6) for x in (0.25, 0.5, 0.75): x0 = x | nbody_system.length x1 = (2.0 - x) | nbody_system.length potential0 = instance.get_potential_at_point(zero, x0, zero, zero) potential1 = instance.get_potential_at_point(zero, x1, zero, zero) fx0, fy0, fz0 = instance.get_gravity_at_point(zero, x0, zero, zero) fx1, fy1, fz1 = instance.get_gravity_at_point(zero, x1, zero, zero) self.assertAlmostEqual(fy0, 0.0 | nbody_system.acceleration, 6) self.assertAlmostEqual(fz0, 0.0 | nbody_system.acceleration, 6) self.assertAlmostEqual(fy1, 0.0 | nbody_system.acceleration, 6) self.assertAlmostEqual(fz1, 0.0 | nbody_system.acceleration, 6) self.assertAlmostEqual(fx0, -1.0 * fx1, 5) fx = (-1.0 / (x0**2) + 1.0 / (x1**2)) * (1.0 | nbody_system.length**3 / nbody_system.time**2) self.assertAlmostEqual(fx, fx0, 2) self.assertAlmostEqual(potential0, potential1, 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 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 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 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 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 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 test16(self): particles = new_plummer_model(200) particles.scale_to_standard() instance = Hermite() instance.initialize_code() instance.parameters.epsilon_squared = 0.00000 | nbody_system.length**2 instance.particles.add_particles(particles) x = numpy.arange(-1,1,0.1) | nbody_system.length zero = numpy.zeros(len(x)) | nbody_system.length potential0 = instance.get_potential_at_point(zero, x , zero, zero) instance.stop() for n in (2, 3, 4): instance = Hermite(number_of_workers = n) instance.initialize_code() instance.parameters.epsilon_squared = 0.00000 | nbody_system.length**2 instance.particles.add_particles(particles) potential = instance.get_potential_at_point(zero, x , zero, zero) self.assertAlmostRelativeEquals(potential0, potential, 8) instance.stop()
def test16(self): particles = new_plummer_model(200) particles.scale_to_standard() instance = Hermite() instance.initialize_code() instance.parameters.epsilon_squared = 0.00000 | nbody_system.length**2 instance.particles.add_particles(particles) x = numpy.arange(-1, 1, 0.1) | nbody_system.length zero = numpy.zeros(len(x)) | nbody_system.length potential0 = instance.get_potential_at_point(zero, x, zero, zero) instance.stop() for n in (2, 3, 4): instance = Hermite(number_of_workers=n) instance.initialize_code() instance.parameters.epsilon_squared = 0.00000 | nbody_system.length**2 instance.particles.add_particles(particles) potential = instance.get_potential_at_point(zero, x, zero, zero) self.assertAlmostRelativeEquals(potential0, potential, 8) 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 test4(self): convert_nbody = nbody_system.nbody_to_si(5.0 | units.kg, 10.0 | units.m) instance = Hermite(convert_nbody) instance.initialize_code() particles = datamodel.Particles(2) self.assertEquals(len(instance.particles), 0) particles.mass = [15.0, 30.0] | units.kg particles.radius = [10.0, 20.0] | units.m particles.position = [[10.0, 20.0, 30.0], [20.0, 40.0, 60.0]] | units.m particles.velocity = [[0.0, 0.0, 0.0], [0.0, 0.0, 0.0]] | units.m / units.s instance.particles.add_particles(particles) self.assertEquals(len(instance.particles), 2) instance.particles.mass = [17.0, 33.0] | units.kg self.assertEquals(instance.get_mass(0), 17.0| units.kg) self.assertEquals(instance.get_mass(1), 33.0| units.kg) instance.stop()
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()
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 test14(self): instance = Hermite() instance.initialize_code() instance.parameters.epsilon_squared = 0.00001 | nbody_system.length**2 particles = datamodel.Particles(2) particles.mass = [1.0, 1.0] | nbody_system.mass particles.radius = [0.0001, 0.0001] | nbody_system.length particles.position = [[0.0,0.0,0.0], [2.0,0.0,0.0]] | nbody_system.length particles.velocity = [[0.0, 0.0, 0.0], [0.0, 0.0, 0.0]] | nbody_system.speed instance.particles.add_particles(particles) zero = 0.0 | nbody_system.length fx, fy, fz = instance.get_gravity_at_point(zero, 1.0 | nbody_system.length, zero, zero) self.assertAlmostEqual(fx, 0.0 | nbody_system.acceleration, 6) self.assertAlmostEqual(fy, 0.0 | nbody_system.acceleration, 6) self.assertAlmostEqual(fz, 0.0 | nbody_system.acceleration, 6) for x in (0.25, 0.5, 0.75): x0 = x | nbody_system.length x1 = (2.0 - x) | nbody_system.length potential0 = instance.get_potential_at_point(zero, x0, zero, zero) potential1 = instance.get_potential_at_point(zero, x1, zero, zero) fx0, fy0, fz0 = instance.get_gravity_at_point(zero, x0, zero, zero) fx1, fy1, fz1 = instance.get_gravity_at_point(zero, x1, zero, zero) self.assertAlmostEqual(fy0, 0.0 | nbody_system.acceleration, 6) self.assertAlmostEqual(fz0, 0.0 | nbody_system.acceleration, 6) self.assertAlmostEqual(fy1, 0.0 | nbody_system.acceleration, 6) self.assertAlmostEqual(fz1, 0.0 | nbody_system.acceleration, 6) self.assertAlmostEqual(fx0, -1.0 * fx1, 5) fx = (-1.0 / (x0**2) + 1.0 / (x1**2)) * (1.0 | nbody_system.length ** 3 / nbody_system.time ** 2) self.assertAlmostEqual(fx, fx0, 2) self.assertAlmostEqual(potential0, potential1, 5) instance.stop()
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) native_plot.show()
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) native_plot.show()
def make_effective_iso_potential_plot(gravity): """ This function is copied from the amuse documentation. The last part has been altered to also plot our Moon Earth system and the test particles orbit. """ omega = (constants.G * gravity.particles.total_mass() / (5.0 | units.AU**3)).sqrt() center_of_mass = gravity.particles.center_of_mass()[:] plt.rcParams.update({'font.size': 30}) figure = plt.figure(figsize=(12, 12)) ax = plt.gca() ax.get_yaxis().get_major_formatter().set_useOffset(False) ax.minorticks_on() current_axes = plt.subplot(1, 1, 1) current_axes.set_aspect("equal", adjustable="box") lim = 6e5 potential = effective_iso_potential_plot(gravity, omega, xlim=[-lim, lim] | units.km, ylim=[-lim, lim] | units.km, center_of_rotation=center_of_mass, fraction_screen_filled=0.85) # Simulation towards the Moon position = [329931, 0, 0] | units.km # position of the lagrange point velocity = [0.14, 1.022, 0] | units.kms # these parameters worked well gravity.particles.add_particles(create_testparticle(position, velocity)) x, y, E_begin, E_end = integrate_orbit( 1.85, gravity) # towards the moon 1.85 days is sufficent #initialize integrator converter = nbody_system.nbody_to_si(1.0 | units.MSun, 1.0 | units.AU) gravity = Hermite(converter) gravity.particles.add_particles(Earth_Moon_system()) gravity.particles.add_particles(create_testparticle(position, velocity)) gravity.particles.velocity = gravity.particles.velocity * -1. x2, y2, E_begin2, E_end2 = integrate_orbit( 10, gravity) # towards the Earth 10 days is sufficient # make numpy arrays x = np.array(x) y = np.array(y) x2 = np.array(x2) y2 = np.array(y2) # Make plot plt.scatter([0], [0], color='b', s=25, label='Earth') plt.plot(x[1], y[1], color='r', lw=2, label='Moon') plt.plot(x[2], y[2], color='k', lw=2, label='Test particle') plt.plot(x2[1], y2[1], color='r', lw=2) plt.plot(x2[2], y2[2], color='k', lw=2) plt.legend(fontsize=12) # Plot langrangian point plt.scatter(329931, 0, marker='+', s=30, zorder=2, c='m') plt.text(329931, -31306, "$L_1$", size=20, zorder=3, color='m') # Stop integrator gravity.cleanup_code() gravity.stop() # Label and show xlabel('x') ylabel('y') plt.ticklabel_format(style='sci', axis='both', scilimits=(0, 0)) plt.tight_layout() plt.savefig("lagrange_points.png") plt.show() # show figure
def evolve_triple_with_wind(M1, M2, M3, Pora, Pin_0, ain_0, aout_0, ein_0, eout_0, t_end, nsteps, scheme, integrator, t_stellar, dt_se, dtse_fac, interp): import random from amuse.ext.solarsystem import get_position numpy.random.seed(42) print "Initial masses:", M1, M2, M3 triple = Particles(3) triple[0].mass = M1 triple[1].mass = M2 triple[2].mass = M3 stellar = SeBa() stellar.particles.add_particles(triple) channel_from_stellar = stellar.particles.new_channel_to(triple) # Evolve to t_stellar. stellar.evolve_model(t_stellar) channel_from_stellar.copy_attributes(["mass"]) M1 = triple[0].mass M2 = triple[1].mass M3 = triple[2].mass print "t=", stellar.model_time.in_(units.Myr) print "M=", stellar.particles.mass.in_(units.MSun) print "R=", stellar.particles.radius.in_(units.RSun) print "L=", stellar.particles.luminosity.in_(units.LSun) print "T=", stellar.particles.temperature.in_(units.K) print "Mdot=", \ -stellar.particles.wind_mass_loss_rate.in_(units.MSun/units.yr) # Start the dynamics. # Inner binary: tmp_stars = Particles(2) tmp_stars[0].mass = M1 tmp_stars[1].mass = M2 if Pora == 1: ain_0 = semimajor_axis(Pin_0, M1+M2) else: Pin_0 = orbital_period(ain_0, M1+M2) print 'Pin =', Pin_0 print 'ain_0 =', ain_0 print 'M1+M2 =', M1+M2 print 'Pin_0 =', Pin_0.value_in(units.day), '[day]' #print 'semi:', semimajor_axis(Pin_0, M1+M2).value_in(units.AU), 'AU' #print 'period:', orbital_period(ain_0, M1+M2).value_in(units.day), '[day]' dt_init = 0.01*Pin_0 ma = 180 inc = 60 aop = 180 lon = 0 r,v = get_position(M1, M2, ein_0, ain_0, ma, inc, aop, lon, dt_init) tmp_stars[1].position = r tmp_stars[1].velocity = v tmp_stars.move_to_center() # Outer binary: r,v = get_position(M1+M2, M3, eout_0, aout_0, 0, 0, 0, 0, dt_init) tertiary = Particle() tertiary.mass = M3 tertiary.position = r tertiary.velocity = v tmp_stars.add_particle(tertiary) tmp_stars.move_to_center() triple.position = tmp_stars.position triple.velocity = tmp_stars.velocity Mtriple = triple.mass.sum() Pout = orbital_period(aout_0, Mtriple) print "T=", stellar.model_time.in_(units.Myr) print "M=", stellar.particles.mass.in_(units.MSun) print "Pout=", Pout.in_(units.Myr) print 'tK =', ((M1+M2)/M3)*Pout**2*(1-eout_0**2)**1.5/Pin_0 converter = nbody_system.nbody_to_si(triple.mass.sum(), aout_0) if integrator == 0: gravity = Hermite(converter) gravity.parameters.timestep_parameter = 0.01 elif integrator == 1: gravity = SmallN(converter) gravity.parameters.timestep_parameter = 0.01 gravity.parameters.full_unperturbed = 0 elif integrator == 2: gravity = Huayno(converter) gravity.parameters.inttype_parameter = 20 gravity.parameters.timestep = (1./256)*Pin_0 else: gravity = symple(converter) gravity.parameters.integrator = 10 #gravity.parameters.timestep_parameter = 0. gravity.parameters.timestep = (1./128)*Pin_0 print gravity.parameters gravity.particles.add_particles(triple) channel_from_framework_to_gd = triple.new_channel_to(gravity.particles) channel_from_gd_to_framework = gravity.particles.new_channel_to(triple) Etot_init = gravity.kinetic_energy + gravity.potential_energy Etot_prev = Etot_init gravity.particles.move_to_center() # Note: time = t_diag = 0 at the start of the dynamical integration. dt_diag = t_end/float(nsteps) t_diag = dt_diag time = 0.0 | t_end.unit t_se = t_stellar + time print 't_end =', t_end print 'dt_diag =', dt_diag ain, ein, aout, eout = get_orbital_elements_of_triple(triple) print "Triple elements t=", time, \ "inner:", triple[0].mass, triple[1].mass, ain, ein, \ "outer:", triple[2].mass, aout, eout t = [time.value_in(units.Myr)] Mtot = triple.mass.sum() mtot = [Mtot.value_in(units.MSun)] smai = [ain/ain_0] ecci = [ein/ein_0] smao = [aout/aout_0] ecco = [eout/eout_0] if interp: # Create arrays of stellar times and masses for interpolation. times = [time] masses = [triple.mass.copy()] while time < t_end: time += dt_se stellar.evolve_model(t_stellar+time) channel_from_stellar.copy_attributes(["mass"]) times.append(time) masses.append(triple.mass.copy()) time = 0.0 | t_end.unit print '\ntimes:', times, '\n' # Evolve the system. def advance_stellar(t_se, dt): E0 = gravity.kinetic_energy + gravity.potential_energy t_se += dt if interp: t = t_se-t_stellar i = int(t/dt_se) mass = masses[i] + (t-times[i])*(masses[i+1]-masses[i])/dt_se triple.mass = mass #print 't_se =', t_se, 'masses =', mass else: stellar.evolve_model(t_se) channel_from_stellar.copy_attributes(["mass"]) channel_from_framework_to_gd.copy_attributes(["mass"]) return t_se, gravity.kinetic_energy + gravity.potential_energy - E0 def advance_gravity(tg, dt): tg += dt gravity.evolve_model(tg) channel_from_gd_to_framework.copy() return tg while time < t_end: if scheme == 1: # Advance to the next diagnostic time. dE_se = zero dt = t_diag - time if dt > 0|dt.unit: time = advance_gravity(time, dt) elif scheme == 2: # Derive dt from Pin using dtse_fac. dt = dtse_fac*Pin_0 if time + dt > t_diag: dt = t_diag - time if dt > 0|dt.unit: t_se, dE_se = advance_stellar(t_se, dt) time = advance_gravity(time, dt) elif scheme == 3: # Derive dt from Pin using dtse_fac. dt = dtse_fac*Pin_0 if time + dt > t_diag: dt = t_diag - time if dt > 0|dt.unit: time = advance_gravity(time, dt) t_se, dE_se = advance_stellar(t_se, dt) elif scheme == 4: # Derive dt from Pin using dtse_fac. dt = dtse_fac*Pin_0 if time + dt > t_diag: dt = t_diag - time if dt > 0|dt.unit: t_se, dE_se = advance_stellar(t_se, 0.5*dt) time = advance_gravity(time, dt) t_se, dE_se2 = advance_stellar(t_se, 0.5*dt) dE_se += dE_se2 elif scheme == 5: # Use the specified dt_se. dE_se = zero dt = dt_se if time + dt > t_diag: dt = t_diag - time if dt > 0|dt.unit: # For use with symple only: set up average mass loss. channel_from_stellar.copy_attributes(["mass"]) m0 = triple.mass.copy() stellar.evolve_model(t_se+dt) channel_from_stellar.copy_attributes(["mass"]) t_se = stellar.model_time m1 = triple.mass dmdt = (m1-m0)/dt for i in range(len(dmdt)): gravity.set_dmdt(i, dmdt[i]) time = advance_gravity(time, dt) else: print 'unknown option' sys.exit(0) if time >= t_diag: t_diag = time + dt_diag Ekin = gravity.kinetic_energy Epot = gravity.potential_energy Etot = Ekin + Epot dE = Etot_prev - Etot Mtot = triple.mass.sum() print "T=", time, print "M=", Mtot, "(dM[SE]=", Mtot/Mtriple, ")", print "E= ", Etot, "Q= ", Ekin/Epot, print "dE=", (Etot_init-Etot)/Etot, "ddE=", (Etot_prev-Etot)/Etot, print "(dE[SE]=", dE_se/Etot, ")" Etot_init -= dE Etot_prev = Etot ain, ein, aout, eout = get_orbital_elements_of_triple(triple) print "Triple elements t=", t_stellar + time, \ "inner:", triple[0].mass, triple[1].mass, ain, ein, \ "outer:", triple[2].mass, aout, eout t.append(time.value_in(units.yr)) mtot.append(Mtot.value_in(units.MSun)) smai.append(ain/ain_0) ecci.append(ein/ein_0) smao.append(aout/aout_0) ecco.append(eout/eout_0) if eout > 1 or aout <= zero: print "Binary ionized or merged" break gravity.stop() stellar.stop() return t, mtot, smai, ecci, smao, ecco
cluster.particles.add_particles(particles) # set up bridge; cluster is evolved under influence of the galaxy sys = bridge(verbose=False) sys.add_system(cluster, (galaxy, ), False) # evolve and make plots times = units.Myr([0., 0.2, 0.4, 0.6, 0.8, 1.0, 1.2, 1.4]) f = pyplot.figure(figsize=(16, 8)) for i, t in enumerate(times): sys.evolve_model(t, timestep=timestep) print("Evolved the system to time %f" % t) x = sys.particles.x.value_in(units.parsec) y = sys.particles.y.value_in(units.parsec) subplot = f.add_subplot(2, 4, i + 1) subplot.plot(x, y, 'r .') subplot.plot([0.], [0.], 'b +') subplot.set_xlim(-60, 60) subplot.set_ylim(-60, 60) subplot.set_title(t) if i == 7: subplot.set_xlabel('parsec') cluster.stop() galaxy.stop() pyplot.show() # pyplot.savefig('test.eps')
def evolve_triple_with_wind(M1, M2, M3, Pora, Pin_0, ain_0, aout_0, ein_0, eout_0, t_end, nsteps, scheme, dtse_fac): import random from amuse.ext.solarsystem import get_position print "Initial masses:", M1, M2, M3 t_stellar = 4.0|units.Myr triple = Particles(3) triple[0].mass = M1 triple[1].mass = M2 triple[2].mass = M3 stellar = SeBa() stellar.particles.add_particles(triple) channel_from_stellar = stellar.particles.new_channel_to(triple) stellar.evolve_model(t_stellar) channel_from_stellar.copy_attributes(["mass"]) M1 = triple[0].mass M2 = triple[1].mass M3 = triple[2].mass print "T=", stellar.model_time.in_(units.Myr) print "M=", stellar.particles.mass.in_(units.MSun) print "Masses at time T:", M1, M2, M3 # Inner binary tmp_stars = Particles(2) tmp_stars[0].mass = M1 tmp_stars[1].mass = M2 if Pora == 1: ain_0 = semimajor_axis(Pin_0, M1+M2) else: Pin_0 = orbital_period(ain_0, M1+M2) print 'ain_0 =', ain_0 print 'M1+M2 =', M1+M2 print 'Pin_0 =', Pin_0.value_in(units.day), '[day]' #print 'semi:', semimajor_axis(Pin_0, M1+M2).value_in(units.AU), 'AU' #print 'period:', orbital_period(ain_0, M1+M2).value_in(units.day), '[day]' dt = 0.1*Pin_0 ma = 180 inc = 30 aop = 180 lon = 0 r, v = get_position(M1, M2, ein_0, ain_0, ma, inc, aop, lon, dt) tmp_stars[1].position = r tmp_stars[1].velocity = v tmp_stars.move_to_center() # Outer binary r, v = get_position(M1+M2, M3, eout_0, aout_0, 0, 0, 0, 0, dt) tertiary = Particle() tertiary.mass = M3 tertiary.position = r tertiary.velocity = v tmp_stars.add_particle(tertiary) tmp_stars.move_to_center() triple.position = tmp_stars.position triple.velocity = tmp_stars.velocity Mtriple = triple.mass.sum() Pout = orbital_period(aout_0, Mtriple) print "T=", stellar.model_time.in_(units.Myr) print "M=", stellar.particles.mass.in_(units.MSun) print "Pout=", Pout.in_(units.Myr) converter = nbody_system.nbody_to_si(triple.mass.sum(), aout_0) gravity = Hermite(converter) gravity.particles.add_particles(triple) channel_from_framework_to_gd = triple.new_channel_to(gravity.particles) channel_from_gd_to_framework = gravity.particles.new_channel_to(triple) Etot_init = gravity.kinetic_energy + gravity.potential_energy Etot_prev = Etot_init gravity.particles.move_to_center() time = 0.0 | t_end.unit ts = t_stellar + time ain, ein, aout, eout = get_orbital_elements_of_triple(triple) print "Triple elements t=", time, \ "inner:", triple[0].mass, triple[1].mass, ain, ein, \ "outer:", triple[2].mass, aout, eout dt_diag = t_end/float(nsteps) t_diag = dt_diag t = [time.value_in(units.Myr)] smai = [ain/ain_0] ecci = [ein/ein_0] smao = [aout/aout_0] ecco = [eout/eout_0] ain = ain_0 def advance_stellar(ts, dt): E0 = gravity.kinetic_energy + gravity.potential_energy ts += dt stellar.evolve_model(ts) channel_from_stellar.copy_attributes(["mass"]) channel_from_framework_to_gd.copy_attributes(["mass"]) return ts, gravity.kinetic_energy + gravity.potential_energy - E0 def advance_gravity(tg, dt): tg += dt gravity.evolve_model(tg) channel_from_gd_to_framework.copy() return tg while time < t_end: Pin = orbital_period(ain, triple[0].mass+triple[1].mass) dt = dtse_fac*Pin dt *= random.random() if scheme == 1: ts, dE_se = advance_stellar(ts, dt) time = advance_gravity(time, dt) elif scheme == 2: time = advance_gravity(time, dt) ts, dE_se = advance_stellar(ts, dt) else: dE_se = zero #ts, dE_se = advance_stellar(ts, dt/2) time = advance_gravity(time, dt) #ts, dE = advance_stellar(ts, dt/2) #dE_se += dE if time >= t_diag: t_diag = time + dt_diag Ekin = gravity.kinetic_energy Epot = gravity.potential_energy Etot = Ekin + Epot dE = Etot_prev - Etot Mtot = triple.mass.sum() print "T=", time, print "M=", Mtot, "(dM[SE]=", Mtot/Mtriple, ")", print "E= ", Etot, "Q= ", Ekin/Epot, print "dE=", (Etot_init-Etot)/Etot, "ddE=", (Etot_prev-Etot)/Etot, print "(dE[SE]=", dE_se/Etot, ")" Etot_init -= dE Etot_prev = Etot ain, ein, aout, eout = get_orbital_elements_of_triple(triple) print "Triple elements t=", (4|units.Myr) + time, \ "inner:", triple[0].mass, triple[1].mass, ain, ein, \ "outer:", triple[2].mass, aout, eout t.append(time.value_in(units.Myr)) smai.append(ain/ain_0) ecci.append(ein/ein_0) smao.append(aout/aout_0) ecco.append(eout/eout_0) if eout > 1.0 or aout <= zero: print "Binary ionized or merged" break gravity.stop() stellar.stop() return t, smai, ecci, smao, ecco
def test2(self): convert_nbody = nbody_system.nbody_to_si(1.0 | units.MSun, 149.5e6 | units.km) bhtree = BHTree(convert_nbody) bhtree.initialize_code() bhtree.eps2_for_gravity = 0.001 bhtree_particles = self.new_system_sun_and_earth() bhtree.particles.add_particles(bhtree_particles) if bhtree.legacy_interface.channel_type == 'mpi': from mpi4py import MPI if not MPI.Query_thread() == MPI.THREAD_MULTIPLE: bhtree.stop() self.skip("can only test parallel with multiple thread support in mpi implementation") hermite = Hermite(convert_nbody) hermite.dt_dia = 5000 hermite.commit_parameters() hermite_particles = self.new_system_sun_and_earth() hermite.particles.add_particles(hermite_particles) thread1 = threading.Thread(target = self.evolve_model_unit_day, args = (bhtree, bhtree_particles, 10)) thread2 = threading.Thread(target = self.evolve_model_unit_day, args = (hermite, hermite_particles, 10)) thread1.start() thread2.start() thread1.join() thread2.join() if HAS_MATPLOTLIB: figure = pyplot.figure() plot = figure.add_subplot(1,1,1) earth = bhtree_particles[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') earth = hermite_particles[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 = "g", 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, "parallel-earth-sun.svg") figure.savefig(output_file) bhtree.stop() hermite.stop() bhtree.stop()