基于C/S 架构的OpenFOAM 网格生成客户端软件设计*
2022-03-07张志达淮晓永高若辰
张志达,淮晓永,高若辰
(华北计算机系统工程研究所,北京 100083)
0 引言
OpenFOAM 是一个开源的计算流体力学类库,提供了丰富的网格生成与求解计算功能,功能强大且应用广泛[1]。但相对于Fluent、CFX 等商业计算流体力学(Computational Fluid Dynamics,CFD)软件,OpenFOAM 只提供了基于命令行的人机交互方式,没有图形用户界面功能,人机交互效率较低,易用性较差。为此,GUI 功能开发是OpenFOAM的主要研究扩展方向之一,如Atizar 公司基于OpenFOAM库开发了提供GUI 人机交互功能的CFD 软件SimFlow。SimFlow 的GUI 交互界面体现了业务的流程性,从新建工程、选择几何模型和设置参数到网格划分执行,但界面嵌套层次较深,操作交互体验较差。除了SimFlow,目前市面上还有许多基于OpenFOAM 开发的GUI 软件,如Ansa、cfFlow、iconCFD 等,这些软件在界面风格设计存在不适合多任务操作、嵌套层级多、不能展示入口操作等问题[2]。
本客户端软件参考以上相关的软件进行设计,采用了扁平化设计思想来提升用户的交互体验。并面向云部署网格生成服务,采用C/S 架构,研究设计了一个基于OpenFOAM 的网格生成GUI 客户端软件,通过网格生成应用协议远程调用云上的OpenFOAM 网格生成计算服务[3],根据服务的交互界面模板在客户端构建用户交互界面,实现了云端协同GUI 友好的网格生成计算[4]。
在客户端软件设计中采用了可配置菜单、插件式组件设计等方法,并基于Qt 库[5]进行客户端实现,提高了客户端软件的用户自定义、可扩展、跨平台特性[6]。
1 网格生成需求分析
1.1 OpenFOAM 网格服务
为了提高网格生成计算的效率,通过在OpenFOAM网格生成方法之上增加网格应用生成协议,实现了一个可以云上部署的OpenFOAM 网格生成服务[7]。该服务提供的服务接口包括:获取网格划分方法服务接口、获取网格设置服务接口、启动网格生成服务接口、停止网格生成运行服务接口、获取网格生成运行过程输出信息服务接口、网格质量检查服务接口、获取网格划分结果数据服务接口[8]。客户端和服务端通过网络连接,采用wslink 1.0 作为数据传输协议向服务端发送调用网格生成服务的网络请求,并获取网络响应[9]。服务端提供的服务接口和功能的对应表如表1 所示。
表1 服务端提供的OpenFOAM 网格生成服务接口
表1 中部分接口的说明如下:调用获取网格划分方法的服务接口时,服务端会向客户端返回支持的网格划分方法;调用获取网格设置的服务接口时,服务端通过解析网络请求获取客户端选择的网格划分方法,并返回网络响应,网络响应中包含该网格划分方法的参数设置面板信息,客户端通过解析网络响应,根据交互规范动态构建参数设置面板界面;调用获取网格划分结果数据的服务接口时,服务端会返回网格划分的结果文件,客户端通过解析此文件以图形化的方式向用户展示网格划分的结果[10]。
1.2 OpenFOAM 网格生成处理流程
客户端远程调用网格生成服务完成网格划分的处理流程如图1 所示。
图1 客户端软件网格划分流程图
首先客户端软件调用获取网格划分方法的服务接口从而获取服务端支持的网格划分方法,并将可选的划分方法展示在用户界面上;用户选择网格划分方法后,客户端软件调用获取该方法的参数设置服务接口,根据交互规范在界面上动态生成网格划分参数设置面板;客户端软件在接收到用户完成网格划分的参数设置信号后,调用网格生成计算的服务接口和网格生成运行过程输出信息服务接口,通过解析网络响应得到网格划分结束标志位“runend”的值,当“runend”的值不小于0 时,再次调用每秒读取计算输出信息的服务接口,当“runend”的值小于0 时,刷新图像渲染显示,将网格划分的结果展示给用户。网格划分计算结束后,可以调用网格质量检查服务接口,对生成的网格进行质量检查。
基于上述网格生成服务流程,下面给出一个网格生成客户端软件设计。
2 客户端软件设计
2.1 软件主框架
针对客户端软件的功能需求和用户可配置、可扩展的要求[11],设计的软件主框架如图2 所示。
图2 OpenFOAM 网格生成客户端软件主框架图
OpenFOAM 网格生成客户端软件由公共模块、自定义模块、网格生成业务插件三部分组成。公共模块是客户端软件的基础支撑模块,包括网络通信组件、服务解析组件、网格参数组件和用户信息组件。网络通信组件负责客户端和服务端的网络连接和数据传输,客户端软件通过该组件发送网络请求和接收网络响应;服务解析组件作为网络通信组件的辅助组件,根据客户端和服务端的应用层协议组建网络请求的数据包,解析网络响应的数据包,客户端软件通过服务解析组件获取网络响应中的网格划分结果数据以图形化的形式展示给用户;网格参数组件用于缓存用户设置的网格划分参数信息,在客户端调用启动网格生成服务时会向服务端发送包含网格划分参数的网络请求数据包,服务端在接收到客户端的网络请求后对计算域进行网格生成,从而实现云端协同进行网格生成目的;用户信息组件缓存用户信息,在调用网格生成服务的网络请求中携带用户信息以便服务端进行用户识别。
自定义模块中包含配置信息组件,该组件缓存从服务端获取的网格参数设置模板配置信息,客户端根据获取的模板构建用户交互界面。
网格生成业务插件包括文件插件、网格划分插件、网格工具插件、网格编辑插件和尺度缩放插件。文件插件实现了工程管理的功能;网格生成插件实现了网格计算域设置、边界部件设置、网格预览、运行网格划分的功能;网格工具插件实现了质量检查、类型转换的功能;网格编辑插件实现了光滑网格、修复网格、清理网格的功能;尺度缩放插件实现了图像缩放的功能。网格生成业务插件中除了封装对应的功能外,还封装了客户端软件工具栏区域的界面,插件和工具栏选项卡一一对应,客户端软件启动时通过加载插件动态构建工具栏区域的界面,从而提高了客户端软件的用户自定义特性及可扩展性。
2.2 用户界面设计
面向网格生成计算用户交互需求,根据GUI 图形用户界面软件设计规范[12],客户端软件界面设计如图3所示。
图3 OpenFOAM 网格生成客户端软件用户界面
界面分为标题栏、工具栏、用户参数设置面板、视图渲染区、文本信息区5 个分区。标题栏提供用户登录、工具栏收起、界面最小化、界面最大化、界面关闭、显示当前工程名称的功能;工具栏包含了文件、尺度缩放、网格生成、网格工具、网格编辑5 个选项卡;网格参数设置面板区能够根据接收到的来自服务端的JSON 配置信息动态生成网格参数设置面板;视图渲染区为图像显示区域,用来显示模型以及网格划分的结果;文本信息区为文本信息输出区域,用来显示服务执行过程输出信息、网格质量检查结果等文本类信息。
2.3 动态生成客户端软件用户界面
客户端软件的工具栏区域和网格参数设置面板区域以动态加载的方式生成。
为提高软件的用户自定义特性和可扩展性,采用了可配置菜单和插件式组件设计[13]。工具栏区域的每一个选项卡对应的功能都以组件类方式封装在相应的插件中,在客户端软件启动时会读取软件配置文件,根据配置文件的界面配置,从插件中动态加载创建各选项卡,生成客户端软件工具栏区域界面。这样,不同用户可以根据各自的功能需求,只加载构建需要的功能选项卡,实现个性化用户自定义配置的客户端软件。也可以按照插件组件接口规范实现自己的业务交互界面组件,实现对软件的自定义扩展。
另外,客户端软件根据OpenFOAM 网格服务的网格设置交互模板动态构建网格参数设置面板界面。用户在选择不同网格划分方法时,通过查询服务获得网格参数交互模板,然后根据模板配置信息动态生成客户端网格划分参数设置交互面板界面。客户端在接收到OpenFOAM服务端传输的JSON 配置信息后,首先判断字段为“ctype”对应的值,对于“ctype”取不同的值会展现不同的组件在网格参数设置面板区域。“ctype”取值为“single”或“table”,当“ctype”取不同的值时返回的JSON 配置信息中都包含有“vtype”字段和组件需要显示的数据。客户端软件根据“ctype”和“vtype”的值共同来设置展示数据的图形用户界面中的组件。“ctype”和“vtype”不同的值组合对应的组件如表2 所示。
表2 ctype 和vtype 不同组合对应的组件
除了工具栏区域、网格参数设置面板外,客户端软件的标题栏区域、视图渲染区、文本信息区在软件启动时通过静态加载的方式展示给用户。
2.4 客户端原型实现
OpenFOAM 网格生成客户端软件依据图形界面设计,基于Qt 库进行实现。Qt 是一个开源跨平台的GUI开发框架,组件丰富、功能全面,且支持跨平台[14]。客户端软件的图形用户界面中的标题栏区域、工具栏区域、网格参数设置面板、文本信息区采用QDockWidget 实现,视图渲染区采用QVTKOpenGLWidget 实现。网格参数设置面板动态生成过程中需要用表2 中的组件展示网格生成的参数信息,表2 中的组件对应于Qt 中的实现类如表3 所示。
表3 网格生成参数面板组件与Qt 实现类对照表
客户端与服务端的通信采用WebSocket 协议[15],Qt 中的QWebSocket 类实现了该协议。由此OpenFOAM网格生成客户端软件采用Qt 中的QWebSocket 类来实现与服务端的网络通信。使用QWebSocket 类进行网络通信的过程如下所示:首先客户端绑定服务端对应的IP 和端口号进行网络连接,然后在网络通畅的情况下,客户端通过服务解析函数callMethod(QString methodName,QString args,QString kwargs)调用服务端的网格生成服务。其中,参数methodName 表示的是远程调用的服务端的服务名称,args 表示的是网格生成服务对应的无名参数,kwargs 表示的是网格生成服务对应的键值对参数。
3 软件测试
测试环境由客户端软件、云上网格生成服务组成。网格生成服务部署在云服务器上,服务器实例基本计算资源配置为CPU:FT2000+,16 核,32 GB 内存。客户端软件部署在台式机上,基本配置为CPU:FT2000/4,8 GB 内存。
以OpenFOAM 自带的motorBike 算例作为客户端软件功能测试的测试用例,对摩托车外流场计算域进行网格划分,使用snappyHexMesh 划分方法生成摩托车外流场计算域网格。客户端软件主界面如图4 所示。
图4 客户端软件主界面(motorBike 算例)
通过实际算例网格生成功能测试,验证表明客户端软件能够给用户提供简洁易用的GUI 交互界面,且支持与云上网格生成服务的远程交互接口,为云上网格生成服务提供客户端GUI 功能。
4 结论
本文设计并实现了一个能够与部署在云端的网格生成服务交互的网格生成客户端软件。客户端软件通过网格生成应用协议远程调用云上的OpenFOAM 网格生成计算服务,根据服务的交互界面模板构建用户交互界面,实现了云端协同的网格生成计算功能。软件采用插件式架构设计,具有用户自定义界面特性,且可扩展性良好。