Skip to content

[v3.2.0] Implement TELSEM2 land atlas in CRTMv3 #314

Description

@BenjaminTJohnson

Summary

Add the TELSEM2 (Tool to Estimate Land Surface Emissivities at Microwave frequencies) monthly-climatology atlas as a microwave land-surface emissivity source in CRTM. When a TELSEM2 coefficient file is loaded at CRTM_Init, it is used automatically for MW land emissivity; otherwise CRTM falls back to the existing NESDIS_LandEM model. This brings CRTM to parity with RTTOV, which uses TELSEM2 as its standard MW land emissivity atlas, and provides realistic, spatially-varying, monthly land emissivities for MW radiance assimilation and simulation.

https://journals.ametsoc.org/view/journals/atot/34/5/jtech-d-16-0188.1.xml

Motivation

CRTM's current MW land emissivity (src/SfcOptics/CRTM_MW_Land_SfcOptics.f90) uses the physical NESDIS_LandEM canopy/soil model below an 80 GHz cutoff and a constant 0.95 above it. TELSEM2 is an observation-derived (SSM/I) climatology that captures spatial and seasonal variability the physical model cannot, and is the de-facto standard in RTTOV. Adding it:

  • improves MW land emissivity realism and RTTOV inter-comparability,
  • gives users a well-validated alternative without removing the existing default,
  • requires no new dynamic inputs (it is keyed only by latitude/longitude/month/frequency/angle).

Scope / design decisions

  • Atlas packaging: convert the native RTTOV ASCII atlas to a CRTM-native coefficient file (netCDF, following the LSEatlas/SEcategory conventions), distributed via Get_CRTM_Binary_Files.sh + tarball md5sum.
  • Algorithm fidelity: full port of RTTOV's mod_mwatlas (TELSEM2), not a simplified interpolation.
  • Model selection: default-when-loaded — if a TELSEM2 atlas file is provided to CRTM_Init, it is used for MW land; otherwise NESDIS_LandEM is used. No new CRTM_Options flag (mirrors how CRTM_IRlandCoeff is used unconditionally when loaded).

Scientific scope (full TELSEM2 port)

Port the RTTOV mod_mwatlas algorithm:

  • Equal-area grid (~0.25 deg, organized by latitude bands); compute the atlas cellnum from (lat, lon).
  • 12 monthly atlases; each populated cell stores mean emissivity at 19, 37 and 85 GHz for V and H polarization, plus standard deviations and the inter-frequency/inter-polarization covariance used for interpolation.
  • Optional spatial resolution control: average emissivity over all atlas cells within a requested radius (degrees) of the target
    point.
  • Frequency interpolation/extrapolation to the channel frequency using the TELSEM2 covariance-based regression anchored at 19/37/85 GHz.
  • Angular correction: apply the parameterized zenith-angle adjustment (separate V/H polynomial coefficients) to map atlas emissivities to the CRTM view angle.
  • Polarization convention matches the existing MW land driver: SfcOptics%Emissivity(:,1)=V, (:,2)=H.
  • No-data handling: TELSEM2 flags cells with no climatology (e.g., permanent ice/open water). On no-data, fall back to NESDIS_LandEM to preserve current behavior.

Data pipeline (atlas -> CRTM coefficient file)

  • Build a one-time converter that reads the RTTOV ASCII atlas (ssmi_mean_emis_climato_MM_cov_interpol_M2 for MM = 01..12, plus the correlation file) and writes a CRTM-native netCDF coefficient file, following the LSEatlas/SEcategory IO conventions (Release/Version, global attributes, dimensions, Inquire/Read/Write).
  • Define a TELSEM2Atlas_type capturing: grid geometry (per-band cell counts, first-cell indices), per-month emissivity/std/covarian
    ce arrays, frequency anchors, and angular-correction coefficients.
  • Distribute the generated file via Get_CRTM_Binary_Files.sh and update the tarball md5sum (same mechanism as the IR atlas).

New source modules (mirroring the IR-land atlas pipeline)

New file Template / analogue
src/Coefficients/EmisCoeff/MW_Land/TELSEM2/TELSEM2Atlas_Define.f90 src/Coefficients/EmisCoeff/IR_Land/LSEatlas/LSEatlas_Define.f90
src/Coefficients/EmisCoeff/MW_Land/TELSEM2/TELSEM2Atlas_netCDF_IO.f90 (+ optional _Binary_IO) and TELSEM2Atlas_IO.f90 wrapper SEcategory_IO.f90 / SEcategory_netCDF_IO.f90
src/Coefficients/CRTM_MWlandCoeff.f90 (module-global MWlandC + CRTM_MWlandCoeff_Load/_Destroy/_IsLoaded) src/Coefficients/CRTM_IRlandCoeff.f90
src/SfcOptics/MW_Land/TELSEM2/TELSEM2_Atlas_Module.f90 (cell lookup, spatial averaging, frequency interpolation, angular correction) RTTOV mod_mwatlas

