This is a field-based re-derivation of the same kelp self-shading model, computed a genuinely different way. Instead of testing pairwise disc overlaps between every pair of stipes (the 3D version's method), each stipe's canopy area is rasterised onto a 2D grid — x = position along the transect, y = height above the seafloor — as a leaf-area contribution at its own height row. A column's shade is then the exact top-down running sum of the grid, exponentiated through Beer-Lambert:
grid[row][col] += canopyArea_i / (columns spanned) at row = height_i
aboveArea[row][col] = Σ grid[row'][col] for every row' > row (cumulative sum, computed once per step)
I_i = I0 · exp( −k · aboveArea[row_i][col_i] )
Growth still follows the same saturating (Monod) light-response curve offset by a fixed respiration cost, so both models share one light compensation point I* where growth is exactly zero:
dh/dt = g_max · I_i /(I_i + I_k) − r_resp
I* = I_k · r_resp / (g_max − r_resp) (same constants as the 3D model → I* ≈ 4.0% of I0)
- Stand density — how many stipes seed the transect; denser stands self-shade sooner.
- Extinction coefficient k — how opaque the canopy is per unit blade area.
- Surface irradiance I₀ — ambient light at the sea surface.
- A stipe whose light stays below I* accrues stress; once accrued stress crosses a threshold it dies back and a new recruit germinates elsewhere on the transect a little later — the same self-thinning process, driven this time by a rasterised field instead of exact circle geometry.
The background heat-map is the light field itself — brighter bands near the surface, darkening wherever canopy has accumulated above, exactly the quantity the growth equation reads at each stipe's own row/column cell.