Exemplo n.º 1
0
    def test3(self):
        print "Test convert_SPH_to_stellar_model with particles_per_zone"
        model = convert_SPH_to_stellar_model(self.new_particles(),
                                             particles_per_zone=50)
        for variable in [
                'dmass', 'radius', 'rho', 'temperature', 'luminosity', 'X_H',
                'X_He', 'X_C', 'X_N', 'X_O', 'X_Ne', 'X_Mg', 'X_Si', 'X_Fe'
        ]:
            self.assertTrue(hasattr(model, variable))
            self.assertEqual(len(getattr(model, variable)), 10)

        self.assertTrue(numpy.all(
            model.radius[:-1] <= model.radius[1:]))  # monotonically increasing
        self.assertTrue(numpy.all(
            model.mass[:-1] <= model.mass[1:]))  # monotonically increasing
        self.assertTrue(
            numpy.all(model.temperature[:-1] >= model.temperature[1:]))
        self.assertTrue(numpy.all(model.rho[:-1] >= model.rho[1:]))
        self.assertTrue(numpy.all(model.X_H[:-1] <= model.X_H[1:]))

        lowres_model = convert_SPH_to_stellar_model(self.new_particles(),
                                                    particles_per_zone=100)
        self.assertAlmostRelativeEqual(model.dmass.sum(), 1 | units.MSun, 3)
        self.assertAlmostRelativeEqual(lowres_model.dmass.sum(),
                                       1 | units.MSun, 3)
        self.assertAlmostRelativeEqual(lowres_model.radius, model.radius[1::2],
                                       7)
        self.assertAlmostRelativeEqual(
            lowres_model.X_H, (model.X_H[0::2] + model.X_H[1::2]) / 2.0, 7)
Exemplo n.º 2
0
    def slowtest5(self):
        print "Test convert_SPH_to_stellar_model result in EVtwin"
        stellar_evolution = EVtwin()
        stellar_evolution.parameters.verbosity = True
        stellar_evolution.particles.add_particle(
            Particle(mass=1.0 | units.MSun))  # reference particle
        stellar_evolution.evolve_model(100.0 | units.Myr)

        model = convert_SPH_to_stellar_model(
            self.new_particles())  # model is from center to surface
        stellar_evolution.new_particle_from_model(model, 0.0 | units.Myr)
        print stellar_evolution.particles
        self.assertAlmostEqual(stellar_evolution.particles.age,
                               [100.0, 0.0] | units.Myr, 1)
        stellar_evolution.evolve_model(200.0 | units.Myr)
        print stellar_evolution.particles
        self.assertAlmostEqual(stellar_evolution.particles.age,
                               [200.0, 100.0] | units.Myr, 1)
        self.assertAlmostRelativeEqual(
            stellar_evolution.particles[0].temperature,
            stellar_evolution.particles[1].temperature, 2)
        self.assertAlmostRelativeEqual(
            stellar_evolution.particles[0].luminosity,
            stellar_evolution.particles[1].luminosity, 2)
        stellar_evolution.stop()
Exemplo n.º 3
0
 def handle_collision(self, primary, secondary, stellar_evolution_code=None, gravity_code=None):
     particles = self.local_copy_of_particles(primary, secondary)
     self.collect_required_attributes(particles, gravity_code, stellar_evolution_code)
     self.backtrack_particles(particles)
     gas_particles = self.convert_stars(particles, stellar_evolution_code)
     self.simulate_collision(gas_particles)
     self.models = [convert_SPH_to_stellar_model(group, **self.sph_to_star_arguments) for group in self.groups_after_encounter]
     return self.new_particles_with_internal_structure_from_models()
