OpenFoam之頂蓋驅動流模擬

OpenFoam之頂蓋驅動流模擬的圖1

對一個絕熱二維方腔的不可壓縮流算例進行前處理、運行、以及后處理。幾何如圖所示,方腔所有的邊界都是壁面,頂部壁面以 1m/s 的速度在 x 方向移動,其它壁面均為固定壁面。

開始,我們假定流體為層流,并使用 icoFoam 在一個均勻網格上求解絕熱不可壓層流。接下來將研究網格非均勻化以及壁面網格非均勻化對計算結果的影響。最后,增加雷諾數,使用另一個求解器 pisoFoam 來求解絕熱不可壓湍流。

第一步:生成網格

OpenFOAM 采用網格都是三維的 。默認情況下, OpenFOAM 在三個維度上進行求解,但是如果指定某些面的邊界(例如垂直于第三個方向的平面)條件為 empty,那么它就可以用來求解二維算例。

幾何由一個 xy 平面上邊長為 0.1 米的正方形組成,這里幾何體我們稱為cavity。最開始將使用均一的 20*20 網格。block 結構參見圖2-2. 我們采用 OpenFOAM 提供的 blockMesh 來生成網格,它通過讀取指定的字典文件來生成網格,這個字典文件位于算例文件夾下的 system/ployMesh 9 文件夾下。

2021-08-26 08-39-12 的屏幕截圖.png

blockMeshDict 文件信息如下所示:

2021-08-26 08-58-52 的屏幕截圖.png

2021-08-26 09-00-48 的屏幕截圖.png
2021-08-26 09-01-27 的屏幕截圖.png

文件的第一行到第七行是文件頭信息,然后具體的字典信息通過的 FoamFile 后的 (...) 來指定 10 。這個文件首先指定各個 block 頂點(vertices)的坐標;然后通過頂點編號來定義 block,最后定義邊界面。用戶可以查閱5.3節來詳細了解 blockMeshDict 的具體意義。網格通過在這個算例目錄下運行 blockMesh 命令來生成。在算例目錄下,通過在終端簡單地鍵入:

blockMesh

來 完 成,blockMesh 命 令 會 把 運 行 的 情 況 輸 出 到 終 端。blockMeshDict 中 的 任 何 錯 誤blockMesh 都會檢測到并在終端輸出錯誤,并告訴用戶第幾行錯了。目前我們運行這個算例的時候,不會有錯誤。

第二步 邊界和初始條件

一旦網格生成完畢,用戶可以查看這個算例的初始場信息。在這個算例中,我們從 0 秒開始計算,因此初始的場信息存儲在 cavity 目錄下的 0 文件夾下。0 文件夾下又包含兩個文件, p 和 U,它們是壓力場和速度場,它們的初值和邊界條件必須指定。下面我們來看一下 p 文件:

2021-08-26 09-05-34 的屏幕截圖.png
2021-08-26 09-06-24 的屏幕截圖.png

場文件中有 3 個主要信息:
dimensions 指定場的單位,此處為運動壓力 11 ,單位為 m 2 s ?2 .
internalField 內 部 場 可 以 uniform, 即 均 一 場; 或 者 每 個 網 格 的 數 據 都 需 要 指 定 的nonuniform;
boundaryField 指定邊界場信息,包括邊界條件以及所有邊界面所需的信息。
對于這個 cavity 算例,邊界場由 walls 組成,并分為兩個 patches:(1) fixedWalls,其用來指定固定邊界,即 cavity 幾何的底部和側面。(2) movingWall,cavity 幾何的上部。作為壁面,壓力邊界條件均為 zeroGradient,意味著壓力的法向梯度為 0。frontAndBack 面即為 2D 算例的前后面,因此必須指定為empty。

在這個算例中初始場我們都設置為 uniform。這里的壓力為運動壓力,作為不可壓縮流,它的絕對值是沒有意義的。因此我們設置其為 uniform 0。這樣比較簡單 。用戶可以采用同樣的方法來查看 0/U 文件。dimensions 是速度的單位。內部場初始化為 0,對于速度來說,這個值必須是一個矢量,即:uniform (0 0 0)。速度場和壓力場的 frontAndBack 都為 empty, 其它的 patchs 均為 fixedWalls,且指定為無滑移邊界條件,因此為 fixedValue,其值為 value uniform (0 0 0)。我們假設頂部的壁面以每秒 1 米的速度在 x 方向移動,這是一個固定速度即 fixedValue,其具體的值為uniform (1 0 0)。

