APP下载

一种高可扩展的通用CFD软件架构设计与原型系统实现*

2021-01-05郭晓威徐传福龚春叶陈丽娟

计算机工程与科学 2020年12期
关键词:原型网格案例

郭晓威,李 超,刘 杰,徐传福,龚春叶,陈丽娟

(国防科技大学计算机学院,湖南 长沙 410073)

1 引言

随着高性能计算技术的发展,计算流体力学CFD(Computational Fluid Dynamics)软件已经在众多工业和非工业应用领域成为一种强大的计算工具[1]。典型的CFD应用领域包括飞机和车辆气动力学、船舶的流体动力学、内燃发动机、燃气轮机、环境工程和生物医学工程等。以通用CFD软件为代表的数字仿真平台已成为诸多关键领域高端装备研制及试验鉴定评估等的核心软件工具之一,欧美等发达国家已将包括通用CFD软件在内的诸多数字仿真软件视为国家竞争力的核心。

从20世纪90年代开始,欧美发达国家的CFD软件发展迅速,一大批优秀的知名商业软件开始占领市场,包括Fluent[2]、CFX[3]、Star-CCM[4]和CFD-FASTRAN[5]等;同时CFL3D、FUN3D和USM3D等众多知名的In-house专业软件也开始流行。经过数十年的发展,国际CFD软件市场已经基本被美国、法国和德国的少数几家大型商业软件公司所垄断。另一方面,开源CFD软件也发展迅速,OpenFOAM[6,7]、SU2[8]和Code_Saturne[9]等大型开源软件逐渐积累了大量用户,功能不断完善,用户认可度不断提升。

国内CFD软件起步相对较晚,与国外优秀的商业CFD软件相比差距较大,尚未形成可持续发展的局面。近来,国内一些单位也推出了一些有代表性的CFD软件,包括中国空气动力研究与发展中心的CFD软件平台“风雷PHengLEI”[10]和HyperFlow[11]、中国航空工业气动研究院用于航空数值模拟的ARI_CFD[12]等;同时一些初创CAE软件公司开始尝试进行通用CFD软件的商业化,包括上海索辰信息科技、成都励颐拓软件等均推出了具有自主知识产权的商业CFD软件产品。总体来看,国产的通用CFD软件在软件功能的完备性、用户界面的易用性和仿真结果的可信度等方面仍与国外主流商业软件存在较大差距,在技术先进性、用户认可度等方面尚未形成竞争力。

从目前应用最为广泛的开源CFD软件来看,一款通用CFD软件的代码量至少在百万行量级。大型软件的开发必然需要对软件架构进行深入研究,以保证其良好的可扩展性和可维护性,从而实现软件功能和性能的可持续发展。由于历史原因,包括欧美主流商业软件在内的许多历史悠久的CFD软件大都是从20世纪六七十年代开始基于Fortan语言开发的,随着代码逐步积累,已经难以对软件的基本架构进行大的重构与修改,软件的核心算法也以70年代的经典算法为主。总体来看,当前的大型CFD软件通过全面的软件功能、高度鲁棒的计算方法、经过长期验证的核心算法以及数十年的市场推广,确认了今天的市场垄断地位。但是,这些软件在软件架构、代码结构甚至图形界面等方面都没有应用新的先进软件工程技术,存在较大的重构与改进空间。

目前CFD软件开发领域已经认识到,基于Fortran的结构化程序编写方式渐渐地不能适应新的软件架构发展。目前传播和应用较为广泛的开源CFD软件OpenFOAM和SU2等均采用C++面向对象的方式构建,而由法国电力开发的Code_Saturne软件的核心代码采用Fortran和C语言编写,为了提供友好的用户接口,也通过Python语言对核心接口进行了包装。中国空气动力学研究与发展中心研制的混合网格CFD软件HyperFlow[11]也采用了面向对象设计来提升软件架构的合理性。然而,CFD软件研制领域的面向对象设计主要考虑了数据结构的封装,而在接口的抽象、依赖关系的管理和层次隔离等方面仍存在缺陷。为了基于国产高性能计算机系统设计大型的通用CFD计算软件,有必要分析通用CFD软件架构设计的需求和目标,并提出对应的设计方案,为自主知识产权的国产通用CFD软件设计与实现提供参考。