Exemplo n.º 4
0
 def handle_collision(self, primary, secondary, stellar_evolution_code=None, gravity_code=None):
     particles = self.local_copy_of_particles(primary, secondary)
     self.collect_required_attributes(particles, gravity_code, stellar_evolution_code)
     self.backtrack_particles(particles)
     gas_particles = self.convert_stars(particles, stellar_evolution_code)
     self.simulate_collision(gas_particles)
     self.models = [convert_SPH_to_stellar_model(group, **self.sph_to_star_arguments) for group in self.groups_after_encounter]
     return self.new_particles_with_internal_structure_from_models()
Exemplo n.º 5
0
 def test3(self):
     print "Test convert_SPH_to_stellar_model with particles_per_zone"
     model = convert_SPH_to_stellar_model(self.new_particles(), particles_per_zone=50)
     for variable in ['dmass', 'radius', 'rho', 'temperature', 'luminosity', 'X_H', 
             'X_He', 'X_C', 'X_N', 'X_O', 'X_Ne', 'X_Mg', 'X_Si', 'X_Fe']:
         self.assertTrue(hasattr(model, variable))
         self.assertEqual(len(getattr(model, variable)), 10)
     
     self.assertTrue(numpy.all(model.radius[:-1] <= model.radius[1:])) # monotonically increasing
     self.assertTrue(numpy.all(model.mass[:-1] <= model.mass[1:])) # monotonically increasing
     self.assertTrue(numpy.all(model.temperature[:-1] >= model.temperature[1:]))
     self.assertTrue(numpy.all(model.rho[:-1] >= model.rho[1:]))
     self.assertTrue(numpy.all(model.X_H[:-1] <= model.X_H[1:]))
     
     lowres_model = convert_SPH_to_stellar_model(self.new_particles(), particles_per_zone=100)
     self.assertAlmostRelativeEqual(model.dmass.sum(), 1|units.MSun, 3)
     self.assertAlmostRelativeEqual(lowres_model.dmass.sum(), 1|units.MSun, 3)
     self.assertAlmostRelativeEqual(lowres_model.radius, model.radius[1::2], 7)
     self.assertAlmostRelativeEqual(lowres_model.X_H, (model.X_H[0::2]+model.X_H[1::2])/2.0, 7)
Exemplo n.º 6
0
 def slowtest4(self):
     print "Test convert_SPH_to_stellar_model result in MESA"
     stellar_evolution = self.new_instance(MESA)
     stellar_evolution.particles.add_particle(Particle(mass=1.0|units.MSun)) # reference particle
     stellar_evolution.evolve_model(100.0|units.Myr)
     
     model = convert_SPH_to_stellar_model(self.new_particles()) # model is from center to surface
     stellar_evolution.new_particle_from_model(model, 0.0|units.Myr)
     print stellar_evolution.particles
     self.assertAlmostEqual(stellar_evolution.particles.age, [118.18, 0.0] | units.Myr, 1)
     stellar_evolution.evolve_model(200.0|units.Myr)
     print stellar_evolution.particles
     self.assertAlmostEqual(stellar_evolution.particles.age, [204.59, 103.02] | units.Myr, 1)
     self.assertAlmostRelativeEqual(stellar_evolution.particles[0].temperature, 
         stellar_evolution.particles[1].temperature, 2)
     self.assertAlmostRelativeEqual(stellar_evolution.particles[0].luminosity, 
         stellar_evolution.particles[1].luminosity, 2)
     stellar_evolution.stop()
