SWAT 调参方法思路整理【2】
书接上文,在简单讨论过调参方式和调参需要注意的事项后,接下来我们进行分析SWAT输入输出文件和编程思路。
SWAT输入输出
SWAT输入输出有全套的文档,在这里,仅选出对此次调参具有意义的部分进行讨论。由于本人专业受限,不讨论水质模拟部分,如有兴趣请留言或私信邮箱。
输入
SWAT需要使用file.cio
进行控制,它也是SWAT模型访问的第一个文件,其中存储着与模拟步长,气象文件入口,气象参数,流域文件入口等信息。实际上来说,通过修改这些文件,即可实现对模型参数的修改,进而改变模拟结果。
个人理解SWAT关于流域文件为三层,第一层为流域级别文件,包括basin.bsn(流域文件),basin.wwq(水质文件)等;第二层为子流域级别文件,包括xxxxx0000.rte(河道文件), xxxxx0000.pnd(池塘及湿地文件), xxxxx0000.sub(子流域文件),xxxxx0000.swq(河道水质文件), xxxxx0000.wgn(天气发生器文件), xxxxx0000.wus(用水文件);第三层文件为HRU级别文件,xxxxxyyyy.mgt(管理文件),xxxxxyyyy.gw(地下水文件),xxxxxyyyy.hru(HRU输入文件),xxxxxyyyy.sdr(河渠文件),xxxxxyyyy.sol(土壤文件),xxxxxyyyy.sep(化粪池文件),xxxxxyyyy.chm(土壤化学文件)。
通过这些文件我们可以观察到,SWAT模型在不同尺度上有不同的参数,部分参数是HRU级别分布的,其他的是子流域级别,也有全流域级别的参数。因此,SWAT实际上是半分布式水文模型,当敏感性高的参数在各个HRU,子流域级别文件内均为同一值,则该模型在实际意义上已经退化为集总式水文模型。而将大尺度的参数下放至更小尺度,则需要改变SWAT源代码以符合具体要求。
输出
SWAT在执行计算后,会输出若干结果文件,根据SWAT模型文档,包括input.std(简要输入参数汇总),fin.fin(模拟状态文件),output.rch(河道输出文件),output.hru(HRU输出文件),output.sub(子流域输出文件),output.std(输出结果简要汇总),output.sed(河道泥沙输出),output.rsv(水库输出等)。
输出文件中,由于项目要求,仅需要考虑fin.fin(确定模拟是否成功)和output.rch(河段出入口流量)即可进行确定观测点流量。
编程思路
整体实现思路为通过指定配置文件Parameters.txt
进行确定模型结构,所需调整参数,范围,所在文件和调整方法,批量模拟后提取模拟结果进行计算,求得可决系数和纳什效率系数,最终输出成一个csv表格便于分析。
程序主体采用面向对象思路,将单个抽样参数模拟视为一个对象。使用样本和Parameters.txt
作为传入参数进行初始化,内构了修改参数,执行模型,提取结果,和实测对比计算可决系数和纳什效率系数等方法,并采用一个函数进行封装。
主体程序上,在扫描完Parameters.txt
后,调用pyDOE2软件包进行拉丁超立方采样,通过对矩阵进行操作后导入进程池进行批量模拟,最后将全部结果输出为results.csv。
Parameters.txt 详解
1 |
|
- 由于代码能力有限,因此只能同时调一条调参顺序;
- 土壤和实测数据有单独的格式;
- 土壤参数需要参考SWAT文档来调整字段名;
- 目前只能提取RCH的值,如有需要则会进一步跟进更新。
土壤列表格式
1 |
|
实测数据格式
1 |
|
总结
- 本文概括了SWAT的输入输出,为接下来编程和parameters.txt进行铺垫
- 简介编程过程,力求在人话级别内将思路概括
- 介绍parameters.txt的格式和注意事项
看到这里如果只是想使用这个臭狗软件的,下一章就没有必要看了。下一章高能预警:不会代码的看不懂,会代码的血压拉满。