SMRT (Snow Microwave Radiative Transfer) is a Python framework for computing microwave thermal emission and backscattering from layered cryospheric media. Given a sensor configuration and a description of a physical medium (snowpack, sea ice, etc.), SMRT produces brightness temperatures (passive mode), backscattering coefficients (active mode), or altimeter waveforms (altimetry mode).
This page covers SMRT's purpose, the four core concepts every simulation uses, the modular architecture, and a map of the major subsystems. For a runnable minimal example, see Quick Start Guide. For detailed internals of the Model class, see Core Architecture.
Sources: README.md1-72 pyproject.toml1-25 smrt/core/model.py1-98
SMRT operates in the microwave frequency domain (approximately 1–200 GHz). It supports three simulation modes:
| Mode | Output | Example Use |
|---|---|---|
| Passive | Brightness temperature TbV, TbH (Kelvin) | Satellite radiometer simulation (AMSR2, SMOS) |
| Active | Backscattering coefficient σ°VV, σ°HH (linear or dB) | SAR/scatterometer simulation (Sentinel-1, ASCAT) |
| Altimetry | Waveform return power vs. gate time | Radar altimeter simulation (CryoSat-2, Sentinel-3) |
The modelled physical media include: snow (layered), sea ice (first-year and multi-year), lake ice, soil substrates, water bodies, bedrock, and atmospheres.
Sources: smrt/core/model.py1-16 README.md1-14
Every simulation is built from four objects that are assembled together:
| Concept | Role | Primary Code Symbols |
|---|---|---|
| Sensor | Frequency, incidence angle, polarization, mode (passive/active) | Sensor, passive(), active(), sensor_list.amsre() |
| Snowpack | Layered medium with physical and microstructural properties | Snowpack, Layer, make_snowpack(), make_ice_column() |
| EM Model | Computes per-layer scattering coefficient ks, absorption coefficient ka, and phase function | IBA, Rayleigh, DMRT_QCACP_ShortRange, NonScattering |
| RT Solver | Propagates radiation through the layer stack to produce a Result | DORT, IterativeFirstOrder, NadirLRMAltimetry |
These four are assembled by make_model() and executed by Model.run(), both defined in smrt/core/model.py
Sources: smrt/core/model.py1-16 smrt/__init__.py1-62
Diagram: Simulation Data Flow (Natural Language → Code Entities)
Sources: smrt/core/model.py323-410 smrt/core/model.py525-610
Diagram: Package and Class Map (Code Entity Space)
Sources: smrt/__init__.py1-62 smrt/core/model.py100-116 smrt/core/lib.py87-118
make_model() accepts emmodel and rtsolver as either a string name or a class directly. When given as a string, import_class() in smrt/core/plugin.py resolves it to a class by searching the corresponding package directory. This is what allows make_model("iba", "dort") to work without explicit imports.
Diagram: String-to-Class Resolution via Plugin System
Custom emmodels, solvers, or microstructure models from external packages can be registered into the search path using register_package() from smrt/core/plugin.py. See Plugin System and Custom Extensions.
Sources: smrt/core/model.py257-291 smrt/core/lib.py87-118
| Wiki Page | Package Path | Key Entry Points |
|---|---|---|
| Core Architecture | smrt/core/ | Model, make_model(), Snowpack, Result, Sensor |
| Model Execution Pipeline | smrt/core/model.py | make_model(), make_emmodel(), make_rtsolver(), Model.run() |
| Data Structures | smrt/core/snowpack.py, smrt/core/layer.py | Snowpack, Layer, make_interface() |
| Results | smrt/core/result.py | PassiveResult.TbV(), ActiveResult.sigmaVV_dB(), concat_results() |
| Physical Medium Construction | smrt/inputs/ | make_snowpack(), make_ice_column(), make_water_body() |
| Radiative Transfer Solvers | smrt/rtsolver/ | DORT, IterativeFirstOrder, NadirLRMAltimetry |
| EM Scattering Models | smrt/emmodel/ | IBA, Rayleigh, DMRT_QCACP_ShortRange |
| Physical Properties | smrt/permittivity/, smrt/interface/ | maetzler06(), IEM_Fung92, fresnel_reflection_matrix() |
| Sensor Configuration | smrt/core/sensor.py, smrt/inputs/sensor_list.py | passive(), active(), amsre(), amsr2(), cimr() |
| Advanced Features | smrt/runner/, smrt/core/run_promise.py | JoblibParallelRunner, RunPromise, SensitivityStudy |
| Testing | smrt/test/ | pytest-based unit, integration, and physics-law tests |
| String Argument | Class | Applicable Regime |
|---|---|---|
"iba" | IBA | General snow/ice (correlation-length microstructure) |
"rayleigh" | Rayleigh | Rayleigh regime (small spherical scatterers) |
"dmrt_qcacp_shortrange" | DMRT_QCACP_ShortRange | Dense media (sticky hard spheres) |
"dmrt_qca_shortrange" | DMRT_QCA_ShortRange | Dense media (hard spheres) |
"nonscattering" | NonScattering | Transparent or purely absorbing layers |
| String Argument | Class | Mode |
|---|---|---|
"dort" | DORT | Passive + Active (multi-stream discrete ordinate) |
"iterative_first_order" | IterativeFirstOrder | Active (single-bounce approximation) |
"iterative_second_order" | IterativeSecondOrder | Active (two-bounce approximation) |
"successive_order" | SuccessiveOrder | Passive + Active (successive orders of scattering) |
"nadir_lrm_altimetry" | NadirLRMAltimetry | Altimetry (waveform convolution) |
Sources: smrt/core/model.py119-178 smrt/core/model.py257-291
Model.run() accepts a single Snowpack or a list, dict, pandas.Series, or pandas.DataFrame of snowpacks. When multiple snowpacks are provided, parallel_computation=True (the default) dispatches simulations across CPU cores using JoblibParallelRunner from smrt/runner/joblib_runner.py. The snowpack_dimension argument labels the resulting Result with a named coordinate (e.g., 'time', 'density').
For details on parallel execution and deferred computation, see Parallel Execution and Performance and Deferred Execution with RunPromise.
Sources: smrt/core/model.py323-410 smrt/core/model.py25-85
| Package | Required Version | Role in SMRT |
|---|---|---|
numpy | ≥2, <3 | All numerical array operations |
pandas | ≥2.1.0, <4 | Batch input handling; Result.to_dataframe() |
scipy | ≥1, <2 | Eigensolvers (DORT), integration routines |
xarray | ≥2024 | Multi-dimensional Result storage and indexing |
numba | ≥0.58, <1 | JIT-compiled loops (Fresnel coefficients, phase functions) |
joblib | ≥1.3.2, <2 | Parallel multi-snowpack dispatch |
Optional: tqdm (progress bars), pyrtlib (atmospheric profiles), gsw (seawater thermodynamics for sea-ice salinity calculations).
Sources: pyproject.toml18-32