
简介面源污染SWAT模型讲义面向刚接触分布式水文模型与非点源污染模拟的学习者用一节课的篇幅梳理SWAT的核心框架与落地案例。内容先交代模型定位——土壤和水评估工具按水循环环节模块化拆分并说明命令代码控制子流域与河网演进的运行方式随后分气候、陆地水文、水面水文三部分展开涵盖日降水与气温、冠层蓄水、下渗、蒸散发、SCS曲线数地表径流、主河道与水库汇流等环节。泾河流域实例部分给出数据来源、92个子流域划分以及不同植被和坡度下水土流失量的对比结论便于理解参数设置与结果解读。包内为1个PPT文件约564KB适合课堂汇报或自学速览。已有986人学习可作为面源污染建模入门的第一份框架性材料。1. 面源污染最难算的从来不是排放量而是“哪块地、哪场雨、冲走了多少”面源污染也叫非点源污染它和工业点源完全是两套逻辑点源有一根管子站在管子口测流量和浓度就能把账算清面源没有管子氮磷和泥沙是一场降雨在坡面上慢慢“泡”出来、再顺着沟道汇进河道的雨没下之前谁也不知道它要排多少。SWAT 模型Soil and Water Assessment Tool土壤和水评估工具要干的事就是把这件“事前说不清”的事变成“按天、按地块可以复算”的过程把流域切成子流域再把子流域切成同质地块每个地块独立算产流产沙最后沿河网汇到出口断面。搞懂它的价值不在于会点软件按钮而在于你能判断一份面源污染模拟结果什么时候可信、什么时候是用参数硬凑出来的。2. 空间离散与模块化SWAT 为什么先把流域切成 92 块再拼回去2.1 从子流域到 HRU同一场雨为什么要分几种身份去算一份日降水落在流域上并不是均匀地变成径流。林地拦一部分、麦田渗一部分、村庄路面几乎全变径流。SWAT 的第一层离散是子流域按地形和河网把流域划成若干块每块有自己的出口和河道讲义里的应用案例划出了 92 个子流域。第二层离散更关键子流域内部再按“土地利用 × 土壤类型 × 坡度等级”的组合切成水文响应单元也就是 HRU。HRU 是产流的最小计算单元它有三个特点值得记住一是同一 HRU 内被认为完全同质参数只有一套二是 HRU 之间不发生水分交换各自算完再把结果按面积加权汇总到子流域出口三是 HRU 不出现在河网拓扑里它只是子流域的一个“成分”。这套设计的动机很朴素日尺度模型拿不到坡面汇流路径的高程细节与其编一个假的路径不如干脆承认“这一块地的产流直接进河道”。代价也在这里。真实坡面上上坡位的径流会流经下坡位泥沙沿途沉积、氮磷沿途被吸附或解吸HRU 之间不交互就把这段“沿程效应”抹掉了。常见的补救办法是把子流域划细一点或者事后用输移损失参数去补但两种办法都只能减小误差消不掉。所以看到一份 SWAT 结果里子流域数量从 92 改成 300泥沙总量变了别急着怀疑模型坏了这是离散尺度变化带来的必然结果。2.2 一个环节一个模块模块化到底解决了什么问题SWAT 采用模块化设计水循环的每一个环节对应一个模块冠层截留是一个、下渗是一个、蒸散发是一个、壤中流是一个、地表径流是一个、河道汇流又是一个。这个“一个环节一个模块”不是软件工程上的洁癖它解决的是三个很实际的问题。第一是可替换。蒸散发可以选不同的潜在蒸散算法融雪可以整套关掉灌溉可以从农业管理模块里挂进来。你研究的是黄土丘陵沟壑区的水土流失雪模块开着只是白算关掉不影响结论。第二是可裁剪。模块之间靠状态变量耦合而不是靠一条写死的函数调用链土壤分层含水量、冠层蓄水量、浅层含水层储量这些状态量是模块之间的公共接口。上一时段蒸散发拿走了多少水下一时段壤中流就少了多少水可拿顺序由主控流程固定模块内部怎么算互不干涉。第三是可做情景对比。要回答“退耕还草之后流失量降多少”本质上就是把土地利用这个输入换一套其余模块一行不改重跑一遍。讲义里“不同植被水土流失量的比较”做的就是这件事。我一般会这么理解这套设计SWAT 不是在模拟一个物理世界它是在维护一本按天结算的水量账本和泥沙账本模块就是账本上的科目科目可以增删记账顺序不能乱。2.3 命令驱动的汇流演进为什么加一座水库只是改几行配置讲义里有一句容易被扫过去的话运行上采取命令代码控制方式用来控制水流在子流域间和河网中的演进过程使得添加水库的调蓄作用变得异常简单。这句话点到了 SWAT 架构里最实用的一块。SWAT 的输入是一组按后缀分工的文本文件每个文件负责一类对象改动通过改文件完成而不是改程序。文件类型承载内容改动它会牵动什么流域配置文件子流域数量、河网连接关系、汇流顺序整个演进序列动它等于重排拓扑子流域文件子流域到河道的连接、气象输入索引子流域归谁管、用哪套气象HRU 文件土地利用、土壤、坡度、面积占比产流产沙的源头参数河道文件河道物理参数、演算方法水流在河道里的传播与损失水库文件入流、出流、降雨、蒸发、渗流相关参数节点处的蓄泄行为汇流是按天推进的时序当天所有 HRU 算完产流产沙按面积加权汇总到子流域出口进入河道演算再流向下游子流域与那里的出流叠加继续往下走直到流域出口。水库就是插在这条时序上的一个节点在流域配置里给某个子流域挂上水库编号配一套水库参数演进到它时先蓄、再按出流关系放下游收到的水量和泥沙就自然变了。这就是“添加水库异常简单”的技术含义水库不是特例代码它是演进链上的一个标准节点。你不需要理解程序怎么调度只需要理解拓扑怎么描述。反过来说拓扑描述一旦写错比如某个子流域的上游编号指错了模型照样能跑完、照样出结果只是水流走了另一条路这是后面避坑章节要专门讲的一类翻车。3. 陆地水循环一场降雨在坡面上被拆成几条路径3.1 冠层蓄水与下渗SCS 曲线数凭什么能顶替下渗物理过程降雨落到地面之前先过冠层。SWAT 给每个 HRU 一个冠层最大蓄水容量降水先填这个坑填满了才落到地面冠层里的水随后按潜在蒸散速率蒸发。落到地面之后第一道分流是下渗渗不下去的那部分才可能变成地表径流。按物理过程推下渗应该用 Richards 方程或者 Green-Ampt 类模型算但那需要分钟级的雨强过程。讲义这个案例用的是 1996 到 2000 年的日降水、日最高最低温一天一个数雨强信息根本不存在。物理下渗模型没有驱动力只能退回到经验方法也就是 SCS 曲线数法CN 法。它的核心是把“这场雨能产多少流”压缩成一个无量纲数 CNdef scs_runoff(P, CN, lam0.2): # P: 日降水量(mm) # CN: 曲线数, 由土地利用 土壤水文组 前期湿度决定, 范围约 30~100 # lam: 初损系数, 常用 0.2, 表示产流前先扣掉 20% 的潜在滞蓄 S 25400.0 / CN - 254.0 # 潜在最大滞蓄量(mm) Ia lam * S # 初损(mm), 被植物截留、填洼、初期下渗吃掉 if P Ia: return 0.0 # 雨还没填满初损, 不产流 Q (P - Ia) ** 2 / (P - Ia S) # 剩余雨量在滞蓄与径流之间分配 return min(Q, P) # 产流不会超过降水拿 CN 75 试一下S 约 84.7 毫米初损约 16.9 毫米。一场 50 毫米的雨产流约 9.3 毫米产流系数不到 0.19同样 CN 下换成 100 毫米的雨产流约 41.2 毫米系数跳到 0.41。这种非线性正是面源污染的节律来源小雨年份坡面几乎不出流污染物待在土里暴雨年份产流系数翻倍泥沙和吸附态磷一起被冲走。参数怎么改也就清楚了CN 不是自由旋钮。它由土地利用麦田、草地、林地、裸地各不同、土壤水文组按下渗能力分 A 到 D 四组D 组最黏最不渗、前期土壤湿度共同决定值域有物理边界。把它当标定参数随便拉率定期能对上验证期必崩。3.2 蒸散发、壤中流与地下水水分再分配的三条出口渗进土壤的水不是存着不动SWAT 把土壤按深度分层每层维护自己的含水量然后开三个出口。第一个出口是蒸散发。潜在蒸散由气象驱动算出上限实际蒸散再被土壤含水量打折表层先蒸植物根系按根深分布从各层吸水上层干了就只能往下层要。土壤蒸发和植物蒸腾在模型里是分开算的因为它们的限制条件不同蒸腾受气孔和根系分布控制蒸发只受表层含水量控制。第二个出口是壤中流。当某层含水量超过田间持水量、又还没到饱和多余的水会侧向流出进入子流域河道。讲义里把它列为独立环节是对的在山坡地带壤中流往往是河道基流的重要来源也是溶解态氮输移的主要通道之一。常见的实现思路是用存储—出流关系描述把该层超出田间持水量的部分当作一个线性水库按一个衰减系数逐日放水。第三个出口是地下径流。下层渗漏补给浅层含水层浅层含水层再以基流形式补给河道。这一支的水量决定了枯水期河道里有没有水也决定了溶解态污染物在非降雨期还能不能持续进河。这三条出口的关系值得琢磨同一个 HRU如果壤中流系数调大地表径流就少、泥沙就少、但溶解态氮可能更多如果蒸散系数调大产流整体下降泥沙和污染负荷一起降。所谓“率定”很多时候是在这几个出口之间做取舍而不是把某一条路径单独修准。3.3 植被一个植物生长模型怎么统一接管所有植被类型讲义里有一句容易被低估的描述用单一的植物生长模型模拟所有类型的植被盖度。这句话既是 SWAT 的强项也是它的软肋。强项在于它让“植被”从一张静态的土地利用图变成了一个动态变量。单一模型维护叶面积指数、生物量累积、根系深度这些状态量随温度和水分条件逐日生长覆盖度会变、根会变深、蒸腾需求会变。回到面源污染的场景这意味着同一块地春天和秋天不是一回事春季作物覆盖低坡面裸露同样的雨能冲走更多泥沙到了生长旺季盖度上来流失量就降下去。用静态土地利用图是模拟不出这个季节动态的而讲义在“进一步工作”里恰好提出要模拟和分析月尺度的土壤流失、探索不同植被下水土流失规律的季节动态说明作者也很清楚这套静态输入的天花板在哪里。软肋在于用一个模型统一所有植被参数上就必然要做粗暴的等价。灌木和乔木在模型眼里主要是叶面积指数曲线、最大根深、最大冠层高度这几个参数的差别树种结构、枯落物层厚度、林下灌草层次这些真正影响坡面侵蚀的东西被压缩掉了。所以当你看到模拟结果说乔木的流失量高于高覆盖草地不要立刻觉得反直觉就一定是模型错了先想想它眼里的“乔木”到底是什么样子。4. 水面汇流泥沙和氮磷是怎么从坡面被搬到出口断面的4.1 主河道汇流水、泥沙、营养物、有机化学物质为什么必须同步演进到了河道里SWAT 同时搬运四类东西水、泥沙、营养物、有机化学物质。讲义把主河道汇流单列成水面部分的第一块是因为这四类物质的输移逻辑完全不同但又必须在一个时间步内按顺序更新。水的演进决定了其他三者的载体。河道演算常用的思路是把河道分成调蓄段按变量存储系数或马斯京根类方法算传播和衰减输出当日出流过程。泥沙的演进分两段坡面产沙和河道输移。坡面产沙常见的实现思路是修正通用土壤流失方程一类的经验式把降雨径流能量、土壤可蚀性、植被覆盖与耕作管理、坡长坡度几个因子乘起来得到一个坡面产沙量。这个量进入河道后还要看河道有没有能力把它带走水流挟沙能力大于来沙就冲刷河床小于来沙就淤积。所以子流域出口的泥沙量往往不是坡面产沙量而是坡面产沙经过河道一路沉积、冲刷之后的净结果。营养物分两态溶解态跟着水走吸附态挂在泥沙颗粒上走。这一步的先后顺序极其关键必须先更新泥沙、再更新吸附态污染物否则泥沙沉了而挂在它上面的磷还留在水里物质不守恒。有机化学物质同理靠分配系数在水相和泥沙相之间分配。这套顺序说明了一个容易被忽略的机制面源污染的输移不是“污染物随水流动”这么简单而是“污染物在水和沙两相之间反复换乘”。河道里泥沙沉降吸附态磷跟着沉到河底下一次洪水冲刷它又回到水里。这就解释了为什么有些流域的磷负荷表现出强烈的滞后性当年的施肥量下降河口的磷浓度要好几年才降下来因为河道和水库底泥里存着历史账。4.2 水库汇流五个口子怎么改变下游的污染节律讲义把水库汇流概括成五个口子入流、出流、降雨、蒸发、渗流。看着简单但它在面源污染模拟里的作用被严重低估。水库首先是个沉降池。入流带着泥沙进来流速骤降粗颗粒先沉吸附态氮磷跟着一起沉。出库的水相对清澈挟沙能力反而变强会把下游河道的床沙冲起来。这就是常说的“清水下泄”它让下游断面的泥沙和吸附态磷可能出现不降反升的情形。其次它是节律改写器。天然河道里污染物浓度跟着降雨走雨大浓度高水库把入流拦蓄、按出流规则慢慢放下游看到的浓度峰值被削平、时间被推后。你如果拿水库下游的实测水质去率定上游坡面的产污参数很可能怎么调都对不上因为中间隔着一个改写节律的节点。这也回到第 2 章讲的架构水库是汇流时序上的标准节点加它只需要在拓扑里挂一个编号、配一套参数。讲义说“使得添加水库的调蓄作用变得异常简单”说的就是这个机制层面的解耦蓄泄行为被封装成一个节点对象不用去动水流演进的调度逻辑。4.3 案例一92 个子流域上的植被情景1 : 0.683 : 0.446 : 0.219 : 0.168 怎么读讲义的应用案例研究目的是通过模拟看不同植被对水土流失的影响。输入是 1996 到 2000 年流域内一个气象站的日降水与最高最低温2000 年的土地利用以及 1:400 万的土壤图模拟把流域划成 92 个子流域然后把不同植被类型下的流失量折算成相对比值以冬小麦为 1覆被类型相对流失量相对冬小麦的削减幅度冬小麦1.000—带覆盖草地0.683约 32%乔木0.446约 55%高覆盖草地0.219约 78%灌木0.168约 83%这组数字最值得学的不是排序而是它的表达方式用相对比值而不是绝对值。绝对流失量对参数、对土壤可蚀性因子极其敏感换个土壤图能差出一个数量级跨情景比较就没有意义了。相对比值把系统性偏差约掉了剩下的差异主要来自覆被变化本身这才是情景实验该关心的量。排序本身也讲得通冬小麦一年里有大段时间地表裸露翻耕又破坏团粒结构坡面几乎不设防带覆盖草地有连续的地表覆盖但覆盖度中等乔木冠层截留大但林下地表往往裸露枯落物分解快、根系深层导水还会增加壤中流坡面保护并不如想象中强所以 0.446 高于高覆盖草地高覆盖草地贴着地面连续覆盖直接削减雨滴击溅和坡面流速0.219 是合理的灌木 0.168 最低因为它的覆盖贴近地表又相对持久。这里有个容易被讲错的地方高覆盖草地优于乔木不等于“种草比种树好”。模型里的乔木是参数化的乔木林下没有灌草层现实中的复层林结构完全不是这样。把结论往外推的时候必须把“模型里怎么表达这种覆被”和“现实中这种覆被长什么样”分开看这一步是血泪经验。4.4 案例二坡度实验里 R² 忽高忽低暴露了什么讲义的第二个实验是坡度与土壤流失量的关系给了好几张散点拟合图。这些图最有价值的地方恰恰是它们互相矛盾。同一批数据按不同坡段、不同河流等级分组之后拟合结果五花八门有的分组斜率明显为正、R² 能到 0.79 甚至 0.84看着相当漂亮有的分组斜率是负的R² 只有 0.0049、0.0887、0.1035 这种量级几乎等于说“这条线什么都解释不了”。一段被标注为 25 度以下的图R² 只有 0.0049换到 25 度以上、30 度以上重新分组斜率和 R² 立刻换一张脸。这不是数据脏而是机制在提示你坡度只是一个代理变量。真正驱动坡面侵蚀的是坡长、坡形、坡面覆盖、土壤可蚀性、以及侵蚀类型本身。缓坡上以面蚀和细沟侵蚀为主流失量随坡度增长平缓陡坡上重力侵蚀、崩塌、切沟开始介入规律完全换了一套再往上坡面已经留不住土流失量反而受限于“有没有土可流失”增长就钝化了。把这几套机制混在一个回归里自然得到一个什么都解释不了的 R²。还有一个更隐蔽的原因模型输出的流失量是子流域尺度的面平均值不是坡面尺度的点值。子流域划得越大内部坡度差异被平均得越狠坡度与流失量的相关性就越弱。92 个子流域意味着平均每个子流域覆盖了相当一片面积坡度信息在这一步已经被磨掉一层。所以那些 R² 很低的图未必说明“坡度不重要”更可能说明“在这个空间尺度上用子流域平均坡度去解释子流域平均流失量本来就解释不了多少”。讲义在“进一步工作”里提出要在年数据基础上做月尺度的土壤流失模拟、探索季节动态以及研究流失对植被覆盖度变化的响应方向正是对的把时间尺度收细、把驱动因子从单一坡度扩到覆盖度动态才有可能把那些 R² 只有 0.00x 的分组救回来。5. 避坑与排查跑 SWAT 最容易翻车的几个地方5.1 输入侧年份错位和比例尺不够会让后面所有努力作废现象率定期水量对得挺好一换验证期整体偏高或偏低调参数怎么调都按不住。原因输入的时间基准不一致。讲义案例里气象是 1996 到 2000 年土地利用是 2000 年一张图。土地利用是状态量用末年的一张图去代表整个五年等于假设这五年地表没变过。如果这五年里确实有大面积退耕或开垦产流和产沙的系统性偏差就固定在输入里了参数再灵活也补不回来。解决把时间基准对齐当成第一步强制检查。做不到逐年土地利用就把结论限定成“在 2000 年下垫面条件下的模拟”别拿它去解释跨年的趋势或者把覆被变化改写成情景对比而不是塞进历史率定。现象某个子流域怎么调参数都没反应敏感性分析出来一堆零。原因土壤图比例尺太粗。1:400 万的土壤图落到子流域尺度上几个相邻子流域可能被赋予完全相同的土壤参数HRU 划分退化参数敏感性自然消失。解决先做一次输入分辨率与子流域平均面积的量级比对。土壤图的最小图斑远大于子流域面积时就别指望土壤参数能靠率定“调出来”老老实实做敏感性分析、给出区间比硬凑一个最优值诚实得多。5.2 参数侧CN、蒸散系数这些旋钮的物理边界在哪现象率定期 Nash 系数很漂亮验证期直接崩盘。原因把 CN 当成自由参数拉到物理范围之外。CN 由土地利用、土壤水文组、前期湿度决定值域大致在 30 到 100 之间麦田、草地、林地各有合理区间。为了拟合某几年的实测径流把它拉到 95 以上等于宣称这块地几乎不渗水物理上就站不住换年份必崩。解决给每个参数设硬边界并且优先调那些不确定性本来就大的参数比如土壤蒸发补偿系数、基流消退系数这类没有直接观测、只能靠率定确定的量。CN 只在小范围内微调超出边界就说明是输入数据的问题不是参数的问题。现象水量对得很好泥沙差一个数量级氮磷更是没法看。原因分步率定的顺序错了。产流、产沙、营养物是三套参数在管产流看 CN 和下渗相关参数产沙看土壤可蚀性、覆盖管理因子、水土保持措施因子营养物看初始浓度和入河系数。一上来就把三者一起调等于让三套参数互相掩盖误差。解决严格分步先水后沙再养分前一步不达标不进下一步。这一步顺序反过来后面的工作全是白做。5.3 结果侧R² 好看、水量对得上不代表泥沙和氮磷可信现象某段坡度的拟合 R² 到了 0.8 以上就据此下结论说“坡度是主导因子”。原因R² 高只说明这组样本内线性关系强不说明机制成立。讲义里同一批数据换个分组方式斜率和 R² 就完全变了样有的分组甚至是负斜率。分组方式本身是人选的选到哪一组 R² 高就报哪一组这是典型的选择性呈现。解决把所有分组结果一起摆出来包括那些 R² 只有 0.00x 的组。低 R² 不是失败它是“这个尺度上这个因子解释不了”的有效信息往往比高 R² 更能说明问题出在尺度或因子选择上。现象换了子流域划分方案比如从 92 个改成 200 个所有结果都变了不知道哪版可信。原因离散尺度变了HRU 组合方式、河道汇流路径、参数汇总的面积权重全变了结果不可比是必然的。解决情景对比实验一旦定下划分方案就锁死中途不改。要评估划分敏感性就单独做一组“同一情景、不同划分”的对照用它给出结果的不确定区间而不是混在情景对比里。6. 取舍SWAT 把物理过程压成参数换来的是“缺资料也能跑”把这份讲义从头到尾串一遍会发现 SWAT 的每一个设计选择都在做同一件事用可控的经验性换可运行性。半分布式是第一层取舍。HRU 之间不交互坡面沿程的泥沙沉积和污染物换乘被抹掉换来的是每个 HRU 只需要一套土地利用、土壤、坡度参数而这些参数恰好是能从公开图件上拿到的。全分布式网格模型能表达沿程过程但它需要每个网格一套参数在 1:400 万土壤图这种资料条件下根本撑不起来。经验公式是第二层取舍。CN 法替代物理下渗、经验产沙式替代泥沙输移方程是因为日尺度气象输入里没有雨强物理模型没有驱动力。这不是偷懒是在输入信息量给定的前提下选一个不会给出虚假精度的方案。日步长是第三层取舍。日步长抹平了洪峰暴雨期泥沙和污染负荷会被低估但日步长让 1996 到 2000 年这种长度的序列可以跑完也让气象数据的要求降到“有日降水和最高最低温”就行。取舍点放弃了什么换来了什么什么时候会失效HRU 不交互坡面沿程沉积与吸附解吸参数可从图件获取、计算量可控子流域划得过大、坡长效应显著时经验产流产沙公式雨强驱动的物理过程日尺度数据即可运行暴雨、强对流、短历时洪水日步长洪峰过程与峰值浓度长序列可跑、数据门槛低研究峰值污染负荷或突发泄漏时单一植物生长模型群落结构与林下层次覆盖度可动态演化涉及树种配置、演替长期响应时所以判断一份 SWAT 结果能不能用问的不是“准不准”而是“你要回答的问题是不是正好在它没放弃的那一侧”。问年度产沙的相对排序它在问一场暴雨的峰值浓度它不在。从那以后我每次拿到一份模型结果都强制走一遍三步先把所有输入的时间基准和空间分辨率摊开对一遍再检查关键参数的物理边界有没有被突破最后把分组拟合结果全部摆出来看低 R² 的那几组在说什么。三步走完往往不用看最终报告就知道这份结论能推到哪一步。希望帮到你。本文还有配套的精品资源点击获取