郭曉威,李 超,劉 杰,徐傳福,龔春葉,陳麗娟
(國防科技大學計算機學院,湖南 長沙 410073)
隨著高性能計算技術的發(fā)展,計算流體力學CFD(Computational Fluid Dynamics)軟件已經在眾多工業(yè)和非工業(yè)應用領域成為一種強大的計算工具[1]。典型的CFD應用領域包括飛機和車輛氣動力學、船舶的流體動力學、內燃發(fā)動機、燃氣輪機、環(huán)境工程和生物醫(yī)學工程等。以通用CFD軟件為代表的數(shù)字仿真平臺已成為諸多關鍵領域高端裝備研制及試驗鑒定評估等的核心軟件工具之一,歐美等發(fā)達國家已將包括通用CFD軟件在內的諸多數(shù)字仿真軟件視為國家競爭力的核心。
從20世紀90年代開始,歐美發(fā)達國家的CFD軟件發(fā)展迅速,一大批優(yōu)秀的知名商業(yè)軟件開始占領市場,包括Fluent[2]、CFX[3]、Star-CCM[4]和CFD-FASTRAN[5]等;同時CFL3D、FUN3D和USM3D等眾多知名的In-house專業(yè)軟件也開始流行。經過數(shù)十年的發(fā)展,國際CFD軟件市場已經基本被美國、法國和德國的少數(shù)幾家大型商業(yè)軟件公司所壟斷。另一方面,開源CFD軟件也發(fā)展迅速,OpenFOAM[6,7]、SU2[8]和Code_Saturne[9]等大型開源軟件逐漸積累了大量用戶,功能不斷完善,用戶認可度不斷提升。
國內CFD軟件起步相對較晚,與國外優(yōu)秀的商業(yè)CFD軟件相比差距較大,尚未形成可持續(xù)發(fā)展的局面。近來,國內一些單位也推出了一些有代表性的CFD軟件,包括中國空氣動力研究與發(fā)展中心的CFD軟件平臺“風雷PHengLEI”[10]和HyperFlow[11]、中國航空工業(yè)氣動研究院用于航空數(shù)值模擬的ARI_CFD[12]等;同時一些初創(chuàng)CAE軟件公司開始嘗試進行通用CFD軟件的商業(yè)化,包括上海索辰信息科技、成都勵頤拓軟件等均推出了具有自主知識產權的商業(yè)CFD軟件產品。總體來看,國產的通用CFD軟件在軟件功能的完備性、用戶界面的易用性和仿真結果的可信度等方面仍與國外主流商業(yè)軟件存在較大差距,在技術先進性、用戶認可度等方面尚未形成競爭力。
從目前應用最為廣泛的開源CFD軟件來看,一款通用CFD軟件的代碼量至少在百萬行量級。大型軟件的開發(fā)必然需要對軟件架構進行深入研究,以保證其良好的可擴展性和可維護性,從而實現(xiàn)軟件功能和性能的可持續(xù)發(fā)展。由于歷史原因,包括歐美主流商業(yè)軟件在內的許多歷史悠久的CFD軟件大都是從20世紀六七十年代開始基于Fortan語言開發(fā)的,隨著代碼逐步積累,已經難以對軟件的基本架構進行大的重構與修改,軟件的核心算法也以70年代的經典算法為主??傮w來看,當前的大型CFD軟件通過全面的軟件功能、高度魯棒的計算方法、經過長期驗證的核心算法以及數(shù)十年的市場推廣,確認了今天的市場壟斷地位。但是,這些軟件在軟件架構、代碼結構甚至圖形界面等方面都沒有應用新的先進軟件工程技術,存在較大的重構與改進空間。
目前CFD軟件開發(fā)領域已經認識到,基于Fortran的結構化程序編寫方式漸漸地不能適應新的軟件架構發(fā)展。目前傳播和應用較為廣泛的開源CFD軟件OpenFOAM和SU2等均采用C++面向對象的方式構建,而由法國電力開發(fā)的Code_Saturne軟件的核心代碼采用Fortran和C語言編寫,為了提供友好的用戶接口,也通過Python語言對核心接口進行了包裝。中國空氣動力學研究與發(fā)展中心研制的混合網格CFD軟件HyperFlow[11]也采用了面向對象設計來提升軟件架構的合理性。然而,CFD軟件研制領域的面向對象設計主要考慮了數(shù)據(jù)結構的封裝,而在接口的抽象、依賴關系的管理和層次隔離等方面仍存在缺陷。為了基于國產高性能計算機系統(tǒng)設計大型的通用CFD計算軟件,有必要分析通用CFD軟件架構設計的需求和目標,并提出對應的設計方案,為自主知識產權的國產通用CFD軟件設計與實現(xiàn)提供參考。
本文主要基于國產高性能計算機技術的最新發(fā)展趨勢,針對自主知識產權的大型通用CFD軟件研制需求,結合現(xiàn)有大型開源軟件的特色及優(yōu)缺點,分析通用CFD軟件架構設計的目標,提出一種高可擴展的通用CFD軟件架構設計方案,并對軟件架構中各個層次和模塊功能及接口進行詳細分析。最后,本文基于該架構設計方案開發(fā)了對應的CFD軟件原型系統(tǒng),通過初步測試對軟件架構的可行性進行了驗證。
CFD軟件的主要工作是通過特定的離散方法來求解由一組微分方程描述的流體運動問題。與其它領域的大型軟件相比,CFD軟件的內部結構并不復雜。然而,與特定物理問題緊密相關的特性,給通用CFD軟件帶來了額外的復雜性,這種復雜性主要包括以下幾個方面:(1)軟件涉及多學科的領域知識。多相流、燃燒、傳熱與輻射等特定應用問題均屬于通用CFD軟件的覆蓋范圍,而在CFD軟件中支持這些功能,通常需要實現(xiàn)這些領域相關的理論模型;同樣地,高精度離散格式、快速穩(wěn)定的線性系統(tǒng)求解算法都需要不同的知識背景;而CFD應用的性能需求則需要高性能計算領域的知識。 多學科領域知識的需求一方面導致通用CFD軟件的設計很難做到各方面兼顧;另一方面隨著軟件規(guī)模的增大,其開發(fā)和維護越來越困難。(2)軟件的驗證與確認尤其重要。CFD軟件的核心是要實現(xiàn)對自然現(xiàn)象的模擬,因此首先需要通過精密的軟件驗證過程保證代碼沒有明顯缺陷,同時,需要通過全面的確認手段對預期的模擬結果與實驗結果進行對比,以確認軟件代碼的計算結果和精度滿足要求;由于計算幾何的復雜性和理論模型的多樣性,需要在設計初期就考慮通過自動化和強制測試等手段加強通用CFD軟件的驗證與確認過程管理。(3)物理模型與計算方法的持續(xù)發(fā)展。基本的流體運動方程通常由N-S方程來描述,當前主流的商業(yè)CFD軟件和開源CFD軟件均采用有限體積法對理論模型進行離散求解。由于軟件架構設計缺乏靈活性,目前的大型通用CFD軟件在算法上進展較慢,并不能兼容最近數(shù)十年出現(xiàn)的一些新的模型和算法。例如,新的多相流模型和材料模型集成、高階精度算法的應用等在現(xiàn)有的軟件框架下都存在較大困難。新的物理模型和計算方法的持續(xù)發(fā)展為可擴展的CFD軟件架構設計提出了新的要求。(4)對計算性能的高要求。軟件的并行計算性能是CFD軟件必須關注的重點問題。目前商業(yè)CFD軟件通過License授權限制等方式對軟件的并行性能進行了限制,導致超大規(guī)模網格的應用案例無法進行模擬。一些專用CFD軟件則針對特定領域應用進行了專門的并行設計與優(yōu)化,能夠模擬數(shù)十億以上網格案例,但通用性不足,難以對標國際上先進的通用CFD軟件。
綜上所述,通用CFD軟件相對于普通的大型軟件,在架構設計方面面臨著多學科交叉、驗證與確認、物理模型與計算方法以及高性能等多方面的特殊需求。為了解決這些問題,本文設計的通用CFD軟件架構主要實現(xiàn)了以下主要目標:(1)依賴倒置的層次結構,實現(xiàn)了不同學科相關代碼的隔離。通過面向對象的軟件結構,可以實現(xiàn)不同層次之間依賴關系的倒置:即高層模塊不依賴于低層模塊,而應該依賴于抽象接口。通過這種方式改變了結構化的CFD軟件中從高層到低層的逐層依賴關系,能夠實現(xiàn)理論模型、數(shù)值離散、線性求解算法等不同學科相關代碼之間的松耦合,從而有效提高軟件的可擴展性。(2)支持自動化的單元測試。軟件設計的初期就應該考慮模塊測試的可行性和自動化。單元測試在軟件架構設計階段主要考慮2個方面的目標:第1是每個模塊的可測試性,軟件模塊是否可獨立測試從側面反映了模塊之間的松耦合特性;第2是測試代碼與核心代碼之間的獨立性以及測試的自動化。 (3)接口與抽象分離。相對于基于結構化編程語言的軟件架構,良好的面向對象軟件架構最大的特點就在于接口與實現(xiàn)之間的分離。由于軟件中的接口總是相對穩(wěn)定,而具體實現(xiàn)則可能不斷發(fā)生變化,這種變化與物理模型和計算方法的發(fā)展有關,與性能的優(yōu)化有關,也可能與需求的變化和驗證確認的反饋有關。軟件架構中將具體實現(xiàn)與抽象接口完全分離,就實現(xiàn)了良好的可擴展性。(4)高性能的數(shù)據(jù)結構與算法設計。CFD 軟件作為典型的計算密集型應用,計算性能對軟件的可用性和應用場景都極為重要。面向對象的模塊化設計相對于基于Fortran等結構化語言而言會帶來一定的性能損失,但我們應該盡可能地提高數(shù)據(jù)結構和算法設計的高效性,尤其在架構設計方面考慮大規(guī)模并行和大型稀疏矩陣運算的計算效率。
圍繞以上設計目標,本文提出了一種高可擴展的通用工程計算軟件架構。這里的“通用”主要指該軟件架構不針對具體的CFD應用問題,而是適用于所有可以通過微分方程描述的應用,包括不可壓縮流體、可壓縮流體、湍流、多相流和燃燒等應用問題都可以集成到該架構中進行實現(xiàn)。
本文將通用CFD軟件中的核心計算過程抽象為4個層次:應用層、算法模型層、時空離散層和線性系統(tǒng)層??傮w架構如圖1所示。
應用層是頂層應用主程序,包括求解不可壓縮流、可壓縮流和多相流等具體應用問題的主程序。實際軟件實現(xiàn)過程中,應用層代碼主要調用算法和模型接口來完成應用問題的求解。圖1中的SegaregatedAlgo是分離式求解算法接口,為了直觀性這里沒有考慮耦合式算法的情形。Model接口則對CFD領域的多種理論模型進行了抽象。
算法模型層則主要包括求解算法和理論模型的具體實現(xiàn)模塊,這些模塊最終通過調用時空離散接口discreteMethod將理論模型轉化為線性系統(tǒng)。
時空離散層實現(xiàn)了discreteMethod接口,通過特定的離散方法將模型中包含的微分方程組裝為多個線性系統(tǒng)。典型的離散方法包括有限體積法、有限元法和有限差分法等。時空離散層通過Matrix接口操作線性系統(tǒng)中的稀疏矩陣,并調用LinSolver接口來求解各個線性系統(tǒng)。
線性系統(tǒng)層主要包括2個模塊實現(xiàn):稀疏矩陣格式Matrix和線性求解器LinSolver。為了描述完整的線性系統(tǒng)Ax=b,還需要提供物理場數(shù)據(jù)結構等。通過求解線性系統(tǒng),CFD軟件能夠得到各個微分方程的解,從而完成對應用案例中所包含的理論模型的求解。
Figure 1 A highly scalable general purpose CFD software architecture圖1 一種高可擴展的通用CFD軟件架構
與現(xiàn)有的主流CFD軟件架構相比,該軟件架構設計的層次結構主要有以下3個特色:(1)模塊抽象的一般性,即應用、算法模型、時空離散和線性系統(tǒng)的抽象并不針對特定的CFD應用,而是面向所有CFD領域的一般化抽象。因此,本文設計的是一種通用CFD軟件架構,能夠兼容空氣動力學、水動力學、反應堆熱工水力和發(fā)動機內流仿真等多種應用領域軟件的開發(fā);另一方面這種高層次抽象增加的軟件代碼的可讀性和可維護性,開發(fā)人員不需要深入理解具體的CFD領域計算方法就能很容易找到各個層次需要維護和開發(fā)的接口。(2)層次之間的依賴關系倒置。從圖1中可以看到,模塊之間的依賴關系打破了傳統(tǒng)的面向過程軟件結構中上層依賴下層的樹狀關聯(lián):高層模塊僅依賴接口,而不依賴低層實現(xiàn),而低層模塊通過接口實現(xiàn)(繼承)關系依賴于上層模塊。這種軟件架構使得CFD軟件中具體算法或實現(xiàn)代碼的修改和擴展完全不影響其它模塊,從而實現(xiàn)了更大程度的可擴展性。由于在軟件中接口相對穩(wěn)定,而具體實現(xiàn)總是隨著技術的發(fā)展和需求的變化需要不斷地擴展和修改,將代碼盡可能地脫離對具體實現(xiàn)的依賴能更好地保證軟件架構的穩(wěn)定性。(3)多個層次的可擴展性。通過接口與實現(xiàn)的分離,可以在軟件中不斷擴充新的實現(xiàn)代碼,例如,線性系統(tǒng)層可以增加PETSC求解器,并使用新的壓縮矩陣格式,而這種代碼擴展完全不影響其他模塊的功能和代碼,只需在輸入配置文件中指明需要調用的模塊就可以動態(tài)加載?;谠摷軜嬁梢詫崿F(xiàn)多個層次的二次開發(fā)接口,并設計具有高度易用性的軟件開發(fā)包(SDK)以兼容第三方開發(fā)模塊。
通用CFD軟件中的關鍵數(shù)據(jù)結構包括配置參數(shù)Config、網格數(shù)據(jù)Mesh、物理場Field和稀疏矩陣Matrix。Config類通過讀取YAML格式的輸入文件來初始化各個案例配置參數(shù),其主要數(shù)據(jù)成員如下所示:
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;
}
本文將配置數(shù)據(jù)分為partition、geometry、mesh、physics、boundary、algorithm、discrete、control、solver、assemble和solution 共11個部分。每部分的含義與變量名相符,例如partition中包含并行劃分相關配置,mesh中指明網格文件的名稱和位置等,boundary中包含所有邊界條件設置,control配置了時間步大小及總模擬時長等控制參數(shù)。更多細節(jié)本文不再一一列舉。
根據(jù)Config 中指明的網格文件名稱和位置讀入網格之后,數(shù)據(jù)存儲在mesh中,class Mesh的主要數(shù)據(jù)成員如下所示:
class Mesh{
vector〈Node〉 nodeList_;
vector〈Face〉 faceList_;
vector〈Element〉 elementList_;
vector〈Boundary〉 boundaryList_;
vector〈Domain〉 domainList_;
}
網格中的節(jié)點、面、單元體、邊界和區(qū)域都通過連續(xù)數(shù)組vector的形式存儲,保證了最高的訪問效率。本文采用非結構網格格式,同時所有的離散格式和算法都基于非結構網格的一般形式,能夠兼容結構網格。
物理場Field則依次將與網格單元對應的物理場的值存儲在連續(xù)數(shù)組中,具體軟件實現(xiàn)中將Field定義為vector的子類。Matrix則存儲了離散后的稀疏矩陣,稀疏矩陣可以有多種存儲格式,現(xiàn)有軟件版本中實現(xiàn)了一種標準的CSR格式。
基于以上軟件架構設計方案,本文實現(xiàn)了一款通用CFD軟件原型系統(tǒng)CFD-Prototype。原型系統(tǒng)源碼結構如圖2所示。etc 目錄中包含基本的配置腳本,src 目錄包含所有核心軟件源代碼,目前的軟件版本中實現(xiàn)了Simple迭代算法、不可壓縮流體模型和簡單的GaussSeidel線性迭代求解算法,離散方法方面實現(xiàn)了基本的有限體積法時空離散。該原型系統(tǒng)可以求解基本的不可壓縮流體層流應用問題,支持穩(wěn)態(tài)和瞬態(tài)求解。
Figure 2 Source code structure of the highly scalable general purpose CFD software prototype圖2 高可擴展通用CFD軟件原型系統(tǒng)源碼結構
原型系統(tǒng)支持cgns 網格格式,通過YAML格式的輸入文件定義模擬案例。一種典型的案例配置文件模板中的典型內容如下所示:
mesh:
fileName:../test/test.cgns #網格數(shù)據(jù)文件
fileType:cgns
dimension:3
scaleFactor:
x:0.01
y:0.01
z:0.01
physics:
state:steady #/transient,確定模擬類型是瞬態(tài)還 #是穩(wěn)態(tài)
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,設置參考狀態(tài)比焓
refSpecificEntropy:0 # J/(kg K)設置參考狀態(tài)比熵
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案例需要的參數(shù)配置,包括邊界條件、初始條件、理論模型參數(shù)和材料參數(shù)等。網格文件則通過mesh:fileName指定。YAML文件的可讀性較高,用戶可以方便地進行修改。
test 目錄下是基于GoogleTest建立的單元測試和集成測試庫,可以針對每個獨立的模塊進行測試。這些測試模塊將是下一步建立自動測試系統(tǒng)和持續(xù)集成的基礎。
為了驗證本文設計的通用CFD軟件架構的可行性,本文對基于該架構實現(xiàn)的原型系統(tǒng)進行了測試與分析。受限于論文篇幅,這里以一個簡單的三角腔頂壁運動問題作為測試案例進行分析。案例的幾何結構和網格劃分情況如圖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 三角腔層流案例基本參數(shù)配置
三角腔頂壁運動會引起腔內流體發(fā)生層流流動,將三角腔頂壁垂直平分線上水平分量速度模擬值與實驗結果進行對比驗證。計算域為高度為4 m,寬度為2 m,厚度為0.2 m的三棱柱。如圖3所示,網格劃分為全六面體結構網格,網格數(shù)量總計分別為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軟件架構的可行性:即可以基于該架構開發(fā)出高可擴展的通用CFD軟件,軟件高度模塊化,可運行完整案例。但是,目前的原型系統(tǒng)僅用作驗證,在核心算法方面仍存在較大缺陷,下一步需要持續(xù)改進。
在此原型系統(tǒng)基礎上,我們制定了長期的研制計劃,預計通過5年左右的軟件開發(fā),將該通用軟件架構原型系統(tǒng)發(fā)展為一款支持工程實用案例的通用CFD軟件系統(tǒng),并應用到國產高性能計算機系統(tǒng)上。軟件研制的初步路線和計劃如圖5所示。
Figure 5 Development plan of the highly scalable general purpose CFD software圖5 高可擴展的通用CFD軟件研制計劃
目前的軟件原型系統(tǒng)僅對軟件基本架構進行了實現(xiàn),并基于GoogleTest建立了自動測試框架,支持基本的Simple系列解耦式求解算法,支持穩(wěn)態(tài)和瞬態(tài)的不可壓縮流體模型;下一步將通過集成PETSC來提升軟件的線性系統(tǒng)求解能力,并通過大量工程案例的測試與優(yōu)化來提升軟件對復雜網格的兼容性和穩(wěn)定性,同時進一步擴展多種三階TVD(Total Variation Diminishing)格式來提高數(shù)值離散的精度。由于該軟件采用了高度可擴展的軟件架構,可以不斷地添加新的算法與模型。
本文基于國內自主通用CFD軟件研制的現(xiàn)狀,分析了高可擴展的通用CFD軟件架構設計的目標,并提出了一種基于面向對象的、高度解耦的層次化通用CFD軟件架構,并基于該架構設計實現(xiàn)了一款通用CFD軟件原型系統(tǒng),最后通過一個完整的CFD案例對原型系統(tǒng)進行了測試與分析,驗證了該軟件架構的可行性。
該通用軟件原型系統(tǒng)的設計與實現(xiàn)仍存在較大缺陷,在理論模型支持、數(shù)值算法完備性、并行計算效率等方面仍有大量工作需要開展。在此基礎上,我們制定了初步的軟件研制計劃,預計通過5年以上的軟件開發(fā),完成一款支持核反應堆熱工水力仿真、飛行器空氣動力學分析、大型船舶水動力學分析等復雜應用案例的自主知識產權通用CFD軟件產品。