Source code for eddy_footprint.core
from typing import Literal
import xarray as xr
import numpy as np
from eddy_footprint.models import HsiehFootprintModel, KormannMeixnerFootprintModel
from typing import Optional
[docs]def calc_footprint(
*,
air_pressure: np.ndarray,
air_temperature: np.ndarray,
friction_velocity: np.ndarray,
wind_speed: np.ndarray,
cross_wind_variance: np.ndarray,
wind_direction: np.ndarray,
monin_obukhov_length: np.ndarray,
time: np.ndarray,
instrument_height: float,
roughness_length: float,
domain_length: Optional[int] = 1000,
resolution: Optional[int] = 5,
workers: Optional[int] = 1,
method: Optional[Literal["Hsieh", "Kormann & Meixner"]] = "Hsieh",
) -> xr.DataArray:
"""Create a dataset with footprint influences from eddy covariance measurements.
.. warning::
This function is experimental and its signature may change.
Parameters
----------
air_pressure : np.ndarray
Array with measurement of air pressure in units Pa.
air_temperature : np.ndarray
Array with measurments of air temperature in degrees K.
friction_velocity : np.ndarray
Array with measurements of friction veloicty (u*) in meters per second.
wind_speed : np.ndarray
Array with horizontal (u) wind velocity in meters per second.
cross_wind_variance : np.ndarray
Array with cross wind (v) variance in meters^2 per second^2.
wind_direction : np.ndarray
Array with down wind direction in degrees, where N/S is at 0/360 degrees.
monin_obukhov_length : np.ndarray
Array with Monin-Obukhov length in meters.
time : np.ndarray
Array with time, a datetime object, filename, or other unique identifier.
time will serve as the third dimension.
time need not be continuous or regular, but cannot have duplicates.
instrument_height : float
Constant for the instrument (sonic anemometer) height in meters above ground.
roughness_length : float
Constant for the site roughness length (z_not) in meters.
domain_length : int, optional
Integer for the domain length in meters.
The extent in downwind and crosswind directions used in footprint calculations.
The x and y dimensions of the output xarray are twice the domain length,
with the eddy covaiance tower located at (0,0).
Default: 1000.
resolution : int, optional
Integer for the resolution in meters used in the footprint calculations
and x and y dimensions. Default: 5.
workers : int, optional
Number of workers to use for parallel processing during interpolation step.
If -1 is given all CPU threads are used. Default: 1.
method : ``Hsieh`` or ``Kormann & Meixner``, optional
The footprint model method to use, either Hsieh or Kormann & Meixner.
Default: Hsieh.
Returns
-------
da: xarray.DataArray
DataArray with footprints of influence.
"""
ds = xr.Dataset()
ds["air_pressure"] = xr.DataArray(
data=air_pressure, dims=["time"], coords=dict(time=time)
)
ds["air_temperature"] = xr.DataArray(
data=air_temperature, dims=["time"], coords=dict(time=time)
)
ds["friction_velocity"] = xr.DataArray(
data=friction_velocity, dims=["time"], coords=dict(time=time)
)
ds["wind_speed"] = xr.DataArray(
data=wind_speed, dims=["time"], coords=dict(time=time)
)
ds["cross_wind_variance"] = xr.DataArray(
data=cross_wind_variance, dims=["time"], coords=dict(time=time)
)
ds["wind_direction"] = xr.DataArray(
data=wind_direction, dims=["time"], coords=dict(time=time)
)
ds["monin_obukhov_length"] = xr.DataArray(
data=monin_obukhov_length, dims=["time"], coords=dict(time=time)
)
if method == "Hsieh":
model = HsiehFootprintModel(
ds,
instrument_height=instrument_height,
roughness_length=roughness_length,
domain_length=domain_length,
resolution=resolution,
workers=workers,
)
elif method == "Kormann & Meixner":
model = KormannMeixnerFootprintModel(
ds,
instrument_height=instrument_height,
roughness_length=roughness_length,
domain_length=domain_length,
resolution=resolution,
workers=workers,
)
return model.footprints