VIC水文模型入门攻略(上) 将VIC跑起来

本科水利狗一枚,正在跟老师做水利信息化方面的项目,VIC是玩的第一个水文模型,边啃官方文档边学其他周边东西边不断鼓捣解决问题终于成功使用。

仅面对于需要使用VIC但是不怎么了解计算机的广大水文水利研究人员。

由处于水文学和计算机两边不靠的交叉学科的两边半桶水的作者所写,所以还请两边的大牛和蔼指正莫冷嘲热讽。


VIC是啥

先简单介绍下(我所了解的)VIC水文模型。

VIC水文模型,全称Variable Infiltration Capacity Macroscale Hydrologic Model,可变下渗容量大尺度水文模型,是一个开源的,基于水量热量平衡、物理动力机理的概念型大尺度分布式水文模型,由梁旭教授带头开发,华盛顿大学、普林斯顿和加伯等高校维护更新,编程语言为C语言,交互方式为控制台输指令。

模型输入为文件形式的研究区域下垫面参数(土壤的理化、水力特征以及地表覆盖参数),以及区域内研究时间段内历时(逐日或者逐若干小时)的气象数据,输出为模拟的区域内研究时间段内历时的土壤含水量、蒸散发量、产流量等数据(要是提供参数齐全还能计算净初级生产量这些数据,确实强大)。

VIC官网主页 http://vic.readthedocs.org/en/master/,源码所在 https://github.com/UW-Hydro/VIC

VIC适用于范围较大的区域(东江流域到德州大小),思想为将研究区域栅格化,即将区域划分为若干行若干列网格状的,边长为1km到经纬度0.5度的正方形单元区域,每个网格拥有各自的下垫面参数和气象数据,各自独立进行计算。这也就是所谓的大尺度、分布式。

从而VIC得出的也只有各网格的产流量而没有汇流量。想要流域出口流量还得使用配备给VIC的汇流程序计算。汇流程序在https://github.com/UW-Hydro/VIC_Routing

VIC假设在纵向土壤分为若干层,默认设定同时最常用的也是为3层土壤(原本VIC设定为两层土壤,后来为了更好的考虑土壤蒸散发在上边加了10cm厚的一薄层)。土壤顶部为若干种土地覆盖,VIC要求给出每种土地覆盖类型面积(林地、耕地等)占网格面积的比例,剩下没占完的面积则认之为裸地。

VIC的运行过程:将研究区域从左到右、从上到下挨个网格计算,网格间互不影响,网格内挨时间步(逐日或者逐若干小时)计算,上一个时间步的计算结果作为下一个时间步的初始数据进行下一步计算。算完某网格研究时间段内全部时间步之后输出该网格的模拟结果数据并计算下一个网格,全部网格计算完后收工。

运行VIC需要的东西

工具:

  • 能跑VIC的环境;
  • 地理信息管理工具(比如ArcGIS,用来进行研究区域的地理信息处理比如网格划分,一些重采样操作,提取水系etc);
  • 数据分析处理工具(用来处理、分析VIC输入、输出的数据,生成VIC要求格式的文件等。可以是R,matlab,python,当然你喜欢用excel、C++都行);

数据:

  • 研究区域的地理信息数据(流域边界矢量图形,DEM等,最起码研究区域的位置、大小要有吧)
  • 气象历时数据,包括气象站点坐标;
  • 水文测站数据,比如流域出口流量、或站点土壤含水量等(率定用);
  • 研究区域的土壤和植被参数(后面讲);


VIC的运行环境

先说下我目前使用的环境和工具:Ubuntu(linux的一个发行版)15.10,R3.2.3+RStudio,win7下的ArcGis10。

如果你用的是linux系统

那么这部分就没什么可以说的了,可以直接跳过这里。

如果你用的苹果的Mac os系统

安装了命令行工具之后其余同linux(估计不会有这种情况所以一笔带过了)。

如果你用的windows系统

对于广大对计算机知识不太精通的水利水文人员,这里得好好说说,了解的话跳过就是。

VIC用C语言编写(汇流程序用的Fortran),仅仅就是个程序,也就是说只能在控制台上跑,不像swat那样有windows下图形界面的版本,并且VIC一开始并不是设计为在windows系统上运行的,而是在linux系统或者其他unix系系统上。这对于少于接触linux(甚至不知linux为何物),缺乏编程知识,对于C语言编程的认识大多数仅限于微软VC的水利水文人员来说这确实是一道不低的门槛。这也就是VIC相对小众不像swat那样泛滥的原因。

到这里可能一些(水利的)同学会问,我学过C的,我程序就是用windows上的VC写的,VIC也是C写的为啥就不能直接放windows上跑?笼统来说,世界上C\C++的开发环境有两大派系,一支就是微软旗下闭源的,VisualStudio为主的各种visual打头的开发环境,代表是我们熟知的VisualC++,简称VC(众多高校编程课就是拿着个教学生的),这也是windows上唯一“合法”的开发环境;

另一支则是开源组织GNU发展起来的开源的,以gcc编译器为代表的开发环境,广泛应用于各类unix系操作系统,比如linux和苹果的Mac OS。两大环境的发展虽然都遵循了相关标准规定,但其互相独立各自发展,依赖库、API等也不大相同,甚至语法和编码风格都有微妙的区别。

而VIC正是在后者即GNU的环境中开发的,直接搬到windows上自然水土不服。(其实windows下没有专门开发C语言的工具,VC是开发C++的,虽然也能运行C语言)

