Exemplo n.º 1
0
def xs(Nc, Nline=10000):
    nu0 = 2000.0
    nu1 = 2100.0
    nus = np.logspace(np.log10(nu0), np.log10(nu1), 10000, dtype=np.float64)
    nu_lines = np.random.rand(Nline)*(nu1-nu0)+nu0
    nsigmaD = 1.0
    gammaL = np.random.rand(Nline)+0.1

    cnu, indexnu, R, pmarray = initspec.init_modit(nu_lines, nus)
    ngammaL = gammaL/(nu_lines/R)
    ngammaL_grid = set_ditgrid(ngammaL, res=0.1)
    S = jnp.array(np.random.normal(size=Nline))

    ts = time.time()
    a = []
    for i in range(0, Nc):
        tsx = time.time()
        xsv = xsvector(cnu, indexnu, R, pmarray, nsigmaD,
                       ngammaL, S, nus, ngammaL_grid)
        xsv.block_until_ready()
        tex = time.time()
        a.append(tex-tsx)
    te = time.time()
    a = np.array(a)
    print(Nline, ',', np.mean(a[1:]), ',', np.std(a[1:]))

    return (te-ts)/Nc
Exemplo n.º 2
0
def comperr(Nnu, plotfig=False):

    nus = np.logspace(np.log10(1.e7 / 2700),
                      np.log10(1.e7 / 2100.),
                      Nnu,
                      dtype=np.float64)

    #    nus=np.logspace(np.log10(3000),np.log10(6000.0),Nnu,dtype=np.float64)
    mdbCO = moldb.MdbHit('/home/kawahara/exojax/data/CO/05_hit12.par', nus)

    Mmol = 28.010446441149536
    Tref = 296.0
    Tfix = 1000.0
    Pfix = 1.e-3  #

    #USE TIPS partition function
    Q296=np.array([107.25937215917970,224.38496958496091,112.61710362499998,\
                   660.22969049609367,236.14433662109374,1382.8672147421873])
    Q1000=np.array([382.19096582031250,802.30952197265628,402.80326733398437,\
                    2357.1041210937501,847.84866308593757,4928.7215078125000])
    qr = Q1000 / Q296

    qt = np.ones_like(mdbCO.isoid, dtype=np.float64)
    for idx, iso in enumerate(mdbCO.uniqiso):
        mask = mdbCO.isoid == iso
        qt[mask] = qr[idx]

    Sij = SijT(Tfix, mdbCO.logsij0, mdbCO.nu_lines, mdbCO.elower, qt)
    gammaL = gamma_hitran(Pfix, Tfix, Pfix, mdbCO.n_air, mdbCO.gamma_air,
                          mdbCO.gamma_self)
    #+ gamma_natural(A) #uncomment if you inclide a natural width
    sigmaD = doppler_sigma(mdbCO.nu_lines, Tfix, Mmol)

    cnu, indexnu, R, dq = initspec.init_modit(mdbCO.nu_lines, nus)
    nsigmaD = normalized_doppler_sigma(Tfix, Mmol, R)
    ngammaL = gammaL / (mdbCO.nu_lines / R)
    ngammaL_grid = set_ditgrid(ngammaL)

    xs_modit_lp = modit_xsvector(cnu, indexnu, R, dq, nsigmaD, ngammaL, Sij,
                                 nus, ngammaL_grid)
    wls_modit = 100000000 / nus

    #ref (direct)
    d = 10000
    ll = mdbCO.nu_lines
    xsv_lpf_lp = lpf_xsection(nus, ll, sigmaD, gammaL, Sij, memory_size=30)

    dif = xs_modit_lp / xsv_lpf_lp - 1.
    med = np.median(dif)
    iju = 22940.
    ijd = 26400.
    limu, limd = np.searchsorted(wls_modit[::-1], [iju, ijd])
    std = np.std(dif[::-1][limu:limd])

    return med, std, R, ijd, iju, wls_modit, xs_modit_lp, xsv_lpf_lp, dif
