Exemple #1
0
def test_kepler(N=10000, tend=1.| units.yr,method=0):

  numpy.random.seed(12345)

  conv=nbody_system.nbody_to_si(2.| units.MSun, 5.|units.AU)

  comets=new_plummer_model(N,conv)

  sun=Particle(mass=1.|units.MSun)

  sun.position=[0,0,0]|units.AU
  sun.velocity=[0,0,0]|units.kms

  comets.mass*=0.

  code=Kepler(conv,redirection="none")

  code.set_method(method)

  code.central_particle.add_particle(sun)
  code.orbiters.add_particles(comets)

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


#  print code.orbiters.x[0]
  print orbital_elements_from_binary(code.particles[0:2],constants.G)

  t1=time.time()
  code.evolve_model(tend)
  t2=time.time()

  print orbital_elements_from_binary(code.particles[0:2],constants.G)
#  print code.orbiters.x[0]



  a,eps=elements(sun.mass,code.orbiters.x,code.orbiters.y,code.orbiters.z,
                     code.orbiters.vx,code.orbiters.vy,code.orbiters.vz)

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

  dev=numpy.where(da > 0.00001)[0]
  print len(dev)

  print a0[dev].value_in(units.AU)
  print eps0[dev]

#  pyplot.plot(a0[dev].value_in(units.AU),eps0[dev],"ro")
#  pyplot.plot(a[dev].value_in(units.AU),eps[dev],"g+")

  print "max da,deps:",da.max(), deps.max()

  print "time:",t2-t1

#  pyplot.show()

  return t2-t1,da.max(),deps.max()
def supernova_in_binary_nbody(M0, m0, a0, tsn):
    stars = make_circular_binary(M0, m0, a0)
    M, m, a, e, ta_out, inc, lan_out, aop_out = orbital_elements_from_binary(stars, G=constants.G)
    print "Initial binary: a=", a.in_(units.AU), "e=", e, "M=", stars[0].mass, "and m=", stars[1].mass

    converter = nbody_system.nbody_to_si(M+m, a)
    gravity = Hermite(converter)
    gravity.particles.add_particles(stars)

    print "Integrate binary to t=", tsn.in_(units.day)
    gravity.evolve_model(tsn)
    M, m, a, e, ta_out, inc, lan_out, aop_out = orbital_elements_from_binary(stars, G=constants.G)
    print "Pre supernova orbit: a=", a.in_(units.AU), "e=", e
    stars[0].mass *= 0.1
    print "Reduce stellar mass to: M=", stars[0].mass, "and m=", stars[1].mass

    v_kick = (0, 0, 0) | units.kms
    stars[0].velocity += v_kick
    gravity.evolve_model(2*tsn)
    M, m, a, e, ta_out, inc, lan_out, aop_out = orbital_elements_from_binary(stars, G=constants.G)
    print "Post supernova orbit: a=", a.in_(units.AU), "e=", e

    r0 = a
    a_ana = post_supernova_semimajor_axis(M0, m0, stars[0].mass, stars[1].mass, a, r0)
    e_ana = post_supernova_eccentricity(M0, m0, stars[0].mass, stars[1].mass, a, r0)
    print "Analytic solution to post orbit orbital parameters: a=", a_ana, "e=", e_ana
    gravity.stop()
Exemple #3
0
def crash_test(method=1):
  code=Kepler(redirection="none")

  code.set_method(method)

  smu=1.224744871391589
  mu=smu**2
  r0=2.787802728537455
  rv0=-0.9899959571994231
  alpha=0.01380749549277993
  smudt=2.809925892593303
  v02=(mu*(2/r0-alpha))
  vx=rv0
  vy=(v02-vx**2)**0.5

  sun=Particle()
  sun.mass=mu | nbody_system.mass
  sun.x=0. | nbody_system.length
  sun.y=0. | nbody_system.length
  sun.z=0. | nbody_system.length
  sun.vx=0. | nbody_system.speed
  sun.vy=0. | nbody_system.speed
  sun.vz=0. | nbody_system.speed

  comet=Particle()
  comet.mass= 0 | nbody_system.mass
  comet.x=r0| nbody_system.length
  comet.y=0. | nbody_system.length
  comet.z=0. | nbody_system.length
  comet.vx=vx | nbody_system.speed
  comet.vy=vy | nbody_system.speed
  comet.vz=0. | nbody_system.speed

  tend=(smudt/smu) | nbody_system.time
  print tend

  code.central_particle.add_particle(sun)
  code.orbiters.add_particle(comet)

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

  print orbital_elements_from_binary(code.particles[0:2])

  t1=time.time()
  code.evolve_model(tend)
  t2=time.time()

  print orbital_elements_from_binary(code.particles[0:2])

  print code.orbiters.position

  a,eps=elements(sun.mass,code.orbiters.x,code.orbiters.y,code.orbiters.z,
                     code.orbiters.vx,code.orbiters.vy,code.orbiters.vz,G=nbody_system.G)

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

  print da,deps
  print "time:",t2-t1
def supernova_in_binary_nbody(M0, m0, a0, tsn):
    stars = make_circular_binary(M0, m0, a0)
    M, m, a, e, ta_out, inc, lan_out, aop_out = orbital_elements_from_binary(
        stars, G=constants.G)
    print "Initial binary: a=", a.in_(
        units.AU), "e=", e, "M=", stars[0].mass, "and m=", stars[1].mass

    converter = nbody_system.nbody_to_si(M + m, a)
    gravity = Hermite(converter)
    gravity.particles.add_particles(stars)

    print "Integrate binary to t=", tsn.in_(units.day)
    gravity.evolve_model(tsn)
    M, m, a, e, ta_out, inc, lan_out, aop_out = orbital_elements_from_binary(
        stars, G=constants.G)
    print "Pre supernova orbit: a=", a.in_(units.AU), "e=", e
    stars[0].mass *= 0.1
    print "Reduce stellar mass to: M=", stars[0].mass, "and m=", stars[1].mass

    v_kick = (0, 0, 0) | units.kms
    stars[0].velocity += v_kick
    gravity.evolve_model(2 * tsn)
    M, m, a, e, ta_out, inc, lan_out, aop_out = orbital_elements_from_binary(
        stars, G=constants.G)
    print "Post supernova orbit: a=", a.in_(units.AU), "e=", e

    r0 = a
    a_ana = post_supernova_semimajor_axis(M0, m0, stars[0].mass, stars[1].mass,
                                          a, r0)
    e_ana = post_supernova_eccentricity(M0, m0, stars[0].mass, stars[1].mass,
                                        a, r0)
    print "Analytic solution to post orbit orbital parameters: a=", a_ana, "e=", e_ana
    gravity.stop()
def get_orbital_elements_of_triple(stars):
    inner_binary = stars[0] + stars[1]
    outer_binary = Particles(1)
    outer_binary[0].mass = inner_binary.mass.sum()
    outer_binary[0].position = inner_binary.center_of_mass()
    outer_binary[0].velocity = inner_binary.center_of_mass_velocity()
    outer_binary.add_particle(stars[2])
    M1, M2, ain, ein, ta_in, inc_in, lan_in, aop_in = orbital_elements_from_binary(inner_binary, G=constants.G)
    M12, M3, aout, eout, ta_out, outc_out, lan_out, aop_out = orbital_elements_from_binary(outer_binary, G=constants.G)
    return ain, ein, aout, eout
Exemple #6
0
def test_kepler_almost_parabolic(tend=1, method=0):
    code = Kepler(redirection="none")

    code.set_method(method)

    mass1 = 1. | nbody_system.mass
    mass2 = 0 | nbody_system.mass
    semimajor_axis = 1. | nbody_system.length
    eccentricity = 0.9999999
    p = 2 * numpy.pi * (semimajor_axis**3 / nbody_system.G / mass1)**0.5
    tend = tend * p
    print(tend)
    parts = new_binary_from_orbital_elements(mass1,
                                             mass2,
                                             semimajor_axis,
                                             eccentricity=eccentricity,
                                             true_anomaly=0.0102121)

    code.central_particle.add_particle(parts[0])
    code.orbiters.add_particle(parts[1])

    a0, eps0 = elements(mass1,
                        code.orbiters.x,
                        code.orbiters.y,
                        code.orbiters.z,
                        code.orbiters.vx,
                        code.orbiters.vy,
                        code.orbiters.vz,
                        G=nbody_system.G)

    print(orbital_elements_from_binary(code.particles[0:2]))

    t1 = time.time()
    code.evolve_model(tend)
    t2 = time.time()

    print(orbital_elements_from_binary(code.particles[0:2]))

    print(code.orbiters.position)

    a, eps = elements(mass1,
                      code.orbiters.x,
                      code.orbiters.y,
                      code.orbiters.z,
                      code.orbiters.vx,
                      code.orbiters.vy,
                      code.orbiters.vz,
                      G=nbody_system.G)

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

    print(da, deps)
    print("time:", t2 - t1)
Exemple #7
0
def get_orbital_elements_of_triple(stars):
    inner_binary = stars[0]+stars[1]
    outer_binary = Particles(1)
    outer_binary[0].mass = inner_binary.mass.sum()
    outer_binary[0].position = inner_binary.center_of_mass()
    outer_binary[0].velocity = inner_binary.center_of_mass_velocity()
    outer_binary.add_particle(stars[2])
    M1, M2, ain, ein, ta_in, inc_in, lan_in, aop_in \
        = orbital_elements_from_binary(inner_binary, G=constants.G)
    M12, M3, aout, eout, ta_out, outc_out, lan_out, aop_out \
        = orbital_elements_from_binary(outer_binary, G=constants.G)
    return ain, ein, aout, eout