Exemplo n.º 7
0
 def slowtest5(self):
     print "Test convert_SPH_to_stellar_model result in EVtwin"
     stellar_evolution = EVtwin()
     stellar_evolution.parameters.verbosity = True
     stellar_evolution.particles.add_particle(Particle(mass=1.0|units.MSun)) # reference particle
     stellar_evolution.evolve_model(100.0|units.Myr)
     
     model = convert_SPH_to_stellar_model(self.new_particles()) # model is from center to surface
     stellar_evolution.new_particle_from_model(model, 0.0|units.Myr)
     print stellar_evolution.particles
     self.assertAlmostEqual(stellar_evolution.particles.age, [100.0, 0.0] | units.Myr, 1)
     stellar_evolution.evolve_model(200.0|units.Myr)
     print stellar_evolution.particles
     self.assertAlmostEqual(stellar_evolution.particles.age, [200.0, 100.0] | units.Myr, 1)
     self.assertAlmostRelativeEqual(stellar_evolution.particles[0].temperature, 
         stellar_evolution.particles[1].temperature, 2)
     self.assertAlmostRelativeEqual(stellar_evolution.particles[0].luminosity, 
         stellar_evolution.particles[1].luminosity, 2)
     stellar_evolution.stop()
Exemplo n.º 8
0
def merge_two_stars_sph(Mprim, Msec, t_coll):

    star =  Particle(mass=Mprim)
    stellar_evolution = EVtwin()
    EVTwin_star = stellar_evolution.particles.add_particle(star)
    stellar_evolution.evolve_model(t_coll)
    print("star=", EVTwin_star)
    EVTwin_radius = EVTwin_star.get_radius_profile()
    EVTwin_rho    = EVTwin_star.get_density_profile()
    
    N_sph = 100*Mprim.value_in(units.MSun)
    primary_star = convert_stellar_model_to_SPH(EVTwin_star, N_sph).gas_particles
    stellar_evolution.stop()

    converter=nbody_system.nbody_to_si(Mprim, 1.0|units.AU)
    hydro = Gadget2(converter)
    hydro.gas_particles.add_particles(primary_star)
    channel =  hydro.gas_particles.new_channel_to(primary_star)
    hydro.evolve_model(1.0|units.s)

    channel.copy()
    hydro.stop()

    pyplot.scatter(primary_star.x.value_in(units.AU), primary_star.y.value_in(units.AU))
    pyplot.show()

    new_stellar_model = convert_SPH_to_stellar_model(primary_star)
    stellar_evolution = MESA(redirection="none")
    stellar_evolution.commit_parameters()
    
    stellar_evolution.new_particle_from_model(new_stellar_model, t_coll)
    MESA_star = stellar_evolution.particles[0]
    print("star=", MESA_star)
    MESA_radius = MESA_star.get_radius_profile()
    MESA_rho    = MESA_star.get_density_profile()
    stellar_evolution.stop()
    plot_density_profile(MESA_radius, MESA_rho)
    plot_density_profile(EVTwin_radius, EVTwin_rho)
    pyplot.semilogy()
    pyplot.show()
Exemplo n.º 9
0
def merge_two_stars_sph(Mprim, Msec, t_coll):

    star =  Particle(mass=Mprim)
    stellar_evolution = EVtwin()
    EVTwin_star = stellar_evolution.particles.add_particle(star)
    stellar_evolution.evolve_model(t_coll)
    print "star=", EVTwin_star
    EVTwin_radius = EVTwin_star.get_radius_profile()
    EVTwin_rho    = EVTwin_star.get_density_profile()
    
    N_sph = 100*Mprim.value_in(units.MSun)
    primary_star = convert_stellar_model_to_SPH(EVTwin_star, N_sph).gas_particles
    stellar_evolution.stop()

    converter=nbody_system.nbody_to_si(Mprim, 1.0|units.AU)
    hydro = Gadget2(converter)
    hydro.gas_particles.add_particles(primary_star)
    channel =  hydro.gas_particles.new_channel_to(primary_star)
    hydro.evolve_model(1.0|units.s)

    channel.copy()
    hydro.stop()

    pyplot.scatter(primary_star.x.value_in(units.AU), primary_star.y.value_in(units.AU))
    pyplot.show()

    new_stellar_model = convert_SPH_to_stellar_model(primary_star)
    stellar_evolution = MESA(redirection="none")
    stellar_evolution.commit_parameters()
    
    stellar_evolution.new_particle_from_model(new_stellar_model, t_coll)
    MESA_star = stellar_evolution.particles[0]
    print "star=", MESA_star
    MESA_radius = MESA_star.get_radius_profile()
    MESA_rho    = MESA_star.get_density_profile()
    stellar_evolution.stop()
    plot_density_profile(MESA_radius, MESA_rho)
    plot_density_profile(EVTwin_radius, EVTwin_rho)
    pyplot.semilogy()
    pyplot.show()
