聶永丹,李福慶,張巖
油藏體飽和度場與等值圖展示是油藏數(shù)模軟件前后處理程序包的一個重要組成部分。利用油藏飽和度場可以有效反映油藏地層飽和度變化以及剩余油分布情況。研究油藏飽和度及等值圖的繪制方法對提高數(shù)模結果展示技術有重要意義。Open Inventor是目前世界上使用最廣泛的面向對象的繪圖軟件接口,允許用戶通過搭積木的方式來構建復雜的三維場景,使得用戶只需花費很少的時間就可以構造出復雜的三維場景[1]。Open Inventor中根據(jù)不同行業(yè)的需求提供了若干擴展模塊,其中 MeshViz 擴展模塊提供了強大的應用科學領域中模型網(wǎng)格繪制、提取和數(shù)據(jù)匹配功能,并且包含了高級的數(shù)據(jù)可視化設計組件,復雜曲面、三維統(tǒng)計圖等多種可視化對象[2]。
MeshViz擴展模塊提供了二維等值圖相關的二維笛卡爾坐標網(wǎng)格、顏色映射、網(wǎng)格填充以及等值線等與飽和度場及等值圖相關對象(節(jié)點)。
二維笛卡爾坐標系網(wǎng)格節(jié)點,可以用來構建笛卡爾坐標系的平面網(wǎng)格[3],該網(wǎng)格的拓撲結構是規(guī)則的,但是其幾何形狀可以是不規(guī)則的,組成每個網(wǎng)格單元的4條邊,相對的兩條不要求平行,整個平面網(wǎng)格的拓撲由x方向和y方向的網(wǎng)格個數(shù)定義,x、y方向網(wǎng)格數(shù)均為4的PoCartesianGrid2D網(wǎng)格結構如圖1所示:
圖1 PoCartesianGrid2D網(wǎng)格結構圖
非線性顏色映射節(jié)點,為數(shù)據(jù)體表面提供色彩映射方式。首先根據(jù)一組浮點數(shù)值定義了相應的一組顏色值,顏色映射節(jié)點會根據(jù)一個數(shù)值的大小決定該數(shù)值對應的顯示顏色,于是相應的顏色就會在一個數(shù)據(jù)集合對應的數(shù)據(jù)體表面上顯示出來,顏色映射節(jié)點提供兩種映射方式分別是:LINEAR_PER_LEVEL和 NON_LINEAR_PER_LEVEL。LINEAR_PER_LEVEL映射方式中如果一個數(shù)值f在區(qū)間[fi,fi+1]中,其相對應的映射顏色將是在[ci,ci+1]區(qū)間的線性內插得到的RGB或HLS顏色,因此這種映射方式必須提供與顏色數(shù)量相同數(shù)值個數(shù)。而NON_LINEAR_PER_LEVEL映射方式不進行插值,如果一個數(shù)值f在區(qū)間[fi,fi+1]中,其相對應的映射顏色將是ci+1對應的RGB或HLS顏色,如果f小于c1 則對應的顏色就是 f1, NON_LINEAR_PER_LEVEL映射方式必須提供數(shù)值個數(shù)是顏色數(shù)量加1。
此外 PoNonLinearDataMapping2顏色映射節(jié)點可以指定與顏色相關聯(lián)的閾值,以過濾到無效數(shù)值。通過PoDataMapping:: minThresholdand指定最小閾值,PoDataMapping:: maxThresholdfields指定最大閾值,當啟用閾值設定時,處于設定好的閾值之外的數(shù)值(小于等于最小閾值或大于等于最大閾值的數(shù)值)對應的顏色將使用預定義好的無效顏色。
二維平面網(wǎng)格可視化節(jié)點包括:網(wǎng)格填充節(jié)點PoMeshFilled,根據(jù)預定義好的映射方式對平面網(wǎng)格進行填充;網(wǎng)格邊界節(jié)點PoMeshLimit,繪制網(wǎng)格幾何體的邊界線;網(wǎng)格邊線節(jié)點PoMeshLines,繪制網(wǎng)格幾何體中的每個單元的線框;等值線節(jié)點PoMeshContouring,在二維平面網(wǎng)格中繪制等值線,同時可以選擇是否加上數(shù)值注釋,等值線分為主等值線和次等值線,數(shù)值注釋只能加在主等值線上[4]。
圖例節(jié)點,以一個矩形的方式給出當前色譜的彩色圖例,在這個矩形圖例上可以設置圖例的名稱,最大值與最小值等,同時利用PoNonLinearValueLegend2提供的編程接口可以實現(xiàn)展示形狀、方向、顏色映射類型的動態(tài)設定等功能。利用MeshViz模塊創(chuàng)建一個圖例需要首先初始化圖例節(jié)點,通過指定圖例大小,坐標以及標題和數(shù)值的位置,來定義圖例節(jié)點;然后在場景中插入PoDataMapping類型對象;接著在場景中插入PoIsovaluesList類型對象并與和圖例節(jié)點關聯(lián);最后指定圖例中所要顯示數(shù)據(jù)的最大值,最小值以及過渡數(shù)值。如果定義了數(shù)據(jù)顏色映射節(jié)點對象或者 PoIsovaluesList節(jié)點對象,可以通過這兩類節(jié)點圖例指定數(shù)值范圍。
不同數(shù)模軟件具有不同的油藏體數(shù)據(jù)文件格式,雖然文件的組織格式不同,但基本都包含了油藏體結構信息與屬性信息。油藏體結構主要包括拓撲結構,以及每個網(wǎng)格的坐標和網(wǎng)格有效性等;屬性信息包含了某個時間點下,每個網(wǎng)格的某種屬性對應的數(shù)值。油藏體數(shù)模信息的數(shù)據(jù)量很大,特別的在大區(qū)塊中包含網(wǎng)格數(shù)目多的情況下,頻繁掃描讀取油藏體數(shù)據(jù)會引起程序運行效率下降,降低用戶體驗。采用動態(tài)內存創(chuàng)建的方式將所需的數(shù)據(jù)一次加載到內存中[5],后續(xù)的處理直接在內存中操作,可以有效節(jié)約數(shù)據(jù)加載時間,提高程序運行效率。
2.1.1 模型結構數(shù)據(jù)加載
用動態(tài)3維數(shù)組model[i,j,k]存儲模型結構,以當前國內外主流的油藏數(shù)模軟件斯倫貝謝公司Eclipse的網(wǎng)格模型數(shù)據(jù)為例,其數(shù)據(jù)格式主要是一種柱狀(pillar)模型,如圖2所示:
圖2 pillar模型網(wǎng)格結構圖
一種點線結構:模型中i,j坐標相同且處于不同位置處所有網(wǎng)格同一方位的棱邊位于一條直線上,其中100網(wǎng)格的“100-101”棱邊和101網(wǎng)格的“100-101”棱邊在三維空間內共線。根據(jù)目標網(wǎng)格某一方位棱邊所在線段頂?shù)c的三維坐標和該棱邊某角點的 z坐標,就可以計算出該角點的三維坐標,按照i,j,k的順序可以得到網(wǎng)格的屬性值和有效性數(shù)據(jù)[6]。
2.1.2 網(wǎng)格屬性數(shù)據(jù)加載
用 5維動態(tài)數(shù)組來存儲油藏體屬性數(shù)據(jù),例如數(shù)組varray[t,p,i,j,k]中的下標 i,j,k分別表示油藏體中三維網(wǎng)格序號坐標,下標t表示時間點序號,下標p表示屬性類別序號。后續(xù)處理就可以根據(jù)具體時間點、屬性值、單層信息從varray[t,p,i,j,k]數(shù)組檢索出用戶所需要的屬性值。
2.1.3 網(wǎng)格有效性標志加載
整個油藏體模型中有些網(wǎng)格是不需要關心的,定義為無效網(wǎng)格,在展示的時候需要忽略掉,因此每個網(wǎng)格對對應著一個有效標志數(shù)值,如果該標識為1則該網(wǎng)格是有效的,需要展示出來,反之如果該標識為0則該網(wǎng)格是無效的,展示時需要過濾掉。為避免頻繁加載此標志信息,本文采用 1維動態(tài)數(shù)組m_actnum[m]的形式來存儲網(wǎng)格有效性標志,后續(xù)程序判斷網(wǎng)格 model[i,j,k]的有效性時,可以直接訪問m_actnum[k*num_y*num_x +j*num_x+i]的值是1還是0。
1)首先將油藏體模型結構數(shù)據(jù)與屬性信息加載到內存中;
2)利用MeshViz中的PoCartesianGrid2D類創(chuàng)建節(jié)點笛卡爾坐標系的平面二維網(wǎng)格pmesh,設定拓撲結構,并將屬性值添加到網(wǎng)格中;
3)再根據(jù)飽和度場數(shù)據(jù)定義數(shù)據(jù)映射,用PoNonLinearDataMapping2類創(chuàng)建節(jié)點pdataMapping,該節(jié)點定義一系列顏色和浮動的數(shù)值相對應,選擇 LINEAR_PER_LEVEL方式,設置 PoDataMapping:: maxThresholdfields指定最大閾值,啟用閾值設定,設置大于最大閾值的數(shù)值對應的顏色透明度為100%。判斷每一個網(wǎng)格的有效性,若網(wǎng)格無效,則將該網(wǎng)格屬性數(shù)值設定為最大閾值的數(shù)值,于是可以過濾掉該網(wǎng)格。
4)利用PoMeshFilled創(chuàng)建可視化填充節(jié)點pmeshFilled,應用數(shù)據(jù)到顏色的映射,填充二維實心飽和度場,選擇COLOR_MAPPING作為顏色類型,網(wǎng)格的每一個屬性值對應一種顏色,網(wǎng)格通過這些插值的顏色填滿,描述的每一個
網(wǎng)格邊或網(wǎng)格單元通過由 pDataMapping對象定義的“數(shù)據(jù)映射”的方法著色,該pDataMapping對象定義網(wǎng)格值(由值索引域關聯(lián))轉變成顏色的方法;利用PoMeshContouring創(chuàng)建可視化節(jié)點 pmeshContouring與二維網(wǎng)格的屬性值相關聯(lián)繪制出二維等值線圖,利用PoMeshLimit創(chuàng)建可視化節(jié)點 pmeshLimit網(wǎng)格邊界節(jié)點,繪制網(wǎng)格幾何體的邊界線;利用PoMeshLines創(chuàng)建可視化節(jié)點 pmeshLines網(wǎng)格邊線節(jié)點,繪制網(wǎng)格幾何體中的每個單元的線框[7]。
5)最后通過定義圖例來說明飽和度場中的顏色相對應的飽和度值,先通過 PoIsovaluesList 類創(chuàng)建節(jié)點 pisoValues,連接對象到可視化節(jié)點,兩個連續(xù)等值之間的步進尺度是一個常數(shù),再運用PoLinearValueLegend類創(chuàng)建節(jié)點plegend 繪制圖例。將上述 pmesh、pdataMapping、pmeshFilled、pisoValues 和 plegend 節(jié)點依次添加到場景圖節(jié)點 root中,然后創(chuàng)建渲染區(qū)域并顯示場景[8]。
本文基于Open Inventor中MeshViz 擴展模塊研究油藏飽和度繪制方法,基于 VC++實現(xiàn)了油藏飽和度動態(tài)展示,該方法實現(xiàn)簡便,便于用戶直觀理解油藏模型結構,分析剩余油分布情況。由于采用了模塊化的設計思想因此具有較強的擴展性,可以方便的與其他業(yè)務模塊集成。
[1]滕貽健,柴山,荊旭,等.基于 Open Inventor的虛擬駕駛仿真系統(tǒng)[J].計算機應用, 2009,29(s1):323-325
[2]閻鋒欣,候增選,張定華,等.Open Inventor程序設計從入門到精通[M].北京:清華大學出版社,2007.
[3]孟鑫,張樺.Open Inventor開發(fā)的關鍵技術與應用[J].天津理工大學學報.2005,21(1):69-73.
[4]Open Inventor 8 User’s Guide.[M]Mercury Computer System Inc.2009.
[5]Josie Wernecke.The Inventor Mentor:Programming Object-Oriented 3D Graphics with Open Inventor,Release 2[M],Addison-Wesley Publishing Company,1994.
[6]白永良,劉展,魏合龍等.基于 Open Inventor油藏四維展示方法研究 [J].西安石油大學學報(自然科學版).2012,12(1):94-98.
[7]Alan Ezust,Paul Ezust.An Introduction to Design Patterns in C++ with Qt4[M]Prentice Hall,2006.
[8]胡貴華,朱文華 ,俞 濤,王 棟.PECVD 熱流場數(shù)值模擬的可視化研究[J].系統(tǒng)仿真學報.2008,20(21):5885-5888.