本文主要基于国产高性能计算机技术的最新发展趋势,针对自主知识产权的大型通用CFD软件研制需求,结合现有大型开源软件的特色及优缺点,分析通用CFD软件架构设计的目标,提出一种高可扩展的通用CFD软件架构设计方案,并对软件架构中各个层次和模块功能及接口进行详细分析。最后,本文基于该架构设计方案开发了对应的CFD软件原型系统,通过初步测试对软件架构的可行性进行了验证。

2 通用CFD软件架构设计目标

CFD软件的主要工作是通过特定的离散方法来求解由一组微分方程描述的流体运动问题。与其它领域的大型软件相比,CFD软件的内部结构并不复杂。然而,与特定物理问题紧密相关的特性,给通用CFD软件带来了额外的复杂性,这种复杂性主要包括以下几个方面:(1)软件涉及多学科的领域知识。多相流、燃烧、传热与辐射等特定应用问题均属于通用CFD软件的覆盖范围,而在CFD软件中支持这些功能,通常需要实现这些领域相关的理论模型;同样地,高精度离散格式、快速稳定的线性系统求解算法都需要不同的知识背景;而CFD应用的性能需求则需要高性能计算领域的知识。 多学科领域知识的需求一方面导致通用CFD软件的设计很难做到各方面兼顾;另一方面随着软件规模的增大,其开发和维护越来越困难。(2)软件的验证与确认尤其重要。CFD软件的核心是要实现对自然现象的模拟,因此首先需要通过精密的软件验证过程保证代码没有明显缺陷,同时,需要通过全面的确认手段对预期的模拟结果与实验结果进行对比,以确认软件代码的计算结果和精度满足要求;由于计算几何的复杂性和理论模型的多样性,需要在设计初期就考虑通过自动化和强制测试等手段加强通用CFD软件的验证与确认过程管理。(3)物理模型与计算方法的持续发展。基本的流体运动方程通常由N-S方程来描述,当前主流的商业CFD软件和开源CFD软件均采用有限体积法对理论模型进行离散求解。由于软件架构设计缺乏灵活性,目前的大型通用CFD软件在算法上进展较慢,并不能兼容最近数十年出现的一些新的模型和算法。例如,新的多相流模型和材料模型集成、高阶精度算法的应用等在现有的软件框架下都存在较大困难。新的物理模型和计算方法的持续发展为可扩展的CFD软件架构设计提出了新的要求。(4)对计算性能的高要求。软件的并行计算性能是CFD软件必须关注的重点问题。目前商业CFD软件通过License授权限制等方式对软件的并行性能进行了限制,导致超大规模网格的应用案例无法进行模拟。一些专用CFD软件则针对特定领域应用进行了专门的并行设计与优化,能够模拟数十亿以上网格案例,但通用性不足,难以对标国际上先进的通用CFD软件。

综上所述,通用CFD软件相对于普通的大型软件,在架构设计方面面临着多学科交叉、验证与确认、物理模型与计算方法以及高性能等多方面的特殊需求。为了解决这些问题,本文设计的通用CFD软件架构主要实现了以下主要目标:(1)依赖倒置的层次结构,实现了不同学科相关代码的隔离。通过面向对象的软件结构,可以实现不同层次之间依赖关系的倒置:即高层模块不依赖于低层模块,而应该依赖于抽象接口。通过这种方式改变了结构化的CFD软件中从高层到低层的逐层依赖关系,能够实现理论模型、数值离散、线性求解算法等不同学科相关代码之间的松耦合,从而有效提高软件的可扩展性。(2)支持自动化的单元测试。软件设计的初期就应该考虑模块测试的可行性和自动化。单元测试在软件架构设计阶段主要考虑2个方面的目标:第1是每个模块的可测试性,软件模块是否可独立测试从侧面反映了模块之间的松耦合特性;第2是测试代码与核心代码之间的独立性以及测试的自动化。 (3)接口与抽象分离。相对于基于结构化编程语言的软件架构,良好的面向对象软件架构最大的特点就在于接口与实现之间的分离。由于软件中的接口总是相对稳定,而具体实现则可能不断发生变化,这种变化与物理模型和计算方法的发展有关,与性能的优化有关,也可能与需求的变化和验证确认的反馈有关。软件架构中将具体实现与抽象接口完全分离,就实现了良好的可扩展性。(4)高性能的数据结构与算法设计。CFD 软件作为典型的计算密集型应用,计算性能对软件的可用性和应用场景都极为重要。面向对象的模块化设计相对于基于Fortran等结构化语言而言会带来一定的性能损失,但我们应该尽可能地提高数据结构和算法设计的高效性,尤其在架构设计方面考虑大规模并行和大型稀疏矩阵运算的计算效率。

