コード例 #1
0
ファイル: test_krome.py プロジェクト: vdhelm/amuse
 def makeparts(self,N):
     parts=Particles(N)
     numpy.random.seed(1234567)
     parts.number_density=(numpy.random.random(N)*1.e5+1.e5)| units.cm**-3
     parts.temperature=(numpy.random.random(N)*500+100)| units.K
     parts.ionrate=(numpy.random.random(N)*1.e-11+1.e-17)| units.s**-1
     return parts
コード例 #2
0
ファイル: test_sse.py プロジェクト: vdhelm/amuse
 def test5(self):
     sse = SSE()
     sse.commit_parameters() 
     stars = Particles(1)
     
     star = stars[0]
     star.mass = 35 | units.MSun
     star.radius = 0.0 | units.RSun
     
     stars.synchronize_to(sse.particles)
     
     channel = sse.particles.new_channel_to(stars)
     channel.copy_attributes(sse.particles.get_attribute_names_defined_in_store())   
     
     previous_type = star.stellar_type
     results = []
     
     dt = 1 | units.Myr
     t = 0 | units.Myr
     while t < 30 | units.Myr:
         t += dt
         sse.evolve_model(t)
             
     self.assertTrue(sse.particles[0].mass.value_in(units.MSun) < 10.6)
      
     sse.stop()
コード例 #3
0
ファイル: test_krome.py プロジェクト: vdhelm/amuse
    def test4(self):
        print "test4: evolve test (10 part)"

        instance=self.new_instance_of_an_optional_code(Krome,**default_options)

        parts=Particles(10)
        parts.number_density=1.e5 | units.cm**-3
        parts.temperature=50 | units.K
        parts.ionrate=2.e-17 | units.s**-1

        Ns=len(instance.species)

        parts.abundances=numpy.zeros((1,Ns))        

        instance.particles.add_particles(parts)
  
        instance.evolve_model( 1. | units.Myr )

        f=2*instance.particles[0].abundances[instance.species["H2"]]
        self.assertTrue(f> 0.95) # not much of a test..
        #~ for x,i in instance.species.items():
          #~ print x, instance.particles[0].abundances[i]
        
        instance.cleanup_code()
        instance.stop()
コード例 #4
0
ファイル: isotropic_cloud.py プロジェクト: Ingwar/amuse
 def result(self):
   masses, position_vectors, velocity_vectors = self.new_model()
   result = Particles(self.targetN)
   result.mass = masses
   result.position = position_vectors
   result.velocity = velocity_vectors
   return result
コード例 #5
0
ファイル: test_sse.py プロジェクト: vdhelm/amuse
 def test11(self):
     print "Test evolve_model optional arguments: end_time and keep_synchronous"
     stars = Particles(3)
     stars.mass = [1.0, 2.0, 3.0] | units.MSun
     instance = SSE()
     instance.commit_parameters()
     instance.particles.add_particles(stars)
     
     self.assertEqual(instance.particles.age, [0.0, 0.0, 0.0] | units.yr)
     self.assertAlmostEqual(instance.particles.time_step, [550.1565, 58.2081, 18.8768] | units.Myr, 3)
     self.assertAlmostEqual(instance.particles.radius, [0.8882494502, 1.610210385, 1.979134445] | units.RSun)
     
     print "evolve_model without arguments: use shared timestep = min(particles.time_step)"
     instance.evolve_model()
     self.assertAlmostEqual(instance.particles.age, [18.8768, 18.8768, 18.8768] | units.Myr, 3)
     self.assertAlmostEqual(instance.particles.time_step, [550.1565, 58.2081, 18.8768] | units.Myr, 3)
     self.assertAlmostEqual(instance.model_time, 18.8768 | units.Myr, 3)
     
     print "evolve_model with end_time: take timesteps, until end_time is reached exactly"
     instance.evolve_model(100 | units.Myr)
     self.assertAlmostEqual(instance.particles.age, [100.0, 100.0, 100.0] | units.Myr, 3)
     self.assertAlmostEqual(instance.particles.time_step, [550.1565, 58.2081, 18.8768] | units.Myr, 3)
     self.assertAlmostEqual(instance.model_time, 100.0 | units.Myr, 3)
     
     print "evolve_model with keep_synchronous: use non-shared timestep, particle ages will typically diverge"
     instance.evolve_model(keep_synchronous = False)
     self.assertAlmostEqual(instance.particles.age, (100 | units.Myr) + ([550.1565, 58.2081, 18.8768] | units.Myr), 3)
     self.assertAlmostEqual(instance.particles.time_step, [550.1565, 58.2081, 18.8768] | units.Myr, 3)
     self.assertAlmostEqual(instance.model_time, 100.0 | units.Myr, 3) # Unchanged!
     instance.stop()
コード例 #6
0
ファイル: test_trees.py プロジェクト: Ingwar/amuse
    def test7(self):
        
        particles = Particles(10)
        particles.mass = list(range(10)) | units.kg
        particles[0].child1 = particles[1]
        particles[0].child2 = particles[2]
        particles[1].child1 = particles[3]
        particles[1].child2 = particles[4]
    
        x = trees.BinaryTreesOnAParticleSet(particles, "child1", "child2")
        roots = list(x.iter_roots())
    
        self.assertEquals(len(roots), 1)
        binary = roots[0]
        output = ''
        for level, particle in binary.iter_levels():
            output += '..' * level
            output += str(particle.mass.value_in(units.kg))
            output += '\n'
        
        print output
        self.assertEquals(output, """0.0
..1.0
....3.0
....4.0
..2.0
""")
コード例 #7
0
ファイル: test_pikachu.py プロジェクト: Ingwar/amuse
 def new_sun_earth_system(self):
     particles = Particles(2)
     particles.mass = [1.0, 3.0037e-6] | units.MSun
     particles.position = [[0.0, 0.0, 0.0], [1.0, 0.0, 0.0]] | units.AU
     particles.velocity = [[0.0, 0.0, 0.0], [0.0, 0.0, 0.0]] | units.km / units.s
     particles[1].vy = (constants.G * particles.total_mass() / (1.0 | units.AU)).sqrt()
     return particles
コード例 #8
0
ファイル: test_sse.py プロジェクト: vdhelm/amuse
    def test13(self):
        print "Testing SSE states"
        stars = Particles(1)
        stars.mass = 1.0 | units.MSun
        
        print "First do everything manually:",
        instance = SSE()
        self.assertEquals(instance.get_name_of_current_state(), 'UNINITIALIZED')
        instance.initialize_code()
        self.assertEquals(instance.get_name_of_current_state(), 'INITIALIZED')
        instance.commit_parameters()
        self.assertEquals(instance.get_name_of_current_state(), 'RUN')
        instance.cleanup_code()
        self.assertEquals(instance.get_name_of_current_state(), 'END')
        instance.stop()
        print "ok"

        print "initialize_code(), commit_parameters(), " \
            "and cleanup_code() should be called automatically:",
        instance = SSE()
        self.assertEquals(instance.get_name_of_current_state(), 'UNINITIALIZED')
        instance.parameters.reimers_mass_loss_coefficient = 0.5
        self.assertEquals(instance.get_name_of_current_state(), 'INITIALIZED')
        instance.particles.add_particles(stars)
        self.assertEquals(instance.get_name_of_current_state(), 'RUN')
        instance.stop()
        self.assertEquals(instance.get_name_of_current_state(), 'STOPPED')
        print "ok"
コード例 #9
0
ファイル: test_supernova.py プロジェクト: amusecode/amuse
def setup_stellar_evolution_model():
    out_pickle_file = os.path.join(
        get_path_to_results(), "super_giant_stellar_structure.pkl")
    if os.path.exists(out_pickle_file):
        return out_pickle_file

    stellar_evolution = MESA(redirection="none")
    stars = Particles(1)
    stars.mass = 10.0 | units.MSun
    stellar_evolution.initialize_module_with_default_parameters()
    stellar_evolution.particles.add_particles(stars)
    stellar_evolution.commit_particles()

    print(
            "Evolving a MESA star with mass:",
            stellar_evolution.particles[0].mass
            )
    try:
        while True:
            stellar_evolution.evolve_model()
    except AmuseException as ex:
        print "Evolved star to", stellar_evolution.particles[0].age
        print "Radius:", stellar_evolution.particles[0].radius

    pickle_stellar_model(stellar_evolution.particles[0], out_pickle_file)
    stellar_evolution.stop()
    return out_pickle_file
コード例 #10
0
 def test6(self):
     particles = Particles(2)
     particles.add_attribute_domain('a')
     particles.add_attribute_domain('b')
     def set_a():
         particles[0].a = 1 | units.kg
     self.assertRaises(AttributeError, set_a)
