Trees are planted along a 1D transect and grow upward. Light through the canopy follows the Beer–Lambert law, using the cumulative leaf area index (LAI) of every crown above a given depth:
I(depth) = I0 · e^(−k · LAI_above)
For every tree, LAI_above is integrated column-by-column from the crowns of taller neighbours that overlap its own crown footprint. The light a tree actually receives, I_top, then drives its growth through a Michaelis–Menten (light-saturation) response, the same functional form used for leaf photosynthesis–irradiance curves, multiplied by a logistic term that caps height at the species' asymptotic maximum:
dh/dt = Gmax · I_top/(I_half + I_top) · (1 − h/Hmax)
Trees whose I_top stays below the light-compensation point for too long accumulate carbon debt and die, opening a gap that a new seedling recruits into — the same mortality/recruitment loop used in forest gap models (JABOWA/SORTIE-style). Each tree also belongs to a species guild with its own genetic height ceiling (closed-canopy, sub-canopy or emergent, roughly 55/35/10% of recruits) — the same guild structure a real mixed rainforest has — so the stratified profile is stable rather than everything eventually growing into one uniform layer. Run the stand forward and three strata separate out on their own:
- Emergent (gold) — a few individuals that outrace their neighbours into full sun.
- Closed canopy (green) — the bulk of the stand, self-shading at a fairly uniform height.
- Understory (dark, suppressed) — trees stuck below the closed layer, growing slowly on whatever light leaks through.