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 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(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 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): 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(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): 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 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): 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()]
# Import the rebound module import sys; sys.path.append('../') import rebound from rebound import Particle import numpy as np from interruptible_pool import InterruptiblePool for i in np.linspace(-2.*np.pi,2.*np.pi,1000): rebound.reset() rebound.set_integrator("whfast-nocor") rebound.set_dt(0.01*2.*np.pi) try: rebound.particle_add(m=1.) rebound.particle_add(m=0., a=1., e=1.01, anom=i) particles = rebound.particles_get() print particles[1].x, particles[1].y, i #rebound.step() #print particles[1].x, particles[1].y, i except: pass
def simulation(par): integrator = par rebound.reset() k = 0.01720209895 G = k*k rebound.set_G(G) rebound.set_dt(dt) rebound.set_integrator(integrator) rebound.add_particle(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_particle(m=1./1047.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_particle(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_particle(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_particle(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 # rebound.add_particle(m=0, x=-2.13858977531573e+1, y=+3.20719104739886e+1, z=+2.49245689556096e+0, vx=-1.76936577252484e-3, vy=-2.06720938381724e-3, vz=+6.58091931493844e-4) # Pluto N = rebound.get_N() def move_to_heliocentric(): particles = rebound.get_particles() for i in xrange(1,N): particles[i].x -= particles[0].x particles[i].y -= particles[0].y particles[i].z -= particles[0].z particles[i].vx -= particles[0].vx particles[i].vy -= particles[0].vy particles[i].vz -= particles[0].vz 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(): if integrator=="wh": rebound.move_to_center_of_momentum() particles = rebound.get_particles() E_kin = 0. E_pot = 0. for i in xrange(N): E_kin += 0.5*particles[i].m*(particles[i].vx*particles[i].vx + particles[i].vy*particles[i].vy + particles[i].vz*particles[i].vz) 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) if integrator=="wh": move_to_heliocentric() return E_kin+E_pot rebound.move_to_center_of_momentum() es = [] ei = energy() for time in xrange(Nsteps): rebound.step() ef = energy() e = (ei-ef) es.append(e) ei = ef es = np.array(es) print integrator + " done." return [es]
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]
def simulation(par): import rebound integrator, dt, run = par rebound.reset() k = 0.01720209895 G = k * k rebound.G = G rebound.dt = dt 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, exactFinishTime=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]
def simulation(par): integrator, mass = par rebound.reset() mass = pow(10., mass) k = 0.01720209895 G = k * k rebound.G = G rebound.dt = 0. rebound.integrator = integrator 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=mass, 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=mass, 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=mass, 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=mass, 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 def move_to_heliocentric(): particles = rebound.particles for i in xrange(1, N): particles[i].x -= particles[0].x particles[i].y -= particles[0].y particles[i].z -= particles[0].z particles[i].vx -= particles[0].vx particles[i].vy -= particles[0].vy particles[i].vz -= particles[0].vz 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(): if integrator == "wh": rebound.move_to_com() particles = rebound.particles E_kin = 0. E_pot = 0. for i in xrange(N): E_kin += 0.5 * particles[i].m * ( particles[i].vx * particles[i].vx + particles[i].vy * particles[i].vy + particles[i].vz * particles[i].vz) 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) if integrator == "wh": move_to_heliocentric() return E_kin + E_pot rebound.move_to_com() ei = energy() es = 1e-20 for s in xrange(1000): rebound.step() ef = energy() e = np.fabs((ei - ef) / ei) es = max(es, e) return es
def simulation(par): integrator, mass = par rebound.reset() mass = pow(10.,mass) k = 0.01720209895 G = k*k rebound.G = G rebound.dt = 0. rebound.integrator = integrator 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=mass, 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=mass, 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=mass, 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=mass, 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 def move_to_heliocentric(): particles = rebound.particles for i in xrange(1,N): particles[i].x -= particles[0].x particles[i].y -= particles[0].y particles[i].z -= particles[0].z particles[i].vx -= particles[0].vx particles[i].vy -= particles[0].vy particles[i].vz -= particles[0].vz 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(): if integrator=="wh": rebound.move_to_com() particles = rebound.particles E_kin = 0. E_pot = 0. for i in xrange(N): E_kin += 0.5*particles[i].m*(particles[i].vx*particles[i].vx + particles[i].vy*particles[i].vy + particles[i].vz*particles[i].vz) 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) if integrator=="wh": move_to_heliocentric() return E_kin+E_pot rebound.move_to_com() ei = energy() es = 1e-20 for s in xrange(1000): rebound.step() ef = energy() e = np.fabs((ei-ef)/ei) es = max(es,e) return es
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]