A Band Emission Model

SASKTRAN includes a model to include effects from photochemical emission in the oxygen A band. This is included as ABandEmission, and can be created through

import sasktran as sk
import numpy as np

emissions_alts_km = np.arange(0, 200)

aband_emission = sk.ABandEmission(emissions_alts_km)

Running the Model

To run the model we need three things

  1. A representation of the atmospheric state, containing pressure, temperature, ozone, and O2.

  2. A location to run the model at.

  3. The solar geometry

The representation of the atmospheric state is an instance of the Atmosphere object, for example,

atmosphere = sk.Atmosphere()

# Set the background pressure/temperature
atmosphere.atmospheric_state = sk.MSIS90()

# Set the constituent species
atmosphere['ozone'] = sk.Species(sk.O3OSIRISRes(), sk.Labow())
atmosphere['air'] = sk.Species(sk.Rayleigh(), sk.MSIS90())
atmosphere['O2'] = sk.Species(sk.HITRANChemical('O2'), sk.MSIS90(include_o2=True), species='SKCLIMATOLOGY_O2_CM3')

Note that some of the climatologies used here are focused on the stratosphere, and may not be suitable for the mesosphere. For more accurate calculations using the A band emission model it is recommended to create ClimatologyUserDefined objects with realistic mesospheric profiles.

Having created the atmosphere we can then run the model, usually running the model takes around 40 seconds depending how many altitudes are requested.

ref = [40, 0, 0, 54372]    # Lat/lon/altitude/mjd
sun = np.array([0, 0, 1])

emission_source, emission_wavel = aband_emission.run_model(atmosphere, ref, sun)

Including the Model in a Radiative Transfer Calculation

There are two ways we can use the emission model and include them in a radiative transfer calculation. The first is to take the values we have already calculated and create a EmissionTable object.

# Convert emission altitudes to m, and source function from /cm to /m
emission_table = sk.EmissionTable(emissions_alts_km * 1000, emission_wavel, emission_source * 100)

The EmissionTable can then be added to the Atmosphere object that goes into the radiative transfer model. We also have to tell the radiative transfer model to specifically include emissions in the calculation.

atmosphere.emissions['aband'] = emission_table

geo = sk.VerticalImage()
geo.from_sza_saa(70, 60, 0, 0, np.array([30, 40, 50, 60, 70]), 54372, 0)

engine = sk.EngineHR(geometry=geo, atmosphere=atmosphere, wavelengths=np.arange(760, 780, 1e-2))
engine.include_emissions = True

radiance = engine.calculate_radiance()

This method of including emissions in the model is a bit clunky since we have to first run the model at a specific location and solar geometry.

The second method uses the ABandEmission object directly instead of creating an intermediate EmissionTable

atmosphere.emissions['aband'] = sk.ABandEmission(emissions_alts_km)

geo = sk.VerticalImage()
geo.from_sza_saa(70, 60, 0, 0, np.array([30, 40, 50, 60, 70]), 54372, 0)

engine = sk.EngineHR(geometry=geo, atmosphere=atmosphere, wavelengths=np.arange(760, 780, 1e-2))
engine.include_emissions = True

radiance = engine.calculate_radiance()

The main advantage to this method is that the location and solar geometry used to run the A band emission model are taken directly from SASKTRAN to match the radiative calculation. The downside is that the A band emission model is executed every time the radiative transfer calculation is performed.