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"]
    REV3["Vallado et al. Rev 3 (2013)<br/>Dual AFSPC/improved modes"]
    OD["Vallado & Crawford (2008)<br/>SGP4 Orbit Determination"]
    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
    REV1 --> REV3
    REV1 --> OD
    K07 --> MOD
    REV3 --> MOD
    OD --> MOD

    click STR3 "/docs/sgp4-theory/original/00-overview/"
    click REV1 "/docs/sgp4-theory/rev1/00-overview/"
    click REV3 "/docs/sgp4-theory/foundations/16-vallado-rev3/"
    click OD "/docs/sgp4-theory/foundations/17-vallado-sgp4-od-2008/"
    click STR1 "/docs/sgp4-theory/foundations/03-str-1/"
    click STR2 "/docs/sgp4-theory/foundations/04-str-2/"
    click B "/docs/sgp4-theory/foundations/01-brouwer-1959/"
    click L "/docs/sgp4-theory/foundations/02-lyddane-1963/"
    click H81 "/docs/sgp4-theory/foundations/05-hoots-1981/"
    click LC "/docs/sgp4-theory/foundations/12-lane-cranford-1969/"
    click K07 "/docs/sgp4-theory/foundations/06-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/07-wgs-72/"
    click WGS84 "/docs/sgp4-theory/foundations/08-wgs-84/"
    click IERS "/docs/sgp4-theory/foundations/09-iers-2010/"
DirectoryDocumentYearPagesSignificance
sgp-4/Spacetrack Report No. 3 (PDF)198091Canonical FORTRAN IV source code
sgp-4-rev-1/AIAA 2006-6753-Rev1 (PDF)200692Corrected SGP4 with test vectors
DirectoryDocumentYearPagesSignificance
brouwer-1959/Brouwer, AJ 64 (PDF)195919Mean element theory for artificial satellites
lyddane-1963/Lyddane, AJ 68 (PDF)19634Zero-inclination singularity fix
str-1/STR#1, Hujsak (PDF)197972Deep-space resonance theory
str-2/STR#2, Lane & Hoots (PDF)197964Near-earth general perturbation theory
hoots-1980/Hoots, Cel. Mech. 24 (PDF)19819Brouwer theory reformulation
kelso-2007/Kelso, AAS 07-127 (PDF)200715SGP4 validation against GPS precision ephemerides
wgs-72/Seppelin, DMA (PDF)1974~50SGP4 geodetic constants (GM, J2, ae)
wgs-84/NIMA TR8350.2 (PDF)2000175Modern geodetic datum for display/observer
iers-2010/IERS Tech. Note 36 (PDF)2010179Earth rotation and reference frame transforms
tapley-1975/Tapley, AFOSR-TR-75-1073 (PDF)197518Atmospheric drag variability and orbit prediction limits
lane-cranford-1969/Lane & Cranford, AIAA 69-925 (PDF)196912Coupled drag-oblateness theory, power density function
liu-1974/Liu, AIAA J. 12(11) (PDF)19746Method of averaging, independent Brouwer/Kozai verification
kozai-1959/Kozai, AJ 64 (PDF)195911Motion of a close earth satellite, basis of SGP model
vallado-2006/Vallado et al., AIAA 2006-6753 (PDF)200688Original conference paper, 25 years of SGP4 divergence
crawford-1995/Crawford, IJRS 16(3) (PDF)19959Bounded Newton-Raphson Kepler solver, incorporated into Rev-1
vallado-2013/Vallado, Fundamentals 4e (PDF)20131,135Comprehensive reference synthesizing the full SGP4 theory chain
sgp-4-rev-3/Vallado et al., AIAA 2006-6753-Rev3 (PDF)200694Final SGP4 revision: dual AFSPC/improved modes, error handling
vallado-sgp4-od-2008/Vallado & Crawford, AIAA 2008-6770 (PDF)200829SGP4 orbit determination: observations to TLE via differential correction
wakker-2015/Wakker, TU Delft (PDF)2015690Pedagogical reference: Lagrange equations, J2 rates, Kaula spectral theory
vallado-icatt-2010/Vallado, ICATT 2010 Tutorial (PDF)2010120Condensed teaching version: satellite visibility end-to-end pipeline
DocumentReason
Lane & Cranford (1969)Behind AIAA paywallObtained 2026-02-16
Crawford (1995)Unpublished, likely lostObtained 2026-02-16 (published in IJRS, not unpublished)
Vallado textbook (2013)Copyrighted commercial publicationObtained 2026-02-17 (Internet Archive)

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 models form two families, classical and modern:

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

