汇流程序的数据准备
前面说过VIC作为分布式水文模型,其功能只有计算产流量而无法给出汇流量,于是要进行汇流操作得用Dag Lohmann研发的一个汇流模型程序进行,其名为Routing,编程语言为Fortran,使用单位线进行坡面汇流以及线性圣维南方程进行河网汇流,输入数据为VIC的输出文件,流域的水系流向信息,以及你想得到模拟的径流量数据的若干个流量站或者流域出口的位置,输出为逐日和逐月的此站点模拟的径流量数据。
汇流程序运行的原理
汇流程序用法跟VIC一样,也是需要准备一些文本文件格式的数据文件和一个输入参数文件来记录这些数据文件的位置和一些参数,然后也是先make
编译,然后输入./rout
后面带上输入参数文件的路径来运行。具体必须的输入文件有:
- 输入参数文件。相当于VIC的全局参数文件。
- 流向文件。这是一个栅格文件,也是最核心最重要的文件,记录流域内每个网格所流向的下一个网格。其实不单单是流向,汇流程序需要的流域的网格大小、经纬坐标、流域形状等信息都是从这儿获得的。
- 站点文件。记录流量站的名称和位置。
- 坡面汇流单位线文件。这个可以直接拿示例stehekin的来用。
然后这些是可选文件:
- 流速文件。也是栅格文件。不过流速之类的参数都不好弄到,所以可以只用一个单一值代替。这个值和下面的水力扩散值以及坡面汇流单位线是可以率定的。不过根据官网文档关于率定的部分所说,对于大尺度、逐月的汇流计算,由于要求精度较低一般不需要率定,根据前人的研究此时可以采用一个单一值1.50。
- 水力扩散文件。同上,可用单一值800。
- Xmask文件。栅格文件。其实不太清楚为啥叫这个名字,官网文档的一行小字解释这其实就是流程数据,记录的是每个网格中心到其流向的下一个网格中心的距离,对精度要求不高设定为一个单一值也可以。我将其解释为流程文件。
- fraction文件。记录的是每个网格实际产流量的比例,详细解释看下文。我将其解释为产流比例文件。
- 站点单位线文件。后缀名
.uh_s
,一个站点一个,记录的是流域内每个网格对流域出口也就是站点位置的单位线。刚开始用汇流程序的时候不需要这个文件,因为汇流程序可以生成,详见下文。
程序运行的流程是这样的:
- 汇流程序首先会读入输入数据文件获取各项参数(废话);
- 然后读入各种栅格文件的数据和坡面汇流单位线数据;
- 然后打开站点文件,读入第一个站点的信息,比如站点名、位置;
- 根据流向文件的数据找出最终会流入这个站点的所有网格(即站点控制的流域内的所有网格)并记录到列表;
- 如果该站点信息的站点单位线文件路径不为“NONE”则到第6步,否则到第7步;
- 根据此路径读取站点单位线数据,然后到第8步;
- 利用流向、流速、水力扩散和流程数据和坡面汇流单位线数据使用Dag Lohmann的方程计算出站点单位线数据,并保存到文件以供下次直接使用;
- 从第4步得出的网格列表打开第一个网格对应的VIC输出文件,读入产流数据;
- 根据产流比例数据和站点单位线数据计算出此站点对流域出口的径流量并加到站点的总径流量上;
- 如果还有没计算完的网格则回到第8步拿下一个网格继续;
- 输出该站点的径流量序列(包括逐日和逐月的径流量(立方英尺每秒)和径流深(mm)表示的数据);
- 如果站点文件还有下一个站点则读入下一个站点的信息然后回到第4步;
- 收工。
说白了就是假设每个网格的产流对流域出口径流的贡献互相独立,先是生成一套网格产流对出口径流的单位线,然后拿这套单位线和网格产流量做汇流计算,而且这两个步骤是可以分开的。
关于输入参数文件
内容比较简单,不过需要注意的是汇流程序的健壮性实在不咋地,最好是复制示例的输入参数文件rout_input.STEHE
对原文进行修改,信息的顺序也不要改,甚至注释也不要增删。因为我看到源码就是简单粗暴的跳过一行读取一行来读取信息的…
内容自翻如下:
# 这行不要删。
# 流向文件的路径。
/mnt/aww/ohio/route/rout_data/oh.flow
# 流速文件。如果有就改为.true.然后下一行改为文件路径,没有就如下设定一个单一值。
.false.
1.5
# 水力扩散文件,同上。
.false.
800
# 流程文件Xmask file,同上。
.true.
/mnt/aww/ohio/route/gen_mask/kanawha.xmask
# 产流比例文件fraction file,同上。
.true.
/mnt/aww/ohio/route/rout_data/oh.fract
# 站点文件。
/mnt/aww/ohio/route/run/oh.stnloc.kanaw
# VIC输出文件的路径和格式,以及文件名坐标保留的小数位数。这个应跟VIC的设定对应。
/mnt/aww/ohio/vic_ohio/results/fluxes_
4
# 输出文件的路径。
/mnt/aww/ohio/route/rout_out/kanaw/
# 第一行是进行汇流计算的时间段,第二行是实际输出到文件里的数据的时间段。
1990 1 1996 12
1990 1 1996 12
# 坡面汇流单位线文件。可以用stehekin提供的。
/mnt/aww/ohio/route/rout_data/oh.uh_all
关于流向文件
把官网的样例搬过来:
ncols 22
nrows 20
xllcorner -97.000
yllcorner 38.000
cellsize 0.50
NODATA_value 0
0 0 0 5 5 5 6 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 4 0 4 0 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 5 3 5 5 6 7 5 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 5 4 0 5 5 5 5 6 7 5 5 5 7 5 0 0 0 0 0 0
0 0 5 4 0 5 4 5 5 7 7 5 6 7 5 6 0 0 0 0 0 0
4 0 5 7 4 0 3 5 5 7 5 5 7 4 5 6 0 0 0 0 0 0
4 0 3 4 0 4 0 4 3 5 6 7 7 4 5 6 0 0 0 0 0 0
0 4 0 4 0 3 1 2 4 0 4 5 7 5 5 0 0 0 0 0 0 0
0 0 3 4 3 1 8 4 5 4 0 5 5 3 5 6 5 0 0 0