李普山 李偉波 馮智莉
(武漢工程大學計算機科學與工程學院 湖北 武漢 430000)
羅布泊鹽湖是我國超大型的含鉀鹵水礦床,鹽湖由東向西寬90千米,從南到北長115千米,是世界上最大的干鹽湖之一。其鹵水屬硫酸鎂亞型鹵水,賦存有鉀、鎂、鈉等成分,其品位超過工業品位,其中鉀鹽近期儲量為1億噸,遠景儲量為2.5億噸[1]。科學規劃鹽田年度的采收方案、優化采鹽船的開采路徑、保證硫酸鉀廠吃礦的含鉀品位,對合理開發、高效利用不可再生鹽田資源,提高企業經濟效益,實現企業可持續發展具有重要意義。而采收方案的基礎就是礦床模型,因此,如何準確高效地構建礦床模型是科學規劃采收方案的關鍵。
為此,本文提出了一種基于Delaunay三角網和并行計算技術的礦床三維可視化的分層模型。通過對整個鹽池進行分層處理來準確反映不同深度礦床的內部情況,同時運用并行技術對數據計算進行并行處理,使得模型生成速度顯著提高。
鹽礦開采,實際上是對鹵水析出的鹽層進行開采,必須知道鹽池中的礦量以及屬性結構。因此需要在相對固定的時間周期內用測深儀等進行空間數據和屬性數據的采集,再選擇規則網絡結構或不規則三角網TIN(Triangular Irregular Network)建立鹽礦的數字高程模型DEM(Digital Elevation Model)。由于鹵水受環境條件的因素影響,不同深度鹽礦形成的品位和厚度也是變化的,單一的DEM顯然無法反映不同深度的真實情況。因此,必須建立多層的DEM,而且每一層是可以揭開以反映鹽礦內部情況。另外,即使單一的DEM建模都有大量的數據計算,多層DEM構建過程中如何提高建模效率也是必須重視的問題。
構建可獨立分層的DEM模型,可以采用化整為零的思想,根據測深時間的不同,將礦床分成不同的鹽層,每一層鹽層利用TIN來擬合曲面,再將各層TIN組合起來就構成了整個鹽礦[2-6]。這樣既可以對礦床內部的結構有所了解,又可以對整個礦床不同位置的品位進行查詢,使礦量計算更加準確。
單層DEM的構建采用Delaunay三角剖分算法。經過大量學者證明,在平面內任意給定點集的Delaunay三角剖分具有整體最優的性質,即對于任意給定的平面點集,Delaunay三角劃分能夠得到整體最優的三角形網格,能夠盡可能地避免病態三角形的出現[7]。為了使三角剖分盡可能優化,一般在進行三角剖分時遵循兩個準則:(1) 空圓特性,在三角網格中任一三角形的外接圓內都不存在其他的點;(2) 最大化最小角特征,相鄰三角形構成的凸多邊形的對角線,在交換后,六個內角中最小的內角最大[8]。根據這兩個準則形成的三角網格是唯一的,這也是Delaunay三角劃分的劃分標準。
當前,構建三角網格的算法大致可以分為三類:區域生長法、合并分割法(分治法)和逐點插入法。其中:區域生長法中主要以三角網生長為主,三角網生長法的效率相對較低,雖然改進空間較小,但是實用性很強;合并分割法的效率最高,但是其運用了遞歸的思想,運行過程會占用大量內存,不能處理大量數據;逐點插入算法比較簡單,需要內存空間不大,但是它的時間復雜度相對較高。
每一次采集的空間數據都比較多,同時多層構建DEM運算量急劇加大,在盡量保證系統效率的前提下,本文采用了多線程的并行處理辦法,讓不同層的數據并行處理,盡可能提高系統效率。
提出本方案的最終目的是為了能夠準確地計算礦量,礦量計算公式為:礦量=體積×品位,故品位和體積是計算礦量的關鍵。而前文已經提到,受環境條件的因素影響,不同深度鹽礦形成的品位不一樣,因此需要將整個鹽礦分層以便對不同位置的鹽礦品位進行處理。
對于鹽礦體積計算,這涉及到鹽層間的聯系(盡管各鹽層構網過程相互獨立,但在進行體積計算時需要知道相鄰鹽層對應采樣點的過程),計算出單位體積內的礦量后再進行積分求和,從而計算出整個礦床的礦量。因此,要求在每一次數據采集時,采樣點的水平面坐標、采樣點編號相同,這樣相鄰兩層三角網格將礦體分割成無數小三棱柱,計算每個小三棱柱體積再積分求和得到每個礦層體積,而在進行查找相鄰鹽層的對應點高程時也會簡單很多,從而降低算法難度。
為使三維仿真模型盡可能逼真,每次獲取的數據均比較多。其中存在大量數據冗余,而且受測深航線影響,數據分布不夠均勻,深度變化小,需要進行合適的處理。為此,本文采用了一種設定影響圓半徑的方法剔除部分相似數據,采用誤差識別方法剔除異常數據。將采樣點集處理之后,對這些散亂點集進行Delaunay三角剖分,即生成Delaunay三角網格。三角網是三維地質建模中的一種常用方法,是按一定規則將離散點拓撲連接成覆蓋整個區域且互不重疊的三角形網格。當三角形數量足夠多時,可以無限擬合曲面的起伏情況,從而建立了離散點間的空間曲面關系。三角剖分可以根據鹵水下鹽層的起伏情況來調整三角形的大小和數量,便于瀏覽三維鹽層的礦床模型。
由于每一鹽層的采樣數據較多,如逐一對每一鹽層進行三角剖分會嚴重影響系統效率,故本文采用了多線程的并行處理的方式,來對各鹽層并行處理,以此來提高系統效率。對于多線程技術,核心問題是任務調度,需要從系統的性能評估入手,即從并行線程的規模數、數據競爭、鎖競爭、線程安全、存儲和數據組織等方面對系統進行分析和優化[9]。一般對共享數據的訪問會引發數據競爭,從而導致結果的不確定性。為此,需要將各鹽層的采樣點劃分好,使其相互獨立,從而消除數據共享可能引發的數據競爭、鎖競爭以及存儲問題。并且在程序構造上加強結構化和模塊化,從而大大降低了多線程編程的復雜程度。
根據用戶需求,方案的總體工作流程如圖1所示。

