Precomputed, state-independent PPP per-range corrections for the static-arc float/fixed solve: solid-earth tide, carrier-phase wind-up, and satellite antenna PCO/PCV.
All three depend only on epoch geometry (Sun/Moon direction, satellite
position, and a fixed reference receiver position), not on the estimated
receiver coordinates, so they are computed ONCE before the Gauss-Newton loop
at the seed/approx position and looked up by the row builders and the shared
range_corrections_m chokepoint. The sub-100 m seed-vs-truth offset moves each
correction by far less than its own measurement noise (tide gradient
~1e-7 m/m; wind-up and PCO geometry vary at the milli-arcsec level over 100 m),
so the state-independent precomputation is exact at solve precision.
Crate-backed pieces (Sun/Moon ECEF and the IERS DEHANTTIDEINEL kernel) come
through Orbis.NIF. The wind-up and satellite-PCO vector algebra is here in
Elixir against the crate Sun direction and the SP3 satellite geometry, where it
is short dot/cross algebra and directly checkable against RTKLIB ppp.c /
preceph.c.
Summary
Functions
Build the precomputed correction tables for the arc.
Empty correction tables (no precomputed corrections).
Types
@type t() :: %{ tide: %{optional(NaiveDateTime.t()) => vec3()}, windup_m: %{optional({String.t(), NaiveDateTime.t()}) => float()}, sat_pco_ecef: %{optional({String.t(), NaiveDateTime.t()}) => vec3()}, sat_pcv_m: %{optional({String.t(), NaiveDateTime.t()}) => float()} }
Functions
Build the precomputed correction tables for the arc.
config keys (all optional; absent = that correction is off):
:solid_earth_tide-trueto compute the per-epoch tide displacement.:phase_windup-trueto compute per-(sat,epoch) wind-up metres.:satellite_antenna-%{antex: %Antex{}, freq1: "G01", freq2: "G02"}to compute per-(sat,epoch) satellite PCO (ECEF vector) and nadir PCV (metres).
ref_pos is the reference receiver ECEF {x,y,z} (the solve seed/approx).
@spec empty() :: t()
Empty correction tables (no precomputed corrections).