简介:这份资源是《雨水管理模型 SWMMH 参考手册》第 I 卷「水文学」的汉化 PDF,面向城市雨水管理、环境工程与城市规划领域的工程师、科研人员及高校师生,用于理解 SWMM 动态降雨-径流模拟的水文模型原理。SWMMH 是 EPA SWMM 的汉化版本,可处理单一事件或长期连续模拟,径流部分在子汇水面积上接受降水并产生径流与污染物负荷,演算部分则通过管道、渠道、蓄水处理设施、水泵和调节器输送径流,并跟踪各子汇水面积与管渠的水量、水深和水质。压缩包内仅含 1 个 PDF 文件,约 2.93MB,内容涵盖概览、气象学、对象模型与过程模型等章节,并附译者声明、原著声明、摘要、致谢与缩略语,目录结构完整。该手册由 Lewis Rossman 与 Wayne C. Huber 编写,同济大学李树平教授翻译,已有 295 人学习。读者可借此系统掌握 SWMM 水文建模的理论框架与参数含义,为城市降雨事件的水量水质预测与管理提供参考。
1. SWMM 水文学手册到底解决什么问题:从一场城市内涝复盘说起
一场两小时暴雨,把某新区三条主干道淹成了河。事后复盘,排水管网设计标准明明按三年一遇做的,为什么还是扛不住?问题往往不在管道本身,而在产流和汇流这两个环节被拍脑袋估算了。SWMM 用户参考手册里的水文学部分,讲的正是这件事:降雨落到地面之后,多少变成径流、多快汇到管网入口、峰值什么时候出现。它不是一个软件操作教程,而是一套把「天上下的雨」翻译成「管里流的水」的方法论和参数体系。
这份手册的水文学卷核心覆盖三块:地表产流计算、地表汇流演算、以及降雨与蒸发的输入处理。它适合三类人——做海绵城市方案的设计人员、要给排水模型定参数的工程师、以及需要验证模型结果合理性的审核方。如果你只是想知道某个按钮在哪,那不用看手册;但如果你要回答「为什么我的模型峰值偏低」「下渗参数到底填多少」,这份手册就是绕不开的底稿。下面我按实际建模顺序,把手册里的水文学逻辑拆成能直接上手的步骤。
2. 产流三兄弟怎么选:Horton、Green-Ampt 与 SCS 曲线数
2.1 三种下渗模型各自的物理假设
SWMM 的地表产流本质是一道水量平衡题:降雨减去下渗、洼蓄、蒸发,剩下的就是净雨。下渗是其中最难拍准的一项,手册给了三种模型,选错了后面全盘皆输。
Horton 模型是经验式的,假设下渗率从初始最大值按指数衰减到稳定值。它不关心土壤到底湿没湿透,只看时间。优点是参数少、跑得快,适合城市化程度高、土壤资料匮乏的区域。缺点是它对前期土壤含水量不敏感——同样一场雨,旱了半个月和刚下过一场,Horton 给出的下渗曲线几乎一样,这在长历时降雨模拟里会明显失真。
Green-Ampt 模型是物理式的,基于土壤水分锋面推进的假设,需要知道土壤的毛细 suction、饱和导水率和水头差。它对前期含水量敏感,适合有土壤质地资料的区域,比如做农田或透水铺装较多的片区。代价是参数难搞,尤其是毛细吸力,手册里给了一张按土壤类型的参考表,但实际值受压实程度影响极大。
SCS 曲线数法严格说不是下渗模型,而是直接把降雨总量映射成径流总量的经验关系,核心参数是曲线数 CN。它不考虑下渗的时间过程,只算总账,所以适合做规划阶段的粗略估算,不适合做管网峰值调蓄分析。
2.2 用 Python 批量生成下渗参数并写入 INP
实际项目里,子汇水区动辄几百个,一个个手填下渗参数不现实。常见做法是先按土地利用类型分组,再用脚本批量生成参数并写入 SWMM 的 INP 文件。下面这段代码演示如何按 CN 值反推 Green-Ampt 的饱和导水率初值,并批量替换 INP 中的下渗段。
import re # 按土地利用类型定义的 CN 值与对应的饱和导水率经验区间 (mm/hr) landuse_params = { "road": {"cn": 98, "ksat": 0.5}, # 硬化路面,下渗几乎可忽略 "roof": {"cn": 98, "ksat": 0.3}, # 屋顶,产流最快 "green": {"cn": 74, "ksat": 12.0}, # 普通绿地,中等下渗 "pervious": {"cn": 61, "ksat": 30.0}, # 透水铺装,下渗较强 } def build_infiltration_block(subcatchment, landuse): """为单个子汇水区生成 Green-Ampt 下渗参数行""" p = landuse_params[landuse] # 毛细吸力按土壤类型取经验值,这里统一取 110 mm 作为中值 suction = 110.0 # 初始亏损按 0.25 孔隙率估算,实际应用需按前期降雨调整 initial_deficit = 0.25 return (f"{subcatchment}\tGREEN_AMPT\t{suction}\t{p['ksat']}\t{initial_deficit}") # 模拟一批子汇水区与土地利用的对应关系 subcatchments = [ ("S1", "road"), ("S2", "green"), ("S3", "roof"), ("S4", "pervious"), ("S5", "green"), ] lines = [] for sub, lu in subcatchments: lines.append(build_infiltration_block(sub, lu)) # 输出为可直接粘贴进 INP 的 INFILTRATION 段 print("[INFILTRATION]") print(";;Subcatchment\tModel\tSuction\tKsat\tIMD") for line in lines: print(line)这段代码的逻辑很直白:把土地利用类型当作查表键,每个类型对应一组 CN 和 Ksat 经验值,然后拼成 SWMM 的 INFILTRATION 段格式。参数说明上,Suction 是毛细吸力,单位毫米,手册建议砂土取 50 到 110、黏土取 200 到 320;Ksat 是饱和导水率,单位毫米每小时,硬化面取 0.3 到 0.5 是常见做法;IMD 是初始湿度亏损,取值 0 到 1,干旱期取 0.3 以上,雨后取 0.1 以下。注意这里用 CN 反推 Ksat 只是权宜之计,严谨做法还是查土壤质地手册。
2.3 参数敏感性:哪个参数最值得花时间标定
手册没有明说,但实测经验是:在 Green-Ampt 三个参数里,Ksat 对峰值流量影响最大,Suction 次之,IMD 主要影响起涨时间。如果只有一两天标定时间,优先调 Ksat。Horton 模型里,最大下渗率和衰减常数是主控参数,最小下渗率反而影响最小。SCS 方法只有一个 CN,但它对结果的影响是非线性的,CN 从 74 调到 78,径流总量可能涨两成。
提示:标定前先做一次参数敏感性扫描,把影响小的参数固定住,只调主控参数,否则组合爆炸根本跑不完。
3. 汇流演算:非线性水库法怎么把净雨变成流量过程线
3.1 非线性水库的数学形式与手册里的离散格式
产流算完,净雨还停在子汇水区表面,要汇到出口才算完。SWMM 手册用的是非线性水库法,把子汇水区想象成一个水深为 d 的水库,出流 Q 与水深的关系是 Q = W × (d - d_s)^(5/3) × sqrt(S) / n,其中 W 是漫流宽度,d_s 是洼蓄深度,S 是坡度,n 是曼宁系数。这个式子本质是曼宁公式的变形,把坡面流当成宽浅明渠。
手册里给的求解方式是联立水量平衡方程 dV/dt = A × (i - f) - Q,用改进欧拉法离散。实际代码里,SWMM 对每个子汇水区在每个时间步迭代求解,时间步长通常取 1 到 5 秒。如果步长太大,非线性项会导致数值震荡,表现为流量过程线出现锯齿。
3.2 漫流宽度与坡度:两个最容易被忽略的参数
很多模型跑出来峰值偏低、过程线拖尾太长,问题就出在漫流宽度和坡度上。手册对漫流宽度的定义是子汇水区面积除以平均漫流长度,但实际建模时没人真去量,常见做法是用面积除以特征宽度。特征宽度怎么取?经验值是城市地块取 50 到 100 米,具体看汇水区形状。
坡度参数更玄学。手册要求填的是子汇水区平均地表坡度,但一个汇水区里可能有平地和陡坡,取算术平均往往偏小。我一般会按面积加权,或者干脆用 DEM 提取坡度后做分区统计。坡度填小了,汇流变慢,峰值削减,这对排水管网设计是偏不安全的方向。
3.3 用 SWMM 命令行跑单场降雨并提取过程线
参数填好后,验证汇流是否合理最直接的办法是跑一场降雨看过程线。SWMM 支持命令行调用,适合批量跑方案。下面演示如何用命令行跑一个 INP 并提取节点流量过程线。
# 调用 SWMM 引擎,-r 指定报告文件,-o 指定二进制输出文件 swmm5 model.inp report.rpt out.out # 从报告文件中提取节点 J1 的流量过程线 # 报告文件里流量段以 "Node J1" 开头,后面跟时间与流量两列 grep -A 200 "Node J1" report.rpt | head -100命令行调用的关键是三个文件:INP 是输入模型,RPT 是文本报告,OUT 是二进制结果。RPT 里能直接看到流量过程线,但精度有限;要做精细分析得读 OUT 文件,常见做法是用 pyswmm 或 swmmtoolbox 这类库解析。参数上,报告步长在 INP 的 REPORT 段设置,一般设成与演算步长一致或稍大,否则报告文件会巨大。
注意:命令行跑之前确认 INP 里的时间步长和报告步长不是同一个值,演算步长要小,报告步长可以大,否则输出文件能撑爆硬盘。
4. 降雨与蒸发输入:手册没细说但天天踩的坑
4.1 降雨格式:INTENSITY、VOLUME 与 CUMULATIVE 的区别
SWMM 的降雨输入有三种格式,手册里一笔带过,但选错了整个产流全错。INTENSITY 是每个时段给一个强度值,单位是毫米每小时;VOLUME 是给时段内的降雨总量,单位是毫米;CUMULATIVE 是给从降雨开始到当前时刻的累计量。最常见的翻车是把 VOLUME 格式的数据当成 INTENSITY 填进去,结果降雨量被放大了几十倍。
判断方法很简单:看数据量级。小时降雨强度一般在 0 到 100 毫米每小时,而小时降雨量在 0 到 50 毫米。如果一列数据里出现 80、90 这种值,大概率是强度;如果都是个位数,可能是雨量。手册建议在 INP 的 RAINFALL 段明确写格式关键字,不要靠猜。
4.2 蒸发:为什么你的旱天基流一直偏高
蒸发参数填不对,最直接的后果是旱天基流偏高。SWMM 的蒸发可以按月均蒸发皿读数、月均气温、或直接给日均蒸发量。手册推荐用蒸发皿读数乘以一个折减系数,常见取 0.7 到 0.8。如果直接填蒸发皿读数,蒸发被高估,旱天土壤偏干,降雨一来产流偏大;反过来填小了,土壤一直湿着,基流就下不去。
我一般会先用月均蒸发量跑一遍,看旱天流量是否接近实测基流,再微调折减系数。这个参数对短历时暴雨影响不大,但对长历时连续模拟影响显著。
4.3 时间序列的插值方式:别让降雨被平滑掉
SWMM 对降雨时间序列默认做线性插值,这意味着如果原始数据是逐小时,演算步长是 1 分钟,降雨会被平滑成一条斜线,峰值强度被削掉。手册里提到可以设置时间序列的插值方式为 STEP,即阶梯式,保持每个时段的强度不变。对于短历时强降雨,必须用 STEP,否则峰值偏低。
设置方法是在 INP 的 TIMESERIES 段后面加一个选项,或者在 GUI 里把时间序列的插值方式改成阶梯。这个细节手册写得靠后,很多人翻不到,结果模型峰值怎么调都上不去。
5. 避坑与排查:水文学参数标定里最常见的五个翻车现场
5.1 现象:模型峰值比实测低三成,过程线还拖尾
原因通常是漫流宽度填大了,或者坡度填小了。漫流宽度越大,汇流越慢,峰值被削得越狠。排查方法是把漫流宽度减半跑一次,看峰值变化是否敏感。如果敏感,说明这个参数是主控,需要按实际汇水区形状重新估算。
5.2 现象:旱天流量为零,但实测有基流
原因可能是没开地下水模块,或者蒸发参数填得过大把土壤水全蒸干了。SWMM 的地表产流模块本身不产生旱天基流,基流要么来自地下水,要么来自管网入渗。如果实测有基流而模型没有,先检查是否漏配了地下水模块,再检查蒸发折减系数是否超过 1。
5.3 现象:降雨输入后产流为零
最常见的原因是降雨格式选错,把 VOLUME 当 INTENSITY 填,或者时间序列的单位与 INP 里声明的单位不一致。排查方法是打开 RPT 文件,看降雨段的总量是否与原始数据吻合。如果 RPT 里的降雨总量是原始数据的几十分之一,基本就是格式问题。
5.4 现象:过程线出现锯齿状震荡
原因是演算步长太大,非线性水库的离散求解不稳定。手册建议演算步长取 1 到 5 秒,但实际项目里为了跑得快经常设到 30 秒甚至 60 秒。如果出现震荡,先把步长降到 5 秒跑一段,确认是数值问题还是参数问题。如果是数值问题,降步长就能解决。
5.5 现象:同一场雨跑两次结果不一样
SWMM 本身是确定性模型,同样输入应该同样输出。如果结果不一致,检查是否有随机数相关的设置,或者 INP 文件里是否有未固定的初始条件。另一个常见原因是报告步长和演算步长不匹配导致输出采样点漂移,看起来像结果变了,实际是采样问题。
提示:每次改完参数,把 INP 文件另存一个版本号,否则跑了几十轮之后根本记不清哪个文件对应哪组参数。
6. 从单场暴雨到连续模拟:水文学参数的验证与进阶技巧
单场暴雨标定只能验证峰值和总量,真正考验水文学参数的是连续模拟。连续模拟要跑几个月甚至几年,蒸发、下渗、前期含水量的累积效应全暴露出来。我一般会选一段有连续流量实测的时期,先跑单场把峰值调准,再跑连续把基流和退水段调准。
验证指标上,峰值流量用相对误差,控制在 15% 以内算合格;径流总量用纳什效率系数,0.7 以上算可用,0.8 以上算好。但要注意,纳什效率系数对峰值敏感,如果峰值误差大,这个系数会很难看。所以先调峰值,再调总量,最后看过程线形状。
一个具体技巧是分季节标定。夏季蒸发强、土壤干,下渗参数里的 IMD 要取大;冬季土壤湿,IMD 取小。如果全年用一套参数,夏季峰值会偏高,冬季基流会偏低。手册没有强调这一点,但连续模拟里这是绕不开的。
另一个技巧是用干湿两套 CN 值。SCS 方法里 CN 对前期含水量敏感,手册给了干、平均、湿三种条件下的 CN 换算关系。实际建模时,可以按前期降雨指数动态切换 CN,而不是全年用一个值。这个做法在 SWMM 里需要通过接口或脚本实现,但效果比固定 CN 好很多。
最后说一个我自己的教训:早年做第一个排水模型时,觉得下渗参数不重要,全填了默认值,结果峰值怎么调都差两成。后来把 Ksat 按土地利用重新标了一遍,峰值误差直接降到 8%。水文学参数就是这样,你不花时间在产流和汇流上,后面管网调得再细也是白搭。希望帮到你。
本文还有配套的精品资源,点击获取