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