コード例 #1
0
ファイル: test_huayno.py プロジェクト: omuse-geoscience/amuse
    def test5(self):
        convert_nbody = nbody_system.nbody_to_si(5.0 | units.kg, 10.0 | units.m)

        instance = Huayno(convert_nbody)
        instance.initialize_code()
        
        particles = datamodel.Particles(2)
        self.assertEqual(len(instance.particles), 0)
        
        particles.mass = [15.0, 30.0] | units.kg
        particles.radius =  [10.0, 20.0] | units.m
        particles.position = [[10.0, 20.0, 30.0], [20.0, 40.0, 60.0]] | units.m
        particles.velocity = [[0.0, 0.0, 0.0], [0.0, 0.0, 0.0]] | units.m / units.s

        
        instance.particles.add_particles(particles)
        self.assertEqual(len(instance.particles), 2)
        
        instance.set_state(1, 16|units.kg, 20.0|units.m, 40.0|units.m, 60.0|units.m, 
                                 1.0|units.ms, 1.0|units.ms, 1.0|units.ms)
        
        curr_state =  instance.get_state(1)
        for expected, actural 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, 0 | units.m), curr_state):
            self.assertAlmostRelativeEquals(actural,expected)
        
        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, actural 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 | units.m), curr_state):
            self.assertAlmostRelativeEquals(actural,expected)
コード例 #2
0
ファイル: test_huayno.py プロジェクト: mherkazandjian/amuse
    def test3(self):
        convert_nbody = nbody_system.nbody_to_si(1.0 | units.MSun, 149.5e6 | units.km)

        instance = Huayno(convert_nbody)
        instance.initialize_code()
        instance.parameters.epsilon_squared = 0.00001 | units.AU**2
        
        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()
コード例 #3
0
    def test6(self):
        print("Test6: Testing Huayno parameters")
        convert_nbody = nbody_system.nbody_to_si(1.0 | units.yr,
                                                 1.0 | units.AU)
        instance = Huayno(convert_nbody)

        (value, error) = instance.legacy_interface.get_eps2()
        self.assertEqual(0, error)
        self.assertEqual(0.0, value)
        self.assertAlmostEqual(0.0 | units.AU**2,
                               instance.parameters.epsilon_squared,
                               in_units=units.AU**2)
        for x in [0.01, 0.1, 0.2]:
            instance.parameters.epsilon_squared = x | units.AU**2
            self.assertAlmostEqual(x | units.AU**2,
                                   instance.parameters.epsilon_squared,
                                   in_units=units.AU**2)

        (value, error) = instance.legacy_interface.get_time()
        self.assertEqual(0, error)
        self.assertEqual(0.0, value)
        self.assertAlmostEqual(0.0 | units.yr,
                               instance.parameters.begin_time,
                               in_units=units.yr)
        for x in [1.0, 10.0, 100.0]:
            instance.parameters.begin_time = x | units.yr
            self.assertAlmostEqual(x | units.yr,
                                   instance.parameters.begin_time,
                                   in_units=units.yr)
        instance.stop()
コード例 #4
0
    def test16(self):
        solsys = new_solar_system()

        solsys.x-=1.| units.AU

        p=datamodel.Particles(3)
        p.mass=[1,2,3] | units.MSun
        p.x=[1,10,100] | units.AU
        p.y=[0,0,-10] | units.AU
        p.z=[0,0,10] | units.AU

        from amuse.community.huayno.interface import Huayno
        from amuse.units import nbody_system        
        conv=nbody_system.nbody_to_si(1. | units.AU, 1.| units.MSun)
        h = Huayno(conv)
        h.particles.add_particles(solsys)
        
        ax1,ay1,az1=h.get_gravity_at_point(p.x*0.,p.x,p.y,p.z)
        
        mercury = Mercury()        
        mercury.particles.add_particles(solsys)

        ax2,ay2,az2=mercury.get_gravity_at_point(p.x*0.,p.x,p.y,p.z)


        self.assertAlmostRelativeEqual(ax1,ax2,12)
        self.assertAlmostRelativeEqual(ay1,ay2,12)
        self.assertAlmostRelativeEqual(az1,az2,12)
コード例 #5
0
    def test15(self):
        particles = plummer.new_plummer_model(512)
        expected_positions = None
        for mode in ["cpu", "openmp", "opencl"]:
            try:
                instance = Huayno(mode=mode,
                                  number_of_workers=1)  #, debugger="xterm")
            except:
                print("Running huayno with mode=", mode, " was unsuccessful.")
                continue
            else:
                print("Running huayno with mode=", mode, "... ")

            instance.initialize_code()
            instance.parameters.epsilon_squared = 0.01 | nbody_system.length**2
            instance.particles.add_particles(particles)

            instance.evolve_model(0.2 | nbody_system.time)
            instance.synchronize_model()
            if expected_positions is None:
                expected_positions = instance.particles.position
            else:
                self.assertAlmostRelativeEquals(expected_positions,
                                                instance.particles.position, 8)
            instance.stop()
コード例 #6
0
ファイル: test_mercury.py プロジェクト: stevemcmillan/amuse
    def test16(self):
        solsys = new_solar_system()

        solsys.x-=1.| units.AU

        p=datamodel.Particles(3)
        p.mass=[1,2,3] | units.MSun
        p.x=[1,10,100] | units.AU
        p.y=[0,0,-10] | units.AU
        p.z=[0,0,10] | units.AU

        from amuse.community.huayno.interface import Huayno
        from amuse.units import nbody_system        
        conv=nbody_system.nbody_to_si(1. | units.AU, 1.| units.MSun)
        h = Huayno(conv)
        h.particles.add_particles(solsys)
        
        ax1,ay1,az1=h.get_gravity_at_point(p.x*0.,p.x,p.y,p.z)
        
        mercury = Mercury()        
        mercury.particles.add_particles(solsys)

        ax2,ay2,az2=mercury.get_gravity_at_point(p.x*0.,p.x,p.y,p.z)


        self.assertAlmostRelativeEqual(ax1,ax2,12)
        self.assertAlmostRelativeEqual(ay1,ay2,12)
        self.assertAlmostRelativeEqual(az1,az2,12)
コード例 #7
0
ファイル: test_huayno.py プロジェクト: mherkazandjian/amuse
 def test16(self):
     instance = Huayno()
     instance.parameters.epsilon_squared = 0.0 | nbody_system.length**2
     
     particles = datamodel.Particles(2)
     particles.mass = [1.] | nbody_system.mass
     particles.radius =  [0.0] | nbody_system.length
     particles.position = [[0.0,0.0,0.0],[1.0,0.0,0.0]] | nbody_system.length
     particles.velocity = [[0.0, 0.0, 0.0]] | nbody_system.speed
     instance.particles.add_particles(particles)
     
     zero = 0.0 | nbody_system.length
     
     for x in (0.25, 0.5, 0.75):
         x0 = x | nbody_system.length
         potential0 = instance.get_potential_at_point(zero, x0, zero, zero)
         fx0, fy0, fz0 = instance.get_gravity_at_point(zero, x0, zero, zero)
         
         self.assertAlmostEqual(fy0, 0.0 | nbody_system.acceleration,14)
         self.assertAlmostEqual(fz0, 0.0 | nbody_system.acceleration,14)
         
         fx = (-1.0 / (x0**2)+1.0 / (((1.0|nbody_system.length)-x0)**2)) * (1.0 | nbody_system.length ** 3 / nbody_system.time ** 2)
         self.assertAlmostEqual(fx, fx0,14)
         self.assertAlmostEqual(potential0, -nbody_system.G*(1.|nbody_system.mass)*(1./x0+1./((1.|nbody_system.length)-x0)),14)
     instance.stop()
コード例 #8
0
    def test22(self):
        print(
            "Testing zero-mass test particles in Huayno, can be used for removing particles when inside recursive evolve loop"
        )
        sun_and_earth = self.new_system_of_sun_and_earth()
        period = (4.0 * math.pi**2 * (1.0 | units.AU)**3 /
                  (constants.G * sun_and_earth.total_mass())).sqrt()
        convert_nbody = nbody_system.nbody_to_si(1.0 | units.MSun,
                                                 1.0 | units.AU)
        huayno = Huayno(convert_nbody)
        huayno.parameters.epsilon_squared = 0.0 | units.AU**2
        huayno.parameters.inttype_parameter = huayno.inttypes.SHARED8

        test_particle = datamodel.Particle(mass=0 | units.MSun,
                                           position=[4, 0, 0] | units.AU,
                                           velocity=[0, 0, 0] | units.kms)
        test_particle.vy = (constants.G * sun_and_earth.total_mass() /
                            (4.0 | units.AU)).sqrt()
        sun_and_earth.add_particle(test_particle)
        huayno.particles.add_particles(sun_and_earth)
        huayno.evolve_model(period)
        self.assertAlmostRelativeEqual(huayno.particles[:2].x,
                                       sun_and_earth[:2].x, 13)
        huayno.evolve_model(1.25 * period)
        self.assertAlmostRelativeEqual(huayno.particles[1].y,
                                       sun_and_earth[1].x, 13)
        huayno.evolve_model(8.0 * period)
        self.assertAlmostRelativeEqual(huayno.particles.x, sun_and_earth.x, 8)
        huayno.stop()
