⑴ 源汇项数据整理
一、计算网格的剖分
根据模块化三维有限差分地下水流动模型计算软件的特点,为了更好描述在表高程、水头边界、汇源项,在平面上将计算区按每个单元均是边长为800m的正方形进行剖分,共剖分成154 048个单元(图4-6),其中有效计算单元61 588个,总面积为39 416.32km2。其中,一类边界(河流)单元格数2 581个,所占1 651.84km2;三类边界(沼泽湿地)单元格数5 145个,所占面积3 292.80km2(见表4-1)。
表4-1 工作区行政分区计算面积统计表
续表
图4-2 三江平原第一层含水层参数分区图
图4-3 三江平原第二层含水层参数分区图
图4-4 三江平原第三层含水层参数分区图
图4-5 三江平原第四层含水层参数分区图
图4-6 三江平源计算区剖分图
二、垂向补排量
在模型中,垂向补排量由下式确定:
三江平原地下水资源潜力与生态环境地质调查评价
式中:P为地下水垂向补排强度,m3/d;q边为二类边界补给强度,m3/d;q降水为降水入渗补给强度,m3/d;q回归为渠灌水田回归入渗补给强度,m3/d;q开采为地下水开采强度,m3/d。
(一)二类边界补给强度
二类边界系指平原与山地接壤地段地下水自山地地区向平原区径流的侧向补给量。因此类边界上地下水动态监测资料较少,将其概化为垂向补给强度,即山地周边计算单元格的垂向补给强度中含二类边界补给强度。同时,根据二类边界含水层特征,将二类边界概化为河谷与山地两类,其补给强度为常量,并取区域径流补给强度,山区河流出山口地段河谷区地下水径流补给强度为0.03m/d;山地区地下水径流补给强度为0.006m/d。计算时,根据山地周边计算单元格的类型确定其二类边界补给强度,加入至该计算单元格中。
(二)降水入渗补给强度
因工作区内存在季节性冻土,每年的11月初至翌年的4月末地表冻结,此时的降水不能补给地下水,从而确定每年的5~8月降水量为入渗补给地下的有效降水量。选择与地下水动态观测资料同步的工作区及相邻地区气象站和雨量站有效降水资料,绘制逐月的降水量等值线图,进而确定各单元格的有效降水量。
降水入渗补给强度按下式计算:
三江平原地下水资源潜力与生态环境地质调查评价
式中:P为月平均降水量,m/d;α为降水入渗系数。
降水入渗系数的大小,主要取决于表层土岩性特征,根据表层土岩性的不同,将降水入渗系数划分为好、较好、较差、差4个区(见图4-7)。具体由计算模型识别确定。
(三)渠灌水田回归入渗补给强度
渠灌水田回归入渗补给强度按下式确定:
三江平原地下水资源潜力与生态环境地质调查评价
式中:q渠灌为渠灌用水量强度,m3/d;α回归为灌溉水回归系数。
1.渠灌用水强度
根据《黑龙江省行业用水定额(试行)》中水稻节水灌溉定额(P=75%),结合工作区表层土岩性,确定不同地段灌溉水回归系数与渠灌用水强度如表4-2。回归系数分区见图4-8。图中的水田分布系根据“卫片解释”成果及地面调查、收集水利资料等确定。
表4-2 渠灌用水强度表
按公式(4-9)及计算区渠灌水田面积确定的2001年全区渠灌水田回归量为60 373.74×104 m3/a。各行政区计算成果见表4-3 。
图4-7 三江平原表层土岩分区图
图4-8 三江平原水田回归系数分区图
表4-3 渠灌水田回归量计算统计表
续表
续表
2.用水分配
根据《农业技术经济手册》,结合工作区气象条件,确定不同时间水田灌溉用水强度如表4-4,以此确定计算期内各时段(5~8月)灌溉水回归补给强度。
表4-4 渠灌水田灌溉用水强度逐月分配表 单位:m·a-1
(四)地下水开采强度
计算区内地下水开采强度依据本次调查资料(表4-5)。其中井灌水田开采量根据实际调查面积和表4-2中净灌定额确定,渠系水利用系数取0.95,而井灌水田回归量与地下水开采量间为重复利用关系,故井灌水田开采强度按净灌定额除以渠系水利用系数确定。
表4-5 年均地下水开采现状调查统计表
续表
井灌水田开采地下水强度的逐月分配见表4-6。而工业及生活用水开采地下水平均分配至计算期各时段上。
表4-6 井灌水田灌溉用水强度逐月分配表 单位:m3·a-1
2001年5月~2002年4月计各行政区地下水开采强度见表4-7。
表4-7 2001年5月至2002年4月开采强度分区统计表
续表
续表
三、地下水蒸发
模型中地下水蒸发量按下式确定:
三江平原地下水资源潜力与生态环境地质调查评价
式中:QE为地下水蒸发强度,m/d;Q0为地下水最大蒸发强度,m/d,即地下水位临界地表时的蒸发强度,取气象观测资料中的水面蒸发强度;h为地下水位高程,m;hE为地下水蒸发达到最大时的地下水位高程,m,即地面高程;dE为地下水蒸发极限深度,m,与表层土岩性有关,其分区与表层土岩性分区相同(参见图4-7),具体大小由模型识别确定。
因区内气象站较少,选取地下水最大蒸发强度时,取计算时段各表层土岩性分区各月的平均值。同时,根据计算区存在季节性冻土的特征,每年的1~4月份及11~12月份地下水蒸发强度为零。此外,水田种植区灌水季节(5~8月)地下水无蒸发。模型识别时段内各月地下水最大蒸发强度见表4-8。
表4-8 2001年5~10月地下水最大蒸发强度表单位:m/d
⑵ 两种水文模型在窟野河的应用与比较
6.2.4.1 水量平衡模型的应用
水量平衡模型选月为计算时段,主要输入月降雨量、月蒸发量,输出月径流量,因此称为月模型。该模型以质量守恒原理为理论基础,结合流域土壤含水量,将各个水文过程或变量之间的关系通过表达式来模拟的流域水文过程。月水量平衡模型有2参数月水量平衡模型、3参数水量平衡模型和5参数月水量平衡模型。2参数水量平衡模型是针对中国南方湿润或半湿润地区,提出和建立的2参数模型模拟径流和土壤湿度过程。窟野河流域属于干旱半干旱地区,冬季干旱少雨,部分月份降雨为零,因此,选用改进的两参数的水量平衡模型进行编程计算。当降雨为零时,月径流量与土壤含水量的关系;降雨不为零时,月径流量与土壤含水量的关系。
(1)基于VB下月水量平衡模型参数率定和计算程序的编写
Visual Basic(简称VB)是美国微软(Microsoft)公司沿用Basic语言在Windows环境下开发的一种可视化程序设计语言,适合于面向对象的软件开发。Visual Basic语言却不同,它是非过程式的设计语言,具有以下优点:
a.是目前最容易学习的一种面向对象的、可视化的程序设计语言。
b.将程序和数据封装在一起视为一个对象,提高程序设计的效率,代码设计针对对象,没有复杂的程序流程。
c.开发出了功能强大的Active控件和对象,实现图像、声音、动画等多媒体功能。
d.可方便的与AutoCAD, Microsoft Access等实现无缝集成。
e.在计算速度、代码效率上,最新版本的Visual Basic语言并不比其他开发语言逊色很多。
根据月水量平衡模型的基本理论,在参数率定时,需对数据迭代运算。为避免采用人工试错法层层迭代计算的烦琐、费时及计算精度又低,基于VisualBasic程序设计语言,编写了月水量平衡模型的参数率定程序和计算程序,既提高了效率也提高了计算精度。
1)VisualBasic语言程序编写的流程图。本节在进行月水量平衡模型模拟计算时,借助VisualBasic程序设计语言进行编程,然后将率定期年份的降水量、蒸发量、径流实测值输入EXCEL表格中,在率定程序界面中直接调用EXCEL表格,进入程序运算,选取最优参数,将最优参数代入计算程序,计算模拟径流值(图6.23)。
图6.23 程序流程图
2)程序的界面(图6.24、图6.25)。
图6.24 参数率定程序界面
图6.25 计算程序界面
(2)径流模拟
用月水量平衡模型对窟野河流域进行模拟,降水量选取王道恒塔站以上流域内8个雨量站和新庙站以上流域内7个雨量站及温家川以上流域内11个雨量站序列资料,径流选取王道恒塔、新庙和温家川3个站的月流量资料,蒸发站选取王道恒塔、新庙、温家川的月蒸发皿观测资料。模拟结果见表6.16,包括率定期和检验期Nash和Sutcliffe模型效率系数RNS、多年平均相对误差Re及极值模拟相对误差Remax。从表6.16中可以看出,该模型模拟精度较高,率定期和检验期的RNS分别为77.0%、75.5%。Re和Remax较小,图6.26~图6.28绘出王道恒塔站、新庙站和温家川站模拟与实测月径流过程线。
表6.16 模型参数及模拟结果
图6.26 王道恒塔站(1969-01~1983-12)径流量过程线
图6.27 新庙站(1969-01~1983-12)实测径流量与模拟径流量过程
图6.28 温家川站(1969-01~1983-12)实测径流量与模拟径流量过程
从表6.16中可以看出,率定期和验证期的月径流模拟Nash和sutcliffe效率系数RNS值均在65%以上,平均相对误差为4.9%、6.03%,也均控制在10%以内,极值误差为6.9%,控制在20%以内。从图6.26~图6.28可见,该模型模拟月径流过程与实测径流过程吻合较好。对于春汛3月份,由于气温回升,受冰川径流的影响,结果显示实测值与模拟值相差比较大,一般为实测值较大,模拟值较少。
6.2.4.2 VIC模型的应用
(1)VIC模型程序运行
VIC模型的运算程序是由美国华盛顿大学开发的一个用C语言编写的庞大而复杂的程序,它由200多个子程序组成。目前,VIC模型将土壤定义为三层。但在程序运算中,将土壤设计为N层,可以进行多层模拟,这有利于模型的拓展。程序的核心部分是能量和水量平衡的计算。主要包括蒸散发计算,直接径流和基流计算(图6.29)。
图6.29 VIC模型程序计算过程图
程序是按网格进行计算,在水量平衡模拟之前,先要对降水的分配进行处理,确定有降水的面积比例系数A,来计算土壤湿度。如果第一个时段没有降水,A取1;如果第一个时段有降水,A由降水强度来确定。当有新的降水发生或者降水强度改变时,A改变,基于此,在计算降水分配之前要均化土壤湿度成分,重新分配土壤湿度、植被截留和干湿比例参数。同时,程序对于每个网格的初始数据也要进行写入,主要包括每个网格的信息、站点信息、土壤热量节点深度、土壤热量节点温度、植被类型、网格定义信息、土壤湿度等。
在模型中,蒸散发计算主要包括冠层湿部蒸发、植被蒸腾和土壤蒸发。运用PenmanMonteith联合方程计算日蒸发,其中需要计算的有阻抗因子、植被阻抗、基于平均温度的基准高度。各种植被类型的蒸发、蒸腾和透雨量的计算模块中,主要包括以下几个子程序:
1)计算植被截留的蒸发。其中若时段为日,蒸发包括当前降水;若时段小于日,蒸发不能超过当前蓄水。
2)计算植被的蒸发蒸腾水分损失总量。
3)计算上下层土壤湿度,主要是用来判断土壤的湿度和根系比的相互影响。当每层土壤湿度都大于W0(不被土壤湿度影响的蒸腾临界值),或湿度和过半的根系超过W0时,潜在蒸发不受土壤干燥程度的影响;若土层中有不到一半的根系小于W0,额外的蒸发则由较湿润的土层提供。对于由深层土壤湿度引起的蒸发蒸腾水分损失总量,独立于各土层之外进行计算。
4)检查蒸发蒸腾水分损失总量是否导致土壤湿度降至凋萎含水量以下。土壤蒸发计算模块中,在饱和地区按照潜在蒸发能力进行计算;在部分饱和地区按照潜在蒸发能力的百分比进行计算;裸土蒸发只计算最上层。土壤临时渗透率根据土壤湿度计算。
模型程序中对于产流的计算主要包括地表径流及基流。首先需要设置残留含水量,计算基于上层土壤含水量的径流;对于地表径流只计算上层,以小时为步长计算各层之间的渗流。在计算当前土壤含水量时,要对照最大、最小含水量,确定计算值应在二者之间。基流通过Arno模型计算。
VIC模型的运行环境为UNIX工作站,所以本研究采用在 Windows下虚拟UNIX环境的方法,在虚拟的环境下运行VIC模型,编写输入输出控制程序,并调用VIC模型。VIC模型的程序来源于University of Washington网站上共享的程序源代码。
(2)VIC模型文件的输入、输出
VIC模型通过网格化来考虑每个网格单元的植被覆盖类型、降水的空间分布不均以及土壤特性对径流的影响。本研究采用10km×10km网格对研究流域进行划分。模型在每个网格上独立运行,因此参数文件、数据文件以及输入、输出文件需按网格来准备。其中,输入文件主要包括植被数据文件、土壤数据文件、气候背景数据文件以及运行控制文件和汇流文件。
本研究只针对VIC模型进行水量平衡的模拟,不计算除蒸散发外地表的能量通量,忽略了地面热通量过程,在耦合了汇流模型之后,就可以输出控制站的年、月、日径流量以及其平均值。在准备了以上的VIC模型输入文件以及控制文件后,就可以运行VIC模型并耦合汇流模型对研究流域进行径流模拟。
(3)模拟结果
根据地理位置、下垫面条件和气候特点,对窟野河流域王道恒塔站和新庙站及温家川站采用VIC模型进行模拟,以Nash和Sutcliffe效率系数和相对误差作为目标函数进行率定。通过试验模拟,在得到模拟结果的同时,也率定得到了模拟流域的最优参数(表6.17)。图6.30~图6.32则描述了研究流域模拟结果的月径流过程。表6.18给出了流域基本信息及径流模拟结果。
表6.17 模型率定的最优参数值
表6.18 流域基本信息和径流模拟结果
注:Er为模拟相对误差,Ce为月流量的模拟效率系数。
从模拟结果可以看出:VIC模型在窟野河流域适用性较差,评价标准多年径流相对误差Er基本控制在6%以下,其中温家川站最小,Er为1.11%;对于反映流量过程吻合程度的Nash-Sutcliffe系数Ce,其日流量过程模拟结果都较差,月流量过程模拟结果在60%~65%之间。从图6.30~图6.32可见,VIC模型在窟野河流域的降雨径流模拟较差,少数峰值误差较大。
图6.30 王道恒塔站月径流过程模拟结果
图6.31 新庙站月径流过程模拟结果
图6.32 温家川站月径流过程模拟结果
在现阶段水文模型发展趋势下,很多水文模型在干旱半干旱地区的使用一直是水文学者面临的挑战,VIC模型虽可以在干旱半干旱地区应用,但适用性比较差,特别是月径流模拟。据分析可能有以下几方面的原因:
1)窟野河流域站点日降水量资料欠缺,且已有的站点日降水量资料质量也不高是该模型在窟野河流域模拟效果较差的主要原因。
2)VIC模型复杂的结构和庞大的参数系统,使模型在模拟水文过程时,各相关物理过程存在很多不确定性,这也是原因之一,并且这是目前分布式水文模型在干旱半干旱地区应用普遍面临的难点。
3)参数不确定性带来的误差。尽管在VIC模型中各种参数已赋予了明确的物理意义,并充分反映各种物理过程,但由于技术水平有限,以及对参数物理意义认识存在缺陷。因此,在确定参数时,虽运用了一些概化、均化公式计算的方法,但还是对模型的模拟结果造成了影响。
4)由于本模型模拟的时间尺度和空间尺度比较大,缺乏更详细的实测资料,必然会对模拟结果的精度产生一定的影响。如果有条件采用更小尺度的实测资料,会提高模拟的精度,这也需要今后做更深入的研究。VIC模型没有考虑人类活动对径流的影响,这样造成的误差也是不可避免的。
(4)流域水文模型的应用情况分析
基于物理机制的分布式水文模型可变下渗容量(简称VIC)模型和概念性集总式月水量平衡模型都在窟野河流域分别做了应用,其效果表明:月水量平衡模型和VIC模型在窟野河流域都有较好的应用,相比月水量平衡模型,VIC模型月径流模拟过程效果达60%以上,模拟结果相对较差。据分析认为:流域水文过程是一种复杂的自然现象,在一定程度上受一些不确定因素的影响,可能由于长序列资料在某种程度上均化了流域水文的随机性。从而使月水量平衡模型月降水-径流模拟比VIC模型的月降水-径流模拟效果较好。
为进一步分析比较集总式水量平衡模型和分布式可变下渗容量(VIC)模型在窟野河流域的应用,图6.33比较了模型对月径流模拟的Nash-Sutcliffe效率系数。
图6.33 两模型在窟野河流域效率应用比较
由图6.33可以看出,集总式月水量平衡模型比分布式可变下渗容量(VIC)模型的模拟效果好,月水量平衡模型的Nash-Sutcliffe效率系数平均超过了70%,而可变下渗容量(VIC)模型的Nash-Sutcliffe效率系数平均在60%~65%之间。既有较好考虑物理机制又能解决水文要素时空分布不均匀性分布式水文模型是目前研究的热点,也受众多学者青睐。从理论上来看,在资料丰富且质量较好的流域,考虑产流机制分布式水文模型可以得到较好模拟效果[39],但对黄土高原的典型流域黄河中游的窟野河流域模拟结果来看,可变下渗容量(VIC)模型模拟效果并不是最好的。分析认为,黄河中游支流窟野河流域水文气象日资料欠缺,且资料的质量也不好是分布式可变下渗容量(VIC)模型模拟效果不太好的主要原因。相比分布式VIC模型,月水量平衡模型结构简洁,涉及的参数也比较少。因此,选用集总式水量平衡模型开展气候变化对水文水资源影响模拟。
⑶ 数据结构代码(用C语言) 二叉树的操作
# include <stdio.h>
# include <malloc.h>
struct BTNode
{
int data;
struct BTNode * pLchild;//p是指针,L是左,child是孩子
struct BTNode * pRchild;
};
//函数声明
struct BTNode * CreateBTree(void);//创建树
void PreTraverseBTree(struct BTNode * pT);//先序遍历
void InTraverseBTree(struct BTNode * pT);//中序遍历
void PostTraverseBTree(struct BTNode * pT);//后续遍历
int main(void)
{
struct BTNode * pT = CreateBTree();
PreTraverseBTree(pT);
printf("\n");
InTraverseBTree(pT);
printf("\n");
PostTraverseBTree(pT);
return 0;
}
//创建树
struct BTNode * CreateBTree(void)
{
struct BTNode * pA = (struct BTNode * )malloc(sizeof(BTNode));
struct BTNode * pB = (struct BTNode * )malloc(sizeof(BTNode));
struct BTNode * pC = (struct BTNode * )malloc(sizeof(BTNode));
struct BTNode * pD = (struct BTNode * )malloc(sizeof(BTNode));
struct BTNode * pE = (struct BTNode * )malloc(sizeof(BTNode));
pA->data = 'A';
pB->data = 'B';
pC->data = 'C';
pD->data = 'D';
pE->data = 'E';
pA->pLchild = pB;
pA->pRchild = pC;
pB->pLchild = NULL;
pB->pRchild = NULL;
pC->pLchild = pD;
pC->pRchild = NULL;
pD->pLchild = NULL;
pD->pRchild = pE;
pE->pLchild = NULL;
pE->pRchild = NULL;
return pA;
}
//先序遍历
void PreTraverseBTree(struct BTNode * pT)
{ //先访问根节点,再先序访问左子树,最后先序访问右子树
if ( pT != NULL)
{
printf("%c\n",pT->data);//访问根节点
//pT->pLchild可以代表整个左子树
PreTraverseBTree(pT->pLchild);
PreTraverseBTree(pT->pRchild);
}
return;
}
//中序遍历
void InTraverseBTree(struct BTNode * pT)
{
if(pT != NULL )
{
if (NULL != pT->pLchild)
{
InTraverseBTree(pT->pLchild);
}
printf("%c\n",pT->data);
if (NULL != pT->pRchild)
{
InTraverseBTree(pT->pRchild);
}
}
return;
}
//后续遍历
void PostTraverseBTree(struct BTNode * pT)
{
if(pT != NULL )
{
if (NULL != pT->pLchild)
{
PostTraverseBTree(pT->pLchild);
}
if (NULL != pT->pRchild)
{
PostTraverseBTree(pT->pRchild);
}
printf("%c\n",pT->data);
}
return;
}
⑷ C语言程序设计
运行结果是3。
原因是'