Exemple #8
0
def test_kepler_parabolic( tend=1,method=0, sign=+1):
  code=Kepler(redirection="none")

  code.set_method(method)

  sun=Particle()
  sun.mass=1. | nbody_system.mass
  sun.x=0. | nbody_system.length
  sun.y=0. | nbody_system.length
  sun.z=0. | nbody_system.length
  sun.vx=0. | nbody_system.speed
  sun.vy=0. | nbody_system.speed
  sun.vz=0. | nbody_system.speed

  comet=Particle()
  comet.mass= 0 | nbody_system.mass
  comet.x=1. | nbody_system.length
  comet.y=0. | nbody_system.length
  comet.z=0. | nbody_system.length
  comet.vx=0. | nbody_system.speed
  comet.vy=(1.0 + sign * 1.0e-10)*(2*nbody_system.G*sun.mass/comet.x)**0.5
  comet.vz=0. | nbody_system.speed

  tend=tend | nbody_system.time
  print tend

  code.central_particle.add_particle(sun)
  code.orbiters.add_particle(comet)

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

  print orbital_elements_from_binary(code.particles[0:2])

  t1=time.time()
  code.evolve_model(tend)
  t2=time.time()

  print orbital_elements_from_binary(code.particles[0:2])

  print code.orbiters.position

  a,eps=elements(sun.mass,code.orbiters.x,code.orbiters.y,code.orbiters.z,
                     code.orbiters.vx,code.orbiters.vy,code.orbiters.vz,G=nbody_system.G)

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

  print da,deps
  print "time:",t2-t1
def kepler_orbital_elements_from_binary(two_bodies, angle=True):
    """ 
    Kepler orbital elements from two bodies 
    If angle, return angle. else return cos(angle) for angle orbital elements
    """
    if not angle:
        return (orbital_elements_from_binary(two_bodies))
    else:
        mass1, mass2, semimajor_axis, eccentricity, \
        true_anomaly, inclination, long_asc_node, arg_per \
           = orbital_elements_from_binary(two_bodies)

        return mass1, mass2, semimajor_axis, eccentricity, \
               math.acos(true_anomaly), math.acos(inclination), \
               math.acos(long_asc_node), math.acos(arg_per)
def kepler_orbital_elements_from_binary(two_bodies, angle = True):
    """ 
    Kepler orbital elements from two bodies 
    If angle, return angle. else return cos(angle) for angle orbital elements
    """
    if not angle:
       return (orbital_elements_from_binary(two_bodies))
    else:
       mass1, mass2, semimajor_axis, eccentricity, \
       true_anomaly, inclination, long_asc_node, arg_per \
          = orbital_elements_from_binary(two_bodies)
          
       return mass1, mass2, semimajor_axis, eccentricity, \
              math.acos(true_anomaly), math.acos(inclination), \
              math.acos(long_asc_node), math.acos(arg_per)
Exemple #11
0
def evolve_model(end_time, double_star, stars):
    converter = nbody_system.nbody_to_si(double_star.mass,
                                         double_star.semimajor_axis)

    gravity = Hermite(converter)
    gravity.particles.add_particle(stars)
    to_stars = gravity.particles.new_channel_to(stars)
    # from_stars = stars.new_channel_to(gravity.particles)

    time = 0 | units.yr
    dt = end_time / 100.
    a = [] | units.au
    t = [] | units.yr
    while time < end_time:
        time += dt
        gravity.evolve_model(1 | units.yr)
        to_stars.copy()
        orbital_elements = orbital_elements_from_binary(stars, G=constants.G)
        a.append(orbital_elements[2])
        t.append(time)
    gravity.stop()

    from matplotlib import pyplot
    pyplot.scatter(t.value_in(units.yr), a.value_in(units.au))
    pyplot.show()
Exemple #12
0
def resolve_close_encounter(time, bodies):
    orbital_elements = orbital_elements_from_binary(bodies, G=constants.G)
    a = orbital_elements[2]
    e = orbital_elements[3]
    p = a*(1-e)
    print "Close encounter at t=",  time.in_(units.Myr), "a=", a.in_(units.AU), "e=", e, "p=", p.in_(units.AU), "M=", bodies.mass.max().in_(units.MSun), bodies.mass.min().in_(units.MSun) 
    truncate_disks_due_to_encounter(bodies, p)
Exemple #13
0
def calculate_orbital_elements(star, planet):
    p = Particles()
    p.add_particle(star)
    p.add_particle(planet)
    M, m, a, e, ta_out, inc_out, lan_out, aop_out \
        = orbital_elements_from_binary(p, G=constants.G)
    return a, e
Exemple #14
0
def orbital_elements(*args, **kwargs):
    if 'G' not in kwargs:
        kwargs['G'] = constants.G

    m1, m2, a, e, f, i, W, w = orbital_elements_amuse.orbital_elements_from_binary(
        *args, **kwargs)

    if f < 0:
        f += 360
    if i < 0:
        i += 360
    if w < 0:
        w += 360
    if W < 0:
        W += 360

    if 'angle' in kwargs:
        if kwargs['angle'] == 'radians':
            i_rad = numpy.radians(i)
            W_rad = numpy.radians(W)
            w_rad = numpy.radians(w)
            f_rad = numpy.radians(f)
            return a, e, i_rad, w_rad, W_rad, f_rad
        else:
            return a, e, i, w, W, f
    else:
        return a, e, i, w, W, f
Exemple #15
0
def calculate_orbital_elements(star, planet):

    p = Particles()
    p.add_particle(star)
    p.add_particle(planet)
    M, m, a, e, ta_out, outc_out, lan_out, aop_out = orbital_elements_from_binary(p, G=constants.G)
    return a, e
Exemple #16
0
def main(t_end, dt):
    stars = init_sun_jupiter()
    Sun = stars[0]
    Jupiter = stars[1]
    orbit0 = orbital_elements_from_binary(stars, G=constants.G)
    a0 = orbit0[2].in_(units.AU)
    e0 = orbit0[3]
    Hill_radius0 = a0 * (1 - e0) * (
        (1.0 | units.MJupiter).value_in(units.MSun) / 3.)**(1. / 3.)
    eps = 1 | units.RSun
    gravity = Gravity(ph4, stars, eps)

    N = 500
    Rmin = 1.0
    Rmax = 100.0
    converter = nbody_system.nbody_to_si(1.0 | units.MSun, 1.0 | units.AU)
    np.random.seed(1)
    disk = ProtoPlanetaryDisk(N, convert_nbody=converter, densitypower=1.5,\
                              Rmin=Rmin, Rmax=Rmax, q_out=1., discfraction=0.01)
    gas = disk.result
    gas.h_smooth = 0.06 | units.AU
    hydro = Hydro(Fi, gas, eps, dt)

    sink = init_sink_particle(0. | units.MSun, Hill_radius0, Jupiter.position,
                              Jupiter.velocity)
    hydro.particles.add_particles(sink)

    a_Jup, e_Jup, times = gravity_hydro_bridge(gravity, hydro, t_end, dt)

    return a_Jup, e_Jup, times
Exemple #17
0
def orbital_elements(*args, **kwargs):
    if 'G' not in kwargs:
        kwargs['G'] = constants.G

    m1, m2, a, e, f, i, W, w = orbital_elements_amuse.orbital_elements_from_binary(*args, **kwargs)

    if f < 0:
        f += 360
    if i < 0:
        i += 360
    if w < 0:
        w += 360
    if W < 0:
        W += 360

    if 'angle' in kwargs:
        if kwargs['angle'] == 'radians':
            i_rad = numpy.radians(i)
            W_rad = numpy.radians(W)
            w_rad = numpy.radians(w)
            f_rad = numpy.radians(f)
            return a, e, i_rad, w_rad, W_rad, f_rad
        else:
            return a, e, i, w, W, f
    else:
        return a, e, i, w, W, f 
def calculate_orbital_elements(star, planet):
    from amuse.ext.orbital_elements import orbital_elements_from_binary

    p = Particles()
    p.add_particle(star)
    p.add_particle(planet)
    M, m, a, e, ta_out, inc, lan_out, aop_out = orbital_elements_from_binary(p, G=constants.G)
    #print "Orbital elements:", M, m, a, e, ta_out, inc, lan_out, aop_out
    return a, e, inc
Exemple #19
0
def test_kepler_almost_parabolic( tend=1,method=0):
  code=Kepler(redirection="none")

  code.set_method(method)

  mass1=1.| nbody_system.mass
  mass2=0| nbody_system.mass
  semimajor_axis=1.|nbody_system.length
  eccentricity=0.9999999
  p=2*numpy.pi*(semimajor_axis**3/nbody_system.G/mass1)**0.5
  tend=tend*p
  print tend
  parts=new_binary_from_orbital_elements(
          mass1,
          mass2,
          semimajor_axis,
          eccentricity = eccentricity,
          true_anomaly = 0.0102121
      )

  code.central_particle.add_particle(parts[0])
  code.orbiters.add_particle(parts[1])

  a0,eps0=elements(mass1,code.orbiters.x,code.orbiters.y,code.orbiters.z,
                     code.orbiters.vx,code.orbiters.vy,code.orbiters.vz,G=nbody_system.G)

  print orbital_elements_from_binary(code.particles[0:2])

  t1=time.time()
  code.evolve_model(tend)
  t2=time.time()

  print orbital_elements_from_binary(code.particles[0:2])

  print code.orbiters.position

  a,eps=elements(mass1,code.orbiters.x,code.orbiters.y,code.orbiters.z,
                     code.orbiters.vx,code.orbiters.vy,code.orbiters.vz,G=nbody_system.G)

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

  print da,deps
  print "time:",t2-t1
Exemple #20
0
def gravity_hydro_bridge(gravity, hydro, t_end, dt):

    model_time = 0 | units.yr
    filename = "gravhydro.hdf5"
    #write_set_to_file(stars.savepoint(model_time), filename, 'amuse')
    #write_set_to_file(gas, filename, 'amuse')

    gravhydro = bridge.Bridge(use_threading=False)
    gravhydro.add_system(gravity, (hydro, ))
    gravhydro.add_system(hydro, (gravity, ))
    gravhydro.timestep = 2 * hydro.get_timestep()

    a_Jup = list()
    e_Jup = list()
    disk_size = list()

    # start evolotuion
    print 'Start evolving...'
    times = quantities.arange(0. | units.yr, t_end + dt, dt)
    while model_time < t_end:
        stars = gravity.local_particles
        orbit = orbital_elements_from_binary(stars, G=constants.G)
        a = orbit[2].value_in(units.AU)
        e = orbit[3]
        if model_time.value_in(units.yr) % 50 == 0:
            print "Time:", model_time.in_(units.yr), \
                  "ae=", a ,e
        a_Jup.append(a)
        e_Jup.append(e)

        model_time += gravhydro.timestep
        gravhydro.evolve_model(model_time)
        gravity.copy_to_framework()
        hydro.copy_to_framework()

        sink = hydro.local_particles[0]
        _ = hydro_sink_particles([sink], hydro.local_particles[1:])
        Jupiter = gravity.local_particles[1]
        Jupiter.mass += sink.mass
        sink.position = Jupiter.position
        sink.radius = a * (1 - e) * (
            (1.0 | units.MJupiter).value_in(units.MSun) / 3.)**(1. /
                                                                3.) | units.au
        gravity.copy_to_framework()
        hydro.copy_to_framework()
        write_set_to_file(stars.savepoint(model_time), filename, 'amuse')
        write_set_to_file(ism, filename, 'amuse')
        print "P=", model_time.in_(units.yr), gravity.particles.x.in_(units.au)

    gravity.stop()
    hydro.stop()

    return a_Jup, e_Jup, times
