\chapter{Plants}\label{ch:plants}
\section{Phenology, soil loading and root uptake}
\subsection*{Physics}
Event-date phenology determines the foliage exposed to deposition.
Leaf-area index controls interception and dry deposition
(\cref{ch:deposition}). Deposited activity per unit ground area is converted
to plant concentration using fresh biomass at deposition for grass and
fresh yield for other crops.

Plant-available soil activity is divided by soil mass per unit area to obtain
an effective soil concentration. Three terms then represent root uptake,
adhesion of resuspended soil and soil intake during grazing. These are
effective contributions on a common mass-concentration basis. Element-specific
enrichment applies to adhering particles but not to soil intake
(\cref{eq:root}; \cite{excelmanual}).

For most plant categories, the soil-derived concentration is multiplied by
a ramp that rises linearly from zero to one over the first 50 days. This is
an empirical prescription.
Leafy vegetables instead use the crop-replacement rule described below,
without the additional ramp.
\subsection*{Equations}
With $I_{s,\mathrm{av}}$ in \si{\becquerel\per\square\metre},
$M_s$ in \si{\kilogram\per\square\metre}, and dimensionless soil transfer
$T_p$, plant adhesion $r_p$, enrichment $E_s$, and soil intake $s_p$,
\begin{equation}\label{eq:root}
C_{p,s}(t)=\frac{I_{s,\mathrm{av},p}(t)}{M_{s,p}}
\bigl(T_p+r_pE_s+s_p\bigr),\qquad
C_{p,r}(t)=C_{p,s}(t)\min(t/50\,\mathrm{d},1).
\end{equation}
Both concentrations have units \si{\becquerel\per\kilogram}.
\subsection*{Parameters}
\begin{center}\footnotesize\begin{tabular}{@{}p{.10\linewidth}@{\hspace{3pt}}p{.14\linewidth}@{\hspace{3pt}}p{.35\linewidth}@{\hspace{3pt}}p{.35\linewidth}@{}}\toprule Symbol & Unit & SQLite table.column & Compiled field\\\midrule
$T_p$ & 1 & soil\_plant\_transfer.factor & soil\_transfer\_values\\
$r_p,s_p$ & 1 & plant.resuspension\_factor,soil\_intake & resuspension\_factor,soil\_intake\\
$M_{s,p}$ & \si{\kilogram\per\square\metre} & soil\_mass.kg\_m2 & soil\_mass\_kg\_m2\\
$Y_p,L_p$ & \si{\kilogram\per\square\metre}, 1 & plant\_biomass.kg\_fresh\_m2, plant\_lai.value & biomass\_values\_kg\_m2,lai\_values\\\bottomrule\end{tabular}\end{center}
Loader \coderef{ecosys/data/loader.py}{369}{477},
\coderef{ecosys/data/loader.py}{369}{451}; compiler
\coderef{ecosys/data/compile.py}{244}{449}.
\subsection*{Implementation}
\coderef{ecosys/kernels/plants.py}{129}{154} evaluates phenology;
\coderef{ecosys/kernels/plants.py}{157}{198} evaluates \cref{eq:root};
\coderef{ecosys/engine.py}{1555}{1593} assembles batch+time+plant arrays.
\subsection*{Numerical treatment}
Seasonal curves interpolate on zero-based non-leap dates; $t<0$ is masked,
and the ordinary ramp saturates at 50 elapsed days (\sd{07}).
\relation{Equations~(11)--(12) of \cite{mueller1993} describe soil-to-plant
transfer after mass conversion. Adhesion, soil intake and the uptake ramp
extend this formulation (\sd{04}, \sd{07}, \sd{12}); see
Appendix~\ref{sec:history-plants}.}
\evidence{\codefn{tests/kernels/test_phenology.py},
\codefn{tests/kernels/test_root_uptake.py::test_each_soil_term_is_isolated_and_dimensioned},
\codefn{tests/integration/test_event_plants.py}.}

\section{Grass and hay-source grass}
\subsection*{Physics}
Grass concentration is represented as a time-dependent quantity rather than
a single harvest stock.
The initial foliar deposit, divided by event-date fresh biomass, is split
into two complementary components \cite{mueller1993}. The first loses
activity through weathering and growth dilution. The second represents
translocation towards the root zone and subsequent remobilisation, with an
element-specific fraction and effective half-life.

