ExoMol

Sep 5 (2021) Hajime Kawahara

See “Computing CO cross section using ExoMol (opacity calculator = LPF)” as the tutorial to compute a cross section profile using ExoMol.

Molecular Database

ExoMol provides molecular line database of various molecules and also from various sources. For instance, they provide multiple source of the line data of the carbon monoxide (CO). So, we need to specify which database you use.

exojax specifies the default database for each molecule. You can know by

>>> from exojax.spec import defmol
>>> defmol.search_molfile("ExoMol","12C-16O")
'CO/12C-16O/Li2015'

An example to use the ExoMol database from exojax is like that.

>>> from exojax.spec import moldb
>>> from exojax.utils.grids import wavenumber_grid
>>> nus,wav,res=nugrid(22880.,23000.,1000,unit="AA")
>>> mdbCO=moldb.MdbExomol('.database/CO/12C-16O/Li2015',nus)
Background atmosphere:  H2
Reading transition file
Broadening code level= a0
default broadening parameters are used for  71  J lower states in  152  states

Broadening Parameters

exojax uses .broad file as the broadening parameters. The comment

Broadening code level= a0

means the broadening parameters as a function of the lower J-quantum number is used.

default broadening parameters are used for  71  J lower states in  152  states

However, the broadning parameters are not often provided for higher J values. Instead, exojax uses the default values in .def file for them.

Vaex File Format

For the first time to load the Exomol database using exojax.spec package , exojax automatically converts the transition and state files into Vaex/HDF5 format.

penchan:~/exojax/data/CO/12C-16O/Li2015>ls -1

12C-16O__H2.broad
12C-16O__He.broad
12C-16O__Li2015.def
12C-16O__Li2015.pf
12C-16O__Li2015.states.bz2
12C-16O__Li2015.states.bz2.hdf5
12C-16O__Li2015.states.bz2.yaml
12C-16O__Li2015.trans.bz2
12C-16O__Li2015.trans.bz2.hdf5
12C-16O__Li2015.trans.bz2.yaml

The files with a suffix of “bz2.hdf5” amd “bz2.yaml” were generated by exojax. After the second time, exojax will use these HDF files, which significantly decrease the loading time. exojax also use .broad file for the broadening parameters.

Basic Quantities

quantity

instance

unit

np/jnp

line center

nu_lines

cm-1

np

line center

dev_nu_lines

cm-1

jnp

lower state energy

elower

cm-1

jnp

natural broadening

gamma_natural

cm-1

jnp

Einstein coefficient

A

s-1

jnp

reference line strength

Sij0

cm

np

log_e Sij0

logsij0

jnp

statistical weight

gpp

jnp

J_lower

jlower

jnp

J_upper

jupper

jnp

temperature exponent

n_Tref

jnp

alpha_ref (gamma0)

alpha_ref

jnp

Exomol API

moldb.MdbExomol uses function in exomolapi to read the ExoMol files, to download if these file do not exist, and to compute some quantities.

Read .def file

The path to the def file should be given using pathlib.Path.

from exojax.spec.exomolapi import read_def
import pathlib
deff=pathlib.Path("~/exojax/examples/luhman16/.database/CO2/12C-16O2/UCL-4000/12C-16O2__UCL-4000.def")
n_Texp, alpha_ref, molmass, numinf, numtag = read_def(deff)

Note that we have not check all the molecules in ExoMol database yet. In some case, there is inconsistency in the definition file and due to this inconsistency, one cannot load the ExoMol files. Let me know if you find that case.

Read the partition, states, transition files

For these files, the path can be just string.

from exojax.spec.exomolapi import read_pf, read_states, read_transf
pff="~/exojax/data/exomol/CO/12C-16O/Li2015/12C-16O__Li2015.pf"
dat=read_pf(pff)
statesf="~/exojax/data/exomol/CO/12C-16O/Li2015/12C-16O__Li2015.states.bz2"
states=read_states(statesf)
transf="~/exojax/data/exomol/CO/12C-16O/Li2015/12C-16O__Li2015.trans.bz2"
trans=read_trans(transf)

Compute gup and Elower

exomolapi.pickup_gE picks gup and Elower for all of the transitions from quantum states.

from exojax.spec.exomolapi import pickup_gE
A, nu_lines, elower, gup, jlower, jupper=pickup_gE(states,trans)

Read .broad file

exomolapi.read_broad can read .def file. The broad file defines its algorithm to compute the broadening parameters. Curreny, we support a0 and a1 only. this level can be checked using exomolapi.codelv. If codelv=”a0”, we can use exomolapi.make_j2b. If codelv=”a1”, then use make_j2b first and then use exomolapi.make_jj2b. These functions provide mapping arrays from J values to alpha_ref and n_Texp. For instance, j2alpha_ref[1] gives alpha_ref for Jlower=1, and jj2n_Texp[1,2] gives n_Texp for Jlower=1, Jupper=2.

from exojax.spec.exomolapi import read_broad, check_bdat
from exojax.spec.exomolapi import make_j2b, make_jj2b

broadf="~/exojax/data/broad/1H2-16O__H2.broad"
bdat=read_broad(broadf)
codelv=check_bdat(bdat)
print(codelv)
if codelv=="a0":
    j2alpha_ref, j2n_Texp=make_j2b(bdat,jlower_max=100)
elif codelv=="a1":
    j2alpha_ref, j2n_Texp=make_j2b(bdat,jlower_max=100)
    jj2alpha_ref, jj2n_Texp=make_jj2b(bdat,j2alpha_ref,j2n_Texp,jupper_max=100)