Skip to content

Vallado et al. (2006): Revisiting Spacetrack Report #3

By 2006, the SGP4 algorithm was 26 years old and fragmented beyond recognition. Multiple organizations ran code that all claimed to be “SGP4” but produced materially different results. No configuration management existed. No version tracking appeared in TLE data. The operational code inside AFSPC’s classified systems at Cheyenne Mountain had never been publicly released, so every public implementation was a best-effort reconstruction from a printed report.

This paper was the first public attempt to catalog the damage and provide a single corrected reference. It is the reason modern SGP4 implementations — satellite.js, python-sgp4, Skyfield, and the propagator inside Astrolock’s pg_orrery — can agree to machine precision.

The paper opens with the most comprehensive accounting of SGP4 proliferation ever published. The timeline of divergence:

YearEventEffect
1980STR#3 published as printed reportNo authoritative digital source; every copy hand-typed or OCR’d
1986STR#6/HANDE systemSeparate standalone version with undocumented fixes
~1990GSFC obtains standalone versionNASA’s copy diverges from AFSPC’s
1996GSFC/SeaWiFS releaseWidely adopted, further diverges
Late 1990sCrawford (Dundee) begins independent trackingMost careful external change history
1998Hoots documentation effortAcknowledged divergence but did not resolve it
2004Hoots et al. update attemptStill no unified reference
2006This paperFirst unified audit and corrected implementation

AFSPCI 33-105 — the Air Force’s own policy instruction for space catalog maintenance — acknowledged “various versions of executable and source code” with no configuration control. The paper quotes this directly, establishing that even the organization responsible for SGP4 recognized the problem.

By 2006, three major public versions were in circulation, each with its own patches:

VersionOriginNotable Differences
STR#3 (1980)AFSPC standaloneMixed precision, original bugs intact
GSFC (1996)NASA Goddard / SeaWiFSSome 1990 standalone fixes, others missing
Dundee (Crawford)Independent researcherMost comprehensive external fix history

Paul Crawford’s Dundee code is particularly significant. Working independently from his base in Scotland, Crawford identified and documented bugs that AFSPC had not publicly confirmed. His change history pre-dates many DoD acknowledgments of the same problems, making it the closest thing to a Rosetta Stone for SGP4 evolution.

The co-authorship of this paper is itself significant for the SGP4 lineage:

  • David Vallado — astrodynamics textbook author, the driving force behind the reconciliation effort
  • Paul Crawford — the Dundee code maintainer, bringing 10+ years of independent bug tracking
  • Richard Hujsak — author of STR#1 (the deep-space resonance theory), connecting the original deep-space work to the modernization
  • T. S. Kelso — CelesTrak operator and the primary public distributor of TLE data since 1985, who later published the validation study measuring SGP4 accuracy against GPS truth

Hujsak’s involvement is particularly noteworthy. He designed the deep-space four-body resonance model (the DEEP subroutine in STR#3) in 1979. His participation in the 2006 paper means the deep-space corrections are validated by the person who created the original theory — a 27-year continuity of expertise.

The paper documents 17 specific changes to the STR#3 FORTRAN, accumulated from Crawford’s tracking, GSFC patches, and AFSPC standalone updates. The five major categories, each demonstrated by specific satellite numbers:

CategoryAffected SatellitesProblem
Lyddane singularity04632, 14128, 20413, 23177, 23599Near-equatorial orbits trigger division by zero
Negative inclination25954, 28626Deep-space lunar-solar drift pushes i < 0
Secular integrator09880State-saving bug produces direction-dependent results
Kepler convergence23333Newton-Raphson diverges for high eccentricity (e > 0.9)
Perigee thresholdsMultipleOff-by-one errors in atmospheric regime selection

These are the same bugs documented in Rev-1. The value of the 2006 paper is that it shows these were discovered incrementally, not all at once — Rev-1 sometimes reads as if the corrections were always obvious.

Before this paper, SGP4 output was loosely described as “ECI coordinates” without specifying which Earth-centered inertial frame. This was not an oversight — no one had bothered to precisely characterize the simplified nutation model embedded in the propagator.

The paper formally names and defines the output frame as TEME (True Equator, Mean Equinox):

  • True equator: the instantaneous equatorial plane including nutation effects
  • Mean equinox: a simplified equinox direction using only 4 of the 106 IAU-80 nutation terms
  • Not J2000, not TOD, not PEF — a distinct frame that requires explicit transformation to any of these

This definition is one of the paper’s most lasting contributions. Every modern SGP4 implementation that converts to J2000 or ITRF depends on the TEME characterization established here. The full transformation matrices appear in Appendix C of Rev-1.

STR#3 provided 25 test vectors for 2 satellites. This paper expands that to 518 vectors across 29 satellites, selected to exercise every known edge case. The test suite became the de facto validation standard — if your SGP4 matches these vectors to machine epsilon, your implementation is correct.

The complete test case data is documented in the Rev-1 section.

Beyond the algorithm itself, the paper addresses the practical interface problems that caused interoperability failures:

  • TLE format ambiguities: leading zeros, DOS vs. UNIX line endings, the Element Type field (always 0 despite being allocated for multiple types)
  • BSTAR interpretation: the BB^* drag term can go negative — it is a fitted parameter that absorbs unmodeled force errors, not a physical ballistic coefficient
  • SGP4/SDP4 merge: the paper formalizes the convention (established in the 1990 standalone) of merging near-earth and deep-space models into a single routine, eliminating driver-level branching
  • Multi-language ports: reference implementations in C++, FORTRAN 90, C#, Java, MATLAB, and Pascal

Rev-1 is the version the community adopted. The differences from the original 2006 paper are refinements, not fundamental changes:

Aspect2006 (this paper)Rev-1 (2008)
Test vectors518 across 29 satellitesRefined values for edge cases
TEME appendixInitial definitionExpanded with worked numerical examples
Code listingsC++ primaryAdditional language cleanup
Edge case documentationInitial catalogExpanded failure mode descriptions
Core theorySameSame

The theory and the 17 code changes are identical. Rev-1 polishes the presentation, adds detail to the appendices, and corrects minor issues in the test vectors. For implementation purposes, Rev-1 supersedes this paper entirely.

The paper’s lasting impact goes beyond the technical corrections:

  1. It broke the fragmentation cycle. Before this paper, each organization patched bugs locally without coordination. Afterward, the community had a shared reference.

  2. It established Crawford’s Dundee code as a primary source. An independent researcher working outside the DoD produced the most reliable change history. This validated the open-source approach to critical infrastructure code.

  3. It connected the original authors to the modern community. Hujsak (STR#1, 1979) and Kelso (CelesTrak, 1985) bridging to a 2006 correction paper demonstrates how small the operational astrodynamics community is — and how much institutional knowledge resides in individual practitioners rather than documented processes.

  4. It provided a public definition of the output coordinate frame. For 26 years, practitioners used SGP4 output without a precise frame definition. The TEME characterization is now standard reference material.