Energy Balance
Monteith solves leaf temperature, latent heat, sensible heat, net radiation, boundary conductance, photosynthesis, and stomatal conductance iteratively.
using PlantBiophysics, PlantSimEngine, PlantMeteo, Dates
scene = leaf_scene(
Monteith(),
Fvcb(),
Medlyn(0.03, 12.0);
status=Status(
Ra_SW_f=13.747,
sky_fraction=1.0,
aPPFD=1500.0,
d=0.03,
),
environment=Atmosphere(
T=20.0,
Wind=1.0,
P=101.3,
Rh=0.65,
duration=Hour(1),
),
)
run!(scene)
leaf = only(model_objects(scene; scale=:Leaf))
(Tₗ=leaf.status.Tₗ, Rn=leaf.status.Rn, H=leaf.status.H, λE=leaf.status.λE)(Tₗ = 17.614816978945765, Rn = 21.40940340906749, H = -123.89287010251097, λE = 145.30227351157848)Monteith controls the call stack. During each temperature iteration it calls the selected photosynthesis model, which may in turn call stomatal conductance. These applications are compiled as manual call targets and are not independently run by the root scheduler.
Diagnostics.explain_calls(Advanced.compile_composite_model(scene))2-element Vector{@NamedTuple{call_plan_slot::Int64, application_slot::Int64, application_id::Symbol, consumer_id::Symbol, call::Symbol, mode::Symbol, origin::Symbol, callee_object_ids::Vector{Symbol}, callee_application_ids::Vector{Symbol}, potential_callee_application_ids::Tuple{Symbol}, process::Symbol, application::Nothing, multiplicity::Symbol, publication_policy::Symbol, default_publish::Bool, accepted_publish::Bool, resolved::Bool, selector::One{@NamedTuple{selectors::Tuple{}, scale::Symbol, process::Symbol}}}}:
(call_plan_slot = 1, application_slot = 1, application_id = :energy_balance, consumer_id = :leaf, call = :photosynthesis, mode = :manual, origin = :model_default, callee_object_ids = [:leaf], callee_application_ids = [:photosynthesis], potential_callee_application_ids = (:photosynthesis,), process = :photosynthesis, application = nothing, multiplicity = :one, publication_policy = :explicit_accept, default_publish = 0, accepted_publish = 1, resolved = 1, selector = One{@NamedTuple{selectors::Tuple{}, scale::Symbol, process::Symbol}}((selectors = (), scale = :Leaf, process = :photosynthesis)))
(call_plan_slot = 2, application_slot = 2, application_id = :photosynthesis, consumer_id = :leaf, call = :stomatal_conductance, mode = :manual, origin = :model_default, callee_object_ids = [:leaf], callee_application_ids = [:stomatal_conductance], potential_callee_application_ids = (:stomatal_conductance,), process = :stomatal_conductance, application = nothing, multiplicity = :one, publication_policy = :explicit_accept, default_publish = 0, accepted_publish = 1, resolved = 1, selector = One{@NamedTuple{selectors::Tuple{}, scale::Symbol, process::Symbol}}((selectors = (), scale = :Leaf, process = :stomatal_conductance)))The required timestep range is one minute to two hours, with one hour preferred:
PlantSimEngine.timestep_hint(Monteith())(required = (Dates.Minute(1), Dates.Hour(2)), preferred = Dates.Hour(1))Important status inputs are absorbed shortwave radiation (Ra_SW_f), visible sky fraction (sky_fraction), absorbed PPFD (aPPFD), and characteristic leaf dimension (d). Use inputs(model) and outputs(model) for the complete contract.
Evaluation and reproducibility
The Schymanski et al. evaluation compares the simulated latent heat, sensible heat, and net radiation fluxes with chamber observations across wind speeds. Its standalone wrapper calls the same current-API scenario as the numerical regression test and the same plotting implementation as the documentation build.