Exemplo n.º 10
0
    def slowtest4(self):
        print "Test convert_SPH_to_stellar_model result in MESA"
        stellar_evolution = self.new_instance(MESA)
        stellar_evolution.particles.add_particle(
            Particle(mass=1.0 | units.MSun))  # reference particle
        stellar_evolution.evolve_model(100.0 | units.Myr)

        model = convert_SPH_to_stellar_model(
            self.new_particles())  # model is from center to surface
        stellar_evolution.new_particle_from_model(model, 0.0 | units.Myr)
        print stellar_evolution.particles
        self.assertAlmostEqual(stellar_evolution.particles.age,
                               [118.18, 0.0] | units.Myr, 1)
        stellar_evolution.evolve_model(200.0 | units.Myr)
        print stellar_evolution.particles
        self.assertAlmostEqual(stellar_evolution.particles.age,
                               [204.59, 103.02] | units.Myr, 1)
        self.assertAlmostRelativeEqual(
            stellar_evolution.particles[0].temperature,
            stellar_evolution.particles[1].temperature, 2)
        self.assertAlmostRelativeEqual(
            stellar_evolution.particles[0].luminosity,
            stellar_evolution.particles[1].luminosity, 2)
        stellar_evolution.stop()
Exemplo n.º 11
0
def merge_two_stars_spz_and_evolve(Mprim, Msec, tcoll, tend):

    stellar = EVtwin()
    stars = Particles(2)
    stars[0].mass = Mprim
    stars[1].mass = Msec
    stellar.particles.add_particle(stars[0])
    stellar.particles.add_particle(stars[1])
    time = [] | units.Myr
    mass = [] | units.MSun
    radius = [] | units.RSun
    temperature = [] | units.K
    luminosity = [] | units.LSun
    while stellar.model_time<tcoll:
        stellar.evolve_model()
        time.append(stellar.model_time)
        mass.append(stellar.particles[0].mass)
        radius.append(stellar.particles[0].radius)
        temperature.append(stellar.particles[0].temperature)
        luminosity.append(stellar.particles[0].luminosity)
        print "Time=", time[-1], mass[-1], radius[-1], temperature[-1].in_(units.K), luminosity[-1].in_(units.LSun)
    n_normal = len(time)

    print stars
    Nprim = int(100*stellar.particles[0].mass.value_in(units.MSun))
    mgas = stellar.particles[0].mass/Nprim
    Nsec = int(stellar.particles[1].mass/mgas)
    print "N gas=", Nprim, Nsec
    sph_primary = convert_stellar_model_to_SPH(
        stellar.particles[0], 
        Nprim, 
        seed=12345
    ).gas_particles
    sph_secondary = convert_stellar_model_to_SPH(
        stellar.particles[0], 
        Nsec, 
        seed=12345
    ).gas_particles
    stellar.stop()

    distance = 1 | units.RSun
    sph_secondary.x += distance
    sph_secondary.vx -= 1.7*numpy.sqrt(2*constants.G*stars.mass.sum()/distance)

    sph_particles = Particles()
    sph_particles.add_particles(sph_primary)
    #sph_particles.add_particles(sph_secondary)
    sph_particles.move_to_center()

    converter = nbody_system.nbody_to_si(1|units.hour, 1|units.RSun)

    hydrodynamics = Gadget2(converter)
    hydrodynamics.gas_particles.add_particles(sph_particles)
    hydrodynamics.evolve_model(10.0|units.hour)
    hydrodynamics.gas_particles.copy_values_of_attributes_to(["density", "u", "pressure"],
                                                             sph_particles)
    hydrodynamics.stop()

    print "N all=", len(sph_particles)
    clumps = find_clumps(sph_particles, converter)
    #sph_particles = clumps[0]
    print "N blob=", len(sph_particles)
    #plot_clumps(clumps)
    #sph_merger = sph_particles[0]

    print "convert SPH to stellar model"
    merged_star = convert_SPH_to_stellar_model(sph_particles)

    #stellar_evolution = MESA()
    print "initiate stellar evolution model"
    stellar_evolution = EVtwin(redirect="none")    
    stellar_evolution.new_particle_from_model(merged_star, 0.0|units.Myr)
    print "star:", stellar_evolution.particles
    print "evolve star"
    #stellar_evolution.evolve_model(tend)
    while stellar_evolution.model_time<(tend-tcoll):
        stellar_evolution.evolve_model()
        time.append(stellar_evolution.model_time)
        mass.append(stellar_evolution.particles[0].mass)
        radius.append(stellar_evolution.particles[0].radius)
        temperature.append(stellar_evolution.particles[0].temperature)
        luminosity.append(stellar_evolution.particles[0].luminosity)
        print "Time=", time[-1], mass[-1], radius[-1], temperature[-1].in_(units.K), luminosity[-1].in_(units.LSun)

    print stellar_evolution.particles
    stellar_evolution.stop()
    
    return time, mass, radius, temperature, luminosity, n_normal
