⑴ 源匯項數據整理
一、計算網格的剖分
根據模塊化三維有限差分地下水流動模型計算軟體的特點,為了更好描述在表高程、水頭邊界、匯源項,在平面上將計算區按每個單元均是邊長為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。
原因是'