def integrate_solar_system(particles, end_time): gravity = Hermite(number_of_workers=2) gravity.particles.add_particles(particles) body0 = gravity.particles[0] body1 = gravity.particles[1] body2 = gravity.particles[2] x_body0 = [] | nbody_system.length y_body0 = [] | nbody_system.length x_body1 = [] | nbody_system.length y_body1 = [] | nbody_system.length x_body2 = [] | nbody_system.length y_body2 = [] | nbody_system.length x_body0.append(body0.x) y_body0.append(body0.y) x_body1.append(body1.x) y_body1.append(body1.y) x_body2.append(body2.x) y_body2.append(body2.y) while gravity.model_time < end_time: gravity.evolve_model(gravity.model_time + (t_step | nbody_system.time)) x_body0.append(body0.x) y_body0.append(body0.y) x_body1.append(body1.x) y_body1.append(body1.y) x_body2.append(body2.x) y_body2.append(body2.y) gravity.stop() return x_body0, y_body0, x_body1, y_body1, x_body2, y_body2
def integrate_solar_system(particles, end_time): from amuse.lab import Hermite, nbody_system, Brutus convert_nbody = nbody_system.nbody_to_si(particles.mass.sum(), particles[1].position.length()) gravity = Hermite(convert_nbody) gravity.particles.add_particles(particles) sun = gravity.particles[0] venus = gravity.particles[1] earth = gravity.particles[2] def to_float(c): return [ c[0].value_in(units.AU), c[1].value_in(units.AU), c[2].value_in(units.AU) ] sun_pos = [to_float([sun.x, sun.y, sun.z])] earth_pos = [to_float([earth.x, earth.y, earth.z])] venus_pos = [to_float([venus.x, venus.y, venus.z])] start_array = np.array([sun_pos, earth_pos, venus_pos]).reshape([-1, 3]) start = pd.DataFrame(data=start_array, columns=["x", "y", "z"]) while gravity.model_time < end_time: gravity.evolve_model(gravity.model_time + (1 | units.day)) sun_pos.append(to_float([sun.x, sun.y, sun.z])) earth_pos.append(to_float([earth.x, earth.y, earth.z])) venus_pos.append(to_float([venus.x, venus.y, venus.z])) gravity.stop() return sun_pos, earth_pos, venus_pos, start
def gravity_minimal(N, W0, t_end): bodies = new_king_model(N, W0) bodies.scale_to_standard() gravity = Hermite() gravity.particles.add_particles(bodies) Etot_init = gravity.kinetic_energy + gravity.potential_energy start_time = time.time() gravity.evolve_model(t_end) dtime = time.time() - start_time Ekin = gravity.kinetic_energy Epot = gravity.potential_energy Etot = Ekin + Epot dE = (Etot_init-Etot)/Etot print "T =", gravity.get_time(), " CPU time:", dtime, "[s]" print "M =", bodies.mass.sum(), " E = ", Etot, " Q = ", -Ekin/Epot print "dE =", dE gravity.stop()
def integrate_solar_system(particles, end_time): from amuse.units import constants, units gravity = Hermite() gravity.particles.add_particles(particles) body0 = gravity.particles[0] body1 = gravity.particles[1] body2 = gravity.particles[2] x_body0 = [] | nbody_system.length y_body0 = [] | nbody_system.length x_body1 = [] | nbody_system.length y_body1 = [] | nbody_system.length x_body2 = [] | nbody_system.length y_body2 = [] | nbody_system.length vx_body0 = [] | nbody_system.speed vy_body0 = [] | nbody_system.speed x_body0.append(body0.x) y_body0.append(body0.y) x_body1.append(body1.x) y_body1.append(body1.y) x_body2.append(body2.x) y_body2.append(body2.y) vx_body0.append(body0.vx) vy_body0.append(body0.vy) while gravity.model_time < end_time: gravity.evolve_model(gravity.model_time + (0.005 | nbody_system.time)) x_body0.append(body0.x) y_body0.append(body0.y) x_body1.append(body1.x) y_body1.append(body1.y) x_body2.append(body2.x) y_body2.append(body2.y) vx_body0.append(body0.vx) vy_body0.append(body0.vy) gravity.stop() return x_body0, y_body0, x_body1, y_body1, x_body2, y_body2, vx_body0, vy_body0
def gravity_minimal(bodies, t_end, nproc): gravity = Hermite(number_of_workers=nproc) gravity.particles.add_particles(bodies) Etot_init = gravity.kinetic_energy + gravity.potential_energy start_time = time.time() gravity.evolve_model(t_end) dtime = time.time() - start_time Ekin = gravity.kinetic_energy Epot = gravity.potential_energy Etot = Ekin + Epot dE = (Etot_init - Etot) / Etot print() print("T =", gravity.get_time(), " CPU time:", dtime, "[s]") print("M =", bodies.mass.sum(), " E = ", Etot, " Q = ", -Ekin / Epot) print("dE =", dE) gravity.stop() return dtime
def main(N, W0, t_end): bodies = new_king_model(N, W0) bodies.scale_to_standard() gravity = Hermite() gravity.particles.add_particles(bodies) Etot_init = gravity.kinetic_energy + gravity.potential_energy start_time = time.time() gravity.evolve_model(t_end) dtime = time.time() - start_time Ekin = gravity.kinetic_energy Epot = gravity.potential_energy Etot = Ekin + Epot dE = (Etot_init-Etot)/Etot print "T=", gravity.get_time(), "CPU time:", dtime, "[s]", print "M=", bodies.mass.sum(), "E= ", Etot, "Q= ", Ekin/Epot, "dE=", dE gravity.stop()
def integrate_solar_system(particles, end_time): from amuse.lab import Hermite, nbody_system convert_nbody = nbody_system.nbody_to_si(particles.mass.sum(), particles[1].position.length()) gravity = Hermite(convert_nbody) gravity.particles.add_particles(particles) sun = gravity.particles[0] venus = gravity.particles[1] earth = gravity.particles[2] def to_float(c): return [c[0].value_in(units.AU), c[1].value_in(units.AU), c[2].value_in(units.AU)] sun_pos = [to_float([sun.x,sun.y,sun.z])] earth_pos = [to_float([earth.x,earth.y,earth.z])] venus_pos = [to_float([venus.x,venus.y,venus.z])] while gravity.model_time < end_time: gravity.evolve_model(gravity.model_time + (1 | units.day)) sun_pos.append(to_float([sun.x,sun.y,sun.z])) earth_pos.append(to_float([earth.x,earth.y,earth.z])) venus_pos.append(to_float([venus.x,venus.y,venus.z])) gravity.stop() return sun_pos, earth_pos, venus_pos
def integrate_3body_system(particles, cycle, low_boundary, upper_boundary): #, end_time): from amuse.units import constants, units import matplotlib.pyplot as plt gravity = Hermite() gravity.particles.add_particles(particles) body0 = gravity.particles[0] body1 = gravity.particles[1] body2 = gravity.particles[2] x_body0 = [] | nbody_system.length y_body0 = [] | nbody_system.length x_body1 = [] | nbody_system.length y_body1 = [] | nbody_system.length x_body2 = [] | nbody_system.length y_body2 = [] | nbody_system.length vx_body0 = [] | nbody_system.speed vy_body0 = [] | nbody_system.speed x_body0.append(body0.x) y_body0.append(body0.y) x_body1.append(body1.x) y_body1.append(body1.y) x_body2.append(body2.x) y_body2.append(body2.y) vx_body0.append(body0.vx) vy_body0.append(body0.vy) # Plotting the return proximity funcion fig = plt.figure(figsize=(8, 16)) ax1 = fig.add_subplot( 211, xlabel='Integraion time step', ylabel='Return proximity function', title='Deviation from the initial point after each period') ax2 = fig.add_subplot(212, xlabel='Intergration time step', ylabel='Return proximity function', title='Return proximity function per time step') sig = sigma(np.array(body0.x.value_in(nbody_system.length)), np.array(body0.y.value_in(nbody_system.length)), np.array(body0.vx.value_in(nbody_system.speed)), np.array(body0.vy.value_in(nbody_system.speed))) c = 0 # cycle sig_array = [] time_step = 0 sig_O_x = [0] sig_O_y = [sig] while (c < cycle and sig < upper_boundary): # gravity.model_time < end_time: gravity.evolve_model(gravity.model_time + (0.005 | nbody_system.time)) x_body0.append(body0.x) y_body0.append(body0.y) x_body1.append(body1.x) y_body1.append(body1.y) x_body2.append(body2.x) y_body2.append(body2.y) vx_body0.append(body0.vx) vy_body0.append(body0.vy) sig = sigma(np.array(body0.x.value_in(nbody_system.length)), np.array(body0.y.value_in(nbody_system.length)), np.array(body0.vx.value_in(nbody_system.speed)), np.array(body0.vy.value_in(nbody_system.speed))) #print(sig) sig_array.append(sig) if time_step > 2: slope = (sig_array[-2] - sig_array[-3]) * (sig_array[-1] - sig_array[-2]) else: slope = 1 if (sig < lower_boundary) and (slope < 0): c += 1 print( x_body0.value_in(nbody_system.length)[-1], y_body0.value_in(nbody_system.length)[-1], vx_body0.value_in(nbody_system.speed)[-1], vy_body0.value_in(nbody_system.speed)[-1]) print(sig) sig_O_x.append(time_step) sig_O_y.append(sig) time_step += 1 gravity.stop() ax1.plot(sig_O_x, sig_O_y, color='k') ax2.plot(sig_array) ax2.plot(range(time_step), np.zeros(time_step)) ax2.scatter(sig_O_x, sig_O_y, color='k') plt.show() return x_body0, y_body0, x_body1, y_body1, x_body2, y_body2
def kira(tend, N, R, Nbin): logging.basicConfig(level=logging.ERROR) mass = new_salpeter_mass_distribution(N, mass_min=10 | units.MSun) converter = nbody_system.nbody_to_si(mass.sum(), R) code = Hermite(converter) stars = new_plummer_model(N, convert_nbody=converter) stars.mass = mass stars.radius = 0.01/len(stars) | R.unit single_stars, binary_stars, singles_in_binaries \ = make_secondaries(stars, Nbin) print(binary_stars) stellar = SeBa() stellar.particles.add_particles(single_stars) stellar.particles.add_particles(singles_in_binaries) stellar.binaries.add_particles(binary_stars) channel_to_stars = stellar.particles.new_channel_to(stars) encounter_code = encounters.HandleEncounter( kepler_code=new_kepler(converter), resolve_collision_code=new_smalln(converter), interaction_over_code=None, G=constants.G ) multiples_code = encounters.Multiples( gravity_code=code, handle_encounter_code=encounter_code, G=constants.G ) multiples_code.particles.add_particles((stars-binary_stars).copy()) multiples_code.singles_in_binaries.add_particles(singles_in_binaries) multiples_code.binaries.add_particles(binary_stars) multiples_code.commit_particles() channel_from_stars_to_particles \ = stellar.particles.new_channel_to(multiples_code.particles) stopping_condition \ = multiples_code.stopping_conditions.binaries_change_detection stopping_condition.enable() from matplotlib import pyplot from distinct_colours import get_distinct pyplot.rcParams.update({'font.size': 30}) figure = pyplot.figure(figsize=(12, 9)) ax = pyplot.gca() ax.get_yaxis().get_major_formatter().set_useOffset(False) ax.xaxis._autolabelpos = True ax.yaxis._autolabelpos = True color = get_distinct(2) pyplot.scatter(numpy.log10(stellar.binaries.semi_major_axis. value_in(units.AU)), stellar.binaries.eccentricity, c=color[0], s=200, lw=0) t = quantities.linspace(0*tend, tend, 11) for ti in t: print(("t, Energy=", ti, multiples_code.particles.mass.sum(), multiples_code.get_total_energy())) multiples_code.evolve_model(ti) print(("at t=", multiples_code.model_time, "Nmultiples:", len(multiples_code.multiples))) if stopping_condition.is_set(): resolve_changed_binaries(stopping_condition, stellar, converter) stellar.evolve_model(ti) channel_from_stars_to_particles.copy_attributes(["mass", "radius"]) update_dynamical_binaries_from_stellar(stellar, multiples_code, converter) print(("Lagrangian radii:", multiples_code.all_singles.LagrangianRadii(converter))) print(("MC.particles", multiples_code.particles)) print(("Lagrangian radii:", multiples_code.particles.LagrangianRadii(converter))) print(("t, Energy=", ti, multiples_code.get_total_energy())) pyplot.scatter(numpy.log10(stellar.binaries.semi_major_axis .value_in(units.AU)), stellar.binaries.eccentricity, c=color[1], lw=0, s=50) pyplot.xlabel("$\log_{10}(a/R_\odot)$") pyplot.ylabel("eccentricity") save_file = 'kira_a_vs_e.pdf' pyplot.savefig(save_file) print('\nSaved figure in file', save_file, '\n') pyplot.show() stellar.stop()