Skip to main content

Stomatal Conductance Models

PhyTorch implements several empirical and semi-empirical models of stomatal conductance that link stomatal behavior to environmental conditions and photosynthesis.

Available Models

PhyTorch provides four widely-used stomatal conductance models:

  1. MED2011 - Medlyn et al. (2011) unified stomatal optimization model
  2. BWB1987 - Ball-Woodrow-Berry (1987) model
  3. BBL1995 - Ball-Berry-Leuning (1995) model
  4. BTA2012 - Buckley-Turnbull-Adams (2012) optimization model

Basic Usage

All stomatal conductance models follow the same unified API:

from phytorch import fit
from phytorch.models.stomatal import MED2011
import pandas as pd

# Load your gas exchange data
df = pd.read_csv('your_data.csv')

# Prepare data dictionary
data = {
'A': df['Photo'].values, # Net CO₂ assimilation (μmol m⁻² s⁻¹)
'VPD': df['VPDleaf'].values, # Vapor pressure deficit (kPa)
'gs': df['Cond'].values, # Stomatal conductance (mol m⁻² s⁻¹)
'Ca': df['CO2_r'].values # Atmospheric CO₂ (ppm), optional
}

# Fit the model (that's it!)
result = fit(MED2011(), data)

# View fitted parameters
print(f"gs0: {result.parameters['gs0']:.4f} mol/m²/s")
print(f"g1: {result.parameters['g1']:.2f}")
print(f"R² = {result.r_squared:.4f}")

# Generate plots
result.plot()

Medlyn Model (MED2011)

The Medlyn model (also called the unified stomatal optimization or USO model) relates stomatal conductance to assimilation rate and vapor pressure deficit:

gs=gs0+1.6(1+g1VPD)ACag_s = g_{s0} + 1.6 \left(1 + \frac{{g_1}}{{\sqrt{{VPD}}}}\right) \frac{{A}}{{C_a}}

where:

  • gsg_s = Stomatal conductance to water vapor (mol m⁻² s⁻¹)
  • gs0g_{s0} = Minimum/residual conductance (mol m⁻² s⁻¹)
  • g1g_1 = Slope parameter (dimensionless)
  • VPDVPD = Vapor pressure deficit (kPa)
  • AA = Net CO₂ assimilation rate (μmol m⁻² s⁻¹)
  • CaC_a = Atmospheric CO₂ concentration (ppm)
  • 1.6 = Ratio of water to CO₂ diffusivity

Usage

from phytorch import fit
from phytorch.models.stomatal import MED2011

# Fit the model
model = MED2011()
result = fit(model, data)

print(f"gs0 = {result.parameters['gs0']:.4f} mol/m²/s")
print(f"g1 = {result.parameters['g1']:.2f}")

Parameters

ParameterDescriptionTypical RangeUnits
gs0Minimum conductance0.0-0.1mol/m²/s
g1Slope parameter0.5-15.0dimensionless

Ball-Woodrow-Berry Model (BWB1987)

The BWB model relates stomatal conductance to assimilation, relative humidity, and CO₂:

gs=gs0+g1ARHCsg_s = g_{s0} + g_1 \frac{{A \cdot RH}}{{C_s}}

where:

  • gsg_s = Stomatal conductance to water vapor (mol m⁻² s⁻¹)
  • gs0g_{s0} = Minimum conductance (mol m⁻² s⁻¹)
  • g1g_1 = Slope parameter (dimensionless)
  • AA = Net CO₂ assimilation rate (μmol m⁻² s⁻¹)
  • RHRH = Relative humidity (fraction, 0-1)
  • CsC_s = CO₂ concentration at leaf surface (ppm)

Usage

from phytorch import fit
from phytorch.models.stomatal import BWB1987

# Prepare data (requires relative humidity)
data = {
'A': df['Photo'].values,
'RH': df['RH_s'].values / 100, # Convert % to fraction
'Cs': df['CO2_s'].values,
'gs': df['Cond'].values
}

# Fit the model
result = fit(BWB1987(), data)

