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

See the documentation for each struct for more details:

Land.PlantHydraulics.LeafHydraulicsType
mutable 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⁻¹]

source
Land.PlantHydraulics.RootHydraulicsType
mutable 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⁻¹]

source
Land.PlantHydraulics.StemHydraulicsType
mutable 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⁻¹]

source

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 HSs are

  • GrassLikeOrganism has only mutiple root and canopy layers, no trunk or branch
  • PalmLikeOrganism has multiple root layers, a trunk, and multiple canopy layers, no branch system
  • TreeLikeOrganism has multiple root layers, a trunk, and multiple branch + canopy layers, and each branch corresponds to a canopy layer
  • TreeSimple has one root, one stem, and one leaf for testing purpose

See the documentation for each struct for more details:

Land.PlantHydraulics.GrassLikeOrganismType
mutable 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

source
Land.PlantHydraulics.PalmLikeOrganismType
mutable 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

source
Land.PlantHydraulics.TreeLikeOrganismType
mutable 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

source
Land.PlantHydraulics.TreeSimpleType
mutable 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

source

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_grassFunction
create_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 0
  • air_bounds Array of air layer boundaries starting from 0
source
Land.PlantHydraulics.create_palmFunction
create_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 0
  • air_bounds Array of air layer boundaries starting from 0
source
Land.PlantHydraulics.create_treeFunction
create_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 0
  • air_bounds Array of air layer boundaries starting from 0
source

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.WeibullDualType
mutable 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

source
Land.PlantHydraulics.WeibullSingleType
mutable 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

source
Land.PlantHydraulics.LogisticSingleType
mutable 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⁻¹]

source
Land.PlantHydraulics.PowerSingleType
mutable 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

source

The function to call is

Land.PlantHydraulics.xylem_k_ratioFunction
xylem_k_ratio(
            vc::AbstractXylemVC{FT},
            p_25::FT,
            vis::FT
) where {FT<:AbstractFloat}

Returns the relative hydraulic conductance, given

  • vc Xylem vulnerability curve
  • p 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.
source

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_critFunction
xylem_p_crit(vc::AbstractXylemVC{FT}, f_st::FT) where {FT<:AbstractFloat}

Returns the relative hydraulic conductance, given

  • vc Xylem vulnerability curve
  • st Relative surface tension. If missing, vis = 1.
source

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.BrooksCoreyType
mutable 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

source
Land.PlantHydraulics.VanGenuchtenType
mutable 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

source

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_VCFunction
create_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 identifier
  • name 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
source

Correlations among soil relative water content, relative hydraulic conductance, and soil matrix potential are

Land.PlantHydraulics.soil_erwcFunction
soil_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 or VanGenuchten type soil hydraulics
  • p_25 Matrix water potential equivalent to 25 degree C, with surface tension

correction

source
Land.PlantHydraulics.soil_rwcFunction
soil_rwc(sh::AbstractSoilVC{FT}, p_25::FT) where {FT<:AbstractFloat}

Returns the relative soil water content, given

  • sh BrooksCorey or VanGenuchten type soil hydraulics
  • p_25 Matrix water potential equivalent to 25 degree C, with surface tension

correction

source
Land.PlantHydraulics.soil_k_ratio_p25Function
soil_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 hydraulics
  • p_25 Matrix water potential equivalent to 25 degree C, with surface tension
source
Land.PlantHydraulics.soil_p_25_erwcFunction
soil_p_25_erwc(sh::AbstractSoilVC{FT}, erwc::FT) where {FT<:AbstractFloat}

Returns the Relative water content of the soil, given

  • sh BrooksCorey or VanGenuchten type soil hydraulics
  • erwc 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.

source
Land.PlantHydraulics.soil_p_25_rwcFunction
soil_p_25_rwc(sh::AbstractSoilVC{FT}, rwc::FT) where {FT<:AbstractFloat}

Returns the Relative water content of the soil, given

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.

source
Land.PlantHydraulics.soil_p_25_swcFunction
soil_p_25_swc(sh::AbstractSoilVC{FT}, rwc::FT) where {FT<:AbstractFloat}

Returns the Relative water content of the soil, given

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.

source

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, and StemHydraulics structs to store the drought history information.
  • Temperature may change along the flow path. The f_st and f_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_pressureFunction
end_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

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.

source

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!Function
pressure_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 struct
  • root RootHydraulics type struct
  • stem StemHydraulics type struct
  • tree TreeSimple type struct
  • p_soil Soil water potential
  • flow Flow rate (per leaf area for LeafHydraulics)
  • f_sl Flow rate to sunlit leaves
  • f_sh Flow rate to shaded leaves
  • r_sl Fraction of sunlit leaves
  • update Optional. If true, update drought legacy. Default is true for TreeSimple but false for others using capacitance
source
Land.PlantHydraulics.inititialize_legacy!Function
inititialize_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 struct
  • tree TreeSimple type struct
source

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

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_flowFunction
xylem_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 struct
  • pressure Given tree base pressure in [MPa]
  • ini Initial guess
source

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_pkFunction
root_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 struct
  • flow Given flow rate(s) in the root layer, array for non-steady state with capacitance enabled
  • q_in Flow rate into the root
source
Land.PlantHydraulics.roots_flow!Function
roots_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 of RootHydraulics structs
  • ks Container for conductance in each root layer
  • ps Container for end xylem pressure in each layer
  • qs Container for flow rate out of each layer
  • flow Total flow rate out of the roots
  • recalculate A paceholder indicator of recalculating root flow (useless)
  • plant AbstractPlantOrganism type struct
source

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):

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_flowFunction
critical_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

Note, for the safety of no NaN, update critical_flow when ΔP >= -0.01

source

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

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!Function
temperature_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

source

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.PVCurveLinearType
mutable 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⁻¹]

source
Land.PlantHydraulics.update_PVF!Function
update_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

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.

source