Skip to content

Plants

Each plant is one unit of its growth form — a carpet patch, a sword, a rhizome clump — with a condition and an energy budget, on the vitality model. It reads light at its own height, under whatever crowns and green water stand above it and through the film on its leaves, and what that light fixes fills its reserve. Uptake fills four nutrient stores from the water and the bed. The reserve pays maintenance first, then growth, paced by the emptiest store, and a plantlet built on the parent and cut loose at its form’s size. Low condition sheds tissue.

MechanicStatusWhy
Photosynthesis on PARsettledJassby–Platt tanh(PAR/Ik), per plant, on the light at its own mean leaf against its own saturating irradiance.
Rated by leafsettledPhotosynthesis, maintenance, plant power and tissue run on leaf area, in rate units of 500 cm², so a full sword counts for more than a full carpet patch.
Metabolic pacesettledEvery flora fixes and burns at its growth rate against a leaf at 1, so a monte carlo’s leaf runs 1.8×, an anubias’s 0.3×, green water 10× and film 4×. Maintenance, mobilisation, uptake and repair run on one Q10.
Temperature on photosynthesismissingWhat a plant fixes carries no temperature pace, so a cold tank’s flora fix at the reference pace and burn at their Q10.
Carbon–oxygen exchangesettledOne yield, run both ways: what the reserve takes in is fixed and everything burned releases it, oxygen derived at the molar ratio rather than from a second constant.
MaintenancesettledOwed around the clock and paid first. Oxygen paces only what a plant takes in and mobilises, never the upkeep it owes.
The shortfallsettledMaintenance the reserve cannot pay is a damage rate off the hour’s own budget: a plant starves when its reserve runs out, not when a day runs dark.
ReservesettledPhotosynthate in grams, up to full per gram of tissue. A full reserve caps photosynthesis, and it carries a plant through the night.
StoressettledOne per nutrient, above what the tissue itself carries, filled toward Q_max past need: a planting is a nitrate sink between doses.
PlantletsettledThe reserve’s other share builds the next unit on the parent, hour by hour, and cuts it loose the hour it holds its form’s size.
Size of a unitsettledSize is the tissue a unit holds against a grown one. Growth tapers to nothing at 100, so no ceiling clamps it.
Self-shadingsettledA unit’s own crown shades its leaves, so a plant too big for its light sheds to a size its light holds, with no switch.
VigoursettledEach unit draws its own offset on its assimilation ceiling at birth, so clones in like light grow and bud apart.
SheddingsettledA rate reading a stock — the square of the condition deficit, zero at full condition, with no threshold in it. The store a shed leaf held stays with the plant.
DeathsettledCondition reaching 0, as for a fish. A unit shed to a speck lives while it has condition: it repairs and regrows, or keeps losing condition and dies.
Epiphyte footprintscaffoldingA java fern or anubias on the rock claims floor like a rooted plant; there is no hardscape budget.
NitratesettledLog dose past the plant’s own edge, the fish shape at an edge only a runaway doser reaches.
UptakesettledEach store asks what it lacks; every form meets it on its own Monod against a per-species demand, in the water and the bed. Growth answers the emptiest store, never a reading off the water.
Nitrogen formsettledAmmonia first, at a fraction of nitrate’s half-saturation, and nitrate for what ammonia leaves. Each form is drawn on its own pooled Monod, so neither is overdrawn.
Root feedingsettledA fixed root share by growth form: a sword fills most of its stores from the bed, a carpet half, an epiphyte none. No species is refused a bed — a rooted plant in untabbed gravel runs its stores down until tabbed.
Carbon limitationsettledMonod on dissolved CO₂, half rate at the species’ carbon-need half-saturation. It scales photosynthesis and the CO₂ income channel, and never damages: a carbon-short plant fixes and grows less.
Tolerance bandssettledTemperature and pH earn most at the band’s centre and nothing at its edge, where damage starts from zero: net is continuous across every edge.
Shaded by the bloomssettledThrough light alone: green water in the column darkens a leaf by the depth above it, film coats every leaf at its coverage (Light). A bloom costs a plant photosynthate — never a damage of its own.
CompositionsettledTissue and reserve are carbohydrate, CH₂O, and tissue carries Q_min of each nutrient, the culture floors of the macrophyte literature; its stores run to Q_max. Every species shares one composition, far under food’s.
Plant nutrient loopsettledA plant holds what it took up, in tissue and stores; shed tissue returns as waste at Q_min, a dead plant’s stores with it, and rots back to the water. Carbon, N, P, K and Fe are conserved by construction.
General hardnessscaffoldingA damage-only tolerance band per species, and a small draw beside the nitrate that tissue never returns — waste carries no calcium. Calcium has no store, so soft water stresses a plant but never starves it.

