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
Пример #2
0
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
Пример #3
0
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
Пример #5
0
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
Пример #6
0
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()
Пример #7
0
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
Пример #8
0
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
Пример #9
0
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()