Reserves Estimation & Material Balance
How much oil and gas is there, and how much can we recover? Learn volumetric STOIIP and GIIP, net-to-gross and contacts, recovery factors and drive mechanisms (solution gas, gas cap, water drive, compaction), the SPE-PRMS reserves classification (1P/2P/3P), probabilistic estimation with Monte Carlo (P90/P50/P10), material balance equations and the gas p/Z plot — with Python for volumetrics and a Monte Carlo reserves range.
Reserves are the most important number in the oil business: they determine company valuations, financing and development plans. Estimates evolve from volumetrics before production to material balance, decline curves and simulation as data accumulate.
Because the subsurface is uncertain, reserves are expressed as ranges — proved, probable and possible — and estimated with probabilistic methods.
An analogy
Estimating reserves is like guessing how much juice you can squeeze from a bag of oranges you can't open: you estimate how many oranges there are (volume), how juicy they are (porosity, saturation) and how hard you can squeeze (recovery factor).
Volumetrics
Gross rock volume from seismic structure maps and contacts (oil–water, gas–oil), multiplied by net-to-gross, porosity and hydrocarbon saturation, divided by the formation volume factor, gives in-place volumes. 7758 bbl per acre-ft converts field units.
Drive mechanisms and recovery
Natural energy sources and typical primary recovery:
- Solution-gas drive — 5–25% (rapid pressure decline, rising GOR)
- Gas-cap drive — 20–40%
- Water drive (aquifer) — 35–60% (pressure maintained, rising water cut)
- Gravity drainage — up to 60% in steeply dipping reservoirs
- Rock/compaction drive — significant in soft chalk and unconsolidated sands
Reserves classification (SPE-PRMS)
Resources are split into prospective (undiscovered), contingent (discovered, not yet commercial) and reserves (commercial, with a development plan). Reserves: proved (1P, ≥90% probability of exceeding), proved + probable (2P, 50%), proved + probable + possible (3P, 10%). Reserves also depend on price, costs and fiscal terms.
Material balance
Material balance treats the reservoir as a tank: withdrawals (oil, gas, water) equal expansion of fluids and rock plus water influx. For gas reservoirs without water drive, p/Z versus G_p is a straight line whose intercept gives GIIP; upward deviation signals aquifer support. The Havlena–Odeh method linearises the oil MBE to find N, gas-cap size m and water influx W_e. Reservoir simulation extends this to 3D.
Formulas
- Volumetric oil:
STOIIP = 7758·A·h·φ·(1 − S_w)/B_o (STB, A acres, h ft) - Volumetric gas:
GIIP = 43 560·A·h·φ·(1 − S_w)/B_g (scf, B_g ft³/scf) - Reserves:
Reserves = STOIIP × RF - Gas material balance:
p/Z = (p_i/Z_i)·(1 − G_p/G) - General oil MBE (Havlena–Odeh):
F = N·(E_o + m·E_g + E_fw) + W_e
Worked example: STOIIP
Given: A 2500 acres, h 60 ft, φ 0.22, S_w 0.25, B_o 1.25
Find: STOIIP.
- 7758 × 2500 × 60 × 0.22 × 0.75/1.25
Answer: 153.6 MMSTB
Worked example: GIIP from p/Z
Given: p_i/Z_i = 4500; after 30 Bscf, p/Z = 3150
Find: G.
- 1 − 3150/4500 = 0.30 = G_p/G
- G = 30/0.30
Answer: 100 Bscf
Worked example: Reserves
Given: STOIIP 153.6 MMSTB, waterflood RF 35%
Find: Reserves.
- 153.6 × 0.35
Answer: 53.8 MMSTB
Volumetric STOIIP and Monte Carlo range
# Volumetric STOIIP and recoverable reserves
A_acres, h_ft = 2500.0, 60.0
phi, Sw, Bo = 0.22, 0.25, 1.25
STOIIP = 7758 * A_acres * h_ft * phi * (1 - Sw) / Bo # stock-tank barrels
print(f"STOIIP = {STOIIP/1e6:.1f} million STB")
for RF in (0.10, 0.30, 0.45):
print(f"recovery factor {RF:.0%}: reserves {STOIIP*RF/1e6:.1f} MMSTB")
# Probabilistic range (P90/P50/P10) with simple Monte Carlo, fixed seed
import random
random.seed(1)
vals = []
for _ in range(20000):
a = random.triangular(2000, 3200, 2500)
h = random.triangular(45, 75, 60)
p = random.triangular(0.18, 0.25, 0.22)
s = random.triangular(0.20, 0.35, 0.25)
vals.append(7758 * a * h * p * (1 - s) / 1.25 / 1e6)
vals.sort()
print(f"P90 {vals[2000]:.0f}, P50 {vals[10000]:.0f}, P10 {vals[18000]:.0f} MMSTB")
# STOIIP = 153.6 million STB
# recovery factor 10%: reserves 15.4 MMSTB
# recovery factor 30%: reserves 46.1 MMSTB
# recovery factor 45%: reserves 69.1 MMSTB
# P90 121, P50 151, P10 185 MMSTBThe field holds ~154 million barrels in place, but reserves depend strongly on the drive mechanism and development (10% primary vs 45% with good waterflood/EOR). Monte Carlo turns input uncertainty into a range: there's a 90% chance STOIIP exceeds 121 MMSTB (P90) and 10% chance it exceeds 185 (P10).
Common mistakes
- Wrong: Adding P90s of fields to get a portfolio P90. — Right: Probabilistic sums need aggregation (P90s aren't additive).
- Wrong: Using gross instead of net pay. — Right: Apply net-to-gross cut-offs.
- Wrong: Ignoring aquifer in p/Z analysis. — Right: Curvature indicates water drive — straight-line GIIP overestimates.
Applications
- Field development plans: Sizing facilities and wells.
- Company valuation: Reserves reporting to regulators (SEC, DGH).
- Acquisitions: Probabilistic evaluation of assets.
- CO₂ storage capacity: Volumetric storage estimates.
Key takeaways
- STOIIP = 7758Ahφ(1 − S_w)/B_o.
- Recovery depends on drive mechanism.
- 1P/2P/3P = P90/P50/P10.
- p/Z straight line → GIIP.
Going further
- Havlena–Odeh analysis: Linearised MBE for drive identification.
- Uncertainty & experimental design: Multi-realisation geomodels.
- Aquifer models: Fetkovich and van Everdingen–Hurst influx.