Quantum yield efficiency of photosynthesis
Run this notebook
Read the guide on setting up your computer to run Jupyter notebooks
Download
this notebookas a Jupyter notebook.
Warning
Note that \(\phi_0\) is also sometimes used to refer to the quantum yield of electron transfer, which is exactly four times larger than the quantum yield of photosynthesis.
The value of \(\phi_0\) captures the conversion rate of moles of photosynthetically active photons into moles of \(\ce{CO2}\). The theoretical maximum for this value is 1/8: eight moles of light photons are required to capture 1 mole of carbon. In some cases, this value may be reduced to 1/9, when a Q cycle is not operating within the plant cell (Long et al., 1993).
These theoretical maxima are not necessarily directly used in calculating light use efficiency:
The values of \(\phi_0\) are often adjusted to include other components of light capture. For example, Stocker et al. (2020) include a factor for incomplete leaf absorptance in their estimation of \(\phi_0\) and argue that \(\phi_0\) should be treated as a parameter representing canopy-scale effective quantum yield.
The maximum quantum yield can vary with environmental conditions, such as temperature variation in \(\phi_0\) (Bernacchi et al., 2003).
For these reasons, the PModel provides alternative
approaches to estimating the value of \(\phi_{0}\), using the method_kphio argument. The
currently implemented approaches are described below.
All of the approaches share the same baseline reference value of \(\phi_{0}= 1/8\) as the
theoretical maximum quantum yield of photosynthesis. The default value can be set using
the
PModelConst.maximum_phi0
attribute, which can then be passed into a
PModelEnvironment. However, the PModel and
SubdailyPModel both provide the reference_kphio argument to override the default
value for a specific model. This can be needed when specific methods have been
calibrated using a ‘tuned’ value for \(\phi_0\): an example here is the soil moisture
stress corrected GPP estimates of Stocker et al. (2020) which use different \(\phi_0\)
values (see calculate_soilmstress_stocker()).
Temperature dependent \(\phi_0\)
The default approach (method_kphio='temperature') applies a temperature dependent
estimate of \(\phi_0\), following Bernacchi et al. (2003) for C3 plants and
Cai and Prentice (2020) for C4 plants.
<>:13: SyntaxWarning: invalid escape sequence '\p'
<>:13: SyntaxWarning: invalid escape sequence '\p'
/tmp/ipykernel_1513/3872134455.py:13: SyntaxWarning: invalid escape sequence '\p'
plt.ylabel("Quantum yield efficiency ($\phi_0$)")
Fixed \(\phi_0\)
This approach (method_kphio='fixed') applies a fixed value of \(\phi_0\) in the
calculation of light use efficiency.
However, the fixed method will also accept \(\phi_0\) values for each observation being fitted in the PModel. This option is provided to allow users to experiment with alternative per-observation estimation of \(\phi_0\) that are not currently implemented. You will need to provide an array of values that has the same shape as the other driver variables and these values are then used within the calculations for each observation.
In the code and plot below, this approach is used to provide a simple linear series of \(\phi_0\) values to an otherwise constant environment. As you would expect given \(\text{LUE} = \phi_0 \cdot M_C \cdot m_j\), light use efficiency changes linearly along this gradient of \(\phi_0\) values.
<>:17: SyntaxWarning: invalid escape sequence '\p'
<>:18: SyntaxWarning: invalid escape sequence '\p'
<>:17: SyntaxWarning: invalid escape sequence '\p'
<>:18: SyntaxWarning: invalid escape sequence '\p'
/tmp/ipykernel_1513/484885573.py:17: SyntaxWarning: invalid escape sequence '\p'
plt.title("Variation in LUE with changing $\phi_0$")
/tmp/ipykernel_1513/484885573.py:18: SyntaxWarning: invalid escape sequence '\p'
plt.xlabel("$\phi_0$")
/home/docs/checkouts/readthedocs.org/user_builds/pyrealm/checkouts/latest/pyrealm/pmodel/pmodel.py:481: UserWarning:
Pyrealm 2.0.0 uses a new default for the quantum yield of photosynthesis (phi0=1/8).
You may need to change settings to duplicate results from pyrealm 1.0.0.
warn(
Temperature and aridity effects on \(\phi_0\)
The option method_kphio='sandoval' implements an experimental calculation
(Sandoval, in_prep) of \(\phi_0\) as a function of a local aridity index
(P/PET), the mean growth temperature and the air temperature (Sandoval, in_prep).
You will need to provide the aridity index and mean growing temperature for observations
when creating the PModelEnvironment.
First, the aridity index is used to adjust the reference value (\(\phi_{0R}\)) using a double exponential function to calculate a new maximum value given the climatological aridity (\(\phi_{0A}\)):
This captures a decrease in maximum \(\phi_0\) in arid conditions, as shown below.
<>:19: SyntaxWarning: invalid escape sequence '\p'
<>:20: SyntaxWarning: invalid escape sequence '\p'
<>:19: SyntaxWarning: invalid escape sequence '\p'
<>:20: SyntaxWarning: invalid escape sequence '\p'
/tmp/ipykernel_1513/3860838727.py:19: SyntaxWarning: invalid escape sequence '\p'
ax.set_title("Change in $\phi_0$ with aridity index (P/PET).")
/tmp/ipykernel_1513/3860838727.py:20: SyntaxWarning: invalid escape sequence '\p'
ax.set_ylabel("$\phi_0$")
/home/docs/checkouts/readthedocs.org/user_builds/pyrealm/checkouts/latest/pyrealm/core/experimental.py:72: ExperimentalFeatureWarning: 'Be aware that QuantumYieldSandoval is an experimental feature of pyrealm and the implementation and API may change within major versions.'
warn(qualname, ExperimentalFeatureWarning)
In addition to capping the peak \(\phi_0\) as a function of the aridity index, this approach also alters the temperature at which \(\phi_0\) is maximised as a function of the mean growth temperature (\(T_g\)) in a location. The plot below shows how aridity and mean growth temperature interact to change the location and height of the peak \(\phi_0\).
<>:35: SyntaxWarning: invalid escape sequence '\p'
<>:35: SyntaxWarning: invalid escape sequence '\p'
/tmp/ipykernel_1513/3529786704.py:35: SyntaxWarning: invalid escape sequence '\p'
ax.set_ylabel("$\phi_0$")