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
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
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
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)
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)
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]
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)
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()]
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]
# 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)
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]
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):
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]
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)