Photochemical Emission

Photochemical Emission#

SASKTRAN2 has basic support for some photochemical based emission sources. This is enabled by setting

import sasktran2 as sk

config = sk.Config()
config.emission_source = sk.EmissionSource.VolumeEmissionRate

note that it is not currently possible to combine thermal emissions with other photo-chemical based emissions.

Monochromatic Sources#

Many photochemical sources in the atmosphere are essentially monochromatic, and can be included by using the sasktran2.constituent.MonochromaticVolumeEmissionRate constituent.

import sasktran2 as sk
import numpy as np
import matplotlib.pyplot as plt

config = sk.Config()
config.emission_source = sk.EmissionSource.VolumeEmissionRate

model_geometry = sk.Geometry1D(cos_sza=-0.6,
                                solar_azimuth=0,
                                earth_radius_m=6372000,
                                altitude_grid_m=np.arange(0, 120001, 1000),
                                interpolation_method=sk.InterpolationMethod.LinearInterpolation,
                                geometry_type=sk.GeometryType.Spherical)

viewing_geo = sk.ViewingGeometry()

for alt in [95000]:
    ray = sk.TangentAltitudeSolar(tangent_altitude_m=alt,
                                    relative_azimuth=0,
                                    observer_altitude_m=200000,
                                    cos_sza=-0.6)
    viewing_geo.add_ray(ray)

wavel = np.arange(556.0, 560.0, 0.01)
atmosphere = sk.Atmosphere(model_geometry, config, wavelengths_nm=wavel)

sk.climatology.us76.add_us76_standard_atmosphere(atmosphere)

# Oxygen green line VER profile
altitude = np.array([
    140, 135, 130, 125, 120, 115, 110,
    105, 100,  95,  90,  85
]).astype(np.float64)[::-1] * 1000

# VER in ph cm^-3 s^-1
VER = np.array([
     400,   600,   800,  1100,  1500,  2000,  2600,
    3200,  3800,  4300,  3600,   900
])[::-1] / 100 # convert to ph cm^-2 m^-1

atmosphere["rayleigh"] = sk.constituent.Rayleigh()
atmosphere["ver"] = sk.constituent.MonochromaticVolumeEmissionRate(altitude, VER, 557.7)

engine = sk.Engine(config, model_geometry, viewing_geo)
output = engine.calculate_radiance(atmosphere)

output["radiance"].isel(los=0).plot()
[<matplotlib.lines.Line2D at 0x75b7e0c2d490>]
../_images/dbcc0b2981d162e49884ae8fe014044098cacb07a4afe08b91245302c4b38c1c.png

Note that since the calculation must be performed on a finite resolution spectral grid, SASKTRAN internally “widens” the monochromatic line based on the resolution of the calculation. This is done so that integrals over the line produce the correct integrated radiance profile.