轉載自蘇軍偉微博“影響CFD計算量的因素分析及在OpenFOAM中的參數調整”
影響 CFD 計算量的因素很多,大概可以歸為一下幾個部分
1)物理問題本身
物理問題本身的復雜程度直接關系到計算量。 一般而言,非線性模型的計算量要高於線性模型,多相流計算量大於單相流動。 如果單純從求解方程個數及其方程類型而言, 方程個數越多計算量越大,比如提供例子中 square 需要解 3 個標量方程(標量 p 和向量 U (2d) ),而 dambreak 需要求解 6 個方程(標量 p、向量 U(2d)、標量體積分率 alpha,標量湍流強度 k 和標量湍流強度耗散率 epsilon)。因此 dambreak 的計算量要高於方塊繞流 。湍流模擬而言,大渦模擬的計算量要高於雷諾時均。
2)計算網格單元數目和維度
計算網格的單元數直接關系到最終代數方程組的個數(每個單元求解一個代數方程)。計算單元的個數越多,代數方程組越難求解,計算量越大,因此在滿足工程需求的情況下,應盡量減少網格數目,以減低計算量。 當網格數目相同時,計算區域的維度越大,得到的代數方程組越難求解。也就是說,網格數目相同的情況下也就是說 3d 的網格較 2d 的網格難求解。
3)計算網格的相對大小
對於顯式或者半隱式算法(SIMPLE 或者 PISO,cfd 中較常采用),計算的穩定性受庫朗數(Co=u*dt/dx<1)的限制,物理上認為,計算過程中流體在設定的時間步長內流動距離不能超過一個網格。因此,在剖分網格時,應該避免出現體積過小的網格。
4)代數方程求解器
代數方程求解器是關系計算量的關鍵因素之一,當計算的網格單元數比較多時, 代數方程求解器的選擇尤其重要。 OpenFOAM 中的代數方程求解器有 3 類,多重網格求解器,共軛梯度求解器,光滑求解器。一般而言,計算速度的排列可以為共軛梯度求解器+多重網格預條件器 > 多重網格求解器 > 共軛梯度求解器+一般與預條件器>光滑求解器。代數方程的求解難度和方程類型有關,對於速度方程和一般的標量方程(k 或者 epsilon),相對容易求解, 因為這些方程通常具有對角占優特性。而對於,泊松類型的方程(比如壓力p 的方程),由於對角占優特性較差,則很難求解。故,對於網格數目較多的問題,通常對壓力方程采用“共軛梯度求解器+多重網格預條件器”或者“多重網格求解器”來進行求解,而對於普通的標量方程則使用“共軛梯度求解器”。求解器的選擇可以通過 case 文件夾下的 system 下的 fvSolution 來完成,典型的設置方法如下:
“共軛梯度求解器+多重網格求解器” p //求解變量 { solver PCG; //共軛梯度求解器(使用對稱矩陣,否則 PBICG) preconditioner { preconditioner GAMG; //代數網格預條件器 tolerance 1e-05; //預條件器絕對殘差 relTol 0; //預條件器相對殘差 smoother DICGaussSeidel; nPreSweeps 0; nPostSweeps 2; nFinestSweeps 2; cacheAgglomeration false; //可以改為 true,用內存換時間 nCellsInCoarsestLevel 10; agglomerator faceAreaPair; mergeLevels 1; } tolerance 1e-05; //絕對殘差 relTol 0; //相對殘差 maxIter 100; //最大迭代數目,一般而言,該求解器可以保證在100步以內收斂 }
“多重網格求解器” p //求解變量 { solver GAMG; //代數多重網格求解器 tolerance 1e-07; //絕對誤差 relTol 0.01; //相對誤差 smoother DIC; //光滑器 nPreSweeps 0; nPostSweeps 2; nFinestSweeps 2; cacheAgglomeration true; nCellsInCoarsestLevel 10; agglomerator faceAreaPair; mergeLevels 1; }
“共軛梯度求解器” (非對稱矩陣) "(U|k)Final" { solver PBiCG; preconditioner DILU; tolerance 1e-08; relTol 0; }
“共軛梯度求解器”(對稱矩陣) p { solver PCG; preconditioner DIC; tolerance 1e-8; relTol 0.01; }
5)代數方程殘差要求
第 4)部分給出了常見代數方程器的設置。應當注意到設置過程中有兩個殘差,他們分別為 relTol(相對殘差)和 tolerance(絕對殘差),方程組迭代過程中,哪個殘差最先達到,則方程組停止迭代,這兩個值設置越小,則計算量越大,但精度會越高。在實際計算過程中可以將其中的一個設置為 0,則達到另外一個殘差,則停止迭代,當然不能兩個都設置為 0(因為殘差為 0 永遠達不到)。在 OpenFOAM 求解器中壓力方程常見有 p(或者 p_rgh)及其pFinal(p_rghFinal),p(或者 p_rgh) 用來求解壓力修正方程的中間步驟,而 pFinal(p_rghFinal)為最后一次修正過程的代數方程求解的殘差。 一般而言,將中間步驟的殘差設置較大以降低計算量,而將最后一次修正過程的殘差設置較小,以提交求解精度。
6)代數方程類型
代數方程類型有兩方面可能影響程序的計算量:(1)微分方程離散后得到的代數方程組的對角占優特性,對角占優的方程組更容易收斂;(2) 微分方程離散后得到的代數方程組的是否主對角對稱 (目前代數方程求解器大都針對對稱矩陣方程組和反對稱方程組,不對稱系數矩陣方程組可以轉化為對稱矩陣和反對稱矩陣之和。因此,一般而言,非對稱矩陣的計算量是對稱矩陣的兩倍) 。常見的求解變量的對上述兩個條件滿足狀況如下壓力方程 p(不可壓縮非穩態流動) :對稱矩陣,但對角相等,非對角占優,因此計算量較大。速度方程 U(不可壓縮非穩態流動) :非對稱矩陣,對角占優,計算量通常較 p 小。一般標量方程 k,epsilon,T 等(非穩態流動):非對稱矩陣,對角占優,計算量較小。非穩態純擴散方程(比如純導熱問題):對稱矩陣,對角占優,計算量最小;因此,在計算過程中,可以對壓力方程 p 選擇“共軛梯度求解器+代數多重網格預條件器”而速度 U 和其他標量方程選擇一般的共軛梯度求解器。選擇的方法見第 4)部分。
7)離散格式
對流項的離散格式在一定程度上會影響計算量,比如一階迎風(upwind) ,數值粘性比較大,計算穩定,可以適當增加時間步長。而對於高階格式如 Gamma 格式,數值粘性相對較較小,計算穩定性相對較差,時間步長可能要小一點,從而影響計算量。同時,高階格式求解插值系數計算量也較大。離散格式的調整可以通過 system 下的 fvScheme 文件下的 divScheme 字典下進行填寫。當不知道選擇什么的時候,可以隨便填寫一個字符串,然后根據屏幕提示進行填寫。比如:
div(phi, U) Gauss aaa;
時間項的離散也會影響到計算量,比如歐拉格式(Euler)計算量較 backward 和 CN 格式小。但精度也想應降低。 時間格式在 system 下的 fvScheme 文件中 ddtScheme 字典下進行填寫。同樣,當不知道填寫什么的時候,可以隨便填寫一個字符串, 然后根據提示進行填寫。比如:
ddt(U) aaa;
8)時間步長
時間步長越小在給定的時間內計算所需要的計算時間越長,精度也就越高。 但是,一般而言,時間步長的選擇通常根據當前計算的庫朗數進行選擇,也就是dt <(dx/U)。OpenFOAM 中通過在 system 下的 controlDict 中的 deltaT(以秒為單位)來設置。OpenFOAM 中有的求解器是可以自動調節時間步長的,比如給出的算例中 dambreak 和hotRoom,如果要自動調節時間步長需要將 controlDict 文件中的 adjustTimeStep 后面設置為on,並通過 maxCo(最大庫朗數)來自動條件時間步長。maxCo 應該小於 1,為了改善計算精度可以將 maxCo 調節的小一些,但會增加計算量。 應當指出, Co 和 deltaT 呈線性關系,如果你設置了 maxCo 為 0.5 可以比設置為 0.25 降低一倍的計算量。一般將 maxCo 設置為0.5 即可。對於 damBreak 這個例子還有一個 maxAlphaCo,他的意義和 maxCo 類似,決定了求解體積分率方程 alpha1 的步進步長,可以將 maxAlphaCo 設置和 maxCo 一樣的值。
9)最終結束時間
最終結束時間不會影響單步計算時間,但會影響總體運行時間。可以通過 system 下的controlDict 文件中的 endTime 來調節。
10)並行分塊方法
並行過程中分塊方法可能影響到計算量,一般而言,應該讓各個處理器之間的交接面最小,以減少通信量,具體方法和參數請查看附件中 decomposeParDict。