前言:不少人說OpenFOAM很難,要啃上不少的理論書籍,什麼流體力學、計算流體力學、矩陣理論、線性代數、數值計算、C++程序設計神馬的,看看光這一堆書就能嚇倒絕大多數的人。其實咱們並不必定要從這些基礎的東西入手,我以爲要學習使用一個工具,首先使它運轉起來纔是最靠譜的。經過大量實例練習,作多了天然就能有所感悟。c++
前面講到了利用icoFoam求解器計算彎曲管道中流體混合問題。如今來本身動手作一個簡單的案例,仍是利用icoFoam求解器。icoFoam求解器計算的是瞬態不可壓層流流動問題,是OpenFOAM中最簡單的求解器之一。shell
關於此求解器內部實現原理,咱們之後再慢慢剖析,一開始就講一大堆的公式推導會嚇壞小朋友的。閒話少說,咱們來開始咱們的案例。微信
一個很是簡單的管道流動問題。咱們不強調問題多複雜,只關注OpenFOAM解決問題的思路。app
流體流經一個直徑0.01m,長度0.5m的管道,計算其內部流場。流體介質爲水,密度1000kg/m3,動力粘度0.001 pa.s,入口流速0.1 m。工具
雷諾數:
\[ Re= \frac{\rho u D}{\mu} = \frac{1000 \times 0.1 \times 0.01}{0.001} =1000 \]
幾何及網格如圖所示。在ICEM CFD中建立幾何並劃分網格,各邊界命名如圖所示。生成並輸出網格pipe.msh。post
本案例採用icoFoam求解器進行求解。所以先從tutorials文件夾中拷貝一個icoFoam模板,咱們這裏仍是使用前面的elbow文件夾。學習
在此以前,先建立一個工做文件夾。我用命令在run路徑下建立文件夾pipe。spa
mkdir $FOAM_RUN/pipe
以後利用命令copy一個elbow文件夾到pipe下面。設計
cp -r $FOAM_TUTORIALS/incompressible/icoFoam/elbow/ $FOAM_RUN/pipe
這樣的話,pipe文件夾下就有了elbow文件夾。若是有潔癖的話,能夠把elbow文件夾命名爲pipe,或者把elbow文件夾下的文件copy到pipe文件夾下,而後刪除掉elbow。這裏懶得折騰,直接進入到elbow路徑下,並把前面生成的pipe.msh文件拷貝到elbow文件夾下。code
進入到elbow目錄下,利用命令:
fluentMeshToFoam pipe.msh
此命令將網格pipe.msh轉化爲OpenFOAM可以識別的網格文件。
elbow目錄以下所示:
├── 0 │ ├── p │ └── U ├── Allclean ├── Allrun ├── constant │ ├── polyMesh │ │ ├── boundary │ │ ├── cellZones │ │ ├── faces │ │ ├── faceZones │ │ ├── neighbour │ │ ├── owner │ │ ├── points │ │ └── pointZones │ └── transportProperties ├── elbow.msh ├── pipe.msh └── system ├── controlDict ├── foamDataToFluentDict ├── fvSchemes └── fvSolution 4 directories, 19 files
此時能夠查看polyMesh文件夾下的boundary文件。文件內容爲:
FoamFile { version 2.0; format ascii; class polyBoundaryMesh; location "constant/polyMesh"; object boundary; } // * * * * * * * * * * * * * * // 3 ( INLET { type patch; nFaces 288; startFace 210864; } OUTLET { type patch; nFaces 288; startFace 211152; } WALL { type wall; inGroups 1(wall); nFaces 7968; startFace 211440; } )
檢查文件邊界名稱分別爲:INLET、OUTLET以及WALL。這些是咱們在ICEM CFD中定義的Part名稱。此文件不須要修改。
0文件夾中包含有p文件和U文件。
先利用命令打開p文件,刪除一些沒用的邊界,修改其內容爲:
FoamFile { version 2.0; format ascii; class volScalarField; object p; } // * * * * * * * * * * * * // dimensions [0 2 -2 0 0 0 0]; internalField uniform 0; boundaryField { INLET { type zeroGradient; } OUTLET { type fixedValue; value uniform 0; } WALL { type zeroGradient; } }
再打開U文件,修改其內容爲:
FoamFile { version 2.0; format ascii; class volVectorField; object U; } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // dimensions [0 1 -1 0 0 0 0]; internalField uniform (0 0 0); boundaryField { INLET { type fixedValue; value uniform (0.1 0 0); } OUTLET { type zeroGradient; } WALL { type noSlip; } }
這裏修改INLET邊界的速度爲x方向0.1 m/s。
此文件中設置一些常數項,本案例只須要設置運動粘度便可。
FoamFile { version 2.0; format ascii; class dictionary; location "constant"; object transportProperties; } // * * * * * * * * * * * * * * * * * * * * * * * // nu [0 2 -1 0 0 0 0] 1e-6;
注意這裏設置的是運動粘度,其量綱單位是m2/s。
打開controlDict文件
FoamFile { version 2.0; format ascii; class dictionary; location "system"; object controlDict; } // * * * * * * * * * * * * * * * * // application icoFoam; startFrom latestTime; startTime 0; stopAt endTime; endTime 20; deltaT 0.05; writeControl timeStep; writeInterval 20; purgeWrite 0; writeFormat ascii; writePrecision 6; writeCompression off; timeFormat general; timePrecision 6; runTimeModifiable true; functions { #includeFunc residuals }
回到elbow目錄下,運行命令:
icoFoam
也能夠用並行計算:
mpiexec -n 6 icoFoam
利用6個cpu進行計算。
此時能夠利用命令監測殘差:
foamMonitor -l postProcessing/residuals/0/residuals.dat
注意:此方法是創建在已安裝gnuplot的基礎之上,不然是看不到殘差的。個人機器上blueCFD使用此命令出錯,可是在虛擬機中用OpenFOAM沒有任何問題,我不清楚是gnuplot沒安裝好仍是其餘什麼緣由。看不到殘差曲線的,將就着看輸出的數據好了。
輸入命令:
paraFoam
軟件自動啓動ParaView,可觀察剖面上速度分佈雲圖,如圖所示。
更多關於CFD內容,可微信掃描下方二維碼關注微信公衆號。