VC 环境下网格文件解析技术研究与应用
2015-11-26郑朝亮杨余旺
郑朝亮,杨余旺
(南京理工大学计算机科学与工程学院,江苏 南京 210094)
0 引言
网格划分是计算机图形学研究的重要内容,目前,有多种网格划分算法,如拓扑分解法、节点连接法、映射单元法、基于栅格法等。建立计算模型是流体力学(CFD)的重要环节,通常来说CFD 的计算模型都是简单的规则体或者是规则体的叠加[1]。目前多款商业构型软件都能生成网格文件,但是在网格文件的结构上存在差异。
本文对导入Fluent 的网格文件以OpenGL 图形处理软件进行物理模型的显示,主要针对以Gambit软件生成的网格文件,由于鲜有文献对网格文件的结构进行说明以及解释,所以对网格文件的解析是通过对大量网格文件的分析与总结得出的。最终通过程序解读,在VC 平台用C 语言编程,逐步实现点、线、面、体的模型构建,使网格文件在开发的环境中正确显示。
本文采用Visual C ++6.0 Enterprise 作为开发工具,利用MFC 基础类库作为整体软件程序界面的开发基础,利用OpenGL 图形库作为整体软件程序图形显示处理的开发基础。通过对网格文件的解读后,自行绘制出相应的图形,最终形成较为方便、快捷、全面的模拟计算程序。
1 网格文件物理解读
网格文件大小不一,但是总体结构遵循一定的生成规律。在程序中对网格文件解读并且生成对应的图形,必须先对其进行正确的物理解读[2]。下面以Gambit 软件生成的网格文件为例,对其基本构成进行解读:
以上为网格文件的基本构成,一般的网格文件大小从几十kB 到上百MB 不等,但是基本组成类似,本文将核心部分挑出进行解读。
1)前2 行解释生成此文件所用的软件,如此例中表示的为Gambit 软件生成的网格文件。(2ND)解释此网格模型的维度,ND 为2 时则为二维网格,ND 为3 时则为三维网格。
2)(10(zone-id first-index last-index type ND)):
其中索引10 表示此类为网格点(node)信息。zone-id表示分配给该区域的编号。first-index last-index 分别为所有点的起始以及结束索引,表示方式为16 进制数字。type 表示点在网格中的类型,type 等于0 时为“虚”点,等于2 时为边界点,等于1 时为无类型。在一般网格文件中,点的类型都为无类型,即type 都为1。ND 为表示网格维度:2 表示二维,3 表示三维。x,y,z 表示点的坐标信息,如无特殊情况,此类即表示构成网格所有的点的坐标信息[3]。
3)(13(zone-id first-index last-index type elementtype)):其中索引13 表示此类为网格面(Face)信息。zone-id 与点信息一样,表示该面所分配到的编号。first-index last-index 分别表示构成该面的起始点以及结束点的索引,用16 进制表示。type 表示此面作为边界的类型,目前总结出的所有类型,可参考表1。element-type 一般有3 种表示,并且决定n_type 表达方式,具体见表2。在具体信息里,n0,n1,n2 分别表示构成网格单元的点(n_type 为3 有3 个点,n_type为4 有4 个点)的索引,具体点的坐标信息可根据点的索引于网格点信息(10)中进行检索。cr,c1 分别为此表面与右侧区域以及左侧区域的关系,可根据这2 个值确定此面是否为耦合面。
表1 type 类型
表2 Face 类中element-type 的类型
4)(12(zone-id first-index last-index type elementtype)):索引12 表示此类为单元Cell 信息,zone-id,first-index,last-index 与之前的解释类似。type 的值一般为1,表示正常区域。element-type 表示该部分Cell的类型,具体如表3。
表3 Cell 类中element-type 的类型
5)(45(zone-id zone-type zone-name)()):索引45 表示此类为命名信息,zone-id 为对应区域的编号,zone-type 为对应区域的类型:若区域为Cell,则zonetype 的类型有fluid 和solid[4];若区域为Face,zonetype 的类型可参考表1。
2 网格文件显示设计
通过对网格文件的结构解析,为软件程序读取网格文件,并且通过OpenGL 显示功能的实现提供了非常重要的参考和帮助。软件程序基于网格文件的结构,编制了网格文件的分析程序,分析程序主要包含openMsh(),readPoint(),readFace(),readZone()共4类函数功能。其中,openMsh()为打开网格文件;其它3 个函数依次对应网格文件的3 个基本要素:点、面、区。具体流程见图1。
图1 流程图
各函数模块功能为:
1)openMsh()函数:读入整个网格文件内容,并检索网格文件是否由Gambit 软件生成,判断网格文件为二维还是三维。
2)readPoint()函数:提取网格文件中所有点的信息,包括点的坐标以及每个点的编号。
3)readFace()函数:提取网格文件中所有面的信息,包括构成该面的所有点的信息。
4)readZone()函数:提取网格文件中所有区域(Cell)的信息,包括构成该区域内所有点的信息。
在完成对整个网格文件的分类提取储存后,判断当前的绘图模式,绘图模式包括整体显示模式DrawMSHScene()、部分显示模式DrawZoneScene()、突出显示模式DrawZoneHightScene(),提取所需绘制部分的点、面、区的信息,通过RenderScene()函数对网格图形进行显示。
3 网格文件程序解读
以装甲车辆网格文件为例,通过Fluent 对装甲车辆进行数值模拟,建立装甲车辆及地面背景的物理模型。本文以已经公布的坦克图片、部件尺寸参数为参考,在保留外部几何形状,保留温度分布特征明显的部件,尽量简化、舍弃内部复杂细小部件,减少网格数量,提高计算速度的前提下,建立简化的坦克装甲车辆的物理模型。
在物理模型的基础上使用Gambit 软件进行网格划分,网格划分遵从由内到外,优先六面体网格,其次四面体网格,热交互强烈处密,其次疏的准则[5]。得到坦克装甲车辆具体的混合型网格,见图2。
3.1 结构设计
一个网格文件大小从几百kB 到几百MB 不等,对于其中的点、面、体信息记录的量很庞大,程序设计之前,首先定义相关的结构体,以记录存储信息[6]。
1)定义点的结构体,命名为vertex,内部定义int型编号number,及float 型x、y、z 存储点的位置。
2)定义面的结构体,命名为face,内部主要是int型编号number。
3)定义区域的结构体,命名为zone,内部需要有string 型变量记录名字,对应区域类型,判断是否是耦合面,如果是还得添加相关信息[7]。
3.2 信息读取
读入1 个网格文件(msh 文件)后,依次遍历,分别执行readPoint()、readFace()、readZone()这3 个函数。
1)readPoint()函数执行相对简单,遍历网格文件中所有的点信息,通过压栈将信息存储。
2)readFace()函数执行相对复杂,最大的难点是判断是否有阴影面。本文规定若有阴影面,则添加1个面为shadow 面,名称为原来的面加后缀“-shadow”。如wall 面为阴影面,则由wall 面产生1 个阴影面”wall-shadow”。
3)readZone()函数将网格文件最后的Zones 信息读入。依然通过压栈方式存储[8]。
3.3 图形绘制
在View 类里,添加1 个名为DrawMSHScene()的函数,以完成网格文件的绘制工作。在此函数中,将之前压入堆栈的信息出栈,通过OpenGL 简单的画点和线的方式将这些信息连接起来即可[9]。为了用户观察方便,程序中添加DrawZoneHightScene()函数,当指定具体的边界时,该边界区域以红色线条显示。图形显示区可包括一般的图形操作功能,如对图形的拖拽、旋转、放大缩小等功能。
构件名称选择“fushequ”,边界名称选择“facetouming”,得到的效果图见图3。
图3 网格文件读取显示
3.4 信息选择
一个完整的网格文件信息众多,其边界从几个至几十上百个不等,在信息读取功能中已经记录了所有的边界,在程序中用户可以自主选择[10]。每当做不同的选择时,图形显示区域可将对应的边界区域用红色显示,使网格读取程序更加智能[11]。操作界面见图4。
图4 操作界面
3.5 与Fluent 交互
Fluent 采用了多种求解方法和多重网格加速收敛技术,因而Fluent 能达到最佳的收敛速度和求解精度。本软件为了更加精准和直观,加入了与Fluent 交互的功能。
本软件与Fluent 之间的交互功能主要是通过程序向Fluent 发送命令来实现,而实现这项功能主要是依靠void do_command(CString&str)以及void do_commands(CStringArray&str)两功能函数,前者能向Fluent 发送一条命令,后者则能一次发送多条命令。其中CString&str 以及CStringArray&str 分别为所需发送给Fluent 的一条或者多条命令。考虑到用户使用软件程序的方便性,软件程序内大多采用后者,即一次向Fluent 发送多条指令,以减少用户工作量。比如需要对导入的网格文件进行检查,软件程序向Fluent发送相应命令的程序为do _command(“/mesh/check”)。
Fluent 初始化时与本软件程序交互的结果见图5。
图5 与Fluent 同步交互
4 结束语
本文的主要意义在于结合实际应用中的需要,研究快速显示网格文件的方法。通过对网格文件进行正确解读,在VC 平台上以OpenGL 图形处理软件绘制并建立了一套网格文件解读软件,证明了其可行性,为其他二次开发软件提供经验,具有一定的实用价值。
[1]张师帅.计算流体动力学及其应用——CFD 软件的原理与应用[M].武汉:华中科技大学出版社,2011.
[2]程雪玲,胡非.复杂地形网格生成研究[J].计算力学学报,2006,23(3):314-316.
[3]Sibon R.Locally equiangular triangulations[J].The Computer Journal,1978,21(3):243-245.
[4]胡瑞安.计算机辅助几何设计[M].武汉:华中理工大学出版社,1987.
[5]程耀东,汪璐,刘爱贵,等.面向高能物理计算的网格文件系统[J].计算机科学,2008,35(11):36-38,39.
[6]丰存礼,刘成,张敏华.商业软件Gambit 和Fluent 在化工中的应用[J].计算机与应用化学,2005,22(3):231-234.
[7]肖冰,石爱国,王骁.基于GAMBIT 的舰船全附体几何建模[J].船舶工程,2010(S2):33-35.
[8]王骁,万林,杨波,等.基于Pro/ENGINEER 曲面建模技术的三维船体造型设计[J].舰船科学技术,2007,29(5):12-14.
[9]纪宏超,李耀刚,郑镭.VB 开发Gambit 关键问题的研究[J].唐山学院学报,2012,25(6):9-11.
[10]Fritz G Wollenweber.Weather impact on background temperature as predicted by an IR background model[C]//Characterization,Propagation,and Simulation of Infrared Scenes.SPIE,1311,1990.
[11]ASHRAE.ASHRAE Fundamentals Handbook(SI)[Z].ASHRAE,2001:674-678.
[12]宣益民,刘俊才,韩玉阁.车辆热特征分析及红外热像模拟[J].红外与毫米波学报,1998,17(6):441-446.
[13]韩玉阁,宣益民,马忠俊.成像目标的红外隐身效果评估[J].红外技术,2010,32(4):239-241.
[14]Cox C,Munk W.Statistics of the sea surface derived from sun glitter[J].Journal of Marine Research,1954,13:198-227.
[15]Ballard J R.Yuma 1 Information Base for Generation of Synthetic Thermal Scenes[R].Mississippi:Smart Weapons Operability Enhancement Report 944,1994.
[16]章博,陈国明,孔令圳.一种真实地形计算流体力学网格生成方法[J].中国石油大学学报(自然科学版),2011,35(5):104-108.
[17]何川,李三立,黄震春,等.先进计算基础设施(ACI)试验平台软件系统的设计和实现[J].小型微型计算机系统,2003,24(2):202-206.
[18]王立军,潘志洋.基于参数化建模的强制惯性分离室气流清选原理研究[J].东北农业大学学报,2014,45(3):104-109.