Tropical waves are among the most fascinating phenomena in atmospheric science. These large-scale disturbances shape weather patterns across the globe, influencing everything from monsoons to hurricanes. Today, I want to share insights from my recent research on two particularly important types of tropical waves: Kelvin waves and the Madden-Julian Oscillation (MJO).
What Are Tropical Waves?
Tropical waves are organized disturbances in the tropical atmosphere that propagate across ocean basins. Unlike mid-latitude weather systems that are driven by temperature gradients, tropical waves are primarily driven by:
- Convective heating: Latent heat release from thunderstorms
- Wave dynamics: Mathematical solutions to atmospheric equations
- Air-sea interactions: Exchange of heat and moisture with the ocean
These waves play crucial roles in:
- Tropical cyclone formation
- Monsoon variability
- Global circulation patterns
- Climate oscillations
Kelvin Waves: The Equatorial Express
Basic Physics
Kelvin waves are a special type of atmospheric wave that exists near the equator. Named after Lord Kelvin, they have unique properties:
- Equatorially trapped: Maximum amplitude at the equator, decreasing poleward
- Eastward propagating: Travel from west to east at typical speeds of 15-17 m/s
- No meridional velocity: Wind only blows east-west at the equator
- Geostrophic balance: Pressure gradient balanced by Coriolis force
Mathematical Description
The governing equations for equatorial Kelvin waves can be derived from the shallow water equations:
\[\frac{\partial u}{\partial t} - \beta y v = -g \frac{\partial h}{\partial x}\] \[\frac{\partial v}{\partial t} + \beta y u = -g \frac{\partial h}{\partial y}\] \[\frac{\partial h}{\partial t} + H \left(\frac{\partial u}{\partial x} + \frac{\partial v}{\partial y}\right) = 0\]For Kelvin waves, we assume $v = 0$ at the equator, leading to solutions of the form:
\[u = u_0 \exp\left(-\frac{\beta y^2}{2c}\right) \cos(kx - \omega t)\] \[h = \frac{c}{g} u_0 \exp\left(-\frac{\beta y^2}{2c}\right) \cos(kx - \omega t)\]where $c = \sqrt{gH}$ is the wave speed.
Observational Examples
Let’s look at how to identify Kelvin waves in observational data:
import numpy as np
import matplotlib.pyplot as plt
import xarray as xr
from scipy import signal
# Load zonal wind data from ERA5
ds = xr.open_dataset('era5_u_component.nc')
u_wind = ds['u'].sel(level=850, latitude=slice(-10, 10))
# Time-longitude plot (Hovmöller diagram)
def plot_hovmoller(data, title):
fig, ax = plt.subplots(figsize=(12, 6))
# Average over equatorial band
data_eq = data.sel(latitude=slice(-5, 5)).mean('latitude')
# Create Hovmöller plot
im = ax.contourf(data_eq.longitude, data_eq.time, data_eq,
levels=20, cmap='RdBu_r', extend='both')
ax.set_xlabel('Longitude (°E)')
ax.set_ylabel('Time')
ax.set_title(title)
plt.colorbar(im, ax=ax, label='Zonal Wind (m/s)')
return fig, ax
# Plot the Hovmöller diagram
fig, ax = plot_hovmoller(u_wind, 'Equatorial Zonal Wind - Kelvin Wave Detection')
plt.show()
Filtering for Kelvin Waves
To isolate Kelvin waves from other tropical disturbances:
def kelvin_wave_filter(data, min_period=2.5, max_period=30, min_speed=8, max_speed=50):
"""
Filter data to isolate Kelvin wave signals.
Parameters:
- min_period, max_period: Period range in days
- min_speed, max_speed: Eastward phase speed range in m/s
"""
# Convert to frequency-wavenumber space
fft_data = np.fft.fft2(data)
# Define frequency and wavenumber arrays
nt, nx = data.shape
dt = 1 # daily data
dx = 2.5 # 2.5 degree longitude spacing
freqs = np.fft.fftfreq(nt, dt)
kx = np.fft.fftfreq(nx, dx)
# Create filter in frequency-wavenumber space
freq_2d, kx_2d = np.meshgrid(freqs, kx, indexing='ij')
# Calculate phase speed
phase_speed = freq_2d / kx_2d
# Apply Kelvin wave criteria
kelvin_mask = (
(1/max_period <= np.abs(freq_2d)) & (np.abs(freq_2d) <= 1/min_period) & # Period range
(min_speed <= phase_speed) & (phase_speed <= max_speed) & # Speed range
(freq_2d * kx_2d > 0) # Eastward propagation
)
# Apply filter
fft_filtered = fft_data * kelvin_mask
kelvin_signal = np.real(np.fft.ifft2(fft_filtered))
return kelvin_signal
The Madden-Julian Oscillation (MJO)
What Makes the MJO Special?
The MJO is the dominant mode of intraseasonal variability in the tropical atmosphere, with several unique characteristics:
- 30-90 day period: Much longer than typical weather disturbances
- Eastward propagation: Moves at ~5 m/s around the equator
- Planetary scale: Spans 12,000-20,000 km
- Coupled convection: Links deep convection with circulation
MJO Structure and Dynamics
The MJO consists of:
- Enhanced convection: Active phase with increased rainfall
- Suppressed convection: Inactive phase with reduced rainfall
- Circulation anomalies: Large-scale wind and pressure patterns
- Moisture variations: Changes in atmospheric water vapor
Real-Time MJO Monitoring
The MJO is commonly tracked using the Real-time Multivariate MJO (RMM) index:
def calculate_rmm_index(olr_data, u850_data, u200_data):
"""
Calculate the Real-time Multivariate MJO index.
Parameters:
- olr_data: Outgoing Longwave Radiation
- u850_data: Zonal wind at 850 hPa
- u200_data: Zonal wind at 200 hPa
"""
# Remove annual cycle and standardize
def remove_annual_cycle(data):
climatology = data.groupby('time.dayofyear').mean('time')
anomaly = data.groupby('time.dayofyear') - climatology
return anomaly / anomaly.std('time')
olr_anom = remove_annual_cycle(olr_data)
u850_anom = remove_annual_cycle(u850_data)
u200_anom = remove_annual_cycle(u200_data)
# Combine variables
combined_data = xr.concat([olr_anom, u850_anom, u200_anom], dim='variable')
# Apply EOF analysis
from sklearn.decomposition import PCA
# Reshape for PCA
data_reshaped = combined_data.stack(space=('longitude', 'latitude')).T
# Perform PCA
pca = PCA(n_components=2)
mjo_pcs = pca.fit_transform(data_reshaped)
# Calculate RMM indices
rmm1 = mjo_pcs[:, 0]
rmm2 = mjo_pcs[:, 1]
# Calculate amplitude and phase
amplitude = np.sqrt(rmm1**2 + rmm2**2)
phase = np.arctan2(rmm2, rmm1) * 180 / np.pi
phase[phase < 0] += 360
return rmm1, rmm2, amplitude, phase
MJO Phase Diagram
The MJO is often visualized in phase space:
def plot_mjo_phase_diagram(rmm1, rmm2, dates):
"""Plot MJO evolution in phase space."""
fig, ax = plt.subplots(figsize=(10, 10), subplot_kw=dict(projection='polar'))
# Convert RMM to polar coordinates
amplitude = np.sqrt(rmm1**2 + rmm2**2)
phase = np.arctan2(rmm2, rmm1)
# Plot trajectory
colors = plt.cm.viridis(np.linspace(0, 1, len(dates)))
for i in range(len(dates)-1):
ax.plot([phase[i], phase[i+1]], [amplitude[i], amplitude[i+1]],
color=colors[i], linewidth=2)
# Add phase labels
phases = ['Indian Ocean', 'Maritime Continent', 'Western Pacific',
'Central Pacific', 'Eastern Pacific', 'Africa', 'Western Hemisphere']
for i, label in enumerate(phases):
angle = i * 2 * np.pi / 8
ax.text(angle, 3, label, rotation=np.degrees(angle)-90,
ha='center', va='center')
# Add amplitude circles
ax.set_ylim(0, 3)
ax.set_title('MJO Phase Diagram', pad=20)
return fig, ax
Interactions Between Waves
Kelvin Waves and the MJO
Recent research has revealed important interactions between these wave types:
- MJO initiation: Kelvin waves can trigger MJO events
- Wave modulation: The MJO modulates Kelvin wave activity
- Scale interactions: Energy transfer between different scales
def analyze_wave_interactions(kelvin_data, mjo_data):
"""Analyze interactions between Kelvin waves and MJO."""
# Calculate cross-correlation
from scipy.stats import pearsonr
correlations = []
lags = range(-30, 31) # ±30 days
for lag in lags:
if lag >= 0:
mjo_lagged = mjo_data[lag:]
kelvin_subset = kelvin_data[:-lag] if lag > 0 else kelvin_data
else:
mjo_lagged = mjo_data[:lag]
kelvin_subset = kelvin_data[-lag:]
if len(mjo_lagged) == len(kelvin_subset):
corr, _ = pearsonr(mjo_lagged, kelvin_subset)
correlations.append(corr)
else:
correlations.append(np.nan)
# Plot results
plt.figure(figsize=(10, 6))
plt.plot(lags, correlations, 'b-', linewidth=2)
plt.axhline(y=0, color='k', linestyle='--', alpha=0.5)
plt.xlabel('Lag (days)')
plt.ylabel('Cross-correlation')
plt.title('Kelvin Wave - MJO Interaction')
plt.grid(True, alpha=0.3)
return correlations
Impacts on Weather and Climate
Tropical Cyclone Formation
Both Kelvin waves and the MJO influence tropical cyclone development:
def analyze_tc_formation(tc_data, wave_data):
"""Analyze tropical cyclone formation in relation to tropical waves."""
# Create composite analysis
active_wave_periods = wave_data > wave_data.std()
inactive_wave_periods = wave_data < -wave_data.std()
# Calculate TC formation rates
tc_active = tc_data[active_wave_periods].mean()
tc_inactive = tc_data[inactive_wave_periods].mean()
print(f"TC formation rate during active wave periods: {tc_active:.2f}/month")
print(f"TC formation rate during inactive wave periods: {tc_inactive:.2f}/month")
print(f"Ratio: {tc_active/tc_inactive:.2f}")
return tc_active, tc_inactive
Monsoon Variability
Tropical waves significantly affect monsoon systems:
- Onset timing: MJO can advance or delay monsoon onset
- Break periods: Related to suppressed convection phases
- Intensity variations: Wave-enhanced or weakened monsoon flow
Numerical Modeling Challenges
Model Resolution Requirements
Simulating tropical waves requires careful consideration of:
# Example WRF namelist configuration for tropical waves
wrf_config = {
'dx': 25000, # 25 km horizontal resolution
'dt': 150, # 150 second time step
'vertical_levels': 40,
'physics_options': {
'microphysics': 'WSM6',
'cumulus': 'Kain-Fritsch',
'pbl': 'YSU',
'surface_layer': 'MM5'
}
}
Common Modeling Issues
- Convective parameterization: Critical for tropical wave simulation
- Boundary conditions: Proper initialization and lateral boundaries
- Ocean coupling: Important for longer simulations
- Computational cost: High-resolution simulations are expensive
Future Research Directions
Machine Learning Applications
Emerging ML techniques for tropical wave research:
# Example: LSTM for MJO prediction
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense
def build_mjo_lstm(input_shape):
"""Build LSTM model for MJO prediction."""
model = Sequential([
LSTM(50, return_sequences=True, input_shape=input_shape),
LSTM(50, return_sequences=False),
Dense(25, activation='relu'),
Dense(2) # RMM1 and RMM2
])
model.compile(optimizer='adam', loss='mse')
return model
Climate Change Impacts
Key research questions:
- How will tropical waves change in a warming climate?
- What are the implications for extreme weather?
- How do we improve wave representation in climate models?
Practical Applications
Forecasting
Understanding tropical waves improves:
- Subseasonal forecasting: 2-8 week predictions
- Seasonal outlooks: Monsoon and hurricane season forecasts
- Climate projections: Long-term change assessments
Early Warning Systems
Wave monitoring contributes to:
- Tropical cyclone formation alerts
- Drought and flood predictions
- Agricultural planning
Conclusion
Tropical waves like Kelvin waves and the MJO are fundamental components of the climate system. My research has shown that:
- Wave interactions are more complex than previously thought
- High-resolution modeling reveals new physical insights
- Machine learning offers promising tools for analysis and prediction
- Climate change impacts require urgent investigation
Understanding these phenomena is crucial for improving weather and climate predictions, with significant implications for billions of people living in tropical regions.
Recommended Resources
Key Papers
- Madden and Julian (1971): “Detection of a 40-50 day oscillation in the zonal wind”
- Wheeler and Hendon (2004): “An all-season real-time multivariate MJO index”
- Kiladis et al. (2009): “A comparison of OLR and circulation-based indices for tracking the MJO”
Data Sources
Modeling Tools
Interested in collaborating on tropical wave research? I’m always looking for new partnerships and data sharing opportunities. Reach out via email or connect on LinkedIn.