Esempio n. 1
0
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)
Esempio n. 2
0
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)
Esempio n. 3
0
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
Esempio n. 4
0
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
Esempio n. 5
0
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)
Esempio n. 6
0
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
Esempio n. 7
0
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)
Esempio n. 8
0
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)
Esempio n. 9
0
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
Esempio n. 10
0
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)
Esempio n. 11
0
#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])
Esempio n. 12
0
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)
Esempio n. 13
0
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
Esempio n. 14
0
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