print(f"gs0 = {result.parameters['gs0']:.4f} mol/m²/s")
print(f"g1 = {result.parameters['g1']:.2f}")

Parameters

ParameterDescriptionTypical RangeUnits
gs0Minimum conductance0.0-0.1mol/m²/s
g1Slope parameter5-15dimensionless

Ball-Berry-Leuning Model (BBL1995)

The BBL model is an extension of the BWB model that uses VPD instead of relative humidity and includes a CO₂ compensation point:

gs=gs0+a1A(CaΓ)(1+VPD/D0)g_s = g_{s0} + \frac{{a_1 \cdot A}}{{(C_a - \Gamma)(1 + VPD/D_0)}}

where:

  • gsg_s = Stomatal conductance to water vapor (mol m⁻² s⁻¹)
  • gs0g_{s0} = Minimum conductance (mol m⁻² s⁻¹)
  • a1a_1 = Slope parameter (dimensionless)
  • AA = Net CO₂ assimilation rate (μmol m⁻² s⁻¹)
  • CaC_a = Atmospheric CO₂ concentration (ppm)
  • Γ\Gamma = CO₂ compensation point (ppm)
  • VPDVPD = Vapor pressure deficit (kPa)
  • D0D_0 = VPD sensitivity parameter (kPa)

Usage

from phytorch import fit
from phytorch.models.stomatal import BBL1995

# Prepare data
data = {
'A': df['Photo'].values,
'VPD': df['VPDleaf'].values,
'Ca': df['CO2_r'].values,
'gs': df['Cond'].values
}

# Fit the model
result = fit(BBL1995(), data)

print(f"gs0 = {result.parameters['gs0']:.4f} mol/m²/s")
print(f"a1 = {result.parameters['a1']:.2f}")
print(f"D0 = {result.parameters['D0']:.2f} kPa")

Parameters

ParameterDescriptionTypical RangeUnits
gs0Minimum conductance0.0-0.1mol/m²/s
a1Slope parameter5-15dimensionless
D0VPD sensitivity0.5-3.0kPa

Buckley-Turnbull-Adams Model (BTA2012)

The BTA model (Model 4 from Buckley et al. 2012) relates stomatal conductance to irradiance and vapor pressure deficit using lumped parameters:

gs=Em(Q+i0)k+bQ+(Q+i0)Dsg_s = \frac{{E_m(Q + i_0)}}{{k + bQ + (Q + i_0)D_s}}

where:

  • gsg_s = Stomatal conductance to water vapor (mol m⁻² s⁻¹)
  • EmE_m = Maximum leaf transpiration rate (mmol m⁻² s⁻¹)
  • QQ = Irradiance/PPFD (μmol m⁻² s⁻¹)
  • i0i_0 = Dark transpiration parameter equal to α/ϕ\alpha/\phi (μmol m⁻² s⁻¹)
  • kk = Lumped parameter K1/χϕK_1/\chi\phi (μmol m⁻² s⁻¹ mmol mol⁻¹)
  • bb = Lumped parameter K1/χα0K_1/\chi\alpha_0 (mmol mol⁻¹)
  • DsD_s = Leaf surface vapor pressure saturation deficit (mmol mol⁻¹)

The lumped parameters are defined as:

  • Em=K1(ψsoil+πc)E_m = K_1(\psi_{soil} + \pi_c) where K1K_1 is leaf specific hydraulic conductance, ψsoil\psi_{soil} is soil water potential, and πc\pi_c is epidermal osmotic pressure
  • k=K1/χϕk = K_1/\chi\phi where χ\chi is the turgor to conductance scalar and ϕ\phi is the initial slope of gsg_s response to irradiance
  • b=K1/χα0b = K_1/\chi\alpha_0 where α0\alpha_0 is α in darkness divided by ϕ\phi
  • i0=α/ϕi_0 = \alpha/\phi where α\alpha is the guard cell advantage

The guard cell advantage (α\alpha) is approximated as:

α=αmϕ(Q+i0)αm+ϕQ\alpha = \frac{\alpha_m \phi (Q + i_0)}{\alpha_m + \phi Q}

where αm\alpha_m is the maximum guard cell advantage.

Usage

from phytorch import fit
from phytorch.models.stomatal import BTA2012

# Prepare data
data = {
'Q': df['PARi'].values, # Irradiance (μmol m⁻² s⁻¹)
'Ds': df['VPDleaf'].values, # Leaf surface VPD (mmol mol⁻¹)
'gs': df['Cond'].values # Stomatal conductance (mol m⁻² s⁻¹)
}

# Fit the model
result = fit(BTA2012(), data)

print(f"Em = {result.parameters['Em']:.3f} mmol/m²/s")
print(f"i0 = {result.parameters['i0']:.2f} μmol/m²/s")
print(f"k = {result.parameters['k']:.2f}")
print(f"b = {result.parameters['b']:.3f} mmol/mol")

Parameters

ParameterDescriptionTypical RangeUnits
EmMaximum transpiration rate0.1-50mmol/m²/s
i0Dark transpiration parameter (α/φ)0-300μmol/m²/s
kLumped parameter K₁/χφ0-1×10⁶ (typically ~1×10⁴)μmol m⁻² s⁻¹ mmol mol⁻¹
bLumped parameter K₁/χα₀0-100 (typically ~6.7)mmol/mol

Advanced Features

Custom Parameter Constraints

from phytorch import fit
from phytorch.models.stomatal import MED2011

# Define custom parameter bounds
options = {
'bounds': {
'gs0': (0.0, 0.05),
'g1': (2.0, 8.0)
}
}

result = fit(MED2011(), data, options)

Making Predictions

# Fit the model
result = fit(MED2011(), training_data)

# Make predictions on new data
new_data = {
'A': np.array([10, 15, 20, 25]),
'VPD': np.array([1.0, 1.5, 2.0, 2.5]),
'Ca': 400
}

predictions = result.predict(new_data)
print(f"Predicted gs: {predictions}")

Comparing Models

Different models may be appropriate for different species or environmental conditions. Prepare one dataset with all variables - each model uses only what it needs:

from phytorch import fit
from phytorch.models.stomatal import MED2011, BWB1987, BBL1995, BTA2012

# Prepare dataset with all variables
data = {
'A': df['Photo'].values, # For MED2011, BWB1987, BBL1995
'VPD': df['VPDleaf'].values, # For MED2011, BBL1995
'Ca': df['CO2_r'].values, # For MED2011, BWB1987, BBL1995
'hs': df['RH_s'].values, # For BWB1987 (relative humidity 0-1)
'Q': df['PARi'].values, # For BTA2012 (irradiance)
'Ds': df['VPDleaf'].values, # For BTA2012 (or convert VPD to mmol mol⁻¹)
'gs': df['Cond'].values # Observed gs for all models
}

# Fit all models with the same dataset
models = {
'Medlyn': MED2011(),
'BWB': BWB1987(),
'BBL': BBL1995(),
'BTA': BTA2012()
}

results = {}
for name, model in models.items():
results[name] = fit(model, data)
print(f"{name}: R² = {results[name].r_squared:.4f}")

References

  • Medlyn, B. E., et al. (2011). Reconciling the optimal and empirical approaches to modelling stomatal conductance. Global Change Biology, 17(6), 2134-2144.
  • Ball, J. T., Woodrow, I. E., & Berry, J. A. (1987). A model predicting stomatal conductance and its contribution to the control of photosynthesis under different environmental conditions. Progress in Photosynthesis Research, 4, 221-224.
  • Leuning, R. (1995). A critical appraisal of a combined stomatal-photosynthesis model for C3 plants. Plant, Cell & Environment, 18(4), 339-355.
  • Buckley, T. N., Turnbull, T. L., & Adams, M. A. (2012). Simple models for stomatal conductance derived from a process model: cross-validation against sap flux data. Plant, Cell & Environment, 35(9), 1647-1662.