搭建水文模型,最让人头疼的就是数据不全了,国内能够下载的气象站数据只有温度、相对湿度、风速和降雨,而且还全都是日值。而更为不幸的是,我最近在用的DHSVM模型需要的是小时值,而且还需要短波辐射和长波辐射数据。如何有效利用现有的气象站数据为水文模型做输入就成为我迫切要解决的问题。方法可能有很多,我这里实现了一个解决方案:利用VIC模型来进行插值转换。
题外话:按理说,VIC模型和DHSVM模型与华盛顿大学都渊源很深,可是VIC模型中有相应的插值模块,但是DHSVM中却没有。
VIC的插值算法大体是(可能我的表述不够准确):
(1)首先VIC利用每日平均气温和平均相对湿度估算出每日平均水汽压,在与每日最高温度和最低温度数据以及每日降水数据一起作为输入,使用蒙大拿大学开发的MT-CLIM模型,算出每小时短波辐射 。同时,会算出逐小时云量(后面会用到)
(2)根据上一步算出的每小时短波辐射判断出每日最高温度和最低温度时刻,建立Hermite多项式,保证在最低和最高时刻的一阶导数为0(从而保证了最低温度和最高温度与输入一致),插值得到逐小时的温度。
(3)VIC自身会通过经验公式,利用逐小时的温度和逐日的相对湿度计算逐小时的水汽压,然后利用逐小时的云量、温度和水汽压直接算出逐小时的长波辐射。
以上,是在我详细查看了VIC相关源码的基础上做的一点总结,可能不够准确。
在了解了VIC的工作原理之后,需要做的就是编写相应的接口程序来调用VIC的相应模块生成我们所需要的结果。而且,最好不要修改VIC的源码。所以,我就花了些时间,编写了一个 调用程序(源码贴在后面),没有改动VIC的源文件,只需要将我写的代码文件与VIC的源码文件一起编译即可。
它的使用方法是:
(1)有六个可选项,分别是,”temp”, “prec”, “srad”, “lrad” , “rh”, “wind” ,表示,你希望程序输出温度、降水、短波辐射、长波辐射、相对湿度或者风速。可以多选。如果要计算长波辐射、逐小时温度或者短波辐射,那么需要准备的输入数据是:逐日的降水、相对湿度、最高温度、最低温度和平均温度。如果要计算逐小时的降水,则只需要逐日的降水数据即可。实际上,此程序只会计算短波、长波和温度,其余变量只是简单的平均或填充一天。
(2)此外,用户还需要设置一些必要的参数,程序会在当前目录下寻找一个名为“parameter.txt”的文件,该文件内容如下:
annual_prec 383.96
elevation 4432.4
slope 0
aspect 0
ehoriz 0
whoriz 0
StartYear 2000
StartMonth 1
StartDay 1
latitude 28.58
sw_prec_thresh 0
mtclim_swe_corr 0
have_vp 1
其各项的含义如下,
annual_prec :年平均降水量(mm)
elevation : Site elevation, meters
slope : Site slope, degrees
aspect : Site aspect, degrees (0=N,90=E,180=S,270=W)
ehoriz :Site east horizon, degrees
whoriz :Site west horizon, degrees
StartYear :起始年
StartMonth:起始月
StartDay:起始日
latitude :Site latitude, degrees (- for south)
sw_prec_thresh:Minimum daily precipitation [mm] that can cause “dimming” of incoming shortwave radiation
mtclim_swe_corr :TRUE = correct MTCLIM’s downward shortwave radiation estimate in presence of snow
have_vp :1表示用户提供水汽压数据,0表示使用本程序计算水汽压注意: 通常,slope、aspect、ehoriz以及whoriz这四项是未知的,我查阅了VIC的源码,其在计算时,都是简单地设定为0,如下
因此,我在案例中也将这四项全部设为0,至于这四项具体影响有多大。进过简单测试,slope的影响很大,aspect几乎没有影响。slope为0应是假定没有地形影响,以这样的数据再在DHSVM中进行全流域distibute可能会更加合理。
我编写的源码如下:
注意:一个可行的编译运行方法是,下载VIC源码,并解压,将下面的代码复制到名为“vic_invoke.c”的文本文件中,并移动到解压后的目录。Linux下,输入命令:gcc vic_invoke.c Svp.c mtclim_wrapper.c mtclim_vic.c Vicerror.c Close_files.c Nrerror.c Compress_files.c Calc_air_temperature.c Calc_longwave.c -o vic_invoke -Wall -g -I . -lm即可顺利编译,然后./vic_invoke [option]运行。
如果要在windows下运行该程序,可下载安装MinGW,然后将下面源码中的LINUX宏设置为0,然后切换目录到VIC文件夹下,输入同样的编译命令即可生成win32可执行程序。
windows下直接运行,会弹出如下界面
Continue Reading →