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:

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

Worked example: STOIIP

Given: A 2500 acres, h 60 ft, φ 0.22, S_w 0.25, B_o 1.25

Find: STOIIP.

Answer: 153.6 MMSTB

Worked example: GIIP from p/Z

Given: p_i/Z_i = 4500; after 30 Bscf, p/Z = 3150

Find: G.

Answer: 100 Bscf

Worked example: Reserves

Given: STOIIP 153.6 MMSTB, waterflood RF 35%

Find: Reserves.

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 MMSTB

The 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

Applications

Key takeaways

Going further