Tide opens and floods the rocks; hunger, boat noise and heat decide who is on them. All numbers are model values, not data from a real colony.
Each button runs 4 simulated days headless for several values (same seed) and reports the colony's behaviour.
The science
Tide. Two constituents: h(t) = h₀ + AM2 cos(2πt/12.42 h − φ₁) + AS2 cos(2πt/12.00 h − φ₂); their beat gives spring and neap tides every 14.77 days. A rock shelf is dry when its height exceeds h(t) + 0.12 m; capacity = dry shelves, one seal per 2.5 m².
Haul-out. Tendency to be hauled out: P = 1/(1 + e−3 (hthr − h)) · ftemp · fsun · fnoise with a heat penalty above 25 °C and a strong penalty for 30 min after a noise flush. Hungry seals leave earlier.
Dive and energy. Metabolic power from Kleiber: P = 3.4 m0.75 W, scaled by activity (2.5 in the field, ×dive multiplier while diving). Aerobic dive limit ADL = m cO₂ EO₂ / (k P), with cO₂ = 45 mL O₂/kg and 20.1 kJ per litre (a model value of the right order for phocids). Fish intake follows Holling's type II response f(ρ) = a ρ / (1 + a ht ρ / mf) (a = 0.02 m³/s, ht = 20 s, fish mass 50 g). Fish density on a 64×64 grid: ∂ρ/∂t = D∇²ρ − ∇·(vρ) + rρ(1 − ρ/K) − predation, conservative upwind + diffusion scheme, no-flux walls.
Noise. SPL(r) = SL − 20 log₁₀ r − α r (spherical spreading plus absorption); a flush happens with probability logistic((SPL − 120 dB)/3) when a boat passes. The 120 dB re 1 µPa threshold is a model value.
Population. A three-stage (pup, juvenile, adult) matrix; pup survival is 0.75 × nursing factor (share of time pups spend hauled with the colony) × noise factor. The projection assumes every future year looks like the recent days.
Honest limits. Model seals are agents with simple rules, not individual behaviour data; the heat map is simulated fish, not telemetry; no predators are shown (risk would only be a hazard rate); one species, mean parameters, no disease, a 2-D fish map with a fixed 12 m column. Assets built with Blender; scene by Three.js.