def project(snapshot, scale, view, **kwargs): pps = kwargs.pop('pps', 500) sm = kwargs.pop('sm', 1.7) shiftx = kwargs.pop('shiftx', None) shifty = kwargs.pop('shifty', None) shiftz = kwargs.pop('shiftz', None) dens_lim = kwargs.pop('dens_lim', None) boxsize = float("".join(ch if ch.isdigit() else "" for ch in scale)) unit = "".join(ch if not ch.isdigit() else "" for ch in scale) dens = snapshot.gas.get_number_density() xyz = snapshot.gas.get_coords(unit) uvw = snapshot.gas.get_velocities() hsml = snapshot.gas.get_smoothing_length(unit) print 'Calculating...' xyz = analyze.center_box(xyz, velocity=uvw, density=dens, **kwargs) xyz = set_view(view, xyz) x = xyz.x y = xyz.y z = xyz.z if shiftx: x += shiftx if shifty: y += shifty if shiftz: z += shiftz snapshot.update_sink_coordinates(x, y, z) # Artificially shrink sink smoothing lengths. for s in snapshot.sinks: hsml[s.index] *= .5 data = snap.gas['x', 'y', 'z', 'ndensity', 'smoothing_length'].copy(deep=True) data = trim_view(boxsize, data, **kwargs) if dens_lim: arrs = [scalar, x, y, z, hsml] scalar, x, y, z, hsml = analyze.data_slice(scalar > dens_lim, *arrs) hsml = numpy.fmax(sm * hsml, boxsize / pps / 2) xi, yi = build_grid(boxsize, pps) zi = scalar_map(x, y, scalar, hsml, boxsize, pps, xi.shape) print '%s:: min: %.3e max: %.3e' % (loadable, zi.min(), zi.max()) imscale = kwargs.pop('imscale', 'log') if imscale == 'log': zi = numpy.log10(zi) print 'log(%s):: min: %.3e max: %.3e' % (loadable, zi.min(), zi.max()) else: print 'Returning raw (non-log) values!' return xi, yi, zi
def project(snapshot, scale, view, **kwargs): pps = kwargs.pop('pps',500) sm = kwargs.pop('sm',1.7) shiftx = kwargs.pop('shiftx',None) shifty = kwargs.pop('shifty',None) shiftz = kwargs.pop('shiftz',None) dens_lim = kwargs.pop('dens_lim', None) boxsize = float("".join(ch if ch.isdigit() else "" for ch in scale)) unit = "".join(ch if not ch.isdigit() else "" for ch in scale) dens = snapshot.gas.get_number_density() xyz = snapshot.gas.get_coords(unit) uvw = snapshot.gas.get_velocities() hsml = snapshot.gas.get_smoothing_length(unit) print 'Calculating...' xyz = analyze.center_box(xyz, velocity=uvw, density=dens, **kwargs) xyz = set_view(view, xyz) x = xyz.x y = xyz.y z = xyz.z if shiftx: x += shiftx if shifty: y += shifty if shiftz: z += shiftz snapshot.update_sink_coordinates(x,y,z) # Artificially shrink sink smoothing lengths. for s in snapshot.sinks: hsml[s.index] *= .5 data = snap.gas['x', 'y', 'z', 'ndensity', 'smoothing_length'].copy(deep=True) data = trim_view(boxsize, data, **kwargs) if dens_lim: arrs = [scalar,x,y,z,hsml] scalar,x,y,z,hsml = analyze.data_slice(scalar > dens_lim, *arrs) hsml = numpy.fmax(sm * hsml, boxsize/pps/2) xi,yi = build_grid(boxsize,pps) zi = scalar_map(x,y,scalar,hsml,boxsize,pps,xi.shape) print '%s:: min: %.3e max: %.3e' %(loadable, zi.min(),zi.max()) imscale = kwargs.pop('imscale','log') if imscale == 'log': zi = numpy.log10(zi) print 'log(%s):: min: %.3e max: %.3e' %(loadable, zi.min(),zi.max()) else: print 'Returning raw (non-log) values!' return xi,yi,zi
def disk_properties(snapshot, sink_id, **kwargs): r_start = kwargs.pop('r_start', 50*1.49597871e13) r_step = kwargs.pop('r_step', 1.49597871e14) r_multiplier = kwargs.pop('multiplier', 1.2) verbose = kwargs.pop('verbose', True) n_min = kwargs.pop('n_min', 32) dens_lim = kwargs.pop('dens_lim', 1e6) orb_crit = kwargs.pop('orb_crit', 1.) disky_crit = kwargs.pop('disky_crit', .9) kepler_crit = kwargs.pop('kepler_crit', .8) redshift = snapshot.header.Redshift length_unit = 'cm' mass_unit = 'g' velocity_unit = 'cgs' snapshot.gas.units.set_velocity(velocity_unit) xyz = snapshot.gas.get_coords(length_unit) uvw = snapshot.gas.get_velocities() snapshot.update_sink_frame_ofR(xyz, uvw) dens = snapshot.gas.get_number_density('cgs') mass = snapshot.gas.get_masses(mass_unit) temp = snapshot.gas.get_temperature() csound = snapshot.gas.get_sound_speed() i = 0 try: while snapshot.sinks[i].pid != sink_id: i += 1 except IndexError: raise IndexError("Sink {} has not yet formed!".format(sink_id)) else: sink = snapshot.sinks[i] sinkpos = (sink.x, sink.y, sink.z) sinkvel = (sink.vx, sink.vy, sink.vz) pos = snapshot.gas.get_coords(system='spherical',view='face', center=sinkpos, vcenter=sinkvel) vel = snapshot.gas.get_velocities(system='spherical') xyz = snapshot.gas.get_coords() uvw = snapshot.gas.get_velocities() snapshot.update_sink_frame_ofR(xyz, uvw) pos = numpy.nan_to_num(pos) vel = numpy.nan_to_num(vel) L9 = analyze.total_angular_momentum(*analyze.data_slice(dens > 1e9, xyz,uvw,mass)) uL9 = L9 / numpy.linalg.norm(L9) if dens_lim: arrs = [dens,pos,vel,xyz,uvw,mass,temp,csound] dslice = dens > dens_lim dens,pos,vel,xyz,uvw,mass,temp,csound = analyze.data_slice(dslice, *arrs) L = analyze.angular_momentum(xyz,uvw,mass) uL = L / numpy.linalg.norm(L, axis=1)[:, numpy.newaxis] disky = numpy.where((numpy.abs(vel[:,2])/numpy.abs(vel[:,0]) > orb_crit) & (uL.dot(uL9) > disky_crit))[0] print disky.size, '"disky" particles', print '({}) percent'.format(float(disky.size)/dens.size * 100) inf = numpy.where(numpy.abs(vel[:,0]) / numpy.linalg.norm(vel, axis=1) > .5)[0] print inf.size, 'infalling particles', print '({}) percent'.format(float(inf.size)/dens.size * 100) orb = numpy.where((numpy.abs(vel[:,2])/numpy.abs(vel[:,0]) > orb_crit) & (uL.dot(uL9) < disky_crit))[0] print orb.size, '"orbiting" particles', print '({}) percent'.format(float(orb.size)/dens.size * 100) notorb = numpy.where(numpy.abs(vel[:,2]) < numpy.abs(vel[:,0]))[0] print notorb.size, '"not orbiting" particles', print '({}) percent'.format(float(notorb.size)/dens.size * 100) print 'Data loaded. Analyzing...' disk_properties = [] vrot = vk = 1. n = old_n = r0 = 0 r1 = r_start print "Starting at {:.2e} AU".format(r1/1.49e13) r2d = numpy.sqrt(xyz[:,0]**2 + xyz[:,1]**2) data = [] while vrot/vk > kepler_crit and n < disky.size: inR = numpy.where(pos[disky,0] <= r1)[0] n = inR.size if n > old_n and n > n_min: annulus = numpy.where((r2d[disky] > r0) & (r2d[disky] <= r1))[0] annulus = disky[annulus] radii = r2d[annulus] radius = radii.mean() vrot = vel[annulus, 2].mean() T = analyze.reject_outliers(temp[annulus]).mean() cs = analyze.reject_outliers(csound[annulus]).mean() H = cs * radius / vrot Mcyl = mass[annulus].sum() if annulus.size > 0: zmax = numpy.abs(xyz[annulus,2]).max() else: zmax = 0.0 density = dens[annulus].mean() if numpy.isnan(density): density = dens.max() mdensity = density * constants.m_H / constants.X_h tff = numpy.sqrt(3 * numpy.pi / 32 / constants.GRAVITY / mdensity) tavg = analyze.reject_outliers(temp[inR]).mean() Mtot = mass[numpy.where(pos[:,0] <= radius)[0]].sum() vk = numpy.sqrt(6.6726e-8 * Mtot / radius) / 1e5 Lj = cs*tff #Jeans Length Mj = mdensity * (4*numpy.pi/3) * Lj**3 / 1.989e33 #Jeans Mass H = cs * radius / vrot #Disk Scale Height rau = radius/1.49597871e13 Msun = Mtot/1.989e33 vrot = vrot / 1e5 disk_properties.append((redshift,rau,density,Msun,Mcyl, vrot,vk,tff,T,tavg,cs,H,Lj,Mj,n)) if verbose: print 'R = %.2e AU' %rau, print 'Mass enclosed: %.2e' %Msun, print 'density: %.3e' %density, print 'vrot: %.3e' %vrot, print 'npart: {}'.format(n) old_n = n r0 = r1 r1 *= r_multiplier print 'snapshot', snapshot.number, 'analyzed.' return disk_properties