Source code for foxes.utils.wind_dir
import numpy as np
[docs]
def wd2wdvec(wd, ws=1.0, axis=-1):
"""
Calculate wind direction vectors from wind directions
in degrees.
Parameters
----------
wd: numpy.ndarray
Wind direction array (any shape)
ws: float or numpy.ndarray
The wind speed. Has to broadcast against wd.
axis: int
Location where to insert the (x, y) dimension
into the shape of wd
Returns
-------
wdvec: numpy.ndarray
The wind direction vectors
:group: utils
"""
wdr = wd * np.pi / 180.0
n = np.stack([np.sin(wdr), np.cos(wdr)], axis=axis)
if np.isscalar(ws):
return ws * n
return np.expand_dims(ws, axis) * n
[docs]
def wd2uv(wd, ws=1.0, axis=-1):
"""
Calculate wind vectors from wind directions
in degrees.
Parameters
----------
wd: numpy.ndarray
Wind direction array (any shape)
ws: float or numpy.ndarray
The wind speed. Has to broadcast against wd.
axis: int
Axis location where to insert the (u, v) components
into the shape of wd
Returns
-------
uv: numpy.ndarray
The wind vectors
:group: utils
"""
return -wd2wdvec(wd, ws, axis)
[docs]
def uv2wd(uv, axis=-1):
"""
Calculate wind direction from wind vectors.
Parameters
----------
uv: numpy.ndarray
The wind vectors, any shape
axis: int
The axis which corresponds to (u, v) components
Returns
-------
wd: numpy.ndarray
The wind direction array
:group: utils
"""
if axis == -1:
u = uv[..., 0]
v = uv[..., 1]
else:
s = tuple(0 if a == axis else slice(None) for a in range(len(uv.shape)))
u = uv[s]
s = tuple(1 if a == axis else slice(None) for a in range(len(uv.shape)))
v = uv[s]
return np.mod(180 + np.rad2deg(np.arctan2(u, v)), 360)
[docs]
def wdvec2wd(wdvec, axis=-1):
"""
Calculate wind direction from wind direction vectors.
Parameters
----------
wdvec: numpy.ndarray
The wind direction vectors, any shape
axis: int
The axis which corresponds to (x, y) components
Returns
-------
wd: numpy.ndarray
The wind direction array
:group: utils
"""
return uv2wd(-wdvec, axis)
[docs]
def delta_wd(wd_a, wd_b):
"""
Calculates wd_b - wd_a.
Parameters
----------
wd_a: numpy.ndarray
Array of wind directions.
Shape: any shape
wd_b: numpy.ndarray
Array of wind directions.
Shape: same as wd_a
Returns
-------
numpy.ndarray :
Array of wind direction deltas.
Shape: same as wd_a, wd_b
:group: utils
"""
out = wd_b - wd_a
out[out < -180.0] += 360.0
out[out > 180.0] -= 360.0
return out