第三步 物理特性

算例的物理特性存儲在以 Properties 為后綴的文件中,對于 cavity 算例,唯一需要給 定 的 參 數 為 運 動 粘 度, 它 存 儲 在 transportProperties 字 典 文 件 中。 用 戶 可 以 打 開transportProperties 文件來查看運動粘度是否設置正確。運動粘度的關鍵詞為 nu,類似于希臘字母 ν 的發音。我們的算例雷諾數為 10,雷諾數如下定義:Re =d |U|/?。d 和 |U| 分別是特征長度和速度, ? 為運動粘度。此處 d 為 0.1m,|U| 為 1m/s,運動粘度為 0.01m 2 /s。所以雷諾數為 10。正確地指定運動粘度場應該如下所示 :

2021-08-26 09-13-21 的屏幕截圖.png

第四步 控制

在 controlDict 字典內可以對時間步、輸入輸出時間、場數據的讀取和寫入來進行控制。用戶應該查閱這個文件,作為一個算例的控制文件,它位于 system 文件夾下。
起始時間、終止時間以及求解時間步必須要進行設定。OpenFOAM 提供了靈活的時間步控制。在這個教程里我們打算在 t = 0 的時候開始進行計算,這意味著 OpenFOAM 需要讀取 0 文件夾下的場數據,請查閱4.1節來獲取更多有關算例文件結構的相關信息。因此我們設定startFrom 關鍵字信息為 startTime,然后指定 startTime 為 0。
運算結束的時候,我們希望能達到穩定的狀態,即流體在空腔內循環。一個通用準則是,層流下流體應該穿過(循環)計算域 10 次。在這個算例中,我們沒有進口和出口,因此流體沒有穿過計算域。因此結束時間應該設置為在空腔內循環 10 次的時間。例如 1s。實際上,我們發現 0.5s 就可以了,故我們設置結束時間為 0.5s。我們通過把 stopAt 關鍵字指定為 endTime 然后把 endTime指定為 0.5 來完成。

現在我們需要設定時間步,即 deltaT。當運行 icoFoam 的時候,為了達到數值穩定以及時間計算精度,庫郎數 14 應該小于 1。每個網格的庫郎數這樣定義:Co =δ t |U|/δ x。δ t 為時間步,|U| 為某個網格單元內的速度矢量的模, δ x 為速度方向的網格長度。由于流體域內速度并不均一,為了保證庫郎數在各處都小于 1,我們依據最大速度和最小網格尺寸來計算庫郎數,在保證其小于 1 的前提下指定時間步。在這個算例中網格大小是固定的,因此在頂蓋附近,速度接近1m/s 的地方庫郎數最大,網格大小為:δ x =d/n=0.1/20=0.005m。為了使庫郎數在整個流體域都小于或等于 1。時間步必須小于或等于:δ t =Co δ x /|U|=1 ? 0.005/1=0.005s。

隨著計算的進行,我們希望在某個固定的時間間隔下寫入數據。以便我們可以在后處理中進行查看。對于如何對寫入時間步進行設定有很多選擇,它可以通過 writeControl 關鍵字來控制。我們決定在 0.1s, 0.2s, …, 0.5s 寫入我們的結果。由于計算時間步為 0.005s,因此我們需要每 20 個時間步輸出一次結果,這樣我們設定 writeInterval 為 20。
OpenFOAM 會在每一個時間步內創建一個文件夾,例如 0.1 文件夾。正如4.1節所說,每個時間步下都有一系列數據。對于 icoFoam 求解器,它把速度 U 和壓力 p 寫入在每個時間步對應的文件夾中。對于這個算例,controlDict 設置如下:

2021-08-26 09-22-06 的屏幕截圖.png
2021-08-26 09-22-49 的屏幕截圖.png

第五步 離散方法和矩陣求解器設置

用戶在 system 下的 fvScheme 文件中指定有限體積法的離散格式。在 system 下的fvSolution 文件下指定方程組矩陣求解器、殘差以及其它算法控制。用戶可以查看這些字典文件,目前我們不討論這些內容,但是有必要提及 fvSolution 里面的 PISO 子字典中的 pRefCell以及 pRefValue。在一個封閉的不可壓體系中,例如這個空腔,壓力是相對的。跟絕對壓力值來說,壓力的相對范圍比較重要。在類似的這種例子中,求解器通過 pRefCell 以及 pRefValue來設置參考值。這個例子中我們都設置為 0。改變其中任何一個值都會改變絕對壓力場。但是不會改變相對壓力場和速度場。