コード例 #11
0
ファイル: explode_evolved_star.py プロジェクト: rieder/amuse
def setup_stellar_evolution_model():
    out_pickle_file = os.path.join(get_path_to_results(), "super_giant_stellar_structure.pkl")
    if os.path.exists(out_pickle_file):
        return out_pickle_file

    stellar_evolution = MESA(redirection="none")
    stars = Particles(1)
    stars.mass = 10.0 | units.MSun
    stellar_evolution.particles.add_particles(stars)

    """
    print "Evolving a MESA star with mass:", stellar_evolution.particles[0].mass
    try:
        while True:
            stellar_evolution.evolve_model()
    except AmuseException as ex:
        print "Evolved star to t=", stellar_evolution.particles[0].age,
        print "Mass:", stellar_evolution.particles[0].mass
        print "Radius:", stellar_evolution.particles[0].radius
        print "core-mass:", stellar_evolution.particles[0].core_mass
    """
    while stellar_evolution.particles[0].stellar_type <= 12 | units.stellar_type:
        stellar_evolution.evolve_model()

    pickle_stellar_model(stellar_evolution.particles[0], out_pickle_file)
    stellar_evolution.stop()
    return out_pickle_file
コード例 #12
0
ファイル: lagrange_points.py プロジェクト: jilkoval/amuse
def new_sun_earth_system():
    particles = Particles(2)
    particles.mass = [1, 0.2] | units.MSun
    particles.position = [[0, 0, 0], [1.0, 0, 0]] | units.AU
    particles.velocity = [0, 0, 0] | units.km / units.s
    particles[1].vy = (constants.G * particles.total_mass() / particles[1].x).sqrt()
    return particles
コード例 #13
0
ファイル: test_evtwin.py プロジェクト: stevemcmillan/amuse
    def slowtest11(self):
        print "Test for importing new stellar models, also check long-term evolution"
        instance = EVtwin()
        instance.parameters.verbosity = True
        instance.particles.add_particles(Particles(mass = [0.8] | units.MSun))
        instance.evolve_model()

        copy = Particles(1)
        copy.internal_structure = instance.particles[0].get_internal_structure()
        instance.particles.add_particles(copy)

        number_of_zones = instance.particles[0].get_number_of_zones()
        self.assertEqual(len(instance.particles), 2)
        self.assertEqual(instance.particles[1].get_number_of_zones(), number_of_zones)
        self.assertIsOfOrder(instance.particles[1].get_radius_profile()[-1],          1.0 | units.RSun)
        self.assertIsOfOrder(instance.particles[1].get_temperature_profile()[0],  1.0e7 | units.K)
        self.assertIsOfOrder(instance.particles[1].get_pressure_profile()[0],      1.0e17 | units.barye)

        t1, l1 = simulate_evolution_tracks(instance.particles[0], end_time=26.5|units.Gyr)
        t2, l2 = simulate_evolution_tracks(instance.particles[1], end_time=26.5|units.Gyr)
        instance.stop()

        i1 = t1.argmax() # Maximum temperature ~ turnoff main sequence
        i2 = t2.argmax()
        self.assertAlmostRelativeEqual(t1[i1], t2[i2], 2)
        self.assertAlmostRelativeEqual(l1[i1], l2[i2], 2)
コード例 #14
0
ファイル: test_evtwin.py プロジェクト: stevemcmillan/amuse
    def xtest9(self):
        print "Test for changing the stellar structure model (not yet implemented)"
        star = Particles(1)
        star.mass = 1.0 | units.MSun
        instance = EVtwin()
        instance.initialize_code()
        instance.commit_parameters()
        instance.particles.add_particles(star)
        instance.commit_particles()
        instance.evolve_model()

        density_profile = instance.particles[0].get_density_profile()

        self.assertRaises(AmuseException, instance.particles[0].set_density_profile, density_profile[2:],
            expected_message = "The length of the supplied vector (197) does not match the number of "
            "mesh zones of the star (199).")

        mass_factor = 1.1
        instance.particles[0].set_density_profile(mass_factor*density_profile)
        self.assertAlmostRelativeEqual(instance.particles[0].get_density_profile(), density_profile*mass_factor, places=10)
        instance.particles.mass *= mass_factor
        instance.evolve_model()

        outer_radius = instance.particles[0].get_radius_profile()
        inner_radius = outer_radius[:-1]
        inner_radius.prepend(0|units.m)
        delta_radius_cubed = (outer_radius**3 - inner_radius**3)
        integrated_mass = (4./3.*pi*delta_radius_cubed*instance.particles[0].get_density_profile()).sum()
        self.assertAlmostRelativeEqual(integrated_mass, star.mass*mass_factor, places = 3)
        instance.stop()
        del instance
コード例 #15
0
ファイル: test_evtwin.py プロジェクト: stevemcmillan/amuse
    def xtest13(self):
        print "Test evolve_model optional arguments: end_time and keep_synchronous"
        stars = Particles(3)
        stars.mass = [1.0, 2.0, 3.0] | units.MSun
        instance = EVtwin()
        instance.particles.add_particles(stars)

        self.assertAlmostEqual(instance.particles.age, [0.0, 0.0, 0.0] | units.yr)
        self.assertAlmostEqual(instance.particles.time_step, [70465.105509, 6063.68785133, 1876.53255132] | units.yr, 3)

        print "evolve_model without arguments: use shared timestep = 0.99*min(particles.time_step)"
        instance.evolve_model()
        self.assertAlmostEqual(instance.particles.age, 0.99*([1876.53255132,1876.53255132,1876.53255132] | units.yr), 3)
        self.assertAlmostEqual(instance.particles.time_step, [70465.105509,6063.68785133,1876.53255132] | units.yr, 3)
        self.assertAlmostEqual(instance.model_time, 0.99*1876.53255132 | units.yr, 3)

        print "evolve_model with end_time: take timesteps, until end_time is reached exactly"
        instance.evolve_model(15000 | units.yr)
        self.assertAlmostEqual(instance.particles.age, [15000.0, 15000.0, 15000.0] | units.yr, 3)
        self.assertAlmostEqual(instance.particles.time_step, [ 84558.1266108,7276.4254216,2251.83906159] | units.yr, 3)
        self.assertAlmostEqual(instance.model_time, 15000.0 | units.yr, 3)

        print "evolve_model with keep_synchronous: use non-shared timestep, particle ages will typically diverge"
        instance.evolve_model(keep_synchronous = False)
        self.assertAlmostEqual(instance.particles.age, (15000 | units.yr) + ([ 84558.1266108,7276.4254216,2251.83906159] | units.yr), 3)
        self.assertAlmostRelativeEquals(instance.particles.time_step, [101469.751933,8731.71050591,2702.2068739] | units.yr, 1)
        self.assertAlmostEqual(instance.model_time, 15000.0 | units.yr, 3) # Unchanged!
        instance.stop()
コード例 #16
0
ファイル: test_trees.py プロジェクト: Ingwar/amuse
 def test5(self):
     particles = Particles(10)
     particles.mass = list(range(10)) | units.kg
     particles[0].child1 = particles[1]
     particles[0].child2 = particles[2]
     particles[1].child1 = particles[3]
     particles[1].child2 = particles[4]
 
     x = trees.BinaryTreesOnAParticleSet(particles, "child1", "child2")
     roots = list(x.iter_roots())
 
     self.assertEquals(len(roots), 1)
     y = [(event, x.mass.value_in(units.kg)) for event, x in roots[0].iter_events()]
     self.assertEquals(y, 
         [
             ('start', 0.0), 
                 ('start', 1.0), 
                     ('start', 3.0), 
                     ('end', 3.0),
                     ('start', 4.0),
                     ('end', 4.0),
                 ('end', 1.0), 
                 ('start', 2.0), 
                 ('end', 2.0), 
             ('end', 0.0)
         ]
     )
コード例 #17
0
ファイル: test_trees.py プロジェクト: Ingwar/amuse
    def test5(self):
        
        particles = Particles(10)
        particles.mass = list(range(10)) | units.kg
        particles[0].child1 = particles[1]
        particles[0].child2 = particles[2]
        particles[1].child1 = particles[3]
        particles[1].child2 = particles[4]
    
        x = particles.as_binary_tree()
        roots = list(x.iter_branches())
    
        self.assertEquals(len(roots), 1)
        binary = roots[0]
        output = ''
        for level, node in binary.iter_levels():
            output += '..' * level
            output += str(node.particle.mass.value_in(units.kg))
            output += '\n'
        
        print output
        self.assertEquals(output, """0.0
..1.0
....3.0
....4.0
..2.0
""")
コード例 #18
0
ファイル: test_bridge.py プロジェクト: vdhelm/amuse
    def test1(self):
        particles = 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 = bridge.CalculateFieldForParticles(particles=particles, gravity_constant=nbody_system.G)

        zero = 0.0 | nbody_system.length
        print instance.get_gravity_at_point([zero], [1.0] | nbody_system.length, [zero], [zero])
        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.0 | nbody_system.acceleration, 6)
            self.assertAlmostEqual(fz0[0], 0.0 | nbody_system.acceleration, 6)
            self.assertAlmostEqual(fy1[0], 0.0 | nbody_system.acceleration, 6)
            self.assertAlmostEqual(fz1[0], 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[0], 5)
            self.assertAlmostEqual(potential0, potential1, 6)
