def main(Ndisk, Mstar, Mdisk, Rin, Rout, t_end, Nray, x, y, z):

    time = 0 | units.Myr
    supernova_IIp = Supernova_IIp(10|units.day)
    
    efficiency_factor = 0.1
    Rsn = efficiency_factor * (x**2 + y**2 + z**2)**0.5

    supernova = Particle()
    supernova.position = (x.value_in(units.parsec),
                          y.value_in(units.parsec),
                          z.value_in(units.parsec)) |units.parsec
    supernova.position *= efficiency_factor
    supernova_IIp.particles.add_particle(supernova)
    supernova_IIp.evolve_model(time)
    supernova.luminosity = efficiency_factor**2 * supernova.luminosity
    supernova.xion = 0.0
    supernova.u = (10**51 | units.erg)/(10|units.MSun)
    
    stellar = SeBa()
    star = Particle()
    star.mass = Mstar
    star.position = (0,0,0) | units.AU
    star.velocity = (0,0,0) | units.kms
    stellar.particles.add_particle(star)
    stellar.evolve_model(1|units.Myr)
    star.luminosity = stellar.particles[0].luminosity/(20. | units.eV)
    star.temperature = stellar.particles[0].temperature
    stellar.stop()
    star.u = (9. |units.kms)**2
    star.xion = 0.0
    print star

    print "M=", Mdisk/Mstar    
    converter=nbody_system.nbody_to_si(Mstar, 1 | units.AU)
    disk = ProtoPlanetaryDisk(Ndisk, convert_nbody=converter,
                              Rmin=Rin.value_in(units.AU), 
                              Rmax=Rout.value_in(units.AU),
                              q_out=25.0, discfraction=Mdisk/Mstar).result
####                              q_out=2.0, discfraction=Mdisk/Mstar).result
    print disk.x.max().in_(units.AU)
    print disk.mass.sum().in_(units.MSun)
    print disk.u.max().in_(units.kms**2)
    print disk.mass.min().in_(units.MSun)
    disk.flux = 0. | units.s**-1
    disk.xion = 0.0

    dt = t_end/1000.
    
    hydro = Fi(converter)
    hydro.parameters.use_hydro_flag=True
    hydro.parameters.radiation_flag=False
    hydro.parameters.self_gravity_flag=True
    
    hydro.parameters.gamma=1.
    hydro.parameters.isothermal_flag=True

# Non-isothermal: lowest temperature remains constat at 20K
#    hydro.parameters.gamma=1.66667
#    hydro.parameters.isothermal_flag=False
    
    hydro.parameters.integrate_entropy_flag=False
    hydro.parameters.timestep=0.5 | units.hour #0.125 | units.day
#    hydro.parameters.verbosity=99
    hydro.parameters.epsilon_squared=0.1 | units.AU**2
    hydro.parameters.courant=0.2    
    hydro.parameters.artificial_viscosity_alpha = 0.1 
    
    hydro.gas_particles.add_particles(disk)
    hydro.dm_particles.add_particle(star)
    hydro_to_disk = hydro.gas_particles.new_channel_to(disk)
    hydro_to_star = hydro.dm_particles.new_channel_to(star.as_set())
    disk_to_hydro = disk.new_channel_to(hydro.gas_particles)
    star_to_hydro = star.as_set().new_channel_to(hydro.dm_particles)
    hydro.evolve_model(1|units.hour)
    hydro_to_disk.copy()
    hydro_to_star.copy()
    
    radiative = SPHRay(redirection="file",
                       number_of_workers=4)#, debugger="gdb")
    radiative.parameters.number_of_rays=Nray/dt
    print dt.in_(units.yr)
    radiative.parameters.default_spectral_type=-3.
    radiative.parameters.box_size=10000. | units.AU
    radiative.parameters.ionization_temperature_solver=2
    print radiative.parameters

