def generate_initial_population_grid(
    min_mass, max_mass, number_of_mass_bins, 
    min_ratio, max_ratio, number_of_ratio_bins,
    min_separation, max_separation, number_of_separation_bins,
    min_eccentricity, max_eccentricity, number_of_eccentricity_bins
):
    """
    creates a set of binaries and a set of stars, the grid
    will be divided in equal parts amongst all dimensions (primary mass,
    ratio and separation), the total number of binaries will
    be the product of all bins.
    """
    
    # quantities.linspace takes care of the units, 
    # but is otherwhise equal to numpy.arange
    primary_masses  = quantities.linspace(min_mass, max_mass, number_of_mass_bins)
    mass_ratios = quantities.linspace(min_ratio, max_ratio, number_of_ratio_bins)
    separations = quantities.linspace(min_separation, max_separation, number_of_separation_bins)
    eccentricities = quantities.linspace(min_eccentricity, max_eccentricity, number_of_eccentricity_bins)
    
    # We can create the binaries individualy (with nested for loops to
    # go through each dimension) or at once with vector operations.
    # As vector operations are handled by numpy (in C) these are
    # much faster (default in this script).
    if USE_VECTOR_OPERATIONS is True:
        grid = multidimensional_meshgrid(primary_masses, mass_ratios, separations, eccentricities)
        
        all_primary_masses = grid[0].flatten()
        all_mass_ratios    = grid[1].flatten()
        all_separations    = grid[2].flatten()
        all_eccentricities = grid[3].flatten()
        
        primary_stars   = datamodel.Particles(mass=all_primary_masses)
        secondary_stars = datamodel.Particles(mass=all_primary_masses * all_mass_ratios)
        
        stars = datamodel.Particles()
        primary_stars   = stars.add_particles(primary_stars)
        secondary_stars = stars.add_particles(secondary_stars)
        
        binaries = datamodel.Particles(
            semi_major_axis = all_separations,
            eccentricity    = all_eccentricities
        )
        binaries.child1 = list(primary_stars)
        binaries.child2 = list(secondary_stars)
    else:
        for primary_mass in primary_masses:
            for mass_ratio in mass_ratios:
                for separation in separations:
                    for eccentricity in eccentricities :
                        create_binary(
                            stars, 
                            binaries, 
                            primary_mass, 
                            mass_ratio, 
                            separation, 
                            eccentricity
                        )
                
    return binaries, stars
def generate_initial_population_grid(min_mass, max_mass, number_of_mass_bins,
                                     min_ratio, max_ratio,
                                     number_of_ratio_bins, min_separation,
                                     max_separation, number_of_separation_bins,
                                     min_eccentricity, max_eccentricity,
                                     number_of_eccentricity_bins):
    """
    creates a set of binaries and a set of stars, the grid
    will be divided in equal parts amongst all dimensions (primary mass,
    ratio and separation), the total number of binaries will
    be the product of all bins.
    """

    # quantities.linspace takes care of the units,
    # but is otherwhise equal to numpy.arange
    primary_masses = quantities.linspace(min_mass, max_mass,
                                         number_of_mass_bins)
    mass_ratios = quantities.linspace(min_ratio, max_ratio,
                                      number_of_ratio_bins)
    separations = quantities.linspace(min_separation, max_separation,
                                      number_of_separation_bins)
    eccentricities = quantities.linspace(min_eccentricity, max_eccentricity,
                                         number_of_eccentricity_bins)

    # We can create the binaries individualy (with nested for loops to
    # go through each dimension) or at once with vector operations.
    # As vector operations are handled by numpy (in C) these are
    # much faster (default in this script).
    if USE_VECTOR_OPERATIONS is True:
        grid = multidimensional_meshgrid(primary_masses, mass_ratios,
                                         separations, eccentricities)

        all_primary_masses = grid[0].flatten()
        all_mass_ratios = grid[1].flatten()
        all_separations = grid[2].flatten()
        all_eccentricities = grid[3].flatten()

        primary_stars = datamodel.Particles(mass=all_primary_masses)
        secondary_stars = datamodel.Particles(mass=all_primary_masses *
                                              all_mass_ratios)

        stars = datamodel.Particles()
        primary_stars = stars.add_particles(primary_stars)
        secondary_stars = stars.add_particles(secondary_stars)

        binaries = datamodel.Particles(semi_major_axis=all_separations,
                                       eccentricity=all_eccentricities)
        binaries.child1 = list(primary_stars)
        binaries.child2 = list(secondary_stars)
    else:
        for primary_mass in primary_masses:
            for mass_ratio in mass_ratios:
                for separation in separations:
                    for eccentricity in eccentricities:
                        create_binary(stars, binaries, primary_mass,
                                      mass_ratio, separation, eccentricity)

    return binaries, stars
Exemple #3
0
 def test3(self):
     array = quantities.linspace(0, 10, 11)
     self.assertEquals(len(array), 11)
     self.assertAlmostRelativeEquals(array,
                                     [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
Exemple #4
0
def kira(tend, N, R, Nbin):
    logging.basicConfig(level=logging.ERROR)
    #encounters.LOG_ENERGY.setLevel(logging.DEBUG)

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

    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, "N-multiples:", 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()

    multiples_code.stop()
    stellar.stop()
Exemple #5
0
 def test2(self):
     array = quantities.linspace(0 | units.kg, 10 | units.kg, 11)
     self.assertEqual(len(array), 11)
     self.assertAlmostRelativeEquals(
         array, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] | units.kg)
Exemple #6
0
 def test3(self):
     array = quantities.linspace(0 , 10 , 11)
     self.assertEquals(len(array),  11)
     self.assertAlmostRelativeEquals(array, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
Exemple #7
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()