def simulation(par):
    saturn_a, saturn_e = par
    rebound.reset()
    rebound.integrator = "whfast-nocor"
    rebound.dt = 5.
    
    # These parameters are only approximately those of Jupiter and Saturn.
    rebound.add(m=1.)
    rebound.add(m=0.000954, a=5.204, anom=0.600, omega=0.257, e=0.048)
    rebound.add(m=0.000285, a=saturn_a, anom=0.871, omega=1.616, e=saturn_e)

    rebound.move_to_com()
    rebound.init_megno(1e-16)
    rebound.integrate(5e2*2.*np.pi) # integrator for 500 years

    return [rebound.calculate_megno(),1./(rebound.calculat_lyapunov()*2.*np.pi)] # returns MEGNO and Lypunov timescale in years
Beispiel #2
0
def simulation(par):
    saturn_a, saturn_e = par
    rebound.reset()
    rebound.set_min_dt(0.1)
    
    # These parameters are only approximately those of Jupiter and Saturn.
    sun     = rebound.Particle(m=1.)
    rebound.particle_add(sun)
    jupiter = rebound.particle_add(primary=sun,m=0.000954, a=5.204, anom=0.600, omega=0.257, e=0.048)
    saturn  = rebound.particle_add(primary=sun,m=0.000285, a=saturn_a, anom=0.871, omega=1.616, e=saturn_e)

    rebound.move_to_center_of_momentum()
    rebound.megno_init(1e-16)
    rebound.integrate(1e4*2.*np.pi)

    return [rebound.get_megno(),1./(rebound.get_lyapunov()*2.*np.pi)] # returns MEGNO and Lypunov timescale in years
Beispiel #3
0
def Destab(tmax,VarOut,Nout,sim):

    dt = tmax/(Nout-1.)

    OrbOut = VarOut[0]
    CoordOut = VarOut[1]

    step = 0
    
    a0 = np.zeros(cfg.NumPlanet)
    for i in range(cfg.NumPlanet):
        a0[i] = sim.calculate_orbits()[i].a
    a = a0
    aHigh = 1.2*a0
    aLow = 0.8*a0
    Time = 0
    
    print '\nTime ellapsed:'

    while CheckSMA(a,aHigh,aLow)==True and Time<tmax:
 
        if step%(Nout/10) == 1:
            print '\t'+str(Time)+' yr'

        Time = sim.t

        cfg.times.append(Time)
        
        for j in range(cfg.NumPlanet):

            Orbits = sim.calculate_orbits()

            a[j] = Orbits[j].a
          
            for OrbVar in OrbOut:
                getattr(cfg,OrbVar)[j].append(getattr(sim.Orbits[j],OrbVar))
          
            for CoordVar in CoordOut:
                getattr(cfg,CoordVar)[j].append(getattr(cfg.ps[j+1],CoordVar))
            
        rebound.integrate(Time+dt)

        step += 1
        
    print Time
def simulation(par):
    saturn_a, saturn_e = par
    rebound.reset()
    rebound.integrator = "whfast-nocor"
    rebound.min_dt = 5.
    rebound.dt = 1.
    
    # These parameters are only approximately those of Jupiter and Saturn.
    sun     = rebound.Particle(m=1.)
    rebound.add(sun)
    jupiter = rebound.add(primary=sun,m=0.000954, a=5.204, anom=0.600, omega=0.257, e=0.048)
    saturn  = rebound.add(primary=sun,m=0.000285, a=saturn_a, anom=0.871, omega=1.616, e=saturn_e)

    rebound.move_to_com()
    rebound.init_megno(1e-16)
    rebound.integrate(1e3*2.*np.pi)

    return [rebound.calculate_megno(),1./(rebound.calculate_lyapunov()*2.*np.pi)] # returns MEGNO and Lypunov timescale in years
