DEV Community

Cover image for Building Deterministic Aviation Physics in TypeScript: Why the 120-Ft Rule Fails at High Density Altitudes
miad
miad

Posted on Originally published at aeroway.org

Building Deterministic Aviation Physics in TypeScript: Why the 120-Ft Rule Fails at High Density Altitudes

When building flight planning software or aeronautical calculation tools, modern web stacks often default to backend databases, serverless APIs, and session cookies.

However, thermodynamic physics and standard-atmosphere models don't require server roundtrips. Evaluating geopotential lapse rates, air density ratios (σ), and aerodynamic performance degradation can be executed with 100% deterministic, pure TypeScript engines running client-side in the browser.

In building Aeroway, an open-access aeronautical engineering and E6B calculation platform, we established strict architectural constraints: Zero tracking databases, immutable mathematical models, and typed domain boundaries.

In this technical breakdown, we explore how to implement closed-form standard-atmosphere equations in TypeScript and analyze where primary flight training heuristics diverge under extreme atmospheric conditions.


1. The Physics: Density Ratio (σ) vs. Aerodynamic Lift

Aerodynamic lift and engine horsepower are governed directly by ambient air density (ρ):

Lift Equation: L = ½ · ρ · V2 · S · CL

As ambient temperature rises or barometric pressure drops:

  1. Dynamic Pressure (q): Pitot-static instruments measure dynamic pressure (q = ½ · ρ · V2). In lower air density (ρ), an aircraft must travel across the ground at a substantially higher True Airspeed (TAS) to generate identical lift.
  2. Propeller Thrust: Propeller airfoils encounter fewer air molecules per revolution, degrading thrust output.
  3. Engine Mass Flow: Normally aspirated piston engines lose volumetric mass flow, reducing brake horsepower approximately by the density ratio (σ).

The compounding operational effect is non-linear: takeoff ground rolls expand quadratically, and climb gradients deteriorate.


2. Deterministic Pure TypeScript Engine

In Aeroway, every calculation engine is structured as an immutable pure function without external side-effects:

// src/lib/math/densityAltitude.ts

export interface DensityAltitudeInput {
  pressureAltitudeFt: number; // Geopotential Pressure Altitude (29.92126 inHg datum)
  temperatureC: number;       // Ambient Outside Air Temperature (OAT)
}

export interface DensityAltitudeResult {
  densityAltitudeExactFt: number;     // Closed-form ICAO Doc 7488 model
  densityAltitudeHeuristicFt: number; // FAA 120 ft/°C rule-of-thumb
  isaStandardTempC: number;           // Standard ISA temp at PA
  isaDeviationC: number;              // (OAT - ISA Temp)
  densityRatioSigma: number;          // Ambient density / Sea-level density (ρ / ρ0)
  divergenceErrorFt: number;          // Exact - Heuristic error bound
}

const T0_KELVIN = 288.15;              // Standard Sea-Level Temp (15°C)
const LAPSE_RATE_K_PER_FT = 0.0019812; // Standard troposphere lapse (1.9812°C / 1,000 ft)
const EXPONENT = 0.234969;             // (R * L) / (g0 - R * L) for standard dry air

export function calculateDensityAltitude(input: DensityAltitudeInput): DensityAltitudeResult {
  const { pressureAltitudeFt, temperatureC } = input;
  const ambientKelvin = temperatureC + 273.15;

  // 1. Standard ISA Temperature at Pressure Altitude
  const isaStandardTempC = 15.0 - (LAPSE_RATE_K_PER_FT * pressureAltitudeFt);
  const isaStandardKelvin = isaStandardTempC + 273.15;
  const isaDeviationC = temperatureC - isaStandardTempC;

  // 2. Pressure Ratio (delta) in standard troposphere (h <= 36,089 ft)
  const delta = Math.pow(1.0 - (LAPSE_RATE_K_PER_FT * pressureAltitudeFt) / T0_KELVIN, 5.25588);

  // 3. Temperature Ratio (theta)
  const theta = ambientKelvin / T0_KELVIN;

  // 4. Thermodynamic Density Ratio (sigma = delta / theta)
  const densityRatioSigma = delta / theta;

  // 5. Exact Closed-Form Density Altitude (ICAO Doc 7488/3)
  const densityAltitudeExactFt = 145366.45 * (1.0 - Math.pow(densityRatioSigma, EXPONENT));

  // 6. FAA Linear Rule of Thumb (120 ft per °C deviation)
  const densityAltitudeHeuristicFt = pressureAltitudeFt + (120.0 * isaDeviationC);

  return {
    densityAltitudeExactFt: Math.round(densityAltitudeExactFt),
    densityAltitudeHeuristicFt: Math.round(densityAltitudeHeuristicFt),
    isaStandardTempC: Number(isaStandardTempC.toFixed(1)),
    isaDeviationC: Number(isaDeviationC.toFixed(1)),
    densityRatioSigma: Number(densityRatioSigma.toFixed(4)),
    divergenceErrorFt: Math.round(densityAltitudeExactFt - densityAltitudeHeuristicFt),
  };
}
Enter fullscreen mode Exit fullscreen mode

3. Where Cockpit Heuristics Fail: Divergence Analysis

The classic FAA 120-ft rule of thumb (hDA ≈ hPA + 120 × [OAT − ISAtemp]) is a first-order linear approximation around standard sea-level conditions. While accurate enough for flight training below 5,000 ft, non-linear divergence widens significantly at higher altitudes and temperatures:

Airport Scenario PA (ft) OAT (°C) ISA Dev 120-Ft Rule Exact ICAO Model Heuristic Error
Sea Level Summer 0 ft +35°C ISA +20 2,400 ft 2,468 ft +68 ft
Denver (KDEN) 5,431 ft +38°C ISA +34 9,487 ft 9,705 ft +218 ft underestimation
Leadville (KLXV) 9,934 ft +25°C ISA +30 13,534 ft 13,783 ft +249 ft underestimation
Death Valley (L06) -211 ft +49°C ISA +34 3,869 ft 4,175 ft +306 ft underestimation

At high mountain airfields, relying solely on mental approximations underestimates the true aerodynamic density altitude by hundreds of feet.


4. Explore the Tools & Open Educational Resources


Standards: ICAO Doc 7488/3 • NOAA/NASA U.S. Standard Atmosphere (1976) • FAA-H-8083-25C (PHAK)

Top comments (0)