コード例 #19
0
ファイル: test_fastkick.py プロジェクト: Ingwar/amuse
    def test7(self):
        instance = self.new_fastkick_instance()
        instance.parameters.epsilon_squared = 0.00001 | nbody_system.length**2
        
        particles = Particles(2)
        particles.mass = [1.0, 1.0] | nbody_system.mass
        particles.position = [[0.0,0.0,0.0], [2.0,0.0,0.0]] | nbody_system.length
        instance.particles.add_particles(particles)
        
        zero = 0.0 | nbody_system.length
        ax, ay, az = instance.get_gravity_at_point(zero, 1.0 | nbody_system.length, zero, zero)
        self.assertAlmostEqual(ax, 0.0 | nbody_system.acceleration, 6)
        self.assertAlmostEqual(ay, 0.0 | nbody_system.acceleration, 6)
        self.assertAlmostEqual(az, 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)
            ax0, ay0, az0 = instance.get_gravity_at_point(zero, x0, zero, zero)
            ax1, ay1, az1 = instance.get_gravity_at_point(zero, x1, zero, zero)
            
            self.assertAlmostEqual(ay0, 0.0 | nbody_system.acceleration, 6)
            self.assertAlmostEqual(az0, 0.0 | nbody_system.acceleration, 6)
            self.assertAlmostEqual(ay1, 0.0 | nbody_system.acceleration, 6)
            self.assertAlmostEqual(az1, 0.0 | nbody_system.acceleration, 6)
            
            self.assertAlmostEqual(ax0, -ax1, 5)
            ax = (-1.0 / (x0**2) + 1.0 / (x1**2)) * (1.0 | nbody_system.length**3 / nbody_system.time**2)
            self.assertAlmostEqual(ax, ax0, 2)
            self.assertAlmostEqual(potential0, potential1, 5)
        instance.stop()
コード例 #20
0
ファイル: test_binaryio.py プロジェクト: Ingwar/amuse
 def test10(self):
     p = Particles(2)
     p[0].position = [1.0, 2.0, 3.0] | nbody_system.length
     p[1].position = [4.0, 5.0, 6.0] | nbody_system.length
     p[0].velocity = [7.0, 8.0, 10.0] | nbody_system.length / nbody_system.time
     p[1].velocity = [11.0, 12.0, 13.0] | nbody_system.length / nbody_system.time
     p.u = [3,4] | nbody_system.potential
     p.rho = [5,6] | nbody_system.density
     p.mass = [5,6] | nbody_system.mass
     x = gadget.GadgetFileFormatProcessor(set = p)
     file = BytesIO()
     x.store_body(file)
     input = BytesIO(file.getvalue())
     positions = x.read_fortran_block_float_vectors(input)
     self.assertEquals(positions[0] , [1.0, 2.0, 3.0])
     self.assertEquals(positions[1] , [4.0, 5.0, 6.0])
     velocities = x.read_fortran_block_float_vectors(input)
     self.assertEquals(velocities[0] , [7.0, 8.0, 10.0])
     self.assertEquals(velocities[1] , [11.0, 12.0, 13.0])
     ids = x.read_fortran_block_ulongs(input)
     self.assertEquals(ids[0], p[0].key)
     self.assertEquals(ids[1], p[1].key)
     masses = x.read_fortran_block_floats(input)
     self.assertEquals(masses[0], 5)
     self.assertEquals(masses[1], 6)
     u = x.read_fortran_block_floats(input)
     self.assertEquals(u[0], 3)
     self.assertEquals(u[1], 4)
コード例 #21
0
ファイル: test_fastkick.py プロジェクト: Ingwar/amuse
 def test11(self):
     print "Test that a source is not included when calculating gravity on itself."
     number_of_sources = 100
     mass, length, G = nbody_system.mass, nbody_system.length, nbody_system.G
     sources = Particles(mass=numpy.ones(number_of_sources)|mass, x=0|length, y=0|length, z=0|length)
     point = Particle(x=0|length, y=0|length, z=1.0|length)
     
     instance = self.new_fastkick_instance()
     instance.particles.add_particles(sources)
     potential = instance.get_potential_at_point(0|length, point.x, point.y, point.z)
     ax, ay, az = instance.get_gravity_at_point(0|length, point.x, point.y, point.z)
     self.assertAlmostEqual(ax, G * (0 | mass/length**2), 5)
     self.assertAlmostEqual(ay, G * (0 | mass/length**2), 5)
     self.assertAlmostRelativeEqual(az, -G*sources.total_mass()/point.z**2, 3)
     self.assertAlmostRelativeEqual(potential, -G*sources.total_mass()/point.z, 3)
     
     point.mass = 1e6 | mass
     instance.particles.add_particle(point)
     potential = instance.get_potential_at_point(0|length, point.x, point.y, point.z)
     ax, ay, az = instance.get_gravity_at_point(0|length, point.x, point.y, point.z)
     self.assertAlmostEqual(ax, G * (0 | mass/length**2), 5)
     self.assertAlmostEqual(ay, G * (0 | mass/length**2), 5)
     self.assertAlmostRelativeEqual(az, -G*sources.total_mass()/point.z**2, 3)
     self.assertAlmostRelativeEqual(potential, -G*sources.total_mass()/point.z, 3)
     instance.stop()
コード例 #22
0
ファイル: test_store.py プロジェクト: Ingwar/amuse
    def test58(self):
        test_results_path = self.get_path_to_results()
        output_file = os.path.join(test_results_path, "test58"+self.store_version()+".h5")
        if os.path.exists(output_file):
            os.remove(output_file)

        x = Particles(keys = (1,2))
        x.mass = [1,2] | units.kg
        y = Particles(keys = (11,12,13,14))
        y.mass = [40,50,60,70] | units.kg
        
        x.sub = None
        x[0].sub = y[0:2]
        y[0].sub = y[2:]
        
        io.write_set_to_file(x, output_file,"amuse", version=self.store_version())
        z = io.read_set_from_file(output_file,"amuse")
        
        self.assertEqual(len(x), len(z))
        self.assertEqual(len(x[0].sub), len(z[0].sub))
        self.assertEqual(x[0].sub[0].sub.key, (13,14))
        self.assertEqual(z[0].sub[0].sub.key, (13,14))
        self.assertEqual(id(x[0].sub._original_set()), id(x[0].sub[0].sub._original_set()))
        # no more subsets, could this be fixed, would be very nice to do so
        # self.assertEqual(id(z[0].sub._original_set()), id(z[0].sub[0].sub._original_set()))
        self.assertTrue(z[1].sub==x[1].sub==None)

        os.remove(output_file)
コード例 #23
0
ファイル: test_evtwin.py プロジェクト: stevemcmillan/amuse
    def slowtest8(self):
        print "Test for obtaining the stellar composition structure - evolved star"
        stars = Particles(1)
        stars.mass = 1.0 | units.MSun
        instance = EVtwin()
        instance.initialize_code()
        instance.commit_parameters()
        instance.particles.add_particles(stars)
        instance.commit_particles()
        instance.evolve_model(11.7 | units.Gyr)
        self.assertTrue(instance.particles[0].age >= 11.7 | units.Gyr)
        print instance.particles[0].stellar_type
#~        self.assertTrue(str(instance.particles[0].stellar_type) == "First Giant Branch")
        number_of_zones   = instance.particles.get_number_of_zones()[0]
        number_of_species = instance.particles.get_number_of_species()[0]
        composition       = instance.particles[0].get_chemical_abundance_profiles()
        species_names     = instance.particles[0].get_names_of_species()
        self.assertEquals(number_of_zones,    199)
        self.assertEquals(number_of_species,    9)
        self.assertEquals(len(species_names),  number_of_species)
        self.assertEquals(len(composition),    number_of_species)
        self.assertEquals(len(composition[0]), number_of_zones)
        self.assertEquals(species_names, ['h1', 'he4', 'c12', 'n14', 'o16', 'ne20', 'mg24', 'si28', 'fe56'])
        self.assertAlmostRelativeEquals(composition[0, -1],        0.7 | units.none, 1)
        self.assertAlmostRelativeEquals(composition[1, -1],        0.3 - instance.parameters.metallicity, 1)
        self.assertAlmostRelativeEquals(composition[2:,-1].sum(),  instance.parameters.metallicity, 1)
        self.assertAlmostEquals(composition.sum(axis=0), [1.0]*number_of_zones | units.none)
        self.assertAlmostEquals(composition[0, 0],        0.00 | units.none)
        self.assertAlmostEquals(composition[1, 0],        1.00 - instance.parameters.metallicity, 3)
        self.assertAlmostEquals(composition[2:,0].sum(),  instance.parameters.metallicity, 3)
        instance.stop()