Beispiel #5
0
def simulation(integrator):
    print("Running "+integrator)
    with open(integrator+".txt","w") as f:
        rebound.reset()
        rebound.set_integrator(integrator)
        rebound.set_dt(0.2)
            
        rebound.add_particle(m=1.)
        rebound.add_particle(m=0.01, a=1,e=0.1)
        rebound.add_particle(m=0.01, a=2.)

        rebound.move_to_center_of_momentum()
        rebound.init_megno(1e-10)
        particles = rebound.get_particles()
        times = np.logspace(2,5,num=1000)
        for t in times:
            rebound.integrate(t,0)
            print("%e %e %e %e %e %e %e %e\n" %(rebound.get_t(), rebound.get_megno(), particles[0].x, particles[1].x, particles[2].x, particles[3].x, particles[4].x, particles[5].x),file=f)
Beispiel #6
0
def simulation(integrator):
    print("Running "+integrator)
    with open(integrator+".txt","w") as f:
        rebound.reset()
        rebound.integrator = integrator
        rebound.dt = 0.2
            
        rebound.add(m=1.)
        rebound.add(m=0.01, a=1,e=0.1)
        rebound.add(m=0.01, a=2.)

        rebound.move_to_com()
        rebound.init_megno(1e-10)
        particles = rebound.particles
        times = np.logspace(2,5,num=1000)
        for t in times:
            rebound.integrate(t,0)
            print("%e %e %e %e %e %e %e %e\n" %(rebound.t, rebound.calculate_megno(), particles[0].x, particles[1].x, particles[2].x, particles[3].x, particles[4].x, particles[5].x),file=f)
Beispiel #7
0
def simulation(par):
    anom, dt, e, integrator = par

    e = 1.-pow(10.,e)
    dt = pow(10.,dt)*torb

    rebound.reset()
    rebound.set_integrator(integrator)
    rebound.set_force_is_velocitydependent(0)
    rebound.set_dt(dt)

    rebound.add_particle(m=1.)
    rebound.add_particle(m=0., x=(1.-e), vy=np.sqrt((1.+e)/(1.-e)))
    particles = rebound.get_particles()
    
    Ei = -1./np.sqrt(particles[1].x*particles[1].x+particles[1].y*particles[1].y+particles[1].z*particles[1].z) + 0.5 * (particles[1].vx*particles[1].vx+particles[1].vy*particles[1].vy+particles[1].vz*particles[1].vz)

    rebound.integrate(tmax,exactFinishTime=0,keepSynchronized=1)
    
    Ef = -1./np.sqrt(particles[1].x*particles[1].x+particles[1].y*particles[1].y+particles[1].z*particles[1].z) + 0.5 * (particles[1].vx*particles[1].vx+particles[1].vy*particles[1].vy+particles[1].vz*particles[1].vz)

    return [float(rebound.get_iter())/rebound.get_t()*dt, np.fabs((Ef-Ei)/Ei)+1e-16, rebound.get_timing()/rebound.get_t()*dt*1e6/2., (Ef-Ei)/Ei]
def simulation(par):
    anom, dt, e, integrator = par

    e = 1.-pow(10.,e)
    dt = pow(10.,dt)*torb

    rebound.reset()
    rebound.integrator = integrator
    rebound.force_is_velocitydependent = 0
    rebound.dt = dt

    rebound.add(m=1.)
    rebound.add(m=0., x=(1.-e), vy=np.sqrt((1.+e)/(1.-e)))
    particles = rebound.particles
    
    Ei = -1./np.sqrt(particles[1].x*particles[1].x+particles[1].y*particles[1].y+particles[1].z*particles[1].z) + 0.5 * (particles[1].vx*particles[1].vx+particles[1].vy*particles[1].vy+particles[1].vz*particles[1].vz)

    rebound.integrate(tmax,exactFinishTime=0,keepSynchronized=1)
    
    Ef = -1./np.sqrt(particles[1].x*particles[1].x+particles[1].y*particles[1].y+particles[1].z*particles[1].z) + 0.5 * (particles[1].vx*particles[1].vx+particles[1].vy*particles[1].vy+particles[1].vz*particles[1].vz)

    return [float(rebound.iter)/rebound.t*dt, np.fabs((Ef-Ei)/Ei)+1e-16, rebound.timing/rebound.t*dt*1e6/2., (Ef-Ei)/Ei]
