Source code for pyart.util.simulated_vel

"""
Function for creating simulated velocity fields.

"""

import numpy as np
from scipy import interpolate

from ..config import get_fillvalue, get_metadata


[docs]def simulated_vel_from_profile( radar, profile, interp_kind="linear", sim_vel_field=None ): """ Create simulated radial velocities from a profile of horizontal winds. Parameters ---------- radar : Radar Radar instance which provides the scanning parameters for the simulated radial velocities. profile : HorizontalWindProfile Profile of horizontal winds. interp_kind : str, optional Specifies the kind of interpolation used to determine the winds at a given height. Must be one of 'linear', 'nearest', 'zero', 'slinear', 'quadratic', or 'cubic'. The the documentation for the SciPy scipy.interpolate.interp1d function for descriptions. sim_vel_field : str, optional Name to use for the simulated velocity field metadata. None will use the default field name from the Py-ART configuration file. Returns ------- sim_vel : dict Dictionary containing a radar field of simulated radial velocities. """ # parse parameters if sim_vel_field is None: sim_vel_field = "simulated_velocity" # radar parameters azimuths = np.deg2rad(radar.azimuth["data"]).reshape(-1, 1) elevations = np.deg2rad(radar.elevation["data"]).reshape(-1, 1) gate_altitudes = radar.gate_altitude["data"] if isinstance(gate_altitudes, np.ma.MaskedArray): gate_altitudes = gate_altitudes.filled(np.nan) # prepare wind profile for interpolation if isinstance(profile.height, np.ma.MaskedArray): height = profile.height.filled(np.nan) else: height = profile.height height_is_not_nan = ~np.isnan(height) winds = np.empty((2, len(height)), dtype=np.float64) if isinstance(profile.u_wind, np.ma.MaskedArray): winds[0] = profile.u_wind.filled(np.nan) else: winds[0] = profile.u_wind if isinstance(profile.v_wind, np.ma.MaskedArray): winds[1] = profile.v_wind.filled(np.nan) else: winds[1] = profile.v_wind wind_is_not_nan = np.logical_and(~np.isnan(winds[0]), ~np.isnan(winds[1])) no_nans = np.logical_and(height_is_not_nan, wind_is_not_nan) height = height[no_nans] winds_reshape = np.empty((2, len(winds[0][no_nans])), dtype=np.float64) winds_reshape[0] = winds[0][no_nans] winds_reshape[1] = winds[1][no_nans] wind_interp = interpolate.interp1d( height, winds_reshape, kind=interp_kind, bounds_error=False, fill_value=get_fillvalue(), ) # interpolated wind speeds at all gates altitudes gate_winds = wind_interp(gate_altitudes) gate_u = np.ma.masked_invalid(gate_winds[0]) gate_v = np.ma.masked_invalid(gate_winds[1]) # calculate the radial velocity for all gates radial_vel = gate_u * np.sin(azimuths) * np.cos(elevations) + gate_v * np.cos( azimuths ) * np.cos(elevations) sim_vel = get_metadata(sim_vel_field) sim_vel["data"] = radial_vel return sim_vel