Selasa, 14 Juli 2026

Sumber: NASA Scientific Visualization Studio — The Polar Jet Stream, visualisasi MERRA; karya domain publik pemerintah AS.
Keseimbangan Geostrofik dalam Meteorologi Sinoptik
Di lintang menengah, pola angin skala besar hampir seluruhnya dikontrol oleh satu keseimbangan fundamental: gaya gradien tekanan melawan gaya Coriolis. Ketika keduanya seimbang sempurna, angin bertiup sejajar kontur isobar dan dikenal sebagai angin geostrofik. Inilah mengapa seorang meteorolog bisa "membaca" arah dan kecepatan angin hanya dengan melihat peta ketinggian geopotensial 500 hPa — kontur yang rapat dan sejajar menandai angin kencang, sedangkan kontur yang lengkung dalam membentuk trough atau ridge menandakan daerah cuaca aktif.
Keseimbangan ini ada karena dua gaya saling menyeimbangkan secara horisontal: gaya gradien tekanan yang mendorong udara dari tekanan tinggi ke rendah, dan gaya Coriolis yang membelokkan gerak ke kanan (di belahan bumi utara) atau ke kiri (di belahan bumi selatan) akibat rotasi Bumi. Ketika keduanya tepat seimbang, resultan gerak adalah angin yang sejajar isobar, bukan tegak lurus.
Indonesia berada sepenuhnya di kawasan tropis — antara 6°N dan 11°S. Di sini, gaya Coriolis sangat lemah karena mendekati nol di ekuator. Apakah keseimbangan geostrofik masih berlaku? Tutorial ini menjawabnya secara kuantitatif. Kita hitung angin geostrofik dari data ERA5 geopotensial 500 hPa, lalu gunakan Bilangan Rossby untuk mengukur seberapa valid pendekatan tersebut di setiap titik grid — dan kita visualisasikan hasilnya di atas peta Cartopy.
Setup dan Akuisisi Data ERA5
Data yang kita butuhkan adalah geopotensial pada level tekanan 500 hPa dan 850 hPa untuk kawasan Indonesia sepanjang tahun 2024, dalam format harian 00Z. ERA5 menyimpan geopotensial dalam satuan J/kg (setara m²/s²) — bukan langsung dalam satuan ketinggian metre. Kita perlu mengonversinya ke ketinggian geopotensial \(Z\) dengan membagi terhadap percepatan gravitasi \(g = 9{,}80665\ \text{m/s}^2\).
Snippet berikut mengunduh file dari Copernicus CDS satu kali, lalu menyimpannya secara lokal. Jalankan sekali — snippet selanjutnya membaca dari file yang sama tanpa perlu mengunduh ulang. Untuk mendaftar akun CDS dan mendapatkan API key, kunjungi cds.climate.copernicus.eu.
import os, cdsapi, xarray as xr
OUT = "era5_z_pl500-850_indonesia_2024_d.nc"
if not os.path.exists(OUT):
c = cdsapi.Client(quiet=True)
c.retrieve(
"reanalysis-era5-pressure-levels",
{
"product_type": "reanalysis",
"variable": ["geopotential"],
"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], # N, W, S, E — Indonesia
"format": "netcdf",
},
OUT,
)
ds = xr.open_dataset(OUT)
print(ds)
<xarray.Dataset> Size: 37MB
Dimensions: (valid_time: 366, pressure_level: 2, latitude: 69,
longitude: 185)
Coordinates:
* valid_time (valid_time) datetime64[ns] 3kB 2024-01-01 ... 2024-12-31
expver (valid_time) <U4 6kB ...
* pressure_level (pressure_level) float64 16B 850.0 500.0
* latitude (latitude) float64 552B 6.0 5.75 5.5 ... -10.5 -10.75 -11.0
* longitude (longitude) float64 1kB 95.0 95.25 95.5 ... 140.8 141.0
number int64 8B ...
Data variables:
z (valid_time, pressure_level, latitude, longitude) float32 37MB ...
Attributes:
GRIB_centre: ecmf
GRIB_centreDescription: European Centre for Medium-Range Weather Forecasts
GRIB_subCentre: 0
Conventions: CF-1.7
institution: European Centre for Medium-Range Weather Forecasts
history: 2026-05-10T04:08 GRIB to CDM+CF via cfgrib-0.9.1...
Dataset yang terbuka memiliki dimensi valid_time, dimensi level tekanan, latitude, dan longitude. Variabel utama kita adalah z — geopotensial dalam m²/s². Fokus analisis di level 500 hPa karena level ini merupakan standar analisis sinoptik extratropik dan mewakili pertengahan troposfer.
Menghitung Angin Geostrofik dari Gradient Geopotensial
Pada permukaan isobar, komponen angin geostrofik ditulis sebagai:
$$u_g = -\frac{g}{f}\frac{\partial Z}{\partial y}, \qquad v_g = \frac{g}{f}\frac{\partial Z}{\partial x}$$
di mana \(g = 9{,}80665\ \text{m/s}^2\), \(Z\) adalah ketinggian geopotensial dalam metre, dan \(f\) adalah parameter Coriolis:
$$f = 2\Omega\sin\varphi$$
dengan \(\Omega = 7{,}292 \times 10^{-5}\ \text{rad/s}\) (kecepatan sudut rotasi Bumi) dan \(\varphi\) adalah lintang. Perhatikan struktur persamaannya: \(u_g\) dan \(v_g\) berbanding terbalik dengan \(f\). Semakin kecil \(f\) — semakin dekat ke ekuator — semakin besar angin geostrofik yang "diperlukan" untuk mengimbangi gradien tekanan yang sama. Ini pertanda awal bahwa pendekatan geostrofik akan bermasalah di tropik.
Konvensi tanda standar: gradient positif \(\partial Z/\partial x\) (ketinggian naik ke timur) menghasilkan \(v_g\) positif (angin ke utara). Gradient positif \(\partial Z/\partial y\) (ketinggian naik ke utara) menghasilkan \(u_g\) negatif (angin ke barat). Hasilnya adalah angin yang bertiup searah jarum jam mengitari ridge dan berlawanan jarum jam mengitari trough di belahan bumi utara — konsisten dengan pengamatan sinoptik.
Untuk implementasi numerik, kita hitung \(\partial Z/\partial y\) dan \(\partial Z/\partial x\) dengan np.gradient. Satu hal yang harus diperhatikan: jarak horizontal dalam arah \(x\) (timur-barat) bergantung pada lintang karena bentuk bola Bumi — di ekuator jarak per derajat bujur lebih panjang daripada di lintang tinggi. Titik-titik grid di dekat ekuator (\(|\varphi| < 1°\)) di-mask karena \(f \to 0\) menyebabkan singularitas pembagi-nol.
import numpy as np
g = 9.80665 # percepatan gravitasi m/s²
Omega = 7.2921e-5 # kecepatan sudut Bumi rad/s
R_earth = 6.371e6 # jari-jari Bumi m
# Deteksi nama dimensi pressure level secara otomatis (ERA5: "level" atau "pressure_level")
level_dim = next(d for d in ds.dims if "level" in d.lower())
# Deteksi nama dimensi waktu secara otomatis (ERA5: "time" atau "valid_time")
time_dim = next(d for d in ds["z"].dims if "time" in d.lower())
# Geopotensial → ketinggian geopotensial Z (m) di 500 hPa, timestep pertama
z_var = ds["z"].sel({level_dim: 500}).isel({time_dim: 0}).values # m²/s²
Z = z_var / g # m
lat = ds["latitude"].values # derajat, N ke S (6 → -11)
lon = ds["longitude"].values # derajat, E (95 → 141)
# Parameter Coriolis f = 2Ω sin(φ)
f = 2 * Omega * np.sin(np.deg2rad(lat)) # shape (nlat,)
# Gradient ∂Z/∂y (arah utara): gunakan lat dalam satuan metre sebagai koordinat
# np.gradient menghitung dZ/d(lat_m) — karena lat_m mewakili arah utara, ini = ∂Z/∂y
lat_m = lat * np.pi / 180 * R_earth # (nlat,)
dZdy = np.gradient(Z, lat_m, axis=0) # ∂Z/∂y (northward), shape (nlat, nlon)
# Gradient ∂Z/∂x (arah timur): koreksi cos(φ) untuk jarak aktual per bujur
dZdlon = np.gradient(Z, lon, axis=1) # ∂Z/∂lon [m/°]
cos_lat = np.cos(np.deg2rad(lat)) # (nlat,)
dZdx = dZdlon / (np.pi / 180 * R_earth * cos_lat[:, np.newaxis]) # ∂Z/∂x (eastward)
# Masking: titik dengan |lat| < 1° → f sangat kecil → hasil tidak realistis secara fisis
f_2d = np.where(
np.abs(lat[:, np.newaxis]) < 1.0,
np.nan,
f[:, np.newaxis],
)
# Komponen angin geostrofik
ug = -(g / f_2d) * dZdy # u_g = -(g/f)(∂Z/∂y)
vg = (g / f_2d) * dZdx # v_g = (g/f)(∂Z/∂x)
print(f"Shape Z : {Z.shape} (nlat × nlon)")
print(f"ug range : {np.nanmin(ug):.1f} – {np.nanmax(ug):.1f} m/s")
print(f"vg range : {np.nanmin(vg):.1f} – {np.nanmax(vg):.1f} m/s")
# Sampel di sekitar 5°S / 110°E (sekitar Jawa Tengah)
ilat = np.argmin(np.abs(lat - (-5.0)))
ilon = np.argmin(np.abs(lon - 110.0))
print(f"\nSampel di lat={lat[ilat]:.2f}°, lon={lon[ilon]:.2f}°:")
print(f" f = {f[ilat]:.3e} s⁻¹")
print(f" ug = {ug[ilat, ilon]:.2f} m/s")
print(f" vg = {vg[ilat, ilon]:.2f} m/s")
Shape Z : (69, 185) (nlat × nlon)
ug range : -256.8 – 176.7 m/s
vg range : -247.4 – 268.6 m/s
Sampel di lat=-5.00°, lon=110.00°:
f = -1.271e-05 s⁻¹
ug = -8.84 m/s
vg = -2.84 m/s
Output di atas memperlihatkan rentang komponen angin geostrofik di seluruh domain Indonesia. Nilai \(f\) di ~5°S jauh lebih kecil daripada \(10^{-4}\ \text{s}^{-1}\) yang khas di lintang menengah. Itu mengindikasikan bahwa formula geostrofik menghasilkan kecepatan angin yang jauh lebih tinggi daripada yang realistis secara fisis — pertanda bahwa keseimbangan geostrofik sudah mulai runtuh.
Bilangan Rossby dan Validitas Keseimbangan Geostrofik di Tropis
Bilangan Rossby adalah ukuran adimensional yang menjawab pertanyaan kunci: seberapa dominankah gaya Coriolis dibanding gaya inersia pada sistem gerak tertentu? Definisinya:
$$Ro = \frac{U}{fL}$$
di mana \(U\) adalah kecepatan angin karakteristik (m/s), \(f\) adalah parameter Coriolis (s⁻¹), dan \(L\) adalah panjang skala karakteristik sistem (m). Secara fisis, \(Ro\) adalah rasio antara akselerasi advektif (\(U^2/L\)) terhadap akselerasi Coriolis (\(fU\)): ketika \(Ro \ll 1\), Coriolis mendominasi dan keseimbangan geostrofik adalah pendekatan yang baik. Ketika \(Ro \sim 1\) atau lebih besar, gaya inersia dan gradien tekanan mendominasi — angin tidak lagi geostrofik.
Untuk siklon skala sinoptik di lintang menengah: \(U \approx 10\ \text{m/s}\), \(f \approx 10^{-4}\ \text{s}^{-1}\), \(L \approx 1000\ \text{km}\), sehingga \(Ro \approx 0{,}1\) — keseimbangan geostrofik sangat baik. Berbeda dengan Indonesia, khususnya di 5°S (Jawa): \(f = 2 \times 7{,}292 \times 10^{-5} \times \sin(5°) \approx 1{,}27 \times 10^{-5}\ \text{s}^{-1}\) — sekitar delapan kali lebih lemah dari nilai lintang menengah. Dengan \(U \approx 10\ \text{m/s}\) dan \(L = 1000\ \text{km}\):
$$Ro \approx \frac{10}{1{,}27 \times 10^{-5} \times 10^6} \approx 0{,}79$$
Nilai ini mendekati satu — keseimbangan geostrofik sangat marginal. Di ekuator sendiri, \(f = 0\) sehingga \(Ro \to \infty\); angin ekuatorial tidak bisa dijelaskan oleh keseimbangan geostrofik sama sekali, dan gradien tekanan langsung mengakselerasi udara dari tinggi ke rendah.

