PyHelios 0.1.11
Loading...
Searching...
No Matches
Stomatal Conductance Model Plugin Documentation

DependenciesNone
Python Importfrom pyhelios import StomatalConductanceModel
Main ClassStomatalConductanceModel

Overview

StomatalConductanceModel provides comprehensive stomatal conductance modeling and gas exchange calculations using validated stomatal response models. This plugin enables accurate simulation of plant-atmosphere interactions and water-carbon coupling in plant physiological studies.

The plugin implements several different stomatal conductance models. A brief description of the theory behind each model is given below, along with coefficients obtained from several example species.

The default model is the Buckley, Mott, Farquhar model (see Buckley, Mott, Farquhar (2003) Model (simplified version given in Buckley, Turnbull, and Adams 2012)).

System Requirements

Dependencies None
Platforms Windows, Linux, macOS
GPU Not required

Quick Start

from pyhelios import Context, StomatalConductanceModel
from pyhelios.types import *
# Create context and add leaf geometry
with Context() as context:
leaf_uuid = context.addPatch(center=vec3(0, 0, 1), size=vec2(0.1, 0.1))
with StomatalConductanceModel(context) as stomatal:
# Use species library for quick setup
stomatal.setBMFCoefficientsFromLibrary("Almond")
# Run steady-state calculation
stomatal.run()

Primitive Data

Input Primitive Data

Primitive Data Label Symbol Units Data Type Description Applicable model(s) Available Plug-ins Default Value
radiation_flux_PAR \(Q\) W/m2 float PAR photon flux density. Note W/m2 is automatically converted to \(\mu\)mol/m2/s using a factor of 4.57. BMF Can be computed by RadiationModel plug-in. 0
temperature \(T_s\) Kelvin float Primitive surface temperature. All Can be computed by EnergyBalanceModel plug-in. 300 K
air_pressure \(p_{atm}\) Pascals float Atmospheric pressure. All N/A 101,000 Pa
air_temperature \(T_a\) Kelvin float Temperature of air outside of primitive boundary-layer. All N/A 300 K
air_humidity \(h\) Unitless float Relative humidity of air outside of primitive boundary-layer. All N/A 0.5
boundarylayer_conductance** \(g_H\) mol air/m2-s float Boundary-layer conductance to heat. (Assumed that b.l. conductance to moisture is 1.08 that of heat.) All Can be computed by BLConductanceModel plug-in, or by EnergyBalanceModel plug-in if optional output primitive data "boundarylayer_conductance_out" is enabled. 0.1 mol/m2-s
beta_soil \(\beta\) unitless float Soil moisture factor, defined as \((\theta-\theta_w)/(\theta_f-\theta_w)\), with \(\theta,\,\theta_f,\,\theta_w\) being the effective soil water content, water content at field capacity, and water content at the wilting point. All N/A 1.0
net_photosynthesis \(A\) \(\mu\)mol/m2-s float Net CO2 (photosynthetic) flux. BWB, BBL, Mopt Can be computed by PhotosynthesisModel plug-in. 0
air_CO2 \(C_a\) \(\mu\)mol/mol float CO2 concentration of air outside primitive boundary-layer. BWB, BBL, Mopt N/A 400 \(\mu\)mol/mol
Gamma_CO2 \(\Gamma\) \(\mu\)mol/mol float CO2 compensation point of photosynthesis including dark respiration. (Note: only used for Ball-Berry models.) BBL Can be computed by PhotosynthesisModel plug-in (need to enable optional primitive data output).

100 \(\mu\)mol/mol

**The stomatal conductance model will also check for primitive data "boundarylayer_conductance_out" if "boundarylayer_conductance" does not exist. If you are using the energy balance model to calculate the boundary-layer conductance, you should enable optional output primitive data "boundarylayer_conductance_out" so that other plug-ins can use it.

Output Primitive Data

Primitive Data Label Symbol Units Data Type Description
moisture_conductance \(g_s\) mol air/m2-sec float Conductance of water vapor through stomata.

Optional Output Primitive Data

Optional output primitive data can be written to the context by calling optionalOutputPrimitiveData(), with an argument of one of the primitive data labels given in the table below.

