def main(): # run grtrans x = gr.grtrans() x.write_grtrans_inputs( name + '.in', oname=name + '.out', fname='SARIAF', phi0=0., #betaeconst=1.e-4, ximax=10., nfreq=1, fmin=RF, fmax=RF, gmin=100., p2=2.25, p1=2.25, snscl=NSCL, ntscl=TSCL, snnthscl=NNTHSCL, snnthp=PNTH, sbeta=BETA, sbl06=0, fpositron=FPOSITRON, ename='HYBRIDTHPL', nvals=4, spin=0., standard=1, uout=uout, mbh=MBH, #mdotmin=1.57e15,mdotmax=1.57e15,nmdot=1, nmu=1, mumin=mu, mumax=mu, gridvals=[-size, size, -size, size], nn=[npix, npix, ngeo], hindf=1, hnt=1, muval=1.) if RERUN: x.run_grtrans() # load image x.read_grtrans_output() x.convert_to_Jy(DTOBH) tmax = np.max(x.ivals[:, 0, 0] * 3.254e13 / (RF**2 * psize_rad**2)) pmax = np.max( np.sqrt(x.ivals[:, 1, 0]**2 + x.ivals[:, 2, 0]**2) * 3.254e13 / (RF**2 * psize_rad**2)) tmax = 5.e10 pmax = 2.e10 save_grtrans_image(x) display_grtrans_image(x, tmax=tmax, pmax=pmax)
def main(): # run grtrans x = gr.grtrans() x.write_grtrans_inputs( name + '.in', oname=name + '.out', fname='RRJET', phi0=0., betaeconst=1.e-4, ximax=10., nfreq=1, fmin=RF, fmax=RF, gmin=10., gmax=1.e35, p2=pp, p1=pp, #ename='SYNCHPL', ename='POLSYNCHPL', nvals=4, fpositron=0, spin=0., standard=1, uout=uout, mbh=MBH, #epcoefindx=[1,1,1,1,1,1,1], #epcoefindx=[1,1,1,1,0,0,0], mdotmin=1.57e15, mdotmax=1.57e15, nmdot=1, nmu=1, mumin=mu, mumax=mu, gridvals=[-size, size, -size, size], nn=[npix, npix, ngeo], hindf=1, hnt=1, muval=1.) if RERUN: x.run_grtrans() # load image x.read_grtrans_output() x.convert_to_Jy(DTOBH) #grt_obj=x save_grtrans_image(x) display_grtrans_image(x)
def run_unit_tests(grtrans_dir='',compile=0): failed = [] nfailed = 0 if compile==1: # compile grtrans library os.system('make all') if grtrans_dir=='': grtrans_dir = os.getcwd() # kerr tests: parallel transport of pol, consistency check between two pol methods angtol=1e-2; dottol=1e-6 x=gr.grtrans() # write appropriate inputs for comparison to geokerr x.write_grtrans_inputs('inputs.in',fname='THINDISK',nfreq=25,nmu=1,fmin=2.41e16,fmax=6.31e18,ename='BBPOL',nvals=4,spin=0.9,standard=2,nn=[100,100,1],uout=0.01,mbh=10, mumin=.26,mumax=.26,gridvals=[-21,21,-21,21]) os.system('rm unit_test_kerr.out') os.system('gfortran test_kerr.f90 -L'+grtrans_dir+' -lgrtrans') os.system('./a.out') maxang,maxangdiff,kdotk,kdota,perpk = np.loadtxt('unit_test_kerr.out') if maxang > angtol or maxangdiff > dottol or kdotk > dottol or kdota > dottol or perpk > dottol: print 'Error in kerr unit test!' failed.append('kerr') nfailed+=1 # geodesics unit tests: k^\mu ?= dx^\mu / d\lambda # fluid unit tests fluid_tests = ['hotspot','harm','ffjet'] ubtol = [1e-4, 1e-2, 1e-1, 0.4]; utol = [1e-4, 1e-2, 1e-1, 0.4] for i in range(len(fluid_tests)): print 'i: ',i,range(len(fluid_tests)),fluid_tests[i] os.system('rm unit_test_'+fluid_tests[i]+'.out') os.system('cp '+fluid_tests[i]+'.in.dist '+fluid_tests[i]+'.in') os.system('gfortran test_'+fluid_tests[i]+'.f90 -L'+grtrans_dir+' -lgrtrans') os.system('./a.out') minn, maxnorm, maxub = np.loadtxt('unit_test_'+fluid_tests[i]+'.out') print 'vals: ',minn, maxnorm, maxub if maxnorm > utol[i] or maxub > ubtol[i] or minn < 0: print 'Error in '+fluid_tests[i]+' unit test!' failed.append(fluid_tests[i]) nfailed+=1 # integration tests if nfailed==0: print 'Passed all unit tests!' else: print 'Failed tests: ',failed print 'Exiting unit tests' return nfailed,failed
def run_test_problems(save=0, pgrtrans=0, nosphacc=0, compile=0): # run grtrans test problems tol = 1e-2 failed = [] xlist = [] xlist.append(gr.grtrans()) if compile > 0: if pgrtrans == 0: xlist[-1].compile_grtrans() else: xlist[-1].compile_pgrtrans() passed = 0 max_passed = 0 if nosphacc <= 0: # sphacc # xlist[-1].write_grtrans_inputs('inputs.in',fname='SPHACC',nfreq=15,nmu=1,fmin=2.41e10,fmax=6.31e14,ename='POLSYNCHTH',nvals=4,spin=0.,mbh=10.,standard=1,uout=.003,nn=[100,100,100") # New tests of 1d intensity profile & full spectrum 12/14/2012 xlist[-1].write_grtrans_inputs('inputs.in', fname='SPHACC', nfreq=25, nmu=1, fmin=1e8, fmax=1e15, ename='SYNCHTHAV', nvals=1, spin=0., mbh=1., standard=1, nn=[10000, 1, 100], gridvals=[0., 400., 0., 0.], uout=.0025, oname='sphacc_abs.out') if pgrtrans == 0: xlist[-1].run_grtrans() xlist[-1].read_grtrans_output() else: xlist[-1].run_pgrtrans(fname='SPHACC', nfreq=25, nmu=1, fmin=1e8, fmax=1e15, ename='SYNCHTHAV', nvals=1, spin=0., mbh=1., standard=1, nn=[10000, 1, 100], gridvals=[0., 400., 0., 0.], uout=.0025, oname='sphacc_abs.out') xlist[-1].calc_spec_pgrtrans((np.shape(xlist[-1].ivals))[2]) if save == 0: i = pickle.load(open('test_grtrans_sphacc_intensity.p', 'rb')) if pgrtrans == 0: terr = np.sum(np.abs(xlist[-1].ivals[:, 0, 14] - i)) / np.sum( np.abs(i)) else: terr = np.sum(np.abs(xlist[-1].ivals[0, :, 14] - i)) / np.sum( np.abs(i)) print 'terr: ', terr if terr < (10 * tol): passed += 1 else: failed.append('sphacc intensity') max_passed += 1 i = pickle.load(open('test_grtrans_sphacc_spectrum.p', 'rb')) terr = np.sum(np.abs(xlist[-1].spec - i)) / np.sum(np.abs(i)) print 'terr: ', terr if terr < (10 * tol): passed += 1 else: failed.append('sphacc spectrum') max_passed += 1 else: pickle.dump(xlist[-1].ivals[:, 0, 14], open('test_grtrans_sphacc_intensity.p', 'wb')) pickle.dump(xlist[-1].spec, open('test_grtrans_sphacc_spectrum.p', 'wb')) # ffjet xlist.append(gr.grtrans()) if pgrtrans == 0: xlist[-1].write_grtrans_inputs( 'inputs.in', fname='FFJET', jdfile='m87bl09rfp10xi5a998fluidvars.bin', nfreq=1, nmu=1, fmin=3.45e11, fmax=3.45e11, ename='POLSYNCHPL', nvals=4, spin=0.998, standard=1, nn=[100, 100, 400], uout=0.01, mbh=3.4e9, mumin=.906, mumax=.906, gridvals=[-40, 20, -20, 40]) xlist[-1].run_grtrans() xlist[-1].read_grtrans_output() else: xlist[-1].run_pgrtrans(fname='FFJET', fdfile='m87bl09rfp10xi5a998fluidvars.bin', nfreq=1, nmu=1, fmin=3.45e11, fmax=3.45e11, ename='POLSYNCHPL', nvals=4, spin=0.998, standard=1, nn=[100, 100, 400], uout=0.01, mbh=3.4e9, mumin=.906, mumax=.906, gridvals=[-40, 20, -20, 40]) xlist[-1].calc_spec_pgrtrans((np.shape(xlist[-1].ivals))[2]) if save == 0: i = pickle.load(open('test_grtrans_ffjet.p', 'rb')) if pgrtrans == 0: terr = np.sum(np.abs(xlist[-1].ivals - i)) / np.sum(np.abs(i)) else: terr = np.sum(np.abs(xlist[-1].ivals.transpose([1, 0, 2]) - i)) / np.sum(np.abs(i)) print 'terr: ', terr if terr < tol: passed += 1 else: failed.append('ffjet') max_passed += 1 else: pickle.dump(xlist[-1].ivals, open('test_grtrans_ffjet.p', 'wb')) # ffjet with delo integrator x2 = gr.grtrans() if pgrtrans == 0: x2.write_grtrans_inputs('inputs.in', fname='FFJET', jdfile='m87bl09rfp10xi5a998fluidvars.bin', nfreq=1, nmu=1, fmin=3.45e11, fmax=3.45e11, ename='POLSYNCHPL', nvals=4, spin=0.998, standard=1, nn=[100, 100, 1600], uout=0.01, mbh=3.4e9, mumin=.906, mumax=.906, gridvals=[-40, 20, -20, 40], iname='delo') x2.run_grtrans() x2.read_grtrans_output() else: x2.run_pgrtrans(fname='FFJET', fdfile='m87bl09rfp10xi5a998fluidvars.bin', nfreq=1, nmu=1, fmin=3.45e11, fmax=3.45e11, ename='POLSYNCHPL', nvals=4, spin=0.998, standard=1, nn=[100, 100, 1600], uout=0.01, mbh=3.4e9, mumin=.906, mumax=.906, gridvals=[-40, 20, -20, 40], iname='delo') x2.calc_spec_pgrtrans((np.shape(x2.ivals))[2]) terr = 10. terr = np.max(np.abs(x2.spec - xlist[-1].spec) / xlist[-1].spec) print 'terr: ', terr if terr < 0.05: passed += 1 else: failed.append('delo') max_passed += 1 # ffjet with formal rad trans solution from Degl'Innocenti (1985): x3 = gr.grtrans() if pgrtrans == 0: x3.write_grtrans_inputs('inputs.in', fname='FFJET', jdfile='m87bl09rfp10xi5a998fluidvars.bin', nfreq=1, nmu=1, fmin=3.45e11, fmax=3.45e11, ename='POLSYNCHPL', nvals=4, spin=0.998, standard=1, nn=[100, 100, 1600], uout=0.01, mbh=3.4e9, mumin=.906, mumax=.906, gridvals=[-40, 20, -20, 40], iname='formal') x3.run_grtrans() x3.read_grtrans_output() else: x3.run_pgrtrans(fname='FFJET', fdfile='m87bl09rfp10xi5a998fluidvars.bin', nfreq=1, nmu=1, fmin=3.45e11, fmax=3.45e11, ename='POLSYNCHPL', nvals=4, spin=0.998, standard=1, nn=[100, 100, 1600], uout=0.01, mbh=3.4e9, mumin=.906, mumax=.906, gridvals=[-40, 20, -20, 40], iname='formal') x3.calc_spec_pgrtrans((np.shape(x3.ivals))[2]) terr = 10. terr = np.max(np.abs(x3.spec - xlist[-1].spec) / xlist[-1].spec) print 'terr: ', terr if terr < 0.05: passed += 1 else: failed.append('formal') max_passed += 1 x2 = 0 x3 = 0 # thindisk xlist.append(gr.grtrans()) xlist[-1].write_grtrans_inputs('inputs.in', fname='THINDISK', nfreq=25, nmu=1, fmin=2.41e16, fmax=6.31e18, ename='BBPOL', nvals=4, spin=0.9, standard=2, nn=[100, 100, 1], uout=0.01, mbh=10, mumin=.26, mumax=.26, gridvals=[-21, 21, -21, 21]) if pgrtrans == 0: xlist[-1].run_grtrans() xlist[-1].read_grtrans_output() else: xlist[-1].run_pgrtrans(fname='THINDISK', nfreq=25, nmu=1, fmin=2.41e16, fmax=6.31e18, ename='BBPOL', nvals=4, spin=0.9, standard=2, nn=[100, 100, 1], uout=0.01, mbh=10, mumin=.26, mumax=.26, gridvals=[-21, 21, -21, 21]) xlist[-1].calc_spec_pgrtrans((np.shape(xlist[-1].ivals))[2]) if save == 0: i = pickle.load(open('test_grtrans_thindisk.p', 'rb')) if pgrtrans == 0: terr = np.sum(np.abs(xlist[-1].ivals - i)) / np.sum(np.abs(i)) else: terr = np.sum(np.abs(xlist[-1].ivals.transpose([1, 0, 2]) - i)) / np.sum(np.abs(i)) print 'terr: ', terr if terr < tol: passed += 1 else: failed.append('thindisk') max_passed += 1 else: pickle.dump(xlist[-1].ivals, open('test_grtrans_thindisk.p', 'wb')) # total I w/, w/o pol xlist.append(gr.grtrans()) xlist[-1].write_grtrans_inputs('inputs.in', fname='FFJET', jdfile='m87bl09rfp10xi5a998fluidvars.bin', nfreq=1, nmu=1, fmin=3.45e11, fmax=3.45e11, ename='SYNCHPL', nvals=1, spin=0.998, standard=1, nn=[100, 100, 400], uout=0.01, mbh=3.4e9, mumin=.906, mumax=.906, gridvals=[-40, 20, -20, 40]) if pgrtrans == 0: xlist[-1].run_grtrans() xlist[-1].read_grtrans_output() else: xlist[-1].run_pgrtrans(fname='FFJET', fdfile='m87bl09rfp10xi5a998fluidvars.bin', nfreq=1, nmu=1, fmin=3.45e11, fmax=3.45e11, ename='SYNCHPL', nvals=1, spin=0.998, standard=1, nn=[100, 100, 400], uout=0.01, mbh=3.4e9, mumin=.906, mumax=.906, gridvals=[-40, 20, -20, 40]) xlist[-1].calc_spec_pgrtrans((np.shape(xlist[-1].ivals))[2]) if save == 0: i = pickle.load(open('test_grtrans_ffjet.p', 'rb')) if pgrtrans == 0: terr = np.sum(np.abs(xlist[-1].ivals[:, 0, 0] - i[:, 0, 0])) / np.sum(abs(i[:, 0, 0])) else: terr = np.sum(np.abs(xlist[-1].ivals[0, :, 0] - i[:, 0, 0])) / np.sum(abs(i[:, 0, 0])) print 'terr: ', terr if terr < tol: passed += 1 else: failed.append('polunpol') max_passed += 1 # harm xlist.append(gr.grtrans()) xlist[-1].write_grtrans_inputs('inputs.in', fname='HARM', nfreq=1, nmu=1, fmin=2.3e11, fmax=2.3e11, ename='POLSYNCHTH', nvals=1, spin=0.9375, standard=1, nn=[150, 150, 400], uout=0.04, mbh=4e6, mdotmin=1.57e15, mdotmax=1.57e15, nmdot=1, mumin=.6428, mumax=.6428, gridvals=[-13, 13, -13, 13], hhfile='dump040', hdfile='dump', hindf=40, hnt=1, muval=1. / 4.) if pgrtrans == 0: xlist[-1].run_grtrans() xlist[-1].read_grtrans_output() else: xlist[-1].run_pgrtrans(fname='HARM', nfreq=1, nmu=1, fmin=2.3e11, fmax=2.3e11, ename='POLSYNCHTH', nvals=1, spin=0.9375, standard=1, nn=[150, 150, 400], uout=0.04, mbh=4e6, mdotmin=1.57e15, mdotmax=1.57e15, nmdot=1, mumin=.6428, mumax=.6428, gridvals=[-13., 13., -13., 13.], fhfile='dump040', fdfile='dump', findf=40, fnt=1, muval=1. / 4.) xlist[-1].calc_spec_pgrtrans((np.shape(xlist[-1].ivals))[2]) if save == 0: i = pickle.load(open('test_grtrans_harm.p', 'rb')) xlist[-1].ivals = np.where(xlist[-1].ivals == xlist[-1].ivals, xlist[-1].ivals, np.zeros(np.shape(xlist[-1].ivals))) i = np.where(i == i, i, np.zeros(np.shape(i))) if pgrtrans == 0: terr = np.sum(np.abs(xlist[-1].ivals[:, 0, 0] - i[:, 0, 0])) / np.sum(abs(i[:, 0, 0])) else: terr = np.sum(np.abs(xlist[-1].ivals[0, :, 0] - i[:, 0, 0])) / np.sum(abs(i[:, 0, 0])) print 'terr: ', terr if terr < tol: passed += 1 else: failed.append('harm') max_passed += 1 else: pickle.dump(xlist[-1].ivals, open('test_grtrans_harm.p', 'wb')) xlist.append(gr.grtrans()) xlist[-1].write_grtrans_inputs('inputs.in', fname='POWERLAW', nfreq=1, nmu=1, fmin=3.45e11, fmax=3.45e11, ename='POLSYNCHTH', nvals=4, spin=0., standard=1, nn=[200, 200, 1600], uout=0.00005, mbh=4e6, mumin=0.5, mumax=0.5, nrotype=1, gridvals=[1200., 4000., 0., 2. * np.pi], iname='lsoda', srin=3200., srout=3300., ntscl=5e11, sthin=-0.02, sthout=0.02, rcut=4000., snscl=1e5, phi0=-0.5, sphiin=0.) if pgrtrans == 0: xlist[-1].run_grtrans() xlist[-1].read_grtrans_output() else: xlist[-1].run_pgrtrans(fname='POWERLAW', nfreq=1, nmu=1, fmin=3.45e11, fmax=3.45e11, ename='POLSYNCHTH', nvals=4, spin=0., standard=1, nn=[200, 200, 1600], uout=0.00005, mbh=4e6, mumin=0.5, mumax=0.5, nrotype=1, gridvals=[1200., 4000., 0., 2. * np.pi], iname='lsoda', srin=3200., srout=3300., ntscl=5e11, sthin=-0.02, sthout=0.02, rcut=4000., snscl=1e5, phi0=-0.5, sphiin=0.) xlist[-1].calc_spec_pgrtrans((np.shape(xlist[-1].ivals))[2]) if save == 0: i = pickle.load(open('test_toroidalfield.p', 'rb')) xlist[-1].ivals = np.where(xlist[-1].ivals == xlist[-1].ivals, xlist[-1].ivals, np.zeros(np.shape(xlist[-1].ivals))) i = np.where(i == i, i, np.zeros(np.shape(i))) # if pgrtrans==0: # terr = np.sum(np.abs(xlist[-1].ivals[:,0,0]-i[0,:,0]))/np.sum(abs(i[0,:,0])) # else: # terr = np.sum(np.abs(xlist[-1].ivals[0,:,0]-i[0,:,0]))/np.sum(abs(i[0,:,0])) if pgrtrans == 0: terr = np.sum(np.abs(xlist[-1].ivals - i)) / np.sum(np.abs(i)) else: terr = np.sum(np.abs(xlist[-1].ivals.transpose([1, 0, 2]) - i)) / np.sum(np.abs(i)) print 'terr: ', terr if terr < tol: passed += 1 else: failed.append('toroidal') max_passed += 1 else: pickle.dump(xlist[-1].ivals, open('test_toroidalfield.p', 'wb')) print 'tests total: ', max_passed print 'tests passed: ', passed print 'tests failed: ', failed return passed, max_passed, failed, xlist
def run_grtrans_spectrum(fname, nscl=NSCL, tscl=TSCL, beta=BETA, fpositron=FPOSITRON, nthfrac=NTHFRAC, pnth=PNTH, gmin=GAMMAMIN, gmax=GAMMAMAX): """Run grtrans spectrum""" size_spec = 0.5 * FOV_SPEC uout_spec = 1. / (DEPTH * size_spec) npix_x = NPIX_SPEC npix_y = NPIX_SPEC size_x = size_spec size_y = size_spec nthscl = nthfrac * nscl # nonthermal number density x = gr.grtrans() x.write_grtrans_inputs( fname + '_spec.in', oname=fname + '_spec.out', fname='SARIAF', phi0=0., #nfreq=2,fmin=200.e9,fmax=230.e9, nfreq=NFREQ, fmin=FMIN, fmax=FMAX, snscl=nscl, ntscl=tscl, snnthscl=nthscl, sbeta=beta, gmin=gmin, gmax=gmax, p2=pnth, p1=pnth, fpositron=fpositron, snnthp=NTH_RADIAL_PLAW, sbl06=BLO6, ename='HYBRIDTHPL', nvals=4, spin=A, standard=1, uout=uout_spec, mbh=MBH, nmu=1, mumin=mu, mumax=mu, gridvals=[-size_x, size_x, -size_y, size_y], nn=[npix_x, npix_y, NGEO], #gridvals=[-size_spec,size_spec,-size_spec,size_spec], #nn=[NPIX_SPEC,NPIX_SPEC,NGEO], hindf=1, hnt=1, muval=1.) # run grtrans if RERUN: x.run_grtrans() # load spectrum x.read_grtrans_output() x.calc_freqs(NFREQ) x.convert_to_lum() spec = x.spec[0][0:NFREQ] qspec = x.spec[1][0:NFREQ] uspec = x.spec[2][0:NFREQ] vspec = x.spec[3][0:NFREQ] if npix_x == 1 or npix_y == 1: spec *= 0.5 # divide by 2 because we have +/- r in the strip qspec *= 0.5 uspec *= 0.5 vspec *= 0.5 freqs = x.freqs # save spectrum if SAVEOUT: outdat = np.vstack([freqs, spec, qspec, uspec, vspec]).T np.savetxt(fname + '_spec.txt', outdat) # display spectrum if DISPLAYOUT: plot_grtrans_spectrum(freqs, spec, qspec, uspec, vspec)
def findnscl(fname, flux, nsclmin, nsclmax, tscl=TSCL, beta=BETA, fpositron=FPOSITRON, nthfrac=NTHFRAC, pnth=PNTH, gmin=GAMMAMIN, gmax=GAMMAMAX): """ run grtrans single image to find the nscl that gives the correct flux with bisection, for all other parameters fixed """ #print('FPOSITRON', fpositron) # convergance parameters bedge_stop = 1 fluxconvratio = .05 itermax = 20 # these image parameters are fixed for now fov_search = FOV / 2. npix_search = int(NPIX / 2) size = 0.5 * fov_search uout = 1. / (DEPTH * size) nsclmin0 = nsclmin nsclmax0 = nsclmax for i in range(itermax): # nscl by bisection nscl = (nsclmax + nsclmin) / 2. print("min/max/mid %.2f %.2f %.2f" % (nsclmin, nsclmax, nscl)) if nsclmax0 - nscl < bedge_stop: print("did not find solution -- to close to nsclmax!") break if nscl - nsclmin0 < bedge_stop: print("did not find solution -- to close to nsclmin!") break # pressure scale is fixed! nthscl = nthfrac * nscl # nonthermal number density x = gr.grtrans() x.write_grtrans_inputs(fname + '_SEARCH.in', oname=fname + '_SEARCH.out', fname='SARIAF', phi0=0., nfreq=1, fmin=RFGHZ * 1.e9, fmax=RFGHZ * 1.e9, snscl=nscl, ntscl=tscl, snnthscl=nthscl, sbeta=beta, gmin=gmin, gmax=gmax, p2=pnth, p1=pnth, fpositron=fpositron, snnthp=NTH_RADIAL_PLAW, sbl06=BLO6, ename='HYBRIDTHPL', nvals=1, spin=A, standard=1, uout=uout, mbh=MBH, nmu=1, mumin=mu, mumax=mu, gridvals=[-size, size, -size, size], nn=[npix_search, npix_search, NGEO], hindf=1, hnt=1, muval=1.) print() # run grtrans x.run_grtrans() # load image data x.read_grtrans_output() # pixel sizes #da = x.ab[x.nx,0]-x.ab[0,0] da = x.ab[x.ny, 0] - x.ab[0, 0] ##TODO -- is this right ordering? db = x.ab[1, 1] - x.ab[0, 1] if (da != db): raise Exception("pixel da!=db") psize = da * (cmperrg / bhdist) #image values ivals = x.ivals[:, 0, 0] * LumFac * da * db * LumtoJy imask = ivals < 0. ivals[imask] = 0. #total flux tflux = np.sum(ivals) tfluxdiff = tflux - flux tfluxdiff_rel = np.abs(tfluxdiff / flux) print("iter %i %.1f | %.3f/%.3f %.2f" % (i + 1, nscl, tflux, flux, tfluxdiff_rel)) # flux must monotonically increase with nscl, if all other params fixed if tfluxdiff_rel < fluxconvratio: print("solution: nscl=%.2f, tflux=%.3f" % (nscl, tflux)) break if (tflux < flux): nsclmin = nscl elif (tflux > flux): nsclmax = nscl if i == itermax - 1: print("did not find solution -- reached itermax!") break return nscl
def run_grtrans_image(fname, nscl=NSCL, tscl=TSCL, beta=BETA, fpositron=FPOSITRON, nthfrac=NTHFRAC, pnth=PNTH, gmin=GAMMAMIN, gmax=GAMMAMAX): """ run grtrans single image""" size = 0.5 * FOV uout = 1. / (DEPTH * size) # nonthermal number density nthscl = nthfrac * nscl # TO TURN OFF FARADAY CONVERSTION epcoefindx = [1, 1, 1, 1, 1, 1, 1] #epcoefindx=[1,1,1,1,0,1,1] x = gr.grtrans() x.write_grtrans_inputs(fname + '_im.in', oname=fname + '_im.out', fname='SARIAF', phi0=0., nfreq=1, fmin=RFGHZ * 1.e9, fmax=RFGHZ * 1.e9, snscl=nscl, ntscl=tscl, snnthscl=nthscl, sbeta=beta, gmin=gmin, gmax=gmax, p2=pnth, p1=pnth, fpositron=fpositron, snnthp=NTH_RADIAL_PLAW, sbl06=BLO6, ename='HYBRIDTHPL', epcoefindx=epcoefindx, nvals=4, spin=A, standard=1, uout=uout, mbh=MBH, nmu=1, mumin=mu, mumax=mu, gridvals=[-size, size, -size, size], nn=[NPIX, NPIX, NGEO], hindf=1, hnt=1, muval=1.) # run grtrans if RERUN: x.run_grtrans() # load image data x.read_grtrans_output() # pixel sizes #da = x.ab[x.nx,0]-x.ab[0,0] da = x.ab[x.ny, 0] - x.ab[0, 0] ##TODO -- is this right ordering? db = x.ab[1, 1] - x.ab[0, 1] if (da != db): raise Exception("pixel da!=db") psize = da * (cmperrg / bhdist) #image values ivals = x.ivals[:, 0, 0] * LumFac * da * db * LumtoJy qvals = x.ivals[:, 1, 0] * LumFac * da * db * LumtoJy uvals = x.ivals[:, 2, 0] * LumFac * da * db * LumtoJy vvals = x.ivals[:, 3, 0] * LumFac * da * db * LumtoJy # correct orientation for eht-imaging ivals = (np.flipud(np.transpose(ivals.reshape((NPIX, NPIX))))).flatten() qvals = -(np.flipud(np.transpose(qvals.reshape((NPIX, NPIX))))).flatten() uvals = -(np.flipud(np.transpose(uvals.reshape((NPIX, NPIX))))).flatten() vvals = (np.flipud(np.transpose(vvals.reshape((NPIX, NPIX))))).flatten() imdata = (ivals, qvals, uvals, vvals, psize) # Rotate the image if ROTANG != 0: imdata = rotateimdata(imdata, ROTANG, interp='cubic') # save image if SAVEOUT: save_im_fits(imdata, fname + ('%.0f.fits' % RFGHZ), freq_ghz=RFGHZ) # display images if DISPLAYOUT: #tmax=5.e10 #pmax=2.e10 tmax = np.max(ivals * 3.254e13 / ((RFGHZ * 1.e9)**2 * psize**2)) pmax = np.max( np.sqrt(qvals**2 + uvals**2) * 3.254e13 / ((RFGHZ * 1.e9)**2 * psize**2)) display_grtrans_image(imdata, tmax=tmax, pmax=pmax)
def run_grtrans_spectrum(fname, fpositron=FPOSITRON, pegasratio=PEGASRATIO, betaeconst=BETAECONST, betaecrit=BETAECRIT, bscl=BSCL, gmin=GAMMAMIN, gmax=GAMMAMAX, pnth=PNTH): """Run grtrans spectrum""" size_spec = 0.5 * FOV_SPEC uout_spec = 1. / (DEPTH * size_spec) npix_x = NPIX_SPEC npix_y = NPIX_SPEC size_x = size_spec size_y = size_spec # pressure scale is fixed! pscl = (bscl**2) / (8 * np.pi) x = gr.grtrans() x.write_grtrans_inputs(fname + '_spec.in', oname=fname + '_spec.out', fname='RRJET', phi0=0., pegasratio=pegasratio, betaeconst=betaeconst, betaecrit=betaecrit, ximax=XIMAX, bscl=bscl, pscl=pscl, nfreq=NFREQ, fmin=FMIN, fmax=FMAX, gmin=gmin, gmax=gmax, p2=pnth, p1=pnth, fpositron=fpositron, ename='POLSYNCHPL', nvals=4, spin=A, standard=1, uout=uout_spec, mbh=MBH, nmu=1, mumin=mu, mumax=mu, gridvals=[-size_x, size_x, -size_y, size_y], nn=[npix_x, npix_y, NGEO], hindf=1, hnt=1, muval=1.) # run grtrans if RERUN: x.run_grtrans() # load spectrum x.read_grtrans_output() x.calc_freqs(NFREQ) x.convert_to_lum() spec = x.spec[0][0:NFREQ] qspec = x.spec[1][0:NFREQ] uspec = x.spec[2][0:NFREQ] vspec = x.spec[3][0:NFREQ] if npix_x == 1 or npix_y == 1: spec *= 0.5 # divide by 2 because we have +/- r in the strip qspec *= 0.5 uspec *= 0.5 vspec *= 0.5 freqs = x.freqs # save spectrum if SAVEOUT: outdat = np.vstack([freqs, spec, qspec, uspec, vspec]).T np.savetxt(fname + '_spec.txt', outdat) # display spectrum if DISPLAYOUT: plot_grtrans_spectrum(freqs, spec, qspec, uspec, vspec)
def findbscl(fname, flux, bsclmin, bsclmax, fpositron=FPOSITRON, pegasratio=PEGASRATIO, betaeconst=BETAECONST, betaecrit=BETAECRIT, gmin=GAMMAMIN, gmax=GAMMAMAX, pnth=PNTH): """ run grtrans single image to find the bscl that gives the correct flux with bisection, for all other parameters fixed """ # convergance parameters bedge_stop = 1 fluxconvratio = .05 itermax = 20 # these image parameters are fixed for now fov_search = FOV / 2. npix_search = int(NPIX / 2) size = 0.5 * fov_search uout = 1. / (DEPTH * size) bsclmin0 = bsclmin bsclmax0 = bsclmax for i in range(itermax): # bscl by bisection bscl = (bsclmax + bsclmin) / 2. if bsclmax0 - bscl < bedge_stop: print("did not find solution -- to close to bsclmax!") break if bscl - bsclmin0 < bedge_stop: print("did not find solution -- to close to bsclmin!") break # pressure scale is fixed! pscl = (bscl**2) / (8 * np.pi) x = gr.grtrans() x.write_grtrans_inputs(fname + '_SEARCH.in', oname=fname + '_SEARCH.out', fname='RRJET', phi0=0., pegasratio=pegasratio, betaeconst=betaeconst, betaecrit=betaecrit, ximax=XIMAX, bscl=bscl, pscl=pscl, nfreq=1, fmin=RFGHZ * 1.e9, fmax=RFGHZ * 1.e9, gmin=gmin, gmax=gmax, p2=pnth, p1=pnth, fpositron=fpositron, ename='POLSYNCHPL', nvals=1, spin=A, standard=1, uout=uout, mbh=MBH, nmu=1, mumin=mu, mumax=mu, gridvals=[-size, size, -size, size], nn=[npix_search, npix_search, NGEO], hindf=1, hnt=1, muval=1.) # run grtrans x.run_grtrans() # load image data x.read_grtrans_output() # pixel sizes #da = x.ab[x.nx,0]-x.ab[0,0] da = x.ab[x.ny, 0] - x.ab[0, 0] ##TODO -- is this right ordering? db = x.ab[1, 1] - x.ab[0, 1] if (da != db): raise Exception("pixel da!=db") psize = da * (cmperrg / bhdist) #image values ivals = x.ivals[:, 0, 0] * LumFac * da * db * LumtoJy imask = ivals < 0. ivals[imask] = 0. #total flux tflux = np.sum(ivals) tfluxdiff = tflux - flux tfluxdiff_rel = np.abs(tfluxdiff / flux) print("iter %i %.1f | %.3f/%.3f %.2f" % (i + 1, bscl, tflux, flux, tfluxdiff_rel)) # flux must monotonically increase with bscl, if all other params fixed if tfluxdiff_rel < fluxconvratio: print("solution: bscl=%.2f, tflux=%.3f" % (bscl, tflux)) break if (tflux < flux): bsclmin = bscl elif (tflux > flux): bsclmax = bscl if i == itermax - 1: print("did not find solution -- reached itermax!") break return bscl
def run_grtrans_image(fname, fpositron=FPOSITRON, pegasratio=PEGASRATIO, betaeconst=BETAECONST, betaecrit=BETAECRIT, bscl=BSCL, gmin=GAMMAMIN, gmax=GAMMAMAX, pnth=PNTH): """ run grtrans single image""" print("Run image, bscl=%.2f" % bscl) size = 0.5 * FOV uout = 1. / (DEPTH * size) # pressure scale is fixed! pscl = (bscl**2) / (8 * np.pi) # TO TURN OFF FARADAY CONVERSTION epcoefindx = [1, 1, 1, 1, 1, 1, 1] #epcoefindx=[1,1,1,1,0,1,1] x = gr.grtrans() x.write_grtrans_inputs(fname + '_im.in', oname=fname + '_im.out', fname='RRJET', phi0=0., pegasratio=pegasratio, betaeconst=betaeconst, betaecrit=betaecrit, ximax=XIMAX, bscl=bscl, pscl=pscl, nfreq=1, fmin=RFGHZ * 1.e9, fmax=RFGHZ * 1.e9, gmin=gmin, gmax=gmax, p2=pnth, p1=pnth, fpositron=fpositron, epcoefindx=epcoefindx, ename='POLSYNCHPL', nvals=4, spin=A, standard=1, uout=uout, mbh=MBH, nmu=1, mumin=mu, mumax=mu, gridvals=[-size, size, -size, size], nn=[NPIX, NPIX, NGEO], hindf=1, hnt=1, muval=1.) # run grtrans if RERUN: x.run_grtrans() # load image data x.read_grtrans_output() # pixel sizes #da = x.ab[x.nx,0]-x.ab[0,0] da = x.ab[x.ny, 0] - x.ab[0, 0] ##TODO -- is this right ordering? db = x.ab[1, 1] - x.ab[0, 1] if (da != db): raise Exception("pixel da!=db") psize = da * (cmperrg / bhdist) #image values ivals = x.ivals[:, 0, 0] * LumFac * da * db * LumtoJy qvals = x.ivals[:, 1, 0] * LumFac * da * db * LumtoJy uvals = x.ivals[:, 2, 0] * LumFac * da * db * LumtoJy vvals = x.ivals[:, 3, 0] * LumFac * da * db * LumtoJy # mask pixels with I < 0 imask = ivals < 0. ivals[imask] = 0. qvals[imask] = 0. uvals[imask] = 0. vvals[imask] = 0. # correct orientation for eht-imaging ivals = (np.flipud(np.transpose(ivals.reshape((NPIX, NPIX))))).flatten() qvals = -(np.flipud(np.transpose(qvals.reshape((NPIX, NPIX))))).flatten() uvals = -(np.flipud(np.transpose(uvals.reshape((NPIX, NPIX))))).flatten() vvals = (np.flipud(np.transpose(vvals.reshape((NPIX, NPIX))))).flatten() imdata = (ivals, qvals, uvals, vvals, psize) # Rotate the image if ROTANG != 0: imdata = rotateimdata(imdata, ROTANG, interp='cubic') # save image if SAVEOUT: save_im_fits(imdata, fname + ('_%.0f.fits' % RFGHZ), freq_ghz=RFGHZ) # display images if DISPLAYOUT: #tmax=5.e10 #pmax=2.e10 tmax = np.max(ivals * 3.254e13 / ((RFGHZ * 1.e9)**2 * psize**2)) pmax = np.max( np.sqrt(qvals**2 + uvals**2) * 3.254e13 / ((RFGHZ * 1.e9)**2 * psize**2)) display_grtrans_image(imdata, tmax=tmax, pmax=pmax)
#Factor of 4 speedup from before #When using, look at the power law dependence of the flux on mdot or whatever, and use appropriately. #note iterator can be turned off by finding 33 + tries and replacing with -1 + tries import sys import os from local import putdir #this line is if you have a file local.py with directory information. only putdir is needed, to tell the iterator where to save files. import grtrans_batch as gr from pgrtrans import pgrtrans import numpy as n x = gr.grtrans() mecc = 5.92989e9 mastervalue = 3.4 #the value you are trying to match #edit this function to define what constitutes a good enough fit def isgoodenough(errors): three = len(n.where(errors < .01)[0]) > 3 two = len(n.where(errors < .001)[0]) > 2 one = len(n.where(errors < .0001)[0]) > 1 return (three or two or one) #least squares polynomial fit, avoids importing scipy... def jgpoly(x,y,degree): array = n.zeros([len(x),degree])
def main(): # run grtrans image x=gr.grtrans() x.write_grtrans_inputs(name+'.in', oname=name+'.out', fname='RRJET',phi0=0., betaeconst=BETAECONST, ximax=10., nfreq=1,fmin=RF,fmax=RF, gmin=10., gmax=1.e35, p2=pp, p1=pp, #ename='SYNCHPL', ename='POLSYNCHPL', nvals=4, fpositron=FPOSITRON, spin=0., standard=1, uout=uout, mbh=MBH, epcoefindx=[1,1,1,1,1,1,1], #epcoefindx=[1,1,1,1,0,0,0], mdotmin=1.57e15,mdotmax=1.57e15,nmdot=1, nmu=1,mumin=mu,mumax=mu, gridvals=[-size,size,-size,size], nn=[npix,npix,ngeo], hindf=1,hnt=1, muval=1.) if RERUN: x.run_grtrans() # load image x.read_grtrans_output() x.convert_to_Jy(DTOBH) save_grtrans_image(x) # run grtrans spectrum x2=gr.grtrans() x2.write_grtrans_inputs(name+'_spec.in', oname=name+'_spec.out', fname='RRJET',phi0=0., betaeconst=BETAECONST, ximax=10., nfreq=NFREQ,fmin=FREQLO,fmax=FREQHI, gmin=10., gmax=1.e35, p2=pp, p1=pp, fpositron=FPOSITRON, ename='SYNCHPL', nvals=1, spin=0.,standard=1, uout=uout, mbh=MBH, epcoefindx=[1,1,1,1,1,1,1], #epcoefindx=[1,1,1,1,0,0,0], mdotmin=1.57e15,mdotmax=1.57e15,nmdot=1, nmu=1,mumin=mu,mumax=mu, gridvals=[-size,size,-size,size], nn=[64,64,ngeo], hindf=1,hnt=1, muval=1.) if RERUN: x2.run_grtrans() # load spectrum x2.read_grtrans_output() x2.calc_freqs(NFREQ) x2.convert_to_lum() display_grtrans_image(x,grt_obj2=x2)
def run_unit_tests(grtrans_dir='', compile=0): failed = [] nfailed = 0 if compile == 1: # compile grtrans library os.system('make all') if grtrans_dir == '': grtrans_dir = os.getcwd() # kerr tests: parallel transport of pol, consistency check between two pol methods angtol = 1e-2 dottol = 1e-6 x = gr.grtrans() # write appropriate inputs for comparison to geokerr x.write_grtrans_inputs('inputs.in', fname='THINDISK', nfreq=25, nmu=1, fmin=2.41e16, fmax=6.31e18, ename='BBPOL', nvals=4, spin=0.9, standard=2, nn=[100, 100, 1], uout=0.01, mbh=10, mumin=.26, mumax=.26, gridvals=[-21, 21, -21, 21]) os.system('rm unit_test_kerr.out') os.system('gfortran test_kerr.f90 -L' + grtrans_dir + ' -lgrtrans') os.system('./a.out') maxang, maxangdiff, kdotk, kdota, perpk = np.loadtxt('unit_test_kerr.out') if maxang > angtol or maxangdiff > dottol or kdotk > dottol or kdota > dottol or perpk > dottol: print 'Error in kerr unit test!' failed.append('kerr') nfailed += 1 # geodesics unit tests: k^\mu ?= dx^\mu / d\lambda # fluid unit tests fluid_tests = ['hotspot', 'harm', 'ffjet'] ubtol = [1e-4, 1e-2, 1e-1, 0.4] utol = [1e-4, 1e-2, 1e-1, 0.4] for i in range(len(fluid_tests)): print 'i: ', i, range(len(fluid_tests)), fluid_tests[i] os.system('rm unit_test_' + fluid_tests[i] + '.out') os.system('cp ' + fluid_tests[i] + '.in.dist ' + fluid_tests[i] + '.in') os.system('gfortran test_' + fluid_tests[i] + '.f90 -L' + grtrans_dir + ' -lgrtrans') os.system('./a.out') minn, maxnorm, maxub = np.loadtxt('unit_test_' + fluid_tests[i] + '.out') print 'vals: ', minn, maxnorm, maxub if maxnorm > utol[i] or maxub > ubtol[i] or minn < 0: print 'Error in ' + fluid_tests[i] + ' unit test!' failed.append(fluid_tests[i]) nfailed += 1 # integration tests if nfailed == 0: print 'Passed all unit tests!' else: print 'Failed tests: ', failed print 'Exiting unit tests' return nfailed, failed
def main(): name = './test_hdf5' # skip over if output already exists, or delete and rerun # write input radiative transfer parameters mu = np.cos(ang * np.pi / 180.) freq = freq_ghz * 1.e9 uout = 1. / RAYTRACESIZE x = gr.grtrans() npol = 1 x.write_grtrans_inputs( name + '.in', oname=name + '.out', fscalefac=RESCALE, sigcut=sigma_cut, fname='KORALH5', phi0=0., nfreq=1, fmin=freq, fmax=freq, ename='SYNCHTHAV', nvals=npol, gmin= -3, # confusingly, this is rhigh. #-2-->vladimir model, -3--> michael model spin=SPIN, standard=1, uout=uout, mbh=MBH, mdotmin=1., mdotmax=1., nmdot=1, #mdotmin=1.57e15,mdotmax=1.57e15,nmdot=1, nmu=1, mumin=mu, mumax=mu, gridvals=[-size, size, -size, size], nn=[NPIX_IM, NPIX_IM, NGEO], hhfile=hfile, hdfile=dfile, hindf=1, hnt=1, muval=1.) run = True if os.path.exists(name + '.out'): run = False if RERUN: run = True os.remove(name + '.out') # run grtrans if run: x.run_grtrans() # Read grtrans output try: x.read_grtrans_output() except: # IOError: return None # pixel sizes da = x.ab[x.nx, 0] - x.ab[0, 0] db = x.ab[1, 1] - x.ab[0, 1] if (da != db): raise Exception("pixel da!=db") psize = da * (lbh / DTOBH) #image values if npol == 4: ivals = x.ivals[:, 0, 0] * fac * da * db * LumtoJy qvals = x.ivals[:, 1, 0] * fac * da * db * LumtoJy uvals = x.ivals[:, 2, 0] * fac * da * db * LumtoJy vvals = x.ivals[:, 3, 0] * fac * da * db * LumtoJy # mask nan failure points with zeros ivals = np.array(ivals) qvals = np.array(qvals) uvals = np.array(uvals) vvals = np.array(vvals) imask = np.isnan(ivals) qumask = ~(~imask * ~np.isnan(qvals) * ~np.isnan(uvals)) vmask = ~(~imask * ~np.isnan(vvals)) ivals[imask] = 0. qvals[qumask] = 0. uvals[qumask] = 0. vvals[vmask] = 0. ivals = (np.flipud(np.transpose(ivals.reshape( (NPIX_IM, NPIX_IM))))).flatten() qvals = -(np.flipud(np.transpose(qvals.reshape( (NPIX_IM, NPIX_IM))))).flatten() uvals = -(np.flipud(np.transpose(uvals.reshape( (NPIX_IM, NPIX_IM))))).flatten() vvals = (np.flipud(np.transpose(vvals.reshape( (NPIX_IM, NPIX_IM))))).flatten() else: ivals = x.ivals[:, 0, 0] * fac * da * db * LumtoJy ivals = np.array(ivals) imask = np.isnan(ivals) ivals[imask] = 0. ivals = (np.flipud(np.transpose(ivals.reshape( (NPIX_IM, NPIX_IM))))).flatten() qvals = uvals = vvals = 0 * ivals print('total flux', np.sum(ivals)) save_im_fits((ivals, qvals, uvals, vvals, psize)) return
def run_test_problems(save=0,pgrtrans=0,nosphacc=0,compile=0): # run grtrans test problems tol=1e-2; failed=[]; xlist=[] xlist.append(gr.grtrans()) if compile > 0: if pgrtrans==0: xlist[-1].compile_grtrans() else: xlist[-1].compile_pgrtrans() passed=0; max_passed=0 if nosphacc <= 0: # sphacc # xlist[-1].write_grtrans_inputs('inputs.in',fname='SPHACC',nfreq=15,nmu=1,fmin=2.41e10,fmax=6.31e14,ename='POLSYNCHTH',nvals=4,spin=0.,mbh=10.,standard=1,uout=.003,nn=[100,100,100") # New tests of 1d intensity profile & full spectrum 12/14/2012 xlist[-1].write_grtrans_inputs('inputs.in',fname='SPHACC',nfreq=25,nmu=1,fmin=1e8,fmax=1e15,ename='SYNCHTHAV',nvals=1,spin=0.,mbh=1.,standard=1,nn=[10000,1,100],gridvals=[0.,400.,0.,0.],uout=.0025,oname='sphacc_abs.out') if pgrtrans==0: xlist[-1].run_grtrans() xlist[-1].read_grtrans_output() else: xlist[-1].run_pgrtrans(fname='SPHACC',nfreq=25,nmu=1,fmin=1e8,fmax=1e15,ename='SYNCHTHAV',nvals=1,spin=0.,mbh=1.,standard=1,nn=[10000,1,100],gridvals=[0.,400.,0.,0.],uout=.0025,oname='sphacc_abs.out') xlist[-1].calc_spec_pgrtrans((np.shape(xlist[-1].ivals))[2]) if save==0: i = pickle.load(open('test_grtrans_sphacc_intensity.p','rb')) if pgrtrans==0: terr = np.sum(np.abs(xlist[-1].ivals[:,0,14]-i))/np.sum(np.abs(i)) else: terr = np.sum(np.abs(xlist[-1].ivals[0,:,14]-i))/np.sum(np.abs(i)) print 'terr: ',terr if terr < (10*tol): passed+=1 else: failed.append('sphacc intensity') max_passed+=1 i = pickle.load(open('test_grtrans_sphacc_spectrum.p','rb')) terr = np.sum(np.abs(xlist[-1].spec-i))/np.sum(np.abs(i)) print 'terr: ',terr if terr < (10*tol): passed+=1 else: failed.append('sphacc spectrum') max_passed+=1 else: pickle.dump(xlist[-1].ivals[:,0,14],open('test_grtrans_sphacc_intensity.p','wb')) pickle.dump(xlist[-1].spec,open('test_grtrans_sphacc_spectrum.p','wb')) # ffjet xlist.append(gr.grtrans()) if pgrtrans==0: xlist[-1].write_grtrans_inputs('inputs.in',fname='FFJET',jdfile='m87bl09rfp10xi5a998fluidvars.bin',nfreq=1,nmu=1,fmin=3.45e11,fmax=3.45e11,ename='POLSYNCHPL',nvals=4,spin=0.998,standard=1,nn=[100,100,400],uout=0.01,mbh=3.4e9, mumin=.906,mumax=.906,gridvals=[-40,20,-20,40]) xlist[-1].run_grtrans() xlist[-1].read_grtrans_output() else: xlist[-1].run_pgrtrans(fname='FFJET',fdfile='m87bl09rfp10xi5a998fluidvars.bin',nfreq=1,nmu=1,fmin=3.45e11,fmax=3.45e11,ename='POLSYNCHPL',nvals=4,spin=0.998,standard=1,nn=[100,100,400],uout=0.01,mbh=3.4e9, mumin=.906,mumax=.906,gridvals=[-40,20,-20,40]) xlist[-1].calc_spec_pgrtrans((np.shape(xlist[-1].ivals))[2]) if save==0: i = pickle.load(open('test_grtrans_ffjet.p','rb')) if pgrtrans==0: terr = np.sum(np.abs(xlist[-1].ivals-i))/np.sum(np.abs(i)) else: terr = np.sum(np.abs(xlist[-1].ivals.transpose([1,0,2])-i))/np.sum(np.abs(i)) print 'terr: ',terr if terr < tol: passed+=1 else: failed.append('ffjet') max_passed+=1 else: pickle.dump(xlist[-1].ivals,open('test_grtrans_ffjet.p','wb')) # ffjet with delo integrator x2=gr.grtrans() if pgrtrans==0: x2.write_grtrans_inputs('inputs.in',fname='FFJET',jdfile='m87bl09rfp10xi5a998fluidvars.bin',nfreq=1,nmu=1,fmin=3.45e11,fmax=3.45e11,ename='POLSYNCHPL',nvals=4,spin=0.998,standard=1,nn=[100,100,1600],uout=0.01,mbh=3.4e9, mumin=.906,mumax=.906,gridvals=[-40,20,-20,40],iname='delo') x2.run_grtrans() x2.read_grtrans_output() else: x2.run_pgrtrans(fname='FFJET',fdfile='m87bl09rfp10xi5a998fluidvars.bin',nfreq=1,nmu=1,fmin=3.45e11,fmax=3.45e11,ename='POLSYNCHPL',nvals=4,spin=0.998,standard=1,nn=[100,100,1600],uout=0.01,mbh=3.4e9, mumin=.906,mumax=.906,gridvals=[-40,20,-20,40],iname='delo') x2.calc_spec_pgrtrans((np.shape(x2.ivals))[2]) terr=10. terr = np.max(np.abs(x2.spec - xlist[-1].spec)/xlist[-1].spec) print 'terr: ',terr if terr < 0.05: passed += 1 else: failed.append('delo') max_passed+=1 # ffjet with formal rad trans solution from Degl'Innocenti (1985): x3=gr.grtrans() if pgrtrans==0: x3.write_grtrans_inputs('inputs.in',fname='FFJET',jdfile='m87bl09rfp10xi5a998fluidvars.bin',nfreq=1,nmu=1,fmin=3.45e11,fmax=3.45e11,ename='POLSYNCHPL',nvals=4,spin=0.998,standard=1,nn=[100,100,1600],uout=0.01,mbh=3.4e9, mumin=.906,mumax=.906,gridvals=[-40,20,-20,40],iname='formal') x3.run_grtrans() x3.read_grtrans_output() else: x3.run_pgrtrans(fname='FFJET',fdfile='m87bl09rfp10xi5a998fluidvars.bin',nfreq=1,nmu=1,fmin=3.45e11,fmax=3.45e11,ename='POLSYNCHPL',nvals=4,spin=0.998,standard=1,nn=[100,100,1600],uout=0.01,mbh=3.4e9, mumin=.906,mumax=.906,gridvals=[-40,20,-20,40],iname='formal') x3.calc_spec_pgrtrans((np.shape(x3.ivals))[2]) terr=10. terr = np.max(np.abs(x3.spec - xlist[-1].spec)/xlist[-1].spec) print 'terr: ',terr if terr < 0.05: passed += 1 else: failed.append('formal') max_passed+=1 x2=0; x3=0 # thindisk xlist.append(gr.grtrans()) xlist[-1].write_grtrans_inputs('inputs.in',fname='THINDISK',nfreq=25,nmu=1,fmin=2.41e16,fmax=6.31e18,ename='BBPOL',nvals=4,spin=0.9,standard=2,nn=[100,100,1],uout=0.01,mbh=10, mumin=.26,mumax=.26,gridvals=[-21,21,-21,21]) if pgrtrans==0: xlist[-1].run_grtrans() xlist[-1].read_grtrans_output() else: xlist[-1].run_pgrtrans(fname='THINDISK',nfreq=25,nmu=1,fmin=2.41e16,fmax=6.31e18,ename='BBPOL',nvals=4,spin=0.9,standard=2,nn=[100,100,1],uout=0.01,mbh=10, mumin=.26,mumax=.26,gridvals=[-21,21,-21,21]) xlist[-1].calc_spec_pgrtrans((np.shape(xlist[-1].ivals))[2]) if save==0: i = pickle.load(open('test_grtrans_thindisk.p','rb')) if pgrtrans==0: terr = np.sum(np.abs(xlist[-1].ivals-i))/np.sum(np.abs(i)) else: terr = np.sum(np.abs(xlist[-1].ivals.transpose([1,0,2])-i))/np.sum(np.abs(i)) print 'terr: ',terr if terr < tol: passed+=1 else: failed.append('thindisk') max_passed+=1 else: pickle.dump(xlist[-1].ivals,open('test_grtrans_thindisk.p','wb')) # total I w/, w/o pol xlist.append(gr.grtrans()) xlist[-1].write_grtrans_inputs('inputs.in',fname='FFJET',jdfile='m87bl09rfp10xi5a998fluidvars.bin',nfreq=1,nmu=1,fmin=3.45e11,fmax=3.45e11,ename='SYNCHPL',nvals=1,spin=0.998,standard=1,nn=[100,100,400],uout=0.01,mbh=3.4e9, mumin=.906,mumax=.906,gridvals=[-40,20,-20,40]) if pgrtrans==0: xlist[-1].run_grtrans() xlist[-1].read_grtrans_output() else: xlist[-1].run_pgrtrans(fname='FFJET',fdfile='m87bl09rfp10xi5a998fluidvars.bin',nfreq=1,nmu=1,fmin=3.45e11,fmax=3.45e11,ename='SYNCHPL',nvals=1,spin=0.998,standard=1,nn=[100,100,400],uout=0.01,mbh=3.4e9, mumin=.906,mumax=.906,gridvals=[-40,20,-20,40]) xlist[-1].calc_spec_pgrtrans((np.shape(xlist[-1].ivals))[2]) if save==0: i = pickle.load(open('test_grtrans_ffjet.p','rb')) if pgrtrans == 0: terr = np.sum(np.abs(xlist[-1].ivals[:,0,0]-i[:,0,0]))/np.sum(abs(i[:,0,0])) else: terr = np.sum(np.abs(xlist[-1].ivals[0,:,0]-i[:,0,0]))/np.sum(abs(i[:,0,0])) print 'terr: ',terr if terr < tol: passed+=1 else: failed.append('polunpol') max_passed+=1 # harm xlist.append(gr.grtrans()) xlist[-1].write_grtrans_inputs('inputs.in',fname='HARM',nfreq=1,nmu=1,fmin=2.3e11,fmax=2.3e11,ename='POLSYNCHTH',nvals=1,spin=0.9375,standard=1,nn=[150,150,400],uout=0.04,mbh=4e6, mdotmin=1.57e15,mdotmax=1.57e15,nmdot=1,mumin=.6428,mumax=.6428,gridvals=[-13,13,-13,13],hhfile='dump040',hdfile='dump',hindf=40,hnt=1,muval=1./4.) if pgrtrans==0: xlist[-1].run_grtrans() xlist[-1].read_grtrans_output() else: xlist[-1].run_pgrtrans(fname='HARM',nfreq=1,nmu=1,fmin=2.3e11,fmax=2.3e11,ename='POLSYNCHTH',nvals=1,spin=0.9375,standard=1,nn=[150,150,400],uout=0.04,mbh=4e6, mdotmin=1.57e15,mdotmax=1.57e15,nmdot=1,mumin=.6428,mumax=.6428,gridvals=[-13.,13.,-13.,13.],fhfile='dump040',fdfile='dump',findf=40,fnt=1,muval=1./4.) xlist[-1].calc_spec_pgrtrans((np.shape(xlist[-1].ivals))[2]) if save==0: i = pickle.load(open('test_grtrans_harm.p','rb')) xlist[-1].ivals = np.where(xlist[-1].ivals==xlist[-1].ivals,xlist[-1].ivals,np.zeros(np.shape(xlist[-1].ivals))) i = np.where(i==i,i,np.zeros(np.shape(i))) if pgrtrans==0: terr = np.sum(np.abs(xlist[-1].ivals[:,0,0]-i[:,0,0]))/np.sum(abs(i[:,0,0])) else: terr = np.sum(np.abs(xlist[-1].ivals[0,:,0]-i[:,0,0]))/np.sum(abs(i[:,0,0])) print 'terr: ',terr if terr < tol: passed+=1 else: failed.append('harm') max_passed+=1 else: pickle.dump(xlist[-1].ivals,open('test_grtrans_harm.p','wb')) xlist.append(gr.grtrans()) xlist[-1].write_grtrans_inputs('inputs.in',fname='POWERLAW',nfreq=1,nmu=1,fmin=3.45e11,fmax=3.45e11,ename='POLSYNCHTH',nvals=4,spin=0.,standard=1,nn=[200,200,1600],uout=0.00005,mbh=4e6, mumin=0.5,mumax=0.5,nrotype=1,gridvals=[1200.,4000.,0.,2.*np.pi],iname='lsoda',srin=3200.,srout=3300.,ntscl=5e11,sthin=-0.02,sthout=0.02,rcut=4000.,snscl=1e5,phi0=-0.5,sphiin=0.) if pgrtrans==0: xlist[-1].run_grtrans() xlist[-1].read_grtrans_output() else: xlist[-1].run_pgrtrans(fname='POWERLAW',nfreq=1,nmu=1,fmin=3.45e11,fmax=3.45e11,ename='POLSYNCHTH',nvals=4,spin=0.,standard=1,nn=[200,200,1600],uout=0.00005,mbh=4e6, mumin=0.5,mumax=0.5,nrotype=1,gridvals=[1200.,4000.,0.,2.*np.pi],iname='lsoda',srin=3200.,srout=3300.,ntscl=5e11,sthin=-0.02,sthout=0.02,rcut=4000.,snscl=1e5,phi0=-0.5,sphiin=0.) xlist[-1].calc_spec_pgrtrans((np.shape(xlist[-1].ivals))[2]) if save==0: i = pickle.load(open('test_toroidalfield.p','rb')) xlist[-1].ivals = np.where(xlist[-1].ivals==xlist[-1].ivals,xlist[-1].ivals,np.zeros(np.shape(xlist[-1].ivals))) i = np.where(i==i,i,np.zeros(np.shape(i))) # if pgrtrans==0: # terr = np.sum(np.abs(xlist[-1].ivals[:,0,0]-i[0,:,0]))/np.sum(abs(i[0,:,0])) # else: # terr = np.sum(np.abs(xlist[-1].ivals[0,:,0]-i[0,:,0]))/np.sum(abs(i[0,:,0])) if pgrtrans==0: terr = np.sum(np.abs(xlist[-1].ivals-i))/np.sum(np.abs(i)) else: terr = np.sum(np.abs(xlist[-1].ivals.transpose([1,0,2])-i))/np.sum(np.abs(i)) print 'terr: ',terr if terr < tol: passed+=1 else: failed.append('toroidal') max_passed+=1 else: pickle.dump(xlist[-1].ivals,open('test_toroidalfield.p','wb')) print 'tests total: ', max_passed print 'tests passed: ', passed print 'tests failed: ',failed return passed, max_passed, failed, xlist