def run_mctherm(self): logger.info("Executing RADMC3D with mctherm mode") if not os.path.isdir(self.radmc_dir): msg = "radmc working directory not found: {self.radmc_dir}" raise FileNotFoundError(msg) tools.shell( f"radmc3d mctherm setthreads {self.n_thread}", cwd=self.radmc_dir, error_keyword="ERROR", log_prefix=" ", ) cwd = os.getcwd() os.chdir(self.radmc_dir) self.rmcdata = rmca.readData(ispec=self.molname) # radmc3dData() os.chdir(cwd)
def getGasAbundance(grid=None, ppar=None, ispec=''): """ Function to create the conversion factor from volume density to number density of molecule ispec. The number density of a molecule is rhogas * abun INPUT: ------ grid - An instance of the radmc3dGrid class containing the spatial and wavelength grid ppar - Dictionary containing all parameters of the model ispec - The name of the gas species whose abundance should be calculated OUTPUT: ------- returns the abundance as a Numpy array """ # Read the dust density and temperature try: data = readData(ddens=True, dtemp=True, binary=True) except: try: data = readData(ddens=True, dtemp=True, binary=False) except: print 'WARNING!!' print 'No data could be read in binary or in formatted ascii format' print ' ' return 0 # Calculate continuum optical depth data.getTau(axis='xy', wav=0.55) nspec = len(ppar['gasspec_mol_name']) if ppar['gasspec_mol_name'].__contains__(ispec): sid = ppar['gasspec_mol_name'].index(ispec) # Check where the radial and vertical optical depth is below unity gasabun = np.zeros([grid.nx, grid.ny, grid.nz], dtype=np.float64) for spec in range(nspec): gasabun[:,:,:] = ppar['gasspec_mol_abun'][sid] for iz in range(data.grid.nz): for iy in range(data.grid.ny): ii = (data.taux[:,iy,iz]<ppar['gasspec_mol_dissoc_taulim'][sid]) gasabun[ii,iy,iz] = 1e-90 ii = (data.dusttemp[:,iy,iz,0]<ppar['gasspec_mol_freezeout_temp'][sid]) gasabun[ii,iy,iz] = ppar['gasspec_mol_abun'][sid] * ppar['gasspec_mol_freezeout_dfact'][sid] #for iz in range(data.grid.nz): #for iy in range(data.grid.ny/2): #ii = (data.tauy[:,iy,iz]<ppar['gasspec_mol_dissoc_taulim'][sid]) #gasabun[ii,iy,iz] = 1e-90 #gasabun[ii,data.grid.ny-1-iy,iz] = 1e-90 else: gasabun = np.zeros([grid.nx, grid.ny, grid.nz], dtype=np.float64) + 1e-10 print 'WARNING !!!' print 'Molecule name "'+ispec+'" is not found in gasspec_mol_name' print 'A default 1e-10 abundance will be used' print ' ' #gasabun = np.zeros([grid.nx, grid.ny, grid.nz], dtype=np.float64) #gasabun[:,:,:] = ppar['gasspec_mol_abun'][0] / (2.4*mp) return gasabun
def getGasAbundance(grid=None, ppar=None, ispec=''): """Calculates the molecular abundance. The number density of a molecule is rhogas * abun Parameters ---------- grid : radmc3dGrid An instance of the radmc3dGrid class containing the spatial and wavelength grid ppar : dictionary Dictionary containing all parameters of the model ispec : str The name of the gas species whose abundance should be calculated Returns ------- Returns an ndarray containing the molecular abundance at each grid point """ # Read the dust density and temperature try: data = analyze.readData(ddens=True, dtemp=True, binary=True) except: try: data = analyze.readData(ddens=True, dtemp=True, binary=False) except: print('WARNING!!') print('No data could be read in binary or in formatted ascii format') print(' ') return 0 # Calculate continuum optical depth data.getTau(axis='xy', wav=0.55) nspec = len(ppar['gasspec_mol_name']) if ppar['gasspec_mol_name'].__contains__(ispec): sid = ppar['gasspec_mol_name'].index(ispec) # Check where the radial and vertical optical depth is below unity gasabun = np.zeros([grid.nx, grid.ny, grid.nz], dtype=np.float64) for spec in range(nspec): gasabun[:,:,:] = ppar['gasspec_mol_abun'][sid] for iz in range(data.grid.nz): for iy in range(data.grid.ny): ii = (data.taux[:,iy,iz]<ppar['gasspec_mol_dissoc_taulim'][sid]) gasabun[ii,iy,iz] = 1e-90 ii = (data.dusttemp[:,iy,iz,0]<ppar['gasspec_mol_freezeout_temp'][sid]) gasabun[ii,iy,iz] = ppar['gasspec_mol_abun'][sid] * ppar['gasspec_mol_freezeout_dfact'][sid] #for iz in range(data.grid.nz): #for iy in range(data.grid.ny/2): #ii = (data.tauy[:,iy,iz]<ppar['gasspec_mol_dissoc_taulim'][sid]) #gasabun[ii,iy,iz] = 1e-90 #gasabun[ii,data.grid.ny-1-iy,iz] = 1e-90 else: gasabun = np.zeros([grid.nx, grid.ny, grid.nz], dtype=np.float64) + 1e-10 print('WARNING !!!') print('Molecule name "'+ispec+'" is not found in gasspec_mol_name') print('A default 1e-10 abundance will be used') print(' ' ) #gasabun = np.zeros([grid.nx, grid.ny, grid.nz], dtype=np.float64) #gasabun[:,:,:] = ppar['gasspec_mol_abun'][0] / (2.4*mp) return gasabun
def commence(rundir, polunitlen=-2, dis=400, polmax=None, dooutput_op=1, pltopwav=None, dooutput_im=1, imlim=None, imUnits=None, imxlim=None, imylim=None,opltr=None,imaxisUnits='au', dooutput_wavim=1, anglim=None, angcmap=None, dooutput_xy=0, xyinx=None, tdxlim=None, tdylim=None, dooutput_minor=0, dooutput_stokes=0, dooutput_conv=0, fwhm=None, pa=[[0]], dooutput_alpha=0, dooutput_fits=0, bwidthmhz=2000., coord='03h10m05s -10d05m30s', dooutput_los=0, dokern=False, dooutput_sed=0, pltsed=None, dooutput_compreal=0 ): """ dooutput_conv : bool to output the convolved images imlim : list list of two elements for vmin, vmax of output_im image imxlim : tuple x coordinate limit for image in AU imylim : tuple y coordinate limit for image in AU xyinx : tuple 2 element tuple to specify which image to plot xy. In (a,b) where a is the index for inclination and b is for wavelength tdxlim : tuple tdylim : tuple 2 element tuple fwhm : list number of different resolutions by number of wavelengths in image.out pa : list number of different resolutions by number of wavelengths in image.out pltsed : 2d array [0,:] for wavelength [1,:] for observed flux opltr : list of floats the radii that is desired for overplot in au """ if os.path.isdir(rundir) is False: raise ValueError('rundir does not exist: %s'%rundir) # stokes inputs for fits files stokespref = ['I', 'Q', 'U', 'V'] # inclinations for image fname = os.path.join(rundir, 'inp.imageinc') imageinc = fntools.zylreadvec(fname) ninc = len(imageinc) # read parameter file parobj = params.radmc3dPar() parobj.readPar(fdir=rundir) # opacity op = dustopac.radmc3dDustOpac() res = op.readMasterOpac(fdir=rundir) op.readOpac(fdir=rundir, ext=res['ext'], scatmat=res['scatmat'], alignfact=res['align'][0]) fkabs = interpolate.interp1d(op.wav[0], op.kabs[0], kind='linear') fksca = interpolate.interp1d(op.wav[0], op.ksca[0], kind='linear') dinfo = op.readDustInfo() if res['align'][0]: kpara90 = op.kpara[0][0,-1] korth90 = op.korth[0][0,-1] else: kpara90 = 1. korth90 = 1. # read dust density and temperature dat = analyze.readData(fdir=rundir, binary=False, ddens=True, dtemp=True) # see if heatsource.inp exists to read accretion luminosity if os.path.isfile(os.path.join(rundir, 'heatsource.inp')): qvisdat = analyze.readData(fdir=rundir, binary=False, qvis=True) acclum = qvisdat.getHeatingLum() else: acclum = 0. temp2d = np.squeeze(dat.dusttemp[:,:,0,0]) if dokern: kern = np.array([[1,1,1,1,1], [1,2,2,2,1], [1,2,3,2,1], [1,2,2,2,1], [1,1,1,1,1]], dtype=np.float64) kern = kern / sum(kern) temp2d = convolve(temp2d, kern, boundary='fill', fill_value=0.) rho2d = np.squeeze(dat.rhodust[:,:,0,0]) reg = rho2d < 1e-32 rho2d[reg] = 1e-32 rholog = np.log10(rho2d) raxis = dat.grid.xi rstg = dat.grid.x ttaaxis = dat.grid.yi ttastg = dat.grid.y # output opacity if dooutput_op: pngname = rundir+'/out_opacity.png' getOutput_op(op, res, dinfo, pngname, pltopwav=pltopwav) # spectrum if dooutput_sed and os.path.isfile('inp.spectruminc'): star = star = radsources.radmc3dRadSources() star.readStarsinp(fdir=rundir) sedinc = fntools.zylreadvec('inp.spectruminc') nsedinc = len(sedinc) for ii in range(nsedinc): fname = rundir + '/myspectrum.i%d.out'%(sedinc[ii]) spec = image.radmc3dImage() spec.readSpectrum(fname=fname, dpc=dis) pngname = rundir + '/out_sed.i%d.png'%(sedinc[ii]) getOutput_sed(spec, pngname, star=star, pltsed=pltsed) # start iterating image related for ii in range(ninc): fname = os.path.join(rundir, 'myimage.i%d.out'%(imageinc[ii])) im = image.readImage(fname=fname) fname = os.path.join(rundir, 'mytausurf1.i%d.out'%(imageinc[ii])) if os.path.isfile(fname): tauim = image.readImage(fname=fname) else: tauim = None fname = rundir + '/mytau3d.i%d.out'%(imageinc[ii]) if os.path.isfile(fname): tau3d = image.readTauSurf3D(fname=fname) else: tau3d = None fname = os.path.join(rundir,'myoptdepth.i%d.out'%(imageinc[ii])) if os.path.isfile(fname): optim = image.readImage(fname=fname) else: optim = None camwavfile = os.path.join(rundir, 'camera_wavelength_micron.inp.image') if os.path.isfile(camwavfile): camwav = image.readCameraWavelength(fname=rundir+'/camera_wavelength_micron.inp.image') else: camwav = im.wav ncamwav = len(camwav) # line of sight properties along minor axis if dooutput_minor or dooutput_los: ylostemp = range(im.ny) ylosdens = range(im.ny) for iy in range(im.ny): ym = im.y[iy] lostemp = los.extract(imageinc[ii]*natconst.rad, ym, temp2d, raxis, rstg,ttaaxis,ttastg,0.) losdens = los.extract(imageinc[ii]*natconst.rad, ym, rholog, raxis, rstg,ttaaxis,ttastg,-32.) losdens['valcell'] = 10.**(losdens['valcell']) losdens['valwall'] = 10.**(losdens['valwall']) ylostemp[iy] = lostemp ylosdens[iy] = losdens # plot images through all wavelengths if dooutput_wavim: pngname = rundir + '/out_wavim.i%d.png'%imageinc[ii] getOutput_wavim(im, dis, pngname, imTblim=imlim, imxlim=imxlim, imylim=imylim, opltr=opltr, inc=imageinc[ii], anglim=anglim, angcmap=angcmap) # plot spectral index through all wavelengths if dooutput_alpha and (ncamwav > 0): pngname = rundir + '/out_alpha.i%d.png'%(imageinc[ii]) getOutput_alpha(im, op, pngname, opltr=opltr, inc=imageinc[ii]) ifreq = 0 for ifreq in range(ncamwav): kext = fkabs(camwav[ifreq]) + fksca(camwav[ifreq]) if dooutput_im: pngname = rundir+'/out_im.i%d.f%d.png'%(imageinc[ii],camwav[ifreq]) getOutput_im(ifreq, dis, im, optim, tauim, polunitlen, fkabs, fksca, pngname, polmax=polmax, imlim=None, imUnits='Tb', xlim=imxlim, ylim=imylim, opltr=opltr, inc=imageinc[ii], axisUnits=imaxisUnits) if dooutput_xy: if xyinx is not None: if (xyinx[0] == ii) and (xyinx[1] == ifreq): pngname = rundir+'/out_xy.i%d.f%d.png'%(imageinc[ii],camwav[ifreq]) getOutput_xy(ifreq, tau3d, dat, acclum, tdxlim, tdylim, pngname=pngname, parobj=parobj) else: pngname = rundir+'/out_xy.i%d.f%d.png'%(imageinc[ii],camwav[ifreq]) getOutput_xy(ifreq, tau3d, dat, acclum, tdxlim, tdylim, pngname=pngname, parobj=parobj) if dooutput_minor: pngname=rundir+'/out_minor.i%d.f%d.png'%(imageinc[ii],camwav[ifreq]) getOutput_minor(ifreq, im, optim, kpara90, korth90, kext, ylostemp, ylosdens, pngname) if dooutput_stokes: pngname=rundir+'/out_stokes.i%d.f%d.png'%(imageinc[ii],camwav[ifreq]) getOutput_stokes(ifreq, dis, im, pngname, polmax=polmax) if dooutput_los: pngname = rundir + '/out_los.i%d.f%d.png'%(imageinc[ii],camwav[ifreq]) getOutput_los(camwav[ifreq], fkabs, fksca, losdens, lostemp, pngname) if dooutput_fits: # output to fits file if im.stokes: #if stokes image for isk in range(4): fitsname = os.path.join(rundir, 'myimage.i%d.f%d.%s.fits'%(imageinc[ii], camwav[ifreq],stokespref[isk]) ) im.writeFits(fname=fitsname, dpc=dis, casa=True, bandwidthmhz=bwidthmhz, coord=coord, stokes=stokespref[isk], ifreq=ifreq, overwrite=True) else: fitsname = os.path.join(rundir, 'myimage.i%d.f%d.fits'%(imageinc[ii], camwav[ifreq]) ) im.writeFits(fname=fitsname, dpc=dis, casa=True, bandwidthmhz=bwidthmhz, coord=coord, stokes='I', ifreq=ifreq, overwrite=True) if (dooutput_conv) & (fwhm is not None): npa = len(pa) for ipa in range(npa): conv = im.imConv(dpc=dis, psfType='gauss', fwhm=fwhm[ipa], pa=pa[ipa]) # plot convolved image through all wavelengths if dooutput_wavim: pngname = rundir + '/out_wavim.i%d.b%d.png'%(imageinc[ii], ipa) getOutput_wavim(conv, dis, pngname, imTblim=imlim, imxlim=imxlim, imylim=imylim, opltr=opltr, inc=imageinc[ii], anglim=anglim, angcmap=angcmap) for ifreq in range(ncamwav): if dooutput_im: pngname = rundir+'/out_im.i%d.f%d.b%d.png'%(imageinc[ii],camwav[ifreq], ipa) getOutput_im(ifreq, dis, conv, optim, tauim, polunitlen, fkabs, fksca, pngname, polmax=polmax, imlim=imlim, imUnits=imUnits, xlim=imxlim, ylim=imylim, opltr=opltr, inc=imageinc[ii], axisUnits=imaxisUnits) # if dooutput_xy: # pngname = rundir+'/out_xy.i%d.f%d.b%d.png'%(imageinc[ii],camwav[ifreq], ipa) # getOutput_xy(ifreq, tauim, tau3d, dat, pngname) if dooutput_minor: pngname=rundir+'/out_minor.i%d.f%d.b%d.png'%(imageinc[ii],camwav[ifreq], ipa) getOutput_minor(ifreq, conv, optim, kpara90, korth90, kext, ylostemp, ylosdens, pngname) if dooutput_stokes: pngname=rundir+'/out_stokes.i%d.f%d.b%d.png'%(imageinc[ii],camwav[ifreq], ipa) getOutput_stokes(ifreq, dis, conv, pngname, polmax=polmax) if dooutput_fits: if conv.stokes: for isk in range(4): fitsname = os.path.join(rundir, 'myimage.i%d.f%d.%s.b%d.fits'%(imageinc[ii], camwav[ifreq],stokespref[isk], ipa)) conv.writeFits(fname=fitsname, dpc=dis, casa=True, bandwidthmhz=bwidthmhz, coord=coord, stokes=stokespref[isk], ifreq=ifreq, overwrite=True) else: fitsname = os.path.join(rundir, 'myimage.i%d.f%d.b%d.fits'%(imageinc[ii], camwav[ifreq], ipa)) conv.writeFits(fname=fitsname, dpc=dis, casa=True, bandwidthmhz=bwidthmhz, coord=coord, stokes='I', ifreq=ifreq, overwrite=True) # free up this memory del conv # free up the memory before going to next iteration del im del tauim del tau3d del optim