In-cloud vertical motion retrieval#

Florian Poydenot (florian.poydenot@mpimet.mpg.de), August 2026

This folder contains a retrieval of vertical wind inside precipitating shallow clouds, obtained from a radar-based estimate combined with lidar observations. The vertical motion is retrieved from the slowest-moving edge of the radar spectrum, then corrected for SNR and turbulence broadening, following Zhu et al. (2021). For a detailed description of the processing, see Poydenot et al. (2026). The resulting data has 30 m/2 s resolution, with uncertainty of 0.2 m/s above cloud base.

The processing code is available at https://zenodo.org/records/19221500.

Instruments used#

Ka-band radars#

  • MBR2: August 2019-January 2023

  • MBRS: January 2023-December 2025

Lidars#

  • WindLidar1: vertically-pointing mode between March 2016 and October 2019, then between July 2021 and September 2024, and again since September 2025

  • WindLidar2: VAD scans between March 2019 and July 2021, vertically-pointing mode between September 2024 and September 2025

How to use#

The vertical coordinate is the radar range. Do not use the retrieved winds in deep convective clouds as the retrieval is not suited for this regime (use the provided cloud masks to filter it out).

Data Availability#

The processing is not integrated (yet) into our automated workflows, and as a result, the dataset does not grow by the day but has an end date determined by when the last round of manual processing was run.

import intake

cat = intake.open_catalog("https://tcodata.mpimet.mpg.de/catalog.yaml")
ds = cat.BCO.verticalwind.to_dask()
mbrs = cat.BCO.mbrs.to_dask().sel(range=slice(None, ds.range.values[-1]))
ds
/builds/tco/bco/docs/.venv/lib/python3.14/site-packages/intake_xarray/base.py:21: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  'dims': dict(self._ds.dims),
/builds/tco/bco/docs/.venv/lib/python3.14/site-packages/intake_xarray/base.py:21: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.
  'dims': dict(self._ds.dims),
<xarray.Dataset> Size: 239GB
Dimensions:               (time: 55424828, range: 187)
Coordinates:
  * time                  (time) datetime64[ns] 443MB 2019-08-01T00:00:14 ......
  * range                 (range) float32 748B 155.9 187.1 ... 5.955e+03
    alt                   float32 4B ...
    lat                   float32 4B ...
    lon                   float32 4B ...
Data variables:
    allprecip_mask        (time, range) bool 10GB dask.array<chunksize=(131072, 32), meta=np.ndarray>
    drizzle_mask          (time, range) bool 10GB dask.array<chunksize=(131072, 32), meta=np.ndarray>
    id_mask               (time, range) int64 83GB dask.array<chunksize=(131072, 32), meta=np.ndarray>
    longlived_rain_mask   (time, range) bool 10GB dask.array<chunksize=(131072, 32), meta=np.ndarray>
    nonprecip_mask        (time, range) bool 10GB dask.array<chunksize=(131072, 32), meta=np.ndarray>
    rain_mask             (time, range) bool 10GB dask.array<chunksize=(131072, 32), meta=np.ndarray>
    shortlived_rain_mask  (time, range) bool 10GB dask.array<chunksize=(131072, 32), meta=np.ndarray>
    unclassified_mask     (time, range) bool 10GB dask.array<chunksize=(131072, 32), meta=np.ndarray>
    w                     (time, range) float32 41GB dask.array<chunksize=(131072, 32), meta=np.ndarray>
    w_radar               (time, range) float32 41GB dask.array<chunksize=(131072, 32), meta=np.ndarray>
Attributes: (12/18)
    Conventions:           CF-1.12
    _logical_cutoff_date:  2024-09-29T00:00:00Z
    author:                Florian Poydenot (florian.poydenot@uni-hamburg.de)
    bcoproc_version:       0.0.0.post2156.dev0+d4f3d45
    converted_by:          Florian Poydenot (florian.poydenot@uni-hamburg.de)
    created_with:          make_final_data_netcdf.py
    ...                    ...
    sensor_alt:            18.5m
    source:                Ka-Band radar and Doppler wind lidar observations
    source_file:           /work/um1487/OBS/SCORE/Level_1/B_Reflectivity/Ka-B...
    title:                 Composite lidar-radar retrieval of the cloud-scale...
    tool_versions:         {"Python": "3.11.2 (main, Apr 28 2025, 14:11:48) [...
    version:               git-v1.3-132-gfbcc69d

Sample Plot#

rainy_orcestra = slice("2024-09-23T11:45", "2024-09-23T12:35")
ds.sel(time=rainy_orcestra).w.plot(x="time")
<matplotlib.collections.QuadMesh at 0x7f8d6d543380>
../../_images/608a0e82d67cba240ea87d599e15f96758c55c94d545783874141b6b6cafdc26.png
mbrs.sel(time=rainy_orcestra).Ze.plot(x="time")
<matplotlib.collections.QuadMesh at 0x7f8d6d4fe5d0>
../../_images/77cf94025387a5cd45c9ebb3f4879ecf57d3300aebcf6510faaac222389b11a8.png

References:#

  1. Zhu, Z., Kollias, P., Yang, F. & Luke, E. On the Estimation of In-Cloud Vertical Air Motion Using Radar Doppler Spectra. Geophysical Research Letters 48, e2020GL090682 (2021).

  2. Poydenot, F., Robbins-Blanch, N., Zhu, Z. & Vogel, R. How rain shapes cloud-scale dynamics and mass flux in the trades. EGUsphere 1–25 (2026) doi:10.5194/egusphere-2026-1974.