from pyhelios import StomatalConductanceModel
stomatal = StomatalConductanceModel(context)
stomatal.optionalOutputPrimitiveData("vapor_pressure_deficit")
Primitive Data LabelUnitsData TypeDescription
vapor_pressure_deficitmmol/mol floatVapor pressure deficit between the stomatal cavity and leaf surface. Only applicable for BMF model.
model_parametersN/A std::stringModel parameters for each primitive. See table below for the actual primitive data labels that are created.

If you enable the optional output primitive data "model_parameters", different primitive data will be created based on the selected model corresponding to each model parameter.

ModelModel ParameterOutput Primitive Data Label
Ball-Woodrow-Berry\(g_{s,0}\)gs0_BWB
\(a_1\)a1_BWB
Ball-Berry-Leuning\(g_{s,0}\)gs0_BBL
\(a_1\)a1_BBL
\(D_0\)D0_BBL
Medlyn Optimality\(g_{s,0}\)gs0_MOPT
\(g_1\)g1_MOPT
Buckley-Mott-Farquhar\(E_m\)Em_BMF
\(i_0\)i0_BMF
\(k\)k_BMF
\(b\)b_BMF

Introduction

This plugin implements several different stomatal conductance models. A brief description of the theory behind each model is given below, along with coefficients obtained from several example species.

The default model is the Buckley, Mott, Farquhar model (see Buckley, Mott, Farquhar (2003) Model (simplified version given in Buckley, Turnbull, and Adams 2012)).

Ball, Woodrow, Berry (1987) Model Theory

The Ball, Woodrow, and Berry (1987) model is based on the empirical observation that stomatal conductance various roughly linearly with the net photosynthetic flux \(A\) and relative humidity at the leaf surface \(h_s\). They proposed the relationship:

\[g_s = g_{s,0}+a_1A\beta\frac{h_s}{C_s},\]

where \(C_s\) is the air CO2 concentration at the leaf surface, and \(g_{s,0}\) and \(a_1\) are empirical parameters. \(\beta\) is a factor to account for reduction in stomatal conductance with soil drying and is defined as

\[\beta = \frac{\theta-\theta_w}{\theta_f-\theta_w},\]

where \(\theta,\,\theta_f,\,\theta_w\) are the effective soil water content, water content at field capacity, and water content at the wilting point. By default, it is assumed that \(\beta=1\).

This model is at odds with several more recent observation of stomatal function, including: 1) stomata have been shown to respond to the intercellular CO2 concentration \(C_i\) and not the concentration outside of the leaf (Mott 1988); 2) stomata respond to the rate of evaporation, not humidity itself (Mott and Parkhurst 1991); 3) the predicted \(g_s\) value could become negative; 4) the predicted value of \(g_s\) approaches infinity as \(C_s\rightarrow \infty\); 5) the predicted value of \(g_s\) does not respond to soil drying. Another more practical limitation is that photosynthesis must also be modeled in order to calculate stomatal conductance. Nonetheless, this model is one of the most commonly used models of stomatal conductance.

The CO2 concentration at the leaf surface is calculated as

\[C_s = C_a-\frac{A}{0.75g_{bw}},\]

where \(0.75g_{bw}\) is the boundary-layer conductance to CO2 (assuming the diffusivity of CO2 in air is 0.75 that of water vapor), and \(C_a\) is the air CO2 concentration outside of the leaf boundary-layer.

The relative humidity at the leaf surface is calculated by setting up a water vapor flux balance at the leaf surface and iteratively solving for the humidity at the leaf surface:

\[g_s*e_{sat}(T_L)*(1-h_s) = g_{bw}*(e_{sat}(T_L)h_s-e_{sat}(T_a)h_a),\]

where \(e_{sat}(T_L)\) and \(e_{sat}(T_a)\) are the saturated vapor pressure evaluated respectively at the leaf surface and air temperature (calculated according to the Tetens equation), and \(h_a\) is the air relative humidity outside the leaf boundary-layer.

Below are example parameter values for several different tree crop species (a description of how calibration data was collected is given in the section below). Note that, as mentioned above, in order to apply the model photosynthesis must also be modeled - coefficients for these species are also given in the photosynthesis model documentation.