Five species, each of one growth form, in three tables: how each grows, the light it lives on, and the water it tolerates.

SpeciesGrowth rateCO₂ needNutrient demandHardiness
Anubias0.3lowlow0.75
Java Fern0.5lowlow0.7
Amazon Sword1.0mediummedium0.5
Dwarf Hairgrass1.5highhigh0.3
Monte Carlo1.8highhigh0.3

Anubias and java fern attach to the scape; the sword and the carpets root in the bed.

SpeciesTolerable PARSaturates at, IkRated day
Anubias8–⁠70160.23
Java Fern10–⁠90200.29
Amazon Sword20–⁠120400.58
Dwarf Hairgrass25–⁠200500.72
Monte Carlo30–⁠200600.86

PAR is in µmol/m²/s and the rated day — the day of light the species is rated to live on — in mol/m²/d. Both derive from the band’s low end — saturation and the day’s light on Light.

SpeciesTemperaturepHGH
Anubias18–⁠30 °C5.0–⁠8.01–⁠20 dGH
Java Fern18–⁠30 °C5.0–⁠8.01–⁠20 dGH
Amazon Sword20–⁠28 °C5.5–⁠7.82–⁠20 dGH
Dwarf Hairgrass20–⁠28 °C5.0–⁠7.81–⁠18 dGH
Monte Carlo20–⁠28 °C5.0–⁠7.81–⁠15 dGH

pH and GH bands are the generous published ranges, wide enough for aqua soil under CO₂ and hard tap alike. Past an edge the damage grows linearly with the distance, per °C, pH unit or dGH (temperatureStressSeverity, phStressSeverity, ghStressSeverity). pH is already a log scale, so linear in pH is log in acidity. Temperature and pH also earn inside their bands; GH is damage alone.

A plant’s size is how full one unit of its growth form is, in % — 100 is a grown patch, specimen or clump — read off the tissue its budget holds. The form fixes what that means.

FormCarpetRosetteAttached
SpeciesDwarf Hairgrass, Monte CarloAmazon SwordAnubias, Java Fern
One unit isa patcha specimena rhizome clump
Full height5 cm40 cm20 cm
Height grows asfull at any size — it spreads acrosssize^⅓size^⅓
Footprint100 cm²700 cm²200 cm²
Leaf area index2.52.02.5
Rate units at full0.52.81.0
Plantleta runner rooting a tuft, 5 % of a patcha runner plantlet, 10 %a rhizome branch on three or four fronds, 25 %
Root share r0.5 — half from each0.7 — feeds mostly from the bed0 — feeds from the water

Leaf area is the form’s leaf area index over its footprint, in proportion to size, and a rate unit is 500 cm² of it, weighing 3 g of organic matter. Size says how full the unit is: it drives growth’s taper, the height and the self-shading. Leaf area says how much plant there is: it drives every flux the tank sees, and the plant’s metabolism runs it at its growth rate. No crown stands taller than the water.

Each plant’s carbon capacity is its leaf in rate units at its growth rate, times the light response at its mean leaf and its oxygen pace. The planting, the blooms and their spores draw on the dissolved CO₂ together, each on its own Monod read at the CO₂ the hour leaves, so a dense planting slows its own draw and never takes the water’s last milligram. Species differ in how much carbon they need to run near their ceiling, not in a floor that kills:

CO₂ needOn 4 mg/LOn 25 mg/L
low73 %94 %
medium57 %89 %
high33 %76 %

So a carpet in an uninjected tank grows slowly on a thin carbon income, and a sword or an epiphyte hardly notices the injector.

What is offered fills the reserve, and only what the reserve takes is fixed: a plant with a full reserve takes only what it burns, so a plant whose stores can’t pay for growth fills with carbon it cannot spend and draws little CO₂.

DirectionCarbonOxygen
Photosynthesisthe CO₂ fixed into what the reserve takesderived from the carbon fixed, at CO2_TO_O2_MASS_RATIO
Respirationeverything the budget burns — maintenance, the overhead of building, repair, tissue burned starvingderived from the carbon released, same ratio

One reaction run both ways, so one yield, and the oxygen partner is not a second knob. A carbon-starved tank stops producing oxygen because there was no carbon to pay for it.

Maintenance is quoted against the rate at saturating light and carbon; on the 4 mg/L an uninjected tank holds it is 4–9 % of what a plant actually fixes, at or just below the bottom of the 5–15 % the macrophyte literature reports. A planting under a fixture too dim to clear that burns more than it fixes and draws oxygen with the lamps on.

StockFills itDrains itUnit
UnitsPlanting; a plantlet cut looseDeath; removalplants
budget.structureGrowthShedding; maintenance nothing else pays; trimmingg — size is it over a grown unit’s
budget.reservePhotosynthesis, up to fullMaintenance, growth, the plantlet’s buffer, repairg
budget.offshootBufferThe reserve’s other shareA plantlet cut loose; maintenance the release leaves unpaidg of plantlet
budget.storesUptake from the water and the bedGrowth and a plantlet cut loose, at Q_min; into waste at deathmg of each nutrient
conditionBenefits; repair paid from the reserveStressors%, normal at 100
oxygen · co2Photosynthesis · respirationRespiration · photosynthesismg/L
ammoniaFish and rot, elsewhereThe stores’ nitrogen, before nitrate’s, from what the colony left; AOB oxidation, elsewheremg, as NH₃
nitrate · phosphate · potassium · ironDosing; the bed’s leak; nitrification for NO₃, and rot and fish excretion for the rest, elsewhereThe stores — nitrate only for the nitrogen ammonia leavesmg
The bed’s nutrientsAqua soil and root tabs (Equipment)Root feeders’ stores; the leakmg
wasteShed tissue, at Q_min with its reserve; a dead plant, stores and allRot and settling, elsewhereg, with its content

A plant is planted fed and stocked, as a shop sells it: its reserve full, every store full, nothing toward a plantlet, at full condition.

The plant’s hour is a Dynamic Energy Budget (DEB, Kooijman) on Droop cell quotas, the same one a fish’s is, with nutrient stores beside the carbon one, paced by the hour’s Q10.

StepWhat happens
UptakeEach store asks what it lacks of full, closing first order at storeFillDays from saturating water; the pools deliver at their own Monod share (Uptake)
PhotosynthesisFills the reserve, up to reserveCapacity grams a gram of tissue
MobilisationThe reserve releases at DEB’s rate — a fuller reserve releases more — and the oxygen pace slows it in water short of air
SomasomaShare, κ, of the release pays maintenance first, then builds tissue at its price, 1 / growthEfficiency grams of reserve a gram — through the taper and at the Droop limit, taking its Q_min out of the stores
PlantletThe other share builds the next unit in the offshoot buffer, at the same price and Droop limit
ShortfallMaintenance the soma’s share cannot pay is drawn from the plantlet’s share, then its buffer, then tissue burned — and the share left unpaid is a damage rate
RepairThe reserve pays for the hour’s repair at the plant’s pace (Vitality)