Beispiel #9
0
def CloseEnc(VarOut,Noutputs):

    OrbOut = VarOut[0]
    CoordOut = VarOut[1]

    # Initializes a counter for the number of steps
    step = 0

    # Runs through the times 
    try:
        for i,time in enumerate(cfg.times):
        
            #Updates the counter
            step += 1

            # Prints an update to screen on how far along integration is.
            if step%(Noutputs/10) == 1:
                print time

            # Integrate from rebound.t (previous time) to the new time
            rebound.integrate(time,minD=0.001)
        
            # Writes the orbital elements and coordinates to cfg
            for j in range(cfg.NumPlanet):
                com = rebound.calculate_com(j)
                for OrbVar in OrbOut:
                    getattr(cfg,
                            OrbVar)[j][i] = getattr(cfg.ps[j+1].calculate_orbit(),OrbVar)
                for CoordVar in CoordOut:
                    getattr(cfg,
                            CoordVar)[j][i] = getattr(cfg.ps[j+1],CoordVar)
            if cfg.ps[1].x == 'nan':
                print 'Not a number'
                sys.exit()
                
    except rebound.CloseEncounter as e:
        print "Close encounter detected at t=%f, between particles %d and %d." % (rebound.t, e.id1, e.id2)
Beispiel #10
0
def simulation(par):
    S, dt,e0 = par

    rebound.reset()
    rebound.set_integrator("wh")
    #rebound.set_integrator("whfast")
    rebound.set_dt(dt)

    rebound.particle_add(m=1.)
    rebound.particle_add(m=0.,a=1.,e=e0)

    #rebound.move_to_center_of_momentum()
    #rebound.megno_init(1.e-16)


    particles = rebound.particles_get()
    def starkforce(): # need to put inside simulation(par) to have access to S and particles
        particles[1].ax += -S

    rebound.set_additional_forces(starkforce)

    rebound.integrate(50000.*np.pi)

    return [rebound.get_megno(), rebound.get_t()]
Beispiel #11
0
def simulation(par):
    import rebound
    integrator, dt, run = par
    rebound.reset()
    k = 0.01720209895    
    G = k*k
    rebound.G = G     
    rebound.dt = dt
    if integrator == "whfast-nocor":
        integrator = "whfast"
    else:
        rebound.integrator_whfast_corrector = 11
    rebound.integrator = integrator
    rebound.force_is_velocitydependent = 0

    rebound.add(m=1.00000597682, x=-4.06428567034226e-3, y=-6.08813756435987e-3, z=-1.66162304225834e-6, vx=+6.69048890636161e-6, vy=-6.33922479583593e-6, vz=-3.13202145590767e-9)   # Sun
    rebound.add(m=1./1407.355,   x=+3.40546614227466e+0, y=+3.62978190075864e+0, z=+3.42386261766577e-2, vx=-5.59797969310664e-3, vy=+5.51815399480116e-3, vz=-2.66711392865591e-6)   # Jupiter
    rebound.add(m=1./3501.6,     x=+6.60801554403466e+0, y=+6.38084674585064e+0, z=-1.36145963724542e-1, vx=-4.17354020307064e-3, vy=+3.99723751748116e-3, vz=+1.67206320571441e-5)   # Saturn
    rebound.add(m=1./22869.,     x=+1.11636331405597e+1, y=+1.60373479057256e+1, z=+3.61783279369958e-1, vx=-3.25884806151064e-3, vy=+2.06438412905916e-3, vz=-2.17699042180559e-5)   # Uranus
    rebound.add(m=1./19314.,     x=-3.01777243405203e+1, y=+1.91155314998064e+0, z=-1.53887595621042e-1, vx=-2.17471785045538e-4, vy=-3.11361111025884e-3, vz=+3.58344705491441e-5)   # Neptune
    N = rebound.N
    particles = rebound.particles
    np.random.seed(run)
    for i in xrange(N):
        particles[i].m *= 1.+1e-3*np.random.rand()
        particles[i].x *= 1.+1e-3*np.random.rand()
        particles[i].y *= 1.+1e-3*np.random.rand()
        particles[i].z *= 1.+1e-3*np.random.rand()
        particles[i].vx *= 1.+1e-3*np.random.rand()
        particles[i].vy *= 1.+1e-3*np.random.rand()
        particles[i].vz *= 1.+1e-3*np.random.rand()

    def move_to_heliocentric():
        particles[0].x  = 0.
        particles[0].y  = 0. 
        particles[0].z  = 0. 
        particles[0].vx = 0. 
        particles[0].vy = 0. 
        particles[0].vz = 0. 


    def energy():
        com_vx = 0.
        com_vy = 0.
        com_vz = 0.
        if integrator=="wh" or integrator=="mercury" or integrator[0:7]=="swifter":
            mtot = 0.
            for i in xrange(0,N):
                com_vx += particles[i].vx*particles[i].m 
                com_vy += particles[i].vy*particles[i].m 
                com_vz += particles[i].vz*particles[i].m 
                mtot += particles[i].m
            com_vx /= mtot
            com_vy /= mtot
            com_vz /= mtot
        E_kin = 0.
        E_pot = 0.
        for i in xrange(N):
            dvx = particles[i].vx - com_vx
            dvy = particles[i].vy - com_vy
            dvz = particles[i].vz - com_vz
            E_kin += 0.5*particles[i].m*(dvx*dvx + dvy*dvy + dvz*dvz)
            for j in xrange(i+1,N):
                dx = particles[i].x-particles[j].x
                dy = particles[i].y-particles[j].y
                dz = particles[i].z-particles[j].z
                r2 = dx*dx + dy*dy + dz*dz
                E_pot -= G*particles[i].m*particles[j].m/np.sqrt(r2)
        return E_kin+E_pot

    if integrator=="wh" or integrator=="mercury" or integrator[0:7]=="swifter":
        move_to_heliocentric()
    else:
        rebound.move_to_com()
    ei = energy()


    runtime = 0.
    rebound.integrate(tmax,exact_finish_time=0)
    ef = energy()
    e = np.fabs((ei-ef)/ei)+1.1e-16
    runtime += rebound.timing
    
    integrator, dt, run = par
    print integrator.ljust(13) + " %9.5fs"%(runtime) + "\t Error: %e"  %( e)
    return [runtime, e]