Both components undergo radioactive decay. Growth dilution is integrated
over the monthly rates since deposition. Direct-deposit contributions are
set to zero after 730 elapsed days, while the soil-derived contribution
continues (\cref{eq:grass}).
\subsection*{Equations}
Let $A_g$ be event-date activity deposited on grass in
\si{\becquerel\per\square\metre}, $Y_g$ its fresh biomass in
\si{\kilogram\per\square\metre}, $a_g$ the element's dimensionless second
fraction, $\lambda_w$ weathering and $\lambda_2$ the second-component
effective loss, both in \si{\per\day}. Define
$G_g(t)=\int_0^t\lambda_{b,g}(s)\,ds$ with monthwise growth rate
$\lambda_{b,g}=\ln2/T_{b,g,\mathrm{month}(s)}$; the integral uses actual
Gregorian month overlaps. The indicator $\mathbf1_{P}$ is one when condition
$P$ holds and zero otherwise. Then
\begin{equation}\label{eq:grass}
C_g(t)=\frac{A_g}{Y_g}\left[(1-a_g)e^{-G_g(t)-\lambda_wt}
+a_g e^{-\lambda_2t}\right]e^{-\lambda_{\phys}t}
\mathbf1_{t\leq730\,\mathrm d}
+C_{g,s}(t)\min(t/50\,\mathrm d,1).
\end{equation}
If the second half-life is zero the second-component survival is one before
physical decay. All $C$ values are in \si{\becquerel\per\kilogram}.
\subsection*{Parameters}
\begin{center}\footnotesize\begin{tabular}{@{}p{.10\linewidth}@{\hspace{3pt}}p{.14\linewidth}@{\hspace{3pt}}p{.35\linewidth}@{\hspace{3pt}}p{.35\linewidth}@{}}\toprule Symbol & Unit & SQLite table.column & Compiled field\\\midrule
$a_g,T_2$ & 1, yr & element\_grass\_parameter.component2\_fraction,component2\_half\_life\_years & grass\_component2\_fraction,grass\_component2\_half\_life\_years\\
$T_w$ & yr & plant.weathering\_half\_life\_years & weathering\_half\_life\_years\\
$T_{b,g}$ & yr & plant\_growth\_half\_life.half\_life\_years & monthly\_growth\_half\_lives\_years\\\bottomrule\end{tabular}\end{center}
Loader \coderef{ecosys/data/loader.py}{452}{477},
\coderef{ecosys/data/loader.py}{378}{451}; compiler
\coderef{ecosys/data/compile.py}{294}{381}.
\subsection*{Implementation}
\coderef{ecosys/kernels/plants.py}{201}{295};
\coderef{ecosys/engine.py}{1596}{1616} and hay-source evaluation
\coderef{ecosys/engine.py}{933}{1004}.
\subsection*{Numerical treatment}
Monthly loss is an exact sum of constant-rate overlaps. The kernel clips
the growth integration horizon and zeros foliage for $t>730$. Hay preparation
uses grass concentrations evaluated on a daily source grid.
\relation{The two-component split follows Eq.~(9) of \cite{mueller1993}.
The 730-day cutoff follows \cite{excelmanual} (\sd{06}). Historical
differences in growth integration and winter availability are described in
Appendix~\ref{sec:history-plants}.}
\evidence{\codefn{tests/kernels/test_grass.py::test_growth_loss_accumulates_across_leap_month_and_dormancy},
\codefn{tests/integration/test_event_plants.py}.}

\section{Crop categories and seasonal stock}
\subsection*{Physics}
Crop categories distinguish direct foliar contamination, translocation to
edible organs and replacement by later harvests. Silage and beet leaves
combine a weathered, radioactively decaying leaf contribution with
soil-derived activity. For leafy vegetables, the initially exposed crop is
progressively replaced by root-fed crops during the first harvest period.
Fresh leafy production continues through the winter where specified by the
seasonal rules \cite{excelmanual}.

For grains, potatoes or fruits, deposition on foliage is not automatically
deposition on the edible grain, tuber or fruit. If an element and crop have
a translocation curve, that curve estimates how much of the leaf deposit
reaches the edible part as time elapses before harvest. It is used only on
its specified elapsed-day range and only when foliage was eligible to
receive the event's deposit; an overwintering crop has its own eligibility
rule. The translocation term replaces, rather than duplicates, a direct
weathered-leaf term. The soil contribution can still enter separately
(\cref{eq:crop}). The assigned plant category selects the applicable rule.

