Skip to content

14 - Photosynthesis with SIF Simulation

Dynamic PhotosynthesisProcess and EnergyBalanceProcess are in the same joint native state Two product views. scene_elements Align Mesh primitive, Turbid component and terrain, summary gives the convergence residuals of temperature, energy and physiology and the real executor.

This chapter describes a unified process for dynamic leaf temperature, Farquhar photosynthesis, and daylight-induced chlorophyll fluorescence (SIF). The same scene can contain Mesh, TurbidBoundary, or a mixture of both.

What attributes are required?

The leaf component participating in dynamic photosynthesis and dynamic SIF requires:

Attribute domain Common attributes Purpose
optical Fluspect Leaf reflection, transmission, absorption and fluorescence spectra
thermal ThermalProperty Initial temperature and long-wave emissivity
biophysical BiophysicalProperty Leaf width, stomatal surface, heat and water vapor exchange
physiological Farquhar An, gs and dynamic Phi_f
plant.set_property(
    "leaves",
    less.Fluspect(
        N=1.5, cab=45, car=10, cw=0.012, cm=0.006,
        fqe=0.012,
    ),
)
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,
        Jmax25=120.0,
    ),
)

Fluspect.fqe is used for static SIF. The dynamic SIF of Phi_f is calculated from the photosynthetic state.

Recommendation process

microclimate = less.Microclimate(
    air_temperature=25.0,  # degrees celsius
    humidity=60.0,         # percentage
    wind_speed=2.0,
    ca=400.0,
)

state = scene.solve(
    microclimate=microclimate,
    modules=["energy_balance", "photosynthesis", "sif"],
)

photo = state.photosynthesis
print("An:", photo.An)
print("gs:", photo.gs)
print("Phi_f:", photo.Phi_f)
print("leaf temperature:", photo.T_leaf)

thermal = scene.simulate(
    less.ThermalImager(
        less.Orthographic(image_size=512),
        bands=[10600.0],
        quality=128,
    )
)

sif = scene.simulate(
    less.SIFImager(
        less.Orthographic(image_size=512),
        bands=[687.0, 740.0, 760.0],
        quality=256,
    )
)

thermal.save("dynamic_temperature.tif")
sif.save("dynamic_sif.tif")

This time in solve, the energy balance, An, gs and Phi_f use the same coupling state. ThermalImager and SIFImager read this current status by default and do not need to manually pass the intermediate results.

Sun leaves and shade leaves

Direct light is not uniform across the canopy. LESS records:

  • sunlit_fraction: Proportion of leaf area that directly sees the sun;
  • APAR_sunlit: Conditional sun leaf APAR;
  • APAR_shaded: Conditional shade leaf APAR;
  • T_sunlit, T_shaded: Conditional sun leaf and shade leaf temperatures;
  • An_sunlit, An_shaded: corresponding net photosynthetic rate.

Sky light and multiple scattering enter both the sun and shade leaves simultaneously. Only the conditional sun leaf contains the unobstructed direct sunlight term. The final component or patch result is weighted by the proportion of sun leaves:

\[ \overline{An} = p_\mathrm{sunlit} An_\mathrm{sunlit} + (1-p_\mathrm{sunlit}) An_\mathrm{shaded} \]

Photosynthesis is a nonlinear process, so solve the sun leaves and shade leaves separately first, and then average; you cannot average APAR first. Run Farquhar just once again.

Result space hierarchy

print(photo.spatial_mode)
  • A pure Mesh scene returns "primitive", one result for each triangle patch;
  • Scenes containing TurbidBoundary return "component";
  • Temporary leaf area samples in statistical media are only used for numerical integration and will not become permanent voxels or scene geometry;
  • If finer statistical media output is required, the crown can be divided into multiple components.

Static SIF: No photosynthesis or temperature required

If you only wish to simulate fluorescence using a given Fluspect.fqe, you can directly calculate the static SIF:

source = scene.simulate(
    less.SIFProcess(
        mode="static",
        quality="high",
    )
)

image = scene.simulate(
    less.SIFImager(
        less.Orthographic(image_size=512),
        bands=[687.0, 740.0, 760.0],
        quality=256,
        sif_result=source,
    )
)

Static SIF does not run Farquhar, does not require PhotosynthesisProcess, and does not require a temperature attribute. It still requires Fluspect because the reflection, transmission, absorption, fluorescence excitation and emission spectra come from this property.

Sampling quality

Quality presets are available for dynamic physiological processes:

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

Optional values ​​are "preview", "standard" and "high". Formal studies should also vary the number of samples taken, Check if APAR, leaf temperature, An, gs and Phi_f are stable. Fixed seed to reproducible experiments.

Three backend consistency

The following backends use the same set of public API:

scene = less.Scene(backend="optix")
scene = less.Scene(backend="vulkan")
scene = less.Scene(backend="embree")

OptiX is suitable for NVIDIA GPU; Vulkan can use GPU that supports Ray Query; Embree can use CPU. Switching backends does not require changing the way solve, ThermalImager or SIFImager is called.

View closure and convergence

eb = state.energy_balance.result
print("energy converged:", eb.converged)
print("photo converged:", state.photosynthesis.converged)
print("iterations:", state.photosynthesis.iterations)
print("max residual:", abs(eb.residual[eb.active_mask]).max())

If lighting, microclimate, properties, or geometry change, rerun scene.solve(...). LESS will Refuse to use old state for new Thermal or SIF images.

Next step

Mesh and Turbid mixed scene

The scene.solve(...) can handle Mesh blades, TurbidBoundary canopy and terrain simultaneously. scene_elements in the result will identify the scene element corresponding to each row, and provide leaf area, sun leaf ratio, Fields such as sun leaf/shade leaf temperature, APAR, net photosynthetic rate, and stomatal conductance. After modifying scene properties, lighting or microclimate, Please re-run scene.solve(...) and then pass the new energy_balance or sif product to the imaging sensor.

  • less.PhotosynthesisProcessless.SIFProcess
  • less.Farquharless.Fluspectless.BiophysicalProperty
  • less.Microclimateless.EnergyBalanceProcess
  • less.SIFImagerless.ThermalImager
  • less.PhotosynthesisProductless.SIFProduct