跳转至

33 - 光合作用与荧光源项

本章计算叶片的光合速率、气孔导度和随光合状态变化的叶绿素荧光。光合作用使用 Farquhar–von Caemmerer–Berry 模型,气孔导度使用 Ball–Berry 模型。叶温可以给定,也可以与能量平衡一起求解,三者在同一个耦合状态中完成。

所需属性

参与光合作用和荧光计算的叶片需要四类属性:

物理域 属性 作用
光学 Fluspect 叶片的反射、透射、吸收和荧光光谱
热 ThermalProperty 初始温度和发射率
生物物理 BiophysicalProperty 叶宽、气孔所在面、热量和水汽交换
生理 Farquhar 光合作用和气孔导度参数
import less

scene = less.Scene()
scene.size = 6.0
scene.terrain = less.Terrain(property=less.Lambertian(reflectance=0.15))
scene.terrain.set_property(less.ThermalProperty(temperature=300.0, emissivity=0.95))
scene.illumination = less.Illumination(
    source=less.Sun(zenith=30, azimuth=150), atmosphere=less.NoAtmosphere())

plant = less.Object("plant")
plant.add_component("leaves", less.Mesh(less.asset_path("tutorial_tree.obj"), group="leaves"))
plant.set_property("leaves", less.Fluspect(N=1.5, cab=45, car=10, cw=0.012, cm=0.006,
                                           fqe="dynamic"))
plant.set_property("leaves", less.ThermalProperty(temperature="air", emissivity=0.98))
plant.set_property("leaves", less.BiophysicalProperty(leaf_width=0.05, stomata_side="bottom"))
plant.set_property("leaves", less.Farquhar(Vcmax25=60.0))
scene.add(plant, positions=[(3, 3, 0)])

fqe="dynamic" 表示荧光产额由光合状态决定。

光合模型

Farquhar() 默认使用 SCOPE 的 C3 光合方程(formulation="scope"),以 Vcmax25 为主要参数:

scope_leaf = less.Farquhar(Vcmax25=60.0, BallBerrySlope=8.0, BallBerryIntercept=0.01)

需要单独给出最大电子传递速率时,使用 formulation="jmax",不给 Jmax25 时取 2 × Vcmax25:

jmax_leaf = less.Farquhar(Vcmax25=60.0, Jmax25=120.0, formulation="jmax")
参数 含义
Vcmax25 25 °C 时的最大羧化速率(µmol m⁻² s⁻¹)
Jmax25 25 °C 时的最大电子传递速率,仅用于 "jmax"
Rd25_ratio 暗呼吸与 Vcmax25 之比
BallBerrySlope、BallBerryIntercept Ball–Berry 气孔导度模型的斜率和截距
absorption_component 驱动光合作用的吸收部分,默认 "chlorophyll"

叶绿素吸收与总吸收

光合作用默认由叶绿素吸收的光合有效辐射驱动。Prospect 和 Fluspect 会给出每个波长上叶绿素吸收所占的比例。希望使用叶片的总吸收时:

total_leaf = less.Farquhar(Vcmax25=60.0, absorption_component="total")

实测光谱(MeasuredSpectrum)需要给出色素分区模型才能计算叶绿素吸收(见第 10 章)。比较与色素有关的吸收时,光合有效辐射范围内宜使用约 1 nm 的光谱间隔,波段过宽会使叶绿素吸收比例产生偏差。

求解

climate = less.Microclimate(air_temperature=25.0, humidity=60.0, wind_speed=2.0, ca=400.0)

state = scene.solve(microclimate=climate,
                    modules=["energy_balance", "photosynthesis", "sif"],
                    photosynthesis_kwargs={"quality": "preview"})
photo = state.photosynthesis
print("净光合速率:", photo.An)
print("气孔导度:", photo.gs)
print("荧光产额:", photo.Phi_f)
print("叶温(K):", photo.T_leaf)

scene.solve() 依次计算辐射场、能量平衡、光合作用和荧光,它们使用同一个耦合状态:叶温影响光合,光合决定气孔导度和蒸腾,蒸腾又改变叶温。求解后,热红外和荧光成像会自动使用这个状态:

thermal = scene.simulate(less.ThermalImager(less.Orthographic(image_size=64),
                                            bands=[10600.0], quality=32), microclimate=climate)
sif = scene.simulate(less.SIFImager(less.Orthographic(image_size=64),
                                    bands=[687.0, 740.0, 760.0], quality=32))
thermal.save("dynamic_temperature.tif")
sif.save("dynamic_sif.tif")

Microclimate 中 pressure 的单位是 Pa,oxygen 是 mmol mol⁻¹,ca(CO₂)是 µmol mol⁻¹。实际水汽压由气温和相对湿度计算。