コード例 #24
0
ファイル: test_sink.py プロジェクト: Ingwar/amuse
    def test3(self):
        print "Testing SinkParticles initialization from existing particles in set"
        particles = Particles(10)
        self.assertRaises(AttributeError, SinkParticles, particles[[4, 7]], expected_message=
            "You tried to access attribute 'radius' but this attribute is not defined for this set.")
        particles.radius = 42.0 | units.RSun
        particles.mass = range(1,11) | units.MSun
        particles.position = [[i, 2*i, 3*i] for i in range(10)] | units.parsec

        sinks = SinkParticles(particles[[4]])
        self.assertEqual(sinks.mass, 5.0 | units.MSun)
        self.assertEqual(sinks.sink_radius, 42.0 | units.RSun)
        self.assertEqual(sinks.radius, 42.0 | units.RSun)
        self.assertEqual(sinks.position, [4.0, 8.0, 12.0] | units.parsec)

        sinks = SinkParticles(particles[[4, 7]], sink_radius=[1,2]|units.AU)
        self.assertEqual(sinks.sink_radius, [1.0, 2.0] | units.AU)
        self.assertEqual(sinks.radius, 42.0 | units.RSun)
        self.assertEqual(sinks.mass, [5.0, 8.0] | units.MSun)
        self.assertEqual(sinks.position, [[4, 8, 12], [7, 14, 21]] | units.parsec)

        self.assertEqual(set(['key', 'mass', 'radius', 'x', 'y', 'z', 'sink_radius', 'vx','vy','vz','lx','ly','lz']),
            set(str(sinks).split("\n")[0].split()))
        self.assertEqual(set(['key', 'mass', 'radius', 'x', 'y', 'z']),
            set(str(particles).split("\n")[0].split()))
コード例 #25
0
ファイル: test_evtwin.py プロジェクト: stevemcmillan/amuse
 def test6(self):
     print "Test for obtaining the stellar structure model"
     stars = Particles(2)
     stars.mass = [1.0, 10.0] | units.MSun
     instance = EVtwin()
     instance.initialize_code()
     instance.commit_parameters()
     instance.particles.add_particles(stars)
     instance.commit_particles()
     self.assertEquals(instance.particles.get_number_of_zones(), [199, 199])
     self.assertEquals(len(instance.particles[0].get_radius_profile()), 199)
     self.assertRaises(AmuseException, instance.particles.get_radius_profile,
         expected_message = "Querying radius profiles of more than one particle at a time is not supported.")
     self.assertEquals(len(instance.particles[1].get_density_profile()), 199)
     self.assertIsOfOrder(instance.particles[0].get_radius_profile()[-1],          1.0 | units.RSun)
     self.assertIsOfOrder(instance.particles[0].get_temperature_profile()[0],  1.0e7 | units.K)
     self.assertIsOfOrder(instance.particles[0].get_temperature_profile()[-1],  5.0e3 | units.K)
     radius1 = instance.particles[0].get_radius_profile()
     radius2 = radius1[:-1]
     radius2.prepend(0|units.m)
     delta_radius_cubed = (radius1**3 - radius2**3)
     total_mass = (4./3. * pi * instance.particles[0].get_density_profile() * delta_radius_cubed).sum()
     self.assertAlmostRelativeEqual(total_mass, stars[0].mass, places = 1)
     self.assertAlmostEquals(instance.particles[0].get_mu_profile()[:100], [0.62]*100 | units.amu, places=1)
     instance.stop()
コード例 #26
0
ファイル: test_store.py プロジェクト: Ingwar/amuse
    def test9(self):
        test_results_path = self.get_path_to_results()
        output_file = os.path.join(test_results_path, "test9"+self.store_version()+".hdf5")
        if os.path.exists(output_file):
            os.remove(output_file)

        number_of_particles = 10
        p = Particles(number_of_particles)
        p.mass = [x * 2.0 for x in range(number_of_particles)] | units.kg
        p.model_time = 2.0 | units.s

        io.write_set_to_file(
            p,
            output_file,
            "hdf5", 
            timestamp = 2 | units.Myr,
            scale = 1 | units.kg,
            version = self.store_version(),
            close_file = True
        )
        
        loaded_particles = io.read_set_from_file(
            output_file, 
            "hdf5",
            version = self.store_version()
        )
        loaded_particles = self.get_version_in_store(loaded_particles)
        
        
        a = loaded_particles.collection_attributes
        self.assertAlmostRelativeEquals(a.timestamp, 2 | units.Myr)
        self.assertAlmostRelativeEquals(a.scale, 1 | units.kg)
コード例 #27
0
ファイル: test_sse.py プロジェクト: vdhelm/amuse
    def test6(self):
        print "Test whether a set of stars evolves synchronously..."
#       Create an array of stars with a range in stellar mass
        masses = [.5, 1., 2., 5., 10., 30.] | units.MSun
        number_of_stars = len(masses)
        stars = Particles(number_of_stars)
        stars.mass = masses

#       Initialize stellar evolution code
        instance = SSE()
        instance.commit_parameters() 
        instance.particles.add_particles(stars)
        instance.commit_particles()
        
        from_code_to_model = instance.particles.new_channel_to(stars)
        from_code_to_model.copy()
        
        instance.evolve_model(end_time = 125 | units.Myr)
        from_code_to_model.copy()
                
        end_types = (
            "deeply or fully convective low mass MS star",
            "Main Sequence star",
            "Main Sequence star",
            "Carbon/Oxygen White Dwarf",
            "Neutron Star",
            "Black Hole",
        )
        for i in range(number_of_stars):
            self.assertAlmostEquals(stars[i].age, 125.0 | units.Myr)
            self.assertTrue(stars[i].mass <= masses[i])
            self.assertEquals(str(stars[i].stellar_type), end_types[i])
        instance.stop()
コード例 #28
0
ファイル: test_sse.py プロジェクト: vdhelm/amuse
 def test17(self):
     print "evolve_one_step and evolve_for after particle removal and addition"
     particles = Particles(10)
     particles.mass = range(1, 11) | units.MSun
     instance = SSE()
     instance.particles.add_particles(particles)
     self.assertAlmostEqual(instance.particles.age, 0.0 | units.yr)
     time_steps = numpy.linspace(0.1, 1.0, num=10) | units.Myr
     for i in range(10):
         instance.particles[i].evolve_for(time_steps[i])
     self.assertAlmostEqual(instance.particles.age, time_steps)
     
     instance.particles.remove_particles(particles[[1, 4, 8]])
     revived = instance.particles.add_particle(particles[4])
     revived.evolve_for(numpy.pi | units.Myr)
     for star in instance.particles:
         star.evolve_for(star.age)
     self.assertAlmostEqual(instance.particles.age[:-1], 2*time_steps[[0, 2,3, 5,6,7, 9]])
     self.assertAlmostEqual(instance.particles.age[-1], 2*numpy.pi | units.Myr)
     
     instance.particles.remove_particles(particles[[2, 5, 6]])
     instance.particles.add_particles(particles[[8, 1]])
     self.assertEqual(len(instance.particles), 7)
     expected_ages = instance.particles.age + instance.particles.time_step
     for star in instance.particles:
         star.evolve_one_step()
     self.assertAlmostEqual(instance.particles.age, expected_ages)
     instance.stop()
コード例 #29
0
ファイル: test_sse.py プロジェクト: vdhelm/amuse
 def test12(self):
     print "Testing adding and removing particles from stellar evolution code..."
     
     particles = Particles(3)
     particles.mass = 1.0 | units.MSun
     
     instance = SSE()
     instance.initialize_code()
     instance.commit_parameters()
     self.assertEquals(len(instance.particles), 0) # before creation
     instance.particles.add_particles(particles[:-1])
     instance.commit_particles()
     instance.evolve_model(1.0 | units.Myr)
     self.assertEquals(len(instance.particles), 2) # before remove
     self.assertAlmostEqual(instance.particles.age, 1.0 | units.Myr)
     
     instance.particles.remove_particle(particles[0])
     self.assertEquals(len(instance.particles), 1)
     instance.evolve_model(2.0 | units.Myr)
     self.assertAlmostEqual(instance.particles[0].age, 2.0 | units.Myr)
     
     instance.particles.add_particles(particles[::2])
     self.assertEquals(len(instance.particles), 3) # it's back...
     self.assertAlmostEqual(instance.particles[0].age, 2.0 | units.Myr)
     self.assertAlmostEqual(instance.particles[1].age, 0.0 | units.Myr)
     self.assertAlmostEqual(instance.particles[2].age, 0.0 | units.Myr) # ... and rejuvenated.
     
     instance.evolve_model(3.0 | units.Myr) # The young stars keep their age offset from the old star
     self.assertAlmostEqual(instance.particles.age, [3.0, 1.0, 1.0] | units.Myr)
     instance.evolve_model(4.0 | units.Myr)
     self.assertAlmostEqual(instance.particles.age, [4.0, 2.0, 2.0] | units.Myr)
     instance.stop()