def initialize_huayno(bodies, converter, huayno_eta):
  stars_gravity = Huayno(converter,channel_type="sockets")
  stars_gravity.particles.add_particles(bodies) # either bodies or just stars
  stars_gravity.commit_particles()
  #stars_gravity.set_timestep_parameter(huayno_eta)
  stars_gravity.parameters.timestep_parameter = huayno_eta
  stars_gravity.set_inttype_parameter(12) # CC_KEPLER

  return stars_gravity
コード例 #10
0
ファイル: test_huayno.py プロジェクト: mherkazandjian/amuse
    def test5(self):
        convert_nbody = nbody_system.nbody_to_si(5.0 | units.kg, 10.0 | units.m)

        instance = Huayno(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)
        
        curr_state =  instance.get_state(1)
        for expected, actural 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, 0 | units.m), curr_state):
            self.assertAlmostRelativeEquals(actural,expected)
        
        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, actural 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 | units.m), curr_state):
            self.assertAlmostRelativeEquals(actural,expected)
コード例 #11
0
 def sub_worker(parts):
     mode = system_type(parts)
     if mode == "twobody":
         code = TwoBody(conv_sub)
     elif mode == "solarsystem":
         #code=Mercury(conv_sub)
         code = Huayno(conv_sub)
     elif mode == "nbody":
         code = Huayno(conv_sub)
         code.parameters.inttype_parameter = code.inttypes.SHARED4
     return code