def merge_two_stars_sph_and_evolve(Mprim, Msec, tcoll, tend):
    stars = Particles(2)
    stars[0].mass = Mprim
    stars[1].mass = Msec
    stellar = EVtwin()
    stellar.particles.add_particle(stars[0])
    stellar.particles.add_particle(stars[1])
    
    time = [] | units.Myr
    mass = [] | units.MSun
    radius = [] | units.RSun
    temperature = [] | units.K
    luminosity = [] | units.LSun
    while stellar.model_time < tcoll:
        stellar.evolve_model()
        time.append(stellar.model_time)
        mass.append(stellar.particles[0].mass)
        radius.append(stellar.particles[0].radius)
        temperature.append(stellar.particles[0].temperature)
        luminosity.append(stellar.particles[0].luminosity)
        print "Time=", time[-1], mass[-1], radius[-1], \
              temperature[-1].in_(units.K), luminosity[-1].in_(units.LSun)
    n_normal = len(time)

    print stars
    Nprim = int(100*stellar.particles[0].mass.value_in(units.MSun))
    mgas = stellar.particles[0].mass/Nprim
    Nsec = int(stellar.particles[1].mass/mgas)
    print "N gas=", Nprim, Nsec
    sph_primary = convert_stellar_model_to_SPH(
        stellar.particles[0],
        Nprim, 
        seed=12345
    ).gas_particles
    sph_secondary = convert_stellar_model_to_SPH(
        stellar.particles[0], 
        Nsec, 
        seed=12345
    ).gas_particles
    stellar.stop()

    distance = 1 | units.RSun
    sph_secondary.x += distance
    sph_secondary.vx -= 1.7*numpy.sqrt(2*constants.G*stars.mass.sum()/distance)

    sph_particles = Particles()
    sph_particles.add_particles(sph_primary)
    #sph_particles.add_particles(sph_secondary)
    sph_particles.move_to_center()

    converter = nbody_system.nbody_to_si(1|units.hour, 1|units.RSun)

    hydrodynamics = Gadget2(converter)
    hydrodynamics.gas_particles.add_particles(sph_particles)
    hydrodynamics.evolve_model(10.0|units.hour)
    hydrodynamics.gas_particles.copy_values_of_attributes_to(["density", "u",
                                                              "pressure"],
                                                             sph_particles)
    hydrodynamics.stop()

    print "N all=", len(sph_particles)
    clumps = find_clumps(sph_particles, converter)
    #sph_particles = clumps[0]
    print "N blob=", len(sph_particles)
    #plot_clumps(clumps)
    #sph_merger = sph_particles[0]

    print "convert SPH to stellar model"
    merged_star = convert_SPH_to_stellar_model(sph_particles)

    print "initiate stellar evolution model"
    #stellar_evolution = MESA()
    stellar_evolution = EVtwin(redirect="none")    
    stellar_evolution.new_particle_from_model(merged_star, 0.0|units.Myr)
    print "star:", stellar_evolution.particles
    print "evolve star"
    #stellar_evolution.evolve_model(tend)
    while stellar_evolution.model_time<(tend-tcoll):
        stellar_evolution.evolve_model()
        time.append(stellar_evolution.model_time)
        mass.append(stellar_evolution.particles[0].mass)
        radius.append(stellar_evolution.particles[0].radius)
        temperature.append(stellar_evolution.particles[0].temperature)
        luminosity.append(stellar_evolution.particles[0].luminosity)
        print "Time=", time[-1], mass[-1], radius[-1], \
              temperature[-1].in_(units.K), luminosity[-1].in_(units.LSun)

    print stellar_evolution.particles
    stellar_evolution.stop()
    
    return time, mass, radius, temperature, luminosity, n_normal