Exemplo n.º 3
0
def xs(Nline):
    nu0 = 2000.0
    nu1 = 2100.0
    nus = np.logspace(np.log10(nu0), np.log10(nu1), 10000, dtype=np.float64)
    nu_lines = np.random.rand(Nline) * (nu1 - nu0) + nu0
    nsigmaD = 1.0
    gammaL = np.random.rand(Nline) + 0.1
    cnu, indexnu, R, pmarray = initspec.init_modit(nu_lines, nus)
    ngammaL = gammaL / (nu_lines / R)
    ngammaL_grid = set_ditgrid(ngammaL, res=0.1)
    S = jnp.array(np.random.normal(size=Nline))
    xsv = xsvector(cnu, indexnu, R, pmarray, nsigmaD, ngammaL, S, nus,
                   ngammaL_grid)
    xsv.block_until_ready()
    return True
Exemplo n.º 4
0
def test_VALD_MODIT():

    #wavelength range
    wls, wll = 10395, 10405

    #Set a model atmospheric layers, wavenumber range for the model, an instrument
    NP = 100
    Parr, dParr, k = pressure_layer(NP=NP)
    Pref = 1.0  #bar
    ONEARR = np.ones_like(Parr)

    Nx = 2000
    nus, wav, res = nugrid(wls - 5.0, wll + 5.0, Nx, unit="AA", xsmode="modit")

    Rinst = 100000.  #instrumental spectral resolution
    beta_inst = R2STD(
        Rinst)  #equivalent to beta=c/(2.0*np.sqrt(2.0*np.log(2.0))*R)

    #atoms and ions from VALD
    adbV = moldb.AdbVald(
        path_ValdLineList, nus, crit=1e-100
    )  #The crit is defined just in case some weak lines may cause an error that results in a gamma of 0... (220219)
    asdb = moldb.AdbSepVald(adbV)

    #molecules from exomol
    mdbH2O = moldb.MdbExomol('.database/H2O/1H2-16O/POKAZATEL',
                             nus,
                             crit=1e-50)  #,crit = 1e-40)
    mdbTiO = moldb.MdbExomol('.database/TiO/48Ti-16O/Toto', nus,
                             crit=1e-50)  #,crit = 1e-50)
    mdbOH = moldb.MdbExomol('.database/OH/16O-1H/MoLLIST', nus)
    mdbFeH = moldb.MdbExomol('.database/FeH/56Fe-1H/MoLLIST', nus)

    #CIA
    cdbH2H2 = contdb.CdbCIA('.database/H2-H2_2011.cia', nus)

    #molecular mass
    molmassH2O = molinfo.molmass("H2O")
    molmassTiO = molinfo.molmass("TiO")
    molmassOH = molinfo.molmass("OH")
    molmassFeH = molinfo.molmass("FeH")
    molmassH = molinfo.molmass("H")
    molmassH2 = molinfo.molmass("H2")

    #Initialization of MODIT (for separate VALD species, and exomol molecules(e.g., FeH))
    cnuS, indexnuS, R, pmarray = initspec.init_modit_vald(
        asdb.nu_lines, nus, asdb.N_usp)
    cnu_FeH, indexnu_FeH, R, pmarray = initspec.init_modit(
        mdbFeH.nu_lines, nus)
    cnu_H2O, indexnu_H2O, R, pmarray = initspec.init_modit(
        mdbH2O.nu_lines, nus)
    cnu_OH, indexnu_OH, R, pmarray = initspec.init_modit(mdbOH.nu_lines, nus)
    cnu_TiO, indexnu_TiO, R, pmarray = initspec.init_modit(
        mdbTiO.nu_lines, nus)

    #sampling the max/min of temperature profiles
    fT = lambda T0, alpha: T0[:, None] * (Parr[None, :] / Pref)**alpha[:, None]
    T0_test = np.array([1500.0, 4000.0, 1500.0, 4000.0])
    alpha_test = np.array([0.2, 0.2, 0.05, 0.05])
    res = 0.2

    #Assume typical atmosphere
    H_He_HH_VMR_ref = [0.1, 0.15, 0.75]
    PH_ref = Parr * H_He_HH_VMR_ref[0]
    PHe_ref = Parr * H_He_HH_VMR_ref[1]
    PHH_ref = Parr * H_He_HH_VMR_ref[2]

    #Precomputing dgm_ngammaL
    dgm_ngammaL_VALD = setdgm_vald_all(asdb, PH_ref, PHe_ref, PHH_ref, R, fT,
                                       res, T0_test, alpha_test)
    dgm_ngammaL_FeH = setdgm_exomol(mdbFeH, fT, Parr, R, molmassFeH, res,
                                    T0_test, alpha_test)
    dgm_ngammaL_H2O = setdgm_exomol(mdbH2O, fT, Parr, R, molmassH2O, res,
                                    T0_test, alpha_test)
    dgm_ngammaL_OH = setdgm_exomol(mdbOH, fT, Parr, R, molmassOH, res, T0_test,
                                   alpha_test)
    dgm_ngammaL_TiO = setdgm_exomol(mdbTiO, fT, Parr, R, molmassTiO, res,
                                    T0_test, alpha_test)

    T0 = 3000.
    alpha = 0.07
    Mp = 0.155 * 1.99e33 / 1.90e30
    Rp = 0.186 * 6.96e10 / 6.99e9
    u1 = 0.0
    u2 = 0.0
    RV = 0.00
    vsini = 2.0

    mmw = 2.33 * ONEARR  #mean molecular weight
    log_e_H = -4.2
    VMR_H = 0.09
    VMR_H2 = 0.77
    VMR_FeH = 10**-8
    VMR_H2O = 10**-4
    VMR_OH = 10**-4
    VMR_TiO = 10**-8
    A_Fe = 1.5
    A_Ti = 1.2

    adjust_continuum = 0.99

    ga = 2478.57730044555 * Mp / Rp**2
    Tarr = T0 * (Parr / Pref)**alpha
    PH = Parr * VMR_H
    PHe = Parr * (1 - VMR_H - VMR_H2)
    PHH = Parr * VMR_H2
    VMR_e = VMR_H * 10**log_e_H

    #VMR of atoms and ions (+Abundance modification)
    mods_ID = jnp.array([[26, 1], [22, 1]])
    mods = jnp.array([A_Fe, A_Ti])
    VMR_uspecies = atomll.get_VMR_uspecies(asdb.uspecies, mods_ID, mods)
    VMR_uspecies = VMR_uspecies[:, None] * ONEARR

    #Compute delta tau

    #Atom & ions (VALD)
    SijMS, ngammaLMS, nsigmaDlS = vald_all(asdb, Tarr, PH, PHe, PHH, R)
    xsmS = xsmatrix_vald(cnuS, indexnuS, R, pmarray, nsigmaDlS, ngammaLMS,
                         SijMS, nus, dgm_ngammaL_VALD)
    dtauatom = dtauVALD(dParr, xsmS, VMR_uspecies, mmw, ga)

    #FeH
    SijM_FeH, ngammaLM_FeH, nsigmaDl_FeH = exomol(mdbFeH, Tarr, Parr, R,
                                                  molmassFeH)
    xsm_FeH = xsmatrix(cnu_FeH, indexnu_FeH, R, pmarray, nsigmaDl_FeH,
                       ngammaLM_FeH, SijM_FeH, nus, dgm_ngammaL_FeH)
    dtaum_FeH = dtauM_mmwl(dParr, jnp.abs(xsm_FeH), VMR_FeH * ONEARR, mmw, ga)

    #H2O
    SijM_H2O, ngammaLM_H2O, nsigmaDl_H2O = exomol(mdbH2O, Tarr, Parr, R,
                                                  molmassH2O)
    xsm_H2O = xsmatrix(cnu_H2O, indexnu_H2O, R, pmarray, nsigmaDl_H2O,
                       ngammaLM_H2O, SijM_H2O, nus, dgm_ngammaL_H2O)
    dtaum_H2O = dtauM_mmwl(dParr, jnp.abs(xsm_H2O), VMR_H2O * ONEARR, mmw, ga)

    #OH
    SijM_OH, ngammaLM_OH, nsigmaDl_OH = exomol(mdbOH, Tarr, Parr, R, molmassOH)
    xsm_OH = xsmatrix(cnu_OH, indexnu_OH, R, pmarray, nsigmaDl_OH, ngammaLM_OH,
                      SijM_OH, nus, dgm_ngammaL_OH)
    dtaum_OH = dtauM_mmwl(dParr, jnp.abs(xsm_OH), VMR_OH * ONEARR, mmw, ga)

    #TiO
    SijM_TiO, ngammaLM_TiO, nsigmaDl_TiO = exomol(mdbTiO, Tarr, Parr, R,
                                                  molmassTiO)
    xsm_TiO = xsmatrix(cnu_TiO, indexnu_TiO, R, pmarray, nsigmaDl_TiO,
                       ngammaLM_TiO, SijM_TiO, nus, dgm_ngammaL_TiO)
    dtaum_TiO = dtauM_mmwl(dParr, jnp.abs(xsm_TiO), VMR_TiO * ONEARR, mmw, ga)

    #Hminus
    dtau_Hm = dtauHminus_mmwl(nus, Tarr, Parr, dParr, VMR_e * ONEARR,
                              VMR_H * ONEARR, mmw, ga)

    #CIA
    dtauc_H2H2 = dtauCIA_mmwl(nus, Tarr, Parr, dParr, VMR_H2 * ONEARR,
                              VMR_H2 * ONEARR, mmw, ga, cdbH2H2.nucia,
                              cdbH2H2.tcia, cdbH2H2.logac)

    #Summations
    dtau = dtauatom + dtaum_FeH + dtaum_H2O + dtaum_OH + dtaum_TiO + dtau_Hm + dtauc_H2H2

    sourcef = planck.piBarr(Tarr, nus)
    F0 = rtrun(dtau, sourcef)
    Frot = response.rigidrot(nus, F0, vsini, u1, u2)
    wavd = jnp.linspace(wls, wll, 500)
    nusd = jnp.array(1.e8 / wavd[::-1])
    mu = response.ipgauss_sampling(nusd, nus, Frot, beta_inst, RV)
    mu = mu / jnp.nanmax(mu) * adjust_continuum

    assert (np.all(~np.isnan(mu)) * \
            np.all(mu != 0) * \
            np.all(abs(mu) != np.inf))
