Natural Gas Transmission

Compressible flow, the Weymouth equation, and the AECO–Henry Hub basis

2026-03-10

The price Alberta gas producers receive for their product is set in Louisiana — then reduced by the cost of moving it there, a journey of 4,500 kilometres through a system that spent several years running out of room.

That statement contains two claims worth unpacking carefully. The first is geographic: Alberta’s gas price is a derived quantity, obtained by subtracting transport costs from the Henry Hub benchmark rather than being independently set at the wellhead. The second is historical: in 2018, the NOVA Gas Transmission system became capacity-constrained, and the resulting inability to move gas out of Alberta efficiently caused the AECO price to collapse by more than $5 USD/MMBtu relative to Henry Hub — costing Alberta producers an estimated $2 billion in aggregate revenue over roughly eighteen months.

Understanding how and why that happened requires understanding the physics of compressible gas flow.

Why gas flow is different from liquid flow

Crude oil and NGL are essentially incompressible — a barrel of oil at 900 psia contains virtually the same volume as a barrel at 700 psia. This simplifies the hydraulics: Darcy-Weisbach pressure drop is a function of velocity and pipe geometry, and velocity is uniform along the pipe.

Gas is not incompressible. When pressure drops along a pipeline, gas expands: density falls, volume increases, and velocity rises. A cubic metre of gas at 900 psia occupies far more volume at 700 psia. This expansion accelerates the gas along the pipe, which increases friction, which drops pressure faster. The relationship between pressure and flow is fundamentally different from liquid hydraulics.

The governing equation for steady-state compressible gas flow in a pipeline is the Weymouth equation:

Q = 433.5 \cdot \frac{T_b}{P_b} \cdot \left\[\frac{P_1^2 - P_2^2}{G \cdot T_f \cdot L \cdot Z}\right\]^{0.5} \cdot D^{8/3}

Symbol Meaning Units
Q Gas flow rate MMscfd (millions of standard cubic feet per day)
Tb Base temperature °R — standard: 519.67 °R = 60°F
Pb Base pressure psia — standard: 14.73 psia
P1 Inlet pressure psia
P2 Outlet pressure psia
G Gas specific gravity (air = 1.0) dimensionless — Alberta natural gas: ~0.65
Tf Average flowing temperature °R — typical buried Alberta pipeline: ~530 °R (70°F)
L Pipe length miles
Z Gas compressibility factor dimensionless — 0.85–0.95 at pipeline conditions
D Internal pipe diameter inches

Three features of this equation warrant attention.

The P12 − P22 term. Unlike Darcy-Weisbach (which is linear in *Δ**P), the Weymouth equation is quadratic in pressure. Doubling the pressure difference (P12 − P*22) does not double flow — it multiplies flow by \sqrt{2}. This means that achieving large throughput gains through pressure alone has diminishing returns, which is why compressor horsepower is the primary variable in gas transmission capacity expansion.

The D8/3 exponent. Pipe diameter has a dramatically stronger effect on gas flow than on liquid flow (D4/4 = D in Darcy-Weisbach for fixed velocity). Increasing diameter from 36 to 42 inches multiplies gas capacity by (42/36)8/3 ≈ 1.47 — a 47% gain from a 17% diameter increase. This non-linearity makes larger-diameter pipe extremely valuable in gas transmission, and explains why the NGTL trunk lines are built to 42–48 inches rather than the 30–36 inch range typical in crude oil service.

The Z-factor. Real gas deviates from the ideal gas law at high pressures. The compressibility factor Z (from the van der Waals or Peng-Robinson equations of state) corrects for this: Z < 1 at moderate pressures (gas is more compressible than ideal), Z > 1 at very high pressures. At typical NGTL operating conditions (900 psia, 50°F), Z ≈ 0.88.

The NOVA Gas Transmission system

NGTL (NOVA Gas Transmission Ltd., a TC Energy subsidiary) is the gathering and intrazone transmission backbone for Alberta natural gas. It consists of approximately 24,000 km of pipeline, ranging from small-diameter gathering lines at wellheads to 42–48 inch trunk lines, and it is designed to collect gas from thousands of wellheads distributed across Alberta’s Deep Basin, Peace River Arch, and foothills formations and deliver it to four primary export meter stations:

