■ 田曉沛 南希 宋紅超 項(xiàng)洋 龍星宇 付磊 周亦成 邵飛 / 中國航發(fā)研究院
具備大規(guī)模并行計(jì)算能力的全三維內(nèi)流數(shù)值仿真軟件可充分發(fā)揮超算潛能,實(shí)現(xiàn)航空發(fā)動機(jī)內(nèi)流的高精度仿真。但理論起點(diǎn)高且可靠穩(wěn)定的大規(guī)模并行全三維內(nèi)流數(shù)值仿真軟件的開發(fā),屬于典型的多學(xué)科交叉課題,難度很大。而基于并行框架的代碼重構(gòu)是一種合理可行的軟件研發(fā)技術(shù)路徑。
目前,基于個(gè)人工作站小規(guī)模并行計(jì)算的全三維定常流/非定常流數(shù)值仿真,已經(jīng)被廣泛用于壓氣機(jī)氣動性能評估,成為壓氣機(jī)氣動設(shè)計(jì)不可或缺的核心要素[1-2]。但現(xiàn)階段數(shù)值仿真的網(wǎng)格規(guī)模及其時(shí)間步長嚴(yán)重受限于個(gè)人工作站的計(jì)算能力,產(chǎn)生一定離散誤差;同時(shí),數(shù)理模型也不可避免地產(chǎn)生不可忽略的誤差。數(shù)值仿真精度并不高,會隨算例及工況的不同出現(xiàn)波動,使壓氣機(jī)性能評估存在較大不確定性[1,3]。
提高流場數(shù)值模擬精度,一方面可通過理論突破,減少數(shù)理模型固有偏差;另一方面,可通過增加網(wǎng)格規(guī)模,提高時(shí)空分辨率,減小離散偏差。事實(shí)上,前者的實(shí)現(xiàn)相對困難[4],較為現(xiàn)實(shí)的解決方案是通過大量試驗(yàn)數(shù)據(jù),對數(shù)理模型進(jìn)行校正,需要消耗大量的人力、物力和時(shí)間;而后者則可通過基于超算的大規(guī)模并行計(jì)算實(shí)現(xiàn),相對容易。同時(shí),航空發(fā)動機(jī)精細(xì)化設(shè)計(jì)需求,牽引著跨學(xué)科優(yōu)化設(shè)計(jì)、多學(xué)科耦合設(shè)計(jì)、整機(jī)仿真、數(shù)字孿生[5]等技術(shù)不斷發(fā)展,而支撐這些技術(shù)發(fā)展最基本、不可或缺的工具就是具備大規(guī)模并行計(jì)算能力的全三維內(nèi)流數(shù)值仿真軟件。
綜上,發(fā)展大規(guī)模并行全三維內(nèi)流仿真軟件的需求重要且緊迫。但是,理論起點(diǎn)高且可靠穩(wěn)定的大規(guī)模并行全三維內(nèi)流數(shù)值仿真軟件開發(fā)屬于典型的多學(xué)科交叉課題,集成了物理、數(shù)學(xué)和計(jì)算機(jī)專業(yè)知識,難度很大。相對而言,基于并行框架的代碼重構(gòu),能夠集成國內(nèi)外各專業(yè)優(yōu)勢資源,實(shí)現(xiàn)高水平大規(guī)模并行軟件開發(fā),是一種合理可行的軟件研發(fā)技術(shù)路徑。
框架(framework)是整個(gè)或部分系統(tǒng)的可重用設(shè)計(jì),表現(xiàn)為一組抽象構(gòu)件及構(gòu)件實(shí)例間交互的方法,即針對特定應(yīng)用領(lǐng)域的、可復(fù)用的軟件架構(gòu)解決方案。并行框架是按框架特定應(yīng)用領(lǐng)域角度劃分的一類框架的泛稱,所針對的應(yīng)用領(lǐng)域?yàn)橛善⒎址匠探M描述的大規(guī)模并行科學(xué)計(jì)算問題。并行框架通過封裝高性能的數(shù)據(jù)結(jié)構(gòu)、成熟的并行算法,屏蔽大規(guī)模并行計(jì)算技術(shù),使用戶只需按照框架提供的軟件架構(gòu)方案,就能夠開發(fā)出高效運(yùn)行于現(xiàn)代高性能超算上的、實(shí)施大規(guī)模數(shù)值仿真的并行程序。
目前,國內(nèi)航空發(fā)動機(jī)主機(jī)所普遍使用的全三維內(nèi)流仿真軟件仍為國外商業(yè)軟件,如Fine/Turbo、CFX、Fluent等,但國內(nèi)多所高校都開發(fā)了具有自主知識產(chǎn)權(quán)的全三維內(nèi)流數(shù)值仿真軟件,部分軟件具備并行計(jì)算能力。特別是北京航空航天大學(xué)寧方飛教授開發(fā)的MAP等內(nèi)流仿真軟件,已在各航空發(fā)動機(jī)主機(jī)所試用多年,在模擬精度、計(jì)算速度、并行效率、工程實(shí)用性等方面均有較好表現(xiàn),獲得了業(yè)內(nèi)普遍認(rèn)可。同時(shí),國內(nèi)高校研發(fā)的全三維內(nèi)流數(shù)值仿真軟件的開發(fā)主體的專業(yè)領(lǐng)域幾乎無一例外為流體動力學(xué),計(jì)算機(jī)專業(yè)知識相對欠缺,所編制的程序面向過程,缺少封裝和規(guī)范,程序?qū)哟尾粔蚯逦鷩?yán)謹(jǐn),可維護(hù)性不好,大規(guī)模并行計(jì)算方案缺少深度優(yōu)化。因此,直接將國內(nèi)高校研發(fā)的全三維內(nèi)流數(shù)值仿真軟件用于大規(guī)模并行計(jì)算,從長遠(yuǎn)看并非最佳選擇。
圖1 多塊分區(qū)與多patch分區(qū)
存量代碼重構(gòu)的核心優(yōu)勢在于能夠集成各方優(yōu)勢資源,讓最專業(yè)的人做最擅長的事。而存量代碼重構(gòu)并非存量代碼的簡單翻譯或復(fù)用,有各種問題需要解決和規(guī)范。基于框架的存量代碼重構(gòu),則需要按框架規(guī)定的架構(gòu)重構(gòu)存量代碼。框架的作用是架構(gòu)搭建、內(nèi)存管理、流程控制、并行管理等,存量代碼負(fù)責(zé)在并行計(jì)算單元補(bǔ)?。╬atch)上求解數(shù)理模型,主要包括架構(gòu)重構(gòu)、變量重構(gòu)和流程重構(gòu)等3個(gè)環(huán)節(jié)。本文以針對葉輪機(jī)的全三維定常流場數(shù)值仿真程序(簡稱為存量代碼,其部分特征如圖1所示)的重構(gòu)為例,簡單歸納存量代碼的重構(gòu)環(huán)節(jié)和重構(gòu)方案。
由于存量代碼是面向過程編制的,所以沒有嚴(yán)格意義的架構(gòu)設(shè)計(jì)。并行框架則基于邦元(federate)、網(wǎng)格層和網(wǎng)格片,設(shè)計(jì)了逐層調(diào)用的架構(gòu)模型。
就葉輪機(jī)內(nèi)流求解問題而言,葉輪機(jī)定常流場求解以葉排為單位,具有當(dāng)?shù)匦?;同時(shí),流體域控制方程與轉(zhuǎn)靜交界面控制方程是完全不同的兩類方程,求解方法不同,求解相互獨(dú)立。因此,在架構(gòu)設(shè)計(jì)時(shí)引入了邦元的概念,即將流體域求解與轉(zhuǎn)靜交界面求解封裝在不同邦元內(nèi),通過聯(lián)邦(federation)構(gòu)件,實(shí)現(xiàn)流體域與轉(zhuǎn)靜交界面之間的、由轉(zhuǎn)靜交界面隔開的不同流體域之間的通信;邦元內(nèi)的通信則由網(wǎng)格層數(shù)值構(gòu)件實(shí)現(xiàn)。從理論上看,邦元層的引入,對葉輪機(jī)內(nèi)流的大規(guī)模并行計(jì)算和軟件的擴(kuò)展維護(hù)等方面,都會產(chǎn)生積極效果。具體而言,包括流場求解與轉(zhuǎn)靜交界面求解相互獨(dú)立、互不影響,可有效減小協(xié)調(diào)拼接、非協(xié)調(diào)拼接單元搜索范圍,提高運(yùn)算速度;由于多數(shù)并行通信只需在邦元內(nèi)進(jìn)行,所以可有效減小并行通信規(guī)模。
圖2 葉輪機(jī)內(nèi)流并行方案
圖3 4層調(diào)用架構(gòu)
重構(gòu)后程序的分層調(diào)用架構(gòu)如圖2、圖3所示。對于數(shù)理模型求解,建議通過匹配接口,直接將存量代碼接入重構(gòu)后程序,也就是盡量復(fù)用存量代碼。這樣,不僅能夠有效提高重構(gòu)工作效率,而且在很大程度上能夠避免數(shù)理模型模塊重構(gòu)出現(xiàn)錯(cuò)誤。
變量按類型分為場變量和非場變量,由于是多核分區(qū)并行,所以場變量要參與分區(qū)并行計(jì)算,非場變量一般用于流程控制和邊界條件存儲等。變量按作用域分為全局變量和局部變量。局部變量按作用域一般分為類私有變量,只在某個(gè)函數(shù)/子程序內(nèi)定義的局部變量。變量重構(gòu)的要點(diǎn)是甄別變量的類型和作用域。
針對存量代碼的變量定義方式,可采用如下的變量重構(gòu)方案。
一是通過Module定義的全局變量。若為場變量,則必須按框架提供的變量定義、內(nèi)存開辟、調(diào)用策略,在主流程中統(tǒng)一定義、開辟內(nèi)存,在功能模塊patch層取用。
二是通過Module定義的非場變量。目前的實(shí)踐是,用結(jié)構(gòu)體在主流程中定義、開辟內(nèi)存,可以在任意需要的地方調(diào)用。從形式上看,Module和結(jié)構(gòu)體的變量定義方式非常相似,通過指針關(guān)聯(lián),可以將主流程中定義的結(jié)構(gòu)體變量與存量代碼中定義的Module量對接,從而在存量代碼中可以沿用變量的Module定義方式及使用習(xí)慣。
三是用save標(biāo)記局部變量。所標(biāo)記局部變量在子程序退出時(shí)不被釋放,從而在下次使用時(shí),仍為前次退出值。事實(shí)上,現(xiàn)代編譯器對于局部變量,在調(diào)用后釋放內(nèi)存,失去取值是正常的,所以重構(gòu)程序不保留save屬性,也就是將用save標(biāo)記的變量,按作用域升級為類私有變量或全局變量。
流程重構(gòu)是指在已經(jīng)給定的程序架構(gòu)下,填充主計(jì)算流程及各功能模塊計(jì)算流程。
主計(jì)算流程主要包括時(shí)間推進(jìn)求解流程、求解前數(shù)據(jù)準(zhǔn)備和求解后數(shù)據(jù)處理等。主計(jì)算流程重構(gòu),主要是將存量代碼的主計(jì)算流程重構(gòu)至程序架構(gòu)相應(yīng)位置,即主函數(shù)層與聯(lián)邦層(federal level)。主流程重構(gòu)是流程控制邏輯的重構(gòu),存量代碼不能直接復(fù)用。在重構(gòu)時(shí),還需要在聯(lián)邦層調(diào)用邦元并行構(gòu)件,完成邦元間并行通信。
在主計(jì)算流程重構(gòu)時(shí),要特別注意梳理、優(yōu)化、準(zhǔn)確把握主計(jì)算流程控制邏輯,否則容易形成混亂、隱藏問題,為軟件調(diào)試、使用、維護(hù)和發(fā)展留下隱患。
功能模塊計(jì)算流程重構(gòu),主要是將存量代碼各功能模塊的計(jì)算流程重構(gòu)至程序架構(gòu)相應(yīng)位置,即功能模塊Level層。與主流程重構(gòu)類似,功能模塊流程重構(gòu)也是流程控制邏輯的重構(gòu),主要通過邦元內(nèi)并行構(gòu)件的搭建實(shí)現(xiàn),存量代碼同樣不能直接復(fù)用。另外,注意到邦元遍歷等價(jià)于葉排遍歷,故而在計(jì)算流程重構(gòu)時(shí),可以利用該特點(diǎn)進(jìn)行流程簡化。
與主計(jì)算流程不同的是,功能模塊計(jì)算流程要簡單得多,其重構(gòu)重點(diǎn)不是流程控制邏輯,而是并行重構(gòu)。這是由于存量代碼是面向過程編制,并行通信位置靈活多樣,但重構(gòu)程序必須在架構(gòu)規(guī)定的層級,用規(guī)定的通信構(gòu)件完成并行通信。因此,存量代碼涉及并行通信的部分,往往需要按照存量代碼的通信變量/長度、通信類型、通信目的、與前后續(xù)計(jì)算的關(guān)系等重新組織。例如,存量代碼往往將并行通信置于涵道/葉排/通道的循環(huán)體內(nèi),重構(gòu)時(shí)需要把并行通信置于循環(huán)體外,通過調(diào)用規(guī)約構(gòu)件實(shí)現(xiàn)。
顯而易見,存量代碼并行重構(gòu)后,對于并行通信,特別是涵道/葉排/通道遍歷通信問題,由于需要多次遍歷,可能會犧牲一些運(yùn)算效率。但毋庸置疑,重構(gòu)后程序的層次更為嚴(yán)謹(jǐn),具備更好的可維護(hù)性。
中國航發(fā)研究院氣動仿真軟件研發(fā)團(tuán)隊(duì)是一個(gè)跨專業(yè)的、以內(nèi)流數(shù)值仿真技術(shù)應(yīng)用研究和代碼編制、測試與維護(hù)為主要工作的年輕團(tuán)隊(duì)。團(tuán)隊(duì)基于框架、針對葉輪機(jī)內(nèi)流重構(gòu)的仿真程序采用的主要數(shù)理模型見表1。由于數(shù)理模型源自存量代碼,所以數(shù)理模型的精度、穩(wěn)定性、跨聲內(nèi)流求解適用性等均屬于主流水平。特別是由于程序采用了隱式時(shí)間推進(jìn)求解,并引入了葉輪機(jī)初場求解模板,使得該程序具備了與商業(yè)軟件同量級的內(nèi)流求解收斂速度、較商業(yè)軟件更強(qiáng)的葉輪機(jī)逆壓流場綜合求解能力的特點(diǎn)。
圖4 單級風(fēng)扇
表1 氣動仿真模塊數(shù)理模型列表
表2 跨聲單級風(fēng)扇設(shè)計(jì)指標(biāo)
以單級跨聲速風(fēng)扇為例,其基于重構(gòu)前存量代碼與重構(gòu)后并行程序的流程求解結(jié)果如圖4所示,重構(gòu)前后的流場計(jì)算除轉(zhuǎn)靜交界面模型不同外,網(wǎng)格劃分與計(jì)算設(shè)置方法包括邊界條件、并行計(jì)算設(shè)置、初場條件等(見表2)保持完全一致。
圖5 近壁面相對馬赫數(shù)計(jì)算結(jié)果
圖6 風(fēng)扇總體性能特性圖
圖7 氣動仿真模塊計(jì)算內(nèi)核耗時(shí)對比
重構(gòu)前后風(fēng)扇流場計(jì)算的結(jié)果對比如圖5、圖6所示。表3列出100%轉(zhuǎn)速設(shè)計(jì)點(diǎn)總體性能計(jì)算結(jié)果的詳細(xì)對比??梢?,重構(gòu)前后的葉輪機(jī)內(nèi)流求解基本一致,重構(gòu)偏差處于較低水平。事實(shí)上,即便存量代碼完全復(fù)用,由于計(jì)算機(jī)截?cái)嗾`差、非線性函數(shù)使用、流場求解駐渦、脫落渦等固有非穩(wěn)定結(jié)構(gòu)等,重構(gòu)過程也不可避免地會引入重構(gòu)偏差。另外,就本文算例而言,不同的轉(zhuǎn)靜交界面也是不可忽略的偏差源。
重構(gòu)前后程序及其與主流商業(yè)軟件并行計(jì)算耗時(shí)的定性比較如圖7所示。有必要說明,一方面,存量代碼關(guān)于轉(zhuǎn)靜交界面的計(jì)算量大于重構(gòu)后程序,所以重構(gòu)前后程序計(jì)算耗時(shí)對比并不嚴(yán)謹(jǐn);另一方面,重構(gòu)程序并行方案是否較優(yōu)需要基于超算的大規(guī)模并行計(jì)算進(jìn)行評估。此處的耗時(shí)比較只是為了對重構(gòu)代碼的計(jì)算速度有初步感性認(rèn)識。
隨著計(jì)算機(jī)軟硬件不斷發(fā)展和數(shù)值仿真技術(shù)不斷成熟,內(nèi)流數(shù)值仿真技術(shù)被逐漸引入航空發(fā)動機(jī)通流部件氣動設(shè)計(jì)、性能評估等諸多方面并發(fā)揮著越來越重要的作用。與此同時(shí),發(fā)展大規(guī)模并行全三維內(nèi)流仿真軟件的必要性也日益凸顯。綜合考慮目前條件,并通過實(shí)踐驗(yàn)證,基于并行框架的代碼重構(gòu)不失為一種合理可行的大規(guī)模并行軟件研發(fā)技術(shù)路徑,可為航空發(fā)動機(jī)的研發(fā)提供助力。