Adds sensible_bulk and latent_bulk_residual to a
weather_station object.
Arguments
- weather_station
A
weather_stationobject.- ...
Further arguments passed to
sensible_bulk()andlatent_bulk_residual().
Value
The input weather_station object with additional fields
sensible_bulk and latent_bulk_residual.
Details
This workflow combines the simple bulk-transfer estimate of sensible heat flux with an energy-balance residual for latent heat flux.
First, sensible heat flux is estimated with:
$$ H_{bulk} = \rho c_p \frac{T_1 - T_2}{r_a} $$
with:
$$ r_a = \frac{\log(z_2 / z_1)}{k \bar{u}} $$
Then latent heat flux is calculated as:
$$ LE_{res} = R_n - G - H_{bulk} $$
The resulting workflow closes the available turbulent energy exactly:
$$ H_{bulk} + LE_{res} = R_n - G $$
under the package sign convention. Here \(R_n > 0\) is net radiative input at the surface, \(G > 0\) is heat flux into the soil, \(H > 0\) is sensible heat flux away from the surface, and \(LE > 0\) is latent heat flux away from the surface.
The workflow is intended as a transparent reference and teaching path. It is
not a full Monin-Obukhov method and does not apply stability corrections.
The latent heat flux is a residual and therefore depends directly on the
quality of rad_bal, soil_flux, and the bulk sensible heat
estimate.
Required fields in weather_station are:
t1: lower air temperature in degrees C.t2: upper air temperature in degrees C.v1: lower wind speed in m s-1.z1: lower measurement height in m.z2: upper measurement height in m.rad_bal: net radiation \(R_n\) in W m-2.soil_flux: soil heat flux \(G\) in W m-2.
If v2 is present, it is used together with v1 to compute mean
wind speed. If v2 is missing, v1 is used.
Examples
ws <- build_weather_station(
datetime = as.POSIXct(
c("2023-06-01 12:00:00", "2023-06-01 12:30:00"),
tz = "UTC"
),
t1 = c(20, 18),
t2 = c(18, 19),
v1 = c(2, 2),
v2 = c(4, 3),
z1 = 2,
z2 = 10,
rad_bal = c(400, 300),
soil_flux = c(60, 40),
elev = 100
)
out <- turb_flux_bulk_residual(ws)
#> Warning: sensible_bulk: there are values above the diagnostic threshold of 600 W m-2.
#> Warning: latent_bulk_residual: there are values above the diagnostic threshold of 600 W m-2.
names(out)
#> [1] "datetime" "t1" "t2"
#> [4] "v1" "v2" "z1"
#> [7] "z2" "rad_bal" "soil_flux"
#> [10] "elev" "sensible_bulk" "latent_bulk_residual"
out_guarded <- turb_flux_bulk_residual(
ws,
stability_method = "ri_guard"
)
#> Warning: sensible_bulk: there are values above the diagnostic threshold of 600 W m-2.
#> Warning: sensible_bulk: very stable Richardson cases for some values; returning NA there.
#> Warning: latent_bulk_residual: there are values above the diagnostic threshold of 600 W m-2.
attr(out_guarded$sensible_bulk, "bulk_stability")
#> [1] "unstable" "very_stable"
attr(out_guarded$sensible_bulk, "bulk_Ri_g")
#> [1] -0.1338652 0.2681879