Integration points (edits to existing code)

  • src/CRTM_LifeCycle.f90
    • Add an optional MWlandCoeff_File argument to CRTM_Init (mirror IRlandCoeff_File: default filename, Resolve_Coeff_Format,
      error handling).
    • Call CRTM_MWlandCoeff_Load(...) when a microwave sensor is present (ANY(SpcCoeff_IsMicrowaveSensor(SC))) and the file is provided.
    • Call CRTM_MWlandCoeff_Destroy(...) in CRTM_Destroy.
  • src/SfcOptics/CRTM_MW_Land_SfcOptics.f90
    • Add a GeometryInfo argument to Compute_MW_Land_SfcOptics (lat/lon/month come from GeometryInfo%user%Latitude/Longitude/Month).
    • At entry: if CRTM_MWlandCoeff_IsLoaded() and the atlas returns valid data at (lat, lon, month, frequency, angle), use the TELSEM2 path and mark iVar so TL/AD return zero. Otherwise use the existing NESDIS_LandEM path (unchanged; retains its analytic Jacobians).
    • _TL/_AD: when the atlas path was taken, output zero sensitivities; the NESDIS_LandEM path is unchanged.
  • src/SfcOptics/CRTM_SfcOptics.f90
    • Pass GeometryInfo into the forward Compute_MW_Land_SfcOptics call (currently at line ~518; GeometryInfo is already in scope, as it is passed to Compute_MW_Water_SfcOptics).
  • src/CMakeLists.txt
    • Register all new .f90 files (explicit, non-glob source list).

Tangent-linear / adjoint

TELSEM2 depends only on latitude, longitude, month, frequency and view angle — none of which are CRTM state/control variables — so the TL and AD of the TELSEM2 path are identically zero. The TL/AD changes are minimal: detect the atlas path via iVar and zero the outputs (analogous to the existing high-frequency-default path). The existing NESDIS_LandEM analytic Jacobians (LAI, vegetation fraction, soil moisture; commit 9358caa) remain intact for the fallback path.

Validation / tests

  • Coefficient file round-trip: Inquire/Read/Write consistency test for the new coefficient file.
  • Science match vs RTTOV: compare CRTM TELSEM2 emissivities against RTTOV TELSEM2 for a set of (lat, lon, month, frequency, angle) points, V and H, to a tight tolerance (same algorithm and atlas).
  • Forward integration: forward run on a MW sensor (e.g., ATMS / AMSU-A / SSMIS) with the atlas loaded vs NESDIS_LandEM; sanity-check brightness temperatures.

TL/AD consistency: extend the existing OMP / K-matrix consistency tests to confirm the TELSEM2-path TL/AD are zero and that the NESDIS_LandEM path is unaffected.

Risks / open questions

  • Correctness of the equal-area grid cellnum indexing — port carefully and verify against RTTOV.
  • Geometry latitude/longitude/month must be populated by the caller. If they are left at defaults, the atlas lookup may hit a no-data
    cell and fall back to NESDIS_LandEM; document this requirement.
  • Behavior outside the 19-85 GHz anchor range (extrapolation vs capping) — match RTTOV and document.
  • Coefficient-file format/versioning and binary-file distribution (md5sum, Get_CRTM_Binary_Files.sh) coordination.
  • Thread-safety: the atlas is module-global, read-only after Init (consistent with other coefficients), so it is OpenMP-safe.

Acceptance criteria

  • TELSEM2 atlas converted to a CRTM-native netCDF coefficient file and wired into Get_CRTM_Binary_Files.sh + md5sum.
  • New TELSEM2Atlas_Define / IO and CRTM_MWlandCoeff modules implemented and building.
  • CRTM_Init/CRTM_Destroy load/free the atlas via a new MWlandCoeff_File argument.
  • Compute_MW_Land_SfcOptics uses TELSEM2 when loaded (with NESDIS_LandEM fallback on no-data) and is fed GeometryInfo.
  • TL/AD return zero on the atlas path; NESDIS_LandEM Jacobians unchanged on the fallback path.
  • (optional) Emissivities match RTTOV TELSEM2 within tolerance; forward/TL/AD/K regression and OMP-consistency tests pass.

Metadata

Metadata

Labels

No fields configured for Feature.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions