前言:很多人說OpenFOAM很難,要啃上很多的理論書籍,什么流體力學、計算流體力學、矩陣理論、線性代數、數值計算、C++程序設計神馬的,看看光這一堆書就能嚇倒絕大多數的人。其實我們並不一定要從這些基礎的東西入手,我覺得要學習使用一個工具,首先使它運轉起來才是最靠譜的。通過大量實例練習,做多了自然就能有所感悟。
前面講到了利用icoFoam求解器計算彎曲管道中流體混合問題。現在來自己動手做一個簡單的案例,還是利用icoFoam求解器。icoFoam求解器計算的是瞬態不可壓層流流動問題,是OpenFOAM中最簡單的求解器之一。
關於此求解器內部實現原理,我們以后再慢慢剖析,一開始就講一大堆的公式推導會嚇壞小朋友的。閑話少說,我們來開始我們的案例。
案例描述
一個非常簡單的管道流動問題。我們不強調問題多復雜,只關注OpenFOAM解決問題的思路。
流體流經一個直徑0.01m,長度0.5m的管道,計算其內部流場。流體介質為水,密度1000kg/m3,動力粘度0.001 pa.s,入口流速0.1 m。
雷諾數:
幾何及網格如圖所示。在ICEM CFD中創建幾何並划分網格,各邊界命名如圖所示。生成並輸出網格pipe.msh。
OpenFOAM准備
本案例采用icoFoam求解器進行求解。因此先從tutorials文件夾中拷貝一個icoFoam模板,我們這里還是使用前面的elbow文件夾。
在此之前,先創建一個工作文件夾。我用命令在run路徑下創建文件夾pipe。
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文件夾下。
網格轉換
進入到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名稱。此文件不需要修改。
設置p文件與U文件
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。
修改transportProperties文件
此文件中設置一些常數項,本案例只需要設置運動粘度即可。
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文件
打開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內容,可微信掃描下方二維碼關注微信公眾號。