Wheeler-Kiladis Space-Time Spectra

Wheeler-Kiladis Space-Time Spectra#

The Wheeler-Kiladis (WK) Space-Time Spectra is a diagnostic tool used in meteorology to analyze tropical atmospheric waves by decomposing their variability in both wavenumber (space) and frequency (time) domains. It extends traditional Fourier analysis by applying a two-dimensional (2D) spectral decomposition to isolate and characterize different wave modes (e.g., Kelvin waves, Rossby waves, and mixed Rossby-gravity waves) based on their dispersion relations.

Key Features#

  • Uses symmetrical (eastward/westward) and antisymmetrical (north-south) Fourier transforms to separate wave types.

  • Compares observed spectra with theoretical dispersion curves of shallow-water waves to identify dominant modes.

  • Helps distinguish convectively coupled waves (linked to tropical rainfall) from uncoupled waves.

Applications in Meteorology#

  1. Tropical Wave Analysis: Identifies and tracks Kelvin waves, equatorial Rossby waves, and Madden-Julian Oscillation (MJO) signals.

  2. Convective Coupling Studies: Examines how waves interact with tropical convection (e.g., in monsoon systems).

  3. Model Validation: Evaluates whether climate models correctly simulate tropical wave dynamics.

  4. Extreme Weather Prediction: Helps understand precursors to tropical cyclogenesis and organized convection.

The WK method is particularly useful for studying large-scale tropical variability and remains a fundamental tool in tropical meteorology and climate research.

Before proceeding with all the steps, first import some necessary libraries and packages

import xarray as xr
import matplotlib.pyplot as plt
import easyclimate as ecl

The example here is to avoid longer calculations, thus we open the pre-processed result data directly.

Tip

You can download following datasets here: Download olr_smooth_data.nc

data = xr.open_dataset('olr_smooth_data.nc')['olr'].sel(lat = slice(-15, 15))
data
<xarray.DataArray 'olr' (time: 730, lat: 30, lon: 72)> Size: 6MB
[1576800 values with dtype=float32]
Coordinates:
  * time       (time) datetime64[ns] 6kB 2017-01-01T12:00:00 ... 2018-12-31T1...
    dayofyear  (time) int64 6kB ...
  * lon        (lon) float32 288B 0.5 5.5 10.5 15.5 ... 340.5 345.5 350.5 355.5
  * lat        (lat) float32 120B -14.5 -13.5 -12.5 -11.5 ... 12.5 13.5 14.5
Attributes:
    standard_name:  toa_outgoing_longwave_flux
    long_name:      NOAA Climate Data Record of Daily Mean Upward Longwave Fl...
    units:          W m-2
    cell_methods:   time: mean area: mean


Setting the basic parameters and removing the dominant signal

spd=1
nDayWin=96
nDaySkip=-71

data_dt = ecl.field.equatorial_wave.remove_dominant_signals(data, spd,nDayWin,nDaySkip)
data_dt.isel(time =0).plot.contourf(levels = 21)
time = 2017-01-01T12:00:00, dayofyear = 1
<matplotlib.contour.QuadContourSet object at 0x7ff9e41bcc70>

Separation of symmetric and asymmetric parts

data_as = ecl.field.equatorial_wave.decompose_symasym(data_dt)
data_as.isel(time = 0).plot.contourf(levels = 21)
time = 2017-01-01T12:00:00, dayofyear = 1
<matplotlib.contour.QuadContourSet object at 0x7ff9e1ffc130>

Calculation of spectral coefficients

psum = ecl.field.equatorial_wave.calc_spectral_coefficients(data_as,spd,nDayWin,nDaySkip)
psum
<xarray.Dataset> Size: 24kB
Dimensions:     (freq: 48, k: 31)
Coordinates:
  * freq        (freq) float64 384B 0.01042 0.02083 0.03125 ... 0.4896 0.5
  * k           (k) float64 248B -15.0 -14.0 -13.0 -12.0 ... 12.0 13.0 14.0 15.0
Data variables:
    psumanti_r  (freq, k) float64 12kB nan nan nan nan ... 1.059 0.939 0.8096
    psumsym_r   (freq, k) float64 12kB nan nan nan nan ... 1.124 1.076 1.15


Drawing asymmetric parts

fig, ax = plt.subplots()

psum.psumanti_r.plot.contourf(ax = ax, levels=21, cmap = 'YlGnBu')
ecl.field.equatorial_wave.draw_wk_anti_analysis()
plot wk spectra

And drawing symmetric parts

fig, ax = plt.subplots()

psum.psumsym_r.plot.contourf(ax = ax, levels=21, cmap = 'YlGnBu')
ecl.field.equatorial_wave.draw_wk_sym_analysis()
plot wk spectra

Total running time of the script: (0 minutes 4.101 seconds)