围绕以上设计目标,本文提出了一种高可扩展的通用工程计算软件架构。这里的“通用”主要指该软件架构不针对具体的CFD应用问题,而是适用于所有可以通过微分方程描述的应用,包括不可压缩流体、可压缩流体、湍流、多相流和燃烧等应用问题都可以集成到该架构中进行实现。

3 一种高可扩展的通用CFD软件架构与原型系统

3.1 软件总体架构

本文将通用CFD软件中的核心计算过程抽象为4个层次:应用层、算法模型层、时空离散层和线性系统层。总体架构如图1所示。

应用层是顶层应用主程序,包括求解不可压缩流、可压缩流和多相流等具体应用问题的主程序。实际软件实现过程中,应用层代码主要调用算法和模型接口来完成应用问题的求解。图1中的SegaregatedAlgo是分离式求解算法接口,为了直观性这里没有考虑耦合式算法的情形。Model接口则对CFD领域的多种理论模型进行了抽象。

算法模型层则主要包括求解算法和理论模型的具体实现模块,这些模块最终通过调用时空离散接口discreteMethod将理论模型转化为线性系统。

时空离散层实现了discreteMethod接口,通过特定的离散方法将模型中包含的微分方程组装为多个线性系统。典型的离散方法包括有限体积法、有限元法和有限差分法等。时空离散层通过Matrix接口操作线性系统中的稀疏矩阵,并调用LinSolver接口来求解各个线性系统。

线性系统层主要包括2个模块实现:稀疏矩阵格式Matrix和线性求解器LinSolver。为了描述完整的线性系统Ax=b,还需要提供物理场数据结构等。通过求解线性系统,CFD软件能够得到各个微分方程的解,从而完成对应用案例中所包含的理论模型的求解。

Figure 1 A highly scalable general purpose CFD software architecture图1 一种高可扩展的通用CFD软件架构

与现有的主流CFD软件架构相比,该软件架构设计的层次结构主要有以下3个特色:(1)模块抽象的一般性,即应用、算法模型、时空离散和线性系统的抽象并不针对特定的CFD应用,而是面向所有CFD领域的一般化抽象。因此,本文设计的是一种通用CFD软件架构,能够兼容空气动力学、水动力学、反应堆热工水力和发动机内流仿真等多种应用领域软件的开发;另一方面这种高层次抽象增加的软件代码的可读性和可维护性,开发人员不需要深入理解具体的CFD领域计算方法就能很容易找到各个层次需要维护和开发的接口。(2)层次之间的依赖关系倒置。从图1中可以看到,模块之间的依赖关系打破了传统的面向过程软件结构中上层依赖下层的树状关联:高层模块仅依赖接口,而不依赖低层实现,而低层模块通过接口实现(继承)关系依赖于上层模块。这种软件架构使得CFD软件中具体算法或实现代码的修改和扩展完全不影响其它模块,从而实现了更大程度的可扩展性。由于在软件中接口相对稳定,而具体实现总是随着技术的发展和需求的变化需要不断地扩展和修改,将代码尽可能地脱离对具体实现的依赖能更好地保证软件架构的稳定性。(3)多个层次的可扩展性。通过接口与实现的分离,可以在软件中不断扩充新的实现代码,例如,线性系统层可以增加PETSC求解器,并使用新的压缩矩阵格式,而这种代码扩展完全不影响其他模块的功能和代码,只需在输入配置文件中指明需要调用的模块就可以动态加载。基于该架构可以实现多个层次的二次开发接口,并设计具有高度易用性的软件开发包(SDK)以兼容第三方开发模块。

3.2 关键数据结构

通用CFD软件中的关键数据结构包括配置参数Config、网格数据Mesh、物理场Field和稀疏矩阵Matrix。Config类通过读取YAML格式的输入文件来初始化各个案例配置参数,其主要数据成员如下所示:

class Config{

private:

std::shared_ptr〈Reader〉 reader_;

PartitionConfig *partition_ = nullptr;

GeometryConfig *geometry_ = nullptr;

MeshConfig *mesh_ = nullptr;

PhysicsConfig *physics_ = nullptr;

BoundaryConfig *boundary_ =nullptr;

AlgorithmConfig *algorithm_ = nullptr;

DiscreteConfig *discrete_ = nullptr;

ControlConfig *control = nullptr;

SolverConfig *solver_ = nullptr;

AssembleConfig *assemble_ = nullptr;

SolutionConfig *solution_ = nullptr;

}

本文将配置数据分为partition、geometry、mesh、physics、boundary、algorithm、discrete、control、solver、assemble和solution 共11个部分。每部分的含义与变量名相符,例如partition中包含并行划分相关配置,mesh中指明网格文件的名称和位置等,boundary中包含所有边界条件设置,control配置了时间步大小及总模拟时长等控制参数。更多细节本文不再一一列举。

根据Config 中指明的网格文件名称和位置读入网格之后,数据存储在mesh中,class Mesh的主要数据成员如下所示:

class Mesh{

vector〈Node〉 nodeList_;

vector〈Face〉 faceList_;

vector〈Element〉 elementList_;

vector〈Boundary〉 boundaryList_;

vector〈Domain〉 domainList_;

}

网格中的节点、面、单元体、边界和区域都通过连续数组vector的形式存储,保证了最高的访问效率。本文采用非结构网格格式,同时所有的离散格式和算法都基于非结构网格的一般形式,能够兼容结构网格。

物理场Field则依次将与网格单元对应的物理场的值存储在连续数组中,具体软件实现中将Field定义为vector的子类。Matrix则存储了离散后的稀疏矩阵,稀疏矩阵可以有多种存储格式,现有软件版本中实现了一种标准的CSR格式。

3.3 原型系统实现

基于以上软件架构设计方案,本文实现了一款通用CFD软件原型系统CFD-Prototype。原型系统源码结构如图2所示。etc 目录中包含基本的配置脚本,src 目录包含所有核心软件源代码,目前的软件版本中实现了Simple迭代算法、不可压缩流体模型和简单的GaussSeidel线性迭代求解算法,离散方法方面实现了基本的有限体积法时空离散。该原型系统可以求解基本的不可压缩流体层流应用问题,支持稳态和瞬态求解。

Figure 2 Source code structure of the highly scalable general purpose CFD software prototype图2 高可扩展通用CFD软件原型系统源码结构

原型系统支持cgns 网格格式,通过YAML格式的输入文件定义模拟案例。一种典型的案例配置文件模板中的典型内容如下所示:

mesh:

fileName:../test/test.cgns #网格数据文件

fileType:cgns

dimension:3

scaleFactor:

x:0.01

y:0.01

z:0.01

physics:

state:steady #/transient,确定模拟类型是瞬态还 #是稳态

gravity:

x:0

y:0

z:-9.18

model:incompressible # compressible,multiphase, #…

turbulenceModel:lamilar #kEpsilon,k-omega,les,

material:air

refPressure:0.1 # MPa,指定参考压力为1个大气 #压,有利于减少压差变化较小时,计算产生的舍入 #误差

refDensity:1.25 # kg/m3

refTemperature:298.16 # K ,确定参考温度为25 #摄氏度,便于确定热力学比焓、比熵,计算流体内能

refSpecificEnthalpy:0 #J/kg,设置参考状态比焓

refSpecificEntropy:0 # J/(kg K)设置参考状态比熵

stateEquation:generalMaterial # 对于非理想介质, #需要同时定义密度与摩尔分子量从而确定压力

molarMass:28.96 # kg/kmol,分子摩尔质量

density:1.0

viscosity:0.01 #kg/(ms),动力粘度

heatCapacity:1004.4 #J/(kg K)

heatConductivity:0.0261 # W/(m K)

boundary:

definedBoundary:

-wall_1

-wall_2

flowIn:

type:inlet

patchName:flowIn #设置该边界对应的网格面

massAndMoment:velocity #还有其他2种方式 #进行选择,massFlow和pressure

velocity:

x:0.8

y:1

z:1.2#指定速度大小,其方向默认与边界面垂直

massFlow:

massFlowRate:0.5 # kg/s,方向默认与边界 #面垂直

pressure:

totalPressure:100000 # Pa,kg/(s2m),一般 #入口压力边界设置为总压

……