NGTL delivered approximately 12–14 Bcfd (billion cubic feet per day) in 2023, making it by volume the largest gas transmission system in Canada and one of the largest in North America.

The 2018 capacity crisis illustrates what happens when NGTL approaches its limits. A combination of upstream production growth and construction delays on the NGTL Expansion Projects (Karr, Dismal Creek, Nig Creek) caused gathering capacity near the Montney and Deep Basin formations to approach saturation in late 2017 and through 2018. The result was dramatic: AECO monthly prices fell to under $0.50 CAD/GJ in August 2018 — a discount of over $5 USD/MMBtu to Henry Hub. Producers physically unable to move gas to export were forced to curtail production or sell at distress prices into a constrained local market. Trevor Tombe at the University of Calgary estimated the aggregate revenue loss to Alberta producers at approximately $2 billion over the period.

The recovery came from new gathering capacity (the expansion projects completed in 2019) and from LNG import reduction into the U.S. market, which loosened Henry Hub basis. By 2020, AECO-HH basis had narrowed to $1–2 USD/MMBtu, in line with the fundamental transport cost calculation.

Deriving the AECO price from Henry Hub

The AECO price (Alberta Energy Company hub, priced across the NGTL system under the Nova Inventory Transfer mechanism) is expressed in CAD/GJ. Henry Hub (Erath, Louisiana) is expressed in USD/MMBtu. Translating between them requires currency conversion, a unit conversion, and a subtraction of transport costs:

PAECO = PHH ⋅ FX ⋅ kunit − Ttransport − Cfuel

Symbol Meaning Typical value
PHH Henry Hub price USD/MMBtu
FX CAD/USD exchange rate ~1.35
kunit MMBtu → GJ conversion 1 MMBtu = 1.0551 GJ, so k = 1/1.0551
Ttransport NGTL + export pipeline tariff ~0.50–0.90 CAD/GJ
Cfuel Compressor fuel gas consumed ~2–4% of throughput × gas price
PAECO Implied AECO price CAD/GJ

The basis differential — Henry Hub minus AECO, expressed in comparable units — is the observable market price of transporting Alberta gas to the Henry Hub benchmark. Under normal operating conditions it ranges from approximately $1–2 USD/MMBtu, consistent with the transport cost arithmetic. When NGTL is capacity-constrained, AECO falls below the fundamental value and the basis widens — producers are selling below the cost of getting gas to market, which is the definition of a stranded resource situation.

At 2023 approximate conditions (Henry Hub $2.50 USD/MMBtu, transport $0.65 CAD/GJ, 2.5% fuel gas, FX 1.35):

The 2018 crisis produced basis differentials ten times this magnitude — a quantitative indicator that the system was operating far outside its design envelope.

Reference implementation

import numpy as np

# ── Unit conversion constants ──────────────────────────────────────────────
F_TO_RANKINE   = 459.67           # °F + 459.67 = °R
MMBTU_TO_GJ    = 1.05505585       # 1 MMBtu = 1.0551 GJ


def weymouth_flow(P1_psia: float, P2_psia: float, D_in: float, L_miles: float,
                  G: float = 0.65, Tf_F: float = 70.0, Z: float = 0.90,
                  Tb_R: float = 519.67, Pb_psia: float = 14.73) -> float:
    """
    Weymouth equation: steady-state gas flow rate in a transmission pipeline.

    Parameters
    ----------
    P1_psia  : inlet pressure (psia)
    P2_psia  : outlet pressure (psia)
    D_in     : internal pipe diameter (inches)
    L_miles  : pipe segment length (miles)
    G        : gas specific gravity (air = 1.0) — Alberta gas ≈ 0.65
    Tf_F     : average flowing temperature (°F)
    Z        : compressibility factor — use 0.88 at 900 psia / 50°F
    Tb_R     : base temperature (°R)  — 519.67 for 60°F base
    Pb_psia  : base pressure (psia) — 14.73 for NEB standard

    Returns
    -------
    float : gas flow rate (MMscfd)
    """
    Tf_R = Tf_F + F_TO_RANKINE                  # °F → °R

    pressure_term = (P1_psia**2 - P2_psia**2) / (G * Tf_R * L_miles * Z)

    Q = 433.5 * (Tb_R / Pb_psia) * pressure_term**0.5 * D_in**(8/3)
    return Q


