The water column is split into 18 depth layers. Each layer tracks algal biomass A and dissolved oxygen DO, coupled by light, nutrients, and vertical mixing:
Light (Beer-Lambert): I(z) = I0 * exp(-(k_w*z + k_a*ΣA))
Algae growth: dA/dt = r*A*(1-A/K)*I/(I+I_half) - m*A
DO balance: dDO/dt = P(A,I) - R(A) - D_decomp
+ ∂/∂z[ D_z(z) * ∂DO/∂z ] + reaeration
Nutrient loading raises the carrying capacity K, so more algae grows per unit light. During the day, photosynthesis P can push surface DO above saturation; at night only respiration R runs, so DO falls. Dead algae sink and decompose, consuming oxygen at depth — this is the same biochemical-oxygen-demand mechanism behind the Streeter-Phelps sag curve, just distributed over depth instead of downstream distance.
- Nutrient loading — sets algal carrying capacity K; heavier fertilizer/sewage runoff means a denser bloom.
- Thermal stratification — a strong thermocline sharply cuts the vertical diffusion coefficient Dz at mid-depth, isolating the bottom hypolimnion from surface reaeration — the classic setup for a summer dead zone.
- Wind mixing — scales surface reaeration and near-surface diffusion; strong wind resists stratification and reoxygenates the top layers.
- Storm mixing — a five-second burst of full-column turbulent mixing, showing how a single storm can temporarily break down stratification and flush oxygen to depth.
Real-world relevance: this feedback loop — nutrients → algal bloom → decomposition → hypoxia — drives real seasonal dead zones such as the Chesapeake Bay, Lake Erie's central basin, and the Gulf of Mexico's Mississippi plume.