王 雷,张诗悦,吴东伟
(河海大学,江苏 南京 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++编制友好的人机交互界面。