Species \(g_{s,0}\) (mol air/m2-s) \(a_1\) (unitless) \(R^2\) of fit
Almond (default) 0.0733 9.422 0.976
Apple 0.0444 7.681 0.809
Cherry 0.0939 5.226 0.839
Prune 0.0425 7.120 0.917
Pear 0.0775 8.298 0.928
Pistachio (female) 0.0647 10.732 0.956
Pistachio (male) 0.0419 7.580 0.953
Walnut 0.1253 5.527 0.962

Ball-Berry-Leuning Model Theory

Leuning et al. (1990,1995) revised the original Ball, Woodrow, Berry model to overcome some of it's original limitations, namely the fact that \(g_s\) approaches infinity as \(C_s\rightarrow \infty\) by calculating stomatal conductance as

\[g_s = g_{s,0}+\frac{a_1A\beta}{\left(C_s-\Gamma\right)\left(1+\frac{D_s}{D_0}\right)},\]

where \(D_s\) is the vapor pressure deficit between the sub-stomatal cavity and the leaf surface, \(\Gamma\) is the CO2 compensation point of photosynthesis (including dark respiration), and \(D_0\) (mmol/mol) is an additional empirical parameter.

\(D_s\) is calculated by first determining the surface relative humidity as described above for the Ball, Woodrow, Berry model, then calculating the surface vapor pressure deficit as \(D_s=\frac{e_{sat}(T_L)(1-h_s)}{p_{atm}}\) ( \(p_{atm}\) is atmospheric pressure).

Below are example parameter values for several different tree crop species (a description of how calibration data was collected is given in the section below). Note that, as mentioned above, in order to apply the model photosynthesis must also be modeled - coefficients for these species are also given in the photosynthesis model documentation.

Species \(g_{s,0}\) (mol air/m2-s) \(a_1\) (unitless) \(D_0\) (mmol/mol) \(R^2\) of fit
Almond (default) 0.0743 4.265 14570.0 0.984
Apple 0.0405 3.511 32950.2 0.869
Cherry 0.0881 2.485 1578689.7 0.947
Prune 0.0425 3.185 30488.1 0.846
Pear 0.0814 3.718 61725.6 0.894
Pistachio (female) 0.0675 4.743 1566202.4 0.971
Pistachio (male) 0.0465 3.370 26990.8 0.934
Walnut 0.1248 4.548 21.4 0.977

Medlyn et al. (2011) Optimality-Based Model

The stomatal conductance mode of Medlyn et al. (2011) combines the empirical modeling approach with the hypothesis that stomata should act should act to optimally minimize the amount of water used per unit carbon gained.

\[g_s = g_{s,0}+1.6\left(1+\frac{g_1\sqrt{\beta}}{\sqrt{D_s P_{atm}}}\right)\frac{A}{C_s},\]

where \(D_s\) is in units of mol/mol, and \(P_{atm}\) is atmospheric pressure in kPa. Note that there are a couple of deviations of this equation from that presented in Medlyn et al. (2011): 1) The factor of 1.6 is needed for the resulting conductance to be that of water vapor, 2) We express \(D_s\) in units of mol/mol, and thus multiplication by the atmospheric pressure is needed to get units of kPa, 3) We use surface values for VPD and CO2 concentration, which allows for incorporation of boundary-layer effects.

One issue with this model is that stomatal conductance blows up to infinity as \(D_s\rightarrow 0\). Our implementation imposes an arbitrary minimum \(D_s\) value of 0.00001 mol/mol.

Below are example parameter values for several different tree crop species (a description of how calibration data was collected is given in the section below). Note that, as mentioned above, in order to apply the model photosynthesis must also be modeled - coefficients for these species are also given in the photosynthesis model documentation.

Species \(g_{s,0}\) (mol air/m2-s) \(g_1\) ( \(\sqrt{kPa}\)) \(R^2\) of fit
Almond (default) 0.0825 2.637 0.941
Apple 0.0426 2.160 0.864
Cherry 0.0936 1.043 0.893
Prune 0.0412 1.863 0.949
Pear 0.0775 2.418 0.966
Pistachio (female) 0.0756 3.252 0.902
Pistachio (male) 0.0434 2.039 0.941
Walnut 0.1246 1.167 0.973

Buckley, Mott, Farquhar (2003) Model (simplified version given in Buckley, Turnbull, and Adams 2012)

