# astrodynamics-gnss
GNSS domain layer built on the [`astrodynamics`](https://crates.io/crates/astrodynamics)
core crate. A sibling crate, not a feature — a propagation-only consumer never
has to compile the SP3/RINEX/IONEX parsers.
## What it provides
- **SP3 precise ephemeris** — `ephemeris::Sp3` / `ephemeris::SP3` parsing and
arbitrary-epoch position/clock interpolation.
- **Broadcast ephemeris** — RINEX 3.x/4.xx navigation parsing and orbit/clock
evaluation for GPS (LNAV), Galileo (I/NAV, F/NAV), BeiDou (D1/D2, including
geostationary satellites), and GLONASS (PZ-90.11 state-vector propagation by
Runge–Kutta integration).
- **Atmospheric corrections** — broadcast Klobuchar ionosphere (frequency-aware)
and Saastamoinen + Niell troposphere.
- **Single-point positioning** — multi-constellation least-squares PVT with one
receiver clock per system, elevation weighting, satellite rejection, and
dilution of precision.
## Public API shape
The public surface is organized by workflow:
```rust
use astrodynamics_gnss::{
ephemeris::{BroadcastEphemeris, Sp3},
positioning::{solve, Corrections, Observation, SolveInputs},
rinex::{nav, observations},
};
```
The implementation modules are private; users should not need to know whether a
function is backed by an SP3 parser, a broadcast store, or an SPP implementation
module. Use the façade modules:
- `ephemeris` for SP3 and broadcast ephemeris products,
- `rinex` for RINEX NAV/OBS parsing and CRINEX decoding,
- `positioning` for SPP and DOP diagnostics,
- `atmosphere` for ionosphere/troposphere models,
- `orbit` for reduced-orbit fitting and drift checks.
## Parity bar
Every independently reproducible, libm-bound component (orbit and clock
evaluation, ionosphere, troposphere, DOP) is held to **bit-exact (0 ULP)** parity
against a pinned Python reference, proven by committed hex-float golden vectors;
broadcast orbits are additionally validated against precise SP3 products. The
least-squares solver's converged position is a sub-micron solver-agreement
result, not a 0-ULP claim (the linear-algebra step is BLAS-bound).
Units are SI throughout, with the frame and datum encoded in the type
(`ItrfPositionM`, `Wgs84Geodetic`). 0 ULP is certified against a pinned target
(OS/arch, libm, toolchain, FMA policy); other platforms run the same algorithms
but need their own fixtures.
## License
MIT