Flow field. The river is divided into real cross-section zones — pool, riffle, rapids, a waterfall approach and the spawning reach beyond it. By continuity (Q = A·v), a narrower channel forces faster flow: each zone multiplies the base flow speed by a fixed factor (pool ×0.45, riffle ×1.0, rapids ×1.85, waterfall approach ×2.3, spawning grounds ×0.35).
Swim energetics. Salmon (and fish generally) have two swimming regimes: a sustained/aerobic pace they can hold indefinitely, and a faster burst/anaerobic pace fuelled by a finite glycogen store that must later be repaid (Beamish 1978 sustained/prolonged/burst classification). Here sustained speed = 0.35 × burst capability. The fish always attempts to out-swim the local current by a small margin; when that requires exceeding sustained speed, it draws on its anaerobic reserve:
dReserve/dt = −k·(U_swim − U_sustained)² (swimming above sustained pace)
dReserve/dt = +r·(1 − Reserve/100) (recovering below sustained pace)
This is the cost-of-transport relation used throughout swim-performance physiology: excess energetic cost scales with the square of the speed above the sustainable baseline, relative to the water (not the ground) — a fish fighting a 2 m/s current at 3 m/s swim speed pays for 1 m/s of relative effort, not 3. If the reserve hits zero the fish is fatigued and can only hold a reduced pace until it recovers in slower water.
Waterfall leap. At the waterfall the fish must convert its burst swim speed into a leap. Real projectile physics sets the ceiling: launching at speed v straight up clears a height h only if v² ≥ 2gh, i.e. the maximum clearable height is
h_max = v_effective² / (2g), v_effective = burst_capability × (0.3 + 0.7·Reserve/100)
so a fatigued fish (low reserve) jumps measurably lower than a fresh one even with the same burst-speed slider. If the configured waterfall height exceeds h_max the leap fails: the fish is swept back into the rapids and loses a chunk of its reserve, exactly as real leap failures cost salmon energy before a retry. Watch "Max leap height" — it is computed live from the current effective burst speed and directly gates success against the waterfall-height slider.