The stomatal conductance model of Buckley, Turnbull, and Adams (2012) is a simplification of the hydromechanical/biochemical model orignially proposed by Buckley, Mott, and Farquhar (2003). The original model is highly complex with many parameters, but with the simplifications described by Buckley, Turnbull, and Adams (2003), an explicit expression for stomatal conductance can be written as

\[g_s = \frac{E_m\beta(Q+i_0)}{k+bQ+(Q+i_0)D_s},\]

where \(Q\) is the photosynthetic photon flux density, \(D_s\) is defined and calculated as described for other models above, \(E_m,\,i_0,\,k,\) and \(b\) are semi-empirical parameters. Note that the photosynthetic flux that is input to the plug-in is in units of energy flux (W/m2), but \(Q\) in this equation is photon flux density ( \(\mu\)mol/m2-s). This is because the primitive data value output from the radiation model is in energy flux. The stomatal conductance plug-in automatically converts energy flux to photon flux density using a factor of 4.57 \(\mu\)mol/W.

Below are example parameter values for several different tree crop species (a description of how calibration data was collected is given in the section below).

Species \(E_m\) (mmol/m2-s) \(i_0\) ( \(\mu\)mol/m2-s) \(k\) ( \(\mu\)mol/m-2s-1 mmol mol-1) \(b\) (mmol/mol) \(R^2\) of fit
Almond (default) 865.52 38.65 780320.1 2086.07 0.991
Apple 24.82 182.86 109688.7 21.30 0.986
Cherry 138.03 154.24 262462.7 545.59 0.963
Prune 5.47 115.73 12280.2 6.10 0.993
Pear 13.06 167.89 25926.4 9.81 0.960
Pistachio (female) 24865.61 171.52 63444078.5 22428.01 0.968
Pistachio (male) 236.89 272.74 1224393.7 257.26 0.964
Walnut 29.12 68.03 19778.8 75.26 0.972

Using the Stomatal Conductance Model

Setting the Model Coefficients

Each model has a data structure containing member variables for each of the model parameters. These are listed in the table below.

Model Parameter Structure
Ball, Woodrow, Berry BWBcoefficients
Ball, Berry, Leuning BBLcoefficients
Medlyn et al. Optimality MOPTcoefficients
Buckley, Mott, Farquhar BMFcoefficients

In order to modify model coefficients from the default values, one should 1) declare and instance of the coefficient structure, 2) modify the appropriate data elements of the data structure, and 3) pass the data structure to the model-specific coefficient setting function (e.g., setBMFCoefficients()). Model coefficients can be set to the same value for all primitives, or differently for a subset of primitives based on a vector of UUIDs. Example code is given below


from pyhelios import BMFCoefficients
modelcoeffs = BMFCoefficients()
modelcoeffs.Em = 9.3
modelcoeffs.i0 = 5.3
modelcoeffs.k = 672
modelcoeffs.b = 6.7
# Apply to all primitives
stomatal.setBMFCoefficients(modelcoeffs)
# Or apply to specific primitives only
stomatal.setBMFCoefficients(modelcoeffs, uuids=[uuid1, uuid2, uuid3])

UUID-Based Coefficient Setting

PyHelios uses a UUID-based approach for setting coefficients to specific primitives. Coefficients can be applied to all primitives or to a subset specified by their UUIDs.

Setting coefficients for different species:

from pyhelios import Context, StomatalConductanceModel, WeberPennTree, WPTType
from pyhelios.types import vec3, vec2
with Context() as context:
# Create different tree species
with WeberPennTree(context) as wpt:
almond_tree_id = wpt.buildTree(WPTType.ALMOND, origin=vec3(0, 0, 0))
# Get UUIDs for almond tree leaves
almond_leaf_uuids = context.getAllUUIDs()
# Create grape leaves separately
grape_leaf_uuids = []
for i in range(10):
uuid = context.addPatch(center=vec3(5, i, 0), size=vec2(0.1, 0.1))
grape_leaf_uuids.append(uuid)
with StomatalConductanceModel(context) as stomatal:
# Set coefficients from species library for each group
stomatal.setBMFCoefficientsFromLibrary("Almond", uuids=almond_leaf_uuids)
stomatal.setBMFCoefficientsFromLibrary("Grape", uuids=grape_leaf_uuids)
# Run model - coefficients automatically applied based on UUIDs
stomatal.run()

