## Aerodynamic Conductance

`Bigleaf.aerodynamic_conductance!`

— Function```
aerodynamic_conductance!(df;
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.

**Arguments**

`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)`

).

**Details**

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`

.

**Value**

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)

**Note**

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.

**Examples**

```
using DataFrames
df = DataFrame(Tair=25,pressure=100,wind=[3,4,5],
ustar=[0.5,0.6,0.65],H=[200,230,250])
# simple calculation of Ga
aerodynamic_conductance!(df;Gb_model=Val(:Thom_1972))
# 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),
zr=40,zh=25,d=17.5,z0m=2)
# simple calculation of Ga, but a physically based canopy boundary layer model
aerodynamic_conductance!(df,Gb_model=Val(:Su_2001),
zr=40,zh=25,d=17.5,Dl=0.05,N=2,fc=0.8)
all(isfinite.(df.psi_h))
```

`Bigleaf.compute_Ram`

— Function```
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.

**Arguments**

`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`

**Details**

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)`

.

**Note**

For adding aerodynamic conductance for other species see `add_Ga!`

.

**Value**

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

**References**

- 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, B
*B., Baldocchi, D*D., Meyers, T*P., Hosker, J*R., 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, J
*L., Unsworth, M*H., 2008: Principles of environmental physics. Third Edition. Elsevier Academic Press, Burlington, USA.

**See also**

`Bigleaf.roughness_z0h`

— Function`roughness_z0h(z0m, kB_h)`

**Arguments**

`z0m`

: Roughness length for momentum (m). Can be calculated by`roughness_parameters`

.`kB_h`

: kB-1 parameter, Output of`aerodynamic_conductance!`

**Details**

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}}$

**References**

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

`Bigleaf.add_Ga!`

— Function```
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

**Arguments**

`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

optional

`constants=`

`bigleaf_constants`

`()`

: Dictionary with entries`Pr`

- Prandtl number

**Details**

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!`

.

**Value**

a NameTuple or `df`

with keys `Ga_x`

where `x`

are the keys in `Sc`

and corresponding aerodynamic conductances (m s-1).

**Examples**

```
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]
```