王 雷,張詩悅,吳東偉
(河海大學,江蘇 南京 210098)
通常水力學數值模擬的結果是一系列二進制數據或ASCII數據文件,為便于分析水流運動狀態需要把這些數據圖形化,這種數據可視化軟件稱為后處理軟件。目前常用的后處理軟件是Tecplot和Surfer軟件。他們提供了繪制流速矢量圖的簡單數據接口,但這些軟件一次僅能繪制一幅靜態矢量圖或標量圖,若想生成動態效果,需要事先準備大量數據。并且這些軟件不提供源代碼或通用數據接口,所以通常不能與水力學計算程序合并編譯。因此,開發一套較完善的計算水力學軟件必須研發其獨立的后處理模塊。本課題立足于此,根據水力學模型計算的數據結果,在通過OpenGL構建的三維可視化虛擬場景中,利用底層圖形開發方式進行洪水流場的可視化模擬分析研究,在流速變化較大區域和需要重點觀測區域提取斷面,分析斷面和洪水淹沒情況,從而解決洪水流場數值可視化的問題,彌補目前存在的中間數據存儲量大、模擬時間滯后和采用商業軟件很難進行交互控制等不足。
在計算水力學中常用的圖形有流速向量圖和流場內物理量等值圖,這些圖須具有顯示準確、便于查看以及美觀等特點。計算機高級編程語言VB、VC++和Delphi等均提供了繪圖工具。從理論上講,這些繪圖工具可以滿足流場的圖形化,但對于復雜的圖形,尤其是三維圖形,繪圖算法往往很復雜以致于難以實現。為高效地開發流場圖形化軟件,須選用圖形應用程序接口(Application Programming Interface,簡稱API)。圖形API是由計算機軟件或硬件公司開發的通用繪圖程序,其中包含了構造景物模型和實現人機交互的圖形操作函數。程序員只需要調用API指令集進行布景、建模、光照與渲染,無須考慮圖形硬件和圖形效果的算法。
目前常用的計算機圖形API有DirectX和OpenGL。DirectX僅能用于Windows系列的操作系統,而OpenGL獨立于操作系統和硬件環境,具有良好的可移植性和易用性。OpenGL的圖形操作函數十分靈活,用戶可從點、線、面等最基本的圖形開始構造自己的模型。實際上,OpenGL可以看做圖形硬件的軟件接口,其中不包含任何窗口函數。在Windows系統中,OpenGL圖形庫封裝在一個動態鏈接庫內(OPENGL32.DLL),因此,必須使用一個“窗口”系統來實現OpenGL的圖形顯示和操作。目前VB、VC++以及Delphi等高級編程平臺均可用于OpenGL的“窗口”實現。
水力學計算程序大多是用FORTRAN或C語言編制,也有BASIC或PASCAL等語言。為保持軟件通用性,須采用多語言混合編程技術實現后處理模塊與計算程序間的數據傳遞。
由于VC++包含了功能強大的窗口開發框架,并易實現多語言混合編程,本文采用Visual C++調用圖形庫OpenGL實現流場的圖像顯示,使用計算機語言混合編程技術實現水力學計算程序與后處理模塊的數據傳遞,并基于VC++實現友好的人機交互界面。軟件框架如圖1所示。

2.2.1 VC++調用OpenGL實現流場可視化
采用VC++調用OpenGL實現流場圖形化,首先須建立兩者之間的應用接口,其具體方法是將支持OpenGL的動態鏈接庫函數添加到VC++預編譯頭文件中,然后調用OpenGL中的模型函數和功能函數進行建模。OpenGL能夠建立線框模型和表面模型兩種幾何模型。在進行建模時任意復雜的三維實體須用一個個小的多邊形面來近似表示。OpenGL的建模實質上是根據所給定的頂點數據和面信息建立起各個多邊形面元,并將其存儲到顯示列表中,在需要時予以調用顯示。采用此方法可以方便地對水力學中起伏不平的河床和自由水面進行三維仿真。
繪制流速矢量圖時,可以采用3條線段組成的箭頭表示矢量;等值圖則可以采用對節點設置不同的灰度或顏色來實現。
2.2.2 基于VC++的多語言混合編程技術
為保證計算水力學后處理程序的通用性,應實現VC++與其他編程語言的混合編程。本文以常用的計算程序編程語言FORTRAN為例進行闡述。
實現混合編程的方法通常有兩種:一種是動態鏈接庫法,即將FORTRAN程序在Fortran PowerStation 4.0開發環境中做成動態鏈接庫,然后VC++程序調用此動態鏈接庫,通過數據列表實現VC++程序與FORTRAN程序的數據傳遞。
第二種方法是VC++直接調用FORTRAN可執行文件。這種方法簡單,不必對現有的FORTRAN程序進行任何改動。實現方法是在VC++程序塊中使用語句調用exe可執行文件。這種方法實際上是用存儲介質作為兩種語言數據交流的載體,代替了第一種方法中的參數列表。由于多了寫入、讀出環節,同樣的算例,第二種方法的耗時比第一種方法多,但是第一種方法要求VC++程序與FORTRAN程序對應的變量字節數應相同,否則可能得出不合理的結果,第二種方法就不必考慮這個問題。在數據量較小的情況下,兩種方法都具有較快的計算速度,均可采用。
采用數值方法模擬寬淺河道中丁壩附近的流場。數值模擬方法為采用有限體積法離散求解基于坐標的準三維淺水方程,計算網格取為正交曲線網格,并采用FORTRAN語言編制計算程序。
采用第二種VC++與FORTRAN的混合編程方法,后處理程序可以清楚地顯示河床地形。圖2為河道地形高程的等值圖。丁壩布置在河床右岸,設定壩頂高程為4.0m,壩底高程0.0 m,上游河床來水流量為264 m3/s,下游恒定水位為6.4 m。這些參數通過VC++編制的用戶界面傳遞給FORTRAN程序,FORTRAN程序計算穩定后將計算結果以硬盤文件的方式輸出,再由VC++調用OpenGL將結果圖形化。圖3為丁壩附近水面處流場矢量圖。

通過實例分析可知,通過Visual C++調用圖形庫OpenGL可實現流場的圖像顯示,使用計算機語言混合編程技術可實現水力學計算程序與后處理模塊的數據傳遞,并可基于VC++編制友好的人機交互界面。