#    radiative.src_particles.add_particle(star)
    radiative.src_particles.add_particle(supernova)
    radiative.gas_particles.add_particles(disk)

    gas_to_rad = disk.new_channel_to(radiative.gas_particles)
    rad_to_gas = radiative.gas_particles.new_channel_to(disk)
    
    print "Before"
    print "Luminosity:", radiative.src_particles.luminosity
    print "min ionization:", radiative.gas_particles.xion.min()
    print "average Xion:", radiative.gas_particles.xion.mean()
    print "max ionization:", radiative.gas_particles.xion.max()
    print "min u:", radiative.gas_particles.u.min()
    print "average u:", radiative.gas_particles.u.mean()
    print "max u:", radiative.gas_particles.u.max()

    Tmean = [] | units.K
    Tmin = [] | units.K
    Tmax = [] | units.K
    t = [] | units.day
    while radiative.model_time<t_end:

        supernova = update_source_particle(radiative, time+0.5*dt, supernova,
                                           efficiency_factor, supernova_IIp)

        radiative.evolve_model(time+0.5*dt)
        print "RT done at time:", time.in_(units.day)
        rad_to_gas.copy()

        disk_to_hydro.copy()
        star_to_hydro.copy()
        hydro.evolve_model(time + dt)
        hydro_to_disk.copy()
        hydro_to_star.copy()

        supernova = update_source_particle(radiative, time+dt, supernova,
                                           efficiency_factor, supernova_IIp)

        radiative.evolve_model(time+dt)
        print "RT done at time:", time.in_(units.day)
        rad_to_gas.copy()

        time += dt
        print_diagnostics(time, supernova, disk)
        
        Temperature =  mu() / constants.kB * disk.u
        t.append(time)
        Tmean.append(Temperature.mean())
        Tmin.append(Temperature.min())
        Tmax.append(Temperature.max())

        #write_set_to_file(disk, "disk_irradiation.amuse", "amuse")
        
        print "timescale:", (disk.mass.sum().value_in(units.amu) \
                              / ((Rout/Rsn)**2*supernova.luminosity)).in_(units.yr)
        print "scaleheight:", abs(disk.z.value_in(units.AU)).mean()
        
        #pyplot.hist2d(abs(disk.x.value_in(units.AU)), abs(numpy.log10(Temperature.value_in(units.K))), bins=200)
       # pyplot.hist2d(abs(disk.x.value_in(units.AU)), abs(disk.z.value_in(units.AU)), bins=200)
        #,norm=LogNorm())
       #, Temperature.in_(units.K))
#       pyplot.tripcolor(abs(disk.x.value_in(units.AU)), abs(disk.y.value_in(units.AU)), Temperature.in_(units.K))
        #pyplot.hist(abs(disk.x.value_in(units.AU)), 100)
       # pyplot.show()

    print_diagnostics(time, supernova, disk)

    #plot_ionization_fraction(disk.position, disk.xion)
#    plot_ionization_fraction(disk.z, disk.u.value_in(units.kms**2))
#    plot_ionization_fraction(disk.x, disk.u.value_in(units.kms**2))
    radiative.stop()
    plot_temperature(t, Tmin, Tmean, Tmax)
예제 #2
0
def main(Ndisk, Mstar, Mdisk, Rin, Rout, t_end, Nray, x, y, z):

    time = 0 | units.Myr
    supernova_IIp = Supernova_IIp(10|units.day)
    
    efficiency_factor = 0.1
    Rsn = efficiency_factor * (x**2 + y**2 + z**2)**0.5

    supernova=Particle()
    supernova.position = (x.value_in(units.parsec),
                          y.value_in(units.parsec),
                          z.value_in(units.parsec)) |units.parsec
    supernova.position *= efficiency_factor
    supernova.luminosity = efficiency_factor**2 * supernova_IIp.luminosity_at_time(time)/(20.|units.eV)
#    supernova.flux = supernova.luminosity
    supernova.xion = 0.0
    supernova.u = (10**51 | units.erg)/(10|units.MSun)
    
    stellar = SeBa()
    star = Particle()
    star.mass = Mstar
    star.position = (0,0,0) | units.AU
    star.velocity = (0,0,0) | units.kms
    stellar.particles.add_particle(star)
    stellar.evolve_model(1|units.Myr)
    star.luminosity = stellar.particles[0].luminosity/(20. | units.eV)
    star.temperature = stellar.particles[0].temperature
    stellar.stop()
    star.u = (9. |units.kms)**2
    star.xion = 0.0
    print star

    print "M=", Mdisk/Mstar    
    converter=nbody_system.nbody_to_si(Mstar, 1 | units.AU)
    disk = ProtoPlanetaryDisk(Ndisk, convert_nbody=converter,
                              Rmin=Rin.value_in(units.AU), 
                              Rmax=Rout.value_in(units.AU),
                              q_out=25.0, discfraction=Mdisk/Mstar).result
####                              q_out=2.0, discfraction=Mdisk/Mstar).result
    print disk.x.max().in_(units.AU)
    print disk.mass.sum().in_(units.MSun)
    print disk.u.max().in_(units.kms**2)
    print disk.mass.min().in_(units.MSun)
    disk.flux = 0. | units.s**-1
    disk.xion = 0.0

    dt = t_end/1000.
    
    hydro = Fi(converter)
    hydro.parameters.use_hydro_flag=True
    hydro.parameters.radiation_flag=False
    hydro.parameters.self_gravity_flag=True
    
    hydro.parameters.gamma=1.
    hydro.parameters.isothermal_flag=True

# Non-isothermal: lowest temperature remains constat at 20K
#    hydro.parameters.gamma=1.66667
#    hydro.parameters.isothermal_flag=False
    
    hydro.parameters.integrate_entropy_flag=False
    hydro.parameters.timestep=0.5 | units.hour #0.125 | units.day