コード例 #12
0
    def test13(self):
        particles = plummer.new_plummer_model(31)

        instance = Huayno(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()
コード例 #13
0
ファイル: bin_planet.py プロジェクト: Ingwar/amuse
def binary_with_planet_run(m1=1.|units.MSun, m2=1.| units.MSun, m_planet=1|units.MJupiter,
                           r1=None, r2=None, r_planet=None, ecc_binary=0, P_binary=20 | units.day,
                           ecc_planet=0., P_planet=1.| units.yr, pangle_planet=0., a_planet=None,
                           tend=100. | units.yr,hostname=''):

    dEcrit=1.e-6

    three=binary_with_planet(m1=m1,m2=m2,m_planet=m_planet,r1=r1,r2=r2,r_planet=r_planet,
             ecc_binary=ecc_binary,P_binary=P_binary,
             ecc_planet=ecc_planet,a_planet=a_planet,pangle_planet=pangle_planet)
    
    convert=nbody_system.nbody_to_si(1|units.MSun,1|units.AU)
    code=Huayno(convert,hostname=hostname)
    
    code.parameters.inttype_parameter=code.inttypes.SHARED10
    code.parameters.timestep_parameter=.2
    code.parameters.timestep=100. | units.day
        
    dt=10000. | units.day
    
    code.particles.add_particles(three)

    E0=code.potential_energy+code.kinetic_energy
    a0,eps0,pangle0=elements( three.total_mass(),
          code.particles.x[2],
          code.particles.y[2],
          code.particles.z[2],
          code.particles.vx[2],
          code.particles.vy[2],
          code.particles.vz[2] )

    t=0. | units.day
    result="stable"
    while(t < tend-dt/2):
        t=t+dt
        code.evolve_model(t)
        E=code.potential_energy+code.kinetic_energy    
        dE=abs(((E-E0)/E0))
        a,eps,pangle=elements( three.total_mass(),
          code.particles.x[2],
          code.particles.y[2],
          code.particles.z[2],
          code.particles.vx[2],
          code.particles.vy[2],
          code.particles.vz[2] )
        if dE > dEcrit or a<0.5*a0 or a>2.*a0:
          result="unstable"
          if dE > dEcrit:
            result="failed"
          break
    code.stop()
    return result,t,dE,a.in_(units.AU),eps,pangle
コード例 #14
0
ファイル: test_huayno.py プロジェクト: jorishanse/amuse
    def test14(self):
        import hashlib

        numpy.random.seed(123456)
        particles = plummer.new_plummer_model(64)
        sha=hashlib.sha1()

        class inttypes(object):
            SHARED2=1
            EXTRAPOLATE=5
            PASS_KDK=2
            PASS_DKD=7
            HOLD_KDK=3
            HOLD_DKD=8
            PPASS_DKD=9
            BRIDGE_KDK=4
            BRIDGE_DKD=10
            CC=11
            CC_KEPLER=12
            OK=13
            KEPLER=14
            SHARED4=15
            SHARED6=18
            SHARED8=19
            SHARED10=20
            SHAREDBS=21
           
            @classmethod
            def _list(cls):
                  return set([x for x in cls.__dict__.keys() if not x.startswith('_')])

        for itype in sorted(inttypes._list()):
            if itype in ("KEPLER"): continue
            instance = Huayno()
            instance.parameters.inttype_parameter=getattr(Huayno.inttypes,itype)
            instance.particles.add_particles(particles)
            instance.evolve_model(0.125 | nbody_system.time)
            part_out= instance.particles.copy()
            position = part_out.position.number
            if hasattr(position,'tobytes'):
                as_bytes = position.tobytes()
            else:
                as_bytes = numpy.copy(position.data, order='C')
            sha.update(as_bytes)
            
            instance.stop()
        
        # this result is probably dependent on system architecture hence no good for assert
        print 
        print sha.hexdigest()
        print "8e71f9441578a43af4af927943577ad2c4130e4c"
コード例 #15
0
ファイル: test_huayno.py プロジェクト: mherkazandjian/amuse
 def test13(self):
     particles = plummer.new_plummer_model(31)
    
     instance = Huayno(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()
コード例 #16
0
ファイル: test_huayno.py プロジェクト: omuse-geoscience/amuse
 def _compare_integrator_with_collision_integrator(self, inttype_parameter1, inttype_parameter2):
     numpy.random.seed(12345)
     particles = plummer.new_plummer_model(101)
     instance = Huayno()
     instance.parameters.inttype_parameter = inttype_parameter1
     instance.particles.add_particles(particles)
     instance.evolve_model(0.2 | nbody_system.time)
     expected_position = instance.particles.position
     expected_velocity = instance.particles.velocity
     instance.reset()
     instance.parameters.inttype_parameter = inttype_parameter2
     instance.particles.add_particles(particles)
     instance.evolve_model(0.2 | nbody_system.time)
     self.assertAlmostRelativeEquals(expected_position, instance.particles.position, 8)
     self.assertAlmostRelativeEquals(expected_velocity, instance.particles.velocity, 8)
     instance.stop()
コード例 #17
0
    def test24(self):
        print("test massless particles/ kepler integrator")
        N = 20
        tend = 2. | units.yr
        numpy.random.seed(12345)
        conv = nbody_system.nbody_to_si(4. | units.MSun, 5. | units.AU)
        orbiters = plummer.new_plummer_model(N, conv)
        sun = datamodel.Particle(mass=1. | units.MSun)
        sun.position = [12.3, 1., -.2] | units.AU
        sun.velocity = [10, 50., -20.] | units.kms
        orbiters.mass *= 0.

        a0, eps0 = elements(sun.mass, orbiters.x, orbiters.y, orbiters.z,
                            orbiters.vx, orbiters.vy, orbiters.vz)

        orbiters.position += sun.position
        orbiters.velocity += sun.velocity

        pos = dict()
        for inttype in [20, 14]:
            code = Huayno(conv)
            code.parameters.inttype_parameter = inttype
            code.parameters.timestep_parameter = 0.1
            code.particles.add_particle(sun)
            orbiters2 = code.particles.add_particles(orbiters).copy()
            orbiters2.position -= sun.position
            orbiters2.velocity -= sun.velocity
            code.evolve_model(tend)
            a, eps = elements(sun.mass, orbiters2.x, orbiters2.y, orbiters2.z,
                              orbiters2.vx, orbiters2.vy, orbiters2.vz)

            da = abs((a - a0) / a0)
            deps = abs(eps - eps0) / eps0

            dev = numpy.where(da > 1.e-12)[0]
            self.assertEqual(len(dev), 0)
            dev = numpy.where(deps > 1.e-12)[0]
            self.assertEqual(len(dev), 0)
            pos[inttype] = [
                orbiters2.x.value_in(units.AU),
                orbiters2.y.value_in(units.AU),
                orbiters2.z.value_in(units.AU)
            ]
        self.assertAlmostEqual(pos[20][0], pos[14][0], 12)
        self.assertAlmostEqual(pos[20][1], pos[14][1], 12)
        self.assertAlmostEqual(pos[20][2], pos[14][2], 12)
コード例 #18
0
    def _run_collision_with_integrator(self, inttype_parameter):
        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 = Huayno()
        instance.parameters.inttype_parameter = inttype_parameter
        instance.particles.add_particles(particles)
        collisions = instance.stopping_conditions.collision_detection
        collisions.enable()
        instance.evolve_model(1.0 | nbody_system.time)

        self.assertTrue(collisions.is_set())
        self.assertTrue(instance.model_time < 0.5 | nbody_system.time)
        self.assertEqual(len(collisions.particles(0)), 3)
        self.assertEqual(len(collisions.particles(1)), 3)
        self.assertEqual(
            len(particles - collisions.particles(0) - collisions.particles(1)),
            1)
        self.assertEqual(
            abs(collisions.particles(0).x - collisions.particles(1).x) <=
            (collisions.particles(0).radius + collisions.particles(1).radius),
            [True, True, True])

        sticky_merged = datamodel.Particles(len(collisions.particles(0)))
        sticky_merged.mass = collisions.particles(
            0).mass + collisions.particles(1).mass
        sticky_merged.radius = collisions.particles(0).radius
        for p1, p2, merged in zip(collisions.particles(0),
                                  collisions.particles(1), sticky_merged):
            merged.position = (p1 + p2).center_of_mass()
            merged.velocity = (p1 + p2).center_of_mass_velocity()

        instance.particles.remove_particles(
            collisions.particles(0) + collisions.particles(1))
        instance.particles.add_particles(sticky_merged)

        instance.evolve_model(1.0 | nbody_system.time)
        self.assertTrue(collisions.is_set())
        self.assertTrue(instance.model_time < 1.0 | nbody_system.time)
        self.assertEqual(len(collisions.particles(0)), 1)
        self.assertEqual(len(collisions.particles(1)), 1)
        self.assertEqual(
            len(instance.particles - collisions.particles(0) -
                collisions.particles(1)), 2)
        self.assertEqual(
            abs(collisions.particles(0).x - collisions.particles(1).x) <=
            (collisions.particles(0).radius + collisions.particles(1).radius),
            [True])
        instance.stop()
コード例 #19
0
ファイル: test_huayno.py プロジェクト: omuse-geoscience/amuse
    def test28(self):
        particles = plummer.new_plummer_model(31)

        instance = Huayno()
        instance.particles.add_particles(particles)        
        self.assertAlmostEqual(particles.total_mass(),instance.total_mass)
        self.assertAlmostEqual(particles.center_of_mass(),instance.center_of_mass_position)
        self.assertAlmostEqual(particles.center_of_mass_velocity(),instance.center_of_mass_velocity)
コード例 #20
0
    def test23(self):
        print("testing removing and adding particles repeatedly")
        N = 1100
        p1 = plummer.new_plummer_model(N)
        p2 = plummer.new_plummer_model(N)
        h1 = Huayno()
        h1.particles.add_particles(p1[:N // 2])
        h1.particles.add_particles(p2[-N // 2:])

        h2 = Huayno()
        h2.particles.add_particles(p1)
        h2.particles.remove_particles(p1[N // 2:])
        h2.particles.add_particles(p2)
        h2.particles.remove_particles(p2[:-N // 2])

        self.assertEqual(len(h1.particles), len(h2.particles))
        self.assertAlmostEqual(h1.kinetic_energy, h2.kinetic_energy, 15)
        self.assertAlmostEqual(h1.potential_energy, h2.potential_energy, 15)
コード例 #21
0
ファイル: test_huayno.py プロジェクト: mherkazandjian/amuse
 def test29(self):
     instance = Huayno()
     instance.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 = ([-1,0,0], [2,0,0] )| nbody_system.speed
     particles.radius = 0| nbody_system.length
     particles.mass = 0.1| nbody_system.mass
             
     instance.particles.add_particles(particles)
     instance.stopping_conditions.out_of_box_detection.enable()
     instance.parameters.stopping_conditions_out_of_box_size = 2 | nbody_system.length
     instance.parameters.stopping_conditions_out_of_box_use_center_of_mass = False
     instance.evolve_model(1 | nbody_system.time)
     self.assertTrue(instance.stopping_conditions.out_of_box_detection.is_set())
     self.assertEquals(len(instance.stopping_conditions.out_of_box_detection.particles(0)), 1)
     self.assertEquals(instance.stopping_conditions.out_of_box_detection.particles(0)[0].key, particles[1].key)
     instance.stop()
コード例 #22
0
ファイル: test_huayno.py プロジェクト: mherkazandjian/amuse
 def _compare_integrator_with_collision_integrator(self, inttype_parameter1, inttype_parameter2):
     numpy.random.seed(12345)
     particles = plummer.new_plummer_model(101)
     instance = Huayno()
     instance.parameters.inttype_parameter = inttype_parameter1
     instance.particles.add_particles(particles)
     instance.evolve_model(0.2 | nbody_system.time)
     expected_position = instance.particles.position
     expected_velocity = instance.particles.velocity
     instance.reset()
     instance.parameters.inttype_parameter = inttype_parameter2
     instance.particles.add_particles(particles)
     instance.evolve_model(0.2 | nbody_system.time)
     self.assertAlmostRelativeEquals(expected_position, instance.particles.position, 8)
     self.assertAlmostRelativeEquals(expected_velocity, instance.particles.velocity, 8)
     instance.stop()
コード例 #23
0
    def test7(self):
        print("Test7: Testing effect of Huayno 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 = Huayno(convert_nbody)
            instance.initialize_code()
            instance.parameters.epsilon_squared = 10.0**log_eps2 | units.AU**2
            instance.particles.add_particles(particles)
            instance.commit_particles()
            instance.evolve_model(0.25 | units.yr)
            final_direction.append(
                math.atan((instance.particles[1].velocity[0] /
                           instance.particles[1].velocity[1])))
            instance.stop()
        # Small values of epsilon_squared should result in normal earth-sun dynamics: rotation of 90 degrees
        self.assertAlmostEqual(abs(final_direction[0]),
                               abs(initial_direction + math.pi / 2.0), 2)
        # Large values of epsilon_squared should result in ~ no interaction
        self.assertAlmostEqual(final_direction[-1], initial_direction, 2)
        # Outcome is most sensitive to epsilon_squared when epsilon_squared = d(earth, sun)^2
        delta = [
            abs(final_direction[i + 1] - final_direction[i])
            for i in range(len(final_direction) - 1)
        ]
        self.assertEqual(delta[len(final_direction) // 2 - 1], max(delta))
コード例 #24
0
ファイル: test_huayno.py プロジェクト: mherkazandjian/amuse
    def test24(self):
        print "test massless particles/ kepler integrator"
        N=20        
        tend=2.| units.yr
        numpy.random.seed(12345)
        conv=nbody_system.nbody_to_si(4.| units.MSun, 5.|units.AU)
        orbiters=plummer.new_plummer_model(N,conv)
        sun=datamodel.Particle(mass=1.|units.MSun)
        sun.position=[12.3,1.,-.2]|units.AU
        sun.velocity=[10,50.,-20.]|units.kms
        orbiters.mass*=0.
        
        a0,eps0=elements(sun.mass,orbiters.x,orbiters.y,orbiters.z,
                      orbiters.vx,orbiters.vy,orbiters.vz)

        orbiters.position+=sun.position
        orbiters.velocity+=sun.velocity

        pos=dict()
        for inttype in [20,14]:
          code=Huayno(conv)
          code.parameters.inttype_parameter=inttype
          code.parameters.timestep_parameter=0.1
          code.particles.add_particle(sun)
          orbiters2=code.particles.add_particles(orbiters).copy()
          orbiters2.position-=sun.position
          orbiters2.velocity-=sun.velocity
          code.evolve_model(tend)
          a,eps=elements(sun.mass,orbiters2.x,orbiters2.y,orbiters2.z,
                    orbiters2.vx,orbiters2.vy,orbiters2.vz)

          da=abs((a-a0)/a0)
          deps=abs(eps-eps0)/eps0

          dev=numpy.where(da > 1.e-12)[0]
          self.assertEqual( len(dev),0)
          dev=numpy.where(deps > 1.e-12)[0]
          self.assertEqual( len(dev),0)
          pos[inttype]=[orbiters2.x.value_in(units.AU),orbiters2.y.value_in(units.AU),orbiters2.z.value_in(units.AU)]
        self.assertAlmostEqual(pos[20][0],pos[14][0],12)
        self.assertAlmostEqual(pos[20][1],pos[14][1],12)
        self.assertAlmostEqual(pos[20][2],pos[14][2],12)
コード例 #25
0
    def test25(self):
        print("test massless particles/ kepler integrator, smoothed")
        N = 10
        tend = 20. | units.yr
        numpy.random.seed(12345)
        conv = nbody_system.nbody_to_si(4. | units.MSun, 5. | units.AU)
        orbiters = plummer.new_plummer_model(N, conv)
        sun = datamodel.Particle(mass=1. | units.MSun)
        sun.position = [0, 0, 0] | units.AU
        sun.velocity = [0, 0, 0] | units.kms
        orbiters.mass *= 0.
        eps = (5. | units.AU)

        e0 = energy(sun.mass, eps, orbiters)
        l0 = angular_momentum(orbiters)

        pos = dict()
        for inttype in [20, 14]:
            code = Huayno(conv)
            code.parameters.inttype_parameter = inttype
            code.parameters.timestep_parameter = 0.1
            code.parameters.epsilon_squared = eps**2
            code.particles.add_particle(sun)
            orbiters2 = code.particles.add_particles(orbiters)
            code.evolve_model(tend)

            e1 = energy(sun.mass, eps, orbiters2)
            l1 = angular_momentum(orbiters2)
            de, dl = abs((e1 - e0) / e0).max(), abs((l1 - l0) / l1).max()
            self.assertTrue(numpy.all(de < 1.e-8))
            self.assertTrue(numpy.all(dl < 1.e-8))

            pos[inttype] = [
                orbiters2.x.value_in(units.AU),
                orbiters2.y.value_in(units.AU),
                orbiters2.z.value_in(units.AU)
            ]
        self.assertAlmostRelativeEqual(pos[20][0], pos[14][0],
                                       4)  # still not clear why 4
        self.assertAlmostRelativeEqual(pos[20][1], pos[14][1], 4)
        self.assertAlmostRelativeEqual(pos[20][2], pos[14][2], 4)
コード例 #26
0
ファイル: test_huayno.py プロジェクト: mherkazandjian/amuse
 def test6(self):
     print "Test6: Testing Huayno parameters"
     convert_nbody = nbody_system.nbody_to_si(1.0 | units.yr, 1.0 | units.AU)
     instance = Huayno(convert_nbody)
     
     (value, error) = instance.legacy_interface.get_eps2()
     self.assertEquals(0, error)
     self.assertEquals(0.0, 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, error) = instance.legacy_interface.get_time()
     self.assertEquals(0, error)
     self.assertEquals(0.0, 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()
コード例 #27
0
    def test16(self):
        instance = Huayno()
        instance.parameters.epsilon_squared = 0.0 | nbody_system.length**2

        particles = datamodel.Particles(2)
        particles.mass = [1.] | nbody_system.mass
        particles.radius = [0.0] | nbody_system.length
        particles.position = [[0.0, 0.0, 0.0], [1.0, 0.0, 0.0]
                              ] | nbody_system.length
        particles.velocity = [[0.0, 0.0, 0.0]] | nbody_system.speed
        instance.particles.add_particles(particles)

        zero = 0.0 | nbody_system.length

        for x in (0.25, 0.5, 0.75):
            x0 = x | nbody_system.length
            potential0 = instance.get_potential_at_point(zero, x0, zero, zero)
            fx0, fy0, fz0 = instance.get_gravity_at_point(zero, x0, zero, zero)

            self.assertAlmostEqual(fy0, 0.0 | nbody_system.acceleration, 14)
            self.assertAlmostEqual(fz0, 0.0 | nbody_system.acceleration, 14)

            fx = (-1.0 / (x0**2) + 1.0 /
                  (((1.0 | nbody_system.length) - x0)**2)) * (
                      1.0 | nbody_system.length**3 / nbody_system.time**2)
            self.assertAlmostEqual(fx, fx0, 14)
            self.assertAlmostEqual(
                potential0, -nbody_system.G * (1. | nbody_system.mass) *
                (1. / x0 + 1. / ((1. | nbody_system.length) - x0)), 14)
        instance.stop()
コード例 #28
0
    def test3(self):
        convert_nbody = nbody_system.nbody_to_si(1.0 | units.MSun,
                                                 149.5e6 | units.km)

        instance = Huayno(convert_nbody)
        instance.initialize_code()
        instance.parameters.epsilon_squared = 0.00001 | units.AU**2

        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()
コード例 #29
0
def timefractal(N=1000,
                fd=1.6,
                tend=0.25 | nbody_system.time,
                inttype=Huayno.inttypes.HOLD_DKD,
                seed=12345678):

    stars = new_fractal_cluster_model(N=N,
                                      fractal_dimension=fd,
                                      random_seed=seed,
                                      virial_ratio=0.5,
                                      do_scale=True,
                                      verbose=False)
    code = Huayno()
    code.parameters.inttype_parameter = inttype
    code.parameters.timestep_parameter = 0.01
    code.particles.add_particles(stars)

    E0 = code.kinetic_energy + code.potential_energy
    p0 = code.particles.total_momentum()
    t1 = time()
    code.evolve_model(tend)
    t2 = time()
    E = code.kinetic_energy + code.potential_energy
    p = code.particles.total_momentum()
    code.stop()
    return t2 - t1, abs(E0 - E) / E0, p0 - p
コード例 #30
0
ファイル: test_huayno.py プロジェクト: mherkazandjian/amuse
    def test27(self):
        particles = plummer.new_plummer_model(31)

        tend=0.25| nbody_system.time

        instance = Huayno()
        instance.particles.add_particles(particles)        
        instance.evolve_model(tend)
        expected_positions = instance.particles.position
        self.assertEqual(instance.model_time, tend)
        instance.stop()
        
        particles2=particles.copy()
        particles2.velocity*=-1

        instance = Huayno()
        instance.particles.add_particles(particles2)        
        instance.evolve_model(-tend)
        positions = instance.particles.position
        self.assertEqual(instance.model_time, -tend)
        instance.stop()

        self.assertAlmostEqual(positions,expected_positions)
コード例 #31
0
ファイル: test_huayno.py プロジェクト: mherkazandjian/amuse
    def test4(self):
        convert_nbody = nbody_system.nbody_to_si(5.0 | units.kg, 10.0 | units.m)

        instance = Huayno(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)  
コード例 #32
0
    def test4(self):
        convert_nbody = nbody_system.nbody_to_si(5.0 | units.kg,
                                                 10.0 | units.m)

        instance = Huayno(convert_nbody)
        instance.initialize_code()

        particles = datamodel.Particles(2)
        self.assertEqual(len(instance.particles), 0)

        particles.mass = [15.0, 30.0] | units.kg
        particles.radius = [10.0, 20.0] | units.m
        particles.position = [[10.0, 20.0, 30.0], [20.0, 40.0, 60.0]] | units.m
        particles.velocity = [[0.0, 0.0, 0.0], [0.0, 0.0, 0.0]
                              ] | units.m / units.s

        instance.particles.add_particles(particles)
        self.assertEqual(len(instance.particles), 2)

        instance.particles.mass = [17.0, 33.0] | units.kg

        self.assertEqual(instance.get_mass(0), 17.0 | units.kg)
        self.assertEqual(instance.get_mass(1), 33.0 | units.kg)
コード例 #33
0
def orbit_evolve(bodies, time_peri, eta, n_steps=100):
    converter = nbody_system.nbody_to_si(1 | units.MSun, 1 | units.AU)

    gravity = Huayno(converter, channel_type="sockets")
    gravity.particles.add_particles(bodies)
    gravity.commit_particles()
    gravity.parameters.timestep_parameter = eta

    channel_from_gravity_to_framework = gravity.particles.new_channel_to(
        bodies)

    Etot_init = gravity.kinetic_energy + gravity.potential_energy
    Etot = Etot_init

    file_snap = "orbit_ini.hdf5"

    t_end = 2.0 * abs(time_peri.value_in(units.yr)) | units.yr
    dt = t_end / float(n_steps)
    time = 0.0 | units.yr

    while time <= t_end:

        gravity.evolve_model(time)
        channel_from_gravity_to_framework.copy()
        bodies.age = time

        # checking energy conservation
        Ekin = gravity.kinetic_energy
        Epot = gravity.potential_energy
        Etot = Ekin + Epot
        dE = Etot_init - Etot

        # output centerd on the bodies[0] star
        bodies.position -= bodies[0].position
        bodies.velocity -= bodies[0].velocity
        write_set_to_file(bodies, file_snap, "hdf5")

        rel_r = (bodies[1].position - bodies[0].position).lengths()
        print " \t\t", time, "\t", dE / Etot_init, rel_r.in_(units.AU)
        time += dt

    gravity.stop()
    bodies.position -= bodies[0].position
    bodies.velocity -= bodies[0].velocity
    print bodies

    return
コード例 #34
0
def initialize_huayno(bodies, converter, huayno_eta):
  stars_gravity = Huayno(converter,channel_type="sockets")
  stars_gravity.particles.add_particles(bodies) # either bodies or just stars
  stars_gravity.commit_particles()
  #stars_gravity.set_timestep_parameter(huayno_eta)
  stars_gravity.parameters.timestep_parameter = huayno_eta
  stars_gravity.set_inttype_parameter(12) # CC_KEPLER

  return stars_gravity
コード例 #35
0
ファイル: test_huayno.py プロジェクト: mherkazandjian/amuse
 def test22(self):
     print "Testing zero-mass test particles in Huayno, can be used for removing particles when inside recursive evolve loop"
     sun_and_earth = self.new_system_of_sun_and_earth()
     period = (4.0 * math.pi**2 * (1.0 | units.AU)**3 / (constants.G * sun_and_earth.total_mass())).sqrt()
     convert_nbody = nbody_system.nbody_to_si(1.0 | units.MSun, 1.0 | units.AU)
     huayno = Huayno(convert_nbody)
     huayno.parameters.epsilon_squared = 0.0 | units.AU**2
     huayno.parameters.inttype_parameter = huayno.inttypes.SHARED8
     
     test_particle = datamodel.Particle(mass=0|units.MSun, position=[4,0,0]|units.AU, velocity=[0,0,0]|units.kms)
     test_particle.vy = (constants.G * sun_and_earth.total_mass() / (4.0 | units.AU)).sqrt()
     sun_and_earth.add_particle(test_particle)
     huayno.particles.add_particles(sun_and_earth)
     huayno.evolve_model(period)
     self.assertAlmostRelativeEqual(huayno.particles[:2].x, sun_and_earth[:2].x, 13)
     huayno.evolve_model(1.25 * period)
     self.assertAlmostRelativeEqual(huayno.particles[1].y, sun_and_earth[1].x, 13)
     huayno.evolve_model(8.0 * period)
     self.assertAlmostRelativeEqual(huayno.particles.x, sun_and_earth.x, 8)
     huayno.stop()
コード例 #36
0
ファイル: test_huayno.py プロジェクト: mherkazandjian/amuse
    def test25(self):
        print "test massless particles/ kepler integrator, smoothed"
        N=10        
        tend=20.| units.yr
        numpy.random.seed(12345)
        conv=nbody_system.nbody_to_si(4.| units.MSun, 5.|units.AU)
        orbiters=plummer.new_plummer_model(N,conv)
        sun=datamodel.Particle(mass=1.|units.MSun)
        sun.position=[0,0,0]|units.AU
        sun.velocity=[0,0,0]|units.kms
        orbiters.mass*=0.
        eps=(5. | units.AU)

        e0=energy(sun.mass,eps,orbiters)
        l0=angular_momentum(orbiters)
        
        pos=dict()
        for inttype in [20,14]:
          code=Huayno(conv)
          code.parameters.inttype_parameter=inttype
          code.parameters.timestep_parameter=0.1
          code.parameters.epsilon_squared=eps**2
          code.particles.add_particle(sun)
          orbiters2=code.particles.add_particles(orbiters)
          code.evolve_model(tend)

          e1=energy(sun.mass,eps,orbiters2)
          l1=angular_momentum(orbiters2)
          de,dl=abs((e1-e0)/e0).max(),abs((l1-l0)/l1).max()
          self.assertTrue( numpy.all(de< 1.e-8))
          self.assertTrue( numpy.all(dl< 1.e-8))

          pos[inttype]=[orbiters2.x.value_in(units.AU),orbiters2.y.value_in(units.AU),orbiters2.z.value_in(units.AU)]
        self.assertAlmostRelativeEqual(pos[20][0],pos[14][0],4) # still not clear why 4
        self.assertAlmostRelativeEqual(pos[20][1],pos[14][1],4)
        self.assertAlmostRelativeEqual(pos[20][2],pos[14][2],4)
コード例 #37
0
ファイル: test_huayno.py プロジェクト: mherkazandjian/amuse
 def _run_collision_with_integrator(self, inttype_parameter):
     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 = Huayno()
     instance.parameters.inttype_parameter = inttype_parameter
     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()
コード例 #38
0
ファイル: test_huayno.py プロジェクト: kaifuski/amuse
    def test14(self):
        import hashlib

        numpy.random.seed(123456)
        particles = plummer.new_plummer_model(64)
        sha = hashlib.sha1()

        class inttypes(object):
            SHARED2 = 1
            EXTRAPOLATE = 5
            PASS_KDK = 2
            PASS_DKD = 7
            HOLD_KDK = 3
            HOLD_DKD = 8
            PPASS_DKD = 9
            BRIDGE_KDK = 4
            BRIDGE_DKD = 10
            CC = 11
            CC_KEPLER = 12
            OK = 13
            KEPLER = 14
            SHARED4 = 15
            SHARED6 = 18
            SHARED8 = 19
            SHARED10 = 20
            SHAREDBS = 21

            @classmethod
            def _list(cls):
                return set(
                    [x for x in cls.__dict__.keys() if not x.startswith('_')])

        for itype in sorted(inttypes._list()):
            if itype in ("KEPLER"): continue
            instance = Huayno()
            instance.parameters.inttype_parameter = getattr(
                Huayno.inttypes, itype)
            instance.particles.add_particles(particles)
            instance.evolve_model(0.125 | nbody_system.time)
            part_out = instance.particles.copy()
            position = part_out.position.number
            if hasattr(position, 'tobytes'):
                as_bytes = position.tobytes()
            else:
                as_bytes = numpy.array(position.data, copy=True, order='C')
            sha.update(as_bytes)

            instance.stop()

        # this result is probably dependent on system architecture hence no good for assert
        print
        print sha.hexdigest()
        print "8e71f9441578a43af4af927943577ad2c4130e4c"
コード例 #39
0
ファイル: test_huayno.py プロジェクト: mherkazandjian/amuse
 def test15(self):
     particles = plummer.new_plummer_model(512)
     expected_positions = None
     for mode in ["cpu", "openmp", "opencl"]:
         try:
             instance = Huayno(mode=mode, number_of_workers=1)#, debugger="xterm")
         except:
             print "Running huayno with mode=", mode, " was unsuccessful."
             continue
         else:
             print "Running huayno with mode=", mode, "... "
             
         instance.initialize_code()
         instance.parameters.epsilon_squared = 0.01 | nbody_system.length ** 2
         instance.particles.add_particles(particles)
         
         instance.evolve_model(0.2 | nbody_system.time)
         instance.synchronize_model()
         if expected_positions is None:
             expected_positions = instance.particles.position
         else:
             self.assertAlmostRelativeEquals(expected_positions, instance.particles.position, 8)
         instance.stop()
コード例 #40
0
ファイル: test_huayno.py プロジェクト: mherkazandjian/amuse
    def test7(self):
        print "Test7: Testing effect of Huayno 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 = Huayno(convert_nbody)
            instance.initialize_code()
            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))
コード例 #41
0
def orbit_evolve(bodies, time_peri, eta, n_steps=100):
  converter=nbody_system.nbody_to_si(1|units.MSun,1|units.AU)
  
  gravity = Huayno(converter,channel_type="sockets")
  gravity.particles.add_particles(bodies)
  gravity.commit_particles()
  gravity.parameters.timestep_parameter = eta
  
  channel_from_gravity_to_framework = gravity.particles.new_channel_to(bodies)
  
  Etot_init = gravity.kinetic_energy + gravity.potential_energy
  Etot = Etot_init
  
  file_snap = "orbit_ini.hdf5"
  
  t_end = 2.0*abs(time_peri.value_in(units.yr)) | units.yr
  dt = t_end / float(n_steps)
  time = 0.0 | units.yr
  
  while time <= t_end:
    
    gravity.evolve_model(time)
    channel_from_gravity_to_framework.copy()
    bodies.age = time
    
    # checking energy conservation
    Ekin = gravity.kinetic_energy
    Epot = gravity.potential_energy
    Etot = Ekin + Epot
    dE = Etot_init-Etot
    
    # output centerd on the bodies[0] star
    bodies.position -= bodies[0].position
    bodies.velocity -= bodies[0].velocity
    write_set_to_file(bodies, file_snap, "hdf5")
    
    rel_r = (bodies[1].position - bodies[0].position).lengths()
    print " \t\t", time, "\t", dE/Etot_init, rel_r.in_(units.AU)
    time += dt
  
  gravity.stop()
  bodies.position -= bodies[0].position
  bodies.velocity -= bodies[0].velocity
  print bodies
  
  return
コード例 #42
0
    def test2(self):
        convert_nbody = nbody_system.nbody_to_si(1.0 | units.MSun,
                                                 149.5e6 | units.km)

        instance = Huayno(convert_nbody)
        instance.initialize_code()
        instance.parameters.epsilon_squared = 0.0 | units.AU**2

        stars = self.new_system_of_sun_and_earth()
        earth = stars[1]
        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()

        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 = [t_x[1].value_in(units.AU) for t_x in x_points]
            y_points_in_AU = [t_x1[1].value_in(units.AU) for t_x1 in 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,
                                       "huayno-earth-sun2.svg")
            figure.savefig(output_file)

        instance.cleanup_code()
        del instance
コード例 #43
0
    def test14c(self):
        import hashlib

        numpy.random.seed(123456)
        particles = plummer.new_plummer_model(16)
        particles.mass *= 0.25
        p2 = plummer.new_plummer_model(16)
        p2.mass *= 0.75
        sha = hashlib.sha1()

        test_set = [
            "CONSTANT", "SHARED2", "EXTRAPOLATE", "PASS_KDK", "PASS_DKD",
            "HOLD_KDK", "HOLD_DKD", "PPASS_DKD", "BRIDGE_KDK", "BRIDGE_DKD",
            "CC", "CC_KEPLER", "CC_BS", "CC_BSA", "OK", "SHAREDBS", "SHARED4",
            "SHARED6", "SHARED8", "SHARED10"
        ]

        #~ test_set=["CC_BS"]

        for itype in test_set:
            #~ print()
            #~ print(itype)
            instance = Huayno(redirection="none")
            instance.parameters.inttype_parameter = Huayno.all_inttypes[itype]
            instance.parameters.accelerate_zero_mass = True
            instance.particles.add_particles(particles)
            instance.particles.add_particles(p2)
            E1 = instance.kinetic_energy + instance.potential_energy
            instance.evolve_model(0.125 | nbody_system.time)
            E2 = instance.kinetic_energy + instance.potential_energy
            #~ if itype!="CONSTANT":
            #~ self.assertLess(abs(E2-E1).number, 1.e-5)
            #~ print((E2-E1).number)
            part_out = instance.particles.copy()
            position = part_out.position.number
            if hasattr(position, 'tobytes'):
                as_bytes = position.tobytes()
            else:
                as_bytes = numpy.array(position.data, copy=True, order='C')
            sha.update(as_bytes)

            instance.stop()

        # this result is probably dependent on system architecture hence no good for assert
        print()
        print(sha.hexdigest())
        print("0af7eaea472989ea4be1bb0e2b8633d6b9af41e4")
コード例 #44
0
def timerun(N=1000,f_bin=1.,tend=0.25| nbody_system.time,inttype=Huayno.inttypes.HOLD_DKD,seed=12345678,logamin=-4):

  stars = plummer_w_binaries(N=N,f_bin=f_bin,seed=seed,logamin=logamin)
  code=Huayno()
  code.parameters.inttype_parameter=inttype
  code.parameters.timestep_parameter=0.01
  code.particles.add_particles(stars)

  E0=code.kinetic_energy+code.potential_energy
  p0=code.particles.total_momentum()
  t1=time()
  code.evolve_model(tend)
  t2=time()
  E=code.kinetic_energy+code.potential_energy
  p=code.particles.total_momentum()
  code.stop()
  return t2-t1,abs((E0-E)/E0),p0-p
コード例 #45
0
def initialize_huayno(bodies, converter, huayno_eta):
  """ initialize huayno code """
  gravity = Huayno(converter,channel_type="sockets")
  gravity.particles.add_particles(bodies) # either bodies or just stars
  gravity.commit_particles()
  #gravity.set_timestep_parameter(huayno_eta)
  gravity.parameters.timestep_parameter = huayno_eta
  gravity.set_inttype_parameter(8) # CC_KEPLER
  
  """
  Huayno Options:
  (pass / hold / bridge / maybe shared? are described in the Huayno Paper)
        SHARED2=1
        EXTRAPOLATE=5
        PASS_KDK=2
        PASS_DKD=7
        HOLD_KDK=3
        HOLD_DKD=8 <<<<-------
        PPASS_DKD=9
        BRIDGE_KDK=4
        BRIDGE_DKD=10
        CC=11
        CC_KEPLER=12 <<<<-------
        OK=13
        KEPLER=14
        SHARED4=15
        SHARED6=18
        SHARED8=19
        SHARED10=20
        SHAREDBS=21    **BS**
        CCC=22
        CCC_KEPLER=23
        CC_BS=24    **BS**
        CCC_BS=25    **BS**
        BS_CC_KEPLER=26    **BS**
        CC_BSA=27    **BS** ???
        CCC_BSA=28    **BS** ???
        SHARED2_COLLISIONS=29
        SHARED4_COLLISIONS=30
        SHARED6_COLLISIONS=31
        SHARED8_COLLISIONS=32
        SHARED10_COLLISIONS=33
  """

  return gravity
コード例 #46
0
    def test14(self):
        import hashlib

        numpy.random.seed(123456)
        particles = plummer.new_plummer_model(32)
        sha = hashlib.sha1()

        test_set = [
            "CONSTANT", "SHARED2", "EXTRAPOLATE", "PASS_KDK", "PASS_DKD",
            "HOLD_KDK", "HOLD_DKD", "PPASS_DKD", "BRIDGE_KDK", "BRIDGE_DKD",
            "CC", "CC_KEPLER", "CC_BS", "CC_BSA", "OK", "SHAREDBS", "SHARED4",
            "SHARED6", "SHARED8", "SHARED10"
        ]

        #~ test_set=["CONSTANT"]

        for itype in test_set:
            #~ print()
            #~ print(itype)
            instance = Huayno()
            instance.parameters.inttype_parameter = Huayno.all_inttypes[itype]
            #~ instance.parameters.accelerate_zero_mass=False
            instance.particles.add_particles(particles)
            E1 = instance.kinetic_energy + instance.potential_energy
            instance.evolve_model(0.125 | nbody_system.time)
            E2 = instance.kinetic_energy + instance.potential_energy
            if itype != "CONSTANT":
                self.assertLess(abs(E2 - E1).number, 1.e-5)
            #~ print((E2-E1).number)

            part_out = instance.particles.copy()
            position = part_out.position.number
            if hasattr(position, 'tobytes'):
                as_bytes = position.tobytes()
            else:
                as_bytes = numpy.array(position.data, copy=True, order='C')
            sha.update(as_bytes)

            instance.stop()

        # this result is probably dependent on system architecture hence no good for assert
        print()
        print(sha.hexdigest())
        print("4f2aac4d8761f3b07545dcea53f1a65f84a5275b")
コード例 #47
0
ファイル: test_huayno.py プロジェクト: mherkazandjian/amuse
 def test2(self):
     convert_nbody = nbody_system.nbody_to_si(1.0 | units.MSun, 149.5e6 | units.km)
 
     instance = Huayno(convert_nbody)
     instance.initialize_code()
     instance.parameters.epsilon_squared = 0.0 | units.AU**2
     
     stars = self.new_system_of_sun_and_earth()
     earth = stars[1]
     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()
     
     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, "huayno-earth-sun2.svg")
         figure.savefig(output_file)
           
     instance.cleanup_code()
     del instance
コード例 #48
0
ファイル: test_huayno.py プロジェクト: omuse-geoscience/amuse
 def test29(self):
     instance = Huayno()
     instance.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 = ([-1,0,0], [2,0,0] )| nbody_system.speed
     particles.radius = 0| nbody_system.length
     particles.mass = 0.1| nbody_system.mass
             
     instance.particles.add_particles(particles)
     instance.stopping_conditions.out_of_box_detection.enable()
     instance.parameters.stopping_conditions_out_of_box_size = 2 | nbody_system.length
     instance.parameters.stopping_conditions_out_of_box_use_center_of_mass = False
     instance.evolve_model(1 | nbody_system.time)
     self.assertTrue(instance.stopping_conditions.out_of_box_detection.is_set())
     self.assertEqual(len(instance.stopping_conditions.out_of_box_detection.particles(0)), 1)
     self.assertEqual(instance.stopping_conditions.out_of_box_detection.particles(0)[0].key, particles[1].key)
     instance.stop()
コード例 #49
0
    def test27(self):
        particles = plummer.new_plummer_model(31)

        tend = 0.25 | nbody_system.time

        instance = Huayno()
        instance.particles.add_particles(particles)
        instance.evolve_model(tend)
        expected_positions = instance.particles.position
        self.assertEqual(instance.model_time, tend)
        instance.stop()

        particles2 = particles.copy()
        particles2.velocity *= -1

        instance = Huayno()
        instance.particles.add_particles(particles2)
        instance.evolve_model(-tend)
        positions = instance.particles.position
        self.assertEqual(instance.model_time, -tend)
        instance.stop()

        self.assertAlmostEqual(positions, expected_positions)
コード例 #50
0
ファイル: bin_planet.py プロジェクト: Ingwar/amuse
def test_run():        
    three=binary_with_planet(
      m1=0.6897 | units.MSun,m2=0.20255 | units.MSun,m_planet=0.333 | units.MJupiter,
      r1=0.6489 | units.RSun,r2=0.22623 | units.RSun,r_planet=0.754 | units.RJupiter,
      ecc_binary=0.15944,P_binary=41.08| units.day,ecc_planet=0.00685,a_planet=.7048 | units.AU,
      pangle_planet=0.) 

    convert=nbody_system.nbody_to_si(1|units.MSun,1|units.AU)
    code=Huayno(convert)
    
    code.parameters.inttype_parameter=code.inttypes.SHARED4
    code.parameters.timestep_parameter=0.1
    
#    tend=100. | units.yr
    tend=100. | units.day
    snapfreq=1
    
    dt=10. | units.day
#    dt=convert.to_si( 1. | nbody_system.time).in_(units.day)
    
    code.particles.add_particles(three)

    x = AdaptingVectorQuantity()
    y = AdaptingVectorQuantity()
    z = AdaptingVectorQuantity()
    vx = AdaptingVectorQuantity()
    vy = AdaptingVectorQuantity()
    vz = AdaptingVectorQuantity()
    x.append(code.particles.x)
    y.append(code.particles.y)
    z.append(code.particles.z)
    vx.append(code.particles.vx)
    vy.append(code.particles.vy)
    vz.append(code.particles.vz)
    ts=[0.]
    E0=code.potential_energy+code.kinetic_energy    
    dE=[1.e-14]
    t=0. | units.day
    i=0
    while(t < tend-dt/2):
        i+=1
        t=t+dt
        if i%snapfreq==0:
          print t
          ts.append(t.value_in(units.day))
          code.evolve_model(t)
          x.append(code.particles.x)
          y.append(code.particles.y)
          z.append(code.particles.z)
          vx.append(code.particles.vx)
          vy.append(code.particles.vy)
          vz.append(code.particles.vz)
          E=code.potential_energy+code.kinetic_energy    
          dE.append(abs(((E-E0)/E0)))
    code.stop()

    a,eps,pangle=elements(three.total_mass(),
    x[:,2],
    y[:,2],
    z[:,2],
    vx[:,2],
    vy[:,2],
    vz[:,2])

    x=x.value_in(units.AU)
    y=y.value_in(units.AU)
    
    a=a.value_in(units.AU)
    eps=eps
    
    print a[-1],eps[-1],pangle[-1]

    f=pyplot.figure(figsize=(8,8))
    pyplot.plot(x[:,0],y[:,0],'r.')
    pyplot.plot(x[:,1],y[:,1],'g.')
    pyplot.plot(x[:,2],y[:,2],'b.')
    pyplot.xlim(-3,3)
    pyplot.ylim(-3,3)
    pyplot.xlabel('AU')
    pyplot.savefig('three_16b.eps')

    f=pyplot.figure(figsize=(8,8))
    pyplot.semilogy(ts,dE,'g.')
    pyplot.xlabel('time (day)')
    pyplot.ylabel('dE/E0')
    pyplot.savefig('three_16b_eerr.eps')

    f=pyplot.figure(figsize=(8,8))
    pyplot.plot(ts,a,'g.')
    pyplot.xlabel('time (day)')
    pyplot.ylabel('a (AU)')
    pyplot.savefig('three_16b_a.eps')

    f=pyplot.figure(figsize=(8,8))
    pyplot.plot(ts,eps,'g.')
    pyplot.xlabel('time (day)')
    pyplot.ylabel('eccentricity')
    pyplot.savefig('three_16b_ecc.eps')

    f=pyplot.figure(figsize=(8,8))
    pyplot.plot(ts,pangle,'g.')
    pyplot.xlabel('time (day)')
    pyplot.ylabel('long. of periapsis')
    pyplot.savefig('three_16b_pangle.eps')
コード例 #51
0
def integrate_disk_flyby(stars, planetesimals, t_end, n_steps,
                         snap_dir, file_out, file_redir, huayno_eta):
  converter=nbody_system.nbody_to_si(1|units.MSun,1|units.AU)
  
  planetesimals.position += stars[0].position
  planetesimals.velocity += stars[0].velocity
  
  bodies = ParticlesSuperset([stars, planetesimals])
  
  if file_redir is None:
    gravity = Huayno(converter, channel_type="sockets",
                       mode="openmp") # Add this (specify a number of cores)
  elif file_redir=="0":
    gravity = Huayno(converter, channel_type="sockets", redirection="none",
                       mode="openmp")
  else:
    gravity = Huayno(converter, channel_type="sockets", redirection="file", redirect_file=file_redir,
                       mode="openmp")
                       
  gravity.particles.add_particles(bodies)
  gravity.commit_particles()
  gravity.parameters.timestep_parameter = huayno_eta
  time_step = gravity.get_timestep_parameter()
  #gravity.set_inttype_parameter(12)
  #gravity.set_inttype_parameter(8)
  gravity.set_eps2_parameter(0.001*0.001) # Softening Parameter
  print ' ** timestep: ', gravity.get_timestep_parameter()
  print ' ** inttype: ', gravity.get_inttype_parameter()
  print ' ** eps2: ', gravity.get_eps2_parameter(), numpy.sqrt(gravity.get_eps2_parameter())
  
  t0 = time.time()
  evolve_disk_flyby(bodies, gravity, 
                    t_end, n_steps, converter, snap_dir, file_out)
  t1= time.time()
  dt = t1-t0
  print "Performace data: N =", len(bodies), "dt=", dt, "s =", dt/60.0, "min"
  
  return
コード例 #52
0
ファイル: evolution_cluster.py プロジェクト: amusecode/amuse
    def evolution_of_the_cluster(self, cluster):
        '''
        Function that makes de cluster evolution.
        input: cluster -> defined in an inertial frame (centered at the
        Galactic center)
        steps in this function:
        1. From cluster, another cluster is defined in a rotating frame
        2. The gravity code is initialized
        3. The stellar evolution is initialized
        4. the Galaxy model is constructed
        5. The Galaxy and the cluster in the rotating frame are coupled via the
        Rotating Bridge
        6. The evolution of the system is made
        7. the cluster properties are transformed back to the inertial frame
        '''

        cluster_in_rotating_frame = self.creation_cluster_in_rotating_frame(
            cluster)

        # N body code
        epsilon = self.softening(cluster)
        convert_nbody = nbody_system.nbody_to_si(
                cluster.mass.sum(), cluster.virial_radius())

        gravity = Huayno(convert_nbody)
        gravity.parameters.timestep = self.dt_bridge/3.
        gravity.particles.add_particles(cluster_in_rotating_frame)
        gravity.parameters.epsilon_squared = epsilon**2
        channel_from_gravity_to_rotating_cluster = \
            gravity.particles.new_channel_to(
                    cluster_in_rotating_frame)
        channel_from_rotating_cluster_to_gravity = \
            cluster_in_rotating_frame.new_channel_to(gravity.particles)

        # stellar evolution code
        se = SeBa()
        se.particles.add_particles(cluster_in_rotating_frame)
        channel_from_rotating_cluster_to_se = \
            cluster_in_rotating_frame.new_channel_to(se.particles)
        channel_from_se_to_rotating_cluster = se.particles.new_channel_to(
            cluster_in_rotating_frame)

        # Galaxy model and Rotating bridge
        MW = self.galactic_model()
        system = Rotating_Bridge(
                self.omega_system,
                timestep=self.dt_bridge,
                verbose=False,
                method=self.method)
        system.add_system(gravity, (MW,), False)
        system.add_system(MW, (), False)

        X = []
        Y = []
        T = []
        # Cluster evolution
        while (self.time <= self.t_end-self.dt_bridge/2):
            self.time += self.dt_bridge

            system.evolve_model(self.time)
            se.evolve_model(self.time)

            channel_from_gravity_to_rotating_cluster.copy_attributes(
                    ['x', 'y', 'z', 'vx', 'vy', 'vz'])
            channel_from_se_to_rotating_cluster.copy_attributes(
                    [
                        'mass', 'radius', 'luminosity', 'age', 'temperature',
                        'stellar_type'
                        ]
                    )
            channel_from_rotating_cluster_to_gravity.copy_attributes(['mass'])
            self.from_noinertial_to_cluster_in_inertial_frame(
                cluster_in_rotating_frame, cluster)

            time = self.time.value_in(units.Myr)
            cm = cluster.center_of_mass()

            # write data
            if ((time == 2) or (time == 50) or (time == 100) or (time == 150)):
                X.append((cluster.x-cm[0]).value_in(units.kpc))
                Y.append((cluster.y-cm[1]).value_in(units.kpc))
                T.append(time)

        gravity.stop()
        se.stop()
        return T, X, Y
コード例 #53
0
def evolve_triple_with_wind(M1, M2, M3, Pora, Pin_0, ain_0, aout_0,
                            ein_0, eout_0, t_end, nsteps, scheme, integrator,
                            t_stellar, dt_se, dtse_fac, interp):

    import random
    from amuse.ext.solarsystem import get_position

    numpy.random.seed(42)

    print("Initial masses:", M1, M2, M3)
    triple = Particles(3)
    triple[0].mass = M1
    triple[1].mass = M2
    triple[2].mass = M3
    stellar = SeBa()
    stellar.particles.add_particles(triple)
    channel_from_stellar = stellar.particles.new_channel_to(triple)

    # Evolve to t_stellar.
    
    stellar.evolve_model(t_stellar)
    channel_from_stellar.copy_attributes(["mass"])
    M1 = triple[0].mass
    M2 = triple[1].mass
    M3 = triple[2].mass
    print("t=", stellar.model_time.in_(units.Myr))
    print("M=", stellar.particles.mass.in_(units.MSun))
    print("R=", stellar.particles.radius.in_(units.RSun))
    print("L=", stellar.particles.luminosity.in_(units.LSun))
    print("T=", stellar.particles.temperature.in_(units.K))
    print("Mdot=", \
        -stellar.particles.wind_mass_loss_rate.in_(units.MSun/units.yr))

    # Start the dynamics.
    # Inner binary:
    
    tmp_stars = Particles(2)
    tmp_stars[0].mass = M1
    tmp_stars[1].mass = M2

    if Pora == 1:
        ain_0 = semimajor_axis(Pin_0, M1+M2)
    else:
        Pin_0 = orbital_period(ain_0, M1+M2)
    print('Pin =', Pin_0)
        
    print('ain_0 =', ain_0)
    print('M1+M2 =', M1+M2)
    print('Pin_0 =', Pin_0.value_in(units.day), '[day]')
    #print 'semi:', semimajor_axis(Pin_0, M1+M2).value_in(units.AU), 'AU'
    #print 'period:', orbital_period(ain_0, M1+M2).value_in(units.day), '[day]'
    
    dt_init = 0.01*Pin_0
    ma = 180
    inc = 60
    aop = 180
    lon = 0
    r,v = get_position(M1, M2, ein_0, ain_0, ma, inc, aop, lon, dt_init)
    tmp_stars[1].position = r
    tmp_stars[1].velocity = v
    tmp_stars.move_to_center()

    # Outer binary:
    
    r,v = get_position(M1+M2, M3, eout_0, aout_0, 0, 0, 0, 0, dt_init)
    tertiary = Particle()
    tertiary.mass = M3
    tertiary.position = r
    tertiary.velocity = v
    tmp_stars.add_particle(tertiary)
    tmp_stars.move_to_center()

    triple.position = tmp_stars.position
    triple.velocity = tmp_stars.velocity

    Mtriple = triple.mass.sum()
    Pout = orbital_period(aout_0, Mtriple)

    print("T=", stellar.model_time.in_(units.Myr))
    print("M=", stellar.particles.mass.in_(units.MSun))
    print("Pout=", Pout.in_(units.Myr))
    print('tK =', ((M1+M2)/M3)*Pout**2*(1-eout_0**2)**1.5/Pin_0)

    converter = nbody_system.nbody_to_si(triple.mass.sum(), aout_0)

    if integrator == 0:
        gravity = Hermite(converter)
        gravity.parameters.timestep_parameter = 0.01
    elif integrator == 1:
        gravity = SmallN(converter)
        gravity.parameters.timestep_parameter = 0.01
        gravity.parameters.full_unperturbed = 0
    elif integrator == 2:
        gravity = Huayno(converter)
        gravity.parameters.inttype_parameter = 20
        gravity.parameters.timestep = (1./256)*Pin_0
    else:
        gravity = symple(converter)
        gravity.parameters.integrator = 10
        #gravity.parameters.timestep_parameter = 0.
        gravity.parameters.timestep = (1./128)*Pin_0

    print(gravity.parameters)

    gravity.particles.add_particles(triple)
    channel_from_framework_to_gd = triple.new_channel_to(gravity.particles)
    channel_from_gd_to_framework = gravity.particles.new_channel_to(triple)
    
    Etot_init = gravity.kinetic_energy + gravity.potential_energy
    Etot_prev = Etot_init

    gravity.particles.move_to_center()

    # Note: time = t_diag = 0 at the start of the dynamical integration.
    
    dt_diag = t_end/float(nsteps)
    t_diag = dt_diag
    time = 0.0 | t_end.unit
    t_se = t_stellar + time

    print('t_end =', t_end)
    print('dt_diag =', dt_diag)

    ain, ein, aout, eout = get_orbital_elements_of_triple(triple)
    print("Triple elements t=",  time,  \
        "inner:", triple[0].mass, triple[1].mass, ain, ein, \
        "outer:", triple[2].mass, aout, eout)

    t = [time.value_in(units.Myr)]
    Mtot = triple.mass.sum()
    mtot = [Mtot.value_in(units.MSun)]
    smai = [ain/ain_0] 
    ecci = [ein/ein_0]
    smao = [aout/aout_0] 
    ecco = [eout/eout_0]

    if interp:
        
        # Create arrays of stellar times and masses for interpolation.

        times = [time]
        masses = [triple.mass.copy()]
        while time < t_end:
            time += dt_se
            stellar.evolve_model(t_stellar+time)
            channel_from_stellar.copy_attributes(["mass"])
            times.append(time)
            masses.append(triple.mass.copy())

        time = 0.0 | t_end.unit
        print('\ntimes:', times, '\n')

    # Evolve the system.
    
    def advance_stellar(t_se, dt):
        E0 = gravity.kinetic_energy + gravity.potential_energy
        t_se += dt

        if interp:
            t = t_se-t_stellar
            i = int(t/dt_se)
            mass = masses[i] + (t-times[i])*(masses[i+1]-masses[i])/dt_se
            triple.mass = mass
            #print 't_se =', t_se, 'masses =', mass
        else:
            stellar.evolve_model(t_se)
            channel_from_stellar.copy_attributes(["mass"])

        channel_from_framework_to_gd.copy_attributes(["mass"])
        return t_se, gravity.kinetic_energy + gravity.potential_energy - E0

    def advance_gravity(tg, dt):
        tg += dt
        gravity.evolve_model(tg)
        channel_from_gd_to_framework.copy()
        return tg

    while time < t_end:

        if scheme == 1:

            # Advance to the next diagnostic time.
            
            dE_se = zero
            dt = t_diag - time

            if dt > 0|dt.unit:
                time = advance_gravity(time, dt)

        elif scheme == 2:
            
            # Derive dt from Pin using dtse_fac.
            
            dt = dtse_fac*Pin_0
            if time + dt > t_diag: dt = t_diag - time

            if dt > 0|dt.unit:
                t_se, dE_se = advance_stellar(t_se, dt)
                time = advance_gravity(time, dt)
            
        elif scheme == 3:
            
            # Derive dt from Pin using dtse_fac.
            
            dt = dtse_fac*Pin_0
            if time + dt > t_diag: dt = t_diag - time

            if dt > 0|dt.unit:
                time = advance_gravity(time, dt)
                t_se, dE_se = advance_stellar(t_se, dt)
            
        elif scheme == 4:
            
            # Derive dt from Pin using dtse_fac.
            
            dt = dtse_fac*Pin_0
            if time + dt > t_diag: dt = t_diag - time

            if dt > 0|dt.unit:
                t_se, dE_se = advance_stellar(t_se, 0.5*dt)
                time = advance_gravity(time, dt)
                t_se, dE_se2 = advance_stellar(t_se, 0.5*dt)
                dE_se += dE_se2
            
        elif scheme == 5:

            # Use the specified dt_se.
            
            dE_se = zero
            dt = dt_se
            if time + dt > t_diag: dt = t_diag - time

            if dt > 0|dt.unit:

                # For use with symple only: set up average mass loss.
    
                channel_from_stellar.copy_attributes(["mass"])
                m0 = triple.mass.copy()
                stellar.evolve_model(t_se+dt)
                channel_from_stellar.copy_attributes(["mass"])
                t_se = stellar.model_time
                m1 = triple.mass
                dmdt = (m1-m0)/dt
                for i in range(len(dmdt)):
                    gravity.set_dmdt(i, dmdt[i])

                time = advance_gravity(time, dt)

        else:

            print('unknown option')
            sys.exit(0)

        if time >= t_diag:
            
            t_diag = time + dt_diag

            Ekin = gravity.kinetic_energy 
            Epot = gravity.potential_energy
            Etot = Ekin + Epot
            dE = Etot_prev - Etot
            Mtot = triple.mass.sum()
            print("T=", time, end=' ') 
            print("M=", Mtot, "(dM[SE]=", Mtot/Mtriple, ")", end=' ')
            print("E= ", Etot, "Q= ", Ekin/Epot, end=' ')
            print("dE=", (Etot_init-Etot)/Etot, "ddE=", (Etot_prev-Etot)/Etot, end=' ') 
            print("(dE[SE]=", dE_se/Etot, ")")
            Etot_init -= dE
            Etot_prev = Etot
            ain, ein, aout, eout = get_orbital_elements_of_triple(triple)
            print("Triple elements t=",  t_stellar + time,  \
                "inner:", triple[0].mass, triple[1].mass, ain, ein, \
                "outer:", triple[2].mass, aout, eout)

            t.append(time.value_in(units.yr))
            mtot.append(Mtot.value_in(units.MSun))
            smai.append(ain/ain_0)
            ecci.append(ein/ein_0)
            smao.append(aout/aout_0)
            ecco.append(eout/eout_0)

            if eout > 1 or aout <= zero:
                print("Binary ionized or merged")
                break

    gravity.stop()
    stellar.stop()

    return t, mtot, smai, ecci, smao, ecco
コード例 #54
0
ファイル: test_huayno.py プロジェクト: mherkazandjian/amuse
 def test1(self):
     convert_nbody = nbody_system.nbody_to_si(1.0 | units.MSun, 149.5e6 | units.km)
 
     huayno = Huayno(convert_nbody)
     huayno.initialize_code()
     huayno.parameters.epsilon_squared = 0.0 | units.AU**2
     
     stars = self.new_system_of_sun_and_earth()
     earth = stars[1]
     
     huayno.particles.add_particles(stars)
     
     huayno.evolve_model(365.0 | units.day)
     huayno.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.assertAlmostEqual(position_at_start, position_after_full_rotation, 6)
     
     huayno.evolve_model(365.0 + (365.0 / 2) | units.day)
     
     huayno.particles.copy_values_of_all_attributes_to(stars)
     position_after_half_a_rotation = earth.position.value_in(units.AU)[0]
     self.assertAlmostEqual(-position_at_start, position_after_half_a_rotation, 2)
             
     huayno.evolve_model(365.0 + (365.0 / 2) + (365.0 / 4)  | units.day)
     
     huayno.particles.copy_values_of_all_attributes_to(stars)
     position_after_half_a_rotation = earth.position.value_in(units.AU)[1]
     self.assertAlmostEqual(-position_at_start, position_after_half_a_rotation, 3)
     
     huayno.cleanup_code()
     
     huayno.stop()
コード例 #55
0
    def test1(self):
        convert_nbody = nbody_system.nbody_to_si(1.0 | units.MSun,
                                                 149.5e6 | units.km)

        huayno = Huayno(convert_nbody)
        huayno.initialize_code()
        huayno.parameters.epsilon_squared = 0.0 | units.AU**2

        stars = self.new_system_of_sun_and_earth()
        earth = stars[1]

        huayno.particles.add_particles(stars)

        huayno.evolve_model(365.0 | units.day)
        huayno.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.assertAlmostEqual(position_at_start, position_after_full_rotation,
                               6)

        huayno.evolve_model(365.0 + (365.0 / 2) | units.day)

        huayno.particles.copy_values_of_all_attributes_to(stars)
        position_after_half_a_rotation = earth.position.value_in(units.AU)[0]
        self.assertAlmostEqual(-position_at_start,
                               position_after_half_a_rotation, 2)

        huayno.evolve_model(365.0 + (365.0 / 2) + (365.0 / 4) | units.day)

        huayno.particles.copy_values_of_all_attributes_to(stars)
        position_after_half_a_rotation = earth.position.value_in(units.AU)[1]
        self.assertAlmostEqual(-position_at_start,
                               position_after_half_a_rotation, 3)

        huayno.cleanup_code()

        huayno.stop()