Jumat, 29 Mei 2026
Memahami Siklus Diurnal Curah Hujan Tropis
Jika kamu pernah memperhatikan bahwa hujan di Jakarta cenderung turun menjelang sore, atau bahwa perairan Selat Karimata justru lebih aktif konvektif dini hari, kamu sudah mengamati siklus diurnal — salah satu sinyal cuaca paling konsisten dan paling sulit direproduksi oleh NWP.
Secara global, pola ini cukup sistematis. Daratan tropis mengalami puncak curah hujan antara pukul 14–18 LST (Local Solar Time), didorong oleh pemanasan permukaan yang membangun ketidakstabilan konvektif sepanjang siang. Laut tropis punya ritme yang berbeda: puncaknya antara pukul 02–06 LST, ketika pendinginan radiatif di puncak awan pada malam hari meningkatkan ketidakstabilan di lapisan atas.
Di Indonesia, pola itu lebih kompleks. Pesisir Jawa cenderung puncak 14–16 LST, interior Jawa 16–19 LST, dan perairan sekitarnya 02–06 LST. Sumatera punya pola migrasi tersendiri — sinyal hujan bergerak dari pantai ke pedalaman pada sore hari, lalu menjalar ke laut lepas tengah malam.

Sumber: NASA GPM / IMERG — peta global perbedaan fase diurnal curah hujan, biru = puncak sore (daratan), merah = puncak dini hari (lautan) (halaman sumber)
Masalahnya: model NWP secara konsisten meleset di sini. ECMWF IFS, GFS, dan WRF regional umumnya men-trigger konveksi terlalu awal — selisih fase antara 1 sampai 3 jam. Studi WRF operasional untuk Pulau Jawa (sistem SADEWA, LAPAN/BRIN) mengkonfirmasi hal ini: fase diurnal model WRF mendahului observasi GSMaP sekitar dua jam. Error ini kecil dalam satuan jam, tapi berdampak nyata pada forecast hujan lebat untuk sektor pertanian, transportasi udara, dan peringatan dini banjir.
Tutorial ini menunjukkan cara mengekstrak siklus diurnal dari data ERA5 dengan dekomposisi harmonik FFT. Kita akan memvisualisasikan fase regional dan menghitung phase error model — metodologi dasar yang dipakai dalam evaluasi NWP operasional.
Persiapan Data dan Pengaturan Environment
Kita butuh data curah hujan ERA5 6-hourly untuk Indonesia sepanjang tahun 2024. Resolusi 6-jam cukup untuk menangkap puncak diurnal — ada 4 snapshot per hari, yang setelah di-composite sepanjang tahun menghasilkan sinyal diurnal yang bersih.
Snippet berikut men-download file via cdsapi (hanya dijalankan sekali, hasilnya disimpan lokal) lalu membuka dataset dengan xarray untuk inspeksi awal.
import os
import cdsapi
import xarray as xr
import numpy as np
OUT = "era5_tp_indonesia_2024_6h.nc"
if not os.path.exists(OUT):
c = cdsapi.Client(quiet=True)
c.retrieve(
"reanalysis-era5-single-levels",
{
"product_type": "reanalysis",
"variable": ["total_precipitation"],
"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", "06:00", "12:00", "18:00"],
"area": [6, 95, -11, 141], # N, W, S, E — Indonesia
"format": "netcdf",
},
OUT,
)
ds = xr.open_dataset(OUT)
print("=== Dataset ERA5 Total Precipitation ===")
print(ds)
print()
print("Dimensions :", dict(ds.dims))
print("Variables :", list(ds.data_vars))
tp = ds["tp"]
print()
print("Variable :", tp.name)
print("Units :", tp.attrs.get("units", "—"))
print("Long name :", tp.attrs.get("long_name", "—"))
print("Shape :", tp.shape)
# Verifikasi waktu — 4 snapshot per hari × 366 hari = 1464 langkah
time_vals = ds.coords["valid_time"].values if "valid_time" in ds.coords else ds.coords["time"].values
print()
print("Time range :", str(time_vals[0])[:16], "→", str(time_vals[-1])[:16])
print("Time steps :", len(time_vals), "(expect ~1464 for 6-hourly 2024)")
print("UTC hours :", sorted(set(int(str(t)[11:13]) for t in time_vals.astype("datetime64[h]").astype(str))))
=== Dataset ERA5 Total Precipitation ===
<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:
tp (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:57 GRIB to CDM+CF via cfgrib-0.9.1...
Dimensions : {'valid_time': 1464, 'latitude': 69, 'longitude': 185}
Variables : ['tp']
Variable : tp
Units : m
Long name : Total precipitation
Shape : (1464, 69, 185)
Time range : 2024-01-01T00:00 → 2024-12-31T18:00
Time steps : 1464 (expect ~1464 for 6-hourly 2024)
UTC hours : [0, 6, 12, 18]
ERA5 menyimpan tp (total precipitation) dalam satuan meter per akumulasi interval — jadi kita perlu kalikan \(10^3\) untuk konversi ke mm. Koordinat waktu dalam UTC; untuk analisis fase diurnal di Indonesia (WIB = UTC+7, WITA = UTC+8, WIT = UTC+9) kita shift nanti saat menghitung LST per region.
Ekstraksi dan Analisis Siklus Diurnal
Metode standar untuk mengekstrak siklus diurnal adalah dekomposisi harmonik Fourier. Ide dasarnya: dari seluruh time series panjang 1464 langkah, kita bentuk diurnal composite — rata-rata tiap slot jam UTC (00, 06, 12, 18) di semua hari — lalu jalankan FFT pada composite 4-elemen itu. Harmonik pertama (frekuensi 1/24 jam\(^{-1}\)) memberi kita amplitudo dan fase dari siklus diurnal.
Untuk hasil yang informatif, kita bagi domain Indonesia menjadi tiga zona:
- Java Pesisir — kotak kecil di utara Jawa (lat −6 s.d. −7, lon 106–110), mewakili daerah urban-pesisir dengan puncak sore awal
- Java Interior — dataran tinggi Jawa tengah (lat −7 s.d. −8, lon 110–112), puncak sore lebih lambat karena efek orografi
- Laut Jawa — perairan utara Jawa (lat −4 s.d. −5, lon 108–115), puncak dini hari
Fase yang dihitung FFT awalnya dalam UTC, lalu kita konversi ke LST dengan menambahkan offset WIB (+7 jam).
import numpy as np
import xarray as xr
ds = xr.open_dataset("era5_tp_indonesia_2024_6h.nc")
tp = ds["tp"] * 1000.0 # m → mm
# Gunakan "valid_time" jika tersedia, fallback ke "time"
time_coord = "valid_time" if "valid_time" in ds.coords else "time"
times = ds.coords[time_coord].values.astype("datetime64[h]")
hours_utc = np.array([int(str(t)[11:13]) for t in times.astype(str)])
# Tiga zona regional
# ERA5 latitude is stored high→low (6.0 → -11.0), so slice(a, b) dengan a > b
zones = {
"Java Pesisir": dict(lat=slice(-6, -7), lon=slice(106, 110)),
"Java Interior": dict(lat=slice(-7, -8), lon=slice(110, 112)),
"Laut Jawa": dict(lat=slice(-4, -5), lon=slice(108, 115)),
}
UTC_OFFSET_WIB = 7 # WIB = UTC+7
def diurnal_harmonic(tp_region):
"""
tp_region: DataArray dengan dimensi time (dan opsional lat/lon).
Kembalikan: (amplitude_mm, phase_utc_hour).
"""
tp_mean = tp_region.mean(dim=[d for d in tp_region.dims if d != time_coord])
tp_arr = tp_mean.values.astype(float)
# Buat diurnal composite (4 slot: 00, 06, 12, 18 UTC)
slots = [0, 6, 12, 18]
composite = np.array([tp_arr[hours_utc == h].mean() for h in slots])
# FFT pada composite (N=4)
fft_c = np.fft.fft(composite)
# Harmonik pertama = index 1 (frekuensi 1 siklus per hari)
amp = 2.0 * np.abs(fft_c[1]) / len(composite) # mm
# Fase: sudut harmonik → jam puncak UTC
phase_rad = np.angle(fft_c[1])
phase_utc = (-phase_rad / (2 * np.pi)) * 24.0 % 24.0
return amp, phase_utc, composite
print(f"{'Zona':<18} {'Amplitudo':>12} {'Puncak UTC':>12} {'Puncak LST (WIB)':>18}")
print("-" * 65)
for zone_name, sel in zones.items():
try:
subset = tp.sel(latitude=sel["lat"], longitude=sel["lon"], method=None)
except Exception:
# Fallback jika koordinat bernama "lat"/"lon"
subset = tp.sel(lat=sel["lat"], lon=sel["lon"])
amp, phase_utc, composite = diurnal_harmonic(subset)
phase_lst = (phase_utc + UTC_OFFSET_WIB) % 24.0
print(f"{zone_name:<18} {amp:>10.4f} mm {phase_utc:>10.1f} jam {phase_lst:>14.1f} jam LST")
print()
print("Catatan: amplitudo = kekuatan harmonic diurnal (mm/akumulasi 6-jam)")
print(" fase LST = perkiraan jam puncak curah hujan dalam waktu lokal")
Zona Amplitudo Puncak UTC Puncak LST (WIB)
-----------------------------------------------------------------
Java Pesisir 0.1284 mm 7.2 jam 14.2 jam LST
Java Interior 0.2775 mm 6.5 jam 13.5 jam LST
Laut Jawa 0.1450 mm 21.5 jam 4.5 jam LST
Catatan: amplitudo = kekuatan harmonic diurnal (mm/akumulasi 6-jam)
fase LST = perkiraan jam puncak curah hujan dalam waktu lokal
Hasil ini bisa langsung dibandingkan dengan referensi literatur. Pesisir Jawa diharapkan puncak 14–16 LST, interior Jawa 16–19 LST, dan Laut Jawa 02–06 LST. Jika angka output snippet berbeda beberapa jam, perlu dicek apakah domain spatial-nya menangkap area yang representatif — ERA5 dengan resolusi 0,25° masih cukup kasar untuk membedakan "pesisir utara" vs "dataran tinggi".
Visualisasi Fase Diurnal Lokal
Angka amplitudo dan fase dari snippet sebelumnya sudah informatif, tapi lebih mudah dibaca dalam bentuk kurva diurnal per zona. Snippet berikut mengambil composite 4-jam (00, 06, 12, 18 UTC) yang kita hitung sebelumnya, menginterpolasi ke resolusi 1 jam untuk tampilan lebih halus, dan menyimpan grafik ke file.
import numpy as np
import xarray as xr
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
ds = xr.open_dataset("era5_tp_indonesia_2024_6h.nc")
tp = ds["tp"] * 1000.0 # m → mm
time_coord = "valid_time" if "valid_time" in ds.coords else "time"
times = ds.coords[time_coord].values.astype("datetime64[h]")
hours_utc = np.array([int(str(t)[11:13]) for t in times.astype(str)])
zones = {
"Java Pesisir": dict(lat=slice(-6, -7), lon=slice(106, 110)),
"Java Interior": dict(lat=slice(-7, -8), lon=slice(110, 112)),
"Laut Jawa": dict(lat=slice(-4, -5), lon=slice(108, 115)),
}
UTC_OFFSET_WIB = 7
slots_utc = np.array([0, 6, 12, 18])
slots_lst = (slots_utc + UTC_OFFSET_WIB) % 24
colors = {"Java Pesisir": "#e07b39", "Java Interior": "#c0392b", "Laut Jawa": "#2980b9"}
markers = {"Java Pesisir": "o", "Java Interior": "s", "Laut Jawa": "^"}
fig, ax = plt.subplots(figsize=(11, 5))
for zone_name, sel in zones.items():
try:
subset = tp.sel(latitude=sel["lat"], longitude=sel["lon"], method=None)
except Exception:
subset = tp.sel(lat=sel["lat"], lon=sel["lon"])
tp_mean = subset.mean(dim=[d for d in subset.dims if d != time_coord])
tp_arr = tp_mean.values.astype(float)
composite = np.array([tp_arr[hours_utc == h].mean() for h in [0, 6, 12, 18]])
# Interpolasi kubik ke 1-jam menggunakan harmonik pertama
fft_c = np.fft.fft(composite)
hours_fine = np.linspace(0, 24, 97)[:-1] # 0..23.75 LST
# Rekonstruksi dari harmonik 0 dan 1 saja (DC + diurnal)
N = len(composite)
smooth = np.zeros(len(hours_fine))
for k in range(2):
amp_k = np.abs(fft_c[k]) / N
pha_k = np.angle(fft_c[k])
# Konversi frekuensi dari slot (N=4) ke jam
freq_k = k / 24.0
smooth += 2 * amp_k * np.cos(2 * np.pi * freq_k * hours_fine + pha_k) if k > 0 else amp_k * np.ones(len(hours_fine))
# Shift UTC → LST
hours_lst_fine = (hours_fine + UTC_OFFSET_WIB) % 24
# Sort agar plot tidak terlipat
order = np.argsort(hours_lst_fine)
ax.plot(hours_lst_fine[order], smooth[order],
color=colors[zone_name], linewidth=2.2, label=zone_name)
for h_utc, h_lst, val in zip(slots_utc, slots_lst, composite):
ax.scatter(h_lst, val, color=colors[zone_name],
marker=markers[zone_name], s=60, zorder=5)
ax.set_xlabel("Waktu Lokal / LST (WIB, jam)", fontsize=11)
ax.set_ylabel("Curah Hujan (mm / akumulasi 6-jam)", fontsize=11)
ax.set_title("Siklus Diurnal ERA5 2024 — Tiga Zona di Indonesia", fontsize=13, weight="bold")
ax.set_xlim(0, 24)
ax.set_xticks(range(0, 25, 3))
ax.set_xticklabels([f"{h:02d}:00" for h in range(0, 25, 3)], rotation=30, ha="right")
ax.axvspan(14, 19, alpha=0.08, color="orange", label="Sore hari (14–19 LST)")
ax.axvspan(2, 6, alpha=0.08, color="steelblue", label="Dini hari (02–06 LST)")
ax.legend(fontsize=10, loc="upper left")
ax.grid(axis="y", linestyle="--", alpha=0.4)
plt.tight_layout()
plt.savefig("diurnal_cycle_zones.png", dpi=150, bbox_inches="tight")
print("Plot disimpan: diurnal_cycle_zones.png")
Grafik di atas memperlihatkan kontras yang menjadi landasan analisis siklus diurnal di Indonesia. Zona daratan (Java Pesisir dan Interior) menunjukkan puncak pada sore hari — dipicu pemanasan matahari yang membangun energi konvektif sepanjang siang. Laut Jawa menunjukkan puncak dini hari yang konsisten dengan pola pendinginan radiatif nokturnal dan konvergensi angin darat dari Jawa.
Mekanisme dua fase siklus diurnal: daratan → offshore propagation → laut.
Perbandingan dengan Prediksi Model
Mengetahui fase ERA5 baru separuh pekerjaan. Yang lebih berguna secara operasional adalah mengukur seberapa jauh model NWP meleset dari fase yang "benar" itu — inilah yang disebut phase error.
Dari literatur, karakterisasi error model NWP untuk siklus diurnal cukup konsisten:
- ECMWF IFS secara historis men-trigger konveksi terlalu awal atas daratan tropis, dengan phase error 1–3 jam. IFS Cycle 40r1 memperbaiki ini secara signifikan; Cycle 50r1 (2024) memindahkan sebagian konveksi dalam ke skema cloud eksplisit. Namun model output fase tetap lebih awal dari observasi di banyak grid tropis.
- GFS (NCEP) menunjukkan wet bias — secara umum menghasilkan curah hujan lebih banyak dari observasi TMPA. Selain itu, instantaneous precipitation rate GFS punya perilaku multimodal karena timing deficiency dalam cumulus parameterization; akumulasi 6-jam lebih stabil untuk validasi.
- WRF regional (SADEWA, LAPAN/BRIN): fase diurnal model mendahului fase observasi GSMaP sekitar dua jam, dan amplitudo diurnal lebih besar dari observasi — konsisten dengan over-triggering yang sama.
Snippet berikut mendemonstrasikan cara menghitung phase error: kita simulasikan model forecast dengan menggeser fase ERA5 sebesar 2 jam (seperti bias WRF), lalu hitung perbedaan fase antar keduanya.
import numpy as np
import xarray as xr
ds = xr.open_dataset("era5_tp_indonesia_2024_6h.nc")
tp = ds["tp"] * 1000.0
time_coord = "valid_time" if "valid_time" in ds.coords else "time"
times = ds.coords[time_coord].values.astype("datetime64[h]")
hours_utc = np.array([int(str(t)[11:13]) for t in times.astype(str)])
# Zona Java Pesisir sebagai contoh
try:
subset = tp.sel(latitude=slice(-6, -7), longitude=slice(106, 110), method=None)
except Exception:
subset = tp.sel(lat=slice(-6, -7), lon=slice(106, 110))
tp_mean = subset.mean(dim=[d for d in subset.dims if d != time_coord])
tp_arr = tp_mean.values.astype(float)
slots = [0, 6, 12, 18]
composite_obs = np.array([tp_arr[hours_utc == h].mean() for h in slots])
# --- FFT harmonik diurnal dari ERA5 (observasi proxy) ---
def fft_phase_utc(composite):
"""Kembalikan jam puncak UTC dari harmonik pertama FFT (N=4 slot)."""
fft_c = np.fft.fft(composite)
phase_rad = np.angle(fft_c[1])
return (-phase_rad / (2 * np.pi)) * 24.0 % 24.0
phase_obs_utc = fft_phase_utc(composite_obs)
phase_obs_lst = (phase_obs_utc + 7) % 24 # WIB
# --- Simulasi model: geser fase +2 jam (model trigger terlalu awal, WRF-like) ---
MODEL_LEAD_HOURS = 2.0 # model prediksi lebih awal dari observasi
phase_model_lst = (phase_obs_lst - MODEL_LEAD_HOURS) % 24
# Phase error = selisih fase, dikoreksi untuk ambiguitas 12-jam
phase_error = phase_model_lst - phase_obs_lst
if phase_error > 12:
phase_error -= 24
elif phase_error < -12:
phase_error += 24
print("=== Validasi Fase Diurnal — Java Pesisir ===")
print()
print(f"Fase ERA5 (observasi proxy) : {phase_obs_lst:5.1f} LST")
print(f"Fase model (simulasi WRF) : {phase_model_lst:5.1f} LST")
print(f"Phase error : {phase_error:+.1f} jam")
print()
print("Interpretasi:")
if phase_error < 0:
print(f" Model men-trigger konveksi {abs(phase_error):.1f} jam LEBIH AWAL dari observasi.")
print(" Ini konsisten dengan over-triggering convection yang terdokumentasi")
print(" dalam studi WRF/SADEWA (LAPAN/BRIN) dan ECMWF Science Blog.")
elif phase_error > 0:
print(f" Model men-trigger konveksi {abs(phase_error):.1f} jam LEBIH LAMBAT dari observasi.")
else:
print(" Fase model dan observasi tepat sama — tidak ada phase error.")
print()
print("Catatan: Untuk validasi NWP nyata, gunakan output model (GFS/WRF)")
print(" sebagai 'composite_model' menggantikan simulasi di atas.")
print(" Metode FFT dan formula phase_error tetap sama persis.")
=== Validasi Fase Diurnal — Java Pesisir ===
Fase ERA5 (observasi proxy) : 14.2 LST
Fase model (simulasi WRF) : 12.2 LST
Phase error : -2.0 jam
Interpretasi:
Model men-trigger konveksi 2.0 jam LEBIH AWAL dari observasi.
Ini konsisten dengan over-triggering convection yang terdokumentasi
dalam studi WRF/SADEWA (LAPAN/BRIN) dan ECMWF Science Blog.
Catatan: Untuk validasi NWP nyata, gunakan output model (GFS/WRF)
sebagai 'composite_model' menggantikan simulasi di atas.
Metode FFT dan formula phase_error tetap sama persis.
Nilai phase error yang keluar dari snippet ini cocok dengan apa yang ada di literatur. Phase error negatif (model terlalu awal) adalah bias sistematis yang paling umum di model NWP tropis. Untuk produksi operasional, langkah berikutnya adalah menerapkan koreksi fase berbasis statistik — misalnya dengan menggeser forecast precipitation time series sesuai rata-rata phase error historis per musim.
Langkah Selanjutnya dan Aplikasi Praktis
Kita sudah menutup loop dasar: download ERA5, bentuk diurnal composite, ekstrak fase dan amplitudo via FFT, visualisasi regional, lalu hitung phase error relatif terhadap output model. Ini adalah toolkit minimal untuk evaluasi NWP diurnal cycle.
Beberapa arah ekstensi yang natural:
Analisis musiman. Siklus diurnal di Indonesia berubah antar musim — fase dan amplitudo berbeda antara Desember–Februari (monsun Australia, hujan lebat di selatan) versus Juni–Agustus (musim kering relatif di Jawa). Replikasi snippet di atas per bulan atau per musim menghasilkan gambaran seasonal variability yang berguna untuk evaluasi NWP multi-season.
Validasi terhadap GFS atau WRF output riil. Ganti composite_obs dengan composite_model yang dihitung dari file output model (GRIB atau NetCDF) menggunakan xarray/cfgrib. Phase error yang dihasilkan menjadi metrik evaluasi kuantitatif yang bisa dilaporkan.
Indeks konvektif sebagai prediktor. CAPE dan CIN dari ERA5 pressure-level data bisa diplot sebagai diurnal composite di zona yang sama — kita lihat apakah puncak CAPE mendahului puncak curah hujan dan berapa jam lead-nya. Analisis ini membantu menjelaskan mekanisme fisik di balik phase error model.
Wavelet vs FFT. FFT bekerja baik untuk sinyal stasioner. Untuk analisis siklus diurnal yang bervariasi antar bulan, wavelet continuous transform (scipy.signal.cwt) memberikan resolusi waktu-frekuensi yang lebih informatif.
Untuk replikasi analysis di atas dari awal, pastikan kamu sudah punya akun di cds.climate.copernicus.eu dan file ~/.cdsapirc yang valid. Download ERA5 satu kali lewat snippet-1, dan semua snippet berikutnya bisa dijalankan offline dari file lokal.
Eksplorasi artikel meteorologi lainnya di meteo.my.id: https://meteo.my.id Tutorial terkait yang bisa dilanjutkan: analisis CAPE dan CIN, pemetaan cuaca dengan Cartopy, dan evaluasi model GFS untuk Indonesia.
Referensi
- Natural Cycles in Global Precipitation — NASA GPM — penjelasan NASA GPM/IMERG tentang siklus diurnal dan tahunan curah hujan global, dengan peta fase daratan (sore) vs lautan (dini hari) dari 28 tahun data TRMM+GPM.
- A global survey of diurnal offshore propagation of rainfall — Nature Communications, 2022 (PMC) — studi 102 garis pantai global yang mengkuantifikasi propagasi offshore sinyal diurnal; Maritime Continent menunjukkan pola dua-fase year-round dengan gravity wave propagation >100 km.
- Modelling convective precipitation: progress and challenges — ECMWF Science Blog, 2019 — analisis ECMWF tentang phase bias konveksi di model NWP (trigger terlalu awal, phase error 1–3 jam) dan perbaikan yang dicapai melalui revisi convective closure scheme.
- Statistical properties of global precipitation in NCEP GFS and TMPA observations — PMC, 2020 — perbandingan 10-tahun model GFS vs observasi TMPA; mendokumentasikan wet bias GFS dan timing deficiency pada cumulus parameterization untuk wilayah tropis.
- Prediktibilitas Curah Hujan Diurnal di Pulau Jawa Menggunakan Model WRF — Jurnal Sains Dirgantara LAPAN/BRIN, 2017 — evaluasi sistem SADEWA (WRF operasional LAPAN) terhadap GSMaP selama satu tahun; mendokumentasikan phase lead WRF ~2 jam dan amplitudo diurnal yang overestimated atas Pulau Jawa.