
简介本资源是一套完整可用的SWAT-CUP小时尺度水文模型率定实践包面向水文水资源、环境科学及农业面源污染模拟领域的科研人员与研究生解决SWAT模型小时级输入构建、SWAT-CUP接口配置及SUFI-2自动率定流程落地难的问题。压缩包含2000个文件总大小41.69MB涵盖281个子流域排水文件sdr、260个地下水模块gw、257个HRU管理文件hru、253个土壤属性sol、242个化学过程chm及239个管理措施mgt等核心SWAT输入类型并包含bat批处理脚本、ini配置、sqlite数据库及watout_hr_12等关键输出支持文件。已有414人学习下载资源可直接运行SWAT并启动SUFI-2率定附带完整TxtInOut目录结构与cup配置逻辑显著降低小时尺度建模的路径试错成本特别适合从日尺度向小时尺度进阶建模的学习者快速复现与调试。 搞水文模型的人多少都有过这种经历SWAT模型日尺度跑得顺顺当当一旦把时间步长切到小时级SWAT-CUP怎么配都报错要么TxtInOut路径不认要么模型跑完一看结果全是NaN要么率定迭代几十次目标函数纹丝不动。这个“SWAT-CUP-Hourly示例TxtInOut文件及cup配置”的需求说白了就是围绕一件事怎么让SWAT的小时级模拟在SWAT-CUP里真正跑起来并且能顺利完成参数率定。这里头涉及的不只是“把步长改一改”这么简单而是TxtInOut文件结构、气候数据小时化、SWAT-CUP内部配置逻辑、以及对子日降水模拟机制的深层理解。如果你也被这个问题卡住过这篇文章就是给你写的。我会按实际操作的顺序把TxtInOut文件的逐项准备、cup配置步骤、运行成功后的验证逻辑以及最让人头疼的排查链路完整过一遍。每一条都是实打实调过模型之后总结出来的不是照搬手册的那种空话。1. 小时级模拟与日尺度的本质差异为什么你的TxtInOut跑不通1.1 面源模型从日尺度切到小时尺度变化的不只是时间步长很多第一次接触SWAT小时级模拟的人第一反应都是在file.cio里把输出步长从“日”改成“小时”然后满怀期待地去跑结果不是模型秒退就是输出文件里全部是空值。原因很简单SWAT模型的子日模拟sub-daily simulation不是简单地把时间切片切细而是整个产汇流计算逻辑都发生了切换。日尺度模拟里SWAT用的是SCS曲线数法计算地表径流时间上默认24小时内降雨均匀分布而小时尺度模拟必须启用Green-Ampt入渗方程同时要给每个小时分配降水强度。模型在计算时会读取降水文件的子日记录根据小时降雨强度判断地表产流启动时间再结合土壤含水量计算下渗量。也就是说从日尺度到小时尺度模型底层算法就从“日均值思维”切成了“过程线思维”。所以如果你的TxtInOut文件夹是从日尺度模型直接复制过来只改了一个输出步长参数那几乎必然出问题。因为你的降水文件里根本没有小时尺度的降雨记录模型读到一半读不到数据直接报错或者输出空值。1.2 子日降水分布参数小时级模拟的第一个坑SWAT模型里有一个关键参数叫IDIST控制降水分布的类型还有一个参数叫NSBT用于子日模拟时的降水时间分布定义。很多时候模型能跑通但HRU产流量低得离谱问题就出在这里。在SWAT-CUP做率定的时候这些参数并不是通过普通参数列表如CN2、SOL_AWC等直接调整的而是在模型构建阶段就要用SWAT Editor里自带的天气生成器、降水分布工具预先处理好。有人会问那SWAT-CUP里能不能率定这些参数严格意义上说像SFTMP、SMFMN这类温度相关的参数可以率定但IDIST这类模型结构参数必须在建模阶段定好SWAT-CUP的Pest或SUFI2模块不会帮你重新选择降水分布方案。经验上小时级模拟推荐的做法是在SWAT Editor中把降水分布设置为“triangular distribution”三角分布同时确保降水文件里有对应的分钟级或小时级强度数据。否则即使模型能跑模拟的小时洪峰流量也会严重失真率定出来的参数根本没有物理意义。2. TxtInOut文件逐项核对从file.cio到降水分布文件2.1 file.cio中的步长控制参数整个TxtInOut文件夹里最核心的控制文件就是file.cio。小时级模拟涉及的关键参数包括IPRINT输出打印选项控制输出文件的格式和时间分辨率NBYR、IYR、IDAF模拟起始年份、起始日序这些决定了模型从降水和气温文件中的哪一天开始读IDIST降水分布类型小时级模拟一般设为1三角分布DT计算时间步长单位是小时通常设为1小时。很多人容易忽略的是IDAF开始模拟的日期和降水文件中实际数据起始日期的对齐问题。如果降水文件是从1月1日开始的而IDAF设置了3月1日模型虽然能跑但前两个月的降水数据会被跳过率定期内如果有那段时间的观测流量目标函数必然很差。在实际操作中我建议把TxtInOut里所有的日期控制统一检查一遍尤其是file.cio里的“NBYR/ IYR/ IDAF”和“IYR END/IDAF END”这两组必须跟降水、气温文件的实际时间范围完全对齐。2.2 降水与气象数据的小时化准备这是整个小时级TxtInOut准备过程中最耗时的环节。SWAT的降水文件通常是pcp1.pcp、pcp2.pcp这类日尺度模型里每行是一天的降水总量而小时级模型需要每行对应一个小时的降水值。由于原始气象站数据很多时候只能拿到日总量要得到小时数据只能做降尺度或者直接使用本站的分钟级观测记录。这里有一个重要的实操建议如果只有日总量数据不要硬猜小时分配最好用相邻站点的逐小时降水模式做比例分配或者用天气生成器的小时生成模块。硬编一个均匀分配算出来的径流过程线在率定的时候会带来很大的不确定性。气温文件同理小时级模拟需要逐小时的气温序列。不同之处在于SWAT本身会根据日最高最低气温用正弦插值生成小时气温所以如果没有逐小时气温可以保留日值文件让模型自己插值。这个逻辑在SWAT的文档里写得很清楚。还有湿度、风速、太阳辐射这几个气象要素小时级模拟同样可以在file.cio里配置成“由日值生成小时值”只有降水必须提供逐小时的实际数据。这条规则一定要记住能省不少数据准备的时间。2.3 观测流量文件的格式与对齐SWAT-CUP率定离不开观测数据小时级模拟的观测数据文件格式和日尺度基本一致但有两个细节非常坑一是时间和步长的对齐。SWAT-CUP里观测数据文件通常是observed.txt或flowobs.txt的格式是从某一天开始的逐日或逐小时观测值。如果模型是小时步长观测数据也必须是逐小时如果观测数据是逐日的那你只能把模型的输出聚合到日尺度去比对不能混着来。二是单位换算。SWAT输出的径流量单位是mm毫米而流量观测数据通常是m³/s。SWAT-CUP里可以通过设置output变量时的乘数因子来换算但很多人不知道这个乘数因子还要乘以流域面积才能得到正确的径流量。这个错误极其常见算出来的NSE经常出现负值排查半天发现是单位没对齐。实际操作时我习惯先在Excel里把观测流量换算成与模型输出一致的单位再导入SWAT-CUP这样能少一层换算逻辑的困扰。3. SWAT-CUP的cup配置让模型真正跑起来并完成率定3.1 建立项目与路径注意事项SWAT-CUP的项目路径问题是老生常谈但永远有人踩的坑。网上能找到的绝大多数“无法找到TxtInOut”或者“模型拒绝执行”问题根源都出在路径上。第一路径中绝对不能出现中文和空格。这个最简单也最容易被忽略。第二TxtInOut文件夹的路径要求是直接指向文件夹本身不是它的上级目录。在SWAT-CUP的“Setup”标签页里设定TxtInOut路径后程序会生成一个拷贝到项目目录下之后率定用的是项目内的那份拷贝不是你原来的那份。很多人每次手动去更新原始TxtInOut发现SWAT-CUP不认就是因为这个拷贝机制没搞明白。第三SWAT-CUP版本和SWAT版本的匹配问题。SWAT-CUP 2019自带的TxtInOut模板通常对应SWAT 2012 revision 664以上的版本。如果你用的SWAT版本太老生成的TxtInOut结构和SWAT-CUP的解析逻辑不兼容就会出现“模型启动但瞬间退出”的情况。遇到这个先检查SWAT版本再检查TxtInOut结构顺序不能反。3.2 SUFI2算法的参数选择与范围设定SWAT-CUP里最常用的率定算法是SUFI2这个算法在小时级模拟的收敛速度和稳定性上综合表现优于GLUE和ParaSol。SUFI2的核心逻辑是通过拉丁超立方采样在参数范围内生成参数组合迭代模拟后不断缩小参数范围直到目标函数收敛。在小时级模拟中参数选择要特别谨慎。部分参数在日尺度率定时很敏感比如CN2、SOL_AWC但在小时尺度上敏感性会发生变化尤其是与入渗和产流时间相关的参数参数文件位置物理含义小时尺度的重要性CN2.mgt初始SCS径流曲线数仍需率定但敏感性相对降低SOL_AWC.sol土壤有效含水量影响土壤蓄水和退水过程ESCO.hru土壤蒸发补偿系数对小时蒸散发影响较大GW_DELAY.gw地下水延迟时间对基流过程影响显著CH_K2.rte河道有效水力传导度影响河道输水损失SOL_K.sol饱和导水率子日渗漏过程的关键参数这里要特别说明小时级模拟不要一股脑把所有敏感参数都丢进去率定。我的做法是先做一次全局敏感性分析SWAT-CUP自带的Global Sensitivity功能筛选出对目标函数影响最大的5到8个参数再进入正式的SUFI2迭代。参数太多SUFI2会在高维空间里搜索困难迭代几十次都不收敛反而浪费时间。3.3 模拟时段、迭代次数与目标函数的设置SWAT-CUP的“Setup”里有两个时间段需要填对一个是模型预热期warm-up一个是率定期calibration period。小时级模拟特别吃预热期——因为土壤水初始条件对子日产流过程影响极大预热期太短会导致模拟初期的大洪水完全失真。经验上小时级模拟的预热期至少需要一年以上有条件的话两年更稳。很多日尺度模型预热期只设几个月就能凑合但小时级不行初始土壤含水量差5个百分点第一场暴雨的产流可能差出一倍。迭代次数方面SUFI2中每次迭代的模拟次数Number of Simulations一般设300到500次。小时级模拟因为计算量比日尺度大好几倍我建议先从200次试跑确认模型能稳定运行、没有NaN错误再逐步增加。一次完整小时级率定通常需要3到5轮迭代才能把参数范围缩到一个合理的区间。目标函数的选择SWAT-CUP里常用的有NSE、R²、PBIAS、KGE。小时级模拟的流量过程线波动剧烈NSE对洪峰时间误差极其敏感经常出现一个稍微的时间错位就导致NSE很低的情况。所以如果单纯用NSE做目标函数率定结果容易过拟合到某一两场大洪水上。我个人的做法是NSE和PBIAS联动看同时把KGE也作为一个辅助指标。KGE对变异性、相关性、偏差三个维度综合考量比单纯NSE更稳健。4. 运行失败的排查链路与调参经验4.1 典型报错逐个拆解小时级SWAT-CUP的运行报错来来回回就那几类。我按出现频率从高到低排一下并给出对应的排查思路。第一类模型启动后秒退输出文件为空。这个九成是TxtInOut文件不完整或者路径有误。先手动去项目目录里找到SWAT-CUP生成的TxtInOut副本用SWAT自带的模型直接跑一次如果模型自己都跑不通说明TxtInOut本身有问题你再去检查file.cio、降水文件、土壤数据库这些。第二类模拟结果全是-9999或NaN。这个问题主要出在气象数据缺失或者土壤参数不合理。小时级模拟对降水数据的连续性要求远高于日尺度只要缺一两个小时的降水记录模型在计算土壤水平衡时就可能出现异常值。排查时先检查降水文件在模拟时间范围内是否有缺失或全零行再检查土壤属性文件中SOL_K、SOL_AWC是否在合理范围。第三类SWAT-CUP提示“cannot find the parameter name”。这种情况一般是参数文件.par里的参数名称与TxtInOut中的文件名或参数名对不上。比如你把参数范围写成了“SOL_AWC.sol”但TxtInOut里的土壤文件后缀不同或者目标文件里根本没有这个参数就会报这个错。第四类观测数据文件读取错误。一般是因为观测文件的格式和SWAT-CUP的默认读取格式不一致比如时间列不是从1月1日开始或者数据行数多于模拟时段。还有一个隐蔽的坑观测数据最后一行不能是空行否则SWAT-CUP在计算目标函数时会跳过最后一行数据。4.2 率定结果不收敛怎么办模型能跑通但率定结果不理想这是另一个维度的难题。如果SUFI2迭代了三四轮目标函数还在原地踏步不要盲目加大迭代次数先检查下面几个方向。检查目标变量的时间尺度是否匹配。这是小时级率定最容易被忽视的问题。如果你用的是逐小时观测流量而模型的输出文件里默认写了日均值那比对基准就是错的。SWAT-CUP里target variable的输出时间步长需要在“Observed Data”标签页里显式设定注意格式要跟观测数据一致。检查参数范围是否太窄或太宽。SUFI2的核心逻辑是通过参数范围缩窄来逼近最优解。如果范围太窄参数空间覆盖不到最优区域太宽了又会大幅增加无效搜索。建议用SWAT-CUP自带的敏感性分析报告来观察参数敏感度排序把最不敏感的参数固定住给真正敏感的参数留出更大的搜索空间。检查模型输出与观测数据的相位差。小时级模拟中很常见的问题就是模拟洪峰比观测洪峰早一小时或晚一小时这种相位误差会让NSE直接掉到0.5以下但模型本身的水量平衡并没有大问题。这种情况下单纯调参数没用你得回头检查降水数据的时间精度以及产流时间参数比如SUBLAG、LAT_TTIME这类跟汇流时间相关的参数。我以前遇到过一次率定NSE从0.4到0.7怎么都上不去后来发现是观测站的时钟比降水站的时钟快了一小时导致模型匹配的每一场降雨都提前了一小时。数据源的时间对齐问题在小时级模拟里真的是排查重点别一上来就扎进参数里出不来。4.3 参数率定后的验证与敏感性分析率定完成不代表结束验证期validation period的表现才真正说明模型有没有泛化能力。小时级模拟因为过程线复杂验证期NSE一般会比率定期低0.1到0.2这是正常的不要因为验证期指标下降就慌。我建议每次率定结束后做三件事把率定期和验证期的模拟流量过程线叠图对比目视检查洪峰形状和退水曲线是否合理查看PBIAS确认水量平衡的偏差在±15%以内做一次最终敏感性分析确认率定后的参数确实处于敏感区间而不是卡在边界值上。如果某个参数率定后卡在上限或下限说明这个参数的初始范围设定不合理需要扩大范围重新跑一轮。很多人觉得“反正模型能跑参数在边界也无所谓”这个想法要不得。参数卡边界往往意味着模型正在用不合理的参数值来补偿其他地方的错误属于典型的“伪收敛”。5. 一份可直接参考的小时级率定实操清单说了这么多最后给一份我实际跑小时级SWAT-CUP时的标准操作顺序按这个顺序走能避开大部分新手会踩的坑在SWAT Editor中构建小时级模型。确保降水数据是逐小时记录模型使用Green-Ampt入渗方法IDIST设为1三角分布计算步长设为1小时。手动运行一次SWAT模型确认模型本身没有错误输出文件如output.rch、output.hru正常生成时间范围正确。整理观测流量数据统一时间分辨率统一单位另存为SWAT-CUP能识别的文本格式。在SWAT-CUP新建项目设置TxtInOut路径为SWAT生成的TxtInOut文件夹确认路径无中文无空格。配置观测数据与目标变量在Observed Data里导入观测流量选择逐小时时间步长设置正确的开始日期和结束日期。选择SUFI2算法编写参数文件先用5到8个核心参数做一轮全局敏感性分析再选出其中2到3个最敏感的参数进行正式率定。设置模拟次数和迭代轮数第一次迭代建议200次确认模型能跑完、输出正常再进行后续迭代。每轮迭代后检查目标函数和参数范围如果目标函数已经有明显提升就沿用新的参数范围继续迭代如果原地踏步回到第6步检查参数选择。率定期完成后做验证期模拟对比验证期目标函数确认模型没有明显过拟合。导出最终参数将SWAT-CUP获取的最佳参数值手动写回SWAT模型的TxtInOut文件另存为最终模型方案。这套流程跑下来不敢说每个流域都能率定出极好的结果但至少能保证每一步都有据可查、有问题能定位。小时级模拟的容错率比日尺度低很多但只要把TxtInOut文件结构、气象数据质量、SWAT-CUP配置逻辑这三条主线理顺模型跑通并完成率定是完全可以做到的。我个人的最终体会是小时级SWAT-CUP率定的难点不在SWAT-CUP软件本身而在TxtInOut文件的小时化改造和数据一致性控制。软件只是执行者真正决定率定成败的是你喂给它的数据和配置文件是否满足子日模拟的物理逻辑。所以下一次遇到跑不通的情况别急着改参数先冷静下来把数据链路从头到尾复核一遍往往问题就出在最不起眼的那一步。本文还有配套的精品资源点击获取