APP下载

基于并行框架的内流数值仿真代码重构技术

2021-04-26田晓沛南希宋红超项洋龙星宇付磊周亦成邵飞中国航发研究院

航空动力 2021年2期
关键词:数理存量代码

■ 田晓沛 南希 宋红超 项洋 龙星宇 付磊 周亦成 邵飞 / 中国航发研究院

具备大规模并行计算能力的全三维内流数值仿真软件可充分发挥超算潜能,实现航空发动机内流的高精度仿真。但理论起点高且可靠稳定的大规模并行全三维内流数值仿真软件的开发,属于典型的多学科交叉课题,难度很大。而基于并行框架的代码重构是一种合理可行的软件研发技术路径。

目前,基于个人工作站小规模并行计算的全三维定常流/非定常流数值仿真,已经被广泛用于压气机气动性能评估,成为压气机气动设计不可或缺的核心要素[1-2]。但现阶段数值仿真的网格规模及其时间步长严重受限于个人工作站的计算能力,产生一定离散误差;同时,数理模型也不可避免地产生不可忽略的误差。数值仿真精度并不高,会随算例及工况的不同出现波动,使压气机性能评估存在较大不确定性[1,3]。

提高流场数值模拟精度,一方面可通过理论突破,减少数理模型固有偏差;另一方面,可通过增加网格规模,提高时空分辨率,减小离散偏差。事实上,前者的实现相对困难[4],较为现实的解决方案是通过大量试验数据,对数理模型进行校正,需要消耗大量的人力、物力和时间;而后者则可通过基于超算的大规模并行计算实现,相对容易。同时,航空发动机精细化设计需求,牵引着跨学科优化设计、多学科耦合设计、整机仿真、数字孪生[5]等技术不断发展,而支撑这些技术发展最基本、不可或缺的工具就是具备大规模并行计算能力的全三维内流数值仿真软件。

综上,发展大规模并行全三维内流仿真软件的需求重要且紧迫。但是,理论起点高且可靠稳定的大规模并行全三维内流数值仿真软件开发属于典型的多学科交叉课题,集成了物理、数学和计算机专业知识,难度很大。相对而言,基于并行框架的代码重构,能够集成国内外各专业优势资源,实现高水平大规模并行软件开发,是一种合理可行的软件研发技术路径。

并行框架基本概念及存量代码现状

