Multiple Species Weighting Function Calculations

One of the most useful features of SK-DO is that it can compute weighting functions with respect to any number of input atmospheric species as well as surface reflectance.

%matplotlib inline
import sasktran as sk
import sktran_disco.interface as do
import numpy as np
import matplotlib.pyplot as plt

Start by setting up the geometry, use a SZA of 60 degrees with a pure nadir viewing geometry. Set up the atmosphere to contain rayleigh scattering, ozone and NO2 absorption, and a Lambertian surface

geometry = sk.NadirGeometry()
geometry.from_zeniths_and_azimuth_difference(60, 0, 0)

atmosphere = sk.Atmosphere()

# add our species
atmosphere['rayleigh'] = sk.Species(sk.Rayleigh(), sk.MSIS90())
atmosphere['o3'] = sk.Species(sk.O3OSIRISRes(), sk.Labow())
atmosphere['no2'] = sk.Species(sk.NO2OSIRISRes(), sk.Pratmo())
atmosphere.atmospheric_state = sk.MSIS90()

# add our surface properties
# setting to a scalar automatically sets the surface to be Lambertian
atmosphere.brdf = 0.3

Next we set the weighting function calculation to calculate with respect to all three species in the atmosphere as well as the surface

atmosphere.wf_species = ['rayleigh', 'o3', 'no2', 'brdf']

Run the calculation and print the results

wavelengths = np.linspace(340,700, 361)
engine = do.EngineDO(geometry=geometry, atmosphere=atmosphere, wavelengths=wavelengths)
rad = engine.calculate_radiance()
Dimensions:            (wavelength: 361, los: 1, xyz: 3, perturbation: 201)
  * wavelength         (wavelength) float64 340.0 341.0 342.0 ... 699.0 700.0
  * xyz                (xyz) <U1 'x' 'y' 'z'
  * perturbation       (perturbation) MultiIndex
  - altitude           (perturbation) int64 0 500 1000 ... 99000 99500 100000
Dimensions without coordinates: los
Data variables:
    radiance           (wavelength, los) float64 0.06605 0.0662 ... 0.04759
    mjd                (los) float64 5.82e+04
    los_vector         (los, xyz) float64 0.1761 0.588 -0.7894
    observer_position  (los, xyz) float64 -1.231e+06 -4.111e+06 5.486e+06
    wf_brdf            (wavelength, los) float64 0.08474 0.08584 ... 0.1512
    wf_rayleigh        (wavelength, los, perturbation) float64 2.246e-23 ... ...
    wf_o3              (wavelength, los, perturbation) float64 -3.663e-18 ......
    wf_no2             (wavelength, los, perturbation) float64 -9.476e-16 ......
    los_transmission   (wavelength, los) float64 0.4933 0.4985 ... 0.9586 0.959

In the resulting dataset we have weighting functions for the three species as a function of altitude, and the weighting function for the surface that is not a function of altitude.