def merge_two_stars_sph_and_evolve(Mprim, Msec, tcoll, tend):
    stars = Particles(2)
    stars.mass = [Mprim.value_in(units.MSun),
                  Msec.value_in(units.MSun)] | units.MSun
    stellar_evolution = MESA()
    stellar_evolution.particles.add_particles(stars)

    # Evolve the stars to tcoll.

    while stellar_evolution.model_time < tcoll:
        stellar_evolution.evolve_model()
        print "Time=", stellar_evolution.model_time, \
              stellar_evolution.particles[0].stellar_type, \
              stellar_evolution.particles[0].mass, \
              stellar_evolution.particles[0].radius, \
              stellar_evolution.particles[0].temperature.in_(units.K), \
              stellar_evolution.particles[0].luminosity.in_(units.LSun)

    print stars

    # Convert to SPH particles (nsph per solar mass).

    nsph = 100
    Nprim = int(nsph *
                stellar_evolution.particles[0].mass.value_in(units.MSun))
    mgas = stellar_evolution.particles[0].mass / Nprim
    Nsec = int(stellar_evolution.particles[1].mass / mgas)
    print "N gas =", Nprim, Nsec
    sph_primary = convert_stellar_model_to_SPH(stellar_evolution.particles[0],
                                               Nprim,
                                               seed=12345).gas_particles
    sph_secondary = convert_stellar_model_to_SPH(
        stellar_evolution.particles[1], Nsec, seed=12345).gas_particles
    stellar_evolution.stop()

    # Merge the stars using SPH.

    distance = 2 | units.RSun
    sph_secondary.x += distance
    vx = numpy.sqrt(2 * constants.G * stars.mass.sum() / distance)
    sph_secondary.vx -= vx
    print 'distance =', distance, 'vx =', vx.in_(units.kms),
    print 'd/v =', (distance / vx).in_(units.hour)

    sph_particles = Particles()
    sph_particles.add_particles(sph_primary)
    sph_particles.add_particles(sph_secondary)
    sph_particles.move_to_center()

    converter = nbody_system.nbody_to_si(1 | units.hour, 1 | units.RSun)
    hydrodynamics = Gadget2(converter)
    hydrodynamics.gas_particles.add_particles(sph_particles)
    tf = 10. | units.hour
    hydrodynamics.evolve_model(tf)
    hydrodynamics.gas_particles.copy_values_of_attributes_to(
        ["x", "y", "z", "vx", "vy", "vz", "density", "u", "pressure"],
        sph_particles)
    hydrodynamics.stop()

    # Convert back to a stellar model.

    print "N all =", len(sph_particles)
    sph_particles.move_to_center()
    clumps = find_clumps(sph_particles, converter)
    sph_particles = clumps[0]
    print "N blob =", len(sph_particles)
    #plot_clumps(clumps)
    print "convert SPH to stellar model"
    sph_particles.move_to_center()
    merged_star = convert_SPH_to_stellar_model(sph_particles)

    # Evolve the stellar model.

    print "initiate stellar evolution model"
    #stellar_evolution = MESA(redirect="none")
    stellar_evolution = EVtwin(redirect="none")
    stellar_evolution.new_particle_from_model(merged_star, 0.0 | units.Myr)
    print "star:", stellar_evolution.particles
    print "evolve star"
    time = [] | units.Myr
    mass = [] | units.MSun
    radius = [] | units.RSun
    temperature = [] | units.K
    luminosity = [] | units.LSun
    stellar_type = []
    while stellar_evolution.model_time < (tend - tcoll):
        try:
            stellar_evolution.evolve_model()
            time.append(stellar_evolution.model_time)
            mass.append(stellar_evolution.particles[0].mass)
            radius.append(stellar_evolution.particles[0].radius)
            temperature.append(stellar_evolution.particles[0].temperature)
            luminosity.append(stellar_evolution.particles[0].luminosity)
            stellar_type.append(stellar_evolution.particles[0].stellar_type)
            print "Time=", time[-1], stellar_type[-1], mass[-1], radius[-1], \
                temperature[-1].in_(units.K), luminosity[-1].in_(units.LSun)
            if stellar_type[-1] >= 4 | units.stellar_type:
                break
        except:
            print 'Code crashed at time', stellar_evolution.model_time
            break

    stellar_evolution.stop()
    return time, stellar_type, mass, radius, temperature, luminosity