Beispiel #12
0
# Add particles
# We work in units where G=1.  
rebound.add(m=1. )                  # Test particle
rebound.add(m=1e-3,x=1.,vy=1. )     # Planet

# Move particles so that the center of mass is (and stays) at the origin  
rebound.move_to_com()

# You can provide a function, written in python to REBOUND.
# This function gets called every time the forces are evaluated.
# Simple add any any additional (non-gravitational) forces to the 
# particle accelerations. Here, we add a simple drag force. This 
# will make the planet spiral into the star.
ps = rebound.particles
def dragforce():
    dragcoefficient = 1e-2
    for p in ps:
        p.ax += -dragcoefficient * p.vx
        p.ay += -dragcoefficient * p.vy
        p.az += -dragcoefficient * p.vz

# Tell rebound which function to call
rebound.additional_forces = dragforce

# Integrate until t=100 (roughly 16 orbits at 1 AU) 
rebound.integrate(100.)

# Output something at the end (the planet will be at ~0.1 AU)
for p in ps:
    print(p.x, p.y, p.z)
Beispiel #13
0
def simulation(par):
    integrator, run, trial = par
    rebound.reset()
    k = 0.01720209895    
    Gfac = 1./k
    rebound.set_dt(dt)
    rebound.set_integrator(integrator)
    rebound.set_force_is_velocitydependent(0)

    massfac = 1.
    rebound.add_particle(m=1.00000597682, x=-4.06428567034226e-3, y=-6.08813756435987e-3, z=-1.66162304225834e-6,      vx=+6.69048890636161e-6*Gfac, vy=-6.33922479583593e-6*Gfac, vz=-3.13202145590767e-9*Gfac)   # Sun
    rebound.add_particle(m=massfac/1407.355,   x=+3.40546614227466e+0, y=+3.62978190075864e+0, z=+3.42386261766577e-2, vx=-5.59797969310664e-3*Gfac, vy=+5.51815399480116e-3*Gfac, vz=-2.66711392865591e-6*Gfac)   # Jupiter
    rebound.add_particle(m=massfac/3501.6,     x=+6.60801554403466e+0, y=+6.38084674585064e+0, z=-1.36145963724542e-1, vx=-4.17354020307064e-3*Gfac, vy=+3.99723751748116e-3*Gfac, vz=+1.67206320571441e-5*Gfac)   # Saturn
    rebound.add_particle(m=massfac/22869.,     x=+1.11636331405597e+1, y=+1.60373479057256e+1, z=+3.61783279369958e-1, vx=-3.25884806151064e-3*Gfac, vy=+2.06438412905916e-3*Gfac, vz=-2.17699042180559e-5*Gfac)   # Uranus
    rebound.add_particle(m=massfac/19314.,     x=-3.01777243405203e+1, y=+1.91155314998064e+0, z=-1.53887595621042e-1, vx=-2.17471785045538e-4*Gfac, vy=-3.11361111025884e-3*Gfac, vz=+3.58344705491441e-5*Gfac)   # Neptune
    N = rebound.get_N()
    particles = rebound.get_particles()
    np.random.seed(run)
    for i in xrange(N):
        particles[i].m *= 1.+1e-3*np.random.rand()
        particles[i].x *= 1.+1e-3*np.random.rand()
        particles[i].y *= 1.+1e-3*np.random.rand()
        particles[i].z *= 1.+1e-3*np.random.rand()
        particles[i].vx *= 1.+1e-3*np.random.rand()
        particles[i].vy *= 1.+1e-3*np.random.rand()
        particles[i].vz *= 1.+1e-3*np.random.rand()

    def move_to_heliocentric():
        particles = rebound.get_particles()
        
        particles[0].x  = 0.
        particles[0].y  = 0. 
        particles[0].z  = 0. 
        particles[0].vx = 0. 
        particles[0].vy = 0. 
        particles[0].vz = 0. 


    def energy():
        particles = rebound.get_particles()
        com_vx = 0.
        com_vy = 0.
        com_vz = 0.
        if integrator=="wh" or integrator=="mercury" or integrator[0:7]=="swifter":
            mtot = 0.
            for i in xrange(0,N):
                com_vx += particles[i].vx*particles[i].m 
                com_vy += particles[i].vy*particles[i].m 
                com_vz += particles[i].vz*particles[i].m 
                mtot += particles[i].m
            com_vx /= mtot
            com_vy /= mtot
            com_vz /= mtot
        E_kin = 0.
        E_pot = 0.
        for i in xrange(N):
            dvx = particles[i].vx - com_vx
            dvy = particles[i].vy - com_vy
            dvz = particles[i].vz - com_vz
            E_kin += 0.5*particles[i].m*(dvx*dvx + dvy*dvy + dvz*dvz)
            for j in xrange(i+1,N):
                dx = particles[i].x-particles[j].x
                dy = particles[i].y-particles[j].y
                dz = particles[i].z-particles[j].z
                r2 = dx*dx + dy*dy + dz*dz
                E_pot -= particles[i].m*particles[j].m/np.sqrt(r2)
        return E_kin+E_pot

    times = np.logspace(np.log10(orbit),np.log10(tmax),Ngrid)
    if integrator=="wh" or integrator=="mercury" or integrator[0:7]=="swifter":
        move_to_heliocentric()
    else:
        rebound.move_to_center_of_momentum()
    ei = energy()

    es = []

    runtime = 0.
    for t in times:
        rebound.integrate(t,exactFinishTime=0,keepSynchronized=0)
        ef = energy()
        e = np.fabs((ei-ef)/ei)+1.1e-16
        es.append(e)
        runtime += rebound.get_timing()
    
    integrator, run, trial = par
    print integrator.ljust(13) + " %9.5fs"%(runtime) + "\t Error: %e"  %( e)
    
    es = np.array(es)
    return [times, es]