コード例 #30
0
ファイル: test_evtwin.py プロジェクト: stevemcmillan/amuse
    def test5(self):
        print "Testing adding and removing particles from stellar evolution code..."

        particles = Particles(3)
        particles.mass = 0.3 | units.MSun

        instance = EVtwin()#redirection="none")
        instance.initialize_code()
        instance.parameters.verbosity = True
        instance.commit_parameters()
        stars = instance.particles
        self.assertEquals(len(stars), 0) # before creation
        stars.add_particles(particles[:-1])
        instance.commit_particles()
        instance.evolve_model(1.0 | units.Myr)
        self.assertEquals(len(stars), 2) # before remove
        self.assertAlmostEqual(stars.age, 1.0 | units.Myr)

        stars.remove_particle(particles[0])
        self.assertEquals(len(stars), 1)
        self.assertEquals(instance.get_number_of_particles(), 1)
        instance.evolve_model(2.0 | units.Myr)
        self.assertAlmostEqual(stars[0].age, 2.0 | units.Myr)

        stars.add_particles(particles[::2])
        self.assertEquals(len(stars), 3) # it's back...
        self.assertAlmostEqual(stars[0].age, 2.0 | units.Myr)
        self.assertAlmostEqual(stars[1].age, 0.0 | units.Myr)
        self.assertAlmostEqual(stars[2].age, 0.0 | units.Myr) # ... and rejuvenated.

        instance.evolve_model(3.0 | units.Myr) # The young stars keep their age offset from the old star
        self.assertAlmostEqual(stars.age, [3.0, 1.0, 1.0] | units.Myr)
        instance.evolve_model(4.0 | units.Myr)
        self.assertAlmostEqual(stars.age, [4.0, 2.0, 2.0] | units.Myr)
        instance.stop()
コード例 #31
0
    def test_supernova_stopping_condition_with_multiple_stars_of_equal_mass(
            self):
        """ Test supernova stopping condition with multiple stars of equal mass """
        instance = self.new_instance_of_an_optional_code(SeBa)
        instance.stopping_conditions.supernova_detection.enable()

        stars = Particles(3)
        stars[0].mass = 10.0 | units.MSun
        stars[1].mass = 10.0 | units.MSun
        stars[2].mass = 0.5 | units.MSun
        instance.particles.add_particles(stars)

        instance.evolve_model(30 | units.Myr)
        self.assertEqual(
            instance.stopping_conditions.supernova_detection.is_set(), True)
        self.assertEqual(
            len(instance.stopping_conditions.supernova_detection.particles(0)),
            2)
        self.assertEqual(
            instance.stopping_conditions.supernova_detection.particles(0)
            [0].key, instance.particles[0].key)
        self.assertEqual(
            instance.stopping_conditions.supernova_detection.particles(0)
            [1].key, instance.particles[1].key)

        self.assertAlmostRelativeEqual(instance.particles[0].age,
                                       27.35866 | units.Myr, 4)
        self.assertAlmostRelativeEqual(instance.particles[1].age,
                                       27.35866 | units.Myr, 4)
        self.assertAlmostRelativeEqual(instance.particles[2].age,
                                       27.35866 | units.Myr, 4)
        self.assertAlmostRelativeEqual(instance.particles[0].mass,
                                       1.2476 | units.MSun, 4)
        self.assertAlmostRelativeEqual(instance.particles[1].mass,
                                       1.2476 | units.MSun, 4)
        self.assertAlmostRelativeEqual(instance.particles[2].mass,
                                       0.5 | units.MSun, 4)

        #        self.assertAlmostRelativeEqual(instance.particles[0].natal_kick_velocity, [0,0,0] | units.kms, 4)
        #        self.assertAlmostRelativeEqual(instance.particles[1].natal_kick_velocity, [0,0,0] | units.kms, 4)

        instance.evolve_model(30 | units.Myr)
        self.assertEqual(
            instance.stopping_conditions.supernova_detection.is_set(), False)

        self.assertAlmostRelativeEqual(instance.particles[0].age,
                                       30. | units.Myr, 4)
        self.assertAlmostRelativeEqual(instance.particles[1].age,
                                       30. | units.Myr, 4)
        self.assertAlmostRelativeEqual(instance.particles[2].age,
                                       30. | units.Myr, 4)
        self.assertAlmostRelativeEqual(instance.particles[0].mass,
                                       1.2476 | units.MSun, 4)
        self.assertAlmostRelativeEqual(instance.particles[1].mass,
                                       1.2476 | units.MSun, 4)
        self.assertAlmostRelativeEqual(instance.particles[2].mass,
                                       0.5 | units.MSun, 4)
コード例 #32
0
ファイル: evrard_test.py プロジェクト: seanlabean/amuse
 def result(self):
     masses, positions, velocities, internal_energies = self.new_model()
     result = Particles(self.actual_number_of_particles)
     result.mass = nbody_system.mass.new_quantity(masses)
     result.position = nbody_system.length.new_quantity(positions)
     result.velocity = nbody_system.speed.new_quantity(velocities)
     result.u = nbody_system.specific_energy.new_quantity(internal_energies)
     
     result.position -= result.center_of_mass()
     if self.do_scale:
         scale_factor = (result.potential_energy(G=nbody_system.G)) / (-0.5 | nbody_system.energy)
         result.position *= scale_factor
     
     if not self.convert_nbody is None:
         result = ParticlesWithUnitsConverted(result, self.convert_nbody.as_converter_from_si_to_generic())
         result = result.copy()
         
     return result
コード例 #33
0
    def test1(self):
        sse = SSE()
        sse.commit_parameters()
        stars = Particles(1)
        star = stars[0]
        star.mass = 5 | units.MSun
        star.radius = 0.0 | units.RSun

        sse.particles.add_particles(stars)
        from_sse_to_model = sse.particles.new_channel_to(stars)
        from_sse_to_model.copy()

        previous_type = star.stellar_type
        results = []
        t0 = 0 | units.Myr
        current_time = t0

        while current_time < (125 | units.Myr):
            sse.update_time_steps()

            current_time = current_time + sse.particles[0].time_step

            sse.evolve_model(current_time)

            from_sse_to_model.copy()

            if not star.stellar_type == previous_type:
                results.append((star.age, star.mass, star.stellar_type))
                previous_type = star.stellar_type

        self.assertEqual(len(results), 6)

        times = (104.0 | units.Myr, 104.4 | units.Myr, 104.7 | units.Myr,
                 120.1 | units.Myr, 120.9 | units.Myr, 121.5 | units.Myr)
        for result, expected in zip(results, times):
            self.assertAlmostEqual(result[0].value_in(units.Myr),
                                   expected.value_in(units.Myr), 1)

        masses = (5.000 | units.MSun, 5.000 | units.MSun, 4.998 | units.MSun,
                  4.932 | units.MSun, 4.895 | units.MSun, 0.997 | units.MSun)
        for result, expected in zip(results, masses):
            self.assertAlmostEqual(result[1].value_in(units.MSun),
                                   expected.value_in(units.MSun), 3)

        types = (
            "Hertzsprung Gap",
            "First Giant Branch",
            "Core Helium Burning",
            "First Asymptotic Giant Branch",
            "Second Asymptotic Giant Branch",
            "Carbon/Oxygen White Dwarf",
        )

        for result, expected in zip(results, types):
            self.assertEquals(str(result[2]), expected)

        sse.stop()
コード例 #34
0
class GravityCodeForTesting(object):
    def __init__(self):
        self.particles = Particles()
        self.model_time = quantities.zero

    def evolve_model(self, t_end):
        self.particles.position += self.particles.velocity * (t_end -
                                                              self.model_time)
        self.model_time = t_end

    @property
    def potential_energy(self):
        G = nbody_system.G if self.particles.x.unit == nbody_system.length else constants.G
        return self.particles.potential_energy(G=G)

    @property
    def kinetic_energy(self):
        return self.particles.kinetic_energy()