受光叶片与阴影叶片

冠层中的直射光很不均匀。LESS 分别计算受光叶片和阴影叶片,再按受光比例汇总:

结果 含义
sunlit_fraction 能直接看到太阳的叶面积比例
APAR、APAR_total 所选吸收部分的 APAR、叶片总吸收的 APAR
APAR_sunlit、APAR_shaded 受光、阴影叶片的 APAR
T_sunlit、T_shaded 受光、阴影叶片的温度
An_sunlit、An_shaded 受光、阴影叶片的净光合速率

天空光和多次散射同时照到受光和阴影叶片,只有受光叶片还接收太阳直射。最终结果为

\[\overline{A_n} = p\,A_{n,\mathrm{sunlit}} + (1-p)\,A_{n,\mathrm{shaded}}\]

其中 p 是受光比例。光合作用对光强是非线性的,先分别计算再平均,与先平均光强再计算的结果不同。

print(photo.sunlit_fraction)
print(photo.An_sunlit, photo.An_shaded)

APAR 的单位是 µmol 光子 m⁻² 叶 s⁻¹,An 的单位是 µmol CO₂ m⁻² 叶 s⁻¹。

结果的空间单元由 photo.spatial_mode 说明:只有三角网格时为 "primitive"(每个三角形一个值);含统计植被时按组件给出,需要更细的结果可以把树冠分成多个组件。photo.scene_elements 标识每一行对应的场景元素。

荧光源项

荧光源项是每片叶子发出的荧光光谱,由 SIFProcess 计算。上面的 scene.solve() 已经包含它;也可以单独计算:

import numpy as np

source = state.sif
wavelengths = np.arange(650.0, 851.0, 1.0)

leaf = source.emission(wavelengths)                              # 每单位叶面积,W m⁻² nm⁻¹
photosystem = source.emission(wavelengths, level="photosystem")  # 叶片重吸收之前
total = source.total_emission(wavelengths)                       # 整个场景,W nm⁻¹
by_component = source.total_emission(wavelengths, by="component")
by_layer = source.total_emission(wavelengths, by="layer", layers=[0.0, 2.0, 4.0, 6.0])
  • level="leaf"(默认):离开叶片两个表面的荧光,即在冠层中传播的荧光;
  • level="photosystem":光系统发出、尚未被叶片自身重吸收的荧光。红光荧光大部分在叶内被重新吸收,远红光荧光大部分能离开叶片;
  • by 可以是 "scene"、"component"、"instance" 或 "layer"(按高度分层,layers 为分层边界)。

固定产额的荧光(mode="static",使用 Fluspect.fqe)不需要温度和光合作用,见第 27 章。叶片重吸收后再次激发的二次荧光不在计算中,典型产额下它小于总荧光的 1%–2%。

采样质量

state = scene.solve(microclimate=climate,
                    modules=["energy_balance", "photosynthesis", "sif"],
                    photosynthesis_kwargs={"quality": "standard"},
                    sif_kwargs={"quality": "standard"},
                    seed=42)

质量可以是 "preview"、"standard" 或 "high"。定量研究时,比较不同质量下的 APAR、叶温、An、gs 和荧光产额,确认结果已经稳定。固定 seed 可以重复同样的结果。

检查收敛

eb = state.energy_balance.result
print("能量平衡收敛:", eb.converged)
print("光合收敛:", state.photosynthesis.converged, "迭代次数:", state.photosynthesis.iterations)
print("最大残差:", abs(eb.residual[eb.active_mask]).max())

光照、微气象、属性或几何改变后,需要重新运行 scene.solve()。

统计植被

统计植被冠层的用法完全相同,只需把叶片属性设在统计植被组件上(代表叶片用 Fluspect):

crown = less.Object("crown")
crown.add_component("crown", less.TurbidBoundary(less.asset_path("tutorial_tree.obj"), group="crown"))
crown.set_property("crown", less.OpticalVegetation(
    leaf=less.Fluspect(cab=45, fqe="dynamic"), leaf_area_density=1.5,
    leaf_angle_distribution="spherical"))
crown.set_property("crown", less.ThermalProperty(temperature="air", emissivity=0.98))
crown.set_property("crown", less.BiophysicalProperty(leaf_width=0.05, stomata_side="bottom"))
crown.set_property("crown", less.Farquhar(Vcmax25=60.0))
scene.add(crown, positions=[(3, 3, 0)])

mixed = scene.solve(microclimate=climate, modules=["energy_balance", "photosynthesis", "sif"],
                    photosynthesis_kwargs={"quality": "preview"})
print(mixed.photosynthesis.spatial_mode)

三角网格叶片、统计植被和地形可以在同一次求解中计算。

下一步