Exemplo n.º 5
0
#
Mp = 33.2
mdbH2O = moldb.MdbExomol('.database/H2O/1H2-16O/POKAZATEL/', nus, crit=1.e-50)
mdbCO = moldb.MdbExomol('.database/CO/12C-16O/Li2015/', nus)
cdbH2H2 = contdb.CdbCIA('.database/H2-H2_2011.cia', nus)
print('N=', len(mdbH2O.nu_lines))

# Reference pressure for a T-P model
Pref = 1.0  # bar
ONEARR = np.ones_like(Parr)
ONEWAV = jnp.ones_like(nflux)

#

cnu_H2O, indexnu_H2O, R_H2O, pmarray_H2O = initspec.init_modit(
    mdbH2O.nu_lines, nus)
cnu_CO, indexnu_CO, R_CO, pmarray_CO = initspec.init_modit(mdbCO.nu_lines, nus)
R = R_CO
# Precomputing gdm_ngammaL


def fT(T0, alpha):
    return T0[:, None] * (Parr[None, :] / Pref)**alpha[:, None]


T0_test = np.array([1100.0, 1500.0, 1100.0, 1500.0])
alpha_test = np.array([0.2, 0.2, 0.05, 0.05])
res = 0.2
dgm_ngammaL_H2O = setdgm_exomol(mdbH2O, fT, Parr, R_H2O, molmassH2O, res,
                                T0_test, alpha_test)