コード例 #35
0
def get_moons_for_planet(planet, delta_JD=0. | units.day):
    """
  The Earth's moon
  as for JD = 2457099.500000000 = A.D. 2015-Mar-18 00:00:00.0000 (CT)
  https://ssd.jpl.nasa.gov/?sat_elem
  """

    data = numpy.array([tuple(entry) for entry in _lunar_data],
                       dtype=[('planet_name', 'S10'), ('name', 'S10'),
                              ('mass', '<f8'), ('radius', '<f8'),
                              ('semimajor_axis', '<f8'),
                              ('eccentricity', '<f8'),
                              ('argument_of_peri', '<f8'),
                              ('mean_anomaly', '<f8'), ('inclination', '<f8'),
                              ('longitude_oan', '<f8')])
    moon_data = data[data['planet_name'] == planet.name]
    print "Planet=", planet.name, "moon=", moon_data["name"]
    moons = Particles()
    if len(moon_data["name"]):
        print len(moon_data["name"])
        for moon in moon_data:
            #print moon
            r, v = get_position(planet.mass,
                                moon["mass"] * 1.e+16 | units.kg,
                                moon["eccentricity"],
                                moon["semimajor_axis"] | units.km,
                                numpy.deg2rad(moon["mean_anomaly"]),
                                numpy.deg2rad(moon["inclination"]),
                                numpy.deg2rad(moon["longitude_oan"]),
                                numpy.deg2rad(moon["argument_of_peri"]),
                                delta_t=delta_JD)
            single_moon = Particle()
            single_moon.type = "moon"
            single_moon.name = moon["name"]
            single_moon.mass = moon["mass"] * 1.e+16 | units.kg
            single_moon.hostname = moon["planet_name"]
            single_moon.radius = moon["radius"] | units.km
            single_moon.position = r
            single_moon.position += planet.position
            single_moon.velocity = v
            single_moon.velocity += planet.velocity
            moons.add_particle(single_moon)

    return moons
コード例 #36
0
 def new_particles_with_internal_structure_from_models(self):
     def get_internal_structure(set, particle=None):
         return self.models[(set.key == particle.key).nonzero()[0]]
     
     result = Particles(len(self.models))
     result.add_function_attribute("get_internal_structure", None, get_internal_structure)
     result.mass = [model.dmass.sum().as_quantity_in(self.mass_unit) for model in self.models]
     result.radius = [model.radius[-1].as_quantity_in(self.radius_unit) for model in self.models]
     result.position = (self.original_center_of_mass + self.stars_after_encounter.position).as_quantity_in(self.position_unit)
     result.velocity = (self.original_center_of_mass_velocity + self.stars_after_encounter.velocity).as_quantity_in(self.velocity_unit)
     return result
コード例 #37
0
ファイル: merge_recipes.py プロジェクト: rieder/ekster
def merge_two_stars(primary, secondary):
    "Merge two colliding stars into one new one"
    colliders = Particles()
    colliders.add_particle(primary)
    colliders.add_particle(secondary)
    new_particle = Particle()
    new_particle.mass = colliders.mass.sum()
    new_particle.position = colliders.center_of_mass()
    new_particle.velocity = colliders.center_of_mass_velocity()

    return new_particle
コード例 #38
0
    def mechanical_feedback(self, time_step):
        L_mech_new = self.star_particles.mechanical_luminosity
        self.star_particles.E_mech += time_step * 0.5 * (
            self.star_particles.L_mech + L_mech_new)
        self.star_particles.L_mech = L_mech_new
        self.star_particles.dmass = self.star_particles.previous_mass - self.star_particles.mass
        self.star_particles.n_feedback_particles = numpy.array(
            self.star_particles.dmass /
            self.feedback_gas_particle_mass).astype(int)

        losers = self.star_particles.select_array(lambda x: x > 0,
                                                  ["n_feedback_particles"])
        if self.verbose:
            print "GravityHydroStellar: Number of particles providing mechanical feedback during this step:", len(
                losers)
        if len(losers) == 0:
            return
        channel = self.gravity.particles.new_channel_to(losers)
        channel.copy_attributes(["x", "y", "z", "vx", "vy", "vz"])
        number_of_new_particles = losers.n_feedback_particles.sum()
        new_sph_all = Particles(number_of_new_particles)
        new_sph_all.mass = self.feedback_gas_particle_mass
        new_sph_all.h_smooth = 0.0 | units.parsec
        offsets = self.draw_random_position_offsets(number_of_new_particles)

        i = 0
        for loser in losers:
            i_next = i + loser.n_feedback_particles
            new = new_sph_all[i:i_next]
            new.position = loser.position + offsets[i:i_next]
            new.velocity = loser.velocity
            new.u = self.feedback_efficiency * (
                loser.E_mech - loser.E_mech_last_feedback) / loser.dmass
            i = i_next

        losers.previous_mass -= self.feedback_gas_particle_mass * losers.n_feedback_particles
        losers.E_mech_last_feedback = losers.E_mech
        channel = losers.new_channel_to(self.gravity.particles)
        channel.copy_attribute("previous_mass", "mass")
        if self.verbose:
            print "GravityHydroStellar: New SPH particles:"
            print new_sph_all
        self.hydro.gas_particles.add_particles(new_sph_all)
        self.total_feedback_energy += (new_sph_all.mass * new_sph_all.u).sum()
コード例 #39
0
 def new_colliders(self):
     colliders = Particles(2)
     colliders.mass = [5, 2] | units.MSun
     colliders.position = [[0.0, 0.0, 0.0], [1.0, 0.0, 0.0]] | units.RSun
     colliders.velocity = [[0.0, 0.0, 0.0], [0.0, 2000.0, 0.0]
                           ] | units.km / units.s
     colliders.move_to_center()
     return colliders
コード例 #40
0
def set_up_inner_binary(inclination):
    semimajor_axis = triple_parameters["a_in"]
    masses = triple_parameters["masses_in"]
    print "   Initializing inner binary"
    stars = Particles(2)
    stars.mass = masses
    stars.position = [0.0, 0.0, 0.0] | units.AU
    stars.velocity = [0.0, 0.0, 0.0] | units.km / units.s
    stars[0].y = semimajor_axis
    stars[0].vx = -math.cos(inclination) * get_relative_velocity_at_apastron(
        stars.total_mass(), semimajor_axis, 0)
    stars[0].vz = math.sin(inclination) * get_relative_velocity_at_apastron(
        stars.total_mass(), semimajor_axis, 0)
    stars.move_to_center()
    return stars
コード例 #41
0
 def new_sun_earth_system(self):
     particles = Particles(2)
     particles.mass = [1.0, 3.0037e-6] | units.MSun
     particles.radius = 1.0 | units.RSun
     particles.position = [[0.0, 0.0, 0.0], [1.0, 0.0, 0.0]] | units.AU
     particles.velocity = [[0.0, 0.0, 0.0], [0.0, 0.0, 0.0]] | units.km / units.s
     particles[1].vy = (constants.G * particles.total_mass() / (1.0 | units.AU)).sqrt()
     return particles
コード例 #42
0
ファイル: test_trees.py プロジェクト: rjfarmer/amuse
    def test4(self):
        particles = Particles(10)
        particles.mass = list(range(10)) | units.kg
        particles[0].child1 = particles[2]
        particles[0].child2 = particles[1]
        particles[1].child1 = particles[4]
        particles[1].child2 = particles[3]
        particles[2].child1 = particles[6]
        particles[2].child2 = particles[5]

        tree = particles.as_binary_tree()
        masses = [] | units.kg
        stack = list(reversed(tree.get_children()))
        while stack:
            x = stack.pop()
            masses.append(x.particle.mass)
            stack.extend(reversed(x.get_children()))

        self.assertEqual(masses, [0, 2, 6, 5, 1, 4, 3, 7, 8, 9] | units.kg)
コード例 #43
0
 def convert_stars(self, particles, stellar_evolution_code):
     n_particles = self.divide_number_of_particles(particles)
     se_colliders = particles.get_intersecting_subset_in(stellar_evolution_code.particles)
     if self.verbose:
         print("Converting stars of {0} to SPH models of {1} particles, respectively.".format(particles.mass, n_particles))
     sph_models = (
         self.relax(convert_stellar_model_to_SPH(se_colliders[0], n_particles[0], **self.star_to_sph_arguments)),
         self.relax(convert_stellar_model_to_SPH(se_colliders[1], n_particles[1], **self.star_to_sph_arguments))
     )
     gas_particles = Particles()
     for particle, sph_model in zip(particles, sph_models):
         sph_model.position += particle.position
         sph_model.velocity += particle.velocity
         gas_particles.add_particles(sph_model)
     if self.verbose:
         print("Converting stars to SPH particles done")
     if self.debug:
         print(gas_particles)
     return gas_particles
コード例 #44
0
    def test30(self):
        test_results_path = self.get_path_to_results()
        output_file = os.path.join(test_results_path, "test30"+self.store_version()+".hdf5")
        if os.path.exists(output_file):
            os.remove(output_file)

        particles = Particles(10)
        particles.mass = 10 | units.kg

        io.write_set_to_file(particles,output_file, format='amuse', version = self.store_version())
        
        output = io.read_set_from_file(output_file, format='amuse', allow_writing = True)
        output.new_attribute= 2 * output.mass

        self.assertEquals(output.new_attribute, 2 * output.mass)
        output = output.iter_history().next()
        output.new_attribute= 2 * output.mass

        self.assertEquals(output.new_attribute, 2 * output.mass)
