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 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 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 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 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 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_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 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 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 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 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 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 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)
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 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)
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 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 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 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 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 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): 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 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)
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 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 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 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 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 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 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 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 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 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 setup_codes(stars_below_cut, stars_above_cut, nbody_converter): gravity_low_mass = BHTree(nbody_converter) gravity_low_mass.particles.add_particles(stars_below_cut) gravity_high_mass = Hermite(nbody_converter) 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 gravity_low_mass, gravity_high_mass, bridge, channels
def test25(self): hermite = Hermite() hermite.parameters.epsilon_squared = 0.0 | nbody_system.length**2 particles = datamodel.Particles(10) 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 particles.x = numpy.linspace(1, 10, 10) | nbody_system.length particles.vx = numpy.linspace(1, 5, 10) | nbody_system.speed hermite.particles.add_particles(particles) request = hermite.particles.get_values_in_store_async(None, ["x"]) request.wait() print request.result() self.assertEquals(request.result()[0], particles.x) request = hermite.particles.get_values_in_store_async(None, ["x", "vx"]) request.wait() print request.result() self.assertEquals(request.result()[0], particles.x) self.assertEquals(request.result()[1], particles.vx) p = particles.copy() channel = hermite.particles.new_channel_to(p) p.x = 0 | nbody_system.length p.vx = 0 | nbody_system.speed request = channel.copy_attributes_async(("x","vx",), async_get = True) request.wait() self.assertEquals(p.x, particles.x) self.assertEquals(p.vx, particles.vx) p.x = 0 | nbody_system.length p.vx = 0 | nbody_system.speed channel = p.new_channel_to(hermite.particles) request = channel.copy_attributes_async(("x", "y", "z","vx","vy","vz"), async_get = False, async_set = True) request.wait() self.assertEquals(p.x, hermite.particles.x) self.assertEquals(p.vx, hermite.particles.vx) channel = p.new_channel_to(particles) request = channel.copy_attributes_async(("x", "y", "z","vx","vy","vz"), async_get = False, async_set = True) request.wait() self.assertEquals(p.x, particles.x) self.assertEquals(p.vx, particles.vx) request = channel.copy_attributes_async(("x", "y", "z","vx","vy","vz"), async_get = True, async_set = False) request.wait() self.assertEquals(p.x, particles.x) self.assertEquals(p.vx, particles.vx)
def test15(self): code = Hermite() encounter_code = encounters.HandleEncounter( kepler_code=self.new_kepler(), resolve_collision_code=self.new_smalln(), ) n = 10 center_of_mass_particles = plummer.new_plummer_model( n, random=numpy.random.mtrand.RandomState(1)) center_of_mass_particles.radius = 0.5 | nbody_system.length center_of_mass_particles.velocity *= 0 binaries, singles_in_binaries = self.create_binaries( center_of_mass_particles, 0.999 * ((1.0 | nbody_system.mass) / n), 0.001 * ((1.0 | nbody_system.mass) / n), 0.00001 | 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.binaries) - len(stopping_condition.particles(0)) + len(stopping_condition.particles(1)), len(center_of_mass_particles))
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 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 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 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 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 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 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()
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 instance = Hermite(convert_nbody) instance.particles.add_particles(particles) channelp = instance.particles.new_channel_to(particles) start = 0 |units.yr end = 150 | units.yr step = 10|units.day timerange = VectorQuantity.arange(start, end, step) masses = []|units.MSun for i, time in enumerate(timerange): instance.evolve_model(time) channelp.copy()
) subplot.set_xlim(-1, 1) subplot.set_ylim(-1, 1) subplot.set_xlabel('x (nbody length)') subplot.set_ylabel('y (nbody length)') pyplot.show() if __name__ == "__main__": numpy.random.seed(1212) particles = new_cluster(128) code = Hermite() code.particles.add_particles(particles) stopping_condition = code.stopping_conditions.collision_detection stopping_condition.enable() code.evolve_model(4 | nbody_system.time) if not stopping_condition.is_set(): raise Exception( "No stopping collision detected in the given timeframe.") plot_particles_and_highlight_collision( particles, stopping_condition.particles(0), stopping_condition.particles(1))
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 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 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()
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 hydro_grid_in_potential_well(mass=1 | units.MSun, length=100 | units.AU): converter = nbody_system.nbody_to_si(mass, length) # calculate density in field based on solar wind # gives a very low number molar_mass_hydrogen_proton = 1 | units.g / units.mol density_hydrogen_in_stellar_wind = 10 | 1 / units.cm**3 particles_per_mol = 6.022e23 | 1 / units.mol density_hydrogen_in_stellar_wind_in_moles = ( density_hydrogen_in_stellar_wind / particles_per_mol ) density_gas = 100 * ( density_hydrogen_in_stellar_wind_in_moles * molar_mass_hydrogen_proton ).as_quantity_in(units.MSun / units.AU**3) # override with higher number for plotting density_gas = 1e-3 | units.MSun / units.AU**3 instance = Athena(converter) instance.initialize_code() instance.parameters.nx = 50 instance.parameters.ny = 50 instance.parameters.nz = 1 instance.parameters.length_x = length instance.parameters.length_y = length instance.parameters.length_z = length instance.parameters.x_boundary_conditions = ("periodic", "periodic") instance.parameters.y_boundary_conditions = ("periodic", "periodic") instance.parameters.z_boundary_conditions = ("outflow", "outflow") # instance.stopping_conditions.number_of_steps_detection.enable() instance.set_has_external_gravitational_potential(1) instance.commit_parameters() grid_in_memory = instance.grid.copy() grid_in_memory.rho = density_gas pressure = 1 | units.Pa grid_in_memory.energy = pressure / (instance.parameters.gamma - 1) channel = grid_in_memory.new_channel_to(instance.grid) channel.copy() instance.initialize_grid() particle = Particle( mass=mass, position=length * [0.5, 0.5, 0.5], velocity=[0.0, 0.0, 0.0] | units.kms ) gravity = Hermite(converter) dx = (grid_in_memory.x[1][0][0] - grid_in_memory.x[0] [0][0]).as_quantity_in(units.AU) gravity.parameters.epsilon_squared = dx**2 gravity.particles.add_particle(particle) potential = gravity.get_potential_at_point( 0 * instance.potential_grid.x.flatten(), instance.potential_grid.x.flatten(), instance.potential_grid.y.flatten(), instance.potential_grid.z.flatten() ) potential = potential.reshape(instance.potential_grid.x.shape) instance.potential_grid.potential = potential instance.evolve_model(100 | units.yr) print(instance.get_timestep().value_in(units.yr)) value_to_plot = instance.grid.rho[:, :, 0].value_in( units.MSun / units.AU**3) # value_to_plot = potential[...,...,0].value_in(potential.unit) plot_grid(value_to_plot)
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 new_star_code_hermite(self): result = Hermite(self.converter) result.parameters.epsilon_squared = self.star_epsilon ** 2 result.particles.add_particles(self.new_particles_cluster()) result.commit_particles() return result