def reader(fname,vel=True,mhd=True): coolftn=pa.coolftn() dir, id, step, ext, mpi = pa.parse_filename(fname) ds=pa.AthenaDataSet(fname) rstfnames=glob.glob('%s/%s.par' % (ds.dir,ds.id)) par,blocks,fields=pa.parse_par(rstfnames[0]) domain=ds.domain domain['qshear']=eval(par['problem']['qshear'][0]) domain['Omega']=eval(par['problem']['Omega'][0]) fields=['density'] if vel: fields.append('velocity1') fields.append('velocity2') fields.append('velocity3') if mhd: fields.append('magnetic_field1') fields.append('magnetic_field2') fields.append('magnetic_field3') data={} for f in fields: data[f] = ds.read_all_data(f) data['temperature']=coolftn.get_temp(ds.read_all_data('T1')) fields.append('temperature') if vel: r3d,x3d,y3d,z3d=pa.pos3d(domain) vy0=-domain['qshear']*domain['Omega']*x3d data['velocity2'] -= vy0 domain['losdir']=dir+'los/' domain['step']=step return data,domain
def save_to_fits(ds, mhd=True): units = pa.set_units(muH=1.4271) coolftn = pa.coolftn() if not os.path.isdir(ds.dir + 'fits'): os.mkdir(ds.dir + 'fits') fields = ['density', 'temperature', 'velocity'] if mhd: fields.append('magnetic_field') for field in fields: if field is 'temperature': data = coolftn.get_temp(ds.read_all_data('T1')) else: data = ds.read_all_data(field) fitsname = '%s/fits/%s.%s.%s.fits' % (ds.dir, ds.id, ds.step, field[:4]) hdr = fits.Header() hdr['field'] = field hdr['time'] = ds.domain['time'] hdr['tMyr'] = (ds.domain['time'] * units['time'].to('Myr').value, 'Myr') hdr['xmin'] = (ds.domain['left_edge'][0], 'pc') hdr['xmax'] = (ds.domain['right_edge'][0], 'pc') hdr['ymin'] = (ds.domain['left_edge'][1], 'pc') hdr['ymax'] = (ds.domain['right_edge'][1], 'pc') hdr['zmin'] = (ds.domain['left_edge'][2], 'pc') hdr['zmax'] = (ds.domain['right_edge'][2], 'pc') hdr['dx'] = (ds.domain['dx'][0], 'pc') hdr['dy'] = (ds.domain['dx'][1], 'pc') hdr['dz'] = (ds.domain['dx'][2], 'pc') hdr['unit'] = (units[field].value, units[field].unit) if ds.domain.has_key('qshear'): hdr['qshear'] = ds.domain['qshear'] if ds.domain.has_key('Omega'): hdr['Omega'] = (ds.domain['Omega'], 'km/s/pc') hdu = fits.PrimaryHDU(data, header=hdr) hdu.writeto(fitsname, overwrite=True)
def get_proj_ims(ds,slab_range=None,test=False): if slab_range is None: ns_start=ds.NGrids[2]/4+1 ns_end=ds.NGrids[2]/4*3+1 else: ns_start,ns_end = slab_range Lx=ds.domain['Lx'][1] x2min=ds.domain['left_edge'][1]-Lx x2max=ds.domain['right_edge'][1]+Lx x3min=ds.domain['right_edge'][2] x3max=ds.domain['left_edge'][2] for ns in range(ns_start,ns_end): g=ds._get_slab_grid(slab=ns,verbose=test) x3min=min(x3min,g[0]['left_edge'][2]) x3max=max(x3max,g[0]['right_edge'][2]) extent=(x2min,x2max,x3min,x3max) dlist=[] for ns in range(ns_start,ns_end): dlist.append(ds.read_all_data('density',slab=ns)) den=np.concatenate(dlist) dlist=[] for ns in range(ns_start,ns_end): dlist.append(ds.read_all_data('T1',slab=ns)) T1=np.concatenate(dlist) dlist=[] for ns in range(ns_start,ns_end): dlist.append(ds.read_all_data('magnetic_field',slab=ns)) B=np.concatenate(dlist) Bmag=np.sqrt((B**2).sum(axis=-1)) coolftn=pa.coolftn() temp=coolftn.get_temp(T1) Nz,Ny,Nx=den.shape unit=pa.set_units(muH=1.4271) unit['magnetic_field'] dproj=den.mean(axis=2) Tproj=(den*temp).mean(axis=2)/dproj Bproj=(den*Bmag).mean(axis=2)*unit['magnetic_field'].value/dproj #dproj=np.roll(dproj,Nx/2,axis=1) #Tproj=np.roll(Tproj,Nx/2,axis=1) #Bproj=np.roll(Bproj,Nx/2,axis=1) #Tproj=(temp).mean(axis=2) dproj=np.concatenate([dproj,dproj,dproj],axis=1) Tproj=np.concatenate([Tproj,Tproj,Tproj],axis=1) Bproj=np.concatenate([Bproj,Bproj,Bproj],axis=1) return dproj,Tproj,Bproj,extent
def read_data(ds,field,domain): if field is 'temperature': coolftn=pa.coolftn() data=coolftn.get_temp(ds.read_all_data('T1')) elif field is 'velocity2': r3d,x3d,y3d,z3d=pa.pos3d(domain) vy0=-domain['qshear']*domain['Omega']*x3d data = ds.read_all_data(field) data -= vy0 else: data = ds.read_all_data(field) return data
# read in domain information ds = pa.AthenaDataSet(vtkfname) #print(ds.field_list) # print(ds.derived_field_list) # full domain information # print ds.domain # rs = ds.read_all_data('reynold_stress') # print rs # information of grid #0 # print ds.grids[0] T1 = ds.read_all_data('T1') coolftn = pa.coolftn() temp = coolftn.get_temp(T1) # print temp #if j != 0: # scalar = ds.read_all_data('specific_scalar3') # ism = 0 / icm = 1 # s_cut = 0.5 pot = ds.read_all_data('gravitational_potential') #if j != 0: # pot[scalar > s_cut] = 0 # ISM pot_c = copy.copy(pot) pot_c[temp > 20000] = 0 # cold ISM pot[temp < 20000] = 0
def _mu(field, data): cf=pa.coolftn() T1=data["gas","T1"].d temp=cf.get_temp(T1) return temp/T1
def get_zprof(data,domain,par,hst): Omega=par['problem']['Omega'] qshear=par['problem']['qshear'] shearing_box,cooling,MHD,nscalar,Gamma = get_configure(par) import pyathena as pa x,y,z,=pa.cc_arr(domain) Nx=domain['Nx'] x3d=np.tile(x.reshape(1,1,Nx[0]),(Nx[2],Nx[1],1)) z3d=np.tile(z.reshape(Nx[2],1,1),(1,Nx[1],Nx[0])) if shearing_box: vy0=-qshear*Omega*x3d Phit=-qshear*Omega**2*x3d**2 else: vy0=np.zeros(x3d.shape) if cooling: heat_ratio=np.interp(domain['time'],hst['time'],hst['heat_ratio']) unit=pa.set_units(muH=1.4271) unitC=unit['density']*unit['velocity']**3/unit['length'] unitC=unitC.cgs.value coolftn=pa.coolftn() dA=domain['dx'][0]*domain['dx'][1] dz=domain['dx'][2] d=np.copy(data['density'].data) v1=np.copy(data['velocity1'].data) v2=np.copy(data['velocity2'].data) v3=np.copy(data['velocity3'].data) dv2=v2-vy0 if MHD: B1=np.copy(data['magnetic_field1'].data) B2=np.copy(data['magnetic_field2'].data) B3=np.copy(data['magnetic_field3'].data) P=np.copy(data['pressure'].data) Phi=np.copy(data['gravitational_potential'].data) T1=np.copy(data['T1'].data) if cooling: lam=coolftn.get_cool(T1) gam=coolftn.get_heat(T1)*heat_ratio zprof={} zprof['d']=d zprof['v1']=v1 zprof['v2']=v2 zprof['v3']=v3 zprof['P']=P if MHD: zprof['B1']=B1 zprof['B2']=B2 zprof['B3']=B3 dsqrt=np.sqrt(d) vdotB=B1*v1+B2*v2+B3*v3 Emag=0.5*(B1**2+B2**2+B3**2) meanB={'1':B1.mean(axis=2).mean(axis=1),'2':B2.mean(axis=2).mean(axis=1),'3':B3.mean(axis=2).mean(axis=1)} for vec in ['1','2','3']: zprof['M%s' % vec] = zprof['d']*zprof['v%s' % vec] zprof['Ek%s' % vec] = 0.5*zprof['d']*zprof['v%s' % vec]**2 if MHD: zprof['PB%s' % vec] = 0.5*zprof['B%s' % vec]**2 zprof['vA%s' % vec] = zprof['B%s' % vec]/dsqrt Bbar=np.tile(meanB[vec].reshape(Nx[2],1,1),(1,Nx[1],Nx[0])).astype('double') zprof['dB%s' % vec] = zprof['B%s' % vec] - Bbar zprof['dPB%s' % vec] = 0.5*zprof['dB%s' % vec]**2 zprof['dvA%s' % vec] = zprof['dB%s' % vec]/dsqrt zprof['S%s' % vec] = 2.0*Emag*zprof['v%s' % vec] - zprof['B%s' % vec]*vdotB if shearing_box: zprof['v2']=dv2 zprof['dM2'] = zprof['d']*zprof['v2'] zprof['dEk2'] = 0.5*zprof['d']*zprof['v2']**2 # zprof['Phit'] = Phit zprof['T']=coolftn.get_temp(T1) if cooling: zprof['cool']=d**2*lam/unitC zprof['heat']=d*gam/unitC for ns in range(nscalar): zprof['s%s' % (ns +1)]=data['specific_scalar%s' % ns].data*d param={} param['R0']=par['problem']['R0']*c.pc param['rho_dm']=par['problem']['rhodm']*c.M_sun/c.pc**3 param['surf_s']=par['problem']['SurfS']*c.M_sun/c.pc**2 param['z0']=par['problem']['zstar']*c.pc phiext=tigress_extpot(param).phiext Phie=phiext(z3d*c.pc).to('km**2/s**2').value gext=phiext((z3d+dz/2)*c.pc)-phiext((z3d-dz/2)*c.pc) zprof['Phie']=Phie zprof['gext']=gext.to('km**2/s**2').value/dz zprof['dWext']=d*zprof['gext'] zprof['Phisg']=Phi dPhi=np.copy(Phi) dPhi[1:-1,:,:]=(Phi[2:,:,:]-np.roll(Phi,2,axis=0)[2:,:,:])/2.0/dz dPhi[0,:,:]=(Phi[1,:,:]-Phi[0,:,:])/dz dPhi[-1,:,:]=(Phi[-1,:,:]-Phi[-2,:,:])/dz zprof['gsg']=dPhi zprof['dWsg']=d*zprof['gsg'] zprof['Ber'] = 0.5*(v1**2+v2**2+v3**2) + Gamma/(Gamma-1)*P/d+Phie+Phi+Phit for pm in ['p','m']: zprof[pm+'A'] = np.ones(d.shape)*dA zprof[pm+'d'] = np.copy(d) zprof[pm+'vz'] = np.copy(v3) for f in ['d','M1','M2','M3']: zprof['%sFz%s' % (pm,f)] = zprof[f]*v3 for f in ['E1','E2','E3','Ege','Egsg','Etidal']: if f in ['E1','E2','E3']: zf='%sk%s' %(f[0],f[1]) tmp = zprof[zf]*v3 elif f == 'Ege': tmp = d*Phie*v3 elif f == 'Egsg': tmp = d*Phi*v3 elif f == 'Etidal': tmp = d*Phit*v3 zprof['%sFz%s' % (pm,f)] = tmp zprof['%sFzP' % pm] = Gamma/(Gamma-1)*zprof['P']*v3 if MHD: zprof['%sSzEm1' % pm] = 2.0*zprof['PB1']*v3 zprof['%sSzEm2' % pm] = 2.0*zprof['PB2']*v3 zprof['%sSzvB1' % pm] = -B3*B1*v1 zprof['%sSzvB2' % pm] = -B3*B2*v2 for ns in range(nscalar): zprof['%sFzs%s' % (pm,ns+1)]=data['specific_scalar%s' % ns].data*d*v3 if shearing_box: zprof['Rxy']=d*v1*dv2 zprof['Mxy']=-B1*B2 nv3=zprof['v3']<0 pv3=~nv3 for k in zprof: if k.startswith('p'): zprof[k][nv3]=0 if k.startswith('m'): zprof[k][pv3]=0 zprof['A']=np.ones(d.shape)*dA return z,zprof
plt.figure(figsize=(6, 5)) vtkfname = '%s%s/id0/%s.%04d.vtk' % (basedir, simid, simid, tidx) # read in domain information ds = pa.AthenaDataSet(vtkfname) #print(ds.field_list) #print(ds.derived_field_list) # full domain information #print ds.domain #rs = ds.read_all_data('reynold_stress') #print rs # information of grid #0 #print ds.grids[0] T1 = ds.read_all_data('T1'); coolftn = pa.coolftn() temp = coolftn.get_temp(T1) #print temp if j != 0: scalar = ds.read_all_data('specific_scalar3') # ism = 0 / icm = 1 s_cut = 0.5 B = ds.read_all_data('magnetic_field') Pmag1 = (B[:,:,:,0]**2)/2 Pmag2 = (B[:,:,:,1]**2)/2 Pmag3 = (B[:,:,:,2]**2)/2 mag_p = Pmag1+Pmag2-Pmag3 mag_p *= (unit['pressure']/kb).cgs.value #m_pre = ds.read_all_data('magnetic_pressure')*unit['pressure'].value/kb #print mag_p