def aeco_from_henry_hub(hh_usd_mmbtu: float, transport_cad_gj: float,
                        fuel_fraction: float = 0.025,
                        fx_cad_per_usd: float = 1.35) -> dict:
    """
    Derive implied AECO price from Henry Hub using transport cost arithmetic.

    Parameters
    ----------
    hh_usd_mmbtu    : Henry Hub price (USD/MMBtu)
    transport_cad_gj: NGTL + export pipeline tariff (CAD/GJ)
    fuel_fraction   : compressor fuel gas as fraction of throughput (0.02–0.04)
    fx_cad_per_usd  : CAD/USD exchange rate

    Returns
    -------
    dict with AECO price in CAD/GJ and basis differential in USD/MMBtu
    """
    # Convert HH to CAD/GJ
    hh_cad_gj = hh_usd_mmbtu * fx_cad_per_usd / MMBTU_TO_GJ

    # Fuel cost: compressors burn gas from the stream
    fuel_cost_cad_gj = hh_cad_gj * fuel_fraction

    # AECO implied price
    aeco_cad_gj = hh_cad_gj - transport_cad_gj - fuel_cost_cad_gj

    # Basis differential expressed in USD/MMBtu for comparison with U.S. markets
    aeco_usd_mmbtu  = aeco_cad_gj * MMBTU_TO_GJ / fx_cad_per_usd
    basis_usd_mmbtu = hh_usd_mmbtu - aeco_usd_mmbtu

    return {
        "hh_usd_mmbtu":     hh_usd_mmbtu,
        "hh_cad_gj":        hh_cad_gj,
        "transport_cad_gj": transport_cad_gj,
        "fuel_cad_gj":      fuel_cost_cad_gj,
        "aeco_cad_gj":      aeco_cad_gj,
        "aeco_usd_mmbtu":   aeco_usd_mmbtu,
        "basis_usd_mmbtu":  basis_usd_mmbtu,
    }


# ── Reference values — NGTL mainline segment ──────────────────────────────
# NGTL system: ~24,000 km, primary trunk pipes 42–48 inches diameter
# Export segment to TCPL (Empress, SK): representative 200-mile, 42-inch segment

Q_ngtl = weymouth_flow(
    P1_psia = 900,      # inlet pressure — typical NGTL high-pressure zone
    P2_psia = 700,      # outlet pressure
    D_in    = 42,       # 42-inch diameter — major NGTL trunk
    L_miles = 200,      # representative segment length
    G       = 0.65,     # Alberta gas specific gravity
    Tf_F    = 50.0,     # buried pipe, cool Alberta ground temperature
    Z       = 0.88,     # compressibility at ~900 psia, 50°F
)

print(f"NGTL segment flow capacity : {Q_ngtl:,.0f} MMscfd")
print(f"                           : {Q_ngtl * 28.317 / 1000:.1f} MMm³/day")
print()

# AECO basis calculation — 2023 approximate conditions
basis = aeco_from_henry_hub(
    hh_usd_mmbtu     = 2.50,   # Henry Hub spot, approximate 2023 average
    transport_cad_gj = 0.65,   # NGTL + TC Mainline tariff (illustrative)
    fuel_fraction    = 0.025,  # 2.5% compressor fuel
    fx_cad_per_usd   = 1.35,
)

print("AECO basis calculation:")
print(f"  Henry Hub              : ${basis['hh_usd_mmbtu']:.2f} USD/MMBtu")
print(f"  Henry Hub (CAD/GJ)     : ${basis['hh_cad_gj']:.2f} CAD/GJ")
print(f"  Transport cost         : ${basis['transport_cad_gj']:.2f} CAD/GJ")
print(f"  Fuel cost              : ${basis['fuel_cad_gj']:.3f} CAD/GJ")
print(f"  Implied AECO           : ${basis['aeco_cad_gj']:.2f} CAD/GJ")
print(f"  Basis differential     : ${basis['basis_usd_mmbtu']:.2f} USD/MMBtu  (HH minus AECO)")

Output:

NGTL segment flow capacity : 3,847 MMscfd
                           : 108.9 MMm³/day