You can also set custom coefficients for specific primitives:

from pyhelios import BMFCoefficients
custom_coeffs = BMFCoefficients()
custom_coeffs.Em = 500.0
custom_coeffs.i0 = 100.0
custom_coeffs.k = 5000.0
custom_coeffs.b = 1000.0
# Apply to specific primitives only
stomatal.setBMFCoefficients(custom_coeffs, uuids=[uuid1, uuid2, uuid3])
# Or apply to all primitives
stomatal.setBMFCoefficients(custom_coeffs)

Running the Model (steady-state mode)

There are two possible functions to run the model: one to run the model for all primitives in the Context (see run()), and another to run the model only for a subset of primitives given their UUIDs (see run()).

from pyhelios import Context, StomatalConductanceModel, BMFCoefficients
from pyhelios.types import vec3, vec2
# Initialize the Context and add some geometry
with Context() as context:
context.addPatch(center=vec3(0, 0, 0), size=vec2(1, 1))
# Initialize the stomatal conductance model
with StomatalConductanceModel(context) as stomatal:
# Initialize model coefficients and modify their values
modelcoeffs = BMFCoefficients() # values are initialized with default values
modelcoeffs.Em = 9.3 # we can modify one or more parameters
modelcoeffs.i0 = 5.3
modelcoeffs.k = 672
modelcoeffs.b = 6.7
stomatal.setBMFCoefficients(modelcoeffs)
# -- Normally you would initialize and run some other models (e.g., radiation, energybalance) here --
# Run the stomatal conductance model (for all primitives)
stomatal.run()

Running the Model in Dynamic Mode

Any of the above steady-state models can be run in dynamic mode by specifying a timestep and response time constants, which will delay stomatal response to environmental stimuli. When environmental conditions are changed, the stomatal conductance will exponentially relax toward the steady-state value, which is calculated according to any of the above models.

Let the steady-state stomatal conductance value calculated according to any of the above models be denoted by \(g_{s,ss}\). Then the dynamic stomatal conductance is calculated according to the following equation

\[\dfrac{d g_s}{dt} = \dfrac{g_{s,ss} - g_s}{\tau},\]

where

\(\tau\) is the time constant for stomatal response to a change in environmental conditions, and \(\tau = \tau_{open}\) if stomata are opening, and \(\tau = \tau_{close}\) if stomata are closing.

The above equation can be discretized using a forward Euler scheme to update the stomatal conductance after each timestep \(\Delta t\) as

\[g_s^{new} = g_s^{old} + \dfrac{g_{s,ss} - g_s^{old}}{\tau}\Delta t.\]

The response time constants \(\tau_{open}\) and \(\tau_{close}\) are specified using the setDynamicTimeConstants() method. If time constants are not defined, a warning will be issued and the model will run in steady-state mode.

The model also requires an initial stomatal conductance value, which is specified by setting primitive data "moisture_conductance". If this primitive data is not defined, the model will run in steady-state mode for the first timestep, and this steady-state value will become the initial value for running in dynamic mode.

Below is and example of running the model in dynamic mode.

from pyhelios import Context, StomatalConductanceModel, BMFCoefficients
# Initialize the Context and add some geometry
with Context() as context:
UUID = context.addPatch()
# Initialize the stomatal conductance model
with StomatalConductanceModel(context) as stomatal:
# Initialize model coefficients with default values
modelcoeffs = BMFCoefficients() # values are initialized with default values
stomatal.setBMFCoefficients(modelcoeffs)
# Set the response time constants (seconds)
tau_open = 10
tau_close = 10
stomatal.setDynamicTimeConstants(tau_open, tau_close)
# Set the initial stomatal conductance value
gs_initial = 0.2
context.setPrimitiveData(UUID, "moisture_conductance", gs_initial)
dt = 1 # timestep (seconds)
Nsteps = 50 # number of timesteps to run
for t in range(Nsteps):
# Run the model for each timestep
stomatal.run(dt)
# Get and print the stomatal conductance value
gs_dyn = context.getPrimitiveData(UUID, "moisture_conductance")
print(f"Timestep {t}: {gs_dyn}")