Beispiel #14
0
    rebound.save("cache.bin")  

rebound.set_integrator("whfast")
rebound.set_dt(0.01)
rebound.status()

import numpy as np
Nout = 1000
times = np.linspace(0,16.*np.pi,Nout) # 8 years
N = rebound.get_N()
x = np.zeros((N,Nout))
y = np.zeros((N,Nout))

p = rebound.get_particles()
for ti,t in enumerate(times):
    rebound.integrate(t)
    for i in xrange(0,N):
        x[i][ti] = p[i].x
        y[i][ti] = p[i].y

import matplotlib; matplotlib.use("pdf")
import matplotlib.pyplot as plt

fig = plt.figure(figsize=(11,5))

def plot(zoom):
    ax.set_xlim([-zoom,zoom])
    ax.set_ylim([-zoom,zoom])
    ax.set_xlabel("x [AU]")
    ax.set_ylabel("y [AU]")
    for i in xrange(0,N):
Beispiel #15
0
tmax = 1.e4 # years

rebound.add(m=1.)
rebound.add(m=1e-6,a=1.,e=0.5)
#rebound.add(m=1e-6,a=2.,e=0.5)
rebound.move_to_com() # Moves to the center of momentum frame

rebound.additional_forces = reboundxf.forces()
reboundxf.set_e_damping([0.,tmax/10.])#,tmax])
reboundxf.set_migration([0.,0.])#,tmax])

