Jumat, 24 Juli 2026
Apakah itu Adveksi Suhu?
Bayangkan angin kencang bertiup dari selatan melewati perbedaan suhu yang tajam — udara hangat dari laut terbawa ke kawasan yang lebih dingin di daratan. Persis inilah yang disebut adveksi suhu: transpor suhu secara horizontal oleh angin. Ini bukan perubahan suhu akibat radiasi atau konveksi, melainkan murni karena udara berpindah tempat sambil membawa karakteristik termalnya.
Secara matematis, adveksi suhu horizontal didefinisikan sebagai:
$$-\mathbf{V}\cdot\nabla T = -\left(u\frac{\partial T}{\partial x} + v\frac{\partial T}{\partial y}\right)$$
di mana \(u\) adalah komponen angin zonal (m/s, positif ke timur), \(v\) adalah komponen angin meridional (m/s, positif ke utara), dan \(T\) adalah suhu dalam Kelvin. Tanda negatif penting: ini memastikan konvensi yang intuitif. Ketika angin membawa udara hangat ke kawasan yang lebih dingin — warm air advection (WAA) — hasilnya positif. Sebaliknya, cold air advection (CAA) menghasilkan nilai negatif.
Mengapa level 850 hPa menjadi standar diagnostik? Level ini berada tepat di atas friction-dominated planetary boundary layer, sehingga angin pada level ini lebih representatif untuk sirkulasi skala sinoptik. Isotherms di 850 hPa memisahkan air masses hangat dan dingin jauh lebih jelas dibandingkan permukaan, yang sering terdistorsi oleh efek topografi dan variasi radiasi lokal.
Dampak dinamis dari adveksi suhu langsung terasa dalam perkembangan cuaca. Warm advection di lapisan bawah troposfer memaksa gerak vertikal ke atas, karena udara hangat yang kurang padat memuai dan mendorong lapisan udara di atasnya naik. Cold advection mendorong gerak ke bawah dengan mekanisme yang berlawanan. Hubungan ini diformalkan dalam persamaan omega quasi-geostrophic, di mana adveksi suhu menjadi salah satu forcing term utama untuk ascent dan descent berskala sinoptik.
Dalam tutorial ini kita hitung adveksi suhu 850 hPa di atas Indonesia dari data ERA5 2024, dari download data, kalkulasi gradien dengan faktor metrik yang benar, hingga visualisasi peta adveksi dengan Cartopy.
Data ERA5 dan Komponen Angin
ERA5 adalah reanalysis global dari ECMWF yang tersedia di Climate Data Store (CDS) Copernicus. Data tersimpan pada resolusi horisontal 0,25° di grid lat-lon reguler, dengan 37 pressure levels mulai dari 1000 hPa hingga 1 hPa. ERA5 dihasilkan menggunakan 4D-Var data assimilation dengan spectral truncation T639 (resolusi native ~31 km), lalu diinterpolasi ke grid 0,25° untuk distribusi publik.
Untuk menghitung adveksi suhu kita butuh tiga variabel pada pressure level 850 hPa: suhu (\(T\), dalam Kelvin), komponen angin zonal (\(u\), m/s), dan komponen angin meridional (\(v\), m/s). Kita download satu file per variabel dari CDS. Setiap file akan berisi data daily 00Z untuk domain Indonesia (bounding box 6°N–11°S, 95°E–141°E) sepanjang tahun 2024. Setelah download selesai sekali, semua komputasi berikutnya berjalan dari file lokal.
Snippet berikut menangani download (hanya berjalan jika file belum ada) dan membuka ketiga dataset dengan xarray:
import os, cdsapi, xarray as xr
VARS = {
"temperature": "era5_t_pl500-850_indonesia_2024_d.nc",
"u_component_of_wind": "era5_u_pl500-850_indonesia_2024_d.nc",
"v_component_of_wind": "era5_v_pl500-850_indonesia_2024_d.nc",
}
for variable, out in VARS.items():
if not os.path.exists(out):
c = cdsapi.Client(quiet=True)
c.retrieve(
"reanalysis-era5-pressure-levels",
{
"product_type": "reanalysis",
"variable": [variable],
"pressure_level": ["500", "850"],
"year": "2024",
"month": [f"{m:02d}" for m in range(1, 13)],
"day": [f"{d:02d}" for d in range(1, 32)],
"time": "00:00",
"area": [6, 95, -11, 141],
"format": "netcdf",
},
out,
)
ds_t = xr.open_dataset(VARS["temperature"]).sel(pressure_level=850)
ds_u = xr.open_dataset(VARS["u_component_of_wind"]).sel(pressure_level=850)
ds_v = xr.open_dataset(VARS["v_component_of_wind"]).sel(pressure_level=850)
print("dims T :", dict(ds_t.dims))
print("lat :", float(ds_t.latitude.min()), "→", float(ds_t.latitude.max()), "°")
print("lon :", float(ds_t.longitude.min()), "→", float(ds_t.longitude.max()), "°")
print("steps :", len(ds_t.valid_time))
print("T units:", ds_t["t"].attrs.get("units", "K"))
dims T : {'valid_time': 366, 'latitude': 69, 'longitude': 185}
lat : -11.0 → 6.0 °
lon : 95.0 → 141.0 °
steps : 366
T units: K
Output di atas mengonfirmasi shape dataset: 366 time steps (satu per hari sepanjang 2024), 69 grid point latitude (6°N hingga −11°S pada step 0,25°), dan 185 grid point longitude (95°E hingga 141°E). Variabel suhu tersimpan dalam Kelvin.
Menghitung Gradien Temperatur dengan Faktor Metrik
Pada grid lat-lon di bola bumi, jarak fisik antara dua titik grid tidak seragam. Jarak meridional antara dua baris latitude berurutan adalah:
$$\Delta y = a \cdot \Delta\varphi$$
Sedangkan jarak zonal bergantung pada garis lintang:
$$\Delta x = a \cdot \cos\varphi \cdot \Delta\lambda$$
di mana \(a \approx 6{,}371 \times 10^6\) m adalah jari-jari bumi, \(\varphi\) adalah latitude dalam radian, dan \(\lambda\) adalah longitude dalam radian. Tanpa faktor \(\cos\varphi\), gradien zonal akan terlalu besar — terutama di lintang tinggi, namun efeknya tetap relevan bahkan di 6°N (\(\cos 6° \approx 0{,}99\), koreksi ~1%). Untuk analisis yang benar, faktor ini harus selalu disertakan.
Kita gunakan numpy.gradient dengan koordinat dalam radian sebagai argumen eksplisit. Ini memberikan \(\partial T/\partial\varphi\) (K/rad) dan \(\partial T/\partial\lambda\) (K/rad). Lalu kita konversikan ke K/m dengan faktor metrik yang tepat:
$$\frac{\partial T}{\partial y} = \frac{1}{a}\frac{\partial T}{\partial\varphi}, \qquad \frac{\partial T}{\partial x} = \frac{1}{a\cos\varphi}\frac{\partial T}{\partial\lambda}$$
Kita ambil satu timestep representatif — 15 Juli 2024 — dan gunakan timestep yang sama di seluruh snippet berikutnya:
import numpy as np
# Timestep representatif: 15 Juli 2024
T = ds_t["t"].sel(valid_time="2024-07-15", method="nearest").values # (nlat, nlon), K
lat = ds_t.latitude.values # degrees, 6.0 → -11.0
lon = ds_t.longitude.values # degrees, 95.0 → 141.0
# Koordinat dalam radian
lat_rad = np.deg2rad(lat)
lon_rad = np.deg2rad(lon)
# Gradien dalam satuan koordinat (K/rad)
dTdphi, dTdlam = np.gradient(T, lat_rad, lon_rad)
# Konversi ke K/m
R = 6_371_000.0 # jari-jari bumi, m
dTdy = dTdphi / R # ∂T/∂y, K/m (positif ke utara)
dTdx = dTdlam / (R * np.cos(lat_rad)[:, None]) # ∂T/∂x, K/m (positif ke timur)
# Cetak sampel dalam K per 100 km
scale = 1e5 # 100 km dalam metre
for target_lat in [5.0, 0.0, -5.0]:
il = int(np.argmin(np.abs(lat - target_lat)))
ic = len(lon) // 2 # kolom tengah (~118°E)
print(f"lat={lat[il]:+.2f}°: dT/dx={dTdx[il, ic]*scale:.4f} K/100km, "
f"dT/dy={dTdy[il, ic]*scale:.4f} K/100km")
lat=+5.00°: dT/dx=-0.3879 K/100km, dT/dy=-0.3056 K/100km
lat=+0.00°: dT/dx=0.7096 K/100km, dT/dy=-0.4251 K/100km
lat=-5.00°: dT/dx=0.0353 K/100km, dT/dy=0.0457 K/100km
Nilai gradien di atas menunjukkan besaran yang wajar untuk domain tropis — umumnya dalam orde \(10^{-2}\) hingga \(10^{-1}\) K per 100 km. Ini jauh lebih kecil dari gradien skala frontal di lintang menengah yang bisa mencapai beberapa K per 100 km. Variabel dTdx dan dTdy tersimpan di memori bersama untuk snippet selanjutnya.
Menghitung Adveksi Suhu Horizontal
Dengan gradien suhu \(\partial T/\partial x\) dan \(\partial T/\partial y\) dalam satuan K/m, kita kombinasikan dengan komponen angin \(u\) dan \(v\) untuk mendapatkan adveksi suhu:
$$\text{Adveksi} = -\left(u \cdot \frac{\partial T}{\partial x} + v \cdot \frac{\partial T}{\partial y}\right) \quad [\text{K/s}]$$
Konvensi tanda: adveksi positif berarti warm advection — angin membawa udara hangat ke kawasan yang lebih dingin, sehingga suhu lokal cenderung naik. Adveksi negatif berarti cold advection — angin membawa udara lebih dingin ke kawasan yang lebih hangat, suhu lokal cenderung turun.
Maksimum adveksi terjadi ketika angin bertiup hampir tegak lurus terhadap isotherms (sudut θ mendekati 0°). Ketika angin bertiup sejajar isotherms, adveksi mendekati nol meskipun angin kencang. Perlu dicatat bahwa perhitungan adveksi tidak membutuhkan parameter Coriolis — berbeda dengan thermal wind yang memiliki singularitas di ekuator — sehingga rumus ini valid di seluruh domain tropis Indonesia.
Hasil dalam K/s kita konversi ke K/hari (kalikan 86400) agar lebih mudah dibaca. Pada chart operasional, satuan K per 3 jam (kalikan 10800) juga umum dipakai.
# Timestep sama: 15 Juli 2024
U = ds_u["u"].sel(valid_time="2024-07-15", method="nearest").values # m/s
V = ds_v["v"].sel(valid_time="2024-07-15", method="nearest").values # m/s
# Adveksi suhu: -V·∇T (K/s)
adv_Ks = -(U * dTdx + V * dTdy)
# Konversi ke K/hari
adv_Kday = adv_Ks * 86400
print("Adveksi suhu 850 hPa — 15 Juli 2024:")
print(f" min : {adv_Kday.min():.3f} K/hari")
print(f" max : {adv_Kday.max():.3f} K/hari")
print(f" mean : {adv_Kday.mean():.4f} K/hari")
print(f" p5 : {np.percentile(adv_Kday, 5):.3f} K/hari")
print(f" p95 : {np.percentile(adv_Kday, 95):.3f} K/hari")
# Titik warm advection dan cold advection ekstrem
iw = np.unravel_index(np.argmax(adv_Kday), adv_Kday.shape)
ic_ = np.unravel_index(np.argmin(adv_Kday), adv_Kday.shape)
print(f"\nWarm advection max: lat={lat[iw[0]]:.2f}°, lon={lon[iw[1]]:.2f}°, "
f"adv={adv_Kday[iw]:.3f} K/hari")
print(f"Cold advection min: lat={lat[ic_[0]]:.2f}°, lon={lon[ic_[1]]:.2f}°, "
f"adv={adv_Kday[ic_]:.3f} K/hari")
Adveksi suhu 850 hPa — 15 Juli 2024:
min : -23.567 K/hari
max : 22.328 K/hari
mean : -0.1507 K/hari
p5 : -4.619 K/hari
p95 : 4.271 K/hari
Warm advection max: lat=-10.00°, lon=126.50°, adv=22.328 K/hari
Cold advection min: lat=-10.50°, lon=123.75°, adv=-23.567 K/hari
Perlu diperhatikan bagaimana membaca angka ini. Nilai tipikal adveksi suhu di domain Indonesia — persentil 5–95 hanya sekitar ±4,6 K/hari dengan rata-rata mendekati nol — jauh lebih kecil daripada benchmark mid-latitude yang sering dikutip dalam literatur (±5 hingga ±30 K/hari dalam situasi sinoptik aktif). Ini sesuai dengan karakteristik fisik tropis: gradien suhu horizontal di atas Maritime Continent memang jauh lebih lemah dibandingkan wilayah frontal di lintang menengah. Nilai ekstrem (min/max ±23 K/hari) memang bisa mencapai orde yang sama dengan situasi sinoptik aktif lintang menengah, namun terlokalisasi di area kecil dekat batas selatan domain (sekitar 10°S). Bukan berarti adveksi di sini tidak bermakna; nilai tipikal yang lebih kecil ini tetap berkontribusi pada forcing vertikal dan perkembangan konveksi tropis dalam kerangka omega equation.
Visualisasi Adveksi Suhu dengan Cartopy
Untuk memahami pola spasial secara intuitif, kita plot peta adveksi suhu 850 hPa di atas Indonesia dengan Cartopy menggunakan proyeksi PlateCarree. Kita gunakan colormap diverging "RdBu_r" — merah untuk warm advection, biru untuk cold advection, dan putih mendekati nol — dengan skala simetris yang dikalibrasi dari persentil ke-98 nilai absolut agar outlier ekstrem tidak mendominasi warna.
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cartopy.feature as cfeature
fig, ax = plt.subplots(
figsize=(12, 6),
subplot_kw={"projection": ccrs.PlateCarree()},
)
# Skala warna simetris, potong outlier ekstrem
vmax = float(np.percentile(np.abs(adv_Kday), 98))
vmax = max(vmax, 0.5)
cf = ax.pcolormesh(
lon, lat, adv_Kday,
cmap="RdBu_r",
vmin=-vmax, vmax=vmax,
transform=ccrs.PlateCarree(),
shading="auto",
)
ax.add_feature(cfeature.COASTLINE.with_scale("50m"), linewidth=0.8, edgecolor="black")
ax.add_feature(cfeature.BORDERS.with_scale("50m"), linewidth=0.5, edgecolor="gray")
ax.set_extent([95, 141, -11, 6], crs=ccrs.PlateCarree())
gl = ax.gridlines(draw_labels=True, linewidth=0.5, color="gray", alpha=0.6, linestyle="--")
gl.top_labels = False
gl.right_labels = False
cb = plt.colorbar(cf, ax=ax, orientation="horizontal", pad=0.06, shrink=0.8)
cb.set_label("Adveksi suhu (K/hari)", fontsize=11)
ax.set_title(
"Adveksi Suhu 850 hPa — Indonesia, 15 Juli 2024 (00Z)",
fontsize=13, pad=10,
)
plt.tight_layout()
plt.savefig("advection_850.png", dpi=150, bbox_inches="tight")
print("Saved: advection_850.png")
Peta adveksi ini langsung menunjukkan mana kawasan yang saat itu mengalami warm advection (merah) dan mana yang mengalami cold advection (biru). Dalam konteks analisis sinoptik, patch merah berkorelasi dengan area yang lebih berpotensi mengalami ascent — dan karenanya lebih kondusif untuk perkembangan konveksi atau penguatan sistem cuaca. Area biru mengisyaratkan potensi subsidence. Membaca peta ini bersama field vortisitas atau divergensi memberikan gambaran dinamika sinoptik yang lebih lengkap.
Langkah Selanjutnya
Kita sudah menghitung adveksi suhu 850 hPa dari ERA5 secara end-to-end: download tiga variabel dari CDS, menerapkan koreksi faktor metrik \(\cos\varphi\) yang benar pada grid lat-lon, menghitung \(-\mathbf{V}\cdot\nabla T\) dalam K/hari, dan memvisualisasikan hasilnya sebagai peta diverging di atas Indonesia.
Dari sini ada beberapa ekstensi alami. Mengulangi komputasi pada 500 hPa memberikan perspektif upper-level — di mana thermal advection mendorong perubahan ketinggian geopotential dan amplifikasi ridge atau trough. Menggabungkan adveksi suhu dengan vortisitas relatif menghasilkan diagnostik omega equation yang lebih lengkap untuk memahami forced vertical motion. Kita juga bisa merata-rata adveksi secara temporal untuk mengidentifikasi musim mana yang paling aktif secara advektif di wilayah Indonesia.
Karena adveksi tidak memerlukan parameter Coriolis, metode yang sama berlaku di seluruh domain tanpa modifikasi khusus untuk wilayah ekuatorial.
Eksplorasi artikel meteorologi lainnya di meteo.my.id (https://meteo.my.id).
Referensi
- NOAA NWS Glossary — Advection, Warm Advection, Cold Advection — Definisi operasional adveksi, warm air advection (WAA), dan cold air advection (CAA) dari National Weather Service.
- Simplified Omega Equation: Thermal Advection Term — NWS Houston Training — Penjelasan bagaimana WAA memaksa ascent dan CAA memaksa descent melalui efek densitas dalam kerangka omega equation quasi-geostrophic.
- 850 hPa Temperature Advection — Unidata Python Gallery — Contoh komputasi adveksi suhu 850 hPa dengan MetPy dan penanganan faktor metrik \(\cos(\varphi)\) pada grid lat-lon.
- ERA5: Data Documentation — ECMWF Knowledge Base — Dokumentasi resmi ERA5 mencakup variabel pressure-level (T, U, V), resolusi T639/0,25°, dan 37 pressure levels.
- Gridded Diagnostics: Temperature Advection with CFSR — UAlbany ATM350 — Notebook kuliah University at Albany yang mendemonstrasikan komputasi adveksi dari reanalysis dengan MetPy dan penanganan CRS untuk faktor metrik otomatis.