Exemplo n.º 14
0
def merge_two_stars_sph_and_evolve(Mprim, Msec, tcoll, tend):
    stars = Particles(2)
    stars.mass = [Mprim.value_in(units.MSun),
                  Msec.value_in(units.MSun)] | units.MSun
    stellar_evolution = MESA()
    stellar_evolution.particles.add_particles(stars)

    # Evolve the stars to tcoll.
    
    while stellar_evolution.model_time < tcoll:
        stellar_evolution.evolve_model()
        print "Time=", stellar_evolution.model_time, \
              stellar_evolution.particles[0].stellar_type, \
              stellar_evolution.particles[0].mass, \
              stellar_evolution.particles[0].radius, \
              stellar_evolution.particles[0].temperature.in_(units.K), \
              stellar_evolution.particles[0].luminosity.in_(units.LSun)

    print stars

    # Convert to SPH particles (nsph per solar mass).

    nsph = 100
    Nprim = int(nsph*stellar_evolution.particles[0].mass.value_in(units.MSun))
    mgas = stellar_evolution.particles[0].mass/Nprim
    Nsec = int(stellar_evolution.particles[1].mass/mgas)
    print "N gas =", Nprim, Nsec
    sph_primary = convert_stellar_model_to_SPH(
        stellar_evolution.particles[0],
        Nprim, 
        seed=12345
    ).gas_particles
    sph_secondary = convert_stellar_model_to_SPH(
        stellar_evolution.particles[1], 
        Nsec, 
        seed=12345
    ).gas_particles
    stellar_evolution.stop()

    # Merge the stars using SPH.
    
    distance = 2 | units.RSun
    sph_secondary.x += distance
    vx = numpy.sqrt(2*constants.G*stars.mass.sum()/distance)
    sph_secondary.vx -= vx
    print 'distance =', distance, 'vx =', vx.in_(units.kms),
    print 'd/v =', (distance/vx).in_(units.hour)
    
    sph_particles = Particles()
    sph_particles.add_particles(sph_primary)
    sph_particles.add_particles(sph_secondary)
    sph_particles.move_to_center()
    
    converter = nbody_system.nbody_to_si(1|units.hour, 1|units.RSun)
    hydrodynamics = Gadget2(converter)
    hydrodynamics.gas_particles.add_particles(sph_particles)
    tf = 10.|units.hour
    hydrodynamics.evolve_model(tf)
    hydrodynamics.gas_particles.copy_values_of_attributes_to(["x", "y", "z",
                                                              "vx", "vy", "vz",
                                                              "density",
                                                              "u", "pressure"],
                                                             sph_particles)
    hydrodynamics.stop()

    # Convert back to a stellar model.
    
    print "N all =", len(sph_particles)
    sph_particles.move_to_center()
    clumps = find_clumps(sph_particles, converter)
    sph_particles = clumps[0]
    print "N blob =", len(sph_particles)
    #plot_clumps(clumps)
    print "convert SPH to stellar model"
    sph_particles.move_to_center()
    merged_star = convert_SPH_to_stellar_model(sph_particles)

    # Evolve the stellar model.
    
    print "initiate stellar evolution model"
    #stellar_evolution = MESA(redirect="none")    
    stellar_evolution = EVtwin(redirect="none")    
    stellar_evolution.new_particle_from_model(merged_star, 0.0|units.Myr)
    print "star:", stellar_evolution.particles
    print "evolve star"
    time = [] | units.Myr
    mass = [] | units.MSun
    radius = [] | units.RSun
    temperature = [] | units.K
    luminosity = [] | units.LSun
    stellar_type = [] 
    while stellar_evolution.model_time < (tend-tcoll):
        try:
            stellar_evolution.evolve_model()
            time.append(stellar_evolution.model_time)
            mass.append(stellar_evolution.particles[0].mass)
            radius.append(stellar_evolution.particles[0].radius)
            temperature.append(stellar_evolution.particles[0].temperature)
            luminosity.append(stellar_evolution.particles[0].luminosity)
            stellar_type.append(stellar_evolution.particles[0].stellar_type)
            print "Time=", time[-1], stellar_type[-1], mass[-1], radius[-1], \
                temperature[-1].in_(units.K), luminosity[-1].in_(units.LSun)
            if stellar_type[-1] >= 4 | units.stellar_type:
                break
        except:
            print 'Code crashed at time', stellar_evolution.model_time
            break

    stellar_evolution.stop()
    return time, stellar_type, mass, radius, temperature, luminosity