What growth and the plantlet can’t use stays in the reserve, so a plant whose stores run low holds its photosynthate rather than spending it. The hour is integrated in slices, each reading its own reserve and stores, so the budget holds at any pace.

The Droop limit is each store’s density read as a Monod against Q_min, the emptiest store ruling. It never reaches 1: on full stores a plant runs at about 0.73, nitrogen ruling. Growth runs at it; income and harm read it as a share of that full-store limit.

The taper is the room a unit has left: growth slows as it fills and stops at 100, so size approaches full and nothing clamps it. Leaf area scales with tissue, so growth runs in proportion to the plant — DEB’s V1-morph — and a young unit grows on a logistic toward full. A planting compounds by adding units.

A plant feeds on two pools: the water column and the bed’s store. Its growth form’s root share r fixes how much of its stores it fills through its roots. Every form a pool holds saturates on its own Monod curve, at the plant’s demand tier times the form’s half-saturation, and the two pools weigh in by where the plant feeds.

Ammonia goes straight into protein where nitrate has to be reduced first, so a plant takes ammonia first, half-saturating at a twentieth of nitrate’s ppm, and asks nitrate only for what ammonia leaves, in the same hour. The bed holds its nitrogen as nitrate, and its ppm reads its store against the tank’s capacity. A dry tank feeds nothing from either pool.

Demand tierNH₃ and NO₃ · PO₄K · Fe
Low0.30.05
Medium0.60.15
High11

Demand scales how little a plant can make do with. An Anubias fills its potassium and iron stores at half pace on a twentieth of the ppm a carpet needs, so the trace fish food leaves in an undosed tank goes a long way for it.

The stores ask; the pools decide how much arrives. Each pool delivers each form through one Monod over every request on it, plants and blooms in the same call (Algae), so nothing is served before anything else, every request is met at the same fraction of its share, and no pool goes below zero.

A plant keeps taking up past need until its stores are full — luxury uptake. Between doses a high-tech planting draws 0.2–1 ppm of nitrate a day, and a lightly stocked planted tank runs its water down to no nitrate or phosphate.

Calcium and magnesium are drawn from the water on their own Monod curve, off the nitrogen actually taken from either pool, counted as nitrate (under Key tunables), and are not returned. The nitrogen moves KH as it goes in: a proton out per ammonia, one in per nitrate (Water & gases).

Tissue is the organic matter it rots into: carbohydrate, 0.40 g of carbon a gram, carrying Q_min of each nutrient — the subsistence quota, the culture floors of the macrophyte literature — and the stores hold what is taken up above it, up to Q_max. Food’s 8 % nitrogen is past a macrophyte’s luxury top; a plant’s floor is a fraction of it.

NPKFe
Q_min, mg/g120.840.05
Q_max, mg/g456250.25

Every species shares one composition, its sources cited beside the values in the config; each kind of bloom carries its own (Algae).

Every benefit channel is earned on the plant’s reserve density times that share of its Droop limit: good water is worth nothing to a plant that has burned its reserve or run its stores dry. Three peaks of 0.125 %/h make a budget of 0.375 %/h on a full reserve, full stores and band centre. Light reaches income through the reserve it fills, so a fed plant earns through the night.

ChannelEarns whenAt its best
CO₂scales with the species’ carbon Monodco2BenefitPeak
Temperatureinside tolerableTemp, most at its centre, nothing at its edgestemperatureBenefitPeak
pHinside tolerablePH, most at its centre, nothing at its edgesphBenefitPeak
StressorChargesPer
Starvationmaintenance the hour left unpaidshare of the hour’s upkeep
Light highPAR at the crown top over the band’s high end, while the lamp is onPAR
Temperature · pH · GHoutside the species band°C · pH unit · dGH
Nutrient deficiencythe Droop limit short of droopEdge of its full stores’share of the edge
Nitratepast the plant’s own edgee-fold over

