API
Plant Hydraulic System
The PlantHydraulics module provides two levels of hydraulics system: organ-level and plant-level. The organ-level hydraulic systems include Leaf, Root, and Stem (trunk and branch). The plant-level hydraulic system is can be any combination of the three organs (custimized definition may apply).
Leaf, Root, and Stem organs
Plant hydraulics is segmented to three organ-level systems/structs (LeafHydraulics
, RootHydraulics
, and StemHydraulics
) subject to an Abstract type (AbstractHydraulicOrgan
). The major differences among the three structs are
LeafHydraulics
has an extra-xylary componentRootHydraulics
has a rhizosphere componentRootHydraulics
andStemHydraulics
have a gravity component
See the documentation for each struct for more details:
Land.PlantHydraulics.AbstractHydraulicOrgan
— Typeabstract type AbstractHydraulicOrgan{FT}
Hierarchy of AbstractHydraulicOrgan
Land.PlantHydraulics.LeafHydraulics
— Typemutable struct LeafHydraulics{FT}
A struct that contains leaf hydraulics information.
Fields
N::Int64
area::Any
: Leaf area [m²]
k_ox::Any
: Maximal extra-xylary hydraulic conductance [mol s⁻¹ MPa⁻¹ m⁻²]
k_sla::Any
: Maximal leaf hydraulic conductance per leaf area [mol s⁻¹ MPa⁻¹ m⁻²]
vc::Land.PlantHydraulics.AbstractXylemVC{FT} where FT
: Vulnerability curve
p_crt::Any
: Critical xylem pressure [MPa]
flow::Any
: Flow rate in the xylem [mol s⁻¹]
p_dos::Any
: Leaf xylem water pressure at the downstream end of leaf xylem [MPa]
p_leaf::Any
: Leaf end water pressure at air-water interface [MPa]
p_ups::Any
: Leaf xylem water pressure at the leaf base (upstream) [MPa]
k_element::Vector
: List of leaf k_max per element [mol s⁻¹ MPa⁻¹ m⁻²]
k_history::Vector
: List of leaf kr history per element
p_element::Vector
: List of xylem water pressure [MPa]
p_history::Vector
: List of xylem water pressure history (normalized to 298.15 K) [MPa]
f_st::Any
: Relative surface tension
f_vis::Any
: Relative viscosity
T_old::Any
: Temperature memory [K]
T_sap::Any
: Upstream sap temperature [K]
pv::Land.PlantHydraulics.AbstractCapacity{FT} where FT
: Pressure volume curve for storage
p_storage::Any
: Pressure of storage
v_maximum::Any
: Total capaciatance at Ψ = 0 [mol m⁻²]
v_storage::Any
: Current capaciatance at Ψ_leaf [mol m⁻²]
q_in::Any
: Flow rate into the tissue (used for non-steady state) [mol m⁻² s⁻¹]
q_out::Any
: Flow rate out of the tissue (used for non-steady state) [mol m⁻² s⁻¹]
Land.PlantHydraulics.RootHydraulics
— Typemutable struct RootHydraulics{FT}
A struct that contains root hydraulics information.
Fields
N::Int64
area::Any
: Root cross-section area [m²]
k_max::Any
: Maximal hydraulic conductance [mol s⁻¹ MPa⁻¹]
k_s::Any
: Maximal xylem hydraulic conductivity [mol s⁻¹ MPa⁻¹ m⁻²]
vc::Land.PlantHydraulics.AbstractXylemVC{FT} where FT
: Vulnerability curve
Δh::Any
: Root z difference [m]
k_rhiz::Any
: Rhizosphere conductance [mol s⁻¹ MPa⁻¹]
sh::Union{Land.PlantHydraulics.BrooksCorey{FT}, Land.PlantHydraulics.VanGenuchten{FT}} where FT
: Soil hydraulics
flow::Any
: Flow rate in the xylem [mol s⁻¹]
p_dos::Any
: Xylem water pressure at the downstream end of xylem [MPa]
p_rhiz::Any
: Xylem-rhizosphere interface water pressure [MPa]
p_ups::Any
: Soil matrix potential [MPa]
p_osm::Any
: Soil osmotic potential at 298.15 K `[MPa]
k_element::Vector
: List of k_max per element [mol s⁻¹ MPa⁻¹ m⁻²]
k_history::Vector
: List of kr history per element
p_element::Vector
: List of xylem water pressure [MPa]
p_gravity::Vector
: List of pressure drop caused by gravity [MPa]
p_history::Vector
: List of xylem water pressure history (normalized to 298.15 K) [MPa]
f_st::Any
: Relative surface tension
f_vis::Any
: Relative viscosity
T_old::Any
: Temperature memory [K]
T_sap::Any
: Upstream sap temperature [K]
pv::Land.PlantHydraulics.AbstractCapacity{FT} where FT
: Pressure volume curve for storage
p_storage::Vector
: Pressure of storage per element
v_maximum::Vector
: Maximal storage per element [mol]
v_storage::Vector
: Storage per element [mol]
q_element::Vector
: List of xylem water flow [mol m⁻²]
q_buffer::Vector
: List of buffer water flow [mol m⁻²]
q_diff::Vector
: List of diiferntial water flow [mol m⁻²]
q_in::Any
: Flow rate into the tissue (used for non-steady state) [mol s⁻¹]
q_out::Any
: Flow rate out of the tissue (used for non-steady state) [mol s⁻¹]
Land.PlantHydraulics.StemHydraulics
— Typemutable struct StemHydraulics{FT}
A struct that contains stem hydraulics information.
Fields
N::Int64
area::Any
: Stem cross-section area [m²]
k_max::Any
: Maximal hydraulic conductance [mol s⁻¹ MPa⁻¹]
k_s::Any
: Maximal xylem hydraulic conductivity [mol s⁻¹ MPa⁻¹ m⁻²]
vc::Land.PlantHydraulics.AbstractXylemVC{FT} where FT
: Vulnerability curve
Δh::Any
: Stem height difference [m]
flow::Any
: Flow rate in the xylem [mol s⁻¹]
p_dos::Any
: Xylem water pressure at the downstream end of xylem [MPa]
p_ups::Any
: Xylem water pressure at the base (upstream) [MPa]
k_element::Vector
: List of k_max per element [mol s⁻¹ MPa⁻¹ m⁻²]
k_history::Vector
: List of kr history per element
p_element::Vector
: List of xylem water pressure [MPa]
p_gravity::Vector
: List of pressure drop caused by gravity [MPa]
p_history::Vector
: List of xylem water pressure history (normalized to 298.15 K) [MPa]
f_st::Any
: Relative surface tension
f_vis::Any
: Relative viscosity
T_old::Any
: Temperature memory [K]
T_sap::Any
: Upstream sap temperature [K]
pv::Land.PlantHydraulics.AbstractCapacity{FT} where FT
: Pressure volume curve for storage
p_storage::Vector
: Pressure of storage per element
v_maximum::Vector
: Maximal storage per element [mol]
v_storage::Vector
: Storage per element [mol]
q_element::Vector
: List of xylem water flow [mol m⁻²]
q_in::Any
: Flow rate into the tissue (used for non-steady state) [mol s⁻¹]
q_out::Any
: Flow rate out of the tissue (used for non-steady state) [mol s⁻¹]
To initialize a hydraulics system, one needs to provide the floating type, for example:
FT = Float32;
hs_leaf = LeafHydraulics{FT}();
hs_root = RootHydraulics{FT}();
hs_stem = StemHydraulics{FT}();
Whole-plant organism
Plants differ in their structures, for example, some plants have a canopy far above the ground elevated by a trunk, some plants have a structured canopy supported by branch systems, and some plant has no trunk at all. To represent the structural differences, several types of plant hydraulics systems are pre-defined, and they are GrassLikeOrganism
, PalmLikeOrganism
, TreeLikeOrganism
, and TreeSimple
structs subject to a AbstractPlantOrganism
type. The major difference between the HS
s are
GrassLikeOrganism
has only mutiple root and canopy layers, no trunk or branchPalmLikeOrganism
has multiple root layers, a trunk, and multiple canopy layers, no branch systemTreeLikeOrganism
has multiple root layers, a trunk, and multiple branch + canopy layers, and each branch corresponds to a canopy layerTreeSimple
has one root, one stem, and one leaf for testing purpose
See the documentation for each struct for more details:
Land.PlantHydraulics.AbstractPlantOrganism
— Typeabstract type AbstractPlantOrganism{FT}
Hierachy of AbstractPlantOrganism
Land.PlantHydraulics.GrassLikeOrganism
— Typemutable struct GrassLikeOrganism{FT}
A plant hydraulic system like a grass, which contains multiple root layers, and multiple canopy layers. No trunk or branch system applies.
Fields
n_root::Int64
: Root Layers
n_canopy::Int64
: Canopy Layers
roots::Array{Land.PlantHydraulics.RootHydraulics{FT}, 1} where FT
: Roots system
leaves::Array{Land.PlantHydraulics.LeafHydraulics{FT}, 1} where FT
: Leaves
root_index_in_soil::Vector{Int64}
: Corresponding soil layer per root layer
canopy_index_in_air::Vector{Int64}
: Corresponding air layer per canopy layer
cache_k::Vector
: Conductances for each layer at given flow
cache_p::Vector
: Pressure for each layer at given flow
cache_q::Vector
: Flow rate
Land.PlantHydraulics.PalmLikeOrganism
— Typemutable struct PalmLikeOrganism{FT}
A plant hydraulic system like a palm, which contains multiple root layers, one trunk, and multiple canopy layers. No branch system applies.
Fields
n_root::Int64
: Root Layers
n_canopy::Int64
: Canopy Layers
roots::Array{Land.PlantHydraulics.RootHydraulics{FT}, 1} where FT
: Roots system
trunk::Land.PlantHydraulics.StemHydraulics
: Trunk
leaves::Array{Land.PlantHydraulics.LeafHydraulics{FT}, 1} where FT
: Leaves
root_index_in_soil::Vector{Int64}
: Corresponding soil layer per root layer
canopy_index_in_air::Vector{Int64}
: Corresponding air layer per canopy layer
cache_k::Vector
: Conductances for each layer at given flow
cache_p::Vector
: Pressure for each layer at given flow
cache_q::Vector
: Flow rate
Land.PlantHydraulics.TreeLikeOrganism
— Typemutable struct TreeLikeOrganism{FT}
A plant hydraulic system like a tree, which contains multiple root layers, one trunk, and multiple branch and canopy layers.
Fields
n_root::Int64
: Root Layers
n_canopy::Int64
: Canopy Layers
roots::Array{Land.PlantHydraulics.RootHydraulics{FT}, 1} where FT
: Roots system
trunk::Land.PlantHydraulics.StemHydraulics
: Trunk
branch::Array{Land.PlantHydraulics.StemHydraulics{FT}, 1} where FT
: Branch system
leaves::Array{Land.PlantHydraulics.LeafHydraulics{FT}, 1} where FT
: Leaves
root_index_in_soil::Vector{Int64}
: Corresponding soil layer per root layer
canopy_index_in_air::Vector{Int64}
: Corresponding air layer per canopy layer
cache_k::Vector
: Conductances for each layer at given flow
cache_p::Vector
: Pressure for each layer at given flow
cache_q::Vector
: Flow rate
Land.PlantHydraulics.TreeSimple
— Typemutable struct TreeSimple{FT}
A plant hydraulic system with one root, one stem, and one leaf for testing purpose
Fields
root::Land.PlantHydraulics.RootHydraulics
: Root
stem::Land.PlantHydraulics.StemHydraulics
: Stem
leaf::Land.PlantHydraulics.LeafHydraulics
: Leaf
krs::Vector
: Relative hydraulic conductance
To ease the initialization of a plant hydraulics system, a few customized functions are provided for quick initialization. More importantly, modifications to each field in the struct are always allowed. The quick functions are create_grass
, create_palm
, and create_tree
:
Land.PlantHydraulics.create_grass
— Functioncreate_grass(
z_root::FT,
z_canopy::FT,
soil_bounds::Array{FT,1},
air_bounds::Array{FT,1}
) where {FT<:AbstractFloat}
Create a GrassLikeOrganism
, given
z_root
Maximal root depth (negative value)z_canopy
Maximal canopy height (positive value)soil_bounds
Array of soil layer boundaries starting from 0air_bounds
Array of air layer boundaries starting from 0
Land.PlantHydraulics.create_palm
— Functioncreate_palm(z_root::FT,
z_trunk::FT,
z_canopy::FT,
soil_bounds::Array{FT,1},
air_bounds::Array{FT,1}
) where {FT<:AbstractFloat}
Create a PalmLikeOrganism
, given
z_root
Maximal root depth (negative value)z_trunk
Maximal trunk height (positive value)z_canopy
Maximal canopy height (positive value)soil_bounds
Array of soil layer boundaries starting from 0air_bounds
Array of air layer boundaries starting from 0
Land.PlantHydraulics.create_tree
— Functioncreate_tree(z_root::FT,
z_trunk::FT,
z_canopy::FT,
soil_bounds::Array{FT,1},
air_bounds::Array{FT,1}
) where {FT<:AbstractFloat}
Create a TreeLikeOrganism
, given
z_root
Maximal root depth (negative value)z_trunk
Maximal trunk height (positive value)z_canopy
Maximal canopy height (positive value)soil_bounds
Array of soil layer boundaries starting from 0air_bounds
Array of air layer boundaries starting from 0
What these functions do are to determine how many root layers and branch/canopy layers to add based on the tree information and environmental settings. To determine number of root layers, rooting depth and the soil layer information are required. The z_root
is the maximal root depth in negative number, and soil_bounds
is the boundaries of soil layers staring from 0. For example, for a soil_bounds
of [0.0, -1.0, -2.0, -3.0, -4.0], a z_root
of -1 gives 1 root layer, and a z_root
of -1.5 or -2.0 gives 2 root layers. The z_trunk
, z_canopy
, and air_bounds
determine how many canopy layers to add. For example, for a air_bounds
of [0.0, 1.0, 2.0, 3.0, 4.0, 5.0 ... 20.0, 21.0, 22.0], a z_trunk
of 5.0 z_canopy
of 7.0 give 2 canopy layers, and a z_trunk
of 5.5 z_canopy
of 7.0 give 2 canopy layers. Also, the root_index_in_soil
and canopy_index_in_air
indicate which soil or air layer the root or canopy layer corresponds with, respectively. For instance, a index of 7 means that the canopy layer should use the 7th air layer.
To initialize a whole-plant hydraulic system, checkout the example below:
FT = Float32;
grass = create_grass(FT(-2.1), FT(0.5), FT(8), FT[0,-1,-2,-3], collect(FT,0:1:20));
palm = create_palm(FT(-2.1), FT(0.5), FT(8), FT[0,-1,-2,-3], collect(FT,0:1:20));
tree = create_tree(FT(-2.1), FT(0.5), FT(8), FT[0,-1,-2,-3], collect(FT,0:1:20));
treet = TreeSimple{FT}();
Xylem hydraulic conductance
Plants transport water through xylem conduits (vessels in most angiosperms, trachieds in most gymnosperms). With the ascent of sap along the hydraulic system, water pressure in the conduits is typically negative. The negative xylem water pressure tends to pull air from surrounding tisses or the atmosphere into the xylem conduits, resulting in xylem cavitation. The air bubbles in cavitated conduits block water flow, and thus results in decline of water transport capability (measured by xylem hydraulic conductance).
Typically, the correlation between xylem water pressure ($P \leq 0$) and hydraulic conductance ($k$) is expressed by a Weibull function for WeibullSingle
type correlation:
\[k = k_\text{max} \cdot \exp \left( -\left( \dfrac{-P}{B} \right)^C \right)\]
where $k_\text{max}$ is the maximal hydraulic conductance, and $B$ and $C$ are the Weibull parameters. This correlation is also known as vulnerability curve (VC) to drought stress. Sometimes, plants exhibit a segmented VC, for example, the fibers may transport water as well and are much more resistant to drought than vessels. Thus, a dual Weibull function is presented for WeibullDual
type correlation ($P \leq 0$):
\[k = k_\text{max} \cdot \left\{ f_1 \cdot \exp \left[ -\left( \dfrac{-P}{B_1} \right)^{C_1} \right] + (1 - f_1) \cdot \exp \left[ -\left( \dfrac{-P}{B_2} \right)^{C_2} \right] \right\}\]
The VC formulations are abstractized as
Land.PlantHydraulics.AbstractXylemVC
— Typeabstract type AbstractXylemVC{FT<:AbstractFloat}
Hierachy of AbstractXylemVC
Land.PlantHydraulics.WeibullDual
— Typemutable struct WeibullDual{FT} <: Land.PlantHydraulics.AbstractXylemVC{FT}
Struct that contains dual Weibull function parameters.
Fields
b1::Any
: B of first part [MPa]
c1::Any
: C of first part
f1::Any
: F of first part
b2::Any
: B of second part [MPa]
c2::Any
: C of second part
f2::Any
: F of second part
Land.PlantHydraulics.WeibullSingle
— Typemutable struct WeibullSingle{FT} <: Land.PlantHydraulics.AbstractXylemVC{FT}
Struct that contains single Weibull function parameters.
Fields
b::Any
: B of first part [MPa]
c::Any
: C of first part
Land.PlantHydraulics.LogisticSingle
— Typemutable struct LogisticSingle{FT} <: Land.PlantHydraulics.AbstractXylemVC{FT}
Struct that contains single modified logistc function parameters.
Fields
a::Any
: Multiplier to exp
b::Any
: Multiplier to P [MPa⁻¹]
Land.PlantHydraulics.PowerSingle
— Typemutable struct PowerSingle{FT} <: Land.PlantHydraulics.AbstractXylemVC{FT}
Struct that contains single power function parameters.
Fields
a::Any
: Multiplier to power function, [MPa⁻ᵇ]
b::Any
: Power to pressure
The function to call is
Land.PlantHydraulics.xylem_k_ratio
— Functionxylem_k_ratio(
vc::AbstractXylemVC{FT},
p_25::FT,
vis::FT
) where {FT<:AbstractFloat}
Returns the relative hydraulic conductance, given
vc
Xylem vulnerability curvep
Xylem pressure at 298.15 K in[MPa]
p_25
Equivalent xylem pressure at 298.15 K in[MPa]
vis
Relative viscosity. If missing, vis = 1.
Note it here that xylem_k_ratio(vc, p)
calculate the k without making temperature corrections, but the xylem_k_ratio(vc, p_25, vis)
makes correction over the viscosity (the higher the viscosity, the lower the k). Also, p_25
means that the pressure has been corrected to 298.15 K for surface tension (the higher the surface tension, the more resistant the xylem).
Meanwhile, there is a function to call to calculate the critical pressure, beyond which leaf will decicate. The critical pressure is calculated as the pressure at which $k$ is 0.001 of $k_\text{max}$ for WeibullSingle
(for WeibullDual
, each segment need to reach 0.001). The functions is
Land.PlantHydraulics.xylem_p_crit
— Functionxylem_p_crit(vc::AbstractXylemVC{FT}, f_st::FT) where {FT<:AbstractFloat}
Returns the relative hydraulic conductance, given
vc
Xylem vulnerability curvest
Relative surface tension. If missing, vis = 1.
Examples:
FT = Float32;
vc_1 = WeibullSingle{FT}();
vc_2 = WeibullDual{FT}();
k_1 = xylem_k_ratio(vc_1, -1.0);
k_2 = xylem_k_ratio(vc_2, -1.0);
k_3 = xylem_k_ratio(vc_1, -1.0, 1.2);
k_4 = xylem_k_ratio(vc_2, -1.0, 1.2);
Rhizosphere hydraulic conductance
As mentioned above, there is a rhizosphere component in the root hydraulic system, and thus one needs to compute the pressure dtop along the rhizosphere. The soil properties are classified to BrooksCorey
and VanGenuchten
types subjected to AbstractSoilVC
:
Land.PlantHydraulics.AbstractSoilVC
— TypeLand.PlantHydraulics.BrooksCorey
— Typemutable struct BrooksCorey{FT<:AbstractFloat}
Brooks Corey soil parameters
Fields
stype::String
: Soil type
b::Any
: Soil b
ϕs::Any
: ϕ at saturation [MPa]
Θs::Any
: Soil water content (Θ) at saturation
Θr::Any
: Residual soil water content
Land.PlantHydraulics.VanGenuchten
— Typemutable struct VanGenuchten{FT<:AbstractFloat}
Van Gunechten soil parameters
Fields
stype::String
: Soil type
α::Any
: Soil α is related to the inverse of the air entry suction, α > 0
n::Any
: Soil n is Measure of the pore-size distribution
m::Any
: Soil m = 1 - 1/n
Θs::Any
: Soil water content (Θ) at saturation
Θr::Any
: Residual soil water content
Pre-defined parameter sets are avialble, and you may quick create a soil type struct using create_soil_VC
. Note that soil type parameters are van Genuchten type VC, and we curve fitted the curve to provide the parameters for Brooks and Corey type VC.
Land.PlantHydraulics.create_soil_VC
— Functioncreate_soil_VC(
vc::AbstractSoilVC{FT},
name::String,
α::Number,
n::Number,
Θs::Number,
Θr::Number
) where {FT<:AbstractFloat}
create_soil_VC(
vc::AbstractSoilVC{FT},
name::String
) where {FT<:AbstractFloat}
Create a AbstractSoilVC
type of soil VC, given
vc
AbstractSoilVC
type identifiername
Soil type name. Supported names include- "Sand"
- "Loamy Sand"
- "Sandy Loam"
- "Loam"
- "Sandy Clay Loam"
- "Silt Loam"
- "Silt"
- "Clay Loam"
- "Silty Clay Loam"
- "Sandy Clay"
- "Silty Clay"
- "Clay"
α
Soil αn
Soil nΘs
SWC at saturationΘr
Residual SWC
Land.PlantHydraulics.fit_soil_VC!
— Functionfit_soil_VC!(
vc_vG::VanGenuchten{FT},
vc_BC::BrooksCorey{FT}
) where {FT<:AbstractFloat}
Update BrooksCorey setup from known VanGenuchten parameters, given
vc_vG
VanGenuchten
type soil VCvc_BC
BrooksCorey
type soil VC
Correlations among soil relative water content, relative hydraulic conductance, and soil matrix potential are
Land.PlantHydraulics.soil_erwc
— Functionsoil_erwc(sh::AbstractSoilVC{FT}, p_25::FT) where {FT<:AbstractFloat}
Returns the Effective relative water content of the soil $\frac{Θ - Θr}{Θs - Θr}$, given
sh
BrooksCorey
orVanGenuchten
type soil hydraulicsp_25
Matrix water potential equivalent to 25 degree C, with surface tension
correction
Land.PlantHydraulics.soil_rwc
— Functionsoil_rwc(sh::AbstractSoilVC{FT}, p_25::FT) where {FT<:AbstractFloat}
Returns the relative soil water content, given
sh
BrooksCorey
orVanGenuchten
type soil hydraulicsp_25
Matrix water potential equivalent to 25 degree C, with surface tension
correction
Land.PlantHydraulics.soil_swc
— Functionsoil_swc(sh::AbstractSoilVC{FT}, p_25::FT) where {FT<:AbstractFloat}
Returns the soil water content, given
sh
BrooksCorey
orVanGenuchten
type soil hydraulicsp_25
Matrix water potential equivalent to 25 degree C, with surface tension
correction
Land.PlantHydraulics.soil_k_ratio_erwc
— Functionsoil_k_ratio_erwc(
sh::AbstractSoilVC{FT},
erwc::FT
) where {FT<:AbstractFloat}
Return the soil k relative to maximal k, given
sh
BrooksCorey
orVanGenuchten
type soil hydraulicserwc
Effective relative soil water content ($\frac{Θs - Θr}{Θs - Θ}$)
Land.PlantHydraulics.soil_k_ratio_rwc
— Functionsoil_k_ratio_rwc(sh::AbstractSoilVC{FT}, rwc::FT) where {FT<:AbstractFloat}
Return the soil k relative to maximal k, given
sh
BrooksCorey
orVanGenuchten
type soil hydraulicsrwc
Relative soil water content
Land.PlantHydraulics.soil_k_ratio_swc
— Functionsoil_k_ratio_swc(sh::AbstractSoilVC{FT}, swc::FT) where {FT<:AbstractFloat}
Return the soil k relative to maximal k, given
sh
BrooksCorey
orVanGenuchten
type soil hydraulicsswc
Relative soil water content
Land.PlantHydraulics.soil_k_ratio_p25
— Functionsoil_k_ratio_p25(
sh::AbstractSoilVC{FT},
p_25::FT
) where {FT<:AbstractFloat}
Return the soil k relative to maximal k, given
sh
AbstractSoilVC
type soil hydraulicsp_25
Matrix water potential equivalent to 25 degree C, with surface tension
Land.PlantHydraulics.soil_p_25_erwc
— Functionsoil_p_25_erwc(sh::AbstractSoilVC{FT}, erwc::FT) where {FT<:AbstractFloat}
Returns the Relative water content of the soil, given
sh
BrooksCorey
orVanGenuchten
type soil hydraulicserwc
Effectibe relative soil water content ($\frac{Θs - Θr}{Θs - Θ}$)
Note that this function returns the matrix potential of water, not water potential. Also, the potential is that at 25 degree C, not yet been corrected for temperature effect on surface tension.
Land.PlantHydraulics.soil_p_25_rwc
— Functionsoil_p_25_rwc(sh::AbstractSoilVC{FT}, rwc::FT) where {FT<:AbstractFloat}
Returns the Relative water content of the soil, given
sh
BrooksCorey
orVanGenuchten
type soil hydraulicsrwc
Relative soil water content
Note that this function returns the matrix potential of water, not water potential. Also, the potential is that at 25 degree C, not yet been corrected for temperature effect on surface tension.
Land.PlantHydraulics.soil_p_25_swc
— Functionsoil_p_25_swc(sh::AbstractSoilVC{FT}, rwc::FT) where {FT<:AbstractFloat}
Returns the Relative water content of the soil, given
sh
BrooksCorey
orVanGenuchten
type soil hydraulicsswc
Soil water content
Note that this function returns the matrix potential of water, not water potential. Also, the potential is that at 25 degree C, not yet been corrected for temperature effect on surface tension.
Pressure and Flow
The PlantHydraulics module is designed to run numerically for the following reasons:
- Weibull function is cannot be integrated
- The VC is segmented, i.e., if $P > 0$, $k = k_\text{max}$ (implemented in
xylem_k_ratio
) - Once xylem cavitation occurs, it cannot be easily recovered unless $P > 0$, and thus there is a drought legacy effect. This is why there are a few fields in the
LeafHydraulics
,RootHydraulics
, andStemHydraulics
structs to store the drought history information. - Temperature may change along the flow path. The
f_st
andf_vis
in the structs help deal with these effects.
Function end_pressure
calculates the xylem end pressure for an organ-level hysraulic system. As mentioned above, the RootHydraulics
and StemHydraulics
has a gravity component, and the RootHydraulics
has a rhizosphere component. Also be aware that end_pressure
accounts for temperature effects on surface tension and viscosity.
Land.PlantHydraulics.end_pressure
— Functionend_pressure(
leaf::LeafHydraulics{FT},
flow::FT
) where {FT<:AbstractFloat}
end_pressure(
root::RootHydraulics{FT},
flow::FT
) where {FT<:AbstractFloat}
end_pressure(
stem::StemHydraulics{FT},
flow::FT
) where {FT<:AbstractFloat}
end_pressure(
tree::TreeSimple{FT},
flow::FT
) where {FT<:AbstractFloat}
end_pressure(
tree::TreeSimple{FT},
f_sl::FT,
f_sh::FT,
r_sl::FT
) where {FT<:AbstractFloat}
Return the xylen end pressure(s) from flow rate(s), given
leaf
LeafHydraulics
type structflow
Flow rate (per leaf area forLeafHydraulics
)root
RootHydraulics
type structstem
StemHydraulics
type structtree
TreeSimple
type structf_sl
Flow rate to sunlit leavesf_sh
Flow rate to shaded leavesr_sl
Fraction of sunlit leaves
Note, gravity is accounted for in root and stem; rhizosphere conductance is accounted for in root; extra-xylary conductance is not accounted for in leaf here because it calculates xylem end pressure.
Noe that function end_pressure
does not update the pressure profiles or history in the xylem. To update these profiles, use pressure_profile!
, and to remove these legacy profiles, use inititialize_legacy!
:
Land.PlantHydraulics.pressure_profile!
— Functionpressure_profile!(
leaf::LeafHydraulics{FT},
flow::FT;
update::Bool = true
) where {FT<:AbstractFloat}
pressure_profile!(
root::RootHydraulics{FT},
flow::FT;
update::Bool = true
) where {FT<:AbstractFloat}
pressure_profile!(
root::RootHydraulics{FT},
q_in::FT,
flow::Array{FT,1};
update::Bool = true
) where {FT<:AbstractFloat}
pressure_profile!(
stem::StemHydraulics{FT},
flow::FT;
update::Bool = true
) where {FT<:AbstractFloat}
pressure_profile!(
stem::StemHydraulics{FT},
flow::Array{FT,1};
update::Bool = true
) where {FT<:AbstractFloat}
pressure_profile!(
tree::TreeSimple{FT},
p_soil::FT,
flow::FT;
update::Bool = true
) where {FT<:AbstractFloat}
pressure_profile!(
tree::TreeSimple{FT},
p_soil::FT,
f_sl::FT,
f_sh::FT,
r_sl::FT;
update::Bool = true
) where {FT<:AbstractFloat}
Update the pressure profile, given
leaf
LeafHydraulics
type structroot
RootHydraulics
type structstem
StemHydraulics
type structtree
TreeSimple
type structp_soil
Soil water potentialflow
Flow rate (per leaf area forLeafHydraulics
)f_sl
Flow rate to sunlit leavesf_sh
Flow rate to shaded leavesr_sl
Fraction of sunlit leavesupdate
Optional. If true, update drought legacy. Default istrue
forTreeSimple
butfalse
for others using capacitance
Land.PlantHydraulics.inititialize_legacy!
— Functioninititialize_legacy!(
hs::Union{LeafHydraulics,RootHydraulics,StemHydraulics})
inititialize_legacy!(tree::GrassLikeOrganism)
inititialize_legacy!(tree::PalmLikeOrganism)
inititialize_legacy!(tree::TreeLikeOrganism)
inititialize_legacy!(tree::TreeSimple)
Initialize the drought legacy effects in the xylem, given
hs
[AbstractHydraulicOrgan
] type structtree
TreeSimple
type struct
Examples:
FT = Float32;
leaf = LeafHydraulics{FT}();
p = end_pressure(leaf, FT(0.01));
@show leaf.p_element;
pressure_profile!(leaf, FT(0.01));
@show leaf.p_element;
Steady state and non-steady state mode
Land.PlantHydraulics.AbstractFlowMode
— TypeLand.PlantHydraulics.NonSteadyStateMode
— Typestruct NonSteadyStateMode <: AbstractFlowMode
Land.PlantHydraulics.SteadyStateMode
— Typestruct SteadyStateMode <: AbstractFlowMode
Land.PlantHydraulics.buffer_rate
— Functionbuffer_rate(pv::AbstractCapacity{FT}) where {FT<:AbstractFloat}
Return the buffer rate, given
pv
AbstractCapacity
type struct
Note that only symplastic water can be used as capacitance
Root Hydraulics
Function end_pressure
works for the case of only 1 root layer if one needs the plant base xylem water pressure. However, when there are multiple root layers, end_pressure
does not apply. In this case, iterations are required to calculate the xylem end pressure for each root layers, and then make sure all root layers have the same xylem end pressure. A few functions are provided to realize this.
Function xylem_flow
uses Root Solving method to calculate the flow rate through the RootHydraulics
struct that yields the given xylem end pressure. The ini
in the function is optional. However, using the flow rate from last instant when pressure does not differ much will speed up the calculation.
Land.PlantHydraulics.xylem_flow
— Functionxylem_flow(root::RootHydraulics{FT},
pressure::FT,
ini::FT = FT(1)
) where {FT<:AbstractFloat}
Calculate the flow rate from a given tree base pressure, given
root
RootHydraulics
type structpressure
Given tree base pressure in[MPa]
ini
Initial guess
In the plant hydraulic module design, flow rate is computed for each canopy layer, and thus computing flow rate for each root layer is required for a multiple layered root system. One feasible way is to do iterations using xylem_flow
function, i.e., iterate the xylem end pressure til the total flow rate equals the given value. However, this method is too inefficient. What I did is
- Calculate the xylem end pressure and whole root layer conductance from the initial flow rate;
- Calculate the mean xylem end pressure, and tune the flow rates in all root layers using the difference from mean pressure and root conductance;
- Sum up the new flow rates, and calculate the difference with given total flow rate;
- Use the calculated condutcance to weight out the differences.
The functions provided by PlantHydraulics module are
Land.PlantHydraulics.root_pk
— Functionroot_pk(root::RootHydraulics{FT},
flow::FT
) where {FT<:AbstractFloat}
root_pk(root::RootHydraulics{FT},
q_in::FT,
flow::Array{FT,1}
) where {FT<:AbstractFloat}
Return root xylem end pressure and root hydraulic conductance (reverse of summed resistance), given
root
RootHydraulics
structflow
Given flow rate(s) in the root layer, array for non-steady state with capacitance enabledq_in
Flow rate into the root
Land.PlantHydraulics.roots_flow!
— Functionroots_flow!(roots::Array{RootHydraulics{FT},1},
ks::Array{FT,1},
ps::Array{FT,1},
qs::Array{FT,1},
flow::FT,
recalculate::Bool
) where {FT<:AbstractFloat}
roots_flow!(roots::Array{RootHydraulics{FT},1},
ks::Array{FT,1},
ps::Array{FT,1},
qs::Array{FT,1},
flow::FT
) where {FT<:AbstractFloat}
roots_flow!(plant::Union{GrassLikeOrganism{FT},
PalmLikeOrganism{FT},
TreeLikeOrganism{FT}},
flow::FT
) where {FT<:AbstractFloat}
Recalculate the flow rates in the root from the pressure and conductance profiles in each root at non-steady state, given
roots
Array ofRootHydraulics
structsks
Container for conductance in each root layerps
Container for end xylem pressure in each layerqs
Container for flow rate out of each layerflow
Total flow rate out of the rootsrecalculate
A paceholder indicator of recalculating root flow (useless)plant
AbstractPlantOrganism
type struct
However, the steps above are only 1 iteration, and can only be used for the non-steady state version of model. For the steady-state flow rates, function roots_flow!
does thw work. What the function does is to iterate roots_flow!
till the difference among the calculated end pressures is small enough. I also emphasize that to speed up the code, 3 containers are added to the AbstractPlantOrganism
structs, and they are cache_k
, cache_p
, and cache_q
.
Example:
FT = Float32;
palm = create_palm(FT(-2.1), FT(0.5), FT(8), FT[0,-1,-2,-3], collect(FT,0:1:20));
roots_flow!(palm.roots, palm.cache_k, palm.cache_p, palm.cache_q, FT(1));
Leaf Hydraulics
The stomatal models often require plant hydraulics either as a correction factor (in empirical stomatal models) or as the risk term (in optimal stomatal models). To facilitate the calculations, a few specific functions are provided.
Function xylem_risk
returns the risk in xylem hydraulic function based on the most downstream end of the xylem. The risk of plant hydraulic system is not only on current system, but also potential new growth (plants don't want to risk new growth either). Thus, function xylem_risk
evaluates the risk from the xylem pressure calculated from current system (with drought history), and then compute the risk from the pressure (the severer the srought history, the higher the risk):
Land.PlantHydraulics.xylem_risk
— Functionxylem_risk(hs::LeafHydraulics{FT}, flow::FT) where {FT<:AbstractFloat}
Evaluate the hydraulic risk at the end of leaf xylem, given
hs
LeafHydraulics
type structflow
Flow rate (per leaf area)
Note that function xylem_risk
can work on its own without having other organ-level components. For example, by changing the p_ups
of a LeafHydraulics
, one can simulate the case of drought without caring about other hydraulic systems. Same for function critical_flow
below. However, these functions are only useful for sensitivity analysis or when p_ups
in the LeafHydraulics
is accurate.
Examples
FT = Float32;
leaf = LeafHydraulics{FT}();
risk = xylem_risk(leaf, FT(0.01));
@show risk;
leaf.p_ups = FT(-1.0);
risk = xylem_risk(leaf, FT(0.01));
@show risk;
Function critical_flow
calculates critical leaf transpiration rate, beyond which leaf will desicate. Function critical_flow
accounts for drought legacy effect by design, and the more severe the drought history, the lower the critical_flow
. Again, ini
in the function is also optional, but a good guess will speed up the calculations.
Examples
FT = Float32;
leaf = LeafHydraulics{FT}();
risk = critical_flow(leaf);
@show risk;
leaf.p_ups = FT(-1.0);
risk = critical_flow(leaf);
@show risk;
Whole-plant Hydraulics
Though xylem_risk
and critical_flow
can work on their own, the functions only evaluate the risks on leaf level. The more realistic case is that when leaf transpiration rate increases, p_ups
in the LeafHydraulics
gets more negative. Thus, the xylem_risk
and critical_flow
tends to underestimate the risk and overestimate the critical flow rate. To overcome this problem, whole-plant level plant hydraulics are provided.
Function end_pressure
calculates the leaf xylem end pressure for a whole-plant struct using these steps:
- calculate the plant base pressure from a given total flow rate
- calculate the trunk end pressure (if present)
- calculate the branch end pressure (if present)
- calculate the leaf end pressure (if present)
Accordingly, there is a function critical_flow
to calculate the critical flow rate for the whole plant. Be aware that Plant-level function end_pressure
and critical_flow
only applies to the case of only one canopy layer (or big-leaf model). As to the case of multiple canopy layer, more functions are pending.
Land.PlantHydraulics.critical_flow
— Functioncritical_flow(
hs::LeafHydraulics{FT},
ini::FT = FT(0.5)
) where {FT<:AbstractFloat}
critical_flow(
tree::TreeSimple{FT},
ini::FT = FT(0.5)
) where {FT<:AbstractFloat}
Calculate the critical flow rate (K ≈ 0), given
hs
LeafHydraulics
type structini
Initial guesstree
TreeSimple
type struct
Note, for the safety of no NaN, update critical_flow when ΔP >= -0.01
Note that the organ level or whole-plant level conductances are different from xylem hydraulic conductance at a given xylem slice. Also, simply computing the conductance as the flow rate divided by pressre drop is not accurate because of the gravity. In the PlantHydraulics module, the organ and whole-plant level conductances are computed by firstly adding up all the resistances in each element, and then computing the relative loss of conductance. The function available to use is
Land.PlantHydraulics.plant_conductances!
— Functionplant_conductances!(tree::TreeSimple{FT}) where {FT<:AbstractFloat}
Update plant total hydraulic information in each element and whole plant, given
tree
TreeSimple
type struct
Temperature effects
Plant hydraulic properties changes with temperature, due to its impacts on surface tension and viscosity. As to surface tension, when temperature increases, air-water interface surface tension decreases, meaning that with the same curvature, the capillary pressure provided decreases. As a result, soil matrix potential becomes less nagative (good for plants!), but the conduit resistance to cavitation decreases (bad for plants!). As to viscosity, when temperature increases, viscosity decreases, meaning that pressure drop decreases at the same flow rate (good for plants!). To account for these effects, we provided temperature_effects!
function:
Land.PlantHydraulics.temperature_effects!
— Functiontemperature_effects!(
hs::LeafHydraulics{FT}
) where {FT<:AbstractFloat}
temperature_effects!(
hs::AbstractHydraulicOrgan{FT}
) where {FT<:AbstractFloat}
temperature_effects!(
hs::AbstractHydraulicOrgan{FT},
T::FT
) where {FT<:AbstractFloat}
temperature_effects!(
tree::TreeSimple{FT}
) where {FT<:AbstractFloat}
Update temperature effetcs on hydralic system, given
hs
AbstractHydraulicOrgan
type structT
Given temperaturetree
TreeSimple
type struct
Keep in mind that, leaf critical pressure changes due to surface tension, though the impact can be neglected for minor temperature change. However, soil water content is still computed using the equivalent matrix potential at 25 Celcius because water content is only related to the air-water interface curvature.
Pressure-volume curve
Land.PlantHydraulics.AbstractCapacity
— Typeabstract type AbstractCapacity{FT<:AbstractFloat}
Hierachy of AbstractCapacity
Land.PlantHydraulics.PVCurveLinear
— Typemutable struct PVCurveLinear{FT<:AbstractFloat} <: Land.PlantHydraulics.AbstractCapacity{FT<:AbstractFloat}
Struct that contains information for linear PV curve
Fields
slope::AbstractFloat
: Slope of the linear PV curve (relative to maximum) [MPa⁻¹]
k_refill::AbstractFloat
: Conductance for refilling (relative to maximum) [MPa⁻¹ s⁻¹]
Land.PlantHydraulics.PVCurveSegmented
— Typemutable struct PVCurveSegmented{FT} <: Land.PlantHydraulics.AbstractCapacity{FT}
Land.PlantHydraulics.p_from_volume
— Functionp_from_volume(
pv::AbstractCapacity{FT},
rvol::FT,
T::FT
) where {FT<:AbstractFloat}
Calculate equilibrium pressure from relative volume, given
pv
AbstractCapacity
type of struct
Land.PlantHydraulics.update_PVF!
— Functionupdate_PVF!(hs::LeafHydraulics{FT}, Δt::FT) where {FT<:AbstractFloat}
update_PVF!(hs::StemHydraulics{FT}, Δt::FT) where {FT<:AbstractFloat}
update_PVF!(hs::RootHydraulics{FT}, Δt::FT) where {FT<:AbstractFloat}
update_PVF!(hs::RootHydraulics{FT},
Δt::FT,
nss::Bool
) where {FT<:AbstractFloat}
update_PVF!(roots::Array{RootHydraulics{FT},1},
ks::Array{FT,1},
ps::Array{FT,1},
qs::Array{FT,1},
q_sum::FT,
Δt::FT
) where {FT<:AbstractFloat}
update_PVF!(tree::GrassLikeOrganism{FT}, Δt::FT) where {FT<:AbstractFloat}
update_PVF!(tree::PalmLikeOrganism{FT}, Δt::FT) where {FT<:AbstractFloat}
update_PVF!(tree::TreeLikeOrganism{FT}, Δt::FT) where {FT<:AbstractFloat}
Update pressure, capacitance, and flow rates in hydraulic system, given
hs
AbstractHydraulicOrgan
orAbstractPlantOrganism
type structΔt
Time intervalnss
NonSteadyStateMode placeholder (useless)ks
Container for conductance in each root layerps
Container for end xylem pressure in each layerqs
Container for flow rate out of each layerq_sum
Total flow rate out of the rootstree
GrassLikeOrganism
,PalmLikeOrganism
, orTreeLikeOrganism
type struct
Note that this function only updates the equilibrium pressure in the tissue, but not the xylem flow pressure. The difference between the two pressures is used to drive water exchange between xylem and capacictance tissues.