Aerodynamic Conductance

  Gb_model = Val(:Thom_1972), Ram_model = Val(:wind_zr),
  zr=nothing,zh=nothing, d = isnothing(zh) ? nothing : 0.7*zh,

Bulk aerodynamic conductance, including options for the boundary layer conductance formulation and stability correction functions.


  • df: DataFrame with columns
    • ustar : Friction velocity (m s-1)
    • wind : Wind speed at sensor height (m s-1)
  • Gb_model : model for computing boundary layer conductance (see compute_Gb!)
  • Ram_model : model for computing aerodynamic resistance (see compute_Ram)
  • zh : canopy height (m)
  • zr : Instrument (reference) height (m)

Further required columns of df and keyword argument depend on Gb_model (see compute_Gb!) and Ram_model (see compute_Ram).

If only columns ustar and wind are available, use default models (Val(:Thom_1972) and Val(:wind_zr)).


Aerodynamic conductance for heat (Ga_h) is calculated as:

$Ga_h = 1 / (Ra_m + Rb_h)$

where $Ra_m$ is the aerodynamic resistance for momentum and $Rb_h = 1/Gb_h$ the (quasi-laminar) canopy boundary layer resistance ('excess resistance') for heat.

Ra_m is computed and described with compute_Ram using model Ram_model.

Rb_h is computed and described with 1/compute_Gb! using a given Gb_model.


combined results of compute_Gb! and

  • Ra_m: Aerodynamic resistance for momentum transfer (s m-1)
  • Ga_m: Aerodynamic conductance for momentum transfer (m s-1)
  • Ga_h: Aerodynamic conductance for heat transfer (m s-1)
  • Ra_h: Aerodynamic resistance for heat transfer (s m-1)
  • Ga_CO2: Aerodynamic conductance for CO2 transfer (m s-1)


The roughness length for water and heat (z0h) can be computed by roughness_z0h.

TODO check Input variables such as LAI, Dl, or zh can be either constants, or vary with time, i.e. are vectors of the same length as df.

Note that boundary layer conductance to water vapor transfer (Gb_w) is often assumed to equal Gb_h. This assumption is also made in Bigleaf.jl, for example in the function surface_conductance.

If the roughness length for momentum (z0m) is not provided as input, it is estimated using roughness_parameters, which estimates a single z0m value for the entire time period. If a varying z0m value (e.g. across seasons or years) is required, z0m should be provided as input argument.


using DataFrames
df = DataFrame(Tair=25,pressure=100,wind=[3,4,5],
# simple calculation of Ga  
# calculation of Ram using a model derived from the logarithmic wind profile
aerodynamic_conductance!(df;Gb_model=Val(:Thom_1972),Ram_model = Val(:wind_profile), 
# simple calculation of Ga, but a physically based canopy boundary layer model
compute_Ram(::Val{:wind_profile}, ustar; 
  zr, d, z0m, psi_h, constants=bigleaf_constants())
compute_Ram!(df, method::Val{:wind_profile};  
  zr, d, z0m, psi_h = df.psi_h, kwargs...)

compute_Ram(::Val{:wind_zr}, ustar, wind)
compute_Ram!(df, method::Val{:wind_zr}; kwargs...)

Estimate bulk aerodynamic conductance.


  • ustar : Friction velocity (m s-1)
  • df : DataFrame with above columns
  • zr : Instrument (reference) height (m)
  • d : Zero-plane displacement height (-), can be estimated using roughness_parameters
  • z0m : Roughness length for momentum (m). Can be estimated using from roughness_parameters
  • psi_h : the value of the stability function for heat and water vapor (-) see stability_correction


The aerodynamic resistance for momentum $R_{a_m}$ is given by (Ram_method = Val(:wind_zr)):

$R_{a_m} = u/{u^*}^2$

Where u is the horizontal wind velocity. Note that this formulation accounts for changes in atmospheric stability, and does not require an additional stability correction function.

An alternative method to calculate $Ra_m$ is provided (Ram_method = Val(:wind_profile)):

$R_{a_m} = (ln((z_r - d)/z_{0m}) - \psi_h) / (k \, u^*)$

If the roughness parameters z0m and d are unknown, they can be estimated using roughness_parameters. The argument stab_formulation determines the stability correction function used to account for the effect of atmospheric stability on Ra_m (Ra_m is lower for unstable and higher for stable stratification). Stratification is based on a stability parameter zeta $\zeta=(z-d/L)$, where z is the height, d the zero-plane displacement height, and L the Monin-Obukhov length, calculated with Monin_Obukhov_length The stability correction function is chosen by the argument stab_formulation. Options are Val(:Dyer_1970) and Val(:Businger_1971) and Val(:no_stability_correction).


For adding aerodynamic conductance for other species see add_Ga!.


Aerodynamic resistance for momentum transfer (s m-1) ($Ra_m$)


  • Verma, S., 1989: Aerodynamic resistances to transfers of heat, mass and momentum. In: Estimation of areal evapotranspiration, IAHS Pub, 177, 13-20.
  • Verhoef, A., De Bruin, H., Van Den Hurk, B., 1997: Some practical notes on the parameter kB-1 for sparse vegetation. Journal of Applied Meteorology, 36, 560-572.
  • Hicks, BB., Baldocchi, DD., Meyers, TP., Hosker, JR., Matt, D_R., 1987: A preliminary multiple resistance routine for deriving dry deposition velocities from measured quantities. Water, Air, and Soil Pollution 36, 311-330.
  • Monteith, JL., Unsworth, MH., 2008: Principles of environmental physics. Third Edition. Elsevier Academic Press, Burlington, USA.

See also

aerodynamic_conductance!, add_Ga!

roughness_z0h(z0m, kB_h)



The roughness length for water and heat (z0h) is calculated from the relationship (e.g. Verma 1989):

${k_B}_h = ln(z_{0m}/z_{0h})$

it follows:

$z_{0h} = z_{0m} / e^{k_{B_h}}$


Verma, S., 1989: Aerodynamic resistances to transfers of heat, mass and momentum. In: Estimation of areal evapotranspiration, IAHS Pub, 177, 13-20.

add_Ga(Gb_h, Ga_m, Sc::Vararg{Pair,N}; constants)
add_Ga!(df::AbstractDataFrame, Sc; Gb_h = df.Gb_h, Ga_m = df.Ga.m, kwargs...)

compute additional aerodynamic conductance quantities for given Schmidt-numbers


  • Gb_h : Boundary layer conductance for heat transfer (m s-1)
  • Ga_m : Aerodynamic conductance for momentum (m s-1)
  • Sc : several Pair{Symbol,Number} Output name and Schmidt number of additional conductances to be calculated
  • df : DataFrame to add output columns



Aerodynamic conductance is calculated as

$G_{a_x} = 1/(1/G_{a_m} + 1/G_{b_x})$

where Gb_x is the Boundary layer conductance for other quantities x is calculated based on boundary layer for heat transfer, Schmidt-Number, and Prantl number, as documented in add_Gb!.


a NameTuple or df with keys Ga_x where x are the keys in Sc and corresponding aerodynamic conductances (m s-1).


using DataFrames
df = DataFrame(Gb_h=[0.02, missing, 0.055], Ga_m = 1 ./ [0.03, 0.03, 0.03])
add_Ga!(df, :O2 => 0.84, :CH4 => 0.99)
propertynames(df)[3:4] == [:Ga_O2, :Ga_CH4]