def enzo_m_gen(fname, field_add): reg, ds1 = enzo_grid_generate(fname, field_add) amr = AMRGrid.from_yt( ds1, quantity_mapping={'density': ('gas', 'dust_density')}) ''' levels = ds.index.max_level amr = AMRGrid() for ilevel in range(levels): level = amr.add_level() for igrid in ds.index.select_grids(ilevel): print igrid grid = level.add_grid() grid.xmin,grid.xmax = igrid.LeftEdge[0].in_units('cm'),igrid.RightEdge[0].in_units('cm') grid.ymin,grid.ymax = igrid.LeftEdge[1].in_units('cm'),igrid.RightEdge[1].in_units('cm') grid.zmin,grid.zmax = igrid.LeftEdge[2].in_units('cm'),igrid.RightEdge[2].in_units('cm') grid.quantities["density"] = np.transpose(np.array(igrid[("gas","metal_density")].in_units('g/cm**3')*cfg.par.dusttometals_ratio)) grid.nx,grid.ny,grid.nz = igrid[("gas","metal_density")].shape ''' m = Model() m.set_amr_grid(amr) #CMB DISABLED -- UNCOMMENT THIS TO FIX THIS. The main issue is #that I'm not sure what shape to give to the np.repeat #array of energy_density_absorbed; I think it needs to be the ARM Grid shape but i'm not quite sure if it needs to be an AMRGrid() #energy_density_absorbed=energy_density_absorbed_by_CMB() #energy_density_absorbed =np.repeat(energy_density_absorbed.value,reg.index.num_grids)#amr['density'].shape) d = SphericalDust(cfg.par.dustdir + cfg.par.dustfile) if cfg.par.SUBLIMATION == True: d.set_sublimation_temperature( 'fast', temperature=cfg.par.SUBLIMATION_TEMPERATURE) m.add_density_grid(amr["density"], d) #uncomment when we're ready to put CMB in (and comment out previous line) #m.add_density_grid(amr['density'],d,specific_energy=energy_density_absorbed) #m.set_specific_energy_type('additional') center = ds1.arr([cfg.model.x_cent, cfg.model.y_cent, cfg.model.z_cent], 'code_length') [xcent, ycent, zcent ] = center.in_units('cm') #boost needs to be in cm since that's what the boost = np.array([xcent, ycent, zcent]) dx = ds1.domain_width[0].in_units('cm') dy = ds1.domain_width[1].in_units('cm') dz = ds1.domain_width[2].in_units('cm') return m, xcent, ycent, zcent, dx, dy, dz, reg, ds1, boost
def enzo_m_gen(fname, field_add): reg, ds1 = enzo_grid_generate(fname, field_add) amr = yt_dataset_to_amr_grid_xyz( ds1, quantity_mapping={'density': ('gas', 'dust_density')}) m = Model() #save in the m__dict__ that we're in an amr geometry m.__dict__['grid_type'] = 'amr' m.set_amr_grid(amr) #CMB DISABLED -- UNCOMMENT THIS TO FIX THIS. The main issue is #that I'm not sure what shape to give to the np.repeat #array of energy_density_absorbed; I think it needs to be the ARM Grid shape but i'm not quite sure if it needs to be an AMRGrid() #energy_density_absorbed=energy_density_absorbed_by_CMB() #energy_density_absorbed =np.repeat(energy_density_absorbed.value,reg.index.num_grids)#amr['density'].shape) d = SphericalDust(cfg.par.dustdir + cfg.par.dustfile) if cfg.par.SUBLIMATION == True: d.set_sublimation_temperature( 'fast', temperature=cfg.par.SUBLIMATION_TEMPERATURE) m.add_density_grid(amr["density"], d) #uncomment when we're ready to put CMB in (and comment out previous line) #m.add_density_grid(amr['density'],d,specific_energy=energy_density_absorbed) #m.set_specific_energy_type('additional') center = ds1.arr([cfg.model.x_cent, cfg.model.y_cent, cfg.model.z_cent], 'code_length') [xcent, ycent, zcent ] = center.in_units('cm') #boost needs to be in cm since that's what the boost = np.array([xcent, ycent, zcent]) dx = ds1.domain_width[0].in_units('cm') dy = ds1.domain_width[1].in_units('cm') dz = ds1.domain_width[2].in_units('cm') return m, xcent, ycent, zcent, dx, dy, dz, reg, ds1, boost
from hyperion.model import Model from hyperion.util.constants import au, lsun, rsun from hyperion.dust import SphericalDust # Model m = Model() dist = 20000 * au x = np.linspace(-dist, dist, 101) y = np.linspace(-dist, dist, 101) z = np.linspace(-dist, dist, 101) m.set_cartesian_grid(x,y,z) # Dust d = SphericalDust('kmh.hdf5') d.set_sublimation_temperature('fast', temperature=1600.) m.add_density_grid(np.ones((100,100,100)) * 1.e-18,'kmh.hdf5') # Alpha centauri sourceA = m.add_spherical_source() sourceA.luminosity = 1.519 * lsun sourceA.radius = 1.227 * rsun sourceA.temperature = 5790. sourceA.position = (0., 0., 0.) # Beta centauri sourceB = m.add_spherical_source() sourceB.luminosity = 0.5 * lsun sourceB.radius = 0.865 * rsun sourceB.temperature = 5260. sourceB.position = (-11.2 * au, 0., 0.)
def arepo_m_gen(fname, field_add): reg, ds, dustdens = arepo_vornoi_grid_generate(fname, field_add) xcent = ds.quan(cfg.model.x_cent, 'code_length').to('cm') #proper cm ycent = ds.quan(cfg.model.y_cent, 'code_length').to('cm') zcent = ds.quan(cfg.model.z_cent, 'code_length').to('cm') boost = np.array([xcent, ycent, zcent]) print('[arepo_tributary/vornoi_m_gen]: boost = ', boost) #======================================================================== #Initialize Hyperion Model #======================================================================== m = Model() #because we boost the stars to a [0,0,0] coordinate center, we #want to make sure our vornoi tesslation is created in the same manner. particle_x = reg["gascoordinates"][:, 0].to('cm') particle_y = reg["gascoordinates"][:, 1].to('cm') particle_z = reg["gascoordinates"][:, 2].to('cm') #just for the sake of symmetry, pass on a dx,dy,dz since it can be #used optionally downstream in other functions. dx = 2. * ds.quan(cfg.par.zoom_box_len, 'kpc').to('cm') dy = 2. * ds.quan(cfg.par.zoom_box_len, 'kpc').to('cm') dz = 2. * ds.quan(cfg.par.zoom_box_len, 'kpc').to('cm') print('[arepo_tributary] boost = ', boost) print('[arepo_tributary] xmin (pc)= ', (xcent - dx / 2.).to('pc')) print('[arepo_tributary] xmax (pc)= ', (xcent + dx / 2.).to('pc')) print('[arepo_tributary] ymin (pc)= ', (ycent - dy / 2.).to('pc')) print('[arepo_tributary] ymax (pc)= ', (ycent + dy / 2.).to('pc')) print('[arepo_tributary] zmin (pc)= ', (zcent - dz / 2.).to('pc')) print('[arepo_tributary] zmax (pc)= ', (zcent + dz / 2.).to('pc')) x_pos_boost = (particle_x - xcent).to('cm') y_pos_boost = (particle_y - ycent).to('cm') z_pos_boost = (particle_z - zcent).to('cm') m.set_voronoi_grid(x_pos_boost.value, y_pos_boost.value, z_pos_boost.value) #get CMB: energy_density_absorbed = energy_density_absorbed_by_CMB() specific_energy = np.repeat(energy_density_absorbed.value, dustdens.shape) if cfg.par.PAH == True: # load PAH fractions for usg, vsg, and big (grain sizes) frac = cfg.par.PAH_frac # Normalize to 1 total = np.sum(list(frac.values())) frac = {k: v / total for k, v in frac.items()} for size in frac.keys(): d = SphericalDust(cfg.par.dustdir + '%s.hdf5' % size) if cfg.par.SUBLIMATION == True: d.set_sublimation_temperature( 'fast', temperature=cfg.par.SUBLIMATION_TEMPERATURE) #m.add_density_grid(dustdens * frac[size], cfg.par.dustdir+'%s.hdf5' % size) m.add_density_grid(dustdens * frac[size], d, specific_energy=specific_energy) m.set_enforce_energy_range(cfg.par.enforce_energy_range) else: d = SphericalDust(cfg.par.dustdir + cfg.par.dustfile) if cfg.par.SUBLIMATION == True: d.set_sublimation_temperature( 'fast', temperature=cfg.par.SUBLIMATION_TEMPERATURE) m.add_density_grid(dustdens, d, specific_energy=specific_energy) #m.add_density_grid(dustdens,cfg.par.dustdir+cfg.par.dustfile) m.set_specific_energy_type('additional') return m, xcent, ycent, zcent, dx.value, dy.value, dz.value, reg, ds, boost
def sph_m_gen(fname,field_add): refined,dustdens,fc1,fw1,pf,ad = yt_octree_generate(fname,field_add) xmin = (fc1[:,0]-fw1[:,0]/2.).convert_to_units('cm') #in proper cm xmax = (fc1[:,0]+fw1[:,0]/2.).convert_to_units('cm') ymin = (fc1[:,1]-fw1[:,1]/2.).convert_to_units('cm') ymax = (fc1[:,1]+fw1[:,1]/2.).convert_to_units('cm') zmin = (fc1[:,2]-fw1[:,2]/2.).convert_to_units('cm') zmax = (fc1[:,2]+fw1[:,2]/2.).convert_to_units('cm') #dx,dy,dz are the edges of the parent grid dx = (np.max(xmax)-np.min(xmin)).value dy = (np.max(ymax)-np.min(ymin)).value dz = (np.max(zmax)-np.min(zmin)).value xcent = np.mean([np.min(xmin),np.max(xmax)]) #kpc ycent = np.mean([np.min(ymin),np.max(ymax)]) zcent = np.mean([np.min(zmin),np.max(zmax)]) boost = np.array([xcent,ycent,zcent]) print ('[pd_front end] boost = ',boost) #Tom Robitaille's conversion from z-first ordering (yt's default) to #x-first ordering (the script should work both ways) refined_array = np.array(refined) refined_array = np.squeeze(refined_array) order = find_order(refined_array) refined_reordered = [] dustdens_reordered = np.zeros(len(order)) for i in range(len(order)): refined_reordered.append(refined[order[i]]) dustdens_reordered[i] = dustdens[order[i]] refined = refined_reordered dustdens=dustdens_reordered #hyperion octree stats max_level = hos.hyperion_octree_stats(refined) pto.test_octree(refined,max_level) dump_cell_info(refined,fc1,fw1,xmin,xmax,ymin,ymax,zmin,zmax) np.save('refined.npy',refined) np.save('density.npy',dustdens) #======================================================================== #Initialize Hyperion Model #======================================================================== m = Model() if cfg.par.FORCE_RANDOM_SEED == True: m.set_seed(cfg.par.seed) print ('Setting Octree Grid with Parameters: ') #m.set_octree_grid(xcent,ycent,zcent, # dx,dy,dz,refined) m.set_octree_grid(0,0,0,dx/2,dy/2,dz/2,refined) #get CMB: energy_density_absorbed=energy_density_absorbed_by_CMB() specific_energy = np.repeat(energy_density_absorbed.value,dustdens.shape) if cfg.par.PAH == True: # load PAH fractions for usg, vsg, and big (grain sizes) frac = cfg.par.PAH_frac # Normalize to 1 total = np.sum(list(frac.values())) frac = {k: v / total for k, v in frac.items()} for size in frac.keys(): d = SphericalDust(cfg.par.dustdir+'%s.hdf5'%size) if cfg.par.SUBLIMATION == True: d.set_sublimation_temperature('fast',temperature=cfg.par.SUBLIMATION_TEMPERATURE) #m.add_density_grid(dustdens * frac[size], cfg.par.dustdir+'%s.hdf5' % size) m.add_density_grid(dustdens*frac[size],d,specific_energy=specific_energy) m.set_enforce_energy_range(cfg.par.enforce_energy_range) else: d = SphericalDust(cfg.par.dustdir+cfg.par.dustfile) if cfg.par.SUBLIMATION == True: d.set_sublimation_temperature('fast',temperature=cfg.par.SUBLIMATION_TEMPERATURE) m.add_density_grid(dustdens,d,specific_energy=specific_energy) #m.add_density_grid(dustdens,cfg.par.dustdir+cfg.par.dustfile) m.set_specific_energy_type('additional') return m,xcent,ycent,zcent,dx,dy,dz,pf,boost
from hyperion.model import Model from hyperion.util.constants import au, lsun, rsun from hyperion.dust import SphericalDust # Model m = Model() dist = 20000 * au x = np.linspace(-dist, dist, 101) y = np.linspace(-dist, dist, 101) z = np.linspace(-dist, dist, 101) m.set_cartesian_grid(x, y, z) # Dust d = SphericalDust("kmh.hdf5") d.set_sublimation_temperature("fast", temperature=1600.0) m.add_density_grid(np.ones((100, 100, 100)) * 1.0e-18, "kmh.hdf5") # Alpha centauri sourceA = m.add_spherical_source() sourceA.luminosity = 1.519 * lsun sourceA.radius = 1.227 * rsun sourceA.temperature = 5790.0 sourceA.position = (0.0, 0.0, 0.0) # Beta centauri sourceB = m.add_spherical_source() sourceB.luminosity = 0.5 * lsun sourceB.radius = 0.865 * rsun sourceB.temperature = 5260.0 sourceB.position = (-11.2 * au, 0.0, 0.0)
def enzo_m_gen(fname,field_add): #add the fields in pd format pf = field_add(fname) ad = pf.all_data() #cutout center = pf.arr([cfg.model.x_cent,cfg.model.y_cent,cfg.model.z_cent],'code_length') box_len = pf.quan(cfg.par.zoom_box_len,'kpc').in_units('code_length') min_region = [center[0]-box_len,center[1]-box_len,center[2]-box_len] max_region = [center[0]+box_len,center[1]+box_len,center[2]+box_len] region = pf.region(center,min_region,max_region) pf = region.ds proj_plots(pf) #def. dust density def _dust_density(field, data): return data[('gas', 'metal_density')].in_units("g/cm**3")*cfg.par.dusttometals_ratio pf.add_field(('gas', 'dust_density'), function=_dust_density, units = 'g/cm**3') amr = AMRGrid.from_yt(pf, quantity_mapping={'density':('gas','dust_density')}) ''' levels = pf.index.max_level amr = AMRGrid() for ilevel in range(levels): level = amr.add_level() for igrid in pf.index.select_grids(ilevel): print igrid grid = level.add_grid() grid.xmin,grid.xmax = igrid.LeftEdge[0].in_units('cm'),igrid.RightEdge[0].in_units('cm') grid.ymin,grid.ymax = igrid.LeftEdge[1].in_units('cm'),igrid.RightEdge[1].in_units('cm') grid.zmin,grid.zmax = igrid.LeftEdge[2].in_units('cm'),igrid.RightEdge[2].in_units('cm') grid.quantities["density"] = np.transpose(np.array(igrid[("gas","metal_density")].in_units('g/cm**3')*cfg.par.dusttometals_ratio)) grid.nx,grid.ny,grid.nz = igrid[("gas","metal_density")].shape ''' m = Model() m.set_amr_grid(amr) energy_density_absorbed=energy_density_absorbed_by_CMB() energy_density_absorbed = np.repeat(energy_density_absorbed.value,amr['density'].shape) d = SphericalDust(cfg.par.dustdir+cfg.par.dustfile) if cfg.par.SUBLIMATION == True: d.set_sublimation_temperature('fast',temperature=cfg.par.SUBLIMATION_TEMPERATURE) m.add_density_grid(amr['density'],d,specific_energy=energy_density_absorbed) m.set_specific_energy_type('additional') #m.add_density_grid(amr['density'], cfg.par.dustdir+cfg.par.dustfile) #define the random things needed for parsing out the output args #center = pf.domain_center [xcent,ycent,zcent] = center boost = np.array([xcent,ycent,zcent]) dx = pf.domain_width.in_units('cm') dy = pf.domain_width.in_units('cm') dz = pf.domain_width.in_units('cm') return m,xcent,ycent,zcent,dx,dy,dz,pf,boost
def arepo_m_gen(fname, field_add): reg, ds, dustdens = arepo_vornoi_grid_generate(fname, field_add) xcent = ds.quan(cfg.model.x_cent, 'code_length').to('cm') #proper cm ycent = ds.quan(cfg.model.y_cent, 'code_length').to('cm') zcent = ds.quan(cfg.model.z_cent, 'code_length').to('cm') boost = np.array([xcent, ycent, zcent]) print('[arepo_tributary/vornoi_m_gen]: boost = ', boost) #======================================================================== #Initialize Hyperion Model #======================================================================== m = Model() #because we boost the stars to a [0,0,0] coordinate center, we #want to make sure our vornoi tesslation is created in the same manner. particle_x = reg["gas", "coordinates"][:, 0].to('cm') particle_y = reg["gas", "coordinates"][:, 1].to('cm') particle_z = reg["gas", "coordinates"][:, 2].to('cm') #just for the sake of symmetry, pass on a dx,dy,dz since it can be #used optionally downstream in other functions. dx = 2. * ds.quan(cfg.par.zoom_box_len, 'kpc').to('cm') dy = 2. * ds.quan(cfg.par.zoom_box_len, 'kpc').to('cm') dz = 2. * ds.quan(cfg.par.zoom_box_len, 'kpc').to('cm') print('[arepo_tributary] boost = ', boost) print('[arepo_tributary] xmin (pc)= ', (xcent - dx / 2.).to('pc')) print('[arepo_tributary] xmax (pc)= ', (xcent + dx / 2.).to('pc')) print('[arepo_tributary] ymin (pc)= ', (ycent - dy / 2.).to('pc')) print('[arepo_tributary] ymax (pc)= ', (ycent + dy / 2.).to('pc')) print('[arepo_tributary] zmin (pc)= ', (zcent - dz / 2.).to('pc')) print('[arepo_tributary] zmax (pc)= ', (zcent + dz / 2.).to('pc')) x_pos_boost = (particle_x - xcent).to('cm') y_pos_boost = (particle_y - ycent).to('cm') z_pos_boost = (particle_z - zcent).to('cm') m.set_voronoi_grid(x_pos_boost.value, y_pos_boost.value, z_pos_boost.value) #get CMB: energy_density_absorbed = energy_density_absorbed_by_CMB() specific_energy = np.repeat(energy_density_absorbed.value, dustdens.shape) if cfg.par.otf_extinction == False: if cfg.par.PAH == True: # load PAH fractions for usg, vsg, and big (grain sizes) frac = cfg.par.PAH_frac # Normalize to 1 total = np.sum(list(frac.values())) frac = {k: v / total for k, v in frac.items()} for size in frac.keys(): d = SphericalDust(cfg.par.dustdir + '%s.hdf5' % size) if cfg.par.SUBLIMATION == True: d.set_sublimation_temperature( 'fast', temperature=cfg.par.SUBLIMATION_TEMPERATURE) #m.add_density_grid(dustdens * frac[size], cfg.par.dustdir+'%s.hdf5' % size) m.add_density_grid(dustdens * frac[size], d, specific_energy=specific_energy) m.set_enforce_energy_range(cfg.par.enforce_energy_range) else: d = SphericalDust(cfg.par.dustdir + cfg.par.dustfile) if cfg.par.SUBLIMATION == True: d.set_sublimation_temperature( 'fast', temperature=cfg.par.SUBLIMATION_TEMPERATURE) m.add_density_grid(dustdens, d, specific_energy=specific_energy) #m.add_density_grid(dustdens,cfg.par.dustdir+cfg.par.dustfile) else: #instead of using a constant extinction law across the #entire galaxy, we'll compute it on a cell-by-cell bassis by #using information about the grain size distribution from #the simulation itself. ad = ds.all_data() nsizes = reg['PartType0', 'NumGrains'].shape[1] try: assert (np.sum(ad['PartType0', 'NumGrains']) > 0) except AssertionError: raise AssertionError( "[arepo_tributary:] There are no dust grains in this simulation. This can sometimes happen in an early snapshot of a simulation where the dust has not yet had time to form." ) grid_of_sizes = reg['PartType0', 'NumGrains'] active_dust_add(ds, m, grid_of_sizes, nsizes, dustdens, specific_energy) m.set_specific_energy_type('additional') return m, xcent, ycent, zcent, dx.value, dy.value, dz.value, reg, ds, boost
def sph_m_gen(fname,field_add): refined,dustdens,fc1,fw1,reg,ds = yt_octree_generate(fname,field_add) if float(yt.__version__[0:3]) >= 4: xmin = (fc1[:,0]-fw1[:,0]/2.).to('cm') #in proper cm xmax = (fc1[:,0]+fw1[:,0]/2.).to('cm') ymin = (fc1[:,1]-fw1[:,1]/2.).to('cm') ymax = (fc1[:,1]+fw1[:,1]/2.).to('cm') zmin = (fc1[:,2]-fw1[:,2]/2.).to('cm') zmax = (fc1[:,2]+fw1[:,2]/2.).to('cm') else: xmin = (fc1[:,0]-fw1[:,0]/2.).convert_to_units('cm') #in proper cm xmax = (fc1[:,0]+fw1[:,0]/2.).convert_to_units('cm') ymin = (fc1[:,1]-fw1[:,1]/2.).convert_to_units('cm') ymax = (fc1[:,1]+fw1[:,1]/2.).convert_to_units('cm') zmin = (fc1[:,2]-fw1[:,2]/2.).convert_to_units('cm') zmax = (fc1[:,2]+fw1[:,2]/2.).convert_to_units('cm') #dx,dy,dz are the edges of the parent grid dx = (np.max(xmax)-np.min(xmin)).value dy = (np.max(ymax)-np.min(ymin)).value dz = (np.max(zmax)-np.min(zmin)).value xcent = float(ds.quan(cfg.model.x_cent,"code_length").to('cm').value) ycent = float(ds.quan(cfg.model.y_cent,"code_length").to('cm').value) zcent = float(ds.quan(cfg.model.z_cent,"code_length").to('cm').value) boost = np.array([xcent,ycent,zcent]) print ('[sph_tributary] boost = ',boost) print ('[sph_tributary] xmin (pc)= ',np.min(xmin.to('pc'))) print ('[sph_tributary] xmax (pc)= ',np.max(xmax.to('pc'))) print ('[sph_tributary] ymin (pc)= ',np.min(ymin.to('pc'))) print ('[sph_tributary] ymax (pc)= ',np.max(ymax.to('pc'))) print ('[sph_tributary] zmin (pc)= ',np.min(zmin.to('pc'))) print ('[sph_tributary] zmax (pc)= ',np.max(zmax.to('pc'))) #Tom Robitaille's conversion from z-first ordering (yt's default) to #x-first ordering (the script should work both ways) refined_array = np.array(refined) refined_array = np.squeeze(refined_array) order = find_order(refined_array) refined_reordered = [] dustdens_reordered = np.zeros(len(order)) for i in range(len(order)): refined_reordered.append(refined[order[i]]) dustdens_reordered[i] = dustdens[order[i]] refined = refined_reordered dustdens=dustdens_reordered #hyperion octree stats max_level = hos.hyperion_octree_stats(refined) pto.test_octree(refined,max_level) if float(yt.__version__[0:3]) >= 4: dump_cell_info(refined,fc1.to('cm'),fw1.to('cm'),xmin,xmax,ymin,ymax,zmin,zmax) else: dump_cell_info(refined,fc1.convert_to_units('cm'),fw1.convert_to_units('cm'),xmin,xmax,ymin,ymax,zmin,zmax) np.save('refined.npy',refined) np.save('density.npy',dustdens) #======================================================================== #Initialize Hyperion Model #======================================================================== m = Model() #save in the m__dict__ that we're in an oct geometry m.__dict__['grid_type']='oct' print ('Setting Octree Grid with Parameters: ') #m.set_octree_grid(xcent,ycent,zcent, # dx,dy,dz,refined) m.set_octree_grid(0,0,0,dx/2,dy/2,dz/2,refined) #get CMB: energy_density_absorbed=energy_density_absorbed_by_CMB() specific_energy = np.repeat(energy_density_absorbed.value,dustdens.shape) if cfg.par.otf_extinction == False: if cfg.par.PAH == True: # load PAH fractions for usg, vsg, and big (grain sizes) frac = cfg.par.PAH_frac # Normalize to 1 total = np.sum(list(frac.values())) frac = {k: v / total for k, v in frac.items()} for size in frac.keys(): d = SphericalDust(cfg.par.dustdir+'%s.hdf5'%size) if cfg.par.SUBLIMATION == True: d.set_sublimation_temperature('fast',temperature=cfg.par.SUBLIMATION_TEMPERATURE) #m.add_density_grid(dustdens * frac[size], cfg.par.dustdir+'%s.hdf5' % size) m.add_density_grid(dustdens*frac[size],d,specific_energy=specific_energy) m.set_enforce_energy_range(cfg.par.enforce_energy_range) else: d = SphericalDust(cfg.par.dustdir+cfg.par.dustfile) if cfg.par.SUBLIMATION == True: d.set_sublimation_temperature('fast',temperature=cfg.par.SUBLIMATION_TEMPERATURE) m.add_density_grid(dustdens,d,specific_energy=specific_energy) #m.add_density_grid(dustdens,cfg.par.dustdir+cfg.par.dustfile) else: #instead of using a constant extinction law across the #entire galaxy, we'll compute it on a cell-by-cell basis by #using information about the grain size distribution from #the simulation itself. print("==============================================\n") print("Entering OTF Extinction Calculation\n") print("Note: For very high-resolution grids, this may cause memory issues due to adding ncells dust grids") print("==============================================\n") ad = ds.all_data() nsizes = ad['PartType3','Dust_Size'].shape[1] ncells = reg.parameters["octree_of_sizes"].shape[0] #ensure that the grid has particles for isize in range(nsizes): try: assert (np.sum(reg.parameters["octree_of_sizes"][:,isize]) > 0) except AssertionError: raise AssertionError("[sph_tributary:] The grain size distribution smoothed onto the octree has deposited no particles. Try either increasing your box size, or decreasing n_ref in parameters_master. Alternatively, run the simulation with otf_extinction=False") #define the grid of sizes that will be used in tributary_dust_add grid_of_sizes = reg.parameters["octree_of_sizes"] active_dust_add(ds,m,grid_of_sizes,nsizes,dustdens,specific_energy,refined) m.set_specific_energy_type('additional') return m,xcent,ycent,zcent,dx,dy,dz,reg,ds,boost