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 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.assertEqual(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.assertEqual(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.assertEqual(curr_state[0], 16|units.kg, 8)
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.assertEqual(len(collisions.particles(0)), 3) self.assertEqual(len(collisions.particles(1)), 3) self.assertEqual(len(particles - collisions.particles(0) - collisions.particles(1)), 1) self.assertEqual(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.assertEqual(len(collisions.particles(0)), 1) self.assertEqual(len(collisions.particles(1)), 1) self.assertEqual(len(instance.particles - collisions.particles(0) - collisions.particles(1)), 2) self.assertEqual(abs(collisions.particles(0).x - collisions.particles(1).x) <= (collisions.particles(0).radius + collisions.particles(1).radius), [True]) instance.stop()
def evolve_model(end_time, double_star, stars): time = 0 | units.yr dt = end_time/100. converter = nbody_system.nbody_to_si(double_star.mass, double_star.semimajor_axis) gravity = Hermite(converter) gravity.particles.add_particle(stars) to_stars = gravity.particles.new_channel_to(stars) # from_stars = stars.new_channel_to(gravity.particles) massloss_code = CodeWithMassLoss(gravity, ()) gravml = bridge.Bridge(use_threading=False) gravml.timestep = 0.5*dt gravml.add_system(gravity,) gravml.add_code(massloss_code) a = [] | units.au e = [] m = [] | units.MSun t = [] | units.yr while time < end_time: time += dt gravml.evolve_model(time) to_stars.copy() orbital_elements = orbital_elements_from_binary(stars, G=constants.G) a.append(orbital_elements[2]) e.append(orbital_elements[3]) m.append(stars.mass.sum()) t.append(time) print("time=", time.in_(units.yr), "a=", a[-1].in_(units.RSun), "e=", e[-1], "m=", stars.mass.in_(units.MSun)) gravity.stop() from matplotlib import pyplot fig, axis = pyplot.subplots(nrows=2, ncols=2, sharex=True) axis[0][0].scatter(t.value_in(units.yr), a.value_in(units.RSun)) axis[0][0].set_ylabel("a [$R_\odot$]") axis[0][1].scatter(t.value_in(units.yr), m.value_in(units.MSun)) axis[0][1].set_ylabel("M [$M_\odot$]") axis[1][1].scatter(t.value_in(units.yr), e) axis[1][1].set_ylabel("e") axis[1][1].set_xlabel("time [yr]") axis[1][0].set_xlabel("time [yr]") pyplot.savefig("mloss_bridge.png") pyplot.show()
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.assertEqual(0.0 | units.AU**2 , value) self.assertAlmostEqual(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.assertAlmostEqual(x | units.AU**2, instance.parameters.epsilon_squared, in_units=units.AU**2) value = instance.get_dt_param() self.assertEqual(0.03 , value) self.assertAlmostEqual(0.03 , instance.parameters.dt_param) for x in [0.001, 0.01, 0.1]: instance.parameters.dt_param = x self.assertAlmostEqual(x, instance.parameters.dt_param) value = instance.get_dt_dia() self.assertAlmostEqual(1.0 | units.yr, value) self.assertAlmostEqual(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.assertAlmostEqual(x | units.yr, instance.parameters.dt_dia, in_units=units.yr) value = instance.get_begin_time() self.assertEqual(0.0| units.yr, value) self.assertAlmostEqual(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.assertAlmostEqual(x | units.yr, instance.parameters.begin_time, in_units=units.yr) 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.assertEqual( 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 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.assertEqual(id(channel1), id(channel2))
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 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.assertEqual(len(multiples_code.singles_in_binaries), 2) self.assertEqual(id(multiples_code.binaries[0].child1.particles_set), id(multiples_code.singles_in_binaries)) multiples_code.commit_particles() self.assertEqual(len(multiples_code.multiples), 1) self.assertEqual(len(multiples_code.components_of_multiples), 2)
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.assertEqual(len(multiples_code.particles), 1) # 1 multiples with 2 singles self.assertEqual(len(multiples_code.multiples), 1) self.assertEqual(len(multiples_code.multiples[0].components), 2) self.assertEqual(len(multiples_code.binaries), 1) self.assertEqual(len(multiples_code.singles), 0)
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], [0.5, 0, 0], [3, 0, 0], [-10, 0, 0], ] | nbody_system.length stars.velocity = [ [0.0, 0, 0], [0, 0.1, 0], [0.0, -0.5, 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.assertEqual(len(multiples_code.multiples), 1) print(multiples_code.multiples[0].components) self.assertEqual(len(multiples_code.multiples[0].components), 2) self.assertEqual(len(multiples_code.particles), 3) self.assertEqual(len(multiples_code.binaries), 1) self.assertEqual(len(multiples_code.singles), 2)
def test11(self): code = Hermite() particles_in_binary = self.new_binary(1.0 | nbody_system.mass, 1.0 | 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.assertEqual(len(multiples_code.multiples), 1) self.assertEqual(len(multiples_code.binaries), 1) self.assertEqual(len(multiples_code.components_of_multiples), 2) self.assertEqual(len(multiples_code.singles), 3) self.assertEqual(len(multiples_code.particles), 4) self.assertEqual(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.assertEqual(len(stopping_condition.particles(0)), 1) self.assertEqual(len(stopping_condition.particles(1)), 0) self.assertEqual(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.assertEqual(len(stopping_condition.particles(0)), 0) self.assertEqual(len(stopping_condition.particles(1)), 0) self.assertEqual(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.assertEqual(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.assertEqual(len(instance.particles), 2) instance.particles.mass = [17.0, 33.0] | units.kg self.assertEqual(instance.get_mass(0), 17.0| units.kg) self.assertEqual(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], [0.5, 0, 0], [2, 0, 0], [-10, 0, 0], ] | nbody_system.length stars.velocity = [ [0, 0, 0], [0, 0.2, 0], [0, -0.2, 0], [0, 0.3, 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.assertEqual(len(stopping_condition.particles(0)), 1) self.assertEqual(len(stopping_condition.particles(1)), 0) self.assertEqual(len(multiples_code.multiples), 1) self.assertEqual(len(multiples_code.multiples[0].components), 2) self.assertEqual(len(multiples_code.particles), 3) # 1 multiples with 2 singles, plus 2 singles free self.assertEqual(len(multiples_code.binaries), 1) self.assertEqual(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.2195 | nbody_system.time, 4) self.assertEqual(len(stopping_condition.particles(0)), 1) # 1 new multiple self.assertEqual(len(stopping_condition.particles(1)), 1) # 1 dissolved multiple self.assertEqual(len(multiples_code.multiples[0].components), 3) self.assertEqual(len(multiples_code.particles), 2) # 1 multiple, plus 1 single free self.assertEqual(len(multiples_code.binaries), 1) self.assertEqual(len(multiples_code.singles), 1)
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.assertEqual(request.result()[0], particles.x) request = hermite.particles.get_values_in_store_async( None, ["x", "vx"]) request.wait() print(request.result()) self.assertEqual(request.result()[0], particles.x) self.assertEqual(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.assertEqual(p.x, particles.x) self.assertEqual(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.assertEqual(p.x, hermite.particles.x) self.assertEqual(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.assertEqual(p.x, particles.x) self.assertEqual(p.vx, particles.vx) request = channel.copy_attributes_async( ("x", "y", "z", "vx", "vy", "vz"), async_get=True, async_set=False) request.wait() self.assertEqual(p.x, particles.x) self.assertEqual(p.vx, particles.vx)
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.assertEqual(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 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.assertEqual(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.assertEqual(instance.particles[0].radius, 0.0 | nbody_system.length) self.assertEqual(instance.particles[1].radius, 0.0 | nbody_system.length) self.assertEqual(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 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 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.assertEqual( len(hermite.stopping_conditions.out_of_box_detection.particles(0)), 1) self.assertEqual( hermite.stopping_conditions.out_of_box_detection.particles(0) [0].key, particles[1].key) hermite.stop()
def evolve_model(end_time, double_star, stars): converter = nbody_system.nbody_to_si(double_star.mass, double_star.semimajor_axis) gravity = Hermite(converter) gravity.particles.add_particle(stars) to_stars = gravity.particles.new_channel_to(stars) # from_stars = stars.new_channel_to(gravity.particles) time = 0 | units.yr dt = end_time / 100. a = [] | units.au t = [] | units.yr while time < end_time: time += dt gravity.evolve_model(1 | units.yr) to_stars.copy() orbital_elements = orbital_elements_from_binary(stars, G=constants.G) a.append(orbital_elements[2]) t.append(time) gravity.stop() from matplotlib import pyplot pyplot.scatter(t.value_in(units.yr), a.value_in(units.au)) pyplot.show()
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.assertEqual(len(stopping_condition.particles(0)), 2) self.assertEqual(len(stopping_condition.particles(1)), 0) self.assertEqual(len(multiples_code.particles), 2) # 1 multiples with 2 singles self.assertEqual(len(multiples_code.multiples), 2) self.assertEqual(len(multiples_code.binaries), 2) self.assertEqual(len(multiples_code.multiples[0].components), 2) self.assertEqual(len(multiples_code.multiples[1].components), 2) self.assertEqual(len(multiples_code.singles), 0) self.assertEqual(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 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.assertEqual( len(multiples_code.singles_in_binaries) + len(multiples_code.singles), 2 * len(center_of_mass_particles)) self.assertEqual( 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 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.assertEqual( 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.assertEqual(instance.particles[0].radius, 0.0 | nbody_system.length) instance.parameters.end_time_accuracy_factor = 0.0 instance.evolve_model(0.1 | nbody_system.time) self.assertAlmostRelativeEquals(instance.model_time, 0.1 |nbody_system.time, 5) instance.stop()
def test7(self): print("Test7: Testing effect of Hermite parameter epsilon_squared") convert_nbody = nbody_system.nbody_to_si(1.0 | units.MSun, 1.0 | units.AU) particles = datamodel.Particles(2) sun = particles[0] sun.mass = 1.0 | units.MSun sun.position = [0.0, 0.0, 0.0] | units.AU sun.velocity = [0.0, 0.0, 0.0] | units.AU / units.yr sun.radius = 1.0 | units.RSun earth = particles[1] earth.mass = 5.9736e24 | units.kg earth.radius = 6371.0 | units.km earth.position = [0.0, 1.0, 0.0] | units.AU earth.velocity = [2.0 * numpy.pi, -0.0001, 0.0] | units.AU / units.yr initial_direction = math.atan((earth.velocity[0] / earth.velocity[1])) final_direction = [] for log_eps2 in range(-9, 10, 2): instance = Hermite(convert_nbody) instance.parameters.end_time_accuracy_factor = 0.0 instance.parameters.epsilon_squared = 10.0**log_eps2 | units.AU**2 instance.particles.add_particles(particles) instance.commit_particles() instance.evolve_model(0.25 | units.yr) final_direction.append( math.atan((instance.particles[1].velocity[0] / instance.particles[1].velocity[1]))) instance.stop() # Small values of epsilon_squared should result in normal earth-sun dynamics: rotation of 90 degrees self.assertAlmostEqual(abs(final_direction[0]), abs(initial_direction + math.pi / 2.0), 2) # Large values of epsilon_squared should result in ~ no interaction self.assertAlmostEqual(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.assertEqual(delta[len(final_direction) // 2 - 1], max(delta))
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()