Skip to content

SGP4 Theory Archive

The SGP4 algorithm that predicts satellite positions from Two-Line Element sets has a remarkably traceable pedigree. Every equation in the FORTRAN code can be followed back through a chain of papers to its mathematical origin.

graph TD
    B["Brouwer (1959)<br/>Mean element theory"]
    L["Lyddane (1963)<br/>Zero-inclination fix"]
    LC["Lane & Cranford (1969)<br/>SGP4 development"]
    STR2["Lane & Hoots (1979)<br/>Spacetrack Report #2"]
    STR1["Hujsak (1979)<br/>Spacetrack Report #1"]
    STR3["Hoots & Roehrich (1980)<br/>Spacetrack Report #3"]
    H81["Hoots (1981)<br/>Brouwer reformulation"]
    K88["Kelso (1988)<br/>Electronic distribution"]
    REV1["Vallado et al. (2006/2008)<br/>AIAA 2006-6753-Rev1"]
    K07["Kelso (2007)<br/>SGP4 validation vs GPS"]
    MOD["Modern implementations<br/>satellite.js, Skyfield, etc."]

    B --> LC
    L --> LC
    LC --> STR2
    LC --> STR1
    STR2 --> STR3
    STR1 --> STR3
    STR3 --> H81
    STR3 --> K88
    H81 --> REV1
    K88 --> REV1
    K07 --> MOD
    REV1 --> MOD

    click STR3 "/docs/sgp4-theory/original/00-overview/"
    click REV1 "/docs/sgp4-theory/rev1/00-overview/"
    click STR1 "/docs/sgp4-theory/foundations/str1/"
    click STR2 "/docs/sgp4-theory/foundations/str2/"
    click B "/docs/sgp4-theory/foundations/brouwer-1959/"
    click L "/docs/sgp4-theory/foundations/lyddane-1963/"
    click H81 "/docs/sgp4-theory/foundations/hoots-1980/"
    click K07 "/docs/sgp4-theory/foundations/kelso-2007/"

A parallel lineage supplies the physical constants that SGP4 depends on:

graph LR
    WGS72["WGS-72<br/>Seppelin, 1974"]
    WGS84["WGS-84<br/>TR8350.2, 2000"]
    IERS["IERS Conventions<br/>Tech. Note 36, 2010"]

    WGS72 -->|"GM, J2, ae"| PROP["SGP4 propagation"]
    WGS84 -->|"ellipsoid, geoid"| CONV["TEME-to-ITRF conversion"]
    IERS -->|"nutation, precession"| FRAME["TEME-to-J2000 conversion"]

    click WGS72 "/docs/sgp4-theory/foundations/wgs-72/"
    click WGS84 "/docs/sgp4-theory/foundations/wgs-84/"
    click IERS "/docs/sgp4-theory/foundations/iers-2010/"
DirectoryDocumentYearPagesSignificance
sgp-4/Spacetrack Report No. 3198091Canonical FORTRAN IV source code
sgp-4-rev-1/AIAA 2006-6753-Rev1200692Corrected SGP4 with test vectors
DirectoryDocumentYearPagesSignificance
brouwer-1959/Brouwer, AJ 64195919Mean element theory for artificial satellites
lyddane-1963/Lyddane, AJ 6819634Zero-inclination singularity fix
str-1/STR#1, Hujsak197972Deep-space resonance theory
str-2/STR#2, Lane & Hoots197964Near-earth general perturbation theory
hoots-1980/Hoots, Cel. Mech. 2419819Brouwer theory reformulation
kelso-2007/Kelso, AAS 07-127200715SGP4 validation against GPS precision ephemerides
wgs-72/Seppelin, DMA1974~50SGP4 geodetic constants (GM, J2, ae)
wgs-84/NIMA TR8350.22000175Modern geodetic datum for display/observer
iers-2010/IERS Tech. Note 362010179Earth rotation and reference frame transforms
DocumentReason
Lane & Cranford (1969)Behind AIAA paywall
Crawford (1995)Unpublished, likely lost
Vallado textbook (2013)Copyrighted commercial publication

The STR#3 FORTRAN was distributed only as a printed report. No authoritative digital source files ever existed. Every digital copy was produced by hand-typing, OCR, or PDF extraction — all vulnerable to column-shift errors in FORTRAN IV’s fixed format, where a single misplaced space silently changes meaning. This is a root cause of 25 years of SGP4 divergence that Vallado’s Rev-1 paper documented.

See the STR#3 extraction notes for our own encounter with this problem during the 2026 transcription.

The magic numbers in SGP4’s DATA statements trace directly to WGS-72:

  • GMGM \rightarrow XKE = 0.0743669161
  • J2J_2 \rightarrow `XJ2 = 1.082616 \times 10^-3$

Sixth-decimal-place differences between implementations reflect 1974 vs. 1980 measurement precision. See FORTRAN source constants for the full constant table.

The equation flow from theory to code follows a clear path:

Brouwer’s Section 9 → Lyddane singularity patches → Lane & Hoots add atmospheric drag → STR#3 FORTRAN

The secular, long-period, and short-period perturbation terms in Brouwer’s original paper map directly to identifiable blocks in the SGP4 source code.

Brouwer’s (15cos2I)1(1 - 5\cos^2 I)^{-1} term blows up at I63.4°I \approx 63.4° (the critical inclination). Molniya orbits deliberately exploit this singularity for their ground-track properties. STR#1 handles the deep-space resonance case with a numerical integrator in the DEEP subroutine — the only numerical integration in an otherwise fully analytical propagator.

Before Rev-1 (2006), SGP4 output was loosely described as “ECI” without specifying which reference frame. Rev-1 defined TEME (True Equator, Mean Equinox) as using only 4 of the 106 IAU-80 nutation terms. Converting TEME to J2000 requires the full IERS 2010 nutation model.

The nutation model hierarchy:

TEME(4)IAU-1980(106)IAU-2000B(77)IAU-2000A(1,365)\text{TEME}(4) \subset \text{IAU-1980}(106) \subset \text{IAU-2000B}(77) \subset \text{IAU-2000A}(1{,}365)

See Appendix C: TEME Coordinate System for the complete transformation equations.

Three levels of validation exist, each testing different properties:

SourceVectorsWhat It TestsAccuracy Level
STR#3 Ch. 1325Internal consistencySub-meter (near-earth)
Vallado Rev-1518Cross-implementation agreementMachine epsilon
Kelso 2007SGP4 vs. GPS precision ephemerides~1 km at epoch, 1—3 km/day growth

Half of the official URLs for these documents no longer resolve. Internet Archive and NASA ADS preserve access to some. Local archival — like this collection — remains the most reliable approach to ensuring continued access.

The DEEP subroutine uses three ENTRY points (DPINIT, DPSEC, DPPER) sharing state through static local variables. The resonance integrator inside DEEP is the only numerical integration in all of SGP4/SDP4 — every other computation is purely analytical. This architecture was clever for 1980 but causes significant problems for modern compilers.

STR#1 Appendices A—B use different sign conventions than Appendices D—G in several places. When the theoretical derivation and the FORTRAN code disagreed, the code became authoritative — not the theory paper. In operational practice, the code is the specification.

Satellites with an orbital period \geq 225 minutes are classified as deep-space and routed to SDP4 instead of SGP4. The .15625 threshold in the code is 225/1440225 / 1440 (minutes per day). This single branch determines the entire perturbation model applied to an object.