从零搭一个模块化、可插拔的水文模型,锚定 CREST / EF5,由集总(lumped)到分布式(distributed)。 每个模块一个独立页面:可编辑的 Python 代码 + 参数滑块 + 实时曲线(Pyodide 在浏览器里真跑 Python)。 多个经典 version 可切换对比,CREST 标签标出 CREST/EF5 采用的那个。
核心理念:把模型拆成可插拔 block——只要输入/输出用同名通量(flux)+同单位(mm/dt),任何一块都能换成另一种经典方法。
每个 block 是一个 Python 类(init_state + step),Model 组装器用共享 "flux 总线" 把它们串起来(EF5 Simulator 的极简教学版)。
两阶段路线:阶段A 集总(把每个过程在单个流域单元上吃透) → 阶段B 分布式(同样的 block 扩到网格 + cell-to-cell 汇流,对照 EF5 源码) → 阶段C 可微(反向传播率定, 进阶)。
水文模型 = 一本水的账本:P − ET − Q = ΔS。线性水库 playground 验证引擎。
✓ 已完成 · 可交互
降水/PET 从哪来。空间聚合 3 法(mean/Thiessen/IDW)可改代码对比;CREST 走网格。
✓ 已完成 · 可交互
蒸发需求 3 版本:GivenPET×KE(CREST) / Hamon / Hargreaves,可切换、可改参数。
✓ 已完成 · 可交互
Hesperange 无雪、无温度列 → 跳过留位(接口已预留,之后有雪流域再学)。
⏲ 跳过留位
bucket / HBV-beta / VIC 可变入渗曲线(CREST) / SCS-CN 四版本可改代码对比。
✓ 已完成 · 可交互
快/慢水库给产流加记忆:single/dual(CREST LEAKO-LEAKI)/nonlinear/Nash。首个端到端 NSE(手调 0.84)。
✓ 已完成 · 可交互
五方法三门派 FIR/IIR/PDE + Saint-Venant 谱系。同一话题的"方法"维度。NSE 0.885。
✓ 已完成 · 可交互
同样的 KW 方程 + 拓扑网络;CREST 两套原生方案(lr/kw)解剖;逐步追踪面板。"空间"维度。
✓ 已完成 · 可交互
D8 流向、汇流累积、真实 DEM 提河网;TOPMODEL 地形指数桥梁。
待学 (阶段B)
NSE/KGE、Monte Carlo、GLUE、DREAM(EF5);之后 阶段C 可微梯度率定。
待学
模块 7 和 8a 都是 routing。它们不是两个话题,而是同一话题的两个维度: 方法(用什么物理)× 空间(有没有拓扑)。KW 在两页里是字面意义上同一个方程。
| 方法 \ 空间 | 集总(模块7):一个河段,无空间 | 网络(模块8a):逐格 + 拓扑 |
|---|---|---|
| UH 卷积(FIR) | ✓ 直接规定核(lag/三角/Gamma) | — 网络会自己"长出"核(GIUH) |
| Muskingum(IIR) | ✓ 单河段 | 可逐河段串联 |
| Kinematic wave(PDE) | ✓ V5 单河段 | ✓ 同一方程 + 拓扑扫描 |
| lr 水库+travel-time | — | ✓ 原生 CREST CREST |
为什么代码上仍要分开:模块7 的方法都是 Block,能插进 Model 链(total_runoff→discharge);
8a 的网络路由不是 Block——它需要整个网格 + 拓扑,装不进集总链。这是接口层面的硬区别。
结论:均匀雨 + 单一流量区间 → 集总 UH 完全够用(且更快更稳);需要空间降雨(雷达/卫星)或跨量级洪水 → 必须上网络。这正是 CREST/EF5 为山洪预报选择分布式的根本理由。
卢森堡南部 Alzette 河上、卢森堡市上游,子流域约 292 km²(中尺度)。数据来自 TU Delft CIE4431 课程:日尺度 1127 天(1997-08 起),P≈1014、PET≈710、Q≈465 mm/yr,径流系数≈0.46。出口砂岩瓶颈 → 基流明显。