要在windows下运行VIC可以用的方法:

  • 开虚拟机。比如vmware开个linux的虚拟机,然后在此linux上跑VIC,简单粗暴。
  • 修改VIC源码。反正VIC源码开放,熟悉C编程的可以改写其相应的库函数使之能在windows下能跑。国内有开发数据同化系统的用了这种方式。
  • 使用Cygwin。这是官方推荐的方法。Cygwin是一个用于windows上运行的unix的虚拟机,也就是营造一种unix的环境,使用的库仍然属于是unix环境的,本质上跟第一种方法差不多。Cygwin安装后为一个控制台界面,使用起来跟linux的终端差不多。当然编译出来的VIC执行文件也只能通过Cygwin运行。
  • 使用mingw。相比上一中我更推荐使用这一种。mingw全称为minimalist GNU for windows,可以理解为专为windows配备的GNU环境。与上一种这种方式是将源代码编译成可以直接在windows下运行的执行文件,可以通过windows的cmd控制台操作。mingw下载地址 http://sourceforge.net/projects/mingw/。配置方法也是满天飞了,比如这个http://jingyan.baidu.com/article/455a99509c76d8a1662778f6.html


VIC的编译和运行

从上面的链接下载下来的VIC是一个压缩包,里边的src文件夹里面是VIC源码,另外docs里边是说明文档,samples是样例(不过不能跑),tools是一些周边工具。

以linux环境为例,先将源码解压到某个文件夹,比如 /home/user/VIC/src/ 。(用过linux都应该知道linux下是没有c、d、e分区的,根目录路径就是“/”,用户文件放在/home/user/下)

然后就按Ctrl+Alt+T打开终端,在终端中进入源码所在的文件夹,输入:

cd  /home/user/VIC/src

以上目录应为你实际解压的地址。往后同。

接着编译VIC源码,输入

make

如无意外经过一段时间的编译过程源码的文件夹最后会出现一个可执行文件vicNl(含义是VIC N layer)。这个就是VIC程序本体。

此时可接着输入

 ./vicNl
如果显示
Usage: ./vicNl [-v | -o | -g

之类的内容,说明编译成功了。

输入./vicNl -v 为查看版本,如果是 -o为显示编译时设置,如果是 -g 后面带上文件路径,则是运行VIC。

其实无论是linux还是windows,在控制台、终端中输入的命令,都是运行某些默认路径内的执行文件,比如linux下是/bin 以及/usr/bin。所以要运行VIC在终端中还得带上全套的路径名,比如/home/user/VIC/src/vicNl,或者进入其所在文件夹中后输入./vicNl,“./”含义是当前文件夹。

当然最好是把vicNl这个执行文件拷到那些默认目录中(linux需要权限),这样无论什么情况都可以直接输入vic来运行。


运行示例

编译成功之后就可以运行示例数据玩玩了。话说上面下载的压缩包里的samples里面只是一些输入输出文件的简单格式示范而已,不能用来试运行(我觉得不算真正意义上的sample)

所以我们通常会使用这个另外下载的示例:stehekin。研究区域是华盛顿州奇兰湖东北的风光旖旎的斯特希金(Stehekin)山区。

其在此:ftp://ftp.hydro.washington.edu/pub/HYDRO/models/VIC/Datasets/vic.sample.stehekin.tgz

更多的一些样例和数据都在这里 http://vic.readthedocs.org/en/master/Datasets/Datasets/


下载下来之后是一个压缩包,例如将其内容解压,比方说解压到/home/user/stehekin/中。里边的内容比较完备,既有VIC的又有汇流程序的。其中forcing文件夹里面是气象驱动数据文件(原名meteorological forcing files,许多资料翻译成气象强迫、气象迫使,听之略蛋疼,我个人任性唤为气象驱动)。

params/vic 里面是VIC的参数文件,包含几个全局参数文件样例和土壤、土地覆盖和植被库参数文件。

results/vic 里边是vic输出文件的样例。


编辑params/vic里面的global_param.STEHE文件,将所有./stehekin/替换为/home/user/stehekin/,也就是你实际解压的地址。(#号后面都是注释可以无视)

然后打开控制台输入

/home/user/VIC/src/vicNl -g /home/user/stehekin/params/vic/global_param.STEHE

或者控制台先进入/home/user/VIC/src/再将前半段改为 ./vicNl

如无意外则此样例即可跑起来了。

运行完毕后可以看到params/results/vic/default/里面的文件修改时间为不久前。


输出内容大概如下。(下图是我在win7下用mingw运行的,不过除了路径不同其他内容应该一致)

VIC水文模型入门攻略(上) 将VIC跑起来_第1张图片


汇流程序的运行

附带说下汇流。汇流程序同样需要经过编译再运行。将上面下载得到的汇流程序的压缩包解压,比如解压到/home/user/VIC_Routing/,则源码在/home/user/VIC_Routing/src中。

编译源码目录下的makefile文件,找到 FC=g77这行并改为FC=gfortran

然后终端进入源码目录并编译。

cd /home/user/VIC_Routing/src
make

接着到stehekin/params/rout文件夹里面的rout_input.STEHE文件打开,同上将所有./stehekin/替换为/home/user/stehekin/

然后打开STEHE.stnloc文件,将./stehekin/params/rout/STEHE.uh_s改为none

打开终端,输入

 /home/user/VIC_Routing/src/rout /home/user/stehekin/params/rout/rout_input.STEHE

如无意外则汇流程序跑起来了。

运行完毕可在stehekin/results/rout/default文件夹里查看模拟得的流量数据。


关于VIC的配置和输入文件准备详见下篇...

你可能感兴趣的:(水文模型,水利信息化,VIC,分布式水文模型)