Deficiency starts under droopEdge of the limit full stores reach — 0.3 for a plant, where its nitrogen store has fallen to a sixth of full, near the critical 1.3 % of Gerloff & Krombholz — so the edge sits under full stores at any quotas. Hardiness scales every stressor by 1 − hardiness except nitrate, whose edge it carries out by the same factor a fish’s is.

A plant starves on its reserve, not on the day: the reserve carries it through the night, and in the dark it pays maintenance as long as it can. As it runs low the soma’s share stops covering maintenance: growth stops, and the share unpaid harms the plant at starvationSeverity while the plantlet’s share pays it, then the plantlet’s buffer, and last tissue burned for fuel. Budding stops next, and low condition sheds.

Stocked, in total darknessReserve under a tenthCondition starts to fallDead
Monte Carlo3.2 d4.2 d17 d
Dwarf Hairgrass3.9 d5.0 d18 d
Amazon Sword5.8 d7.5 d26 d
Java Fern11.6 d15 d48 d
Anubias19 d25 d68 d

Reserve turns over with growth rate and hardiness stretches the melt, so the slow growers outlast the fast. The hobby’s three-day blackout leaves even a carpet’s condition whole.

A plant reads light at its own height, through the water and the crowns above its leaves — the canopy — and the thinner its own crown, the more of that light its leaves get. The blooms take their share on the way (Light): green water the more the deeper a leaf stands, so a carpet goes dark before a sword, and film the same share of every leaf, which costs a light-hungry plant more than one that lives on little.

That gives a starved plant a size it can hold. A plant too big for its light cannot pay its upkeep: its reserve drains, the shortfall harms it, and it sheds; its crown thins, its leaves read more light, and it stops where a day’s photosynthate meets a day’s maintenance. A plant with light to spare grows, and growth shades it again. Between the two it settles — smaller, not dead. Only light too dim for even a sparse unit to break even kills it.

Every other crown that reaches above a plant’s mean leaf shades it, at odds set by that crown’s share of the floor (the canopy): a tall planting darkens what grows under it, and carpet patches side by side shade each other. Shedding relieves only a plant’s own shade, so an understory plant under taller crowns stays in their shade as it shrinks. A planting therefore spreads until its lowest units sit at break-even — short units lose first, and the tank carries as much leaf as its light holds. An overgrown tank is dark, not dead.

ReadingIsThe keeper lowers it by
Floor coverevery unit’s footprint over the floor, Σ footprint / (2 × depth²); past 1 the planting has outgrown its floorthinning — removing units
Floor shadethe share of the substrate light the canopy takes before the floor (Light)trimming or thinning
Floor lightthe fixture’s rating carried to the floor through the water, the green water and the canopytrimming, thinning, or clearing green water

The reserve’s other share, 1 − somaShare, builds the next unit in the offshoot buffer as growth builds the parent. Once the buffer holds a unit at its growth form’s plantlet size and the stores hold its Q_min, it is cut loose, after vitality and losses settle.

  • A new unit of the family. Its parent’s species and family, at full condition, with its own vigour and its share of the parent’s reserve and of the stores past Q_min, so parent and plantlet stand at one density of both. It acts from the next hour.
  • Cadence is the budget’s. Grown and fed freely, a carpet patch sends a runner every two days, a sword throws a plantlet every six, a java fern branches every month and an anubias every fifty days. In the setup tanks a sword parent buds about every 18 days, a java fern every 55 and an anubias every 78.
  • Propagation never tests space. Plantlets land whatever the floor cover; crowding and the canopy decide which of them live.

The form sets the plantlet’s shape and the words its plant-propagated log entry uses — “Amazon Sword threw a plantlet”. Every form builds it the same way.

FieldIs
parentIdThe unit whose plantlet this is; null for anything planted or seeded
familyIdThe founder’s id, inherited down the line, so a family outlives its founder
ageHours in this tank. A seeded plant can start older. No rate reads it
vigourAn offset on its assimilation ceiling, drawn once at birth within ±VIGOUR_SPAN (0.15)

