Pentingnya Tekanan Permukaan untuk Meteorologi Tropis
Tekanan permukaan laut — lebih dikenal dengan singkatan MSL (mean sea level pressure) — adalah variabel paling mendasar dalam analisis cuaca sinoptik. Setiap peta cuaca global yang kita lihat, dari prakiraan BMKG hingga model GFS, dibangun di atas distribusi MSL. Nilai MSL menentukan di mana angin mengalir, di mana udara naik, dan pada akhirnya, di mana hujan turun.
Di daerah tropis seperti Indonesia, MSL berada di sekitar \(1{,}013\ \text{hPa}\) pada kondisi normal. Zona bertekanan rendah di sekitar ekuator dikenal sebagai ITCZ (Intertropical Convergence Zone) — sabuk tempat angin pasat dari Belahan Bumi Utara dan Selatan bertemu dan memicu konveksi intens. ITCZ bermigrasi musiman melintasi khatulistiwa dan secara langsung memengaruhi kapan musim hujan datang di tiap wilayah Indonesia.
Sumber: NASA Earth Observatory — The Intertropical Convergence Zone (GOES-11 composite, domain publik)
Semakin rapat isobar pada peta sinoptik, semakin kencang angin di area tersebut. Sistem bertekanan tinggi (biasanya \(\geq 1{,}020\ \text{hPa}\)) identik dengan cuaca cerah dan angin lemah, sedangkan sistem tekanan rendah berasosiasi dengan awan tebal dan hujan. Memahami distribusi MSL adalah kunci untuk membaca peta cuaca dan menginterpretasikan dinamika monsun Asia-Australia yang sangat memengaruhi iklim Indonesia.
Mengenal Reanalisis ERA5 dan Variabel MSL
ERA5 adalah reanalisis generasi kelima dari ECMWF yang mencakup data global sejak Januari 1940 hingga kini. Data diperbarui harian dengan latensi sekitar lima hari. Yang membedakan ERA5 dari produk serupa adalah metode asimilasi datanya: 4D-Var dengan model IFS CY41R2, yang mengintegrasikan jutaan observasi — balon radiosonde, satelit, pelampung laut, dan pesawat — ke dalam model fisika atmosfer yang konsisten.
Secara teknis, ERA5 tersedia pada grid \(0{,}25°\ \times\ 0{,}25°\) (sekitar 31 km) dengan lebih dari 200 variabel atmosfer dan permukaan. Variabel yang kita gunakan dalam tutorial ini adalah msl — mean sea level pressure — dengan satuan Pascal (Pa). Untuk interpretasi meteorologi standar, nilainya perlu dikonversi ke hPa dengan membagi 100.
File yang kita gunakan sudah tersedia lokal di /data/era5/era5_msl_indonesia_2024_6h.nc, mencakup domain Indonesia [6N, 95E, -11S, 141E] sepanjang tahun 2024 dengan interval 6 jam. Tidak perlu registrasi CDS atau instalasi cdsapi — data siap pakai langsung dari cache.
Memuat dan Memeriksa Data ERA5 MSL
Kita mulai dengan membuka file NetCDF menggunakan xarray dan memeriksa struktur dataset: dimensi, koordinat, dan atribut variabel. Langkah ini penting sebelum analisis apa pun — kita perlu tahu nama dimensi waktu (kadang valid_time, kadang time), rentang koordinat lat/lon, dan satuan variabel.
import xarray as xr
import numpy as np
# Buka file cached — tidak perlu cdsapi
ds = xr.open_dataset("/data/era5/era5_msl_indonesia_2024_6h.nc")
print("=== Dataset ERA5 MSL ===")
print(ds)
# Cek nama dimensi waktu yang tersedia
time_dim = "valid_time" if "valid_time" in ds.dims else "time"
print(f"\nDimensi waktu: {time_dim}")
print(f"Jumlah timestep: {ds.dims[time_dim]}")
# Rentang waktu
t_coords = ds[time_dim].values
print(f"Awal: {t_coords[0]}")
print(f"Akhir: {t_coords[-1]}")
# Variabel dan atributnya
msl = ds["msl"]
print(f"\nVariabel MSL — shape: {msl.shape}")
print(f"Satuan: {msl.attrs.get('units', 'tidak tercatat')}")
print(f"Long name: {msl.attrs.get('long_name', '-')}")
# Contoh slice: nilai MSL (Pa) untuk beberapa koordinat pertama
sample = msl.isel(**{time_dim: 0})
print(f"\nSlice t=0, lat range: [{float(ds.latitude.min()):.2f}, {float(ds.latitude.max()):.2f}]")
print(f"Slice t=0, lon range: [{float(ds.longitude.min()):.2f}, {float(ds.longitude.max()):.2f}]")
print(f"Nilai MSL t=0 (Pa): min={float(sample.min()):.1f}, max={float(sample.max()):.1f}, mean={float(sample.mean()):.1f}")
=== Dataset ERA5 MSL ===
<xarray.Dataset> Size: 75MB
Dimensions: (valid_time: 1464, latitude: 69, longitude: 185)
Coordinates:
* valid_time (valid_time) datetime64[ns] 12kB 2024-01-01 ... 2024-12-31T18...
expver (valid_time) <U4 23kB ...
* latitude (latitude) float64 552B 6.0 5.75 5.5 5.25 ... -10.5 -10.75 -11.0
* longitude (longitude) float64 1kB 95.0 95.25 95.5 ... 140.5 140.8 141.0
number int64 8B ...
Data variables:
msl (valid_time, latitude, longitude) float32 75MB ...
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-10T03:54 GRIB to CDM+CF via cfgrib-0.9.1...
Dimensi waktu: valid_time
Jumlah timestep: 1464
Awal: 2024-01-01T00:00:00.000000000
Akhir: 2024-12-31T18:00:00.000000000
Variabel MSL — shape: (1464, 69, 185)
Satuan: Pa
Long name: Mean sea level pressure
Slice t=0, lat range: [-11.00, 6.00]
Slice t=0, lon range: [95.00, 141.00]
Nilai MSL t=0 (Pa): min=100936.0, max=102060.0, mean=101120.6
Output di atas memperlihatkan dimensi dataset dan rentang nilai MSL dalam Pa. Perhatikan bahwa nilai sekitar 100.000–102.000 Pa setara dengan 1.000–1.020 hPa — angka yang wajar untuk kawasan tropis. Di sini kita juga menyimpan variabel ds, msl, dan time_dim sebagai globals notebook yang akan digunakan oleh snippet berikutnya.
Statistik Tekanan Permukaan di Indonesia Tahun 2024
Setelah verifikasi struktur data, kita lanjutkan ke analisis statistik. Snippet ini mengonversi MSL dari Pa ke hPa, lalu menghitung rata-rata domain bulanan sepanjang 2024. Pola musiman akan muncul: tekanan cenderung lebih rendah saat ITCZ aktif di atas wilayah Indonesia (umumnya November–Maret), dan sedikit lebih tinggi saat puncak musim kemarau (Juli–Agustus).
Tekanan standar permukaan laut adalah \(1{,}013{,}25\ \text{hPa}\). Sistem bertekanan tinggi yang sering mempengaruhi Indonesia dari selatan (high Australia) dapat mendorong nilai domain mean mendekati \(1{,}015\ \text{hPa}\) atau lebih, sementara saat monsun barat aktif nilai domain mean bisa turun ke sekitar \(1{,}009\text{–}1{,}011\ \text{hPa}\).
import pandas as pd
# Konversi Pa → hPa
msl_hpa = msl / 100.0
# Statistik domain keseluruhan 2024
print("=== Statistik Domain Keseluruhan 2024 ===")
print(f"Mean MSL: {float(msl_hpa.mean()):.3f} hPa")
print(f"Min MSL : {float(msl_hpa.min()):.3f} hPa")
print(f"Max MSL : {float(msl_hpa.max()):.3f} hPa")
# Rata-rata domain bulanan
# Buat series bulanan dengan groupby pada dimensi waktu
t_coords = ds[time_dim].values
# Konversi ke pandas Timestamp agar groupby bulan mudah
t_index = pd.DatetimeIndex(t_coords)
months = t_index.month
monthly_means = {}
monthly_mins = {}
monthly_maxs = {}
for m in range(1, 13):
mask = months == m
if mask.sum() == 0:
continue
subset = msl_hpa.isel(**{time_dim: mask})
monthly_means[m] = float(subset.mean())
monthly_mins[m] = float(subset.min())
monthly_maxs[m] = float(subset.max())
month_names = ["Jan","Feb","Mar","Apr","Mei","Jun",
"Jul","Agt","Sep","Okt","Nov","Des"]
df = pd.DataFrame({
"Bulan": [month_names[m-1] for m in monthly_means.keys()],
"Mean (hPa)": [f"{v:.3f}" for v in monthly_means.values()],
"Min (hPa)": [f"{v:.3f}" for v in monthly_mins.values()],
"Max (hPa)": [f"{v:.3f}" for v in monthly_maxs.values()],
})
df.index = list(monthly_means.keys())
df.index.name = "Bln"
print("\n=== Statistik Bulanan MSL (hPa) ===")
print(df.to_string())
=== Statistik Domain Keseluruhan 2024 ===
Mean MSL: 1010.145 hPa
Min MSL : 998.804 hPa
Max MSL : 1024.464 hPa
=== Statistik Bulanan MSL (hPa) ===
Bulan Mean (hPa) Min (hPa) Max (hPa)
Bln
1 Jan 1010.281 1000.414 1022.977
2 Feb 1011.335 1003.281 1023.496
3 Mar 1010.472 999.992 1024.464
4 Apr 1009.301 1003.250 1022.324
5 Mei 1009.536 1002.482 1022.443
6 Jun 1010.955 1005.416 1023.788
7 Jul 1010.802 1003.964 1022.919
8 Agt 1011.186 1004.751 1022.778
9 Sep 1010.217 1002.064 1023.141
10 Okt 1010.285 1003.549 1022.864
11 Nov 1009.024 998.804 1022.285
12 Des 1008.392 999.931 1022.694
Tabel bulanan ini menunjukkan pola musiman MSL di domain Indonesia. Bulan-bulan dengan nilai mean rendah berasosiasi dengan aktivitas ITCZ dan monsun barat yang kuat — periode di mana curah hujan di sebagian besar Jawa, Kalimantan, dan Sulawesi cenderung tinggi. Nilai max per bulan mencerminkan pengaruh sistem tekanan tinggi Australia yang sesekali menembus ke utara ekuator, terutama di musim kemarau.
Pola Spasial dan Identifikasi Sistem Tekanan
Statistik domain memberikan gambaran rata-rata, tetapi distribusi spasial MSL jauh lebih informatif untuk analisis sinoptik. Pada satu snapshot waktu, kita bisa melihat di mana posisi trough (palung tekanan rendah) dan ridge (punggungan tekanan tinggi), yang berhubungan langsung dengan pola angin dan curah hujan.
Kita pilih satu timestamp di bulan Agustus 2024 — puncak musim kemarau sekaligus periode aktif Southeast Monsoon. Pada periode ini, tekanan tinggi Australia biasanya cukup kuat dan mendorong aliran angin tenggara ke wilayah Indonesia bagian selatan. Di saat bersamaan, ITCZ masih aktif di utara ekuator, menciptakan gradien tekanan yang menarik.
Profil tekanan meridional Agustus: ITCZ bertekanan rendah di utara, ridge ekuatorial Papua di tengah domain, dan Australian High di selatan bbox.
# Pilih snapshot: 2024-08-15 12:00 UTC menggunakan sel(method="nearest")
snapshot = msl_hpa.sel(**{time_dim: "2024-08-15T12:00"}, method="nearest")
snap_time = snapshot[time_dim].values
print(f"Snapshot: {snap_time}")
print(f"\n=== Statistik Spasial (hPa) ===")
print(f"Mean : {float(snapshot.mean()):.3f}")
print(f"Min : {float(snapshot.min()):.3f}")
print(f"Max : {float(snapshot.max()):.3f}")
print(f"Std : {float(snapshot.std()):.3f}")
# Lokasi minimum (low pressure system)
flat_min = int(np.argmin(snapshot.values))
min_idx = np.unravel_index(flat_min, snapshot.shape)
lat_min = float(snapshot.latitude.values[min_idx[0]])
lon_min = float(snapshot.longitude.values[min_idx[1]])
val_min = float(snapshot.values[min_idx])
# Lokasi maksimum (high pressure system)
flat_max = int(np.argmax(snapshot.values))
max_idx = np.unravel_index(flat_max, snapshot.shape)
lat_max = float(snapshot.latitude.values[max_idx[0]])
lon_max = float(snapshot.longitude.values[max_idx[1]])
val_max = float(snapshot.values[max_idx])
print(f"\n=== Sistem Tekanan Rendah ===")
print(f"Nilai : {val_min:.2f} hPa")
print(f"Lokasi : {lat_min:.2f}°, {lon_min:.2f}°")
print(f"\n=== Sistem Tekanan Tinggi ===")
print(f"Nilai : {val_max:.2f} hPa")
print(f"Lokasi : {lat_max:.2f}°, {lon_max:.2f}°")
grad = val_max - val_min
print(f"\nGradien tekanan domain: {grad:.2f} hPa")
Snapshot: 2024-08-15T12:00:00.000000000
=== Statistik Spasial (hPa) ===
Mean : 1009.932
Min : 1006.731
Max : 1020.403
Std : 1.619
=== Sistem Tekanan Rendah ===
Nilai : 1006.73 hPa
Lokasi : 6.00°, 95.00°
=== Sistem Tekanan Tinggi ===
Nilai : 1020.40 hPa
Lokasi : -4.00°, 137.25°
Gradien tekanan domain: 13.67 hPa
Hasil di atas memperlihatkan bahwa nilai maksimum domain (~1020,4 hPa) berada di sekitar -4°S, 137°E — ini bukan Australian High itu sendiri, melainkan sebuah ridge dalam domain di atas Papua ekuatorial; Australian High yang sebenarnya berpusat di sekitar 30–35°S, di luar batas selatan bbox (-11°S) yang kita gunakan. Pengaruh High Australia terhadap Indonesia terlihat secara tidak langsung melalui aliran angin tenggara yang memasuki domain dari batas selatan. Sebaliknya, minimum domain (~1006,7 hPa) di 6°N, 95°E konsisten dengan posisi ITCZ boreal summer yang saat Agustus bergeser ke utara ekuator.
Perlu dicatat bahwa di daerah tropis, interpretasi MSL berbeda dari lintang tengah. Efek Coriolis yang lemah berarti angin tidak berputar rapi mengikuti isobar seperti di ekstratropis. Karena itu, meteorolog tropis lebih sering menggunakan streamline (garis aliran) daripada isobar untuk analisis angin, meski MSL tetap dipakai untuk identifikasi sistem.
Langkah Selanjutnya dan Kombinasi dengan Variabel Lain
Dari tutorial ini kita telah menguasai tiga langkah dasar analisis MSL dengan ERA5: membuka dan memverifikasi file NetCDF, menghitung statistik bulanan untuk melihat siklus musiman, dan mengekstrak pola spasial pada satu snapshot untuk identifikasi sistem tekanan.
Langkah natural berikutnya adalah menggabungkan MSL dengan variabel lain dari cache ERA5 yang sama:
- Angin permukaan (u10, v10): hitung kecepatan dan arah angin, plot streamline untuk melihat pola konvergensi di sekitar trough.
- Curah hujan (tp): overlay MSL dan total precipitation — area tekanan rendah biasanya berkorespondensi dengan akumulasi hujan tinggi.
- Animasi time series: loop over timestep dan render peta MSL bergerak untuk melihat migrasi ITCZ dan pergeseran palung monsun sepanjang tahun.
Seluruh variabel tersebut tersedia di direktori /data/era5/ dengan format dan konvensi koordinat yang sama — bisa langsung dibuka dengan pola yang sama di snippet-1.
Alur analisis dari loading data ERA5 MSL hingga interpretasi sinoptik.
Eksplorasi artikel meteorologi lainnya di meteo.my.id (https://meteo.my.id) — termasuk tutorial analisis angin permukaan, geopotential 500 hPa, dan komputasi indeks stabilitas dari data pressure-level ERA5.
Referensi
- ERA5: data documentation — Dokumentasi teknis resmi ERA5 dari ECMWF, mencakup variabel, resolusi, metode asimilasi 4D-Var, dan format data.
- Climate reanalysis | Copernicus — Penjelasan umum tentang reanalisis ERA5 dari Copernicus Climate Change Service, termasuk cakupan temporal dan resolusi spasial.
- The art of the chart: how to read a weather map — Panduan BOM Australia untuk membaca peta sinoptik, termasuk interpretasi isobar, sistem tekanan tinggi/rendah, dan palung monsun.
- The Intertropical Convergence Zone — Penjelasan NASA Earth Observatory tentang ITCZ, mekanisme konvergensi angin pasat, dan dampaknya terhadap curah hujan tropis.
- Annual Migration of the Tropical Rain Belt — Artikel NOAA Climate.gov tentang migrasi musiman sabuk hujan tropis dan kaitannya dengan onset monsun Asia Tenggara.
Tidak ada komentar:
Posting Komentar