Calculate non-LTE spectra of carbon-monoxide

Compute a CO spectrum with the temperature of the vibrational mode different from the temperature of the rotational mode.

This example uses the calc_spectrum() function, the [HITRAN-2016] line database to derive the line positions and intensities, and the default RADIS spectroscopic constants to compute nonequilibrium energies and populations, but it can be extended to other line databases and other sets of spectroscopic constants.

plot nonequilibrium co spectrum
Calculating energy levels with Dunham expansion for CO(X1Σ+)(iso1)
Database generated up to v=48, J=238
Calculating energy levels with Dunham expansion for CO(X1Σ+)(iso2)
Database generated up to v=48, J=243
Calculating energy levels with Dunham expansion for CO(X1Σ+)(iso3)
Database generated up to v=48, J=243
Calculating Non-Equilibrium Spectrum
Physical Conditions
----------------------------------------
   Tgas                 300.0 K
   Trot                 300.0 K
   Tvib                 700.0 K
   isotope              1,2,3
   mole_fraction        0.1
   molecule             CO
   path_length          1.0 cm
   pressure             1.01325 bar
   rot_distribution     boltzmann
   self_absorption      True
   state                X
   vib_distribution     boltzmann
   wavenum_max          2300.0000 cm-1
   wavenum_min          1900.0000 cm-1
Computation Parameters
----------------------------------------
   Tref                 296 K
   add_at_used
   broadening_method    voigt
   cutoff               1e-27 cm-1/(#.cm-2)
   dbformat             hitran
   dbpath               /home/docs/.radisdb/hitran/CO.hdf5
   folding_thresh       1e-06
   include_neighbouring_lines  True
   memory_mapping_engine  auto
   neighbour_lines      0 cm-1
   optimization         simple
   parfuncfmt           hapi
   parsum_mode          full summation
   pseudo_continuum_threshold  0
   sparse_ldm           auto
   truncation           50 cm-1
   waveunit             cm-1
   wstep                0.01 cm-1
   zero_padding         -1
----------------------------------------
Fetching Evib & Erot.
/home/docs/checkouts/readthedocs.org/user_builds/radis/checkouts/latest/radis/misc/warning.py:427: NegativeEnergiesWarning:

There are negative rotational energies in the database

/home/docs/checkouts/readthedocs.org/user_builds/radis/checkouts/latest/radis/misc/warning.py:427: PerformanceWarning:

'gu' was recomputed although 'gp' already in DataFrame. All values are equal

... sorting lines by vibrational bands
... lines sorted in 0.0s
Index(['El', 'Pshft', 'selbrd', 'jl', 'wav', 'vl', 'gp', 'Tdpair', 'airbrd',
       'branch', 'iso', 'vu', 'int', 'A', 'ju', 'Eu', 'Evibl', 'Evibu',
       'Erotu', 'Erotl', 'gju', 'gjl', 'grotu', 'grotl', 'gvibu', 'gvibl',
       'gu', 'gl', 'Rs2', 'Blu', 'Bul', 'Aul', 'viblvl_l', 'viblvl_u', 'band'],
      dtype='object')
Index(['El', 'Pshft', 'selbrd', 'jl', 'wav', 'vl', 'gp', 'Tdpair', 'airbrd',
       'branch', 'iso', 'vu', 'int', 'A', 'ju', 'Eu', 'Evibl', 'Evibu',
       'Erotu', 'Erotl', 'gju', 'gjl', 'grotu', 'grotl', 'gvibu', 'gvibl',
       'gu', 'gl', 'Rs2', 'Blu', 'Bul', 'Aul', 'viblvl_l', 'viblvl_u', 'band',
       'Qvib', 'Q', 'Qrotl', 'Qrotu'],
      dtype='object')
Index(['El', 'Pshft', 'selbrd', 'jl', 'wav', 'vl', 'gp', 'Tdpair', 'airbrd',
       'branch', 'iso', 'vu', 'int', 'A', 'ju', 'Eu', 'Evibl', 'Evibu',
       'Erotu', 'Erotl', 'gju', 'gjl', 'grotu', 'grotl', 'gvibu', 'gvibl',
       'gu', 'gl', 'Rs2', 'Blu', 'Bul', 'Aul', 'viblvl_l', 'viblvl_u', 'band',
       'Qvib', 'Q', 'Qrotl', 'Qrotu'],
      dtype='object')
0.26s - Spectrum calculated

<matplotlib.lines.Line2D object at 0x7f7070381190>

from astropy import units as u

from radis import calc_spectrum

s2 = calc_spectrum(
    1900 / u.cm,
    2300 / u.cm,
    molecule="CO",
    isotope="1,2,3",
    pressure=1.01325 * u.bar,
    Tvib=700 * u.K,
    Trot=300 * u.K,
    mole_fraction=0.1,
    path_length=1 * u.cm,
    databank="hitran",  # or use 'hitemp'
)
s2.plot("radiance_noslit")

# Apply a (large) instrumental slit function :
s2.apply_slit(10, "nm")
s2.plot("radiance", nfig="same", lw=2)  # compare with previous

Total running time of the script: (0 minutes 2.586 seconds)