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
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
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
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
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
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
Exemple #7
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))
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
Exemple #9
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.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))