Home About Data Tonight's Sky Launch Calendar Eclipse Tools Live View

ToolsOrbit Visualizer › Validation

Orbit Visualizer Validation — Propagator Accuracy & Methodology

The three propagation models, honestly stated

The Orbit Visualizer offers three per-object propagators. Each has a different fidelity, and none is presented as more than it is:

SGP4/SDP4

The operational model used by Space-Track and NORAD two-line element sets, implemented as a faithful port of the published reference algorithm: Vallado, Crawford, Hujsak, and Kelso, “Revisiting Spacetrack Report #3” (AIAA 2006-6753) and Vallado’s reference code distribution. It includes atmospheric drag (B*), zonal harmonics through J4, and the SDP4 deep-space branch: lunar–solar periodics and 12-hour/24-hour geopotential resonance terms, so Molniya, GPS-class, and GEO-class orbits are propagated with the deep-space corrections the model requires.

SGP4/SDP4 (Vallado reference algorithm). Operational TLE propagation; accuracy degrades with TLE age (≈1–3 km at epoch, growing per day).

J2 secular

A first-order analytic model that adds the mean secular drift of the ascending node (Ω), argument of perigee (ω), and mean anomaly caused by Earth’s oblateness (J2 = 1.08262668×10−3, RE = 6378.137 km) on top of a Keplerian ellipse.

J2 secular model: mean RAAN/ω/M drift only — no drag, no higher-order gravity, no resonance effects.

Two-body

The ideal Keplerian ellipse: one central attraction, no perturbations of any kind.

Idealized two-body propagation — educational geometry only; real orbits diverge within hours.

Constants and frames

WGS-72 gravity constants for SGP4

The SGP4 module ships with the WGS-72 constant set (μ = 398600.8 km³/s², RE = 6378.135 km, and the matching J2/J3/J4 values) as its default. That is deliberate: TLEs are fitted by Space-Track against WGS-72 SGP4, and the published verification ephemerides assume it. These constants are intentionally distinct from the WGS-84 values the app uses for display and geodetic math — “harmonizing” them would make SGP4 output less correct.

TEME → J2000, and its accuracy

SGP4 states are natively in the TEME frame (True Equator, Mean Equinox). The visualizer’s scene frame is J2000 (EME2000), so every SGP4 state is rotated through an explicit conversion: IAU-76/FK5 precession (ζ, θ, z polynomials), the IAU-1980 nutation series truncated to its 6 largest terms, and the geometric equation of the equinoxes, per Vallado’s TEME chapter. The truncation leaves arcsecond-level frame error (< ~0.1″ in Δψ) — a few meters at LEO radius, far below SGP4’s own km-level physical accuracy. UTC is used in place of TT (≈69 s in 2026 → ~10−7 rad in the angles). Polar motion and the full IAU-2006/2000A reductions are out of scope.

Earth-fixed products use the standard pairing convention: TEME + GMST → ECEF (Vallado’s approximation, no polar motion); J2000 objects use the same GMST rotation.

SGP4/SDP4 verification against the published reference

The implementation is verified against the published Vallado verification set: the SGP4-VER.TLE element sets and the reference ephemeris output (tcppver.out, WGS-72) distributed with AIAA 2006-6753 via CelesTrak. Expected states are pinned into the repository verbatim from the published output — never computed, estimated, or typed by hand — and the table below is generated directly by the verification harness (dev/run-sgp4-verification.mjs --html).

Acceptance requires every fixture timestep to match the reference within |Δr| ≤ 10−4 km (0.1 m) and |Δv| ≤ 10−6 km/s per component. Measured agreement is around 10−9 km — float rounding, five orders of magnitude inside the tolerance. A separate full-coverage check runs every state row in the published output (33 runs, 666 states) with the same result.

NORADCase categoryStepsmax |Δr| (km)max |Δv| (km/s)Result
00005near-earth54.73e-94.87e-10PASS
04632deep-space 24-h55.00e-94.97e-10PASS
06251near-earth drag54.64e-94.90e-10PASS
08195deep-space 12-h resonance54.70e-94.41e-10PASS
09880deep-space 12-h resonance54.85e-94.92e-10PASS
11801deep-space 12-h resonance54.78e-94.79e-10PASS
14128deep-space 24-h (GEO-class)54.85e-94.36e-10PASS
16925deep-space low-perigee54.86e-94.83e-10PASS
20413deep-space 24-h54.75e-94.62e-10PASS
21897deep-space 12-h resonance54.64e-95.00e-10PASS
22312near-earth high drag54.82e-94.63e-10PASS
28626deep-space 24-h (GEO-class)54.93e-94.89e-10PASS
29238near-earth low perigee54.89e-94.64e-10PASS
88888near-earth54.32e-94.78e-10PASS

Case 00005 is the classic Spacetrack Report #3 SGP4 test; 88888 is the original STR#3 near-earth case; 11801 the original SDP4 deep-space case. The 12-hour resonance rows are Molniya-class SDP4 cases; the 24-hour rows exercise the GEO-class synchronous-resonance branch.

Error-code behavior

The reference implementation defines specific error semantics (decayed satellites, out-of-range eccentricity, negative semi-latus rectum). The port must reproduce them — errors surface in the app as object badges, never as silent NaNs:

NORADPublished behaviorExpected codeResult
28350mean eccentricity out of range (error 1) under drag decay1PASS
33333semi-latus rectum < 0 (error 4)4PASS
33334perturbed eccentricity out of range (error 3) at epoch3PASS
28872sub-orbital, decays ~55 min after epoch (error 6)6PASS
29141final decay phase, error 6 before 440 min6PASS

J2 secular drift-rate checks

The J2 model uses the standard first-order secular rates (Ω̇ = −1.5 n J2 (RE/p)² cos i, ω̇ = 0.75 n J2 (RE/p)² (4 − 5 sin²i), plus the J2 mean-motion correction). Two textbook cases pin the rates — the ISS-class nodal regression and the sun-synchronous design rate of +0.9856°/day — and the ω̇ sign flip across the critical inclination i = 63.43° is asserted. The numbers below are computed live by the same harness from the same module the app runs:

CaseExpected (°/day)Computed (°/day)Result
ISS-class LEO (a=6778 km, e=0.0003, i=51.6°)-5.00 ± 0.05-5.0027PASS
Sun-synchronous (a=7178 km, e=0.001, i=98.6°)+0.986 ± 0.0100.9854PASS
ω̇ sign flip across i = 63.43° (63° vs 64°, a=7000 km)+ / −0.110 / -0.141 °/dayPASS

Reproducing these numbers

Everything on this page is produced by the repository’s verification harness, not typed by hand:

  • node dev/run-sgp4-verification.mjs — runs all pinned fixture cases and error cases; exits nonzero on any failure. Add --html to emit the exact table rows shown above.
  • node dev/check-sgp4-full-tcppver.mjs — full-coverage check against every state row in the published reference output.
  • In the app itself, open DevTools and run window.__exoOrbitVizSelfTest() — the same SGP4 fixture subset plus the geodesy, frame, and J2 checks run in your browser.

Verification data provenance: SGP4-VER.TLE and tcppver.out from the AIAA 2006-6753 distribution (CelesTrak), retrieved 2026-07-04; SHA-256 checksums are recorded alongside the pinned fixtures.

← Back to the Orbit Visualizer