aidas.model.detect_velocity_waves#

aidas.model.detect_velocity_waves(radar_scan, previous_scan=None, rad_time=None, elevation=0.5, velocity_threshold=-1.0, min_area=16.0, grid_spacing=500.0, reflectivity_threshold=0.0, dealias=True, despeckle_size=10, az_tolerance=1.0, max_range=None, vel_field='velocity', refl_field='reflectivity', bucket_name='unidata-nexrad-level2')[source]#

Detect radial velocity wave signatures by differencing two consecutive scans.

This implements the detection algorithm of Miller et al. (2022). Two sweeps at the same elevation are quality controlled, dealiased and subtracted. Because the background wind changes little over one volume cycle, the difference isolates the faster-moving wave perturbation. Only the negative half is kept, which emphasises the upstream convergence and the ascent implied with it, and the result is regridded and area filtered into a binary mask.

The defaults are the WSR-88D values from the paper: a -1 m s-1 threshold, a 0.5 km grid and a 16 km2 minimum area. The paper reports the result is not very sensitive to the exact threshold for high-amplitude waves; the minimum area matters more, since it selects which wave scale is emphasised.

The mask is not self-validating. Any single convergence line – a gust front, a sea breeze, a frontal boundary – is flagged too, and those advect with the mean wind. A wave train shows up as several roughly parallel bands moving together, and confirming that they are gravity waves needs evidence beyond this mask.

Parameters:
  • radar_scan (str, pyart.core.Radar() or aidas.io.RadarImage()) – The later of the two scans: a 4-letter NEXRAD site code, a path to a radar file, a radar volume, or a RadarImage().

  • previous_scan (str, pyart.core.Radar() or aidas.io.RadarImage(), optional) – The earlier scan, in any of the same forms. If None, the volume collected immediately before radar_scan is fetched with aidas.io.get_previous_scan().

  • rad_time (ISO-format datestring, optional) – The date/time in YYYY-MM-DDTHH:MM:SS format wanted, used only when radar_scan is a site code. If None, the latest scan is used.

  • elevation (float) – The elevation angle to detect waves at in degrees. The nearest sweep carrying velocity data is used.

  • velocity_threshold (float) – Flag gates where the velocity change is below this value in m s-1. The paper’s WSR-88D value is -1.

  • min_area (float) – The smallest contiguous detection to keep, in square kilometres.

  • grid_spacing (float) – The spacing of the output Cartesian grid in metres.

  • reflectivity_threshold (float or None) – Discard velocity gates whose reflectivity is below this value in dBZ. Set to None to keep every gate regardless of reflectivity.

  • dealias (bool) – Whether to unfold the velocities before differencing.

  • despeckle_size (int) – Remove contiguous velocity regions smaller than this many gates. Set to 0 to skip despeckling.

  • az_tolerance (float) – The largest angular separation in degrees allowed when pairing rays between the two scans.

  • max_range (float, optional) – The half-width of the output grid in metres. If None, it reaches the furthest gate with valid velocity, which keeps the grid off the empty ground beyond the Doppler cut’s unambiguous range.

  • vel_field (str) – The name of the radial velocity field.

  • refl_field (str) – The name of the reflectivity field used for censoring.

  • bucket_name (str) – The NEXRAD S3 bucket to use when a scan has to be fetched.

Returns:

radar_scan – The RadarImage() with velocity_wave_mask, the grid it lives on, and wave_sweep_radar, the quality controlled and dealiased sweep the mask was made from. A new RadarImage() is made if one was not passed in.

Return type:

aidas.io.RadarImage()

References

Miller, M. A., Oue, M., Kumjian, M. R., and Kollias, P., 2022: A method for detecting atmospheric gravity waves using Doppler radial velocity. Atmos. Meas. Tech., 15, 1689-1702, https://doi.org/10.5194/amt-15-1689-2022.