输入文件中包含了完整的CFD案例需要的参数配置,包括边界条件、初始条件、理论模型参数和材料参数等。网格文件则通过mesh:fileName指定。YAML文件的可读性较高,用户可以方便地进行修改。

test 目录下是基于GoogleTest建立的单元测试和集成测试库,可以针对每个独立的模块进行测试。这些测试模块将是下一步建立自动测试系统和持续集成的基础。

3.4 测试与分析

为了验证本文设计的通用CFD软件架构的可行性,本文对基于该架构实现的原型系统进行了测试与分析。受限于论文篇幅,这里以一个简单的三角腔顶壁运动问题作为测试案例进行分析。案例的几何结构和网格划分情况如图3所示。

Figure 3 Geometry and mesh configuration of laminar flow in a triangular cavity图3 三角腔层流测试案例几何结构与网格

测试案例的几何尺寸、材料属性和物理属性如表1所示。

Table 1 Configuration parameters of laminar flow in a triangular cavity表1 三角腔层流案例基本参数配置

三角腔顶壁运动会引起腔内流体发生层流流动,将三角腔顶壁垂直平分线上水平分量速度模拟值与实验结果进行对比验证。计算域为高度为4 m,宽度为2 m,厚度为0.2 m的三棱柱。如图3所示,网格划分为全六面体结构网格,网格数量总计分别为1 749,12 370个。模拟结果如图4 所示。

Figure 4 Simulation results of laminar flow in a triangular cavity图4 三角腔层流测试结果

本文将x=0.0,y=-4.0-0.0,z=0.1直线上的速度分布曲线与实验值进行比较,其中横坐标为y向坐标值,纵坐标为x向无量纲速度(也称归一化速度)。CFD-Prototype的计算结果与实验值趋势一致,但仍存在一定的误差,另外,随着网格细化计算结果的最大值与实验值更为接近。

通过以上测试,验证了本文设计的通用CFD软件架构的可行性:即可以基于该架构开发出高可扩展的通用CFD软件,软件高度模块化,可运行完整案例。但是,目前的原型系统仅用作验证,在核心算法方面仍存在较大缺陷,下一步需要持续改进。

3.5 软件研制计划

在此原型系统基础上,我们制定了长期的研制计划,预计通过5年左右的软件开发,将该通用软件架构原型系统发展为一款支持工程实用案例的通用CFD软件系统,并应用到国产高性能计算机系统上。软件研制的初步路线和计划如图5所示。

Figure 5 Development plan of the highly scalable general purpose CFD software图5 高可扩展的通用CFD软件研制计划

目前的软件原型系统仅对软件基本架构进行了实现,并基于GoogleTest建立了自动测试框架,支持基本的Simple系列解耦式求解算法,支持稳态和瞬态的不可压缩流体模型;下一步将通过集成PETSC来提升软件的线性系统求解能力,并通过大量工程案例的测试与优化来提升软件对复杂网格的兼容性和稳定性,同时进一步扩展多种三阶TVD(Total Variation Diminishing)格式来提高数值离散的精度。由于该软件采用了高度可扩展的软件架构,可以不断地添加新的算法与模型。

4 结束语

本文基于国内自主通用CFD软件研制的现状,分析了高可扩展的通用CFD软件架构设计的目标,并提出了一种基于面向对象的、高度解耦的层次化通用CFD软件架构,并基于该架构设计实现了一款通用CFD软件原型系统,最后通过一个完整的CFD案例对原型系统进行了测试与分析,验证了该软件架构的可行性。

该通用软件原型系统的设计与实现仍存在较大缺陷,在理论模型支持、数值算法完备性、并行计算效率等方面仍有大量工作需要开展。在此基础上,我们制定了初步的软件研制计划,预计通过5年以上的软件开发,完成一款支持核反应堆热工水力仿真、飞行器空气动力学分析、大型船舶水动力学分析等复杂应用案例的自主知识产权通用CFD软件产品。

猜你喜欢

原型网格案例
案例4 奔跑吧,少年!
包裹的一切
反射的椭圆随机偏微分方程的网格逼近
追逐
随机变量分布及统计案例拔高卷
《哈姆雷特》的《圣经》叙事原型考证
重叠网格装配中的一种改进ADT搜索方法
发生在你我身边的那些治超案例
论《西藏隐秘岁月》的原型复现
基于曲面展开的自由曲面网格划分