【OpenFOAM案例】02 自己動手


前言:很多人說OpenFOAM很難,要啃上很多的理論書籍,什么流體力學、計算流體力學、矩陣理論、線性代數、數值計算、C++程序設計神馬的,看看光這一堆書就能嚇倒絕大多數的人。其實我們並不一定要從這些基礎的東西入手,我覺得要學習使用一個工具,首先使它運轉起來才是最靠譜的。通過大量實例練習,做多了自然就能有所感悟。

前面講到了利用icoFoam求解器計算彎曲管道中流體混合問題。現在來自己動手做一個簡單的案例,還是利用icoFoam求解器。icoFoam求解器計算的是瞬態不可壓層流流動問題,是OpenFOAM中最簡單的求解器之一。

關於此求解器內部實現原理,我們以后再慢慢剖析,一開始就講一大堆的公式推導會嚇壞小朋友的。閑話少說,我們來開始我們的案例。

案例描述

一個非常簡單的管道流動問題。我們不強調問題多復雜,只關注OpenFOAM解決問題的思路。

流體流經一個直徑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。

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內容,可微信掃描下方二維碼關注微信公眾號。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM