Source code for huracanpy.tc._beta_drift
import numpy as np
from metpy.constants import Re, omega
from metpy.units import units
from metpy.xarray import preprocess_and_wrap
from .._metpy import dequantify_results, validate_units
omega = omega / units("radian")
[docs]
@dequantify_results
@preprocess_and_wrap(wrap_like=("lat", "lat"))
def beta_drift(
lat,
wind_max,
radius_wind_max,
):
"""
Based on Smith, 1993:
https://journals.ametsoc.org/view/journals/atsc/50/18/1520-0469_1993_050_3213_ahbdl_2_0_co_2.xml?tab_body=pdf
Parameters
----------
lat : TYPE
DESCRIPTION.
wind_max : TYPE
DESCRIPTION.
radius_wind_max : TYPE
DESCRIPTION.
Returns
-------
V_drift : TYPE
DESCRIPTION.
theta_drift : TYPE
DESCRIPTION.
"""
# Treat input
# Convert lat to rad
lat = validate_units(
lat,
# We assume lats are in degrees if they exceed pi
expected_units=lambda x: "degrees" if np.abs(x).max() > np.pi else "radians",
)
lat = lat.to("radians")
# Assume max wind is in m/s if not given
wind_max = validate_units(wind_max, expected_units="m s-1")
# Convert rmw to m
radius_wind_max = validate_units(
radius_wind_max,
# We assume rmw are in km if they are below 10,000
expected_units=lambda x: "km" if x.max() < 10000 else "m",
)
radius_wind_max = radius_wind_max.to("m")
# Coriolis parameter
beta = 2 * omega * np.cos(lat) / Re # s-1 m-1
# Beta-drift parameters
v_char = (radius_wind_max**2) * beta # m/s
b = v_char / wind_max # non-dimensionnal
v_drift_adim = 0.72 * b ** (-0.54) # non-dmensionnal
v_drift = v_drift_adim * v_char # m/s
theta_drift = 308 - 9.6 * np.log(b) # degrees
return v_drift, theta_drift