def setup_codes(stars_below_cut, stars_above_cut, nbody_converter): if len(stars_below_cut) is 0: # direct print "There are zero stars below the cut-off, using direct solver!" gravity = Hermite(nbody_converter, number_of_workers=4) gravity.particles.add_particles(stars_above_cut) channels = Channels() channels.add_channel(gravity.particles.new_channel_to(stars_above_cut)) return gravity, channels # NB no bridge needed if len(stars_above_cut) is 0: # tree print "There are zero stars above the cut-off, using tree solver!" gravity = BHTree(nbody_converter) gravity.particles.add_particles(stars_below_cut) channels = Channels() channels.add_channel(gravity.particles.new_channel_to(stars_below_cut)) return gravity, channels # NB no bridge needed gravity_low_mass = BHTree(nbody_converter) gravity_low_mass.particles.add_particles(stars_below_cut) gravity_high_mass = Hermite(nbody_converter, number_of_workers=4) gravity_high_mass.particles.add_particles(stars_above_cut) bridge = Bridge(timestep=0.01|units.Myr, use_threading=False) bridge.add_system(gravity_low_mass, (gravity_high_mass,)) bridge.add_system(gravity_high_mass, (gravity_low_mass,)) channels = Channels() channels.add_channel(gravity_low_mass.particles.new_channel_to(stars_below_cut)) channels.add_channel(gravity_high_mass.particles.new_channel_to(stars_above_cut)) return bridge, channels
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 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 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 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 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 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 test21(self): import pickle convert_nbody = nbody_system.nbody_to_si(1.0 | units.MSun, 149.5e6 | units.km) hermite = Hermite(convert_nbody) encoded_interface = pickle.dumps(hermite,0) decoded_interface = pickle.loads(encoded_interface)
def test5(self): converter = nbody_system.nbody_to_si(units.MSun, units.parsec) code = Hermite(converter) stars = datamodel.Particles(keys=(1, 2)) stars.mass = converter.to_si(1 | nbody_system.mass) stars.position = converter.to_si([[0, 0, 0], [1.2, 0, 0]] | nbody_system.length) stars.velocity = converter.to_si([[0, 0, 0], [0, 0.1, 0]] | nbody_system.speed) stars.radius = converter.to_si(0.5 | nbody_system.length) encounter_code = encounters.HandleEncounter( kepler_code=self.new_kepler_si(), resolve_collision_code=self.new_smalln_si(), interaction_over_code=None, G=constants.G) encounter_code.parameters.hard_binary_factor = 1 multiples_code = encounters.Multiples( gravity_code=code, handle_encounter_code=encounter_code, G=constants.G) end_time = converter.to_si(1.0 | nbody_system.time) multiples_code.particles.add_particles(stars) multiples_code.commit_particles() multiples_code.evolve_model(end_time) self.assertEquals(len(multiples_code.particles), 1) # 1 multiples with 2 singles self.assertEquals(len(multiples_code.multiples), 1) self.assertEquals(len(multiples_code.multiples[0].components), 2) self.assertEquals(len(multiples_code.binaries), 1) self.assertEquals(len(multiples_code.singles), 0)
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 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 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 parent_worker(): code = Hermite(conv) code.parameters.epsilon_squared = 0. | units.AU**2 code.parameters.end_time_accuracy_factor = 0. code.parameters.dt_param = 0.001 print(code.parameters.dt_dia.in_(units.yr)) return code
def test3(self): code = Hermite() particles_in_binary = self.new_binary(0.1 | nbody_system.mass, 0.1 | nbody_system.mass, 0.01 | nbody_system.length, keyoffset=1) particles_in_binary.radius = 0.001 | nbody_system.length binary = datamodel.Particle(key=3) binary.child1 = particles_in_binary[0] binary.child2 = particles_in_binary[1] binary.radius = 0.5 | nbody_system.length binary.mass = 0.2 | nbody_system.mass encounter_code = encounters.HandleEncounter( kepler_code=self.new_kepler(), resolve_collision_code=self.new_smalln(), interaction_over_code=None) multiples_code = encounters.Multiples( gravity_code=code, handle_encounter_code=encounter_code) multiples_code.singles_in_binaries.add_particles(particles_in_binary) multiples_code.binaries.add_particle(binary) self.assertEquals(len(multiples_code.singles_in_binaries), 2) self.assertEquals(id(multiples_code.binaries[0].child1.particles_set), id(multiples_code.singles_in_binaries)) multiples_code.commit_particles() self.assertEquals(len(multiples_code.multiples), 1) self.assertEquals(len(multiples_code.components_of_multiples), 2)
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 test2(self): code = Hermite() stars = datamodel.Particles(keys=(1, 2, 3, 4)) stars.mass = 1 | nbody_system.mass stars.position = [ [0, 0, 0], [0.5, 0, 0], [2, 0, 0], [-10, 0, 0], ] | nbody_system.length stars.velocity = [ [0, 0, 0], [0, 0.1, 0], [0, -0.1, 0], [0, 0.2, 0], ] | nbody_system.speed stars.radius = 0.5 | nbody_system.length encounter_code = encounters.HandleEncounter( kepler_code=self.new_kepler(), resolve_collision_code=self.new_smalln(), interaction_over_code=None) multiples_code = encounters.Multiples( gravity_code=code, handle_encounter_code=encounter_code) multiples_code.particles.add_particles(stars) multiples_code.commit_particles() multiples_code.evolve_model(3 | nbody_system.time) self.assertEquals(len(multiples_code.multiples), 1) self.assertEquals(len(multiples_code.multiples[0].components), 2) self.assertEquals(len(multiples_code.particles), 3) self.assertEquals(len(multiples_code.binaries), 1) self.assertEquals(len(multiples_code.singles), 2)
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_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 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 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 test11(self): code = Hermite() particles_in_binary = self.new_binary(1 | nbody_system.mass, 1 | nbody_system.mass, 0.001 | nbody_system.length, keyoffset=1) particles_in_binary.radius = 0.01 | nbody_system.length encounter_code = encounters.HandleEncounter( kepler_code=self.new_kepler(), resolve_collision_code=self.new_smalln(), ) others = datamodel.Particles(keys=[4, 5, 6]) for i in range(3): others[i].position = [i, 0, 0] | nbody_system.length others[i].velocity = [0, 0, 0] | nbody_system.speed others[i].mass = 0.2 | nbody_system.mass others[i].radius = 0.05 | nbody_system.length multiples_code = encounters.Multiples( gravity_code=code, handle_encounter_code=encounter_code) multiples_code.singles.add_particles(particles_in_binary) multiples_code.singles.add_particles(others) stopping_condition = multiples_code.stopping_conditions.binaries_change_detection stopping_condition.enable() multiples_code.commit_particles() multiples_code.evolve_model(1 | nbody_system.time) self.assertEquals(len(multiples_code.multiples), 1) self.assertEquals(len(multiples_code.binaries), 1) self.assertEquals(len(multiples_code.components_of_multiples), 2) self.assertEquals(len(multiples_code.singles), 3) self.assertEquals(len(multiples_code.particles), 4) self.assertEquals(len(code.particles), 4) self.assertTrue(stopping_condition.is_set()) multiples_code.particles[-1].velocity = [0, 0, 0] | nbody_system.speed multiples_code.update_model() print multiples_code.particles.key self.assertEquals(len(stopping_condition.particles(0)), 1) self.assertEquals(len(stopping_condition.particles(1)), 0) self.assertEquals(len(stopping_condition.particles(2)), 0) self.assertAlmostRelativeEquals(multiples_code.multiples[0].mass, 2.0 | nbody_system.mass) self.assertAlmostRelativeEquals(multiples_code.particles.mass.sum(), 2.6 | nbody_system.mass) print multiples_code.particles.velocity multiples_code.evolve_model(2 | nbody_system.time) self.assertTrue(stopping_condition.is_set()) self.assertEquals(len(stopping_condition.particles(0)), 0) self.assertEquals(len(stopping_condition.particles(1)), 0) self.assertEquals(len(stopping_condition.particles(2)), 1) self.assertAlmostRelativeEquals(multiples_code.multiples[0].mass, 2.0 | nbody_system.mass) self.assertAlmostRelativeEquals(multiples_code.particles.mass.sum(), 2.6 | nbody_system.mass)
def set_up_gravitational_dynamics_code(stars): convert_nbody = nbody_to_si(11.0 | units.MSun, 10.0 | units.AU) gravitational_dynamics = Hermite(convert_nbody) gravitational_dynamics.parameters.epsilon_squared = 0.0 | units.AU**2 view_on_the_primary = gravitational_dynamics.particles.add_particle( stars[0]) gravitational_dynamics.particles.add_particle(stars[1]) return gravitational_dynamics, view_on_the_primary
def test4(self): code = Hermite() stars = datamodel.Particles(keys=(1, 2, 3, 4)) stars.mass = 1 | nbody_system.mass stars.position = [ [0, 0, 0], [0.5, 0, 0], [2, 0, 0], [-10, 0, 0], ] | nbody_system.length stars.velocity = [ [0, 0, 0], [0, 0.1, 0], [0, -0.1, 0], [0, 0.2, 0], ] | nbody_system.speed stars.radius = 0.5 | nbody_system.length encounter_code = encounters.HandleEncounter( kepler_code=self.new_kepler(), resolve_collision_code=self.new_smalln(), interaction_over_code=None) multiples_code = encounters.Multiples( gravity_code=code, handle_encounter_code=encounter_code) multiples_code.particles.add_particles(stars) multiples_code.commit_particles() stopping_condition = multiples_code.stopping_conditions.multiples_change_detection stopping_condition.enable() multiples_code.evolve_model(3 | nbody_system.time) self.assertTrue(stopping_condition.is_set()) self.assertAlmostRelativeEquals(multiples_code.model_time, 0.0075 | nbody_system.time, 4) self.assertEquals(len(stopping_condition.particles(0)), 1) self.assertEquals(len(stopping_condition.particles(1)), 0) self.assertEquals(len(multiples_code.multiples), 1) self.assertEquals(len(multiples_code.multiples[0].components), 2) self.assertEquals(len(multiples_code.particles), 3) # 1 multiples with 2 singles, plus 2 singles free self.assertEquals(len(multiples_code.binaries), 1) self.assertEquals(len(multiples_code.singles), 2) multiples_code.evolve_model(3 | nbody_system.time) self.assertTrue(stopping_condition.is_set()) self.assertAlmostRelativeEquals(multiples_code.model_time, 1.19126 | nbody_system.time, 4) self.assertEquals(len(stopping_condition.particles(0)), 1) # 1 new multiple self.assertEquals(len(stopping_condition.particles(1)), 1) # 1 dissolved multiple self.assertEquals(len(multiples_code.multiples[0].components), 2) self.assertEquals(len(multiples_code.particles), 3) # 1 multiples with 2 singles, plus 2 singles free self.assertEquals(len(multiples_code.binaries), 1) self.assertEquals(len(multiples_code.singles), 2)
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 test6(self): converter = nbody_system.nbody_to_si(units.MSun, units.parsec) code = Hermite(converter) stars = datamodel.Particles(keys=(1, 2, 3, 4)) stars.mass = converter.to_si(1 | nbody_system.mass) stars.position = converter.to_si( [[0, 0, 0], [1.2, 0, 0], [100, 0, 0], [100, 1.2, 0]] | nbody_system.length) stars.velocity = converter.to_si([ [0, 0, 0], [0, 0.1, 0], [0, 0, 0], [0, 0, 0.1], ] | nbody_system.speed) stars.radius = converter.to_si(0.5 | nbody_system.length) encounter_code = encounters.HandleEncounter( kepler_code=self.new_kepler_si(), resolve_collision_code=self.new_smalln_si(), interaction_over_code=None, G=constants.G) encounter_code.small_scale_factor = 1.0 multiples_code = encounters.Multiples( gravity_code=code, handle_encounter_code=encounter_code, G=constants.G) multiples_code.must_handle_one_encounter_per_stopping_condition = False multiples_code.particles.add_particles(stars) multiples_code.commit_particles() stopping_condition = multiples_code.stopping_conditions.multiples_change_detection stopping_condition.enable() end_time = converter.to_si(3.0 | nbody_system.time) print end_time.as_quantity_in(units.Myr) multiples_code.evolve_model(end_time) self.assertTrue(stopping_condition.is_set()) print multiples_code.model_time.as_quantity_in(units.Myr) self.assertAlmostRelativeEquals(multiples_code.model_time, 7.99844 | units.Myr, 4) self.assertEquals(len(stopping_condition.particles(0)), 2) self.assertEquals(len(stopping_condition.particles(1)), 0) self.assertEquals(len(multiples_code.particles), 2) # 1 multiples with 2 singles self.assertEquals(len(multiples_code.multiples), 2) self.assertEquals(len(multiples_code.binaries), 2) self.assertEquals(len(multiples_code.multiples[0].components), 2) self.assertEquals(len(multiples_code.multiples[1].components), 2) self.assertEquals(len(multiples_code.singles), 0) self.assertEquals(len(multiples_code.all_singles), 4)
def test_hermite(self): convert_nbody = nbody_system.nbody_to_si(1.0 | units.kg, 1.0 | units.km) hermite = Hermite(convert_nbody) hermite.parameters.epsilon_squared = 10 | units.km**2 docstring = hermite.parameters.__doc__ self.assertTrue("smoothing parameter for gravity calculations (default value:0.0 m**2)" in docstring) parameter_str_method_output = str(hermite.parameters) self.assertTrue("epsilon_squared: 10000000.0 m**2" in parameter_str_method_output)
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 test14(self): code = Hermite() encounter_code = encounters.HandleEncounter( kepler_code=self.new_kepler(), resolve_collision_code=self.new_smalln(), ) center_of_mass_particles = datamodel.Particles(5) center_of_mass_particles.position = (numpy.asarray(range(5))).reshape( 5, 1) * ([1.0, 0.0, 0.0] | nbody_system.length) center_of_mass_particles.velocity = [0.0, 0.0, 0.0 ] | nbody_system.speed center_of_mass_particles.radius = 0.05 | nbody_system.length binaries, singles_in_binaries = self.create_binaries( center_of_mass_particles, 1 | nbody_system.mass, 0.1 | nbody_system.mass, 0.00000001 | nbody_system.length) multiples_code = encounters.Multiples( gravity_code=code, handle_encounter_code=encounter_code) multiples_code.singles_in_binaries.add_particles(singles_in_binaries) multiples_code.binaries.add_particles(binaries) multiples_code.commit_particles() #stopping_condition = multiples_code.stopping_conditions.encounter_detection #stopping_condition.enable() stopping_condition = multiples_code.stopping_conditions.binaries_change_detection stopping_condition.enable() for x in multiples_code.binaries: print x.key, x.child1.key, x.child2.key multiples_code.evolve_model(2 | nbody_system.time) self.assertTrue(stopping_condition.is_set()) for x in multiples_code.binaries: print x.key, x.child1.key, x.child2.key for x in stopping_condition.particles(0): print "NEW:", x.key, x.child1.key, x.child2.key for x in stopping_condition.particles(1): print "REMOVED:", x.key, x.child1.key, x.child2.key for x in stopping_condition.particles(2): print "UPDATED:", x.key, x.child1.key, x.child2.key for x in multiples_code.singles: print x.key, x.mass self.assertEquals( len(multiples_code.singles_in_binaries) + len(multiples_code.singles), 2 * len(center_of_mass_particles)) self.assertEquals( len(multiples_code.binaries) - len(stopping_condition.particles(0)) + len(stopping_condition.particles(1)), len(center_of_mass_particles))
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)