Vigour scales the most a unit’s leaves fix at any light, so clones side by side grow and bud apart, by about as much as their vigour differs.

The keeper plants by floor. A new unit fits when its footprint fits the floor the planting leaves free, and each unit claims its form’s full footprint at any size — the territory a keeper spaces for — so seedlings can’t pack a tank. An epiphyte on the rock claims its plan view like any other.

Trimming cuts units down to a size: one unit, one family, or every plant above the target. It takes the budget down in proportion — tissue, reserve, stores and the plantlet’s buffer — lowers leaf area, and the height of anything but a carpet, and reopens the taper, so the soma’s share goes back into regrowth. Trim for light, or let the plant spread. Which units a thinning pulls is the keeper’s choice. The verbs are on Actions.

Shedding is what low condition does to a plant: a share of its tissue an hour, maxSheddingRate times the square of the condition deficit — 0.5 %/h at condition 50 and 0.08 %/h at 80, so a plant relit or cleaned up before its condition collapses keeps most of itself. The tissue leaves as waste at Q_min, with its share of the reserve; the store it held is resorbed and stays with the plant. A failing plant drops its oldest leaves, which is why melting plants foul the water.

A plant dies at condition 0, as a fish does, and leaves the array. Its tissue, reserve and plantlet’s buffer become waste, so a melting sword fouls the water more than a carpet patch of the same size, and its stores go with them, so what it took up comes back as ammonia and minerals as that waste rots.

The tunables are listed in the reference under Plants, the half-saturations and demand tiers under Nutrients, and the canopy’s own constant, leafAttenuationPerLai, under Optics.

ConstantMeaningValue
GH per nitrate drawnCalcium and magnesium taken up per mg of nitrogen actually taken, counted as nitrate, off leaf-tissue ratios; a constant0.28 mg CaCO₃/mg
GH half-saturationGH, as CaCO₃, at which that uptake runs at half; a constant1 mg/L
NeighbourReadWritten
Lightlight and lightByHour, read at each plant’s own height through the canopy: PAR at the mean leaf drives photosynthesis, and the day’s light there reads against its rated day; PAR at the crown top charges the light-high stressorEvery unit’s crown, which shades the plants below it
Water & gasesco2 for the carbon Monod, oxygen for the oxygen pace, pH and gh for the tolerance bandsoxygen and co2, both directions, on one carbon yield; gh drawn with the nutrients; kh by the form their nitrogen comes in
Nitrogen cycleammonia and nitrate, and the phosphate, potassium and iron rot releases beside the ammoniaammonia first and nitrate for the rest, with the other three, into the stores — the ammonia from what the colony left; waste from shedding and death, a dead plant’s stores with it
Environmenttemperature for the Q10 on every rate of the budget, water for every ppm, the box’s depth and floor—
Equipmentsubstrate.nutrients — the bed’s store, for root feedersThe same store, drawn down as root feeders’ stores fill
AlgaeThe light the blooms take at each leaf, as the hour starts — green water by the depth above it, film as a coat; each bloom’s share of the pooled uptake and of the CO₂Plant power per litre, whose exudates lower a bloom’s assimilation ceiling; the canopy over the floor, film’s light there
Livestock—Plant power, saturating the fish shelter benefit
Actions—Planting against the floor, removal and trimming write the array and the budget directly; dosing fills the four nutrient pools in the water, root tabs the bed’s
Alerts & logging—A plant-died entry per plant lost, a plant-propagated entry per plantlet
State & persistenceThe tank’s draw stream, for every unit’s vigour and id; seeded plantings, at a named size and age, stocked on the plants config, each founding its familyThe advanced stream position

src/simulation/plants/ — the roster, the growth forms, the canopy and construction; src/simulation/flora/ — the hour’s pass, beside the blooms, and each kind’s budget parameters; src/simulation/systems/ — the flora law the blooms share, the budget and the reserve core it shares with the fish, photosynthesis, the pace, uptake, vitality and lifecycle; src/simulation/config/ — the tunables and their declared ranges.