Exemplo n.º 15
0
    print "initialize star"
    stellar_evolution = EVtwin()
    stellar_evolution.particles.add_particle(Particle(mass=o.Mprim))
    stellar_evolution.evolve_model(o.time)
    particles = convert_stellar_model_to_SPH(stellar_evolution.particles[0],
                                             500,
                                             seed=12345).gas_particles
    stellar_evolution.stop()
    from amuse.units.generic_unit_converter import ConvertBetweenGenericAndSiUnits

    print "convert star to SPH"
    converter = nbody_system.nbody_to_si(1 | units.hour, 1 | units.RSun)
    hydrodynamics = Gadget2(converter)
    hydrodynamics.gas_particles.add_particles(particles)
    hydrodynamics.evolve_model(1.0 | units.s)
    hydrodynamics.gas_particles.copy_values_of_attributes_to(
        ["density", "u", "pressure"], particles)
    hydrodynamics.stop()

    print "convert SPH to stellar model"
    model = convert_SPH_to_stellar_model(particles)

    #stellar_evolution = MESA()
    print "initiate stellar evolution model"
    stellar_evolution = EVtwin(redirect="none")
    stellar_evolution.new_particle_from_model(model, 0.0 | units.Myr)
    print "star:", stellar_evolution.particles
    print "evolve star"
    stellar_evolution.evolve_model(2 * o.time)
    print stellar_evolution.particles