Sumber: NOAA Climate Prediction Center — 500-hPa Geopotential Heights. Kontur ketinggian 500 hPa (interval 8 dam) memperlihatkan aliran geostrofik di extratropik: angin bertiup sejajar kontur, lebih kencang di mana kontur rapat.
Snippet berikut menghitung \(Ro\) di setiap titik grid menggunakan kecepatan angin geostrofik sebagai \(U\) dan skala panjang sinoptik \(L = 1000\ \text{km}\), lalu membandingkan nilai median-nya antar lintang dalam domain Indonesia.
L = 1.0e6 # skala panjang sinoptik 1000 km = 10⁶ m
# Kecepatan angin geostrofik
U = np.sqrt(ug**2 + vg**2) # (nlat, nlon), m/s
# Bilangan Rossby Ro = U / (|f| * L) — gunakan |f| agar berlaku di kedua hemisfer
Ro = U / (np.abs(f[:, np.newaxis]) * L) # (nlat, nlon)
# Tabel perbandingan Ro antar lintang
print(f"{'Lintang':>10} {'f (s⁻¹)':>13} {'U rerata (m/s)':>16} {'Ro median':>11}")
print("-" * 58)
for target in [5.0, -2.0, -5.0, -10.0]:
il = np.argmin(np.abs(lat - target))
u_mean = np.nanmean(U[il, :])
ro_med = np.nanmedian(Ro[il, :])
print(f"{lat[il]:>10.2f}° {f[il]:>13.3e} {u_mean:>16.2f} {ro_med:>11.3f}")
print()
# Fraksi grid dengan Ro > 0,5 (keseimbangan geostrofik mulai dipertanyakan)
valid = np.isfinite(Ro)
frac = np.nansum(Ro[valid] > 0.5) / valid.sum()
print(f"Fraksi titik grid dengan Ro > 0,5 : {frac:.1%}")
# Fraksi grid dengan Ro > 1,0 (keseimbangan geostrofik tidak berlaku)
frac_crit = np.nansum(Ro[valid] > 1.0) / valid.sum()
print(f"Fraksi titik grid dengan Ro > 1,0 : {frac_crit:.1%}")
Lintang f (s⁻¹) U rerata (m/s) Ro median
----------------------------------------------------------
5.00° 1.271e-05 13.20 0.949
-2.00° -5.090e-06 35.94 6.139
-5.00° -1.271e-05 16.69 1.225
-10.00° -2.533e-05 10.56 0.431
Fraksi titik grid dengan Ro > 0,5 : 77.9%
Fraksi titik grid dengan Ro > 1,0 : 54.6%
Output memperlihatkan pola yang konsisten dengan prediksi teori: semakin dekat ke ekuator, \(f\) mengecil dan \(Ro\) membesar. Di 5°N median \(Ro\) sudah \(0{,}95\), praktis berada di ambang keseimbangan geostrofik. Di sisi selatan ekuator polanya bahkan lebih tegas: di ~5°S (lintang Jawa) median \(Ro\) mencapai \(1{,}22\) — sudah melampaui 1 — dan di ~2°S nilainya meledak jauh di atas 1 karena \(f\) nyaris nol. Baru di ~10°S, yang relatif jauh dari ekuator, median \(Ro\) turun ke \(0{,}43\), mendekati ambang 0,5. Yang paling telak adalah statistik domain: \(77{,}9\%\) titik grid memiliki \(Ro > 0{,}5\) dan \(54{,}6\%\) bahkan \(Ro > 1{,}0\) — pendekatan geostrofik tidak aman di sebagian besar wilayah Indonesia.
Pemetaan Angin Geostrofik dan Analisis Spasial Bilangan Rossby
Untuk melihat distribusi spasialnya secara langsung, kita buat peta Cartopy yang menampilkan dua lapisan informasi: nilai \(Ro\) sebagai shading warna latar belakang, dan vektor angin geostrofik sebagai panah quiver. Area yang diarsir merah (\(Ro \geq 1\)) secara visual langsung menunjukkan di mana pendekatan geostrofik benar-benar runtuh. Kontur geopotensial 500 hPa di-overlay sebagai konteks sinoptik.
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors
import cartopy.crs as ccrs
import cartopy.feature as cfeature
from cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER
fig = plt.figure(figsize=(13, 6))
ax = plt.axes(projection=ccrs.PlateCarree())
ax.set_extent([95, 141, -11, 6], crs=ccrs.PlateCarree())
# --- Shading Bilangan Rossby ---
LON, LAT_grid = np.meshgrid(lon, lat)
ro_plot = np.where(np.isfinite(Ro), np.clip(Ro, 0, 2.0), np.nan)
norm = mcolors.Normalize(vmin=0, vmax=2.0)
mesh = ax.pcolormesh(
LON, LAT_grid, ro_plot,
transform=ccrs.PlateCarree(),
cmap="YlOrRd", norm=norm, shading="auto", alpha=0.85,
)
# --- Kontur geopotensial 500 hPa ---
ax.contour(
LON, LAT_grid, Z,
levels=15, colors="navy", linewidths=0.5, alpha=0.5,
transform=ccrs.PlateCarree(),
)
# --- Vektor angin geostrofik (subsample setiap 4 titik) ---
step = 4
ax.quiver(
LON[::step, ::step], LAT_grid[::step, ::step],
ug[::step, ::step], vg[::step, ::step],
transform=ccrs.PlateCarree(),
color="darkblue", scale=150, width=0.003, alpha=0.85,
)
# --- Garis batas masking |lat| = 1° ---
for lat_boundary in [1.0, -1.0]:
ax.plot(
[95, 141], [lat_boundary, lat_boundary],
color="gray", linestyle="--", linewidth=0.9,
transform=ccrs.PlateCarree(),
)
# --- Fitur peta ---
ax.add_feature(cfeature.LAND.with_scale("50m"),
facecolor="#f5f0e8", alpha=0.35)
ax.add_feature(cfeature.COASTLINE.with_scale("50m"),
linewidth=0.7, edgecolor="#222")
ax.add_feature(cfeature.BORDERS.with_scale("50m"),
linewidth=0.4, edgecolor="#555", linestyle=":")
# --- Gridlines berlabel ---
gl = ax.gridlines(draw_labels=True, linewidth=0.3, color="gray", alpha=0.45)
gl.xformatter = LONGITUDE_FORMATTER
gl.yformatter = LATITUDE_FORMATTER
gl.top_labels = False
gl.right_labels = False
# --- Colorbar dan judul ---
cbar = plt.colorbar(
mesh, ax=ax, orientation="vertical",
pad=0.02, shrink=0.85, label="Bilangan Rossby (Ro)",
)
cbar.ax.axhline(0.5, color="orange", linewidth=1.5, linestyle="--")
cbar.ax.axhline(1.0, color="red", linewidth=1.5, linestyle="--")
ax.set_title(
"Angin Geostrofik 500 hPa dan Bilangan Rossby — Indonesia, 2024-01-01 00Z",
fontsize=11, weight="bold", pad=8,
)
plt.savefig("geostrofik_rossby.png", dpi=150, bbox_inches="tight")
Peta yang dihasilkan memperlihatkan gradasi warna dari kuning (Ro rendah, di lintang paling utara domain) hingga merah (Ro tinggi, di dekat dan di sekitar ekuator). Panah-panah vektor angin geostrofik mengikuti kontur geopotensial — persis seperti yang diprediksi teori. Namun di dekat garis putus-putus batas masking (\(|\varphi| = 1°\)), nilai \(Ro\) meledak karena \(f\) hampir nol. Dua garis horisontal putus-putus pada colorbar menandai ambang \(Ro = 0{,}5\) (keseimbangan mulai dipertanyakan) dan \(Ro = 1{,}0\) (keseimbangan geostrofik tidak berlaku secara tegas).
Kesimpulan dan Langkah Selanjutnya
Tutorial ini menunjukkan tiga hal secara kuantitatif. Pertama, formula angin geostrofik \(u_g = -(g/f)\partial Z/\partial y\) dan \(v_g = (g/f)\partial Z/\partial x\) dapat langsung diimplementasikan dari data ERA5 menggunakan np.gradient, dengan koreksi \(\cos(\varphi)\) untuk jarak horisontal dalam arah bujur dan konversi geopotensial J/kg → ketinggian metre. Kedua, masking \(|\varphi| < 1°\) wajib dilakukan karena \(f \to 0\) menyebabkan singularitas numerik. Ketiga, Bilangan Rossby yang dihitung dari data — median \(Ro \approx 1{,}2\) di ~5°S (lintang Jawa), jauh di atas \(Ro \approx 0{,}1\) khas siklon lintang menengah, dan \(Ro > 0{,}5\) pada hampir 78% titik grid domain — mengkonfirmasi bahwa keseimbangan geostrofik marginal hingga tidak berlaku di seluruh kawasan Indonesia.
Implikasi praktisnya jelas. Meteorolog operasional di kawasan tropis tidak bisa mengandalkan peta 500 hPa sebagai proxy angin geostrofik yang andal seperti yang dilakukan rekan mereka di lintang menengah. Analisis sinoptik tropis lebih bergantung pada vortisitas relatif, divergensi di berbagai level, dan fluktuasi OLR untuk mendeteksi sistem konvektif dan gelombang ekuatorial.
Topik lanjutan yang layak dieksplorasi: gradient wind yang menambahkan suku kelengkungan lintasan dan lebih akurat untuk aliran melingkar di tropik; analisis thermal wind shear yang menghubungkan shear angin vertikal dengan gradient suhu horisontal; atau melihat langsung vortisitas dan divergensi dari data ERA5 u- dan v-wind yang menggunakan logika gradient serupa. Semua topik itu saling terhubung dalam dinamika atmosfer skala menengah.
Eksplorasi artikel meteorologi lainnya di meteo.my.id — kunjungi https://meteo.my.id untuk telusur lebih lanjut.
Referensi
- Geostrophic wind — Wikipedia — definisi komponen \(u_g\), \(v_g\) pada permukaan isobar dan penjelasan mengapa keseimbangan geostrofik tidak berlaku di ekuator karena \(f = 0\).
- Rossby number — Wikipedia — definisi \(Ro = U/(fL)\) dan interpretasi fisis: nilai kecil menandai dominasi Coriolis, nilai besar menandai dominasi inersia dan gradien tekanan.
- Practical Meteorology (Stull) — Atmospheric Forces and Winds, Ch. 10 — referensi pedagogis open-access untuk persamaan geostrofik dalam koordinat ketinggian dan contoh numerik Bilangan Rossby untuk siklon lintang menengah (\(Ro \approx 0{,}1\)).
- The Polar Jet Stream — NASA Scientific Visualization Studio — visualisasi MERRA jet stream yang memperlihatkan aliran geostrofik skala besar di troposfer atas sebagai hasil keseimbangan antara gradien tekanan dan gaya Coriolis.
- 500-hPa Geopotential Heights — NOAA Climate Prediction Center — peta operasional ketinggian geopotensial 500 hPa dari CDAS/Reanalysis; contoh nyata penggunaan keseimbangan geostrofik dalam analisis sinoptik extratropik.