Beispiel #1
0
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
Beispiel #2
0
    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()
Beispiel #3
0
    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()
Beispiel #4
0
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
Beispiel #5
0
    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()
Beispiel #6
0
    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)
Beispiel #7
0
    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()
Beispiel #8
0
 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()
Beispiel #9
0
    def test12(self):
        particles = datamodel.Particles(2)
        particles.x = [0.0, 1.00] | nbody_system.length
        particles.y = [0.0, 0.0] | nbody_system.length
        particles.z = [0.0, 0.0] | nbody_system.length
        particles.radius = 0.005 | nbody_system.length
        particles.vx = [5.1, 0.0] | nbody_system.speed
        particles.vy = [0.0, 0.0] | nbody_system.speed
        particles.vz = [0.0, 0.0] | nbody_system.speed
        particles.mass = [0.1, 0.1] | nbody_system.mass

        instance = Hermite()
        instance.initialize_code()
        instance.parameters.stopping_conditions_out_of_box_size = .5 | nbody_system.length
        self.assertEquals(
            instance.parameters.stopping_conditions_out_of_box_size,
            .5 | nbody_system.length)
        instance.particles.add_particles(particles)
        instance.stopping_conditions.out_of_box_detection.enable()
        instance.evolve_model(0.1 | nbody_system.time)
        self.assertTrue(
            instance.stopping_conditions.out_of_box_detection.is_set())
        self.assertAlmostEqual(
            instance.stopping_conditions.out_of_box_detection.particles(0).x,
            1.0 | nbody_system.length, 3)
        instance.stop()
Beispiel #10
0
    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()
Beispiel #11
0
 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()
Beispiel #12
0
    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)
Beispiel #13
0
 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)
Beispiel #14
0
 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))
Beispiel #15
0
    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
Beispiel #17
0
    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)
Beispiel #18
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)
Beispiel #19
0
 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)
Beispiel #20
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.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)
Beispiel #21
0
 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()
Beispiel #22
0
    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)
Beispiel #23
0
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
Beispiel #24
0
 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()
Beispiel #25
0
    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()
Beispiel #26
0
    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)
Beispiel #27
0


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)
Beispiel #28
0
 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()
Beispiel #29
0
 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()
Beispiel #30
0
    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()
Beispiel #31
0
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
Beispiel #32
0
    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
Beispiel #34
0
    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)
Beispiel #35
0
 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()
Beispiel #36
0
    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)
Beispiel #37
0
    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))
Beispiel #38
0
    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()
Beispiel #39
0
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
Beispiel #40
0
 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 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
Beispiel #42
0
    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)
Beispiel #43
0
    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))
Beispiel #44
0
    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()
Beispiel #45
0
 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()
Beispiel #46
0
    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()
Beispiel #47
0
 def test12(self):
     particles = datamodel.Particles(2)
     particles.x = [0.0,1.00] | nbody_system.length
     particles.y = [0.0,0.0] | nbody_system.length
     particles.z = [0.0,0.0] | nbody_system.length
     particles.radius = 0.005 | nbody_system.length
     particles.vx =  [5.1,0.0] | nbody_system.speed
     particles.vy =  [0.0,0.0] | nbody_system.speed
     particles.vz =  [0.0,0.0]| nbody_system.speed
     particles.mass = [0.1,0.1] | nbody_system.mass
    
     instance = Hermite()
     instance.initialize_code()
     instance.parameters.stopping_conditions_out_of_box_size = .5 | nbody_system.length
     self.assertEquals(instance.parameters.stopping_conditions_out_of_box_size, .5 | nbody_system.length)
     instance.particles.add_particles(particles) 
     instance.stopping_conditions.out_of_box_detection.enable()
     instance.evolve_model(0.1 | nbody_system.time)
     self.assertTrue(instance.stopping_conditions.out_of_box_detection.is_set())
     self.assertAlmostEqual(instance.stopping_conditions.out_of_box_detection.particles(0).x, 1.0 |nbody_system.length, 3)
     instance.stop()
Beispiel #48
0
 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()
Beispiel #49
0
    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()
Beispiel #51
0
    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()
Beispiel #52
0
    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()
Beispiel #53
0
    )

    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))
Beispiel #54
0
 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)
Beispiel #55
0
 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()
Beispiel #56
0
    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()
Beispiel #57
0
    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()
Beispiel #58
0
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)
Beispiel #59
0
 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