dgm_ngammaL_CO = setdgm_exomol(mdbCO, fT, Parr, R_CO, molmassCO, res, T0_test,
Exemplo n.º 6
0
    2357.1041210937501, 847.84866308593757, 4928.7215078125000
])
qr = Q1000 / Q296

qt = np.ones_like(mdbCO.isoid, dtype=np.float64)
for idx, iso in enumerate(mdbCO.uniqiso):
    mask = mdbCO.isoid == iso
    qt[mask] = qr[idx]

Sij = SijT(Tfix, mdbCO.logsij0, mdbCO.nu_lines, mdbCO.elower, qt)
gammaL = gamma_hitran(Pfix, Tfix, Pfix, mdbCO.n_air, mdbCO.gamma_air,
                      mdbCO.gamma_self)
# + gamma_natural(A) #uncomment if you inclide a natural width
sigmaD = doppler_sigma(mdbCO.nu_lines, Tfix, Mmol)

cnu, indexnu, R, pmarray = initspec.init_modit(mdbCO.nu_lines, nus)
nsigmaD = normalized_doppler_sigma(Tfix, Mmol, R)
ngammaL = gammaL / (mdbCO.nu_lines / R)
ngammaL_grid = set_ditgrid(ngammaL)

xs_modit_lp = modit_xsvector(cnu, indexnu, R, pmarray, nsigmaD, ngammaL, Sij,
                             nus, ngammaL_grid)
