鮑瑞雪
(河南省洛陽(yáng)水文水資源勘測(cè)局,河南 洛陽(yáng) 471000)
水文預(yù)報(bào)是水文學(xué)的一個(gè)重要組成部分, 它是建立在充分掌握客觀水文規(guī)律的基礎(chǔ)上,預(yù)報(bào)未來(lái)徑流變化的一門(mén)應(yīng)用性學(xué)科。 初期的水文學(xué)方法來(lái)自對(duì)洪水規(guī)律的分析和總結(jié),簡(jiǎn)單、實(shí)用,但沒(méi)有嚴(yán)密的理論基礎(chǔ),基本上屬于經(jīng)驗(yàn)方法,也有人稱(chēng)其為工程師方法。 最早的水文學(xué)方法出現(xiàn)于20世紀(jì)30 年代,比較有代表性的有API 方法、單位線法和馬斯京根法。 這3 種方法被我國(guó)的水文工作者稱(chēng)為水文預(yù)報(bào)的“老三篇”,至今仍被廣泛使用[1]。
經(jīng)驗(yàn)單位線(Unit Hydrography,簡(jiǎn)稱(chēng)UH)源自美國(guó),于1932 年由舍爾曼(L. K. Sherman)提出,因此又被稱(chēng)為舍爾曼單位線。最初的單位線法只是用于流域匯流計(jì)算,后來(lái)擴(kuò)展到河道匯流演算。 推求單位線需用次洪時(shí)段凈雨量及流域出口斷面的徑流量和過(guò)程,推求方法主要有分析法[2]、試錯(cuò)法[3]、最小二乘法[4~5]。
由于流域匯流的復(fù)雜性和測(cè)驗(yàn)資料的誤差,應(yīng)用分析法和最小二乘法推求的結(jié)果往往會(huì)出現(xiàn)鋸齒狀和負(fù)值現(xiàn)象,甚至無(wú)法進(jìn)行分析計(jì)算,所以很少有人應(yīng)用。試錯(cuò)法使用比較廣泛,但主要缺點(diǎn)是單位線過(guò)程的初始假定比較困難,試錯(cuò)過(guò)程的計(jì)算大量。鑒于此, 本文試提出建立人工干預(yù)機(jī)制降低單位線初始化難度、 引入多線程計(jì)算方法提高計(jì)算速度的思路,并使用VB.NET 編寫(xiě)應(yīng)用程序,以期提高試錯(cuò)法推求單位線的效率。
用試錯(cuò)法推求單位線時(shí), 初始單位線假設(shè)的好壞直接影響迭代試算的次數(shù)。 這就要求預(yù)報(bào)人員不但具備豐富的經(jīng)驗(yàn), 還要對(duì)當(dāng)?shù)氐乃奶卣饔泻苌畹睦斫?。這樣就限制了試錯(cuò)法推求單位線的發(fā)展。如果使用計(jì)算機(jī)假設(shè)所有單位線的組合,計(jì)算量很大。人工干預(yù)機(jī)制就是預(yù)報(bào)人員根據(jù)經(jīng)驗(yàn)及單位線的約束關(guān)系等,對(duì)計(jì)算機(jī)試算范圍做出限定,從而大大減少試算時(shí)間。 現(xiàn)假設(shè)有一條13 個(gè)時(shí)段的單位線,計(jì)算機(jī)假設(shè)和人工干預(yù)的對(duì)比分析結(jié)果如表1 所示。
表1 人工干預(yù)分析表Table 1 Manual intervention analysis
由表1 可以看出,對(duì)該單位線,計(jì)算機(jī)的計(jì)算次數(shù)是1 00013次,而人工干預(yù)需要6×51×41=12 546次,可見(jiàn),人工干預(yù)設(shè)定了較為靈敏的位置,極大地使計(jì)算量減少。
在單個(gè)程序中,同時(shí)運(yùn)行多個(gè)線程完成不同的工作稱(chēng)為多線程。 它是程序中一個(gè)單一的順序控制流程。 在這個(gè)流程中,多個(gè)線程共享數(shù)據(jù)空間,每個(gè)線程有自己的執(zhí)行堆棧和程序計(jì)數(shù)器,為其執(zhí)行上下文。 多線程同步完成多項(xiàng)任務(wù),不是為了提高運(yùn)行效率,而是為了提高資源使用效率,從而提高系統(tǒng)的效率[6]。
使用多線程主要有以下優(yōu)點(diǎn)[7]:(1)用戶(hù)界面可以更人性化;(2) 程序的運(yùn)行速度可能加快;(3)在一些等待任務(wù)的實(shí)現(xiàn)上釋放內(nèi)存占用空間;(4)把耗時(shí)長(zhǎng)的程序中的任務(wù)放到后臺(tái)去處理。
在VB.NET 程序設(shè)計(jì)過(guò)程中,并不是線程越多計(jì)算速度越快[8]。 為了得到程序合理的線程數(shù),應(yīng)選取不同測(cè)試環(huán)境,對(duì)多線程進(jìn)行測(cè)試,最終選取適合的線程數(shù)進(jìn)行程序計(jì)算。
為驗(yàn)證本文所述方法可行性、有效性,作者使用實(shí)測(cè)資料進(jìn)行單位線的推求試驗(yàn),其步驟及結(jié)果如下。
進(jìn)行程序設(shè)計(jì)之前,首先應(yīng)確定多線程數(shù)。 如,設(shè)定一個(gè)12 萬(wàn)次的計(jì)算循環(huán),在不同平臺(tái)上分別使用單線程、雙線程及三線程來(lái)計(jì)算,比較計(jì)算時(shí)間,最后確定程序設(shè)計(jì)最優(yōu)的線程數(shù)。
經(jīng)過(guò)測(cè)試(測(cè)試結(jié)果如圖1 所示),得到雙線程計(jì)算速度較快的結(jié)論。 考慮到因測(cè)試環(huán)境(Windows XP 操作系統(tǒng),雙核CPU,1G 內(nèi)存)對(duì)結(jié)果具有一定的影響,得出“幾核CPU 就使用幾線程”是比較合理的結(jié)論。
圖1 多線程速度測(cè)試結(jié)果Fig.1 Multithread speed test result
在初始化單位線時(shí),需要考慮3 個(gè)方面問(wèn)題:(1)單位線時(shí)段長(zhǎng)短。 單位線時(shí)段長(zhǎng)不是唯一確定的影響因素,也沒(méi)有規(guī)律可循。 程序在單位線初始化設(shè)計(jì)時(shí),應(yīng)該考慮單位線時(shí)段長(zhǎng)度的可變性(例如時(shí)段數(shù)可在8 到13 之間變化),并生成相應(yīng)長(zhǎng)度的單位線過(guò)程。(2)單位線各個(gè)時(shí)段的變化范圍。這一部分是人工干預(yù)的主要體現(xiàn)之處。 根據(jù)經(jīng)驗(yàn),設(shè)定好各個(gè)時(shí)段的變化范圍, 可以有效減少計(jì)算次數(shù)。(3)單位線各個(gè)時(shí)段變化增量。增量是單位線從初始值到結(jié)束值的變化幅度,它可以控制單位線篩選的密度。 實(shí)際應(yīng)用時(shí),可以先使用大增量,初步篩選出單位線變化比較靈敏的區(qū)間, 再使用小增量,對(duì)此區(qū)間作進(jìn)一步篩選,最后求出符合要求的單位線。 這樣可以提高單位線推求的效率。
在單位線初始化假設(shè)完成后,程序?qū)⒆詣?dòng)計(jì)算每一條單位線推求的流量過(guò)程,并與推求單位線的流量過(guò)程進(jìn)行比較。 最后,將滿(mǎn)足精度要求的單位線及精度結(jié)果保存為文件,為人工進(jìn)一步篩選提供客觀依據(jù)。
圖2 為某水庫(kù)單位線的推求結(jié)果:預(yù)報(bào)徑流過(guò)程與實(shí)測(cè)徑流過(guò)程洪峰時(shí)段位置相同, 洪量誤差10%以?xún)?nèi),基本滿(mǎn)足精度要求。
圖2 某水庫(kù)洪水單位線驗(yàn)證過(guò)程圖Fig.2 Flood unit hydrograph verification course of one reservoir
在實(shí)際的應(yīng)用中,基于上述思路的計(jì)算程序減少了工作量、提高了工作效率,取得了一定的效果。這證明了引入人工干預(yù)及多線程的可行性,同時(shí)也可以從中得到以下幾點(diǎn)認(rèn)識(shí):
(1)人工干預(yù)是一種人腦與電腦的結(jié)合,它可以降低程序編寫(xiě)的難度,減少試算時(shí)間,大大提高工作效率。
(2)多線程的運(yùn)用可以提高計(jì)算速度,但是并不是線程數(shù)越多越好,應(yīng)根據(jù)使用平臺(tái)的具體測(cè)試結(jié)確定線程數(shù)。
(3)用單位線法假定的降雨在流域內(nèi)均勻分布,流域匯流為線性系統(tǒng),與實(shí)際不符。 因此,對(duì)于有些流域,一條單位線難以滿(mǎn)足預(yù)報(bào)精度的要求,一個(gè)預(yù)報(bào)方案常配有多條單位線。
[1] 林三益. 水文預(yù)報(bào)[M]. 北京:中國(guó)水利水電出版社,2001:1-4.
[2] 李慧瓏. 水文預(yù)報(bào)[M]. 北京:中國(guó)水利水電出版社,1993:1-11.
[3] 詹道江,葉守澤. 工程水文學(xué)[M].北京:中國(guó)水利水電出版社,1987:119-138.
[4] 吳云. 利用最小二乘方原理推求單位線[J]. 太原師范學(xué)院學(xué)報(bào),2003(3):11-13.
[5] 長(zhǎng)江水利委員會(huì). 水文預(yù)報(bào)方法[M]. 北京:水利電力出版社,1979:132-147.
[6] 馮朝輝,范銳軍. VB 下多線程實(shí)現(xiàn)機(jī)制的比較[J]. 計(jì)算機(jī)工程與設(shè)計(jì),2010(1):228-231.
[7] 張焰林. 基于VB.NET 的多線程技術(shù)應(yīng)用[J]. 計(jì)算機(jī)系統(tǒng)應(yīng)用,2009(2):136-138.
[8] Billy Hollis. VB.NET 程序設(shè)計(jì)教程[M]. 康博, 譯. 北京:清華大學(xué)出版社,2001:304-315.