Plant growth and land use management
Overview¶
SWAT+ grows one or more plants in a community on each HRU. Daily potential biomass is a function of intercepted photosynthetically active radiation. That potential is reduced by water, temperature, nitrogen, phosphorus, and aeration stresses. Phenology is tracked by accumulated plant heat units (PHU). The plants on an HRU are scheduled by management.sch, and land use plus structural BMPs are assigned through landuse.lum. Decision tables (lum.dtl) drive conditional operations such as auto-irrigation, auto-fertilisation, and land use change.
Process equations¶
Heat unit accumulation¶
Each plant accumulates a fraction of total heat units to maturity per day:
t_base is the plant's minimum growth temperature (plants.plt), phumat is the heat units to maturity. When phuacc reaches 1.0 the plant is mature. phuacc_p is the perennial counterpart. Source: pl_nut_demand.f90.
Biomass accumulation¶
Daily potential biomass is
where par is intercepted PAR (MJ/m^2) and beadj is radiation use efficiency adjusted for CO2 and vapour pressure deficit. The CO2 adjustment uses the two-point curve described by bio_e, bioehi, co2hi in plants.plt. When vapour pressure deficit exceeds 1.0 kPa, RUE declines at the plant-specific rate wavp, with a floor of 0.27 * bio_e. Realised biomass is
reg is the most limiting stress factor. Plant carbon mass is fixed at 0.42 * biomass. Source: pl_biomass_gro.f90.
Leaf area index¶
LAI follows a two-point optimal curve defined by (frgrw1, laimx1) and (frgrw2, laimx2) from plants.plt. The model computes a fraction f of maximum LAI from phuacc:
leaf1 and leaf2 are shape parameters fitted from the two points. Before phuacc reaches dlai (fraction of season at which leaves decline), LAI grows toward laimax:
After phuacc > dlai, LAI declines following dlai_rate. Canopy height is chtmx * sqrt(f). For perennials, LAI is scaled by tree age through laixco_tree and mat_yrs. Source: pl_leaf_gro.f90, pl_leaf_senes.f90.
Water stress and uptake¶
Potential transpiration epmax(ipl) is distributed through the rooting depth using an exponential extraction function with parameters uptake%water_dis and uptake%water_norm. Water uptake from each layer is
where gx is depth to the bottom of the current layer. Layers below the root zone do not contribute. The compensation factor epco (0-1) controls how much a deeper layer can compensate when a shallower layer is dry. Water stress is
Aeration stress activates when soil water exceeds field capacity:
where scparm = 100 * (satco - aeration) / (1.0001 - aeration). Source: pl_waterup.f90.
Temperature stress¶
strst = 0 if tave <= t_base or if tmin <= annual mean - 15. Source: pl_tstr.f90.
Nitrogen and phosphorus stress and uptake¶
Plant N and P demands follow optimal concentration curves with pltnfr1, pltnfr2, pltnfr3 and pltpfr1, pltpfr2, pltpfr3 (see plants.plt). N and P are taken from soil layers with a depth-distribution function controlled by n_updis and p_updis in parameters.bsn. If supply is below demand, strsn and strsp reduce growth. Legumes fix N when soil supply is short:
fxr = min(1, fxw, fxn) * fxg
fixn = nfix_co * fxr * deficit + (1 - nfix_co) * deficit
fixn = min(nfixmx, fixn)
nfix_co is the legume coefficient (0.5 for legumes, 0 for non-legumes). nfixmx (default 20 kg N/ha/day, parameters.bsn) caps daily fixation. Source: pl_nup.f90, pl_pup.f90, pl_nfix.f90, pl_nupd.f90, pl_pupd.f90.
Harvest¶
Yield is harveff * seed_mass. The harvest index is bounded below by wsyf and accumulates from zero up to hvsti as phuacc increases past 0.5. Harvest types in harv.ops are grain, biomass, residue, tree, tuber, peanuts, stripper, picker. Pesticide is removed in yield in proportion to pl_yield%m / pl_mass(j)%tot(ipl)%m. Source: mgt_harvgrain.f90, mgt_harvbiomass.f90, mgt_harvresidue.f90, mgt_harvtuber.f90, mgt_killop.f90.
Land use management¶
landuse.lum¶
Each HRU points to a row in landuse.lum. That row carries the plant community name, curve number group, USLE conservation practice, tillage practice, and pointers to the management schedule, tile drainage code, septic code, filter strip, grass waterway, and BMP user practice. hru_lum_init.f90 copies these pointers onto each HRU at the start of simulation. Source: hru_lum_init.f90, landuse_data_module.f90.
management.sch¶
For each schedule, operations are listed in calendar or PHU-trigger order. Operation codes used by mgt_sched.f90 include:
| Code | Operation |
|---|---|
plnt |
Plant a single species (or community) |
harv |
Harvest (grain / biomass / residue / tree / tuber etc.) |
kill |
Kill the plant, transfer all biomass to residue |
hvkl |
Harvest and kill in the same operation |
till |
Tillage, mixes residue and pools using till.til |
irrm |
Irrigation, applies depth from irr.ops |
fert |
Mineral or organic fertiliser (fertilizer.frt) |
manu |
Manure application |
pest |
Pesticide application |
graz |
Grazing |
cnup |
Curve number update |
burn |
Prescribed burn |
swep |
Street sweeping |
dwm |
Drainage water management depth |
weir |
Set or adjust weir height |
mons |
Begin or end monsoon trigger window |
PHU-triggered operations fire when phuacc of the plant in column op2 crosses the value in column phu. Date-triggered operations fire on the given month and day. Source: mgt_sched.f90, mgt_operations_module.f90.
Decision tables (lum.dtl)¶
Each row in landuse.lum may also reference one or more decision tables in lum.dtl. Decision tables are conditional rule sets that fire actions when their conditions are met. Each table has conds conditions, alts alternative outcomes, and acts actions. On each day in hru_control.f90 the model loops over the HRU's num_autos auto operations and calls conditions then actions for each. Typical actions include auto-irrigation, auto-fertilisation, planting based on PHU triggers, and land use change. The decision table reader is dtbl_lum_read.f90; the run-time logic is in conditions.f90 and actions.f90.
See the Decision tables theory page for the rule grammar.
Switches and parameters¶
| File | Field | Effect |
|---|---|---|
codes.bsn |
nostress |
0 = all stresses applied, 1 = no stress, 2 = no N/P stress |
codes.bsn |
cswat |
Selects soil carbon model. C-FARM (=1) changes residue and tillage routines |
parameters.bsn |
co2 |
Ambient CO2 concentration (ppm), default 400 |
parameters.bsn |
nfixmx |
Maximum daily N fixation (kg/ha), default 20 |
parameters.bsn |
n_updis, p_updis |
Depth-distribution shape for plant N/P uptake |
parameters.bsn |
evlai |
LAI above which only transpiration occurs, default 3.0 |
plants.plt |
bio_e, bioehi, co2hi, wavp |
RUE and its CO2 / VPD response |
plants.plt |
blai, frgrw1, laimx1, frgrw2, laimx2, dlai, dlai_rate |
LAI development curve |
plants.plt |
t_base, t_opt |
Temperature response |
plants.plt |
hvsti, wsyf |
Harvest index and water-stress floor |
plants.plt |
chtmx, rdmx |
Maximum canopy height and root depth |
plants.plt |
aeration |
Aeration stress threshold (fraction above FC) |
plants.plt |
pltnfr1..3, pltpfr1..3 |
N and P optimal concentration curves |
plants.plt |
nfix_co |
Legume coefficient |
plants.plt |
mat_yrs, laixco_tree, bmx_peren, leaf_tov_min, leaf_tov_max |
Perennial / tree parameters |
Implementation¶
Plant growth: pl_grow.f90, pl_biomass_gro.f90, pl_leaf_gro.f90, pl_leaf_senes.f90, pl_root_gro.f90, pl_seed_gro.f90, pl_partition.f90, pl_community.f90, pl_waterup.f90, pl_tstr.f90, pl_nut_demand.f90, pl_nup.f90, pl_pup.f90, pl_nupd.f90, pl_pupd.f90, pl_nfix.f90, pl_dormant.f90, pl_mortality.f90, pl_rootfr.f90.
Plant data and initialisation: plant_data_module.f90, plant_module.f90, plant_parm_read.f90, plant_init.f90, plant_all_init.f90, plant_transplant_read.f90.
Management operations: mgt_sched.f90, mgt_operatn.f90, mgt_plantop.f90, mgt_harvgrain.f90, mgt_harvbiomass.f90, mgt_harvresidue.f90, mgt_harvtuber.f90, mgt_killop.f90, mgt_biomix.f90, mgt_newtillmix_cswat0.f90, mgt_newtillmix_cswat1.f90, mgt_newtillmix_wet.f90, mgt_tillfactor.f90, mgt_transplant.f90, mgt_operations_module.f90, mgt_read_*.f90.
Plant operation utilities: pl_fert.f90, pl_fert_wet.f90, pl_manure.f90, pl_graze.f90, pl_burnop.f90.
Land use: hru_lum_init.f90, hru_lum_init_all.f90, landuse_data_module.f90, lum_read*.f90.
Decision tables: dtbl_lum_read.f90, conditions.f90, actions.f90, conditional_module.f90.