def main(t_end=1000. | units.yr, dt=10. | units.yr):

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

    # Initialize the gravity system
    Sun_and_Jupiter = init_sun_jupiter()
    Sun = Sun_and_Jupiter[0]
    Jupiter = Sun_and_Jupiter[1]
    orbit0 = orbital_elements_from_binary(Sun_and_Jupiter, G=constants.G)
    a0 = orbit0[2].in_(units.AU)
    e0 = orbit0[3]
    Hill_radius0 = a0 * (1 - e0) * (
        (1.0 | units.MJupiter).value_in(units.MSun) / 3.)**(1. / 3.)

    # Initialising the direct N-body integrator
    gravity = ph4(converter)
    gravity.particles.add_particle(Jupiter)
    gravity.timestep = dt

    # Setting proto-disk parameters
    N = 4000
    Mstar = 1. | units.MSun
    Mdisk = 0.01 * Mstar
    Rmin = 2.
    Rmax = 100.

    # Initialising the proto-planetary disk
    np.random.seed(1)
    disk = ProtoPlanetaryDisk(N,
                              convert_nbody=converter,
                              densitypower=1.5,
                              Rmin=Rmin,
                              Rmax=Rmax,
                              q_out=1.,
                              discfraction=Mdisk / Mstar)
    disk_gas = disk.result

    # Initialize the sink particle
    sink = init_sink_particle(0. | units.MSun, Hill_radius0, Jupiter.position,
                              Jupiter.velocity)

    # Initialising the SPH code
    sph = Fi(converter, mode="openmp")
    sph.gas_particles.add_particles(disk_gas)
    sph.dm_particles.add_particle(Sun)
    sph.parameters.timestep = dt

    # bridge and evolve
    a_Jup, e_Jup, disk_size, times, accreted_mass = gravity_hydro_bridge(
        gravity, sph, sink, [Sun_and_Jupiter, disk_gas], Rmin, t_end, dt)

    return a_Jup, e_Jup, disk_size, times, accreted_mass
def evolve_model(end_time, double_star, stars):
    time = 0 | units.yr
    dt = end_time/100.

    converter = nbody_system.nbody_to_si(double_star.mass,
                                         double_star.semimajor_axis)

    gravity = Hermite(converter)
    gravity.particles.add_particle(stars)
    to_stars = gravity.particles.new_channel_to(stars)
    # from_stars = stars.new_channel_to(gravity.particles)

    massloss_code = CodeWithMassLoss(gravity, ())
    gravml = bridge.Bridge(use_threading=False)
    gravml.timestep = 0.5*dt
    gravml.add_system(gravity,)
    gravml.add_code(massloss_code)

    a = [] | units.au
    e = []
    m = [] | units.MSun
    t = [] | units.yr
    while time < end_time:
        time += dt
        gravml.evolve_model(time)
        to_stars.copy()
        orbital_elements = orbital_elements_from_binary(stars,
                                                        G=constants.G)
        a.append(orbital_elements[2])
        e.append(orbital_elements[3])
        m.append(stars.mass.sum())
        t.append(time)
        print("time=", time.in_(units.yr),
              "a=", a[-1].in_(units.RSun),
              "e=", e[-1],
              "m=", stars.mass.in_(units.MSun))
    gravity.stop()
    from matplotlib import pyplot
    fig, axis = pyplot.subplots(nrows=2, ncols=2, sharex=True)
    axis[0][0].scatter(t.value_in(units.yr), a.value_in(units.RSun))
    axis[0][0].set_ylabel("a [$R_\odot$]")

    axis[0][1].scatter(t.value_in(units.yr), m.value_in(units.MSun))
    axis[0][1].set_ylabel("M [$M_\odot$]")

    axis[1][1].scatter(t.value_in(units.yr), e)
    axis[1][1].set_ylabel("e")

    axis[1][1].set_xlabel("time [yr]")
    axis[1][0].set_xlabel("time [yr]")
    pyplot.savefig("mloss_bridge.png")
    pyplot.show()
Exemple #23
0
def main(t_end=1000. | units.yr, dt=10. | units.yr):

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

    # Initialize the gravity system
    Sun_and_Jupiter = init_sun_jupiter()
    Sun = Sun_and_Jupiter[0]
    Jupiter = Sun_and_Jupiter[1]
    orbit0 = orbital_elements_from_binary(Sun_and_Jupiter, G=constants.G)
    a0 = orbit0[2].in_(units.AU)
    e0 = orbit0[3]
    Hill_radius0 = a0 * (1 - e0) * (
        (1.0 | units.MJupiter).value_in(units.MSun) / 3.)**(1. / 3.)

    gravity = ph4(converter)
    gravity.particles.add_particles(Sun_and_Jupiter)
    gravity.timestep = dt

    # initialize the hydrodynamics(SPH) system
    # initialize the protoplanetary disk
    N = 1000
    Mstar = 1. | units.MSun
    Mdisk = 0.01 * Mstar
    Rmin = 2.
    Rmax = 100.

    np.random.seed(1)
    disk = ProtoPlanetaryDisk(N,
                              convert_nbody=converter,
                              densitypower=1.5,
                              Rmin=Rmin,
                              Rmax=Rmax,
                              q_out=1.)
    disk_gas = disk.result
    disk_gas.h_smooth = 0.06 | units.AU

    # initialize the sink particle
    sink = init_sink_particle(0. | units.MSun, Hill_radius0, Jupiter.position,
                              Jupiter.velocity)

    sph = Fi(converter)
    sph.particles.add_particles(sink)
    sph.gas_particles.add_particles(disk_gas)
    sph.parameters.timestep = dt

    # bridge and evolve
    a_Jup, e_Jup, disk_size, times = gravity_hydro_bridge(gravity, sph, \
                                     [Sun_and_Jupiter, disk_gas], Rmin, t_end, dt)

    return a_Jup, e_Jup, disk_size, times
Exemple #24
0
def gravity_hydro_bridge(Mprim, Msec, a, ecc, t_end, n_steps, Rgas, Mgas,
                         Ngas):

    stars = new_binary_from_orbital_elements(Mprim,
                                             Msec,
                                             a,
                                             ecc,
                                             G=constants.G)
    eps = 1 | units.RSun
    gravity = Gravity(ph4, stars, eps)

    converter = nbody_system.nbody_to_si(1.0 | units.MSun, Rgas)
    ism = new_plummer_gas_model(Ngas, convert_nbody=converter)
    ism.move_to_center()
    ism = ism.select(lambda r: r.length() < 2 * a, ["position"])

    hydro = Hydro(Fi, ism, eps)

    model_time = 0 | units.Myr
    filename = "gravhydro.hdf5"
    write_set_to_file(stars.savepoint(model_time), filename, 'amuse')
    write_set_to_file(ism, filename, 'amuse')

    gravhydro = bridge.Bridge(use_threading=False)
    gravhydro.add_system(gravity, (hydro, ))
    gravhydro.add_system(hydro, (gravity, ))
    gravhydro.timestep = 2 * hydro.get_timestep()

    while model_time < t_end:
        orbit = orbital_elements_from_binary(stars, G=constants.G)
        a = orbit[2]
        ecc = orbit[3]

        dE_gravity = gravity.initial_total_energy / gravity.total_energy
        dE_hydro = hydro.initial_total_energy / hydro.total_energy
        print "Time:", model_time.in_(units.yr), "ae=", a.in_(
            units.AU), ecc, "dE=", dE_gravity, dE_hydro

        model_time += 10 * gravhydro.timestep
        gravhydro.evolve_model(model_time)

        gravity.copy_to_framework()
        hydro.copy_to_framework()
        write_set_to_file(stars.savepoint(model_time), filename, 'amuse')
        write_set_to_file(ism, filename, 'amuse')
    gravity.stop()
    hydro.stop()
Exemple #25
0
    def test5(self):
        numpy.random.seed(4567893)
        N=100
        
        mass1=random.random(N) | units.MSun 
        mass2=random.random(N) | units.MSun
        semi_major_axis=(-numpy.log(random.random(N))) | units.AU 
        eccentricity = random.random(N)
        true_anomaly = 360.*random.random(N)-180.
        inclination = 180*random.random(N)
        longitude_of_the_ascending_node = 360*random.random(N)-180
        argument_of_periapsis = 360*random.random(N)-180       

        for arg in zip(mass1,mass2,semi_major_axis,eccentricity,true_anomaly,inclination, 
                                  longitude_of_the_ascending_node,argument_of_periapsis):
          arg_=orbital_elements_from_binary(new_binary_from_orbital_elements(*arg,G=constants.G),G=constants.G)
          for i,(copy,org) in enumerate(zip(arg_,arg)):
            self.assertAlmostEquals(copy,org)