コード例 #45
0
def planet_from_orbital_elements(mass, sma, ecc, true_anom, inc, long_asc_node,
                                 arg_peri):
    """
    returns one particle (a planet) w/ coordinates in 'Center of Mass' frame of the binary
    This is not what you would expect from the typical binary_from_... function.
    """

    two_bodies = kepler_binary_from_orbital_elements(mass, 0.0 * mass, sma,
                                                     ecc, true_anom, inc,
                                                     long_asc_node, arg_peri)

    # Move to 'Binary' Frame
    two_bodies.position -= two_bodies[0].position
    two_bodies.velocity -= two_bodies[0].velocity

    planet = Particles(0)
    planet.add_particle(two_bodies[1])

    return planet
コード例 #46
0
    def test14(self):
        test_results_path = self.get_path_to_results()
        output_file = os.path.join(test_results_path, "test14"+self.store_version()+".hdf5")
        if os.path.exists(output_file):
            os.remove(output_file)

        stars = Particles(2)
        stars.x = 1.0  | units.km
        stars.md = [[[1,3],[2,4],[3,5]],[[4,6],[5,7],[6,8]]]
       

        io.write_set_to_file(stars, output_file, "hdf5", version = self.store_version())
        
        loaded = io.read_set_from_file(output_file, "hdf5", version = self.store_version())
        self.assertEquals(loaded[0].md, [[1,3],[2,4],[3,5]])
        self.assertEquals(loaded[1].md, [[4,6],[5,7],[6,8]])
        
        self.assertEquals(loaded.md[0], [[1,3],[2,4],[3,5]])
        self.assertEquals(loaded.md[1], [[4,6],[5,7],[6,8]])
コード例 #47
0
ファイル: test_store.py プロジェクト: rjfarmer/amuse
    def test8(self):
        test_results_path = self.get_path_to_results()
        output_file = os.path.join(test_results_path,
                                   "test8" + self.store_version() + ".hdf5")
        if os.path.exists(output_file):
            os.remove(output_file)

        instance = self.store_factory()(output_file)
        number_of_particles = 10
        p = Particles(number_of_particles)
        p.mass = numpy.asarray([x * 2.0 for x in range(number_of_particles)])

        instance.store(p.savepoint(1 | nbody_system.time))
        instance.close()

        instance = self.store_factory()(output_file)
        loaded_particles = instance.load()
        self.assertAlmostRelativeEquals(p.mass[1], 2.0)
        instance.close()
コード例 #48
0
ファイル: test_trees.py プロジェクト: rjfarmer/amuse
    def test1(self):
        particles = Particles(10)
        particles.mass = list(range(10)) | units.kg
        particles[0].child1 = particles[1]
        particles[0].child2 = particles[2]

        self.assertEqual(particles[0].mass, 0 | units.kg)
        self.assertEqual(particles[0].child1.mass, 1 | units.kg)
        self.assertEqual(particles[1].child1, None)

        tree = particles.as_binary_tree()
        self.assertFalse(tree.is_leaf())
        self.assertEqual(len(list(tree.iter_children())), 8)
        self.assertEqual(len(list(tree.iter_branches())), 1)
        self.assertEqual(len(list(tree.iter_leafs())), 7)
        branches = list(tree.iter_branches())
        self.assertEqual(len(list(branches[0].iter_children())), 2)
        self.assertEqual(len(list(branches[0].iter_branches())), 0)
        self.assertEqual(len(list(branches[0].iter_leafs())), 2)
コード例 #49
0
 def test7(self):
     print("Test: evolve particles one at a time.")
     print("Used to be problematic, since initial_mass of idle particle is set to zero.")
     stars = Particles(2)
     stars.mass = 1.0 | units.MSun
     for star in stars:
         print(star)
         stellar_evolution = MOSSE()
         stellar_evolution.commit_parameters()
         stellar_evolution.particles.add_particles(star.as_set())
         stellar_evolution.commit_particles()
         from_stellar_evolution_to_model = stellar_evolution.particles.new_channel_to(star.as_set())
         stellar_evolution.evolve_model()
         from_stellar_evolution_to_model.copy()
         stellar_evolution.stop()
     self.assertEqual(stars[0].initial_mass, stars[1].initial_mass)
     self.assertEqual(stars[0].luminosity, stars[1].luminosity)
     self.assertEqual(stars[0].age, stars[1].age)
     print("Solved: SSE_muse_interface.f sets initial_mass to mass when necessary.")
コード例 #50
0
    def test10(self):
        stellar_evolution = SSE()
        stellar_evolution.commit_parameters()
        stars = Particles(10)
        stars.mass = 1.0 | units.MSun
        stellar_evolution.particles.add_particles(stars)
        self.assertEqual(
            stellar_evolution.particles._factory_for_new_collection(),
            Particles)

        filename = os.path.join(get_path_to_results(), "test.h5")
        if os.path.exists(filename):
            os.remove(filename)

        io.write_set_to_file(stellar_evolution.particles, filename, 'hdf5')
        stored_stars = io.read_set_from_file(filename, 'hdf5')
        self.assertEqual(len(stars), len(stored_stars))

        self.assertAlmostRelativeEquals(stars.mass, stored_stars.mass)
コード例 #51
0
def setup_stellar_evolution_model():
    out_pickle_file = os.path.join(get_path_to_results(),
                                   "super_giant_stellar_structure.pkl")
    if os.path.exists(out_pickle_file):
        return out_pickle_file
    print("Creating initial conditions from a MESA stellar evolution model...")

    stellar_evolution = MESA(redirection="none")
    stars = Particles(1)
    stars.mass = 10.0 | units.MSun
    stellar_evolution.particles.add_particles(stars)

    while stellar_evolution.particles[
            0].stellar_type <= 12 | units.stellar_type:
        stellar_evolution.evolve_model()

    pickle_stellar_model(stellar_evolution.particles[0], out_pickle_file)
    stellar_evolution.stop()
    return out_pickle_file
コード例 #52
0
ファイル: test_mobse.py プロジェクト: rjfarmer/amuse
    def test5(self):
        print("Testing stellar collision...")
        instance = MOBSE()
        instance.parameters.common_envelope_efficiency = 3.0
        instance.parameters.Eddington_mass_transfer_limit_factor = 10.0
        instance.commit_parameters()

        stars =  Particles(2)
        stars[0].mass = 130.0  | units.MSun
        stars[1].mass = 50 | units.MSun
        
        instance.particles.add_particles(stars)
        
        binaries =  Particles(1)
        
        binary = binaries[0]
        orbital_period =   300.0 | units.day
        semi_major_axis = instance.orbital_period_to_semi_major_axis(orbital_period,  stars[0].mass , stars[1].mass)
        binary.semi_major_axis = semi_major_axis
        binary.eccentricity = 0.99
        binary.child1 = stars[0]
        binary.child2 = stars[1]
        
        instance.binaries.add_particles(binaries)
        
        from_mobse_to_model = instance.particles.new_channel_to(stars)
        from_mobse_to_model.copy()

        from_mobse_to_model_binaries = instance.binaries.new_channel_to(binaries)
        from_mobse_to_model_binaries.copy()
        
        instance.evolve_model(170 | units.Myr)
        
        from_mobse_to_model.copy()
        from_mobse_to_model_binaries.copy()
        print(binaries)
        self.assertAlmostEqual(binary.child1.mass.value_in(units.MSun), 180.00, 3)
        self.assertAlmostEqual(binary.child2.mass.value_in(units.MSun), 0.000, 3)
        self.assertEqual(str(binary.child1.stellar_type), "Main Sequence star")
        self.assertEqual(str(binary.child2.stellar_type), "Massless Supernova")

        instance.stop()
コード例 #53
0
ファイル: nemesis.py プロジェクト: BrianTCook/planets_in_GC
    def handle_collision(self, coll_time, corr_time, coll_set):
        print("collision:", len(coll_set))

        subsystems = self.particles.compound_particles()
        collsubset = self.particles[0:0]
        collsubsystems = Particles()
        for p in coll_set:
            p = p.as_particle_in_set(self.particles)
            collsubset += p
            if self.subcodes.has_key(p):
                code = self.subcodes[p]
                code.evolve_model(coll_time)
                print(coll_time - code.model_time) / self.timestep
            if p.subsystem is not None:
                collsubsystems.add_particle(p)

        print("corr", coll_time.in_(units.yr),
              (coll_time - corr_time) / self.timestep)
        self.correction_kicks(collsubset, collsubsystems,
                              coll_time - corr_time)

        newparts = HierarchicalParticles(Particles())
        to_remove = Particles()
        for p in coll_set:
            p = p.as_particle_in_set(self.particles)
            if self.subcodes.has_key(p):
                code = self.subcodes.pop(p)
                parts = code.particles.copy()
                parts.position += p.position
                parts.velocity += p.velocity
                newparts.add_particles(parts)
                del code
            else:
                np = newparts.add_particle(p)
                np.radius = p.sub_worker_radius
            to_remove.add_particle(p)
        self.particles.remove_particles(to_remove)
        newcode = self.subcode_factory(newparts)
        newcode.parameters.begin_time = coll_time
        newcode.particles.add_particles(newparts)
        newparent = self.particles.add_subsystem(newcode.particles)
        self.set_parent_particle_radius(newparent)
        newparent.sub_worker_radius = 0. * newparent.radius
        print("radius:", newparent.radius.in_(units.parsec),
              newparent.sub_worker_radius.in_(units.parsec))
        self.subcodes[newparent] = newcode
        return newparent