圖1 系統總體功能流程圖
本方案需要對鹽池采樣點進行分析,獲取采樣點的位置信息以及采樣點附近鹽礦樣品的屬性(組份、含量、時間),分別建立鹽池采樣點的空間數據庫和屬性數據庫。根據空間數據庫里的三維坐標信息建立鹵水下礦床的三維模型并計算出鹽層體積,然后利用鹽層體積結合屬性數據庫里的鹽礦品位信息計算礦量。
根據系統設計方案,本系統數據文件包含兩類:圖形數據文件和屬性數據文件。圖形數據文件是可視化的圖形文件,本文選用WRL文件作為系統的空間圖形數據文件。同時該文件也可用于與外部軟件進行交換的接口。屬性數據文件組織,包含項目數據配置文件、測深儀數據文件以及層樣品分析數據文件。其中:項目數據配置文件用來定義初始數據、鏈接采樣數據文件和樣品分析數據文件;測深儀數據文件記錄的是各采樣點的坐標信息以及其編號;層樣品分析數據文件記錄了各采樣點的鹽礦品位信息、坐標信息以及采樣時間。
為了提高檢索效率,方便存儲和維護鹽池信息,需要建立相關數據庫。表1、表2是根據分層模型數據組織建立的數據庫部分情況。表1是按鹽層建立的數據庫鹽層表;表2是數據庫采樣點表,存儲的信息是鹽層里面的采樣點信息。

表1 數據庫鹽層表

表2 數據庫采樣點表
本文采用的是三角網生長法,相對于逐點插入法,不需要進行大量定位三角形的操作; 相對于分割合并算法,生長法也沒有大量的搜尋子集邊集、并網的操作[10-11]。其基本思想為:以一個三角形為初始三角網,逐漸向外尋找離該三角網各條邊最近的點,與對應邊組成新的三角形,加入到三角網中形成新的三角網。在生長過程中,要隨時對已經生長好的三角網進行拓撲結構檢測,確定三角網中各邊之間的關系,同時判斷生長過程是否終止。其具體算法如下:
(1) 在平面點集中選取任意一點(盡量選擇平面點集中間區域的點),尋找離該點最近的點,形成線段,并以此線段作為定向基線。
(2) 根據Delaunay三角形的判別標準,將離基線兩端點距離之和最小的點作為新三角形的第三點,并以此確定新三角形。
(3) 把新三角形的兩條邊(新三角形中除去原基線的兩條邊)作新的基線。
(4) 重復(2)、(3),直到所有基線都被用過為止。
其具體構網流程如圖2所示。