2021-08-26 09-32-20 的屏幕截圖.png
2021-08-26 09-32-56 的屏幕截圖.png
2021-08-26 09-34-39 的屏幕截圖.png
2021-08-26 09-35-23 的屏幕截圖.png

第六步 查看網格

在運行之前,我們最好檢查一下網格以查看是否有錯誤。用戶可以通過 ParaView 軟件來查看網格, ParaView 是 OpenFOAM 推薦采用的后處理軟件。針對 OpenFOAM 的數據, OpenFOAM中的 paraFoam 程序可以自動加載 OpenFOAM 數據并在當前文件位置運行 ParaView  。

UNIX/Linux 的任何可執行程序都可以采用兩種方式來運行。如果用戶以前置的方式來運行程序,則下一個命令需要在前一個命令運行結束后才能運行。如果用戶以后臺的方式運行程序,則可以同時運行其他程序。因為我們可能需要在運行 ParaView 的同時并使用其他命令,因此我們可以通過后臺的方式來運行,用戶需切換到算例文件夾下并鍵入:

paraFoam &
它也可以在非算例目錄下的終端運行,但應該使用-case 命令參數,例如:
paraFoam -case $FOAM_RUN/cavity &

這會啟動 ParaView 窗口,在 Pipeline Browser 下,用戶可以看出 ParaView 已經打開了這個算例模塊并稱之為 cavity.OpenFOAM,在應用 apply 按鈕之前,用戶需要在 MeshParts 里面選擇要顯示的幾何。因為這個算例文件很小,最簡單的是在 Mesh Parts 旁的窗口里選擇全部幾何數據,這會自動的檢查所有幾何單元。然后用戶點擊 Apply,網格文件就會被ParaView 加載。

Display 面板控制所選模塊的視覺效果。用戶在 Display 面板下用戶應該參照下圖所示來進行操作:

1.在 Coloring 內選擇 Solid Color;
2. 然后點擊 Edit 并選擇合適的顏色,例如黑色(如果是白色的背景色);
3. 在 Representation 菜單下,選擇 Wireframe。背景色可以通過 Properties 窗口中Display 面板下的 View Render 面板來設置。

由于這個算例是一個二維算例,建議在 Edit 下的 ViewSetting 中的 General 面板中勾選 Use ParallelProjection。在Annotation 面板下我們也可以選擇打開或者關閉 Orientation Axes。

2021-08-26 09-43-02 的屏幕截圖.png  

第七步 運行算例

正如其它任何 UNIX/Linux 可執行程序一樣,OpenFOAM 程序可以通過前置進程和后臺進程的方式來運行我們以前置進程的方法運行 icoFoam,一種方法是直接算例目錄下的終端鍵入:
icoFoam
來運行,另一種方法是可以通過-case 命令參數來指定算例目錄:
icoFoam -case $FOAM_RUN/cavity
在終端的窗口里,我們會看到命令的輸出信息,它告訴用戶當前的時間步以及最大庫郎數,所有場的初始殘差和最終殘差。

第八步 后處理

在把結果寫入時間步文件之后,我們可以使用 paraFoam 來進行后處理,回到 paraFoam 窗口,選擇 cavity.OpenFOAM 模塊。如果當前沒有顯示算例的網格,請確保 cavity.OpenFOAM處于高亮綠色。并且在左邊高亮顯示一個眼睛的圖標,這樣就會顯示當前的算例。為了讓 paraFoam 展示所需要的數據信息,首先要確保加載 0.5s 時間步的數據。如果運行算例的時候 ParaView 已經打開,新的時間步數據不會自動加載。為了加載新的時間步數據,應該在Properties 中點擊 Refresh Times。這會自動加載新的時間步數據文件。為了查看 0.5s 的數據,用戶可以使用 VCR Controls 或者 Current Time Controls 將當前時間步設置為 0.5。他們位于 ParaView 窗口的工具欄,詳見圖。

cavity.png  

登錄后免費查看全文
立即登錄
App下載
技術鄰APP
工程師必備
  • 項目客服
  • 培訓客服
  • 平臺客服

TOP

3