コード例 #54
0
ファイル: test_mobse.py プロジェクト: rjfarmer/amuse
    def test4(self):
        print("Quick testing standard MOBSE example 2...")
        instance = MOBSE()
        instance.parameters.common_envelope_efficiency = 3.0
        instance.parameters.common_envelope_binding_energy_factor= 0.5
        instance.parameters.Eddington_mass_transfer_limit_factor = 10.0
        instance.commit_parameters()
        
        stars =  Particles(2)
        stars[0].mass = 7.816 | units.MSun
        stars[1].mass = 4.387 | units.MSun
        
        instance.particles.add_particles(stars)
        
        binaries =  Particles(1)
        
        binary = binaries[0]
        orbital_period =   1964.18453 | units.day
        semi_major_axis = instance.orbital_period_to_semi_major_axis(orbital_period,  stars[0].mass , stars[1].mass)
        binary.semi_major_axis = semi_major_axis
        binary.eccentricity = 0.0
        binary.child1 = stars[0]
        binary.child2 = stars[1]
        
        instance.binaries.add_particles(binaries)
        
        from_mobse_to_model = instance.particles.new_channel_to(stars)
        from_mobse_to_model.copy()

        from_mobse_to_model_binaries = instance.binaries.new_channel_to(binaries)
        from_mobse_to_model_binaries.copy()
        
        instance.evolve_model(170 | units.Myr)
        from_mobse_to_model.copy()
        from_mobse_to_model_binaries.copy()

        self.assertAlmostEqual(binary.child1.mass.value_in(units.MSun), 1.26079, 3)
        self.assertAlmostEqual(binary.child2.mass.value_in(units.MSun), 0.76080, 3)
        self.assertEqual(str(binary.child1.stellar_type), "Neutron Star")
        self.assertEqual(str(binary.child2.stellar_type), "Carbon/Oxygen White Dwarf")

        instance.stop()
コード例 #55
0
ファイル: test_store.py プロジェクト: rjfarmer/amuse
    def test19(self):
        test_results_path = self.get_path_to_results()
        output_file = os.path.join(test_results_path,
                                   "test19" + self.store_version() + ".hdf5")
        if os.path.exists(output_file):
            os.remove(output_file)

        stars = Particles(2)
        stars[0].x = 1.0 | units.km
        stars[1].x = 2.0 | units.km

        binaries = Particles(1)
        binaries[0].y = 1.0 | units.km
        binaries[0].child1 = stars[0]
        binaries[0].child2 = stars[1]

        stars[0].parent = binaries[0]
        stars[1].parent = binaries[0]

        self.assertEqual(binaries[0].child1, stars[0])
        self.assertEqual(binaries[0].child2, stars[1])
        self.assertEqual(binaries[0].child1.parent, binaries[0])
        self.assertEqual(binaries[0].child2.parent, binaries[0])

        io.write_set_to_file([binaries, stars],
                             output_file,
                             "hdf5",
                             names=['binaries', 'children'],
                             version=self.store_version())

        loader_binaries, loaded_stars = io.read_set_from_file(
            output_file,
            "hdf5",
            names=['binaries', 'children'],
            version=self.store_version())

        self.assertEqual(loader_binaries[0].child1.key, stars[0].key)
        self.assertEqual(loader_binaries[0].child2.key, stars[1].key)
        self.assertEqual(loader_binaries[0].child1, loaded_stars[0])
        self.assertEqual(loader_binaries[0].child2, loaded_stars[1])
        self.assertEqual(loader_binaries[0].child1.parent, loader_binaries[0])
        self.assertEqual(loader_binaries[0].child2.parent, loader_binaries[0])
コード例 #56
0
def new_system(star_mass=1 | units.MSun,
               star_radius=1 | units.RSun,
               disk_minumum_radius=0.05 | units.AU,
               disk_maximum_radius=10 | units.AU,
               disk_mass=20 | MEarth,
               accurancy=0.0001,
               planet_density=3 | units.g / units.cm**3,
               rng=None,
               kepler=None):

    central_particle = Particle()
    central_particle.mass = star_mass
    central_particle.position = (0, 0, 0) | units.AU
    central_particle.velocity = (0, 0, 0) | units.kms
    central_particle.radius = star_radius

    if rng is None:
        rng = numpy.random

    converter = nbody_system.nbody_to_si(1 | units.MSun, 1 | units.AU)

    if kepler is None:
        kepler = Kepler(converter)
        kepler.initialize_code()

    m, r, f = new_planet_distribution(disk_minumum_radius, disk_maximum_radius,
                                      disk_mass, accurancy)

    planets = make_planets(central_particle,
                           m,
                           r,
                           density=planet_density,
                           phi=0,
                           theta=None,
                           kepler=kepler,
                           rng=rng)

    central_particle.planets = planets
    kepler.stop()
    p = Particles()
    p.add_particle(central_particle)
    return p
コード例 #57
0
 def __init__(self, softening_mode="shared"):
     self.particles = Particles()
     if softening_mode == "individual":
         self.softening_mode = "individual"
         self._softening_lengths_squared = self._softening_lengths_squared_individual
         self._softening_lengths = self._softening_lengths_individual
     else:
         self.softening_mode = "shared"
         self._softening_lengths_squared = self._softening_lengths_squared_shared
         self._softening_lengths = self._softening_lengths_shared
         epsilon_squared_parameter = parameters.ModuleMethodParameterDefinition(
             "get_epsilon_squared",
             "set_epsilon_squared",
             "epsilon_squared",
             "gravitational softening length squared",
             default_value = 0.0 | nbody_system.length**2,
             must_set_before_get = False
         )
         self.parameters = parameters.new_parameters_instance_with_docs([epsilon_squared_parameter], self)
         self.epsilon_squared = 0.0 | nbody_system.length**2
コード例 #58
0
    def test2(self):
        print "Testing ParallelStellarEvolution particles"
        instance = ParallelStellarEvolution(self.code_factory,
                                            number_of_workers=2,
                                            **default_options)
        instance.initialize_code()
        instance.commit_parameters()

        particles = Particles(5)
        particles.mass = range(1, 1 + len(particles)) | units.MSun
        incode = instance.particles.add_particles(particles)
        instance.commit_particles()
        self.assertAlmostEqual(incode.mass,
                               range(1, 1 + len(particles)) | units.MSun)
        print "Note that the order of instance.particles is different from the",
        print "original particle order, since particles are distributed over 2 processes"
        self.assertAlmostEqual(instance.particles.mass,
                               [1, 3, 5, 2, 4] | units.MSun)

        instance.stop()
コード例 #59
0
    def test22(self):
        
        test_results_path = self.get_path_to_results()
        output_file = os.path.join(test_results_path, "test22"+self.store_version()+".hdf5")
        if os.path.exists(output_file):
            os.remove(output_file)

        stars = Particles(2)
        stars.x = 1.0  | units.km
       
        overlay = ParticlesOverlay(stars)
        overlay.y = 2.0  | units.km


        io.write_set_to_file(overlay, output_file, "hdf5", version = self.store_version())
       
        loaded = io.read_set_from_file(output_file, "hdf5", close_file = True, version = self.store_version())
        
        self.assertEquals(loaded[0].x,  1.0 | units.km)
        self.assertEquals(loaded[1].y,  2.0 | units.km)
コード例 #60
0
    def wind_sphere(self, star, Ngas):
        wind = Particles(Ngas)

        dt = (self.model_time - star.wind_release_time)
        if self.critical_timestep is None or dt > self.critical_timestep:
            acc_function = self.acc_function
        else:
            acc_function = ConstantVelocityAcceleration(use_initial=True)

        outer_wind_distance = acc_function.radius_from_time(dt, star)

        wind.position, direction = self.generate_positions(
            Ngas, star.radius, outer_wind_distance,
            acc_function.radius_from_number, star=star)

        velocities = acc_function.velocity_from_radius(
            wind.position.lengths(), star)
        wind.velocity = direction * self.as_three_vector(velocities)

        return wind