Adding a substrate

Goal: understand how to add a substrate to simulations in passive and active mode.

Substrate implementation

The substrate is an object containing information to compute the reflectivity (and emissivity). It can be included as an attribute of a snowpack.

This tutorial shows multiple ways to define a substrate both in passive and active modes.

Passive with direct reflectivity definition

The first passive example demonstrates how to add a substrate with known reflectivity. This example is for a near perfect absorber (emissivity = 0.98).

import numpy as np
import matplotlib.pyplot as plt
from smrt import make_snowpack, make_model
from smrt.inputs.sensor_list import passive

from smrt.substrate.reflector import make_reflector

The substrate is defined with make_reflector() and added to the snowpack:

substrate = make_reflector(temperature=265, specular_reflection=0.02)
snow = make_snowpack([1], "exponential", temperature=[265],
                     density=[280], corr_length=[5e-5], substrate=substrate)

Another way to add a substrate is to use the + (or +=) operator, in order for example to keep the same snowpack but easily compare different representations of the substrate:

snow = make_snowpack([1], "exponential", temperature=[265],
                     density=[280], corr_length=[5e-5])
medium = snow + substrate

You can then have a look at the properties of the medium - the substrate is listed below the layer properties - then run your model as you would without a substrate:

medium
m = make_model("iba", "dort")
rad = passive(21e9, 55)
m.run(rad, medium).TbV()

Passive with a soil model

Alternatively the soil dielectric constant may be calculated from a theoretical model. The Wegmuller and Mätzler (1999) soil model is included in SMRT, other soil models may be contributed by taking a similar approach. A soil dielectric constant model is also required. Here we use the Dobson et al., (1985) model.

The substrate is here defined with make_soil_substrate() and added to the snowpack:

from smrt import make_soil_substrate
soil = make_soil_substrate('soil_wegmuller', 'soil_permittivity_dobson85', temperature=265, roughness_rms=0.25,
                 moisture=0.25, sand=0.01, clay=0.7, drymatter=1300)

Active with prescribed backscatter

The make_reflector() function used for the active mode is not the same:

from smrt.inputs.sensor_list import active
from smrt.substrate.reflector_backscatter import make_reflector
reflector = make_reflector(temperature=265,
                           specular_reflection=0.,
                           backscattering_coefficient={'VV': 0.1, 'HH': 0.1})

The model can the be run as usual:

medium = snow + reflector
scatt = active(13e9, 45)
model = make_model('iba', 'dort')
result = model.run(scatt, medium)

You can output the intensity e.g. result.sigmaVV() directly or in dB with result.sigmaVV_dB().

Active with backscatter models

SMRT currently has two backscatter models implemented: IEM (2 versions) and Geometric Optics. These are implemented as interfaces, but can be applied to represent the substrate. Here we’ll use IEM:

substrate = make_soil_substrate("iem_fung92", "soil_permittivity_dobson85", temperature=260,
                                            roughness_rms=1e-3,
                                            corr_length=5e-2,
                                            autocorrelation_function="exponential",
                                            moisture=0.25,
                                            sand=0.01,
                                            clay=0.7,
                                            drymatter=1300)

You can also change the bottom (or any!) interface to use the backscatter model:

from smrt.interface.geometrical_optics_backscatter import GeometricalOpticsBackscatter
from smrt.core.interface import make_interface

rough_interface = make_interface(GeometricalOpticsBackscatter, mean_square_slope=0.03)
snow.interfaces[-1] = rough_interface

Look at the snowpack - you can see the interface for the bottom layer has now changed.

Note that this is the interface at the top of the layer, not the bottom so it is equivalent here to setting the surface of the snowpack to be rough. You can also set a rough snow surface by passing the argument surface=rough_interface when creating the snowpack.