One lake, two loads of phosphorus. Algae grow where light and nutrients meet, then shade the water below them and starve the plants on the bed.
The science
Light. Beer–Lambert with self-shading: I(z) = I₀ exp(−∫₀ᶻ (kw + kc B) dz'), B = chlorophyll (mg/m³), kc = 0.02 m²/mg.
Growth. μ = μmax(T) · P/(KP+P) · I/(KI+I), μmax(T) = 1.2·1.07T−20 d⁻¹. Equation per cell: ∂B/∂t = (μ − m)B − vs ∂B/∂z + Dz ∂²B/∂z² + Dx ∂²B/∂x² − u ∂B/∂x; phosphorus is taken up in proportion to growth (1 mg P per mg chl) and 60 % is recycled from dead and sunk cells, the rest is buried.
Secchi depth. zSD ≈ 1.7 / Kd (Poole–Atkins rule of thumb) with Kd = kw + kc·mean B of the top 3 m.
Critical depth (Sverdrup). In a fully mixed layer of depth D the mean growth is α I₀ (1 − e^{−K D}) / (K D) in the light-limited linear regime; the population can only grow when D is shallower than the depth where this equals the loss m. The checks verify both the closed form and the full model against it.
Simplifications. A 2D cross-section (no lake-scale circulation), a single phytoplankton group (no cyanobacteria buoyancy or toxins), constant daily-mean light, no zooplankton grazing, no stratification, and parameter values that are illustrative model values. Not a water-quality predictor. Educational only. Models built with Blender, scene by Three.js.