Turbulent fluxes
This page is a work in progress. If you have any questions or notice any errors, please raise an issue.
Overview
Turbulent motion in the atmosphere transports heat away from the surface. Two primary mechanisms are involved: the sensible heat flux due to the temperature gradient between the atmosphere and land surface, and the latent heat flux (from evaporation, transpiration, and sublimation).
The surface energy budget partitioning strongly depends on the strength of these fluxes:
- Strong winds and atmospheric instability → large turbulent fluxes
- Calm conditions and stable boundary layer → weak turbulent fluxes
The coupling between the turbulent fluxes and atmospheric conditions are primarily captured through aerodynamic resistance (or equivalently conductance) terms that approximate the instantaneous resistance of the land surface to energy losses due to turbulent effects.
Implementations
Terrarium.PrescribedTurbulentFluxes — Type
struct PrescribedTurbulentFluxes{NF} <: Terrarium.AbstractTurbulentFluxes{NF}Represents the simplest case where the turbulent (sensible and latent) heat fluxes are prescribed via input variables.
Terrarium.DiagnosedTurbulentFluxes — Type
struct DiagnosedTurbulentFluxes{NF} <: Terrarium.AbstractTurbulentFluxes{NF}Represents the standard case where the turbulent (sensible and latent) heat fluxes are diagnosed from atmosphere and soil conditions.
Sensible heat flux
Sensible heat is transported by the mean wind and turbulent eddies using bulk aerodynamic theory:
\[\begin{equation} H_s = c_a \rho_a \frac{\Delta T}{r_a} \end{equation}\]
where $c_a$ is the specific heat capacity of moist air (J/kg/K) and $\rho_a$ is the moist air density (kg/m³), both computed dynamically based on the local atmosphere state using Thermodynamics.jl. $\Delta T = T_s - T_a$ is the temperature difference (K) (positive if surface warmer than air), and $r_a$ is the aerodynamic resistance (s/m). $H_s$ is positive when surface is warmer than air (heat flows upward), and negative when surface is cooler (heat flows downward).
Latent heat flux
Evaporation and sublimation remove heat from the surface through the latent heat pathway. It is driven by the specific humidity difference $\Delta q$ (kg/kg), equivalent with the vapor pressure difference $\Delta e$ (Pa), between the surface and atmosphere. Under the typical assumption that the land surface is saturated (see e.g. [29]), the vapor pressure difference is computed as:
\[\begin{equation} \Delta e = e_s - e_a = e_{\text{sat}}(T_s) - e_a(q_a, p) \end{equation}\]
with $T_s$ the skin temperature. The specific humidity difference $\Delta q$ is
\[\begin{equation} \Delta q = q_s - q_a = q_{\text{sat}}(T_s) - q_a \end{equation}\]
with $q_{\text{sat}}$ the saturation specific humidity at the surface temperature and $q_a$ the specific humidity of the atmosphere.
The latent heat flux is then computed as:
\[\begin{equation} H_l = L \rho_a \frac{\Delta q}{r_a} \end{equation}\]
where $L$ is the latent heat of vaporization or sublimation (J/kg). $H_l$ represents energy lost due to evaporation, transpiration, or sublimation. While negative values of $H_l$ are theoretically possible when $\Delta q$ is negative, condensation is currently neglected so mass will not be conserved under such conditions.
The latent heat flux is directly tied to:
- Vegetation: Transpiration through stomata (see Photosynthesis)
- Soil moisture: Availability of water for evaporation (see Soil hydrology)
- Surface roughness: Vegetation height affects aerodynamic properties
Diagnosed turbulent fluxes
Terrarium.DiagnosedTurbulentFluxes — Type
struct DiagnosedTurbulentFluxes{NF} <: Terrarium.AbstractTurbulentFluxes{NF}Represents the standard case where the turbulent (sensible and latent) heat fluxes are diagnosed from atmosphere and soil conditions.
Prescribed turbulent fluxes
Terrarium.PrescribedTurbulentFluxes — Type
struct PrescribedTurbulentFluxes{NF} <: Terrarium.AbstractTurbulentFluxes{NF}Represents the simplest case where the turbulent (sensible and latent) heat fluxes are prescribed via input variables.
Process interface
Terrarium.compute_auxiliary! — Method
compute_auxiliary!(
state,
grid,
tur::DiagnosedTurbulentFluxes,
seb::Terrarium.AbstractSurfaceEnergyBalance,
constants::PhysicalConstants,
atmos::Terrarium.AbstractAtmosphere,
args...
)
Methods
Sensible heat flux
Terrarium.compute_sensible_heat_flux — Function
compute_sensible_heat_flux(
_::DiagnosedTurbulentFluxes,
Q_T,
ρₐ,
cₐ
) -> Any
Compute the sensible heat flux [W/m²] as a function of the bulk aerodynamic temperature gradient Q_T [K m/s] and the density ρₐ [kg/m³] and specific heat capacity cₐ [J/kg K] of air.
compute_sensible_heat_flux(
i,
j,
grid,
fields,
tur::DiagnosedTurbulentFluxes,
skinT::Terrarium.AbstractSkinTemperature,
constants::PhysicalConstants,
atmos::Terrarium.AbstractAtmosphere
) -> Any
Compute the sensible heat flux at i, j based on the current skin temperature and atmospheric conditions.
Latent heat flux
The latent heat flux is computed via a unified interface for both standalone flux calculations as well as coupling with evapotranpsiration:
Terrarium.compute_latent_heat_flux — Method
compute_latent_heat_flux(
i,
j,
grid,
fields,
tur::DiagnosedTurbulentFluxes,
skinT::Terrarium.AbstractSkinTemperature,
constants::PhysicalConstants,
atmos::Terrarium.AbstractAtmosphere
) -> Any
compute_latent_heat_flux(
i,
j,
grid,
fields,
tur::DiagnosedTurbulentFluxes,
skinT::Terrarium.AbstractSkinTemperature,
constants::PhysicalConstants,
atmos::Terrarium.AbstractAtmosphere,
evtr::Union{Nothing, Terrarium.AbstractEvapotranspiration}
) -> Any
compute_latent_heat_flux(
i,
j,
grid,
fields,
tur::DiagnosedTurbulentFluxes,
skinT::Terrarium.AbstractSkinTemperature,
constants::PhysicalConstants,
atmos::Terrarium.AbstractAtmosphere,
evtr::Union{Nothing, Terrarium.AbstractEvapotranspiration},
snow::Union{Nothing, Terrarium.AbstractSnow}
) -> Any
Compute the latent heat flux at i, j based on the current skin temperature and atmospheric conditions. When an evapotranspiration scheme is provided, uses the ET-aware humidity flux; otherwise uses bare ground evaporation.
With a snow component, the flux is partitioned by snow-covered area fraction f_snow: the snow-free fraction (1 − f_snow) evaporates from the ground/canopy (latent heat of vaporization), while the snow-covered fraction sublimates from the snowpack (latent heat of sublimation, see compute_snow_sublimation_flux). Without snow it reduces to the bare ground/canopy latent flux.
Terrarium.compute_latent_heat_flux — Method
compute_latent_heat_flux(
_::DiagnosedTurbulentFluxes,
Q_h,
ρₐ,
L
) -> Any
Compute the latent heat flux as a function of the humidity flux Q_h [m/s], the density ρₐ [kg/m³] of air, and the specific latent heat of vaporization or sublimation L [J/kg].
Terrarium.vapor_pressure_difference — Function
vapor_pressure_difference(
c::ThermodynamicConstants,
p,
q_air,
T
) -> Any
Computes the difference in vapor pressure between a saturated surface at temperature T [°C] and the atmosphere, defined by its specific humidity q_air [kg/kg] and pressure p [Pa]. Relies on Thermodynamics.jl via partial_pressure_vapor and saturation_vapor_pressure.
Terrarium.specific_humidity_difference — Function
specific_humidity_difference(
c::ThermodynamicConstants,
p,
q_air,
T
) -> Any
Computes the difference in specific humidity between a saturated surface at temperature T [°C] and the atmosphere, defined by its specific humidity q_air [kg/kg] and pressure p [Pa].
Kernel functions
The fused surface-energy-balance kernel stores the turbulent fluxes through compute_turbulent_fluxes!: the DiagnosedTurbulentFluxes variant computes and stores the sensible and latent heat fluxes, while the PrescribedTurbulentFluxes variant is a no-op because the fluxes are supplied as input fields.
Terrarium.compute_turbulent_fluxes! — Function
compute_turbulent_fluxes!(
out,
i,
j,
grid,
fields,
tur::DiagnosedTurbulentFluxes,
skinT,
constants,
atmos,
evtr,
snow
)
Compute the turbulent (sensible and latent) heat fluxes from the current skin temperature and store them into the auxiliary output fields out.
compute_turbulent_fluxes!(
out,
i,
j,
grid,
fields,
_::PrescribedTurbulentFluxes,
skinT,
constants,
atmos,
evtr,
snow
)
Prescribed turbulent fluxes are input fields supplied by an external coupler (already present in fields), so there is nothing to compute or store.
Terrarium.compute_vapor_pressure_difference — Method
compute_vapor_pressure_difference(
i,
j,
grid,
fields,
atmos::Terrarium.AbstractAtmosphere,
c::PhysicalConstants,
T
) -> Any
Computes the vapor pressure difference [Pa] between a saturated surface at temperature T [°C] and the current atmospheric fields.
Terrarium.compute_specific_humidity_difference — Method
compute_specific_humidity_difference(
i,
j,
grid,
fields,
atmos::Terrarium.AbstractAtmosphere,
c::PhysicalConstants,
T
) -> Any
Computes the specific humidity difference [kg/kg] between a saturated surface at temperature T [°C] and the current atmospheric fields.
References
- [29]
- S. Zhou and B. Yu. Physical basis of the potential evapotranspiration and its estimation over land. Journal of Hydrology 641, 131825 (2024).