Nout = 1000
e1,e2,a1,a2 = np.zeros(Nout), np.zeros(Nout), np.zeros(Nout), np.zeros(Nout)
times = np.linspace(0.,tmax,Nout)
for i,time in enumerate(times):
    rebound.integrate(time)
    orbits = rebound.calculate_orbits()
    e1[i] = orbits[0].e
    #e2[i] = orbits[1].e
    a1[i] = orbits[0].a
    #a2[i] = orbits[1].a

import matplotlib.pyplot as plt
fig = plt.figure(figsize=(15,5))
ax = plt.subplot(111)
ax.set_yscale('log')
plt.plot(times,e1)
#plt.plot(times,e2)

fig = plt.figure(figsize=(15,5))
ax = plt.subplot(111)
def simulation(par):
    integrator, run, trial = par
    rebound.reset()
    k = 0.01720209895    
    Gfac = 1./k
    rebound.dt = dt
    rebound.integrator = integrator 
    rebound.force_is_velocitydependent = 0

    massfac = 1.
    rebound.add(m=1.00000597682, x=-4.06428567034226e-3, y=-6.08813756435987e-3, z=-1.66162304225834e-6,      vx=+6.69048890636161e-6*Gfac, vy=-6.33922479583593e-6*Gfac, vz=-3.13202145590767e-9*Gfac)   # Sun
    rebound.add(m=massfac/1407.355,   x=+3.40546614227466e+0, y=+3.62978190075864e+0, z=+3.42386261766577e-2, vx=-5.59797969310664e-3*Gfac, vy=+5.51815399480116e-3*Gfac, vz=-2.66711392865591e-6*Gfac)   # Jupiter
    rebound.add(m=massfac/3501.6,     x=+6.60801554403466e+0, y=+6.38084674585064e+0, z=-1.36145963724542e-1, vx=-4.17354020307064e-3*Gfac, vy=+3.99723751748116e-3*Gfac, vz=+1.67206320571441e-5*Gfac)   # Saturn
    rebound.add(m=massfac/22869.,     x=+1.11636331405597e+1, y=+1.60373479057256e+1, z=+3.61783279369958e-1, vx=-3.25884806151064e-3*Gfac, vy=+2.06438412905916e-3*Gfac, vz=-2.17699042180559e-5*Gfac)   # Uranus
    rebound.add(m=massfac/19314.,     x=-3.01777243405203e+1, y=+1.91155314998064e+0, z=-1.53887595621042e-1, vx=-2.17471785045538e-4*Gfac, vy=-3.11361111025884e-3*Gfac, vz=+3.58344705491441e-5*Gfac)   # Neptune
    N = rebound.N
    particles = rebound.particles
    np.random.seed(run)
    for p in particles:
        p.m *= 1.+1e-3*np.random.rand()
        p.x *= 1.+1e-3*np.random.rand()
        p.y *= 1.+1e-3*np.random.rand()
        p.z *= 1.+1e-3*np.random.rand()
        p.vx *= 1.+1e-3*np.random.rand()
        p.vy *= 1.+1e-3*np.random.rand()
        p.vz *= 1.+1e-3*np.random.rand()

    def move_to_heliocentric():
        particles[0].x  = 0.
        particles[0].y  = 0. 
        particles[0].z  = 0. 
        particles[0].vx = 0. 
        particles[0].vy = 0. 
        particles[0].vz = 0. 


    def energy():
        com_vx = 0.
        com_vy = 0.
        com_vz = 0.
        if integrator=="wh" or integrator=="mercury" or integrator[0:7]=="swifter":
            mtot = 0.
            for p in particles:
                com_vx += p.vx*p.m 
                com_vy += p.vy*p.m 
                com_vz += p.vz*p.m 
                mtot += p.m
            com_vx /= mtot
            com_vy /= mtot
            com_vz /= mtot
        E_kin = 0.
        E_pot = 0.
        for i in xrange(N):
            dvx = particles[i].vx - com_vx
            dvy = particles[i].vy - com_vy
            dvz = particles[i].vz - com_vz
            E_kin += 0.5*particles[i].m*(dvx*dvx + dvy*dvy + dvz*dvz)
            for j in xrange(i+1,N):
                dx = particles[i].x-particles[j].x
                dy = particles[i].y-particles[j].y
                dz = particles[i].z-particles[j].z
                r2 = dx*dx + dy*dy + dz*dz
                E_pot -= particles[i].m*particles[j].m/np.sqrt(r2)
        return E_kin+E_pot

    times = np.logspace(np.log10(orbit),np.log10(tmax),Ngrid)
    if integrator=="wh" or integrator=="mercury" or integrator[0:7]=="swifter":
        move_to_heliocentric()
    else:
        rebound.move_to_com()
    ei = energy()

    es = []

    runtime = 0.
    for t in times:
        rebound.integrate(t,exactFinishTime=0,keepSynchronized=0)
        ef = energy()
        e = np.fabs((ei-ef)/ei)+1.1e-16
        es.append(e)
        runtime += rebound.timing
    
    integrator, run, trial = par
    print integrator.ljust(13) + " %9.5fs"%(runtime) + "\t Error: %e"  %( e)
    
    es = np.array(es)
    return [times, es]