TEME uses 4 of the 106 IAU-1980 terms. The IAU-2000 series replaced the 1980 model with a physically-based non-rigid Earth theory; IAU-2000B is a computationally cheaper subset of IAU-2000A. Despite having fewer terms (77 vs. 106), IAU-2000B achieves better accuracy (~1 mas vs. ~10 mas) through improved physical modeling.

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.

Every paper in this archive except one addresses the forward problem: given a TLE, predict where a satellite will be. Vallado & Crawford (2008) is the sole paper covering the inverse problem: given observations, produce a TLE.

The forward pipeline:

TLESGP4TEME position/velocity\text{TLE} \xrightarrow{\text{SGP4}} \text{TEME position/velocity}

The inverse pipeline:

Observationsbatch LSQequinoctialconvertKozai meanAlg. 94Brouwer meanTLE\text{Observations} \xrightarrow{\text{batch LSQ}} \text{equinoctial} \xrightarrow{\text{convert}} \text{Kozai mean} \xrightarrow{\text{Alg. 94}} \text{Brouwer mean} \rightarrow \text{TLE}

The inverse path requires a Kozai-to-Brouwer mean element conversion (Algorithm 94) because TLEs publish Kozai means but AFSPC fits internally with Brouwer theory. This round-trip is a source of subtle errors visible only when you close the loop: propagate forward, observe, fit new elements, and compare.

TLEs publish Kozai mean elements, but SGP4 uses Brouwer theory internally. These are not interchangeableKozai (1959) and Brouwer (1959) use different averaging procedures, so the resulting mean elements for the same osculating orbit are numerically different.

The Kozai-to-Brouwer conversion is iterative (Newton-Raphson on the short-period corrections). Vallado’s textbook (Section 9.3, Algorithm 94) provides the canonical procedure.

This distinction is invisible to most users because SGP4 handles the conversion internally. But anyone building an orbit determination pipeline (the inverse path) must get this right, or their generated TLEs will diverge from AFSPC’s catalog. The mean element trap is what makes the forward/inverse round-trip lossy.

BB^* is commonly described as a “modified ballistic coefficient” representing atmospheric drag. In practice, it is an arbitrary free parameter that absorbs all unmodeled forces — radiation pressure, maneuver residuals, atmospheric density errors, even gravity model deficiencies.

Key evidence:

  • BB^* can be negative, which is physically impossible for drag alone
  • BB^* is re-fitted at every TLE epoch and jumps discontinuously between updates
  • Lane & Cranford (1969) defined B0B_0 as a true ballistic coefficient (CDA/2mρC_D A / 2m \cdot \rho); the STR#3 transformation to BB^* introduces a mean-motion dependency that decouples it from any single physical quantity

STR#3 defines five models (SGP, SGP4, SDP4, SGP8, SDP8). Only SGP4 and SDP4 have ever been used operationally by JSpOC (formerly AFSPC). The entire 22,000+ object catalog has always been SGP4/SDP4.

SGP8/SDP8 were Hoots’ reformulation using Lyddane’s modified variables throughout — theoretically cleaner but never adopted for the catalog. Vallado’s textbook (p. 629) confirms AFSPC never transitioned. Rev 3 retains the code for completeness but there are no operational test vectors — any SGP8/SDP8 code path in a modern implementation is effectively dead code.