For the silage/beet-leaf and single-harvest categories, the engine records
the fresh value at harvest end. For harvest-window produce it records the unweighted
mean of eligible \emph{daily} fresh values in the window. After harvest,
the reported product is that stored crop: it undergoes radioactive decay,
but no further field weathering or changing root uptake, until fresh
production replaces it at the next harvest.
\subsection*{Equations}
For event-date activity $A_p$ deposited on plant $p$ in
\si{\becquerel\per\square\metre} and yield $Y_p$ in
\si{\kilogram\per\square\metre}, direct foliage outside grass is
$C_{p,l}(t)=A_pY_p^{-1}
e^{-(\lambda_w+\lambda_{\phys})t}\mathbf1_{t\leq730\,\mathrm d}$.
For translocating crops the implemented fresh contribution is instead
\begin{equation}\label{eq:crop}
C_{p,\mathrm{fresh}}(t)=C_{p,r}(t)+
\frac{A_p}{Y_p}\Theta_p(t)e^{-\lambda_{\phys}t}
\mathbf1_{t\leq730\,\mathrm d}\mathbf1_{\rm foliage\ eligible}.
\end{equation}
$\Theta_p(t)$ is dimensionless linear interpolation of the element/plant curve,
zero outside $0\leq t\leq200$ days. When no curve applies, direct leaf plus
root is used. A type-5 stock at end date $H$ averages fresh concentrations
over calendar days $d$ from $\max(\mathrm{event},\mathrm{harvest\ start})$ to
$H$ inclusive: $\bar C_H=n^{-1}\sum_{d}C_{p,\mathrm{fresh}}(d)$.
For types 2/4 the stock is $C_{p,\mathrm{fresh}}(H)$.
Between harvests $C_p(t)=\bar C_H e^{-\lambda_{\phys}(t-H)}$ (or the
corresponding end-anchor value), in \si{\becquerel\per\kilogram}.
The leafy kernel uses $u(t)=\operatorname{clip}(t/(H_{\rm start}-G_{\rm start}),0,1)$:
inside the first harvest window it returns
$C_{p,l}(1-u)+C_{p,s}u$; before the window it returns $C_{p,l}$;
later it returns current $C_{p,s}$ plus late-deposition winter foliage when
eligible, without the ordinary 50-day root ramp.
\subsection*{Parameters}
\begin{center}\footnotesize\begin{tabular}{@{}p{.10\linewidth}@{\hspace{3pt}}p{.14\linewidth}@{\hspace{3pt}}p{.35\linewidth}@{\hspace{3pt}}p{.35\linewidth}@{}}\toprule Symbol & Unit & SQLite table.column & Compiled field\\\midrule
$G,H$ & one-based day & plant.growth\_start\_day, harvest\_start\_day, harvest\_end\_day & plant\_calendar (engine)\\
$Y_p$ & \si{\kilogram\per\square\metre} & plant.yield\_kg\_fresh\_m2 & yield\_per\_area\\
$\Theta_p$ & 1 & translocation\_factor.day\_offset,factor & translocation\_day\_offsets,translocation\_factors\\
category & ID & plant.category\_id & category\_positions\\\bottomrule\end{tabular}\end{center}
Loader \coderef{ecosys/data/loader.py}{452}{477},
\coderef{ecosys/data/loader.py}{391}{407}; compiler
\coderef{ecosys/data/compile.py}{267}{273},
\coderef{ecosys/data/compile.py}{385}{449} and calendar
\coderef{ecosys/engine.py}{555}{578}.
\subsection*{Implementation}
\coderef{ecosys/kernels/plants.py}{298}{396} gives leaf category helpers;
\coderef{ecosys/kernels/plants.py}{399}{461} gives translocation;
\coderef{ecosys/engine.py}{1490}{1715} dispatches and computes all categories,
with stock recurrence \coderef{ecosys/engine.py}{770}{815}.
\subsection*{Numerical treatment}
Stock anchors are evaluated at exact harvest dates, independent of output
nodes. Type-5 means are over eligible daily samples, not a sparse support
average; only physical survival is applied after harvest, not retrospectively
to each sample. Pre-growth foliar ineligibility and the one-based seasonal
coordinates prevent false early crop transfer (\sd{08}).
\relation{Equations~(8), (10)--(12) of \cite{mueller1993} describe foliar,
translocation and root contributions. Crop-category and storage rules follow
\cite{excelmanual}, with numerical differences documented in
Appendix~\ref{sec:history-plants}.}
\evidence{\codefn{tests/kernels/test_silage_plants.py::test_silage_beet_leaf_harvest_masks_and_carry_forward},
\codefn{tests/kernels/test_leafy_plants.py},
\codefn{tests/kernels/test_translocating_plants.py::test_translocation_interpolates_and_zeroes_outside_approved_horizon},
\codefn{tests/kernels/test_harvest_window_plants.py},
\codefn{tests/integration/test_event_plants.py}.}