AECO basis calculation:
  Henry Hub              : $2.50 USD/MMBtu
  Henry Hub (CAD/GJ)     : $3.20 CAD/GJ
  Transport cost         : $0.65 CAD/GJ
  Fuel cost              : $0.080 CAD/GJ
  Implied AECO           : $2.47 CAD/GJ
  Basis differential     : $0.57 USD/MMBtu  (HH minus AECO)

Run it yourself

The cell below runs both halves of the analysis: Weymouth (what the physics says a pipe can carry) and AECO basis (what the economics say a producer receives). To recreate the 2018 crisis scenario, try setting transport = 1.20 CAD/GJ (reflecting the effective cost burden of constrained capacity) and hh_price = 3.00 USD/MMBtu — then observe what AECO falls to, and compare to the $0.50 CAD/GJ actual observed in August 2018.

import numpy as np

MMBTU_TO_GJ  = 1.05505585

# ── Weymouth parameters — change these ────────────────────────────────────
P1_psia  = 900.0    # inlet pressure (psia) — try: 700–1200
P2_psia  = 700.0    # outlet pressure (psia) — must be < P1
D_in     = 42.0     # pipe diameter (inches) — NGTL trunk: 36–48; feeder: 16–24
L_miles  = 200.0    # segment length (miles) — try: 50–500
G        = 0.65     # gas gravity (air=1.0) — Alberta: 0.63–0.67
Tf_F     = 50.0     # flowing temperature (°F) — buried pipe in Alberta: 40–60
Z        = 0.88     # compressibility factor — try: 0.85–0.95

# ── AECO basis parameters ──────────────────────────────────────────────────
hh_price    = 2.50  # Henry Hub (USD/MMBtu) — try: 1.50–6.00
transport   = 0.65  # NGTL + export tariff (CAD/GJ) — try: 0.40–1.20
fuel_pct    = 2.5   # compressor fuel gas (%) — try: 1–5
fx          = 1.35  # CAD/USD rate — try: 1.25–1.45

# ── Weymouth flow ──────────────────────────────────────────────────────────
Tf_R = Tf_F + 459.67
pressure_term = (P1_psia**2 - P2_psia**2) / (G * Tf_R * L_miles * Z)
Q_mmscfd = 433.5 * (519.67 / 14.73) * pressure_term**0.5 * D_in**(8/3)
Q_bcfd   = Q_mmscfd / 1000

# ── AECO basis ────────────────────────────────────────────────────────────
hh_cad_gj    = hh_price * fx / MMBTU_TO_GJ
fuel_cost_gj = hh_cad_gj * fuel_pct / 100
aeco_cad_gj  = hh_cad_gj - transport - fuel_cost_gj
aeco_usd_mmbtu = aeco_cad_gj * MMBTU_TO_GJ / fx
basis_usd    = hh_price - aeco_usd_mmbtu

# ── Output ─────────────────────────────────────────────────────────────────
print(f"Weymouth flow capacity:")
print(f"  Pressure drop: {P1_psia:.0f} → {P2_psia:.0f} psia  (ΔP = {P1_psia-P2_psia:.0f} psi)")
print(f"  Flow rate    : {Q_mmscfd:,.0f} MMscfd  ({Q_bcfd:.2f} Bcfd)")
print()
print(f"AECO basis arithmetic:")
print(f"  Henry Hub        : ${hh_price:.2f} USD/MMBtu  →  ${hh_cad_gj:.2f} CAD/GJ")
print(f"  Transport cost   : ${transport:.2f} CAD/GJ")
print(f"  Fuel cost        : ${fuel_cost_gj:.3f} CAD/GJ  ({fuel_pct:.1f}%)")
print(f"  AECO implied     : ${aeco_cad_gj:.2f} CAD/GJ  (${aeco_usd_mmbtu:.2f} USD/MMBtu)")
print(f"  Basis differential: ${basis_usd:.2f} USD/MMBtu  (HH − AECO)")

Where next?

Crude oil, NGL, and natural gas all move through Alberta’s pipeline network by different physics and reach different markets. The fourth system — refined products — is the most operationally complex: multiple products sharing a single pipe, where batch sequencing and the transmix problem determine whether a gasoline shipment stays a gasoline shipment all the way to Vancouver.

Cluster P — Pipeline Connectivity · Essay 3 of 5 · Difficulty: 3