This document develops a simple process-based vegetation growth model
in R.
The aim is to connect plant physiology with biomass production and
structural growth.
The workflow follows: 1. Photosynthesis driven by light and soil
moisture
2. Respiration losses
3. Net carbon assimilation
4. Biomass production
5. Turnover (losses)
6. Carbon allocation to plant components
7. Allometry: biomass → tree structure
Note: All parameter values are illustrative and chosen to demonstrate
model behaviour rather than represent a specific species or ecosystem.
—
Gross assimilation is defined as:
A = k × I × SM
Where:
calc_assim <- function(I, SM, k = 0.05) {
A <- k * I * SM
return(A)
}
# Example
calc_assim(I = 1000, SM = 0.5)
## [1] 25
Plants lose carbon via respiration:
Maintenance respiration: Rm = r × A
Growth respiration: Rf = gamma × A
Net assimilation:
An = A − Rm − Rf; An = A (1 − r − gamma)
calc_An <- function(I, SM, r, gamma) {
A <- calc_assim(I, SM)
An <- A * (1 - r - gamma)
return(An)
}
# Example
An <- calc_An(I = 1000, SM = 0.5, r = 0.2, gamma = 0.1)
An
## [1] 17.5
Net assimilation is converted to biomass:
dB = An × dT × (ml / LMA)
Where:
dB : Biomass increment
dT : Time step
ml : Leaf mass
LMA : Leaf mass per unit area (in g m⁻²)
calc_dB <- function(An, dT, ml, lma) {
dB <- An * dT * (ml / lma)
return(dB)
}
dB <- calc_dB(An, dT = 1, ml = 100, lma = 50)
dB
## [1] 35
Plants lose biomass through litterfall and mortality:
T = −(1/tau) × m × dT
Where:
tau : residence time
m : biomass pool
calc_T <- function(tau, m, dT) {
T <- (-1 / tau) * m * dT
return(T)
}
Tl <- calc_T(tau = 2, m = 100, dT = 1) # leaf turnover
Tr <- calc_T(tau = 3, m = 120, dT = 1) # root turnover
Tl
## [1] -50
Tr
## [1] -40
Remaining biomass available for growth:
dBg = dB − Tl − Tr
dBg <- (dB - Tl - Tr)
dBg
## [1] 125
Biomass is allocated to plant components:
coarse root
fine root
leaf
stem
dBi = fi × dBg
Where fi are allocation fractions.
fcr <- 0.15
ffr <- 0.35
fl <- 0.25
fs <- 0.25
dBcr <- fcr * dBg
dBfr <- ffr * dBg
dBl <- fl * dBg
dBs <- fs * dBg
dBcr; dBfr; dBl; dBs
## [1] 18.75
## [1] 43.75
## [1] 31.25
## [1] 31.25
Allometric relationships connect biomass with tree structure.
Example:
H = alpha × D^3
Where:
H : tree height
D : diameter
alpha : scaling constant
Stem biomass can be linked to height and wood density as Bs ∝ ρ⋅H⋅D^2 (ρ: wood density) These relationships translate carbon gain into structural growth.
To simulate vegetation development, the model must run over time steps.
At each time step:
Photosynthesis occurs
Respiration reduces carbon gain
Biomass increases
Turnover removes biomass
Allocation redistributes carbon
nt <- 20 # number of time steps
leaf_mass <- 100
root_mass <- 120
stem_mass <- 150
m_rate <- 0.02
# store results
time <- 1:nt
leaf_series <- numeric(nt)
root_series <- numeric(nt)
stem_series <- numeric(nt)
for (t in 1:nt) {
# Photosynthesis
A <- calc_assim(I = 1000, SM = 0.5)
# Net assimilation
An <- calc_An(I = 1000, SM = 0.5, r = 0.2, gamma = 0.1)
# Biomass production
dB <- calc_dB(An, dT = 1, ml = leaf_mass, lma = 50)
# Turnover
Tl <- calc_T(tau = 1, m = leaf_mass, dT = 1)
Tr <- calc_T(tau = 4, m = root_mass, dT = 1)
Ts <- calc_T(tau = 20, m = stem_mass, dT = 1)
dBg <- dB - Tl - Tr - Ts
print(dBg)
# Allocation
leaf_mass <- leaf_mass + fl * dBg
root_mass <- root_mass + ffr * dBg
stem_mass <- stem_mass + fs * dBg
# Mortality applied proportionally
leaf_mass <- leaf_mass * (1 - m_rate)
root_mass <- root_mass * (1 - m_rate)
stem_mass <- stem_mass * (1 - m_rate)
# store values
leaf_series[t] <- leaf_mass
root_series[t] <- root_mass
stem_series[t] <- stem_mass
}
## [1] 172.5
## [1] 243.0094
## [1] 342.3395
## [1] 482.2707
## [1] 679.3989
## [1] 957.1031
## [1] 1348.319
## [1] 1899.444
## [1] 2675.842
## [1] 3769.593
## [1] 5310.414
## [1] 7481.046
## [1] 10538.92
## [1] 14846.71
## [1] 20915.3
## [1] 29464.43
## [1] 41508.01
## [1] 58474.42
## [1] 82375.83
## [1] 116047
plot(time, leaf_series, type = "l", lwd = 2,
xlab = "Time step",
ylab = "Relative biomass (model units)",
main = "Dynamics of Biomass Pools Over Time")
lines(time, root_series, lwd = 2, lty = 2)
lines(time, stem_series, lwd = 2, lty = 3)
legend("topleft",
legend = c("Leaf", "Root", "Stem"),
lwd = 2,
lty = c(1,2,3))