王 雷,張詩悅,吳東偉
(河海大學(xué),江蘇 南京 210098)
通常水力學(xué)數(shù)值模擬的結(jié)果是一系列二進制數(shù)據(jù)或ASCII數(shù)據(jù)文件,為便于分析水流運動狀態(tài)需要把這些數(shù)據(jù)圖形化,這種數(shù)據(jù)可視化軟件稱為后處理軟件。目前常用的后處理軟件是Tecplot和Surfer軟件。他們提供了繪制流速矢量圖的簡單數(shù)據(jù)接口,但這些軟件一次僅能繪制一幅靜態(tài)矢量圖或標(biāo)量圖,若想生成動態(tài)效果,需要事先準(zhǔn)備大量數(shù)據(jù)。并且這些軟件不提供源代碼或通用數(shù)據(jù)接口,所以通常不能與水力學(xué)計算程序合并編譯。因此,開發(fā)一套較完善的計算水力學(xué)軟件必須研發(fā)其獨立的后處理模塊。本課題立足于此,根據(jù)水力學(xué)模型計算的數(shù)據(jù)結(jié)果,在通過OpenGL構(gòu)建的三維可視化虛擬場景中,利用底層圖形開發(fā)方式進行洪水流場的可視化模擬分析研究,在流速變化較大區(qū)域和需要重點觀測區(qū)域提取斷面,分析斷面和洪水淹沒情況,從而解決洪水流場數(shù)值可視化的問題,彌補目前存在的中間數(shù)據(jù)存儲量大、模擬時間滯后和采用商業(yè)軟件很難進行交互控制等不足。
在計算水力學(xué)中常用的圖形有流速向量圖和流場內(nèi)物理量等值圖,這些圖須具有顯示準(zhǔn)確、便于查看以及美觀等特點。計算機高級編程語言VB、VC++和Delphi等均提供了繪圖工具。從理論上講,這些繪圖工具可以滿足流場的圖形化,但對于復(fù)雜的圖形,尤其是三維圖形,繪圖算法往往很復(fù)雜以致于難以實現(xiàn)。為高效地開發(fā)流場圖形化軟件,須選用圖形應(yīng)用程序接口(Application Programming Interface,簡稱API)。圖形API是由計算機軟件或硬件公司開發(fā)的通用繪圖程序,其中包含了構(gòu)造景物模型和實現(xiàn)人機交互的圖形操作函數(shù)。程序員只需要調(diào)用API指令集進行布景、建模、光照與渲染,無須考慮圖形硬件和圖形效果的算法。
目前常用的計算機圖形API有DirectX和OpenGL。DirectX僅能用于Windows系列的操作系統(tǒng),而OpenGL獨立于操作系統(tǒng)和硬件環(huán)境,具有良好的可移植性和易用性。OpenGL的圖形操作函數(shù)十分靈活,用戶可從點、線、面等最基本的圖形開始構(gòu)造自己的模型。實際上,OpenGL可以看做圖形硬件的軟件接口,其中不包含任何窗口函數(shù)。在Windows系統(tǒng)中,OpenGL圖形庫封裝在一個動態(tài)鏈接庫內(nèi)(OPENGL32.DLL),因此,必須使用一個“窗口”系統(tǒng)來實現(xiàn)OpenGL的圖形顯示和操作。目前VB、VC++以及Delphi等高級編程平臺均可用于OpenGL的“窗口”實現(xiàn)。
水力學(xué)計算程序大多是用FORTRAN或C語言編制,也有BASIC或PASCAL等語言。為保持軟件通用性,須采用多語言混合編程技術(shù)實現(xiàn)后處理模塊與計算程序間的數(shù)據(jù)傳遞。
由于VC++包含了功能強大的窗口開發(fā)框架,并易實現(xiàn)多語言混合編程,本文采用Visual C++調(diào)用圖形庫OpenGL實現(xiàn)流場的圖像顯示,使用計算機語言混合編程技術(shù)實現(xiàn)水力學(xué)計算程序與后處理模塊的數(shù)據(jù)傳遞,并基于VC++實現(xiàn)友好的人機交互界面。軟件框架如圖1所示。
2.2.1 VC++調(diào)用OpenGL實現(xiàn)流場可視化
采用VC++調(diào)用OpenGL實現(xiàn)流場圖形化,首先須建立兩者之間的應(yīng)用接口,其具體方法是將支持OpenGL的動態(tài)鏈接庫函數(shù)添加到VC++預(yù)編譯頭文件中,然后調(diào)用OpenGL中的模型函數(shù)和功能函數(shù)進行建模。OpenGL能夠建立線框模型和表面模型兩種幾何模型。在進行建模時任意復(fù)雜的三維實體須用一個個小的多邊形面來近似表示。OpenGL的建模實質(zhì)上是根據(jù)所給定的頂點數(shù)據(jù)和面信息建立起各個多邊形面元,并將其存儲到顯示列表中,在需要時予以調(diào)用顯示。采用此方法可以方便地對水力學(xué)中起伏不平的河床和自由水面進行三維仿真。
繪制流速矢量圖時,可以采用3條線段組成的箭頭表示矢量;等值圖則可以采用對節(jié)點設(shè)置不同的灰度或顏色來實現(xiàn)。
2.2.2 基于VC++的多語言混合編程技術(shù)
為保證計算水力學(xué)后處理程序的通用性,應(yīng)實現(xiàn)VC++與其他編程語言的混合編程。本文以常用的計算程序編程語言FORTRAN為例進行闡述。
實現(xiàn)混合編程的方法通常有兩種:一種是動態(tài)鏈接庫法,即將FORTRAN程序在Fortran PowerStation 4.0開發(fā)環(huán)境中做成動態(tài)鏈接庫,然后VC++程序調(diào)用此動態(tài)鏈接庫,通過數(shù)據(jù)列表實現(xiàn)VC++程序與FORTRAN程序的數(shù)據(jù)傳遞。
第二種方法是VC++直接調(diào)用FORTRAN可執(zhí)行文件。這種方法簡單,不必對現(xiàn)有的FORTRAN程序進行任何改動。實現(xiàn)方法是在VC++程序塊中使用語句調(diào)用exe可執(zhí)行文件。這種方法實際上是用存儲介質(zhì)作為兩種語言數(shù)據(jù)交流的載體,代替了第一種方法中的參數(shù)列表。由于多了寫入、讀出環(huán)節(jié),同樣的算例,第二種方法的耗時比第一種方法多,但是第一種方法要求VC++程序與FORTRAN程序?qū)?yīng)的變量字節(jié)數(shù)應(yīng)相同,否則可能得出不合理的結(jié)果,第二種方法就不必考慮這個問題。在數(shù)據(jù)量較小的情況下,兩種方法都具有較快的計算速度,均可采用。
采用數(shù)值方法模擬寬淺河道中丁壩附近的流場。數(shù)值模擬方法為采用有限體積法離散求解基于坐標(biāo)的準(zhǔn)三維淺水方程,計算網(wǎng)格取為正交曲線網(wǎng)格,并采用FORTRAN語言編制計算程序。
采用第二種VC++與FORTRAN的混合編程方法,后處理程序可以清楚地顯示河床地形。圖2為河道地形高程的等值圖。丁壩布置在河床右岸,設(shè)定壩頂高程為4.0m,壩底高程0.0 m,上游河床來水流量為264 m3/s,下游恒定水位為6.4 m。這些參數(shù)通過VC++編制的用戶界面?zhèn)鬟f給FORTRAN程序,F(xiàn)ORTRAN程序計算穩(wěn)定后將計算結(jié)果以硬盤文件的方式輸出,再由VC++調(diào)用OpenGL將結(jié)果圖形化。圖3為丁壩附近水面處流場矢量圖。
通過實例分析可知,通過Visual C++調(diào)用圖形庫OpenGL可實現(xiàn)流場的圖像顯示,使用計算機語言混合編程技術(shù)可實現(xiàn)水力學(xué)計算程序與后處理模塊的數(shù)據(jù)傳遞,并可基于VC++編制友好的人機交互界面。