def test_distribution(bodies):
    from determine_orbital_elements import calculate_orbital_elements_for_single_planet
    asteroids = bodies[bodies.type == b"debris"]
    star = bodies[bodies.type == b"star"]
    print(star)
    print(asteroids)
    p = Particles()
    p.add_particle(star)
    from amuse.ext.orbital_elements import orbital_elements_from_binary
    sma = [] | units.au
    ecc = []
    for ai in asteroids:
        p.add_particle(ai)
        M, m, a, e, ta_out, inc, lan_out, aop_out = orbital_elements_from_binary(
            p, G=constants.G)
        sma.append(a)
        ecc.append(e)
        p.remove_particle(ai)
    """
    def test4(self):
        numpy.random.seed(3456789)
        N = 100

        mass1 = random.random(N) | nbody_system.mass
        mass2 = random.random(N) | nbody_system.mass
        semi_major_axis = (-numpy.log(random.random(N))) | nbody_system.length
        eccentricity = random.random(N)
        true_anomaly = 360. * random.random(N) - 180.
        inclination = 180 * random.random(N)
        longitude_of_the_ascending_node = 360 * random.random(N) - 180
        argument_of_periapsis = 360 * random.random(N) - 180

        for arg in zip(mass1, mass2, semi_major_axis, eccentricity,
                       true_anomaly, inclination,
                       longitude_of_the_ascending_node, argument_of_periapsis):
            arg_ = orbital_elements_from_binary(
                new_binary_from_orbital_elements(*arg))
            for i, (copy, org) in enumerate(zip(arg_, arg)):
                self.assertAlmostEquals(copy, org)
Exemple #28
0
def gravity_hydro_bridge(Mprim, Msec, a, ecc, t_end, n_steps, Rgas, Mgas, Ngas):

    stars = new_binary_from_orbital_elements(Mprim, Msec, a, ecc, G=constants.G)
    eps = 1 | units.RSun
    gravity = Gravity(ph4, stars, eps)

    converter=nbody_system.nbody_to_si(1.0|units.MSun, Rgas)
    ism = new_plummer_gas_model(Ngas, convert_nbody=converter)
    ism.move_to_center()
    ism = ism.select(lambda r: r.length()<2*a,["position"])

    hydro = Hydro(Fi, ism, eps)

    model_time = 0 | units.Myr
    filename = "gravhydro.hdf5"
    write_set_to_file(stars.savepoint(model_time), filename, 'amuse')
    write_set_to_file(ism, filename, 'amuse')

    gravhydro = bridge.Bridge(use_threading=False)
    gravhydro.add_system(gravity, (hydro,) )
    gravhydro.add_system(hydro, (gravity,) )
    gravhydro.timestep = 2*hydro.get_timestep()

    while model_time < t_end:
        orbit = orbital_elements_from_binary(stars, G=constants.G)
        a = orbit[2]
        ecc = orbit[3]

        dE_gravity = gravity.initial_total_energy/gravity.total_energy
        dE_hydro = hydro.initial_total_energy/hydro.total_energy
        print "Time:", model_time.in_(units.yr), "ae=", a.in_(units.AU), ecc, "dE=", dE_gravity, dE_hydro
        
        model_time += 10*gravhydro.timestep
        gravhydro.evolve_model(model_time)

        gravity.copy_to_framework()
        hydro.copy_to_framework()
        write_set_to_file(stars.savepoint(model_time), filename, 'amuse')
        write_set_to_file(ism, filename, 'amuse')
    gravity.stop()
    hydro.stop()
Exemple #29
0
def evolve_sun_jupiter(particles, tend, dt):
    
    SunJupiter = Particles()
    SunJupiter.add_particle(particles[0])
    SunJupiter.add_particle(particles[1])

    converter=nbody_system.nbody_to_si(particles.mass.sum(), particles[1].position.length())
    gravity = ph4(converter)
    gravity.particles.add_particles(particles)

    channel_from_to_SunJupiter = gravity.particles.new_channel_to(SunJupiter)

    semi_major_axis = list()
    eccentricity = list()
    times = quantities.arange(0|units.yr, tend+dt, dt)

    for i,t in enumerate(times):
        #print "Time =", t.in_(units.yr)
        channel_from_to_SunJupiter.copy()
        orbital_elements = orbital_elements_from_binary(SunJupiter, G=constants.G)
        a = orbital_elements[2]
        e = orbital_elements[3]
        semi_major_axis.append(a.value_in(units.AU))
        eccentricity.append(e)
        gravity.evolve_model(t, timestep=dt)

    gravity.stop()

    # save the data: times, semi_major_axis and eccentricity of Jupiter's orbit
    t_a_e = np.column_stack((times.value_in(units.yr), semi_major_axis, eccentricity))
    np.savetxt('t_a_e.txt', t_a_e, delimiter=',')

    # make plots
    fig = plt.figure(figsize = (8, 6))
    ax1 = fig.add_subplot(211, xlabel = 'time(yr)', ylabel = 'semi major axis (AU)')
    ax1.plot(times.value_in(units.yr), semi_major_axis)
    ax2 = fig.add_subplot(212, xlabel = 'time(yr)', ylabel = 'eccentriity')
    ax2.plot(times.value_in(units.yr), eccentricity)
    plt.show()
def evolve_sun_jupiter(particles, tend, dt):

    SunJupiter = Particles()
    SunJupiter.add_particle(particles[0])
    SunJupiter.add_particle(particles[1])

    converter = nbody_system.nbody_to_si(particles.mass.sum(),
                                         particles[1].position.length())
    gravity = ph4(converter)
    gravity.particles.add_particles(particles)

    channel_from_to_SunJupiter = gravity.particles.new_channel_to(SunJupiter)

    semi_major_axis = []
    eccentricity = []
    times = quantities.arange(0 | units.yr, tend, dt)
    for i, t in enumerate(times):
        print "Time=", t.in_(units.yr)
        channel_from_to_SunJupiter.copy()
        orbital_elements = orbital_elements_from_binary(SunJupiter,
                                                        G=constants.G)
        a = orbital_elements[2]
        e = orbital_elements[3]
        semi_major_axis.append(a.value_in(units.AU))
        eccentricity.append(e)
        gravity.evolve_model(t, timestep=dt)

    # Plot

    fig = plt.figure(figsize=(8, 6))
    ax1 = fig.add_subplot(211,
                          xlabel='time(yr)',
                          ylabel='semi major axis (AU)')
    ax1.plot(times.value_in(units.yr), semi_major_axis)
    ax2 = fig.add_subplot(212, xlabel='time(yr)', ylabel='eccentriity')
    ax2.plot(times.value_in(units.yr), eccentricity)
    plt.show()

    gravity.stop()
 def test2(self):
     m_star = 0.666 | units.MSun
     a_min = 666. | units.AU
     a_max = 6666. | units.AU
     q_min = 6. | units.AU
     cloud = new_isotropic_cloud(66,
                                 m_star=m_star,
                                 a_min=a_min,
                                 a_max=a_max,
                                 q_min=q_min)
     binary = Particles(1)
     binary[0].mass = m_star
     binary[0].position = (0., 0., 0.) | units.AU
     binary[0].velocity = (0., 0., 0.) | units.kms
     for comet in cloud:
         binary.add_particle(comet)
         mass1, mass2, semimajor_axis, eccentricity, true_anomaly, inclination, long_asc_node, arg_per = \
           orbital_elements_from_binary(binary, G=constants.G)
         print mass1, mass2, semimajor_axis, eccentricity, true_anomaly, inclination, long_asc_node, arg_per
         self.assertTrue(a_min < semimajor_axis < a_max)
         self.assertTrue(q_min < semimajor_axis * (1. - eccentricity))
         binary.remove_particle(comet)
Exemple #32
0
 def test2(self):
   m_star = 0.666|units.MSun
   a_min=666.|units.AU
   a_max=6666.|units.AU
   q_min=6.|units.AU
   cloud = new_isotropic_cloud(66,
                               m_star=m_star,
                               a_min=a_min,
                               a_max=a_max,
                               q_min=q_min)
   binary = Particles(1)
   binary[0].mass = m_star
   binary[0].position = (0.,0.,0.) | units.AU
   binary[0].velocity = (0.,0.,0.) | units.kms
   for comet in cloud:
     binary.add_particle(comet)
     mass1, mass2, semimajor_axis, eccentricity, true_anomaly, inclination, long_asc_node, arg_per = \
       orbital_elements_from_binary(binary, G=constants.G)
     print mass1, mass2, semimajor_axis, eccentricity, true_anomaly, inclination, long_asc_node, arg_per
     self.assertTrue( a_min < semimajor_axis < a_max )
     self.assertTrue( q_min < semimajor_axis*(1.-eccentricity) )
     binary.remove_particle(comet)
def init_body_solar_disk_planetary(Ndisk, Mdisk, Rmin, Rmax):

    print 'Initializing...'
    #converter = nbody_system.nbody_to_si(1.|units.MJupiter, 1.|units.AU)

    # Initialize the solar system
    Sun_Jupiter = init_sun_jupiter()
    Sun = Sun_Jupiter[0]
    Jupiter = Sun_Jupiter[1]

    orbit = orbital_elements_from_binary(Sun_Jupiter, G=constants.G)
    a = orbit[2].in_(units.AU)
    e = orbit[3]
    hr = Hill_radius(a, e, Sun_Jupiter)

    # Initialize the proto-planetary disk
    np.random.seed(1)
    disk_converter = nbody_system.nbody_to_si(Sun.mass, Rmin)
    disk = ProtoPlanetaryDisk(Ndisk,
                              convert_nbody=disk_converter,
                              densitypower=1.5,
                              Rmin=1.0,
                              Rmax=Rmax / Rmin,
                              q_out=1.0,
                              discfraction=Mdisk / Sun.mass)
    disk_gas = disk.result

    # Initialize the sink particle
    sink = init_sink_particle(0. | units.MSun, hr, Jupiter.position,
                              Jupiter.velocity)

    # Initizalize the passing star
    e = 1.2
    Mstar = 2.0 | units.MSun
    pericenter = 200.0 | units.AU
    Pstar = init_passing_star(pericenter, e, Mstar)

    return Sun_Jupiter, disk_gas, sink, Pstar
def get_ffp_in_orbit(m0, m_ffp, b, r_inf, parabolic_velocity):

    m0_and_ffp_in_orbit = Particles(2)

    zero_p = 0.0 | nbody_system.length
    zero_v = 0.0 | nbody_system.speed

    #Central star
    m0_and_ffp_in_orbit[0].mass = m0
    m0_and_ffp_in_orbit[0].position = (zero_p,zero_p,zero_p)
    m0_and_ffp_in_orbit[0].velocity = (zero_v,zero_v,zero_v)

    #Free-floating planet
    m0_and_ffp_in_orbit[1].mass = m_ffp
    m0_and_ffp_in_orbit[1].position = (-r_inf,-b,zero_p)
    m0_and_ffp_in_orbit[1].velocity = (parabolic_velocity,zero_v,zero_v)

    m1, m2, sma, e, ta, i, lan, ap = orbital_elements_from_binary(m0_and_ffp_in_orbit)

    #For the star it sets the initial values of semimajoraxis and eccentricity of the ffp
    m0_and_ffp_in_orbit.eccentricity = e
    m0_and_ffp_in_orbit.semimajoraxis = sma

    return m0_and_ffp_in_orbit
Exemple #35
0
def t_linear(tend=1, N=100, method=0):
    code = Kepler(redirection="none")

    code.set_method(method)

    mass = 1. | nbody_system.mass
    x = 1. | nbody_system.length
    vx = 0 | nbody_system.speed

    e = 0.5 * vx**2 - nbody_system.G * mass / x

    semimajor_axis = -nbody_system.G * mass / 2 / e

    p = 2 * numpy.pi * (semimajor_axis**3 / nbody_system.G / mass)**0.5

    print(semimajor_axis)
    print(p)

    tend = tend * p
    dt = p / N

    sun = Particle()
    sun.mass = mass
    sun.x = 0. | nbody_system.length
    sun.y = 0. | nbody_system.length
    sun.z = 0. | nbody_system.length
    sun.vx = 0. | nbody_system.speed
    sun.vy = 0. | nbody_system.speed
    sun.vz = 0. | nbody_system.speed

    comet = Particle()
    comet.mass = 0 | nbody_system.mass
    comet.x = x
    comet.y = 0. | nbody_system.length
    comet.z = 0. | nbody_system.length
    comet.vx = vx
    comet.vy = 0. | nbody_system.speed
    comet.vz = 0. | nbody_system.speed

    code.central_particle.add_particle(sun)
    code.orbiters.add_particle(comet)

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

    print(orbital_elements_from_binary(code.particles[0:2]))

    #pyplot.ion()
    #f=pyplot.figure(figsize=(8,6))
    #pyplot.show()

    tnow = 0 * tend
    time = []
    xs = []
    while tnow < tend:
        tnow += dt
        print(tnow, int(tnow / dt))
        code.evolve_model(tnow)
        #f.clf()
        time.append(tnow / tend)
        xs.append(code.orbiters.x[0].number)
    #pyplot.plot(time,xs,"r+")
    #pyplot.xlim(-0.1,1.1)
    #pyplot.ylim(-1.1,3.1)
    #pyplot.draw()

    print(orbital_elements_from_binary(code.particles[0:2]))

    print(code.orbiters.position)

    a, eps = elements(sun.mass,
                      code.orbiters.x,
                      code.orbiters.y,
                      code.orbiters.z,
                      code.orbiters.vx,
                      code.orbiters.vy,
                      code.orbiters.vz,
                      G=nbody_system.G)

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

    print(da, deps)
    input()
Exemple #36
0
def crash_test2(method=1):
  code=Kepler(redirection="none")

  code.set_method(method)

  """
  mu=struct.unpack('!d','3ff7ffffffffffff'.decode('hex'))[0]
  dt=struct.unpack('!d','40025ab746b00001'.decode('hex'))[0]
  pos1=struct.unpack('!d','bfed36dc82998ed4'.decode('hex'))[0]
  pos2=struct.unpack('!d','40051297fc6e5256'.decode('hex'))[0]
  pos3=struct.unpack('!d','0000000000000000'.decode('hex'))[0]
  vel1=struct.unpack('!d','3fb09d8008ba33b9'.decode('hex'))[0]
  vel2=struct.unpack('!d','bff06788b551b81d'.decode('hex'))[0]
  vel3=struct.unpack('!d','0000000000000000'.decode('hex'))[0]
  """
  mu=float.fromhex("0x1.8p+0")
  dt=float.fromhex("0x1.25ab746bp+1")
  pos1=float.fromhex("-0x1.d36dc82998ed4p-1")
  pos2=float.fromhex("0x1.51297fc6e5256p+1")
  pos3=float.fromhex("0x0p+0")
  vel1=float.fromhex("0x1.09d8008ba33b9p-4")
  vel2=float.fromhex("-0x1.06788b551b81ep+0")
  vel3=float.fromhex("0x0p+0")

  sun=Particle()
  sun.mass=mu | nbody_system.mass
  sun.x=0. | nbody_system.length
  sun.y=0. | nbody_system.length
  sun.z=0. | nbody_system.length
  sun.vx=0. | nbody_system.speed
  sun.vy=0. | nbody_system.speed
  sun.vz=0. | nbody_system.speed

  comet=Particle()
  comet.mass= 0 | nbody_system.mass
  comet.x=pos1 | nbody_system.length
  comet.y=pos2 | nbody_system.length
  comet.z=pos3 | nbody_system.length
  comet.vx=vel1 | nbody_system.speed
  comet.vy=vel2 | nbody_system.speed
  comet.vz=vel3 | nbody_system.speed

  tend=dt | nbody_system.time
  print tend,mu

  code.central_particle.add_particle(sun)
  code.orbiters.add_particle(comet)

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

  print orbital_elements_from_binary(code.particles[0:2])

  t1=time.time()
  code.evolve_model(tend)
  t2=time.time()

  print orbital_elements_from_binary(code.particles[0:2])

  print code.orbiters.position

  a,eps=elements(sun.mass,code.orbiters.x,code.orbiters.y,code.orbiters.z,
                     code.orbiters.vx,code.orbiters.vy,code.orbiters.vz,G=nbody_system.G)

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

  print da,deps
  print "time:",t2-t1
def evolve_gravity(bodies, number_of_planets, converter, t_end, n_steps, n_snapshots, bodies_filename):

    #Particles that will be saved in the file
    bodies_to_save = Particles(number_of_planets+2)

    #Positions and velocities centered on the center of mass
    bodies.move_to_center()

    time = 0. | nbody_system.time
    dt = t_end / float(n_steps)
    dt_snapshots = t_end / float(n_snapshots)

    gravity = initialize_code(bodies, timestep_parameter = dt.value_in(nbody_system.time))
    channel_from_gr_to_framework = gravity.particles.new_channel_to(bodies)

    x = AdaptingVectorQuantity()
    y = AdaptingVectorQuantity()
    times = AdaptingVectorQuantity()
    system_energies = AdaptingVectorQuantity()

    E_initial = gravity.kinetic_energy + gravity.potential_energy
    DeltaE_max = 0.0 | nbody_system.energy

    while time<=t_end:

        gravity.evolve_model(time)
        channel_from_gr_to_framework.copy()

        bodies.collection_attributes.timestamp = time

        gravity.particles.collection_attributes.timestamp = time

        x.append(bodies.x)
        y.append(bodies.y)
        times.append(time)

        star = bodies[0]
        ffp = bodies[1]
        bp = bodies[2]

        #Orbital elements for star and bounded_planet
        binary = [star, bp]
        m1, m2, sma, e, ta, i, lan, ap = orbital_elements_from_binary(binary)
        bodies[2].eccentricity = e
        bodies[2].semimajoraxis = sma

        #Orbital elements for star+bp and ffp
        cm_x = (star.mass*star.x + bp.mass*bp.x)/(star.mass+bp.mass)
        cm_y = (star.mass*star.y + bp.mass*bp.y)/(star.mass+bp.mass)
        cm_vx = (star.mass*star.vx + bp.mass*bp.vx)/(star.mass+bp.mass)
        cm_vy = (star.mass*star.vy + bp.mass*bp.vy)/(star.mass+bp.mass)
        star_bp = Particles(1)
        star_bp.mass = star.mass + bp.mass
        star_bp.position = [cm_x, cm_y, 0.0 | units.AU]
        star_bp.velocity = [cm_vx, cm_vy, 0.0 | units.kms]

        binary = [star_bp, ffp]
        m1, m2, sma, e, ta, i, lan, ap = orbital_elements_from_binary(binary)
        bodies[1].eccentricity = e
        bodies[1].semimajoraxis = sma

        print star.mass, bp.mass, ffp.mass
        print m1, m2

        E = gravity.kinetic_energy + gravity.potential_energy
        system_energies.append(E)

        DeltaE = abs(E-E_initial)
        if ( DeltaE > DeltaE_max ):
            DeltaE_max = DeltaE

        save_particles_to_file(bodies, bodies_to_save, bodies_filename, time, converter)

        time += dt_snapshots

    max_energy_change = DeltaE_max/E_initial

    gravity.stop()

    return x,y,times,system_energies,max_energy_change
def evolve_gravity(bodies, number_of_planets, converter, t_end, n_steps):

    #Positions and velocities centered on the center of mass
    bodies.move_to_center()

    time = 0. | nbody_system.time
    dt = t_end / float(n_steps)

    gravity = initialize_code(bodies, timestep_parameter = dt.value_in(nbody_system.time))
    channel_from_gr_to_framework = gravity.particles.new_channel_to(bodies)

    x = AdaptingVectorQuantity()
    y = AdaptingVectorQuantity()
    times = AdaptingVectorQuantity()

    #Order: 12, 23, 31
    eccentricities = []
    semimajoraxes = []

    Etot_init = gravity.kinetic_energy + gravity.potential_energy
    Etot = Etot_init
    DeltaE_max = 0.0 | nbody_system.energy

    times.append(time)
    system_energies = [Etot.value_in(nbody_system.energy)]

    while time<=t_end:

        gravity.evolve_model(time)
        channel_from_gr_to_framework.copy()

        bodies.collection_attributes.timestamp = time

        gravity.particles.collection_attributes.timestamp = time

        x.append(bodies.x)
        y.append(bodies.y)
        times.append(time)

        for i in range(0,number_of_planets+2):
            for j in range(i+1,number_of_planets+2):

                binary = [bodies[i], bodies[j]]
                massA, massB, semimajor_axis, eccentricity, true_anomaly, inclination, long_asc_node, arg_per = orbital_elements_from_binary(binary)

                eccentricities.append(eccentricity)
                semimajoraxes.append(semimajor_axis.value_in(nbody_system.length))

        Etot = gravity.kinetic_energy + gravity.potential_energy
        DeltaE = abs(Etot-Etot_init)

        system_energies.append(Etot.value_in(nbody_system.energy))

        if ( DeltaE > DeltaE_max ):
            DeltaE_max = DeltaE

        time += dt

    print "Energy Change: max(|E_j - E_initial|)/E_initial = ", DeltaE_max/Etot_init

    results = ['flyby', 'temporary capture', 'exchange','nothing']
    #results = [0,1,2,-1]

    planets_star_energies = []

    for i in range(0,number_of_planets):
        planet_star_energy = energies_binaries(bodies, 0, i+2).value_in(nbody_system.energy)
        planets_star_energies.append(planet_star_energy)

    planets_star_energy = sum(planets_star_energies)
    ffp_star_energy = energies_binaries(bodies, 0, 1).value_in(nbody_system.energy)

    if (planets_star_energy<0 and ffp_star_energy>0):
        res = results[0]
    elif (planets_star_energy<0 and ffp_star_energy<0):
        res = results[1]
    elif (planets_star_energy>0 and ffp_star_energy<0):
        res = results[2]
    else:
        #res = 'something that is not flyby, exchange or temporary capture has happened!'
        res = results[3]

    print res

    gravity.stop()

    return x,y,times,numpy.array(system_energies),numpy.array(eccentricities),numpy.array(semimajoraxes)
Exemple #39
0
def test_softening(method=1):
  code=Kepler(redirection="none")

  code.set_method(method)

  dt=float.fromhex("0x1.67b39e372f04dp+4")
  mu=float.fromhex("0x1.fffffffffffdfp-3")
  e2=float.fromhex("0x1.0000000000003p+0")
  pos1=float.fromhex("0x1.1b76542265052p-1")
  pos2=float.fromhex("0x1.0c4dbda42097cp-6")
  pos3=float.fromhex("0x1.54fd66cd1e212p-3")
  vel1=float.fromhex("0x1.d6ef43d58ca7ep-2")
  vel2=float.fromhex("0x1.7a85379e59794p-2")
  vel3=float.fromhex("-0x1.5421044d1acffp-1")

  sun=Particle()
  sun.mass=mu | nbody_system.mass
  sun.x=0. | nbody_system.length
  sun.y=0. | nbody_system.length
  sun.z=0. | nbody_system.length
  sun.vx=0. | nbody_system.speed
  sun.vy=0. | nbody_system.speed
  sun.vz=0. | nbody_system.speed

  comet=Particle()
  comet.mass= 0 | nbody_system.mass
  comet.x=pos1 | nbody_system.length
  comet.y=pos2 | nbody_system.length
  comet.z=pos3 | nbody_system.length
  comet.vx=vel1 | nbody_system.speed
  comet.vy=vel2 | nbody_system.speed
  comet.vz=vel3 | nbody_system.speed

  tend=dt | nbody_system.time
  print tend,mu

  code.central_particle.add_particle(sun)
  code.orbiters.add_particle(comet)

  code.parameters.epsilon_squared = e2 | nbody_system.length**2

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

  print orbital_elements_from_binary(code.particles[0:2])

  t1=time.time()
  code.evolve_model(tend)
  t2=time.time()

  print orbital_elements_from_binary(code.particles[0:2])

  print code.orbiters.position

  a,eps=elements(sun.mass,code.orbiters.x,code.orbiters.y,code.orbiters.z,
                     code.orbiters.vx,code.orbiters.vy,code.orbiters.vz,G=nbody_system.G)

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

  print da,deps
  print "time:",t2-t1
def main(t_end=1000. | units.yr, dt=10. | units.yr):

    print 'Initializing...'
    #converter = nbody_system.nbody_to_si(1.|units.MSun, 1.|units.AU)

    # Initialize the Sun and Jupiter system
    Sun, Jupiter = init_star_planet()
    Sun_and_Jupiter0 = Particles()
    Sun_and_Jupiter0.add_particle(Sun)
    Sun_and_Jupiter0.add_particle(Jupiter)
    orbit0 = orbital_elements_from_binary(Sun_and_Jupiter0, G=constants.G)
    a0 = orbit0[2].in_(units.AU)
    e0 = orbit0[3]
    Hill_radius0 = a0 * (1 - e0) * (
        (1.0 | units.MJupiter).value_in(units.MSun) / 3.)**(1. / 3.)

    # Initialize the passing star
    PassStar = Particle()
    PassStar.mass = 2.0 | units.MSun
    r_ps = 200. | units.AU
    a_ps = 1000. | units.AU
    mu = PassStar.mass * Sun.mass / (PassStar.mass + Sun.mass)
    vx = np.sqrt(constants.G * mu * (2. / r_ps - 1. / a_ps)).in_(units.kms)
    PassStar.velocity = (-vx, 0. | units.kms, 0. | units.kms)
    ds = (Jupiter.position - Sun.position).value_in(units.AU)
    sin_theta = ds[2] / np.sqrt(ds[0]**2 + ds[1]**2)
    cos_theta = np.sqrt(1 - sin_theta**2)
    PassStar.position = (Sun.position).in_(units.AU) + (
        (0., 200. * cos_theta, 200. * sin_theta) | units.AU)

    # Initialize the direct N-body integrator
    gravity_particles = Particles()
    gravity_particles.add_particle(Jupiter)
    gravity_particles.add_particle(PassStar)
    converter_gravity = nbody_system.nbody_to_si(
        gravity_particles.mass.sum(), gravity_particles.position.length())
    gravity = ph4(converter_gravity)
    gravity.particles.add_particles(gravity_particles)
    gravity.timestep = dt

    # Set proto-disk parameters
    N = 4000
    Mstar = 1. | units.MSun
    Mdisk = 0.01 * Mstar
    Rmin = 1. | units.AU
    Rmax = 100. | units.AU

    # Initialize the proto-planetary disk
    np.random.seed(1)
    converter_disk = nbody_system.nbody_to_si(Mstar, Rmin)
    disk = ProtoPlanetaryDisk(N,
                              convert_nbody=converter_disk,
                              densitypower=1.5,
                              Rmin=1.,
                              Rmax=Rmax / Rmin,
                              q_out=1.,
                              discfraction=Mdisk / Mstar)
    disk_gas = disk.result
    disk_star = Particles()
    disk_star.add_particle(Sun)

    # Initialize the sink particle
    sink = init_sink_particle(0. | units.MSun, Hill_radius0, Jupiter.position,
                              Jupiter.velocity)

    # Initialising the SPH code
    #converter_hydro = nbody_system.nbody_to_si(Mdisk, Rmax)
    sph = Fi(converter_disk, mode="openmp")
    sph.gas_particles.add_particles(disk_gas)
    sph.dm_particles.add_particle(disk_star)
    sph.parameters.timestep = dt

    # bridge and evolve
    times, a_Jup, e_Jup, disk_size, accreted_mass = gravity_hydro_bridge(gravity, sph, sink,\
                                     [gravity_particles, disk_star, disk_gas], Rmin, t_end, dt)

    return times, a_Jup, e_Jup, disk_size, accreted_mass
def gravity_hydro_bridge(gravity,
                         hydro,
                         sink,
                         local_particles,
                         Rmin,
                         t_end=1000. | units.yr,
                         dt=10. | units.yr):

    # Set the local particles in each system
    gravity_particles, disk_star, disk_gas = local_particles
    Sun = disk_star[0]
    Jupiter = gravity_particles[0]
    PassStar = gravity_particles[1]
    Mstar = Sun.mass.in_(units.MSun)
    Sun_and_Jupiter = Particles()
    Sun_and_Jupiter.add_particle(Sun)
    Sun_and_Jupiter.add_particle(Jupiter)

    print 'Bridging...'
    # Build up the bridge between gravity and hydrodynamics
    grav_hydro = bridge.Bridge(use_threading=False)
    grav_hydro.add_system(gravity, (hydro, ))
    grav_hydro.add_system(hydro, (gravity, ))
    grav_hydro.timestep = dt

    # Set up channels for updating the particles
    channel_to_grav = gravity.particles.new_channel_to(gravity_particles)
    channel_from_grav = gravity_particles.new_channel_to(gravity.particles)
    channel_to_hydro_gas = hydro.gas_particles.new_channel_to(disk_gas)
    channel_from_hydro_gas = disk_gas.new_channel_to(hydro.gas_particles)
    channel_to_hydro_star = hydro.dm_particles.new_channel_to(disk_star)
    chennel_from_hydro_star = disk_star.new_channel_to(hydro.dm_particles)

    # Sanity checks:
    print('Sanity checks:')
    print('Sun coordinates (AU)', Sun.x.value_in(units.AU),
          Sun.y.value_in(units.AU), Sun.z.value_in(units.AU))
    print('Jupiter coordinates (AU)', Jupiter.x.value_in(units.AU),
          Jupiter.y.value_in(units.AU), Jupiter.z.value_in(units.AU))
    print('Disk particle map saved to: initial_check_disk.png')
    plot_map(hydro, [Sun, Jupiter, PassStar], N=400, L=400,\
             title='initial_check_disk.png', show=True)

    times = list(
        np.arange(0.0,
                  t_end.value_in(units.yr) + dt.value_in(units.yr),
                  dt.value_in(units.yr)))
    a_Jup = list()
    e_Jup = list()
    disk_size = list()
    accreted_mass = list()

    # start evolotuion
    print 'Start evolving...'
    model_time = 0.0 | units.yr
    while model_time <= t_end:

        # Save the data for plots
        orbit = orbital_elements_from_binary(Sun_and_Jupiter, G=constants.G)
        a = orbit[2].value_in(units.AU)
        e = orbit[3]
        lr9 = return_L9_radius(disk_gas, Mstar, Rmin)
        a_Jup.append(a)
        e_Jup.append(e)
        disk_size.append(lr9)
        accreted_mass.append((sink.mass).value_in(units.MJupiter)[0])

        #if model_time.value_in(units.yr) % 50 == 0:
        print 'Time = %.1f yr:'%model_time.value_in(units.yr), \
              'a = %.2f au, e = %.3f,'%(a, e), \
              'disk size = %.2f au'%lr9, \
              'accreted mass = %.2f M_Jupiter'%sink.mass.value_in(units.MJupiter)
        plot_map(hydro, [Sun, Jupiter, PassStar], N=400, L=400,\
                 title='test_plots/%d.png'%model_time.value_in(units.yr), show=False)

        # Evolve the bridge system for one step
        model_time += dt
        grav_hydro.evolve_model(model_time)
        channel_to_grav.copy()
        channel_to_hydro_gas.copy()
        channel_to_hydro_star.copy()

        # Add the 'sinked' mass to Jupiter & keep the sink particle along with Jupiter
        removed_particles = hydro_sink_particles(sink, disk_gas)

        Jupiter.mass += sink.mass
        sink.position = Jupiter.position
        sink.radius = a * (1 - e) * (
            (1.0 | units.MJupiter).value_in(units.MSun) / 3.)**(1. /
                                                                3.) | units.au
        channel_from_grav.copy()

    gravity.stop()
    hydro.stop()

    return times, a_Jup, e_Jup, disk_size, accreted_mass
Exemple #42
0
def evolve_model(end_time, double_star, stars):
    time = 0 | units.yr

    converter = nbody_system.nbody_to_si(double_star.mass,
                                         double_star.semimajor_axis)

    #time = 10.0017596364 | units.yr
    #inname = "binstar_10.0017596364.hdf5"
    #stars = read_set_from_file(inname, "hdf5")

    gravity = Hermite(converter)
    gravity.particles.add_particle(stars)
    to_stars = gravity.particles.new_channel_to(stars)
    from_stars = stars.new_channel_to(gravity.particles)

    period = (2 * numpy.pi *
              (double_star.semimajor_axis * double_star.semimajor_axis *
               double_star.semimajor_axis /
               (constants.G * double_star.mass)).sqrt())
    print("Period =", period.as_string_in(units.yr))

    dt = period / 32.

    print("Mass loss timestep =", dt)
    print("Steps per period: = {:1.2f}".format(period / dt))

    print("Radii", stars.radius)
    print("Taulag", stars.taulag)
    print("K", stars.kaps)

    QT = QuickTides(double_star.semimajor_axis, double_star.eccentricity,
                    stars[0].mass, stars[1].mass, stars[0].radius,
                    stars[1].radius, stars[0].kaps, stars[1].kaps,
                    stars[0].taulag, stars[1].taulag)

    print(stars)

    a_an = [] | units.au
    e_an = []
    atemp = double_star.semimajor_axis
    etemp = double_star.eccentricity

    a = [] | units.au
    e = []
    m = [] | units.MSun
    t = [] | units.yr
    while time < end_time:
        time += dt
        gravity.evolve_model(time)
        to_stars.copy()

        dadt, dedt = QT.dadt_dedt(atemp, etemp)

        atemp = atemp + dadt * dt
        etemp = etemp + dedt * dt
        a_an.append(atemp)
        e_an.append(etemp)

        kick_stars_tides(stars, dt)

        from_stars.copy()
        orbital_elements = orbital_elements_from_binary(stars, G=constants.G)

        a.append(orbital_elements[2])
        e.append(orbital_elements[3])
        m.append(stars.mass.sum())
        t.append(time)

        if check_collision(stars): break

        print("time=",
              time.in_(units.yr),
              "a=",
              a[-1].in_(units.RSun),
              "e=",
              e[-1],
              "m=",
              stars.mass.in_(units.MSun),
              end="\r")
    gravity.stop()
    from matplotlib import pyplot
    fig, axis = pyplot.subplots(nrows=2, ncols=2, sharex=True)
    axis[0][0].plot(t.value_in(units.yr), a.value_in(units.au), label="nbody")
    axis[0][0].plot(t.value_in(units.yr),
                    a_an.value_in(units.au),
                    label="analytic")
    axis[0][0].set_ylabel("a [$R_\odot$]")
    axis[0][0].legend()

    write_set_to_file(stars,
                      "binstar_" + str(time.value_in(units.yr)) + ".hdf5",
                      "hdf5")

    numpy.savetxt(
        "ae_{:d}.txt".format(numpy.random.randint(0, 1000)),
        numpy.vstack([t.value_in(units.yr),
                      a.value_in(units.au), e]).T)

    axis[0][1].plot(t.value_in(units.yr), m.value_in(units.MSun))
    axis[0][1].set_ylabel("M [$M_\odot$]")

    axis[1][1].plot(t.value_in(units.yr), e)
    axis[1][1].plot(t.value_in(units.yr), e_an)
    axis[1][1].set_ylabel("e")

    axis[1][1].set_xlabel("time [yr]")
    axis[1][0].set_xlabel("time [yr]")
    pyplot.savefig("mloss.png")
    pyplot.show()
Exemple #43
0
def t_linear(tend=1,N=100,method=0):
  code=Kepler(redirection="none")

  code.set_method(method)

  mass=1. | nbody_system.mass
  x=1. | nbody_system.length
  vx=0 | nbody_system.speed

  e=0.5*vx**2-nbody_system.G*mass/x

  semimajor_axis=-nbody_system.G*mass/2/e

  p=2*numpy.pi*(semimajor_axis**3/nbody_system.G/mass)**0.5

  print semimajor_axis
  print p

  tend=tend*p
  dt=p/N

  sun=Particle()
  sun.mass=mass
  sun.x=0. | nbody_system.length
  sun.y=0. | nbody_system.length
  sun.z=0. | nbody_system.length
  sun.vx=0. | nbody_system.speed
  sun.vy=0. | nbody_system.speed
  sun.vz=0. | nbody_system.speed

  comet=Particle()
  comet.mass= 0 | nbody_system.mass
  comet.x=x
  comet.y=0. | nbody_system.length
  comet.z=0. | nbody_system.length
  comet.vx=vx
  comet.vy=0. | nbody_system.speed
  comet.vz=0. | nbody_system.speed

  code.central_particle.add_particle(sun)
  code.orbiters.add_particle(comet)

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

  print orbital_elements_from_binary(code.particles[0:2])

  #pyplot.ion()
  #f=pyplot.figure(figsize=(8,6))
  #pyplot.show()

  tnow=0*tend
  time=[]
  xs=[]
  while tnow<tend:
    tnow+=dt
    print tnow,int(tnow/dt)
    code.evolve_model(tnow)
    #f.clf()
    time.append(tnow/tend)
    xs.append(code.orbiters.x[0].number)
  #pyplot.plot(time,xs,"r+")
  #pyplot.xlim(-0.1,1.1)
  #pyplot.ylim(-1.1,3.1)
  #pyplot.draw()

  print orbital_elements_from_binary(code.particles[0:2])

  print code.orbiters.position

  a,eps=elements(sun.mass,code.orbiters.x,code.orbiters.y,code.orbiters.z,
                     code.orbiters.vx,code.orbiters.vy,code.orbiters.vz,G=nbody_system.G)

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

  print da,deps
  raw_input()
def gravity_hydro_bridge(gravity,
                         hydro,
                         sink,
                         local_particles,
                         Rmin,
                         t_end=1000. | units.yr,
                         dt=10. | units.yr):

    Sun_and_Jupiter, disk_gas = local_particles
    Mstar = 1.0 | units.MSun

    print 'Bridging...'
    # Build up the bridge between gravity and hydrodynamics
    grav_hydro = bridge.Bridge(use_threading=False)
    grav_hydro.add_system(gravity, (hydro, ))
    grav_hydro.add_system(hydro, (gravity, ))
    grav_hydro.timestep = dt

    # Set up channels for updating the particles
    channel_from_grav = gravity.particles.new_channel_to(Sun_and_Jupiter)
    channel_from_hydro = hydro.gas_particles.new_channel_to(disk_gas)
    channel_to_grav = Sun_and_Jupiter.new_channel_to(gravity.particles)
    channel_to_hydro = disk_gas.new_channel_to(hydro.gas_particles)

    # Preparing lists for data-recording
    a_Jup = []
    e_Jup = []
    disk_size = []
    accreted_mass = []
    accreted_mass.append((sink.mass).value_in(units.MJupiter)[0])
    sink0_mass = 0 | units.MJupiter

    # Start evolution
    print 'Start evolving...'
    times = quantities.arange(0. | units.yr, t_end + 1 * dt, dt)
    model_time = 0.0 | units.yr
    while model_time <= t_end:

        # Save the data for plots
        orbit = orbital_elements_from_binary(Sun_and_Jupiter, G=constants.G)
        a = orbit[2].value_in(units.AU)
        e = orbit[3]
        lr9 = return_L9_radius(disk_gas, Mstar, Rmin | units.AU)
        a_Jup.append(a)
        e_Jup.append(e)
        disk_size.append(lr9)
        am = (sink.mass[0]).value_in(units.MJupiter)
        accreted_mass.append(am)

        # Plotting system
        print 'Time = %.1f yr:'%model_time.value_in(units.yr), \
                  'a = %.2f au, e = %.2f,'%(a, e), \
                  'disk size = %.2f au'%lr9
        plot_map(hydro,
                 Sun_and_Jupiter,
                 '{0}'.format(int(model_time.value_in(units.yr))),
                 show=False)

        # Evolve the bridge system for one step
        model_time += dt
        grav_hydro.evolve_model(model_time)
        channel_from_grav.copy()
        channel_from_hydro.copy()

        # Calculating accreted mass in new position
        Jupiter = gravity.particles[0]
        sink.position = Jupiter.position
        sink.radius = Hill_radius(a, e, Sun_and_Jupiter) | units.AU
        removed_particles = hydro_sink_particles(sink, disk_gas)
        Jupiter.mass += sink.mass - sink0_mass
        sink0_mass = sink.mass.copy()
        channel_to_grav.copy()
        channel_to_hydro.copy()

    gravity.stop()
    hydro.stop()

    return a_Jup, e_Jup, disk_size, times, accreted_mass
def evolve_gravity(bodies, number_of_planets, converter, t_end, n_steps, n_snapshots, path):

    #Particles that will be saved in the file
    bodies_to_save = Particles(number_of_planets+2)

    #Positions and velocities centered on the center of mass
    bodies.move_to_center()

    time = 0. | nbody_system.time
    dt = t_end / float(n_steps)
    dt_snapshots = t_end / float(n_snapshots)

    gravity = initialize_code(bodies, timestep_parameter = dt.value_in(nbody_system.time))
    channel_from_gr_to_framework = gravity.particles.new_channel_to(bodies)

    x = AdaptingVectorQuantity()
    y = AdaptingVectorQuantity()
    times = AdaptingVectorQuantity()
    system_energies = AdaptingVectorQuantity()

    E_initial = gravity.kinetic_energy + gravity.potential_energy
    DeltaE_max = 0.0 | nbody_system.energy

    snapshot_number = 1
    os.system('mkdir ./files/'+path)

    while time<=t_end:

        gravity.evolve_model(time)
        channel_from_gr_to_framework.copy()

        bodies.collection_attributes.timestamp = time

        gravity.particles.collection_attributes.timestamp = time

        x.append(bodies.x)
        y.append(bodies.y)
        times.append(time)

        E = gravity.kinetic_energy + gravity.potential_energy
        system_energies.append(E)

        DeltaE = abs(E-E_initial)
        if ( DeltaE > DeltaE_max ):
            DeltaE_max = DeltaE

        #Orbital Elements
        star = bodies[0]
        ffp = bodies[1]
        bp = bodies[2]

        #Star and FFP
        binary = [star, ffp]
        m1, m2, sma_star_ffp, e_star_ffp = my_orbital_elements_from_binary(binary)
        bodies[1].eccentricity = e_star_ffp
        bodies[1].semimajoraxis = sma_star_ffp

        #Star and BP
        binary = [star, bp]
        m1, m2, sma_star_bp, e_star_bp = my_orbital_elements_from_binary(binary)
        bodies[2].eccentricity = e_star_bp
        bodies[2].semimajoraxis = sma_star_bp

        save_particles_to_file(bodies, bodies_to_save, './files/'+path+'/'+str(snapshot_number)+'.hdf5', time, converter)

        # if (snapshot_number == 5):
        #     break

        time += dt_snapshots
        snapshot_number += 1

    #To get last orbital elements
    #Star and FFP
    binary = [star, ffp]
    b1_mass1, b1_mass2, b1_semimajor_axis, b1_eccentricity, b1_true_anomaly, b1_inclination, b1_long_asc_node, b1_arg_per = orbital_elements_from_binary(binary)
    #Star and BP
    binary = [star, bp]
    b2_mass1, b2_mass2, b2_semimajor_axis, b2_eccentricity, b2_true_anomaly, b2_inclination, b2_long_asc_node, b2_arg_per = orbital_elements_from_binary(binary)

    #To check Hill stability
    #Star+BP and FFP
    cm_x = (star.mass*star.x + bp.mass*bp.x)/(star.mass+bp.mass)
    cm_y = (star.mass*star.y + bp.mass*bp.y)/(star.mass+bp.mass)
    cm_vx = (star.mass*star.vx + bp.mass*bp.vx)/(star.mass+bp.mass)
    cm_vy = (star.mass*star.vy + bp.mass*bp.vy)/(star.mass+bp.mass)

    star_bp = Particles(1)
    star_bp.mass = star.mass + bp.mass
    star_bp.position = [cm_x, cm_y, 0.0 | nbody_system.length]
    star_bp.velocity = [cm_vx, cm_vy, 0.0 | nbody_system.speed]

    binary = [star_bp[0], ffp]
    m1, m2, sma_starbp_ffp, e_starbp_ffp = my_orbital_elements_from_binary(binary)
    bodies[1].eccentricity = e_starbp_ffp
    bodies[1].semimajoraxis = sma_starbp_ffp

    max_energy_change = DeltaE_max/E_initial

    is_stable = is_hill_stable(bodies.mass, bodies.semimajoraxis, bodies.eccentricity, converter)

    gravity.stop()

    return x, y, times, system_energies, max_energy_change, is_stable,converter.to_si(b1_semimajor_axis).value_in(units.AU), b1_eccentricity, b1_true_anomaly, b1_inclination, b1_long_asc_node, b1_arg_per, converter.to_si(b2_semimajor_axis).value_in(units.AU), b2_eccentricity, b2_true_anomaly, b2_inclination, b2_long_asc_node, b2_arg_per
Exemple #46
0
def evolve_model(end_time, double_star, stars):
    time = 0 | units.yr
    dt = 0.5 * end_time / 1000. * 2

    converter = nbody_system.nbody_to_si(double_star.mass,
                                         double_star.semimajor_axis)

    stars2 = stars.copy()

    gravity = Hermite(converter)
    gravity.particles.add_particle(stars)
    to_stars = gravity.particles.new_channel_to(stars)
    from_stars = stars.new_channel_to(gravity.particles)

    gravity2 = Hermite(converter)
    gravity2.particles.add_particle(stars2)
    to_stars2 = gravity2.particles.new_channel_to(stars2)
    from_stars2 = stars2.new_channel_to(gravity2.particles)

    period = (2 * numpy.pi *
              (double_star.semimajor_axis * double_star.semimajor_axis *
               double_star.semimajor_axis /
               (constants.G * double_star.mass)).sqrt())
    print("Period =", period.as_string_in(units.yr))
    print("Mass loss timestep =", dt)
    print("Steps per period: = {:1.2f}".format(period / dt))

    a_an = [] | units.au
    e_an = []
    atemp = double_star.semimajor_axis
    etemp = double_star.eccentricity

    a = [] | units.au
    e = []
    ome = []
    a2 = [] | units.au
    e2 = []
    ome2 = []
    m1 = [] | units.MSun
    m2 = [] | units.MSun
    t = [] | units.yr
    while time < end_time:
        time += dt
        gravity.evolve_model(time)
        gravity2.evolve_model(time)
        to_stars.copy()
        to_stars2.copy()

        dmdtloss = mass_loss_rate(stars.mass)
        dmdtacc = dmdt_acc(dmdtloss)

        orbital_elements = orbital_elements_from_binary(stars, G=constants.G)
        orbital_elements2 = orbital_elements_from_binary(stars2, G=constants.G)
        # etemp = orbital_elements[3]
        # atemp = orbital_elements[2]

        dadt = dadt_masschange(atemp, stars.mass, dmdtloss + dmdtacc)
        dedt = dedt_masschange(etemp, stars.mass, dmdtloss + dmdtacc)
        dadt += dadt_momentumchange(atemp, etemp, stars.mass, dmdtacc)
        dedt += dedt_momentumchange(etemp, stars.mass, dmdtacc)

        h = (constants.G * stars.mass.sum() * atemp * (1 - etemp * etemp))**0.5
        dhdt = dhdt_momentumchange(h, stars.mass, dmdtacc)

        atemp = atemp + dadt * dt
        etemp = etemp + dedt * dt
        a_an.append(atemp)
        e_an.append(etemp)

        kick_from_accretion(stars, dmdtacc, dt)

        dhdt_dadt_to_kick(stars2, dhdt, dadt, dmdtloss + dmdtacc, dt)

        stars.mass += (dmdtloss + dmdtacc) * dt
        stars2.mass += (dmdtloss + dmdtacc) * dt

        from_stars.copy()
        from_stars2.copy()

        a.append(orbital_elements[2])
        e.append(orbital_elements[3])
        ome.append(orbital_elements[7])
        a2.append(orbital_elements2[2])
        e2.append(orbital_elements2[3])
        ome2.append(orbital_elements2[7])
        m1.append(stars[0].mass)
        m2.append(stars[1].mass)
        t.append(time)
        print("time=", time.in_(units.yr), "a=", a[-1].in_(units.RSun), "e=",
              e[-1], "m=", stars.mass.in_(units.MSun), "end=\r")
    gravity.stop()
    gravity2.stop()

    from matplotlib import pyplot
    pyplot.rc('text', usetex=True)
    pyplot.rcParams.update({'font.size': 16})
    fig, axis = pyplot.subplots(nrows=2, ncols=2, sharex=True, figsize=(13, 6))
    axis[0][0].plot(t.value_in(units.yr),
                    a.value_in(units.RSun),
                    label="nbody (direct)",
                    lw=2)
    axis[0][0].plot(t.value_in(units.yr),
                    a2.value_in(units.RSun),
                    label="nbody (heuristic)",
                    lw=2,
                    ls="--")
    axis[0][0].plot(t.value_in(units.yr),
                    a_an.value_in(units.RSun),
                    label="analytic",
                    lw=2,
                    ls="-.")
    axis[0][0].set_ylabel("a [$R_\odot$]")
    axis[0][0].legend()

    axis[0][1].plot(t.value_in(units.yr),
                    m1.value_in(units.MSun),
                    label="m1",
                    lw=2,
                    c="tab:red")
    axis[0][1].plot(t.value_in(units.yr),
                    m2.value_in(units.MSun),
                    label="m2",
                    lw=2,
                    c="tab:cyan")
    axis[0][1].set_ylabel("M [$M_\odot$]")
    axis[0][1].legend()

    axis[1][1].plot(t.value_in(units.yr), e, lw=2)
    axis[1][1].plot(t.value_in(units.yr), e2, lw=2, ls="--")
    axis[1][1].plot(t.value_in(units.yr), e_an, lw=2, ls="-.")
    axis[1][1].set_ylabel("e")

    axis[1][0].plot(t.value_in(units.yr), ome, lw=2, label="nbody (direct)")
    axis[1][0].plot(t.value_in(units.yr),
                    ome2,
                    lw=2,
                    ls="--",
                    label="nbody (heuristic)")
    axis[1][0].set_ylabel("$\omega$ [degrees]")

    axis[1][1].set_xlabel("time [yr]")
    axis[1][0].set_xlabel("time [yr]")

    pyplot.tight_layout()
    pyplot.subplots_adjust(hspace=0, top=0.93, bottom=0.1)

    pyplot.suptitle("mloss+macc+momentum change, same model")
    pyplot.savefig("comparisons.png")
    pyplot.show()
def run_pyth(te=100):

    dt = 0.01 | nbody_system.time
    t_end = te | nbody_system.time

    code = ph4()

    code.parameters.timestep_parameter = dt.value_in(nbody_system.time)
    code.particles.add_particles(new_particles())

    x = AdaptingVectorQuantity()
    y = AdaptingVectorQuantity()

    t = 0. | nbody_system.time

    eccents_12 = []
    eccents_23 = []
    eccents_31 = []

    semmajaxs_12 = []
    semmajaxs_23 = []
    semmajaxs_31 = []

    times = []

    while(t < t_end-dt/2):

        t=t+dt

        code.evolve_model(t)

        x.append(code.particles.x)
        y.append(code.particles.y)

        mass1, mass2, semimajor_axis_12, eccentricity_12, true_anomaly, inclination, long_asc_node, arg_per = orbital_elements_from_binary([code.particles[0], code.particles[1]])
        mass2, mass3, semimajor_axis_23, eccentricity_23, true_anomaly, inclination, long_asc_node, arg_per = orbital_elements_from_binary([code.particles[1], code.particles[2]])
        mass3, mass1, semimajor_axis_31, eccentricity_31, true_anomaly, inclination, long_asc_node, arg_per = orbital_elements_from_binary([code.particles[2], code.particles[0]])

        eccents_12.append(eccentricity_12)
        eccents_23.append(eccentricity_23)
        eccents_31.append(eccentricity_31)

        semmajaxs_12.append(semimajor_axis_12.value_in(nbody_system.length))
        semmajaxs_23.append(semimajor_axis_23.value_in(nbody_system.length))
        semmajaxs_31.append(semimajor_axis_31.value_in(nbody_system.length))

        times.append(t.value_in(nbody_system.time))

    code.stop()

    return x,y,times,semmajaxs_12,semmajaxs_23,semmajaxs_31,eccents_12,eccents_23,eccents_31