Orbis.GNSS.Ionosphere (Orbis v0.9.0)

Copy Markdown View Source

Single-frequency ionospheric group-delay corrections.

Two models are exposed over the astrodynamics-gnss crate: the GPS broadcast Klobuchar model (eight alpha/beta coefficients, IS-GPS-200), and an IONEX vertical-TEC-grid slant delay (single-layer model). Both return the group delay in positive meters.

This is the ionosphere correction for a GNSS signal. It is not Orbis.Atmosphere, which is NRLMSISE-00 neutral-atmosphere mass density for drag — a different quantity entirely.

Sign convention

The returned delay is a group delay and is positive: it increases the measured pseudorange (the signal arrives later than vacuum geometry would predict). The carrier-phase advance is the negation of this value. The ionosphere is dispersive, so the delay reported on a carrier other than the model's native L1 is the L1 delay scaled by (f_L1 / f)^2; pass the carrier via frequency_hz.

Units at the boundary

Public inputs are in degrees (_deg) and meters/hertz, per the Orbis naming convention; the radians the crate uses internally are converted here. Latitude is positive north, longitude positive east, azimuth clockwise from north.

Summary

Functions

IONEX vertical-TEC-grid slant ionospheric group delay, scaled to frequency_hz.

GPS broadcast Klobuchar L1 ionospheric group delay, scaled to frequency_hz.

Load and parse an IONEX file into a product handle.

Parse an in-memory IONEX byte buffer into a product handle.

Functions

ionex_slant_delay(handle, lat_deg, lon_deg, azimuth_deg, elevation_deg, epoch, frequency_hz)

@spec ionex_slant_delay(
  reference(),
  number(),
  number(),
  number(),
  number(),
  NaiveDateTime.t() | tuple(),
  number()
) :: {:ok, float()} | {:error, term()}

IONEX vertical-TEC-grid slant ionospheric group delay, scaled to frequency_hz.

handle is a parsed-IONEX reference from parse_ionex/1 or load_ionex/1. The receiver geodetic latitude/longitude and the satellite azimuth/elevation are in degrees; epoch is a NaiveDateTime or {{y, m, d}, {h, min, s}} tuple (the pierce point rides on the IONEX shell, so the receiver height is not used). Returns {:ok, delay_m} (positive meters) or {:error, reason}.

klobuchar_delay(params, lat_deg, lon_deg, azimuth_deg, elevation_deg, epoch, frequency_hz)

@spec klobuchar_delay(
  map(),
  number(),
  number(),
  number(),
  number(),
  NaiveDateTime.t() | tuple(),
  number()
) :: {:ok, float()} | {:error, term()}

GPS broadcast Klobuchar L1 ionospheric group delay, scaled to frequency_hz.

params carries the eight broadcast coefficients as %{alpha: {a0, a1, a2, a3}, beta: {b0, b1, b2, b3}} (or lists). The receiver geodetic latitude/longitude and the satellite azimuth/elevation are in degrees; epoch is a NaiveDateTime or {{y, m, d}, {h, min, s}} tuple in GPS time. Returns {:ok, delay_m} (positive meters) or {:error, reason}.

load_ionex(path)

@spec load_ionex(String.t()) :: {:ok, reference()} | {:error, term()}

Load and parse an IONEX file into a product handle.

Returns {:ok, reference()} or {:error, reason}.

parse_ionex(bytes)

@spec parse_ionex(binary()) :: {:ok, reference()} | {:error, term()}

Parse an in-memory IONEX byte buffer into a product handle.

Returns {:ok, reference()} or {:error, reason}. The buffer is parsed exactly once; the parsed grid is held as a resource handle.