#    hydro.parameters.verbosity=99
    hydro.parameters.epsilon_squared=0.1 | units.AU**2
    hydro.parameters.courant=0.2    
    hydro.parameters.artificial_viscosity_alpha = 0.1 
    
    hydro.gas_particles.add_particles(disk)
    hydro.dm_particles.add_particle(star)
    hydro_to_disk = hydro.gas_particles.new_channel_to(disk)
    hydro_to_star = hydro.dm_particles.new_channel_to(star.as_set())
    disk_to_hydro = disk.new_channel_to(hydro.gas_particles)
    star_to_hydro = star.as_set().new_channel_to(hydro.dm_particles)
    hydro.evolve_model(1|units.hour)
    hydro_to_disk.copy()
    hydro_to_star.copy()
    
    radiative = SPHRay(redirection="file", number_of_workers=4)#, debugger="gdb")
    radiative.parameters.number_of_rays=Nray/dt
    print dt.in_(units.yr)
    radiative.parameters.default_spectral_type=-3.
    radiative.parameters.box_size=10000. | units.AU
    radiative.parameters.ionization_temperature_solver=2
    print radiative.parameters

#    radiative.src_particles.add_particle(star)
    radiative.src_particles.add_particle(supernova)
    radiative.gas_particles.add_particles(disk)

    gas_to_rad = disk.new_channel_to(radiative.gas_particles)
    rad_to_gas = radiative.gas_particles.new_channel_to(disk)
    
    print "Before"
    print "Luminosity:", radiative.src_particles.luminosity
    print "min ionization:", radiative.gas_particles.xion.min()
    print "average Xion:", radiative.gas_particles.xion.mean()
    print "max ionization:", radiative.gas_particles.xion.max()
    print "min u:", radiative.gas_particles.u.min()
    print "average u:", radiative.gas_particles.u.mean()
    print "max u:", radiative.gas_particles.u.max()

    Tmean = [] | units.K
    Tmin = [] | units.K
    Tmax = [] | units.K
    t = [] | units.day
    while radiative.model_time<t_end:

        supernova = update_source_particle(radiative, time+0.5*dt, supernova, efficiency_factor, supernova_IIp)

        radiative.evolve_model(time+0.5*dt)
        print "RT done at time:", time.in_(units.day)
        rad_to_gas.copy()

        disk_to_hydro.copy()
        star_to_hydro.copy()
        hydro.evolve_model(time + dt)
        hydro_to_disk.copy()
        hydro_to_star.copy()

        supernova = update_source_particle(radiative, time+dt, supernova, efficiency_factor, supernova_IIp)

        radiative.evolve_model(time+dt)
        print "RT done at time:", time.in_(units.day)
        rad_to_gas.copy()

        time += dt
        print_diagnostics(time, supernova, disk)
        
        Temperature =  mu() / constants.kB * disk.u
        t.append(time)
        Tmean.append(Temperature.mean())
        Tmin.append(Temperature.min())
        Tmax.append(Temperature.max())

        #write_set_to_file(disk, "disk_irradiation.amuse", "amuse")
        
        print "timescale:", (disk.mass.sum().value_in(units.amu)/((Rout/Rsn)**2*supernova.luminosity)).in_(units.yr)
        print "scaleheight:", abs(disk.z.value_in(units.AU)).mean()
        
        #pyplot.hist2d(abs(disk.x.value_in(units.AU)), abs(numpy.log10(Temperature.value_in(units.K))), bins=200)
       # pyplot.hist2d(abs(disk.x.value_in(units.AU)), abs(disk.z.value_in(units.AU)), bins=200)
        #,norm=LogNorm())
       #, Temperature.in_(units.K))
#       pyplot.tripcolor(abs(disk.x.value_in(units.AU)), abs(disk.y.value_in(units.AU)), Temperature.in_(units.K))
        #pyplot.hist(abs(disk.x.value_in(units.AU)), 100)
       # pyplot.show()

    print_diagnostics(time, supernova, disk)

    #plot_ionization_fraction(disk.position, disk.xion)
#    plot_ionization_fraction(disk.z, disk.u.value_in(units.kms**2))
#    plot_ionization_fraction(disk.x, disk.u.value_in(units.kms**2))
    radiative.stop()
    plot_temperature(t, Tmin, Tmean, Tmax)
예제 #3
0
def disk_in_cluster(N_stars, N_gasParticles, W0):

	#set up protoplanetary disk
	Mdisk = 1.|units.MSun
	Rdisk = 100.|units.AU # HD 106906 b is at 700 AU
	Rmin, Rmax = 1.|units.AU, Rdisk
	converter_disk = nbody_system.nbody_to_si(Mdisk, Rdisk)

	disk_particles = ProtoPlanetaryDisk(N_gasParticles, convert_nbody=converter_disk, densitypower=1.5, Rmin=Rmin.value_in(units.AU), Rmax=Rmax.value_in(units.AU), q_out=1.0, discfraction=1.0).result

	hydro = Fi(converter_disk, mode='openmp')
	hydro.gas_particles.add_particles(disk_particles)

	hydro_to_framework = hydro.gas_particles.new_channel_to(disk_particles)
	framework_to_hydro = disk_particles.new_channel_to(hydro.gas_particles)

	#set up star cluster
	Mmin, Mmax = 0.1|units.MSun, 100.|units.MSun
	Rvir = 1.|units.parsec

	masses = new_kroupa_mass_distribution(N_stars, Mmax)
	Mtot_init = masses.sum()
	converter_cluster = nbody_system.nbody_to_si(Mtot_init, Rvir)
	stars = new_king_model(N_stars, W0, convert_nbody=converter_cluster)
	stars.mass = masses

	dist_diff = 100. #|units.parsec
	magic_index = -1

	#put the disk around star closest to 1 solar mass
	for i, star in enumerate(stars):

		star_x = star.position.value_in(units.parsec)[0]
		star_y = star.position.value_in(units.parsec)[1]
		star_z = star.position.value_in(units.parsec)[2]

		star_dist = np.sqrt(star_x**2 + star_y**2 + star_z**2)

		i_diff = np.abs(star_dist - 1.0)

		if i_diff < dist_diff:

			magic_index = i
			dist_diff = i_diff

	for gas_particle in disk_particles:

		gas_particle.position += stars[magic_index].position

	gravitating_bodies = ParticlesSuperset([stars, disk_particles])

	gravity = Hermite(converter_cluster)
	gravity.particles.add_particles(gravitating_bodies)

	gravity_to_framework = gravity.particles.new_channel_to(gravitating_bodies)
	framework_to_gravity = gravitating_bodies.new_channel_to(gravity.particles)

	combined = bridge.Bridge()
	combined.add_system(gravity, (hydro,))
	combined.add_system(hydro, (gravity,))

	tend, dt = 10.|units.Myr, 0.005|units.Myr

	sim_times_unitless = np.arange(0., tend.value_in(units.Myr)+dt.value_in(units.Myr), dt.value_in(units.Myr))
	sim_times = [ t|units.Myr for t in sim_times_unitless ]

	plt.rc('font', family = 'serif')
	cmap = cm.get_cmap('nipy_spectral')

	rvals, zvals = [], []

	t0 = time.time()

	for j, t in enumerate(sim_times):

		if j%1 == 0:
			print('')	
			print('simulation time: ', t)
			print('wall time: %.03f minutes'%((time.time()-t0)/60.))

		stars = gravity.particles[:N_stars]
		gas = gravity.particles[N_stars:]

		stars_x = [ stars.position[i].value_in(units.parsec)[0] for i in range(len(stars)) ]
		stars_y = [ stars.position[i].value_in(units.parsec)[1] for i in range(len(stars)) ]

		gas_x = [ gas.position[i].value_in(units.parsec)[0] for i in range(len(gas)) ]
		gas_y = [ gas.position[i].value_in(units.parsec)[1] for i in range(len(gas)) ]

		plt.figure()
		
		colors = np.log10(stars.mass.value_in(units.MSun))

		sc = plt.scatter(stars_x, stars_y, c=colors, s=1, alpha=0.5, label='Stars')
		gas_sc = plt.scatter(gas_x, gas_y, c='r', s=1, alpha=0.8, label='Protoplanetary Disk')
		cbar = plt.colorbar(sc)
		cbar.set_label(r'$\log_{10}(M_{\star}/M_{\odot})$', fontsize=14)

		plt.annotate(r'$M_{\mathrm{cluster}} = %.03f \, M_{\odot}$'%(Mtot_init.value_in(units.MSun)), xy=(0.65, 0.15), xycoords='axes fraction', fontsize=8)
		plt.annotate(r'$t = %.02f$ Myr'%(t.value_in(units.Myr)), xy=(0.65, 0.1), xycoords='axes fraction', fontsize=8)

		plt.xlim(-4.*Rvir.value_in(units.parsec), 4.*Rvir.value_in(units.parsec))
		plt.ylim(-4.*Rvir.value_in(units.parsec), 4.*Rvir.value_in(units.parsec))
		plt.gca().set_aspect('equal')
		plt.xlabel('$x$ (pc)', fontsize=14)
		plt.ylabel('$y$ (pc)', fontsize=14)
		plt.legend(loc='upper left', fontsize=8)
		plt.title(r'King Model, $W_{0} = %.01f$'%(W0), fontsize=14)

		plt.savefig('kingmodel_%s.png'%(str(j).rjust(5, '0')))
		plt.close()

		combined.evolve_model(t)

	combined.stop()

	return 0