A fully differentiable Snow-17 calibrated cell-by-cell against SNODAS snow-water-equivalent across the contiguous US at 0.1°, over 15 water years (2010–2024), driven by ERA5-Land. Parameters are learned by Adam / BPTT — then made physically reasonable with a literature prior, at almost no accuracy cost. This page documents the result, how good it is, and exactly how it was built.
One differentiable model, one 15-year record, one continental parameter field — with an honest read on where it works and why.
A per-cell Snow-17 parameter set (9 params) that reproduces SNODAS SWE, learned by gradient descent rather than SCE-UA/DREAM. Grid-independent, so it scales toward a global product.
Timing is captured everywhere (r 0.71–0.92). Continental regions reach business-grade skill (KGE 0.60–0.73). The residual is bias, concentrated in maritime deep snow.
SWE-only data leaves the melt/retention parameters weakly identified. A physical prior regularizes them to literature values — reasonable and accurate.
Evaluated on a held-out temporal test period (last third of the record), over seasonal-snowpack cells (peak SWE ≥ 100 mm). KGE is decomposed into r (timing), α (variability ratio), β (mean/bias ratio).
| Region | KGE | r (r²) | α | β (bias) | read |
|---|---|---|---|---|---|
| Great Lakes / Upper Midwest | 0.69 | 0.91 (0.82) | 0.83 | 0.85 | strongest — cold, lake-effect |
| Northeast / Appalachia | 0.68 | 0.86 (0.73) | 0.98 | 0.91 | near-unbiased |
| Mid / South Rockies | 0.60 | 0.83 (0.69) | 0.99 | 1.04 | best mountains (β≈1) |
| North Rockies | 0.60 | 0.82 (0.68) | 0.97 | 0.86 | good |
| Southwest high | 0.47 | 0.77 (0.60) | 0.92 | 0.91 | small sample |
| Wasatch / Great Basin | 0.41 | 0.77 (0.59) | 1.04 | 1.26 | over-sim, desert margin |
| Sierra Nevada | 0.43 | 0.76 (0.58) | 0.81 | 0.84 | hard — maritime deep snow |
| Cascades | 0.28 | 0.68 (0.47) | 0.90 | 0.73 | hardest — undercatch |
Snow-17 ships with Anderson's classic default parameters (MFMAX 1.4, MFMIN 0.3, SCF 1.1, PXTEMP 1.0, …). A fair head-to-head: identical forcing (including the temperature correction), identical model — only the parameters differ.
| Region | per-cell median KGE — default | per-cell median KGE — calibrated | Δ |
|---|---|---|---|
| Northeast / Appalachia | −0.12 | +0.83 | +0.95 |
| Great Lakes / Upper Midwest | +0.15 | +0.79 | +0.64 |
| Mid / South Rockies | +0.10 | +0.63 | +0.53 |
| North Rockies | +0.14 | +0.62 | +0.48 |
| Southwest high | +0.19 | +0.58 | +0.39 |
| Cascades | −0.12 | +0.49 | +0.61 |
| Wasatch / Great Basin | −0.74 | +0.48 | +1.22 |
| Sierra Nevada | −0.13 | +0.45 | +0.58 |
First: the eight assessment regions on the map. Then, for each region, the region-mean SWE — observed (SNODAS) vs simulated (Snow-17) — split into the training years and the held-out test years, side by side.








Is r² = 0.9 good? For SWE, not by itself. Here is why we lead with KGE.
SWE has a huge, smooth seasonal cycle (0 → peak → 0 each year). Any model that tracks that cycle scores r ≈ 0.8–0.9 automatically. So high r² only confirms timing; it says nothing about whether peak magnitude or total volume is right, and it does not penalize bias.
Requires timing (r), the right amplitude (α = σsim/σobs), and the right mean (β = μsim/μobs). Cascades has r = 0.68 but KGE only 0.28 — because β = 0.73 (27% under-bias). r² would hide that; KGE surfaces it.
| KGE | meaning |
|---|---|
| 1.00 | perfect |
| ≥ 0.75 | good |
| 0.50 – 0.75 | acceptable / behavioural |
| > −0.41 | beats the mean-of-observations benchmark (the true "zero line", not 0) |
For a globally-transferable 0.1° product with no per-station tuning, driven by global reanalysis and validated out-of-time, continental KGE 0.6–0.73 with r 0.8–0.92 is a solid, competitive result.
The order of operations: verify the forcing, diagnose why parameters rail at their bounds, then regularize — not swap inputs blindly.
In the baseline fit, MFMAX/MFMIN pinned at their upper bounds and PLWHC at its lower bound. We widened the bounds drastically (MFMAX→5, MFMIN→1.5, SCF→0.4). Result: test-KGE moved only +0.05–0.10 while the parameters ran to the new extremes. Conclusion: the melt/retention parameters are weakly identified under an SWE-only loss — the likelihood surface is flat, so they drift to whatever bound they are given. The bounds were never the limit.
Where the data cannot constrain a parameter, inject domain knowledge. We add an L2 penalty pulling the weakly-identified parameters toward literature-central values, in normalized units:
Would a "better" precip product fix the maritime bias? Evidence says no: Sierra ERA5 precip is already ~right (0.96× SNOTEL) yet SWE is under-biased with SCF < 1 (the model is shedding precip, not starved of it). SCF is itself a free per-cell precip scaler, so uniform amount errors are already absorbed — the Rockies undercatch 23% yet sit at β≈1. The residual maritime bias looks like sub-grid orographic representativeness and rain/snow partition, which a precip swap cannot resolve. (IMERG was unusable — the CONUS cube was 98.6% NaN; MSWEP needs manual download.)
The nine Snow-17 parameters, their search ranges, and the prior target (literature-central value) where one is applied.
| Param | Meaning | Range | Prior target | Regularized? | Identifiable? |
|---|---|---|---|---|---|
| scf | precip / snow correction (undercatch) | 0.7–1.6/2.5 | — | No | Yes (strong) |
| pxtemp | rain/snow threshold temperature | −1–3 °C | — | No | Yes |
| mfmax | max melt factor (Jun 21) | 0.5–2.5 | 1.2 | Yes | Weak |
| mfmin | min melt factor (Dec 21) | 0.05–0.5 | 0.20 | Yes | Weak |
| tipm | antecedent temperature index weight | 0.1–1.0 | 0.20 | Yes | Weak |
| nmf | max negative (refreeze) melt factor | 0.05–0.5 | 0.15 | Yes | Weak |
| plwhc | liquid-water holding capacity | 0.02–0.3 | 0.04 | Yes | Weak |
| uadj | wind / rain-on-snow melt factor | 0.03–0.19 | 0.08 | Yes | Very weak |
| mbase | base melt temperature | fixed 0 | 0.0 | fixed | — |
| Truth | SNODAS SWE (NSIDC G02158), ~8-daily, aggregated to 0.1° |
|---|---|
| Forcing | ERA5-Land daily T2m + total precip; per-cell temperature correction from SNOTEL bias |
| Elevation | SRTM aggregated to 0.1° (atmospheric pressure term) |
| Output | 9 parameter maps + test-KGE + warming + masks → snow17_conus_era5.nc (250×585) |
| Grid | CONUS 0.1° · 585×250 · 58,265 snow cells |
|---|---|
| Period | WY2010-10-01 → 2024-09-30 (15 yr, 5,114 daily steps) |
| Train / test | temporal holdout — first 66% train, last 34% test |
| Optimizer | Adam + BPTT, two-stage (regional → per-cell), spatial reg λ=2, physical prior λ=200 |
| Compute | tiled 2.5° · 46 parallel CPU workers · ~2.5 h |