圖2 Delaunay三角剖分三角形生長法構網流程圖
Delaunay三角剖分構網過程復雜,算法代價較大。因此,本方案利用多線程的并行化思想,在同一坐標系下,讓各個鹽層的離散點集并行構建三角網格,完成鹵水下礦層的三維曲面仿真。
并行線程并不是規模越大,性能越好。運用多線程是為了更好地利用系統資源,而線程本身也會占用系統資源,如果線程數過多會嚴重影響程序本身的性能,過少則不能使系統資源得到充分的利用。另外,線程之間切換時新線程所需的數據需要恢復,被切換的線程數據需要保存,這也能直接導致系統性能降低,故需要在線程數與系統性能之間找一個平衡點。
并行處理算法由MFC結合OpenGL以及OpenMP實現。OpenMP提供了對并行算法的高層抽象描述,在程序功能模塊中加入專用的pragma來表明意圖,由編譯器來自動將程序并行化,并在可能發生數據沖突之處加入同步互斥及通信[12-14]。其運用形式示例如下:
#pragma omp parallel for schedule(dynamic)
//并行調度分配迭代
for(int k=0;k { … tin.createTin();//構網 OutputWrl(sWrlFileName); //生成WRL模型文件 … #pragma omp critical//沖突檢查 { … WrltoDatabase(); //將層數據寫入數據庫 } } 得到的結果為整個礦床內部各鹽層的三維結構,如圖3所示。 圖3 各鹽層構網結果圖 從圖3可以很明顯看出礦床的各鹽層的三維結構情況,對構網結果進行渲染后的鹽層三維模型如圖4所示。 圖4 礦床分層模型三維顯示圖 系統有以下三個特性: (1) 一致性,對同一鹽層進行多次運行得到的構網結果基本相同,即組成Delaunay三角形的頂點編號一致。 (2) 高效性,利用了多線程的并行化思想,讓各個鹽層并行構網,大大提高了系統效率。 (3) 真實性,能夠較真實地反映鹵水下礦床的內部空間結構以及成礦過程。 本方案可以根據從勘探現場獲得的測深數據生成鹽池礦床分層的三維仿真模型,反映鹵水下礦床的內部屬性結構,方便用戶在進行開礦生產時做出相關決策。本文選擇C++作為開發語言,利用面向對象的設計思想,以MFC作為框架,把點、邊、三角形分別作為一個新的數據結構以對象的形式進行封裝,結合OpenGL的三維圖形API,較為真實地實現了對鹽層的三維仿真。同時,為了提高系統效率,利用多線程并行處理的思想,結合OpenMP編程,讓各鹽層并行構網,大大提高了系統效率。表3列出線程數與系統運行時間的對比。 表3 不同線程數與系統運行時間對比 由此可知,利用多線程優化后的程序執行效率比不使用多線程時有顯著提高,并且線程數對系統效率影響很大,并不是越多效率越高,當線程數達到一定數目時系統效率反而降低,不能簡單通過提高線程數來進一步提高效率。 以該項目中5#光鹵石池為例,在相同時間間隔內,前后8次獲取了其鹵水下地形數據,取部分數據進行實驗,得到的結果如圖4所示,共8個鹽層。通過填充之后能夠真實地反映其鹵水下的礦床情況,具有真實性。將其中第一個鹽層轉化為WRL文件格式,其內部結構如下,選取17個點,根據坐標x、y、z排列: 132.777 110 0.625 80.574 99.337 1.875 80.331 40.435 0.875 123.92 46.646 0.875 159.676 40.435 0.375 80.396 10 0 100.69 16.625 0.625 140.102 16.625 0.875 159.782 10.414 1.875 139.891 52.545 0.625 107.395 110 0.875 160 100.373 0.625 80 70.455 0.625 100.69 52.959 0 120.581 85.155 0.375 159.782 70.455 0 80 70.455 0.75 經三角剖分后,得到的三角網格如下:其中正數為三角形的三個頂點編號,-1為標志號。 0, 10, 1, -1 0, 14, 1, -1 0, 11, 14, -1 1, 16, 14, -1 14, 15, 11, -1 1, 12, 16, -1 14, 13, 16, -1 14, 9, 15, -1 11, 8, 15, -1 16, 15, 12, -1 14, 3, 13, -1 16, 2, 13, -1 14, 3, 9, -1 15, 4, 9, -1 15, 4, 8, -1 13, 6, 3, -1 13, 6, 2, -1 9, 7, 3, -1 9, 7, 4, -1 8, 7, 4, -1 3, 7, 6, -1 2, 5, 6, -1 8, 5, 7, -1 6, 5, 7, -1 經多次實驗,三角剖分結果基本相同,系統具有一致性。另外,將系統以8個線程同時對8個鹽層進行構網,系統效率大大提高。 本文針對鹽池鹵水下礦床的基本特征提出了一種礦床分層模型的三維可視化方案。詳細說明了分層數據結構和基于三角網生長法的Delaunay三角剖分算法構建分層DEM方法,并運用OpenMP的多線程并行處理技術和沖突共享機制,實現各鹽層快速生成Delaunay三角網后再組合構建多層DEM。應用結果表明,這是一種分層快速建模的方法,能夠比較高效準確地反映礦床內部情況,也為復雜DEM建模提供了一種新的研究手段和方法。

4 應用結果分析

5 結 語