框架(framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法,即针对特定应用领域的、可复用的软件架构解决方案。并行框架是按框架特定应用领域角度划分的一类框架的泛称,所针对的应用领域为由偏微分方程组描述的大规模并行科学计算问题。并行框架通过封装高性能的数据结构、成熟的并行算法,屏蔽大规模并行计算技术,使用户只需按照框架提供的软件架构方案,就能够开发出高效运行于现代高性能超算上的、实施大规模数值仿真的并行程序。

目前,国内航空发动机主机所普遍使用的全三维内流仿真软件仍为国外商业软件,如Fine/Turbo、CFX、Fluent等,但国内多所高校都开发了具有自主知识产权的全三维内流数值仿真软件,部分软件具备并行计算能力。特别是北京航空航天大学宁方飞教授开发的MAP等内流仿真软件,已在各航空发动机主机所试用多年,在模拟精度、计算速度、并行效率、工程实用性等方面均有较好表现,获得了业内普遍认可。同时,国内高校研发的全三维内流数值仿真软件的开发主体的专业领域几乎无一例外为流体动力学,计算机专业知识相对欠缺,所编制的程序面向过程,缺少封装和规范,程序层次不够清晰严谨,可维护性不好,大规模并行计算方案缺少深度优化。因此,直接将国内高校研发的全三维内流数值仿真软件用于大规模并行计算,从长远看并非最佳选择。

存量代码重构

图1 多块分区与多patch分区

存量代码重构的核心优势在于能够集成各方优势资源,让最专业的人做最擅长的事。而存量代码重构并非存量代码的简单翻译或复用,有各种问题需要解决和规范。基于框架的存量代码重构,则需要按框架规定的架构重构存量代码。框架的作用是架构搭建、内存管理、流程控制、并行管理等,存量代码负责在并行计算单元补丁(patch)上求解数理模型,主要包括架构重构、变量重构和流程重构等3个环节。本文以针对叶轮机的全三维定常流场数值仿真程序(简称为存量代码,其部分特征如图1所示)的重构为例,简单归纳存量代码的重构环节和重构方案。

架构重构

由于存量代码是面向过程编制的,所以没有严格意义的架构设计。并行框架则基于邦元(federate)、网格层和网格片,设计了逐层调用的架构模型。

就叶轮机内流求解问题而言,叶轮机定常流场求解以叶排为单位,具有当地性;同时,流体域控制方程与转静交界面控制方程是完全不同的两类方程,求解方法不同,求解相互独立。因此,在架构设计时引入了邦元的概念,即将流体域求解与转静交界面求解封装在不同邦元内,通过联邦(federation)构件,实现流体域与转静交界面之间的、由转静交界面隔开的不同流体域之间的通信;邦元内的通信则由网格层数值构件实现。从理论上看,邦元层的引入,对叶轮机内流的大规模并行计算和软件的扩展维护等方面,都会产生积极效果。具体而言,包括流场求解与转静交界面求解相互独立、互不影响,可有效减小协调拼接、非协调拼接单元搜索范围,提高运算速度;由于多数并行通信只需在邦元内进行,所以可有效减小并行通信规模。

图2 叶轮机内流并行方案

图3 4层调用架构

重构后程序的分层调用架构如图2、图3所示。对于数理模型求解,建议通过匹配接口,直接将存量代码接入重构后程序,也就是尽量复用存量代码。这样,不仅能够有效提高重构工作效率,而且在很大程度上能够避免数理模型模块重构出现错误。

变量重构

变量按类型分为场变量和非场变量,由于是多核分区并行,所以场变量要参与分区并行计算,非场变量一般用于流程控制和边界条件存储等。变量按作用域分为全局变量和局部变量。局部变量按作用域一般分为类私有变量,只在某个函数/子程序内定义的局部变量。变量重构的要点是甄别变量的类型和作用域。

针对存量代码的变量定义方式,可采用如下的变量重构方案。

一是通过Module定义的全局变量。若为场变量,则必须按框架提供的变量定义、内存开辟、调用策略,在主流程中统一定义、开辟内存,在功能模块patch层取用。

二是通过Module定义的非场变量。目前的实践是,用结构体在主流程中定义、开辟内存,可以在任意需要的地方调用。从形式上看,Module和结构体的变量定义方式非常相似,通过指针关联,可以将主流程中定义的结构体变量与存量代码中定义的Module量对接,从而在存量代码中可以沿用变量的Module定义方式及使用习惯。

三是用save标记局部变量。所标记局部变量在子程序退出时不被释放,从而在下次使用时,仍为前次退出值。事实上,现代编译器对于局部变量,在调用后释放内存,失去取值是正常的,所以重构程序不保留save属性,也就是将用save标记的变量,按作用域升级为类私有变量或全局变量。

流程重构

流程重构是指在已经给定的程序架构下,填充主计算流程及各功能模块计算流程。

主计算流程主要包括时间推进求解流程、求解前数据准备和求解后数据处理等。主计算流程重构,主要是将存量代码的主计算流程重构至程序架构相应位置,即主函数层与联邦层(federal level)。主流程重构是流程控制逻辑的重构,存量代码不能直接复用。在重构时,还需要在联邦层调用邦元并行构件,完成邦元间并行通信。

在主计算流程重构时,要特别注意梳理、优化、准确把握主计算流程控制逻辑,否则容易形成混乱、隐藏问题,为软件调试、使用、维护和发展留下隐患。

功能模块计算流程重构,主要是将存量代码各功能模块的计算流程重构至程序架构相应位置,即功能模块Level层。与主流程重构类似,功能模块流程重构也是流程控制逻辑的重构,主要通过邦元内并行构件的搭建实现,存量代码同样不能直接复用。另外,注意到邦元遍历等价于叶排遍历,故而在计算流程重构时,可以利用该特点进行流程简化。

与主计算流程不同的是,功能模块计算流程要简单得多,其重构重点不是流程控制逻辑,而是并行重构。这是由于存量代码是面向过程编制,并行通信位置灵活多样,但重构程序必须在架构规定的层级,用规定的通信构件完成并行通信。因此,存量代码涉及并行通信的部分,往往需要按照存量代码的通信变量/长度、通信类型、通信目的、与前后续计算的关系等重新组织。例如,存量代码往往将并行通信置于涵道/叶排/通道的循环体内,重构时需要把并行通信置于循环体外,通过调用规约构件实现。

显而易见,存量代码并行重构后,对于并行通信,特别是涵道/叶排/通道遍历通信问题,由于需要多次遍历,可能会牺牲一些运算效率。但毋庸置疑,重构后程序的层次更为严谨,具备更好的可维护性。

存量代码重构结果

数理模型汇总

中国航发研究院气动仿真软件研发团队是一个跨专业的、以内流数值仿真技术应用研究和代码编制、测试与维护为主要工作的年轻团队。团队基于框架、针对叶轮机内流重构的仿真程序采用的主要数理模型见表1。由于数理模型源自存量代码,所以数理模型的精度、稳定性、跨声内流求解适用性等均属于主流水平。特别是由于程序采用了隐式时间推进求解,并引入了叶轮机初场求解模板,使得该程序具备了与商业软件同量级的内流求解收敛速度、较商业软件更强的叶轮机逆压流场综合求解能力的特点。

图4 单级风扇

表1 气动仿真模块数理模型列表

表2 跨声单级风扇设计指标

单级风扇校验

以单级跨声速风扇为例,其基于重构前存量代码与重构后并行程序的流程求解结果如图4所示,重构前后的流场计算除转静交界面模型不同外,网格划分与计算设置方法包括边界条件、并行计算设置、初场条件等(见表2)保持完全一致。

图5 近壁面相对马赫数计算结果

图6 风扇总体性能特性图

图7 气动仿真模块计算内核耗时对比

重构前后风扇流场计算的结果对比如图5、图6所示。表3列出100%转速设计点总体性能计算结果的详细对比。可见,重构前后的叶轮机内流求解基本一致,重构偏差处于较低水平。事实上,即便存量代码完全复用,由于计算机截断误差、非线性函数使用、流场求解驻涡、脱落涡等固有非稳定结构等,重构过程也不可避免地会引入重构偏差。另外,就本文算例而言,不同的转静交界面也是不可忽略的偏差源。

重构前后程序及其与主流商业软件并行计算耗时的定性比较如图7所示。有必要说明,一方面,存量代码关于转静交界面的计算量大于重构后程序,所以重构前后程序计算耗时对比并不严谨;另一方面,重构程序并行方案是否较优需要基于超算的大规模并行计算进行评估。此处的耗时比较只是为了对重构代码的计算速度有初步感性认识。

结束语

随着计算机软硬件不断发展和数值仿真技术不断成熟,内流数值仿真技术被逐渐引入航空发动机通流部件气动设计、性能评估等诸多方面并发挥着越来越重要的作用。与此同时,发展大规模并行全三维内流仿真软件的必要性也日益凸显。综合考虑目前条件,并通过实践验证,基于并行框架的代码重构不失为一种合理可行的大规模并行软件研发技术路径,可为航空发动机的研发提供助力。

猜你喜欢

数理存量代码
践行“德融数理” 打造“行知乐园”
盘活越秀区存量老旧物业的对策研究
2020年1月64个重点城市商品住宅供求比、存量及消化周期
数理:多少人吃饭
最天然呆笔记 谁说数理就一定枯燥艰深?
神秘的代码
一周机构净增(减)仓股前20名
重要股东二级市场增、减持明细
近期连续上涨7天以上的股
腐败存量