SWAT模型率定(SWAT CUP)
SWAT CUP的下载及安装参见另一博客-【SWAT水文模型】SWAT-CUP安装及使用
注意:率定的月径流单位为:m^3/s
下面将具体介绍基于实测水文站数据进行水文模型的率定。
1 准备工作
水文站位置如下:(以洮河流域为例)
水文站信息如下:(6个实测水文站)
本研究时段为1970-2020年(共51)年,则分配如下:
- 预热期(Warmup):1970-1975年(6年)
- 率定期(calibration):1976-2005年(30年)
- 检验期(validation):2006-2020年(15年)
流域位置如下:(66个子流域)
据此,根据SWAT水文模型划分子流域,确定相关参数,用于后续SWAT CUP率定。
查阅MonitoringPoint表,根据TYPE=O,确定观测站点所在子流域,如下:
水文站与子流域对应序号如下所示:
水文站名 | 子流域序号 |
---|---|
红旗 | 2 |
临洮 | 18 |
李家村 | 20 |
岷县 | 47 |
下巴沟 | 34 |
2 水文模型率定(SWAT CUP)
2.1 数据准备
已经进行过至少一次模拟的swat输出文件,一般放于Scenarios目录下swatcup需要的是其中的txtinout文件夹。
选取以下参数进行率定:
对应变量及范围如下:
1、文本视图(Text View)
13 : Number of Parameters
10 : number of simulations
r__CN2.mgt -0.2 0.2
v__SURLAG.bsn 0.05 24
v__OV_N.hru 0.01 30
v__ESCO.hru 0.1 1.0
v__GW_REVAP.gw 0.02 0.02
v__ALPHA_BF.gw 0.0 1.0
v__GW_DELAY.gw 30.0 450.0
v__CH_N2.rte -0.01 0.3
v__CH_K2.rte -0.01 500
v__ALPHA_BNK.rte 0.0 1.0
r\_\_SOL\_K().sol 0.0 2000
r\_\_SOL\_AWC().sol 0.0 1.0
r\_\_SOL\_BD().sol 0.9 2.5
2、表格视图(Form View)
修改方案说明:
方案1:v
表示参数由最终值替换
方案2:r(此时min/max范围应为[-1,1])
表示参数由参数初始值×(1+最终值)替换。
方案3:a
表示参数由(初始值+a)替换
输入数据注意事项
- Obsered_rch.txt 和observed.txt里校准数据如果有多个站点,建议起止时间一致,(小于等于simulation运行的时长),并且开始时间应与simulation开始时间一致
- 注意有缺失数据的格式
- SUFI2_extract_rch.def里需要提取的column和reach要确保正确
2.2 运行流程
Step1:建立SWAT CUP工程
1、选择New建立工程
2、选择txtinout文件夹(选择正确的位置才可导入)
选择SWAT版本:
3、选择校准时的模拟方法
(注意不同算法对应的操作界面可能有所不同,以第一个算法SUFI2为例)
- SUFI2:Sequential Uncertainty Fitting version 2连续不确定率定法V2
- GLUE:广义最大似然不确定估计
- ParaSol:参数优化方法
- McMc:蒙特卡罗过程
- PSO:粒子群优化算法
根据需要,选择校准时的模拟方法:
4、命名并选择输出文件夹(自定义)。注意“Project Name”窗口右侧的默认附加名。
程序创建想要的工程目录并复制所有TxtInOut 文件到那里,同样创建名为“Backup”的目录,并复制所有SWAT 文件到那里。Backup 目录文件的参数作为默认参数而不会改变。
点击【Finish】后,弹出以下界面:
工程自动建立完成后,界面如下:
Step2:输入文件参数及数据
1、Calibration Inputs文件夹: 参数信息
- Par_inf.txt file——包含参与最优化的输入参数(优化参数个数及模拟次数)。这个文件需要由用户编辑,例子给出了格式,根据需要来编辑,下面解释了参数设定。
如果提示参数较少,可以通过 Add a new parameter 按钮新增参数。
这里是设置校准参数的地方,需要做的是更改参数并为每个参数设定取值范围,需要注意的是,参数的修改方法有v__, a__, r__三种,分别是赋值,加值,乘以某值(百分比浮动),具体可见说明书。每个参数后面的两个数字别是在下一次模拟中该参数取值的下界和上界,可以根据需要随便赋值,前提是不能超过理论上的最大范围。
注意1: swatcup中的Sol_BD和ALPHA_BNK两个参数不在swat中的自带调参工具中。
注意2: .bsn为后缀的参数,是全流域性质的参数,因此不可以按子流域修改,手动调参的时候不能指定某各子流域改参数,因此在此处填写的时候,不用选流域。 - SUFI2_swEdit.def(算法信息)——分别输入起始与终止的模拟次数,分别为1与n。
- File.cio(SWAT-CUP运行的基本参数)——这是一个SWAT 文件。放在这里是为了方便起见,我们需要从这个文件得到的是模拟的年数和预热期的数目(NYSKIP),以正确地给SWAT-CUP 提供模拟期的起始年和结束年(不包括预热期)。
NBYR:number of year simulated,模拟念书(1970-2020年,共51年)
IYR:模拟的起始年(1970)
IDAF:起始日的年积日(1)
IDAL:结束日的年积日(365,此项如果模拟最终年份为闰年,被4整除,则此项为366,输错可能引起错误)
- Absolute_SWAT_Values.txt(修改参数的上下界)——所有要被拟合的参数应该在这个文件中并加上它们的绝对最小和最大范围。当前大多数但不是所有参数都包括在此文件中。简单地以所显示的格式添加不存在的参数到这里。
此项一般不做修改。
2、Observation文件夹:
下面是3 个包含监测值的文件。监测值对应于output.rch(河道)、output.hru(HRU)和output.sub(子流域) 文件中的变量。不同文件的变量现在可以包括在内,以形成多目标目标函数。只要简单地编辑应用于项目的这些文件,不要担心那些不应用的文件。格式应该与如程序包括的例子显示的格式完全一样。这里可以存在缺测的数据,如例子文件所显示的那样。
- 第一列是模拟时段起始日开始的顺序号(例子中的第4、5 个的数据缺失)。
- 第二列是任意格式,这里是变量名、月份和年份。
- 第三列是变量值。输入的时候注意单位,output的月值单位为cms,实测值应该与其对应。
输入观测数据需要只需要激活rch即可,激活需要点击上方的Rch按钮。针对Observed_rch.txt(河道)文件,格式是:序号(空格)FLOW_OUT_月(日)_年(空格)观测值。
注意,这里的月(日)是指这一年的第几个月(日)。
Number of observed variables,指观测变量个数,如果同时校准多个rch的流量,这里填的是rch的个数。
例如,如果要校正5个出口的流量,这里就写5;如果校正2个流量,2个泥沙,这里就写4。
FLOW_OUT_1,需改后边的数字,改为每个rch的Gis代码。 141,为rch1的实测数据的个数,如果为月值,2年的数据,个数填24。
MATLAB输出相应流量序列代码如下:
clc
close all
clear
%% 基本设置
pathFiles= '.\DataFiles\' ;
%% 导入数据
load('RunoffTaohe.mat');
[nMonth, nStation] = size(RunoffTaohe);
%% 获取径流序号
yearStart = 1970;
yearEnd = 2020;
nYear = yearEnd-yearStart+1;
Q = zeros(nMonth, nStation+2);
Q(:,1:2) = GetYearMonth(yearStart, yearEnd);
Q(:,3:end) = RunoffTaohe;
%% 输出文件 序号(空格)FLOW_OUT_月(日)_年(空格)观测值
for iN=1:nStation
Title = ['FLOW_OUT',num2str( iN )];
fid = fopen([pathFiles,Title,'.txt'],'wt');
for iMonth=1:nMonth
fprintf(fid,'%s',num2str( iMonth ));
fprintf(fid,'%s',[' FLOW_OUT_', num2str( Q(iMonth,2) ), '\_', num2str( Q(iMonth,1) )," ",num2str( Q(iMonth,iN+2) )]);
fprintf(fid,'\n');
end
**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**
**深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**
**因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**
![img](https://img-blog.csdnimg.cn/img_convert/674ee6106cbbcdcfc39846dc20b1d559.png)
![img](https://img-blog.csdnimg.cn/img_convert/2c3f35b84bf14080c89db748eee12c9c.png)
![img](https://img-blog.csdnimg.cn/img_convert/8ec287a7a63e39508e71a55ebd62ff34.png)
![img](https://img-blog.csdnimg.cn/img_convert/56da1b50882da780317888b9f16dc456.png)
![img](https://img-blog.csdnimg.cn/img_convert/6c361282296f86381401c05e862fe4e9.png)
![img](https://img-blog.csdnimg.cn/img_convert/9f49b566129f47b8a67243c1008edf79.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!**
**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**
**如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注:Python)**
ttps://img-blog.csdnimg.cn/img_convert/9f49b566129f47b8a67243c1008edf79.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!**
**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**
**如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注:Python)**
![](https://img-blog.csdnimg.cn/img_convert/5e30c07d7acfd81733b97b6adbbb4e3f.jpeg)