高若辰,淮晓永,张志达,李佰文
(华北计算机系统工程研究所,北京 100083)
计算流体力学(Computational Fluid Dynamics,CFD)是流体力学和计算机科学相互融合的一门新兴交叉学科,其基本原理是把待求解的连续物理场(如速度场和压力场)分解成有限个离散点的集合,然后建立控制流体流动的控制方程,通过求解方程组得到的近似解来模拟流体流动情况[1-2]。CFD 在汽车、船舶、航空航天、工业设计等多个领域具有广泛的应用[3-4]。
CFD 的基本结构组成一般分为前处理、数值求解和后处理分析三部分。其中,网格生成是前处理的关键步骤之一,在计算流体力学的工业应用实践中,一般有40%~45%的时间耗费在前处理阶段[5]。
网格生成是对连续计算流场的离散化,把一个连续的几何区域分割成许多很小的单元,以便在离散的单元上进行流场代数方程的数值求解[6]。为了获得高精度的数值仿真解,需要将计算域划分为尽可能小的网格单元,质量好的网格通常可以达到千万甚至上亿的数量级。网格数量越多,对CPU、内存等计算资源的需求也会越高。因此,复杂大型模型的网格生成计算需要耗费巨大的计算资源。
为了解决网格生成技术计算量大、耗时长的问题,一方面是优化网格生成技术,如动网格生成技术[7]、重叠网格生成技术[8]和自适应网格生成技术[9-12];另一方面,利用云端的高性能服务器资源进行网格生成计算也是工程技术发展的方向之一[13]。本文对云计算技术与网格生成技术进行集成,设计开发了一个网格生成服务原型系统,并基于OpenFOAM 网格生成器设计实现了一个面向云计算环境的网格生成服务原型软件。
网格生成服务模型如图1 所示。网格生成服务模型通过定义网格生成应用协议,对网格生成API 方法进行服务接口封装,建立支持WAMP(Web Application Messaging Protocol,一种在Websocket 协议基础上的应用层协议标准)的服务接口协议。
图1 网格生成服务模型
网格生成的一般步骤如下:
(1)导入算例的几何模型;
(2)选择合适的网格划分算法;
(3)根据网格划分算法设置相应的网格参数;
(4)执行网格划分计算;
(5)检查生成网格的质量;
(6)根据求解器网格格式执行相应的网格类型转换,转换为可用于求解器的网格。
根据网格生成步骤分析,网格生成服务一般包括查询可用的网格划分方法、获取网格划分方法的网格设置参数内容、设置算例的网格参数、划分网格、检查网格质量、网格类型转换等功能。面向网格生成服务需求,设计网格生成应用协议MeshProtocol 的接口方法如表1 所示。
表1 MeshProtocol 应用协议接口
基于MeshProtocol 网格应用协议建立一个网格生成Server,通过ClientFactory 管理客户端连接,当Client 成功连接时则创建协议对象接收Client 请求执行相应计算功能。
基于客户端/服务器模型的网格生成计算序列图如图2 所示。
图2 基于服务的网格生成序列图
(1)用户选择要仿真分析方案的几何模型文件,客户端导入其几何模型文件;
(2)客户端调用方法查询服务,查询服务中可用的网格划分方法;
(3)服务器返回可供用户使用的划分方法;
(4)客户端根据网格划分方法名称初始化网格生成用户界面的划分方法选择部分;
(5)用户选择一种网格划分方法;
(6)客户端调用获取参数内容服务,查询该网格划分方法中各个设置参数的参数名、默认值、参数说明等信息;
(7)服务器返回查询到的网格设置参数内容;
(8)客户端根据网格设置参数内容生成网格生成用户界面的网格参数设置部分;
(9)用户根据算例需求在网格设置界面中设置适当的网格参数,客户端调用参数设置服务将参数上传至服务器;
(10)客户端调用网格划分服务执行网格划分;
(11)服务器生成网格文件并返回网格划分日志;
(12)若网格划分成功,客户端显示生成的网格数据的图像,否则显示执行错误信息,由用户根据错误信息修正,直到执行成功;
(13)客户端调用网格检查服务检查网格质量;
(14)服务器返回网格质量检查结果;
(15)客户端调用网格转换服务,根据求解器网格格式执行相应的网格类型转换;
(16)服务器返回转换后的网格文件。
网格生成计算需要对算例进行计算域的网格设置,如设置几何缩放因子、计算域范围、网格疏密和边界部件等网格设置,不同划分方法根据算法特征提供不同的参数设置。服务提供不同方法的交互参数模板规范,客户端根据模板动态创建交互面板,给用户提供交互界面。
网格参数设置的主要类型包括单值输入和多参数表格输入两类组件。单值输入组件应当定义组件类型、参数标签、参数类型、参数名、参数默认值和参数的用户帮助说明信息。具体代码如下:
多参数表格输入组件应当定义组件类型、表名、表头内容、参数类型、每行表格参数,每行表格参数又应分别设置参数标签、参数名、参数默认值和参数的用户帮助说明信息。具体代码如下:
OpenFOAM 是由OpenCFD Ltd 于2004 年开发的一款免费、开源的CFD 软件[14]。OpenFOAM 提供的典型网格划分方法有blockMesh、snappyHexMesh 等。其中blockMesh用于生成简单几何结构网格,snappyHexMesh 用于快速高效地划分六面体+多面体网格[15]。采用上述网格服务模型,下面对OpenFOAM 的网格划分方法进行服务化封装,实现了一个基于OpenFOAM 的网格生成服务原型系统ofMeshService。
ofMeshService 的原型框架组成如图3 所示。其中:MeshProtocol 协议针对网格生成服务为客户端提供的基本接口,包括划分方法查询接口、参数获取接口、参数设置接口、网格划分接口、网格检查接口、网格转换接口等;ws-link 提供基于websocket 的rpc 网络通信基础服务;blockMesh、snappyHexMesh 是两种网格划分方法;checkMesh 提供网格质量检查处理;foamMeshToFluent 提供把OpenFOAM 网格格式转换为Fluent 网格格式的转换工具。
图3 ofMeshService 网格服务框架
根据OpenFOAM 的参数文件分析,blockMesh 划分方法提供的参数设置有几何缩放因子、包围盒大小、计算域范围、网格疏密、网格单元膨胀率和边界部件等。几何缩放因子和包围盒大小使用单值输入组件,其余参数可分为计算域和边界部件两大类,分别用多参数表格输入组件。客户端解析blockMesh 的用户交互参数模板信息后动态生成的参数设置界面如图4 所示。
图4 blockMesh 参数设置界面示意图
snappyHexMesh 首先使用blockMesh 进行初始化网格划分,在此基础上对网格做进一步精细划分,因此snappyHexMesh 划分界面首先需要继承blockMesh 界面的功能。此外,还需增加几何细化等级、材质点坐标等参数设置,分别用多参数表格输入组件定义。客户端解析snappy-HexMesh 的用户交互参数配置信息后生成的参数设置界面如图5 所示(较blockMesh 新增部分)。
图5 snappyHexMesh 参数设置界面示意图
如图6 所示,将网格生成服务部署在云服务上,在云上创建服务器实例。服务器实例基本计算资源配置为CPU:FT2000+,16 核,32 GB 内存。测试算例为摩托车外流场网格划分,使用snappyHexMesh 划分方法生成摩托车外流场计算域网格。
图6 “云+端”的网格生成服务结构
分别通过测试1、测试2 测试单机网格划分、“云+端”网格划分两种情况下的网格划分执行时间。
测试1:对算例调用本地的snappyHexMesh 划分方法,记录其网格划分执行时间。
测试2:通过服务器上的网格生成服务执行网格划分,测试记录网格划分执行时间。
测试结果如表2 所示。
表2 单机版与云服务版网格生成计算对比
测试结果表明,网格生成服务能够给客户端提供网格生成计算基本服务接口,满足网格生成计算需求;由于利用了云上的高性能计算资源,有效提高了网格生成计算效率,减少了网格生成执行时间,增强了用户体验友好性。
针对网格划分计算量大、计算耗时长的问题,本文提出了一种面向云计算的网格生成服务模型,从而使网格生成可以部署在高性能的云服务器上,客户端可以远程通过网格生成应用协议与网格生成计算进行通信。客户端只负责GUI 人机交互,大规模的网格生成处理在云上高性能能服务器上执行,从而提高了网格生成计算的效率,增强了网格生成处理计算用户体验的友好性。