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