【SWAT水文模型】SWAT水文模型建立及应用第六期: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)
在这里插入图片描述

输入数据注意事项

  • 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
end


%% 调用函数
function Output = GetYearMonth(yearStart, yearEnd)
% 此函数获取年月序号

nYear = yearEnd-yearStart+1;
Year(1,:) = yearStart:1:yearEnd;
yearTemp = repmat(Year,12,1);
monthOfYear(:,1) = 1:12;
monthTemp = repmat(monthOfYear,nYear,1);

Output(:,1)= yearTemp(:);
Output(:,2)= monthTemp(:);

end

输出结果如下:
在这里插入图片描述
3、Extraction文件夹:
有2 类与SWAT 输出文件output.rch、output.hru 和output.sub对应的文件,.txt 和.def。如果你有与这些文件变量对应的监测值,则你需要从这些文件中提取相应的模拟值。
.txt 文件只包含提取值应该写入的文件的名称,而.def 则定义了需要从哪个子流域提取变量。
这些文件相对是不需要解释的。这里再次仅编辑需要的文件。
在这里插入图片描述
由于本案例仅输入河道数据,更改var_file_rch文件如下:
【注意】:这里填写子流域代码时,必须从小到大填写!不按照上下游的顺序!
在这里插入图片描述
更改SUFI2_extract_rch文件如下:

2,变量个数,不是rch的个数,而是变量的种类,不同的rch都输出为flowout,因此变量个数为1;但是如果同时校正流量和泥沙,不管矫正多少个出口,这里都为2.
7,变量所在swat输出文件的列(SWAT输出文件的列与Output的列数两者相差1) 流域的总数量,根据实际情填写;
3,第一个变量,Flow_out,用到的子流域个数,如果选择4个子流域的Flow_out,则填4;
1__3__7,第一变量的子流域的代码,有多个出口,则需在中间隔2个空格; 1990,包括预热期在内的模拟起始年份;
2001,模拟结束年份; 2,模拟的时间步长,1日,2月,3年。

【注意】:这里填写子流域代码时,必须从小到大填写!不按照上下游的顺序!

【总结】:variables和 observed variables的区别
variables:单独的variables意味着变量的种类,种类为流量、泥沙、N含量,是指的类别 observed
variables:是指观测的变量,为流域出口的各种变量的和,一个出口的3种变量则为3,3个出口的1个变量,也为3

在这里插入图片描述

4、定义Objective Function
应该编辑observed.txt 文件。这个文件包含了observed_rch.txt、observed_hru.txt 和observed_sub.txt 文件中的所有信息,加上一些计算目标函数的附加信息。
在这里插入图片描述
同样地,Var_file_name.txt 包含了应该包括在目标函数中的所有变量的名字。这些名字与Extraction 部分var_file_*.txt 中的名字类似。
【注意】:这里填写子流域代码时,必须从小到大填写!不按照上下游的顺序!
在这里插入图片描述

Step2:Executable Files(执行文件)

Executable Files在SWAT-CUP 担任引擎的角色。4 个批处理文件表明应该或不应该运行。

  • SUFI2_pre.bat——这个批处理文件运行预处理程序,现在包括运行拉丁超立方抽样程序。这个文件通常不需要编辑。
  • SUFI2_run.bat——这个程序执行SUFI2_execute.exe,运行SWAT_Edit.exe,提取批处理文件,还有SWAT2009.exe。
  • SUFI2_post.bat——运行后处理批处理文件,运行目标函数计算、新参数计算、95ppu计算、行为模拟的95ppu和无监测值变量的95ppu等程序。
    在这里插入图片描述
  • SUFI2_Extract.bat——这个批处理文件应该包含所有有或没有监测值的提取程序的名字。目前支持6个程序:
    这个文件必须编辑,且不想要运行的程序应该“被注释掉”如下所示:
    在这里插入图片描述
    下一步,编辑过所有输入文件后,就可以执行Calibration中的程序。这一部分中,执行以下3步:
  • Sufi2_pre.bat——这个命令运行Sufi2_pre.bat 文件。在每一个新迭代启动前都必须运行这个文件。
  • SUFI2_run.bat——这个命令运行批处理文件。这个文件在第8 步中做了说明。
  • SUFI2_post.bat——在所有模拟结束之后,这个命令执行第8 步中说明的后处理批处理文件。

所有步骤执行完成后,即可进行下一步,校准输出。

Step3:校准输出

文件说明

  • 95ppu plot——这个命令展示了所有变量的95ppu,也展示了当前迭代的监测值和最佳模拟值。

  • 95ppu-No_Observed plot——这个命令展示了所有无监测值变量的95ppu。

  • Dotty Plots——这个命令展示了所有参数的dotty plots图。这些是参数值对目标函数的图。这些图的主要目的是展示抽样点的分布以及使人明白参数敏感性。

  • Best_Par.txt——这个命令展示了当前迭代的最佳参数(给出目标函数的最佳值)
    在这里插入图片描述
    复制并粘贴到model.in文件中。

  • Best_Sim.txt——这个命令展示了最佳模拟值。

  • Goal.txt——这个命令展示了所有参数组的值以及最后一列的目标函数值。

  • New_Pars.txt——这个文件展示了下次迭代可以使用的新参数的建议值。这些值可以复制和粘贴到Par_inf.txt文件中以作下一次迭代。应该检查新参数中可能不合理的值(比如,负的渗透系数等)。这些参数值应该手动改正。

  • Summary_Stat——这个文件含有通过p-factor和r-factor对比监测数据和模拟带的统计信息和使用R2、NS、bR2、MSE和SSQR的当前迭代的最佳模拟。这些函数的定义可参见另一博客-【水文模型】评价指标。同样展示的还有目标函数类型、当前迭代的最佳模拟编号和当前运行的最佳目标函数值。

Step4:模型检验

要执行SUFI2中的验证,在必要时,编辑验证期的observed_rch.txt、observed_hru.txt、obsrved_sub.txt和observed.txt文件。同样,提取文件和file.cio也得对应是验证期。然后,不用再改变参数,使用校准过的参数范围去做一个完整的迭代(使用calibration按钮)。

参考

1、轻松学会SWAT系列4–基于SWATCUP的参数率定

猜你喜欢

转载自blog.csdn.net/qq_44246618/article/details/130515884
CUP