wls_modit = 100000000 / nus

#ref (direct)
d = 10000
ll = mdbCO.nu_lines
xsv_lpf_lp = lpf_xsection(nus, ll, sigmaD, gammaL, Sij, memory_size=30)

config.update('jax_enable_x64', True)
Exemplo n.º 7
0
    def xsmatrix(self, Tarr, Parr):
        """cross section matrix.

        Args:
           Tarr: temperature layer (K)
           Parr: pressure layer (bar)

        Returns:
           cross section (cm2)
        """
        mdb = self.mdb
        if self.database == 'ExoMol':
            qt = vmap(mdb.qr_interp)(Tarr)
            gammaLMP = jit(vmap(gamma_exomol,
                                (0, 0, None, None)))(Parr, Tarr, mdb.n_Texp,
                                                     mdb.alpha_ref)
            gammaLMN = gamma_natural(mdb.A)
            gammaLM = gammaLMP + gammaLMN[None, :]
            self.molmass = mdb.molmass
            SijM = jit(vmap(SijT, (0, None, None, None, 0)))(Tarr, mdb.logsij0,
                                                             mdb.nu_lines,
                                                             mdb.elower, qt)

        elif self.database == 'HITRAN' or self.database == 'HITEMP':
            qt = mdb.Qr_layer(Tarr)
            gammaLM = jit(vmap(gamma_hitran, (0, 0, 0, None, None, None)))(Parr, Tarr, Parr, mdb.n_air, mdb.gamma_air, mdb.gamma_self)\
                + gamma_natural(mdb.A)
            self.molmass = molinfo.molmass(self.molecules)
            SijM = jit(vmap(SijT, (0, None, None, None, 0)))(Tarr, mdb.logsij0,
                                                             mdb.nu_lines,
                                                             mdb.elower, qt)

        print('# of lines', len(mdb.nu_lines))
        memory_size = 15.0
        d = int(memory_size / (len(mdb.nu_lines) * 4 / 1024. / 1024.)) + 1
        d2 = 100
        Nlayer, Nline = np.shape(SijM)
        if self.xsmode == 'auto':
            xsmode = self.select_xsmode(Nline)
        else:
            xsmode = self.xsmode
        print('xsmode=', xsmode)

        if xsmode == 'lpf' or xsmode == 'LPF':
            sigmaDM = jit(vmap(doppler_sigma,
                               (None, 0, None)))(mdb.nu_lines, Tarr,
                                                 self.molmass)
            Nj = int(Nline / d2)
            xsm = []
            for i in tqdm.tqdm(range(0, int(len(self.nus) / d) + 1)):
                s = int(i * d)
                e = int((i + 1) * d)
                e = min(e, len(self.nus))
                xsmtmp = np.zeros((Nlayer, e - s))
                for j in range(0, Nj + 1):
                    s2 = int(j * d2)
                    e2 = int((j + 1) * d2)
                    e2 = min(e2, Nline)
                    numatrix = make_numatrix0(self.nus[s:e],
                                              mdb.nu_lines[s2:e2])
                    xsmtmp = xsmtmp +\
                        lpf.xsmatrix(
                            numatrix, sigmaDM[:, s2:e2], gammaLM[:, s2:e2], SijM[:, s2:e2])
                if i == 0:
                    xsm = np.copy(xsmtmp.T)
                else:
                    xsm = np.concatenate([xsm, xsmtmp.T])
            xsm = xsm.T
        elif xsmode == 'modit' or xsmode == 'MODIT':
            cnu, indexnu, R_mol, pmarray = initspec.init_modit(
                mdb.nu_lines, self.nus)
            nsigmaDl = normalized_doppler_sigma(Tarr, self.molmass,
                                                R_mol)[:, np.newaxis]
            ngammaLM = gammaLM / (mdb.nu_lines / R_mol)
            dgm_ngammaL = modit.dgmatrix(ngammaLM, 0.1)
            xsm = modit.xsmatrix(cnu, indexnu, R_mol, pmarray, nsigmaDl,
                                 ngammaLM, SijM, self.nus, dgm_ngammaL)
            xsm = self.nonnegative_xsm(xsm)
        elif xsmode == 'dit' or xsmode == 'DIT':
            cnu, indexnu, pmarray = initspec.init_dit(mdb.nu_lines, self.nus)
            sigmaDM = jit(vmap(doppler_sigma,
                               (None, 0, None)))(mdb.nu_lines, Tarr,
                                                 self.molmass)
            dgm_sigmaD = dit.dgmatrix(sigmaDM, 0.1)
            dgm_gammaL = dit.dgmatrix(gammaLM, 0.2)
            xsm = dit.xsmatrix(cnu, indexnu, pmarray, sigmaDM, gammaLM, SijM,
                               self.nus, dgm_sigmaD, dgm_gammaL)
            xsm = self.nonnegative_xsm(xsm)
        else:
            print('No such xsmode=', xsmode)
            xsm = None

        return xsm