Beispiel #17
0
from rebound import Particle

# Set variables (defaults are G=1, t=0, dt=0.01)
# rebound.set_G(1.)
# rebound.set_t(0.)
# rebound.set_dt(0.01)

# Add particles
rebound.particle_add(Particle(m=1.0))  # Star
rebound.particle_add(Particle(m=1e-3, x=1.0, vy=1.0))  # Planet

# Move particles so that the center of mass is (and stays) at the origin
rebound.move_to_center_of_momentum()

# Integrate until t=100 (roughly 16 orbits)
rebound.integrate(100.0)

# Modify particles
# As an example, we are reverting the velocities
particles = rebound.particles_get()
for i in range(rebound.get_N()):
    particles[i].vx *= -1.0
    particles[i].vy *= -1.0
    particles[i].vz *= -1.0

# Integrate another 100 time units, until t=200
rebound.integrate(200.0)

# Get particles back and print positions
# Since we're integrating forward and then backward we end up with the
# particles exactly where they started out from (note that we moved to the
rebound.add(m=1e-3, x=1., vy=1.)  # Planet

# Move particles so that the center of mass is (and stays) at the origin
rebound.move_to_com()

# You can provide a function, written in python to REBOUND.
# This function gets called every time the forces are evaluated.
# Simple add any any additional (non-gravitational) forces to the
# particle accelerations. Here, we add a simple drag force. This
# will make the planet spiral into the star.
ps = rebound.particles


def dragforce():
    dragcoefficient = 1e-2
    for p in ps:
        p.ax += -dragcoefficient * p.vx
        p.ay += -dragcoefficient * p.vy
        p.az += -dragcoefficient * p.vz


# Tell rebound which function to call
rebound.additional_forces = dragforce

# Integrate until t=100 (roughly 16 orbits at 1 AU)
rebound.integrate(100.)

# Output something at the end (the planet will be at ~0.1 AU)
for p in ps:
    print(p.x, p.y, p.z)