2021 · Problem B — Tackling the Drought
Mass balance Policy simulation Time series Scenario planningThe prompt, restated
Lake Mead, the reservoir behind Hoover Dam on the Colorado River, hit its lowest recorded elevation in summer 2021. The river serves roughly 40 million people across seven US states and Mexico, supplies water to 4–5 million acres of irrigated farmland, and produces a few gigawatts of hydroelectric power. The reservoir is governed by the 1922 Colorado River Compact and its operating rules, which divide flows between the Upper Basin and Lower Basin and trigger formal shortage declarations at specific lake elevations.
The team is asked to (1) build a model relating reservoir storage to inflows (Upper Basin runoff), outflows (legally mandated releases, evaporation, in-basin uses), and the operating rules, (2) project Lake Mead elevation forward 5–10 years under several climate scenarios — status-quo, continued mega-drought, and a modestly wetter recovery — (3) propose at least two policy interventions (cuts to lower-basin allocations, conjunctive groundwater use, tiered pricing, conservation mandates, dead-pool protection) and quantitatively show their impact, and (4) write a memo to the US Bureau of Reclamation describing the recommended policy and the risk of reaching dead pool (elevation ~895 ft).
Key modeling idea
This is a stock-and-flow / mass balance problem layered with a rule-based policy engine. The state variable is reservoir storage $S(t)$ (acre-feet or km³); the flows are stochastic inflows (driven by Upper Basin snowpack), deterministic mandated releases, and elevation-dependent evaporation. The interesting modeling decision is how to represent inflow uncertainty — a simple Markov chain over wet/normal/dry years is enough for HiMCM scope.
Suggested approach
- Step 1 — Mass balance. $S(t+1) = S(t) + I(t) - R(t) - E(t) - W(t)$ where $I$ is inflow, $R$ is downstream release, $E$ is evaporation (proportional to surface area), $W$ is in-basin withdrawal. Pull 30+ years of historical $I, R$ from USBR records to calibrate.
- Step 2 — Inflow generator. Fit a simple Markov chain over (wet, normal, dry) annual states using observed Lees Ferry flows. Sample 1000 future trajectories.
- Step 3 — Operating rules engine. Encode the actual USBR shortage tiers (Tier 0 / 1 / 2a / 2b / 3) as if/else on lake elevation; reduce Lower Basin deliveries accordingly. This is the policy lever.
- Step 4 — Monte Carlo (technique 10): run thousands of trajectories under each candidate policy; report the probability of hitting dead pool within 10 years.
- Step 5 — Compare policies on a small Pareto plot: P(dead pool) vs. total water cut imposed on users. A good answer recommends the policy with the largest risk reduction per acre-foot cut.
Data sources to consider
| Source | What you get |
|---|---|
| USBR Lower Colorado Region daily reports | Daily Lake Mead elevation, storage, releases |
| USGS gauge at Lees Ferry, AZ | Annual Upper Basin flow 1906–present |
| USBR 24-Month Study | Operating-rule documentation and projections |
| NOAA Climate Prediction Center | ENSO / drought outlooks for scenario design |
| USDA NASS | Lower Basin agricultural water-use baselines |
| Colorado River Compact (1922) text | The 7.5 MAF/yr Lower Basin allocation |
Common pitfalls and judge commentary patterns
- Forgetting evaporation. Lake Mead loses ~600,000 acre-feet/year to evaporation [illustrative]. Models without it drift high.
- Treating inflow as deterministic. The whole interesting result — risk of dead pool — vanishes without stochastic inflows.
- No coupling to Lake Powell. Strong papers explicitly note that Powell releases drive Mead inflows; weak papers treat Mead in isolation.
- "Just build a desal plant" recommendations — judges roll their eyes at any policy that isn't quantified inside the model.
- Missing the dead-pool elevation distinction (~895 ft) from the minimum power-pool elevation (~950 ft). They have different consequences.
Python sketch
A minimal Monte Carlo of Lake Mead over a 10-year horizon, with a 3-state inflow Markov chain and a simple shortage rule. Replace illustrative numbers with calibrated values.
import numpy as np
rng = np.random.default_rng(7)
# states: 0=dry, 1=normal, 2=wet (annual Upper Basin inflow, MAF)
inflow_mean = np.array([8.5, 12.0, 16.0]) # MAF
P = np.array([[0.55, 0.35, 0.10], # transition matrix (illustrative)
[0.30, 0.45, 0.25],
[0.10, 0.35, 0.55]])
S0 = 9.6 # MAF storage today (~30% full)
Smax = 28.9 # MAF capacity at full pool
dead_pool = 4.0 # MAF (~895 ft elevation, illustrative)
evap = 0.6 # MAF / yr
def release(S, base=9.0):
# tiered shortage rule on storage (proxy for elevation)
if S < 6: return base - 1.0 # Tier 2
if S < 8: return base - 0.5 # Tier 1
return base # full delivery
def trajectory(years=10):
s, state = S0, 1
hit = False
for _ in range(years):
state = rng.choice(3, p=P[state])
I = inflow_mean[state] * rng.normal(1.0, 0.10)
s = min(Smax, s + I - release(s) - evap)
if s <= dead_pool:
hit = True; s = dead_pool
return s, hit
N = 5000
ends = np.array([trajectory() for _ in range(N)])
p_dead = ends[:,1].mean()
print(f"P(dead pool within 10y) = {p_dead:.2%}")
Sensitivity & validation checklist
- Back-test: run the model on 2000–2020 inflows and check that simulated elevations track the real USBR record within reasonable bounds.
- Vary inflow Markov probabilities ±20% to test drought-persistence assumptions.
- Vary evaporation ±25% (climate warming scenario).
- Show how P(dead pool) responds to a 10%, 20%, 30% Lower Basin cut.
- Compare to USBR's published 24-Month Study projections for the first 24 months.