Exemplo n.º 8
0
    def xsection(self, T, P):
        """cross section.

        Args:
           T: temperature (K)
           P: pressure (bar)

        Returns:
           cross section (cm2)
        """

        mdb = self.mdb
        if self.database == 'ExoMol':
            gammaL = gamma_exomol(P, T, mdb.n_Texp,
                                  mdb.alpha_ref) + gamma_natural(mdb.A)
            molmass = mdb.molmass
        elif self.database == 'HITRAN' or self.database == 'HITEMP':
            gammaL = gamma_hitran(P, T, P, mdb.n_air, mdb.gamma_air,
                                  mdb.gamma_self) + gamma_natural(mdb.A)
            molmass = molinfo.molmass(self.molecules)

        Sij = self.linest(T)
        if self.xsmode == 'auto':
            xsmode = self.select_xsmode(len(mdb.nu_lines))
        else:
            xsmode = self.xsmode

        if xsmode == 'lpf' or xsmode == 'LPF':
            sigmaD = doppler_sigma(mdb.nu_lines, T, molmass)
            xsv = xsection(self.nus,
                           mdb.nu_lines,
                           sigmaD,
                           gammaL,
                           Sij,
                           memory_size=self.memory_size)
        elif xsmode == 'modit' or xsmode == 'MODIT':
            checknus = check_scale_nugrid(self.nus, gridmode='ESLOG')
            nus = self.autonus(checknus, 'ESLOG')
            cnu, indexnu, R_mol, pmarray = initspec.init_modit(
                mdb.nu_lines, nus)
            nsigmaD = normalized_doppler_sigma(T, molmass, R_mol)
            ngammaL = gammaL / (mdb.nu_lines / R_mol)
            ngammaL_grid = modit.ditgrid(ngammaL, res=0.1)
            xsv = modit.xsvector(cnu, indexnu, R_mol, pmarray, nsigmaD,
                                 ngammaL, Sij, nus, ngammaL_grid)
            if ~checknus and self.autogridconv:
                xsv = jnp.interp(self.nus, nus, xsv)
        elif xsmode == 'dit' or xsmode == 'DIT':
            sigmaD = doppler_sigma(mdb.nu_lines, T, molmass)
            checknus = check_scale_nugrid(self.nus, gridmode='ESLIN')
            nus = self.autonus(checknus, 'ESLIN')
            sigmaD_grid = dit.ditgrid(sigmaD, res=0.1)
            gammaL_grid = dit.ditgrid(gammaL, res=0.1)
            cnu, indexnu, pmarray = initspec.init_dit(mdb.nu_lines, nus)
            xsv = dit.xsvector(cnu, indexnu, pmarray, sigmaD, gammaL, Sij, nus,
                               sigmaD_grid, gammaL_grid)
            if ~checknus and self.autogridconv:
                xsv = jnp.interp(self.nus, nus, xsv)
        else:
            print('Error:', xsmode, ' is unavailable (auto/LPF/DIT).')
            xsv = None
        return xsv