構造解析・熱流体解析・電磁場解析・生体機構などのCAE解析ソフトを販売し、CAEコンサル ティングサービスを提供する ソフトウェアエンジニアリング会社です。

MENU

OpenFOAMチュートリアル

  • HOME »
  • OpenFOAMチュートリアル

はじめに

OpenFOAMは他の市販CFDソフトと同様に汎用熱流体解析ソルバーというだけではなく,熱流体解析のための有限体積法に基づくC++ライブラリを提供しています。OpenFOAMはオープンソースのソフトウェアで誰でもソースを読むことができますが,メッシュ作成からソルバー実行,ポスト処理に至るまでの完全な形での公式マニュアルなどのドキュメントは付属していません。そのため弊社では,OpenFOAMの入力ファイルに加えてライブラリの説明を加えた「OpenFOAMライブラリリファレンス」という書籍を2020年に発売を開始いたしました。

ここではOpenFOAMをまだよく知らない方のために,OpenFOAMに付属するpitzDaily(バックステップ乱流)を用いてOpenFOAMで熱流体解析を行う際の手順をOpenFOAMのコマンドや入力ファイルの内容を示しながら説明します。ここでは,解析手順の流れを説明することが目的であるため,コマンドや入力ファイルの内容の詳細な説明はしません。

準備

1 Linuxの端末

OpenFOAMが動作するOSはLinuxです。Windowsを使用しているときは,仮想環境やWSL(Windows Subsystem for Lunux)からLinuxを起動することによりOpenFOAMを使用することができます。
以下の説明では,Linuxの端末上でコマンドを入力します。

2 チュートリアルデータ

はじめに,pitzDailyチュートリアルのデータをユーザの実行ディレクトリ(ケースディレクトリとも呼ばれます)にコピーします。Linuxの端末で以下のコマンドを実行します。

$ run
$ cp $FOAM_TUT/incompressible/simpleFoam/pitzDaily .
$ cd pitzDaily

ここで,runコマンドはOpenFOAMの環境変数を設定すると自動的に生成されるコマンドで,ホームディレクトリ下のOpenFOAM実行ディレクトリに移動します。OpenFOAMの実行ディレクトリは,通常,~/OpenFOAM/<user>-ver/runと設定されます(<user>はログイン名,verはインストールしたOpenFOAMのバージョン番号)。実行ディレクトリが存在しなければ作成します。

2行目の$FOAM_TUTはOpenFOAMのチュートリアルデータが保存されているディレクトリを指します。cpコマンドでpitzDailyチュートリアルデータを,ユーザ実行ディレクトリにコピーします。

3行目は,カレントディレクトリをpitzDailyに移動しています。以降では,カレントディレクトリは~/OpenFOAM/<user>-ver/run/pitzDailyとして説明します。

3 実行ディレクトリの構造

OpenFOAMの実行ディレクトリには,表 1に示すディレクトリ構成で入力ファイルが存在します。

表1 実行ディレクトリ構造と入力ファイル一覧
ディレクトリ名 ファイル・ディレクトリ名 内容
0 U, p, nut, epsilon, k 変数ファイル
constant momentumTransport 乱流モデル設定ファイル
transportProperties 動粘性係数設定ファイル
polyMesh メッシュデータ保存ディレクトリ
system blockMeshDict メッシュ生成設定ファイル
controlDict 解析制御設定ファイル
fvSchemes 離散化スキーム設定ファイル
fvSolution 線形ソルバー・収束判定設定ファイル
stremaLine 流線を出力する関数オブジェクトファイル

piitzDailyチュートリアルの解析モデル

pitzDailyの解析モデルを図1に示します。

図1 pitzDailyの解析モデル

流入流速は10 m/s,動粘性係数は1e-5,レイノルズ数はRe=UH⁄ν=25400です。乱流モデルは,レイノルズ平均モデルの標準k-eモデルを使用します。本解析は2次元モデルでz方向は解きません。

解析手順

1 ソルバーの選定

OpenFOAMでは複数のソルバーが存在します。本解析は非圧縮性流体,単相,乱流の定常解析ソルバーであるsimpleFoamを使用します。

2 メッシュの作成

OpenFOAMにはソルバー生成プログラムが2つ附属しています。blockMeshとsnappyHexMeshです。blockMeshは簡単な形状のメッシュを作成できます。複雑な物体形状などをもつメッシュを作成する場合には,snappyHexMeshを使用します。pitzDailyチュートリアルではblockMeshプログラムを使用します。

メッシュ生成に関するセル数やセル幅の粗密の制御の設定はsystem/blockMeshDictに記述されています。次のコマンドでメッシュを生成します。

$ blockMesh

なお,本解析は2次元解析ですが,メッシュは常に3次元空間である必要があります。つまり,無視する方向(この解析ではz方向)にも厚みのあるセルを少なくとも1セル作成する必要があります。

3 入力ファイルの作成
3.1 初期条件と境界条件

変数の初期条件と境界条件は0ディレクトリにある各変数ファイルに記述します。流速変数Uのファイルを以下に示します。なお,ヘッダ部は省略しています。


dimensions      [0 1 -1 0 0 0 0];

internalField   uniform (0 0 0);

boundaryField
{
    inlet
    {
        type            fixedValue;
        value           uniform (10 0 0);
    }

    outlet
    {
        type            zeroGradient;
    }

    upperWall
    {
        type            noSlip;
    }

    lowerWall
    {
        type            noSlip;
    }

    frontAndBack
    {
        type            empty;
    }
}

dimensionsで変数の次元,internalFieldでは初期値を設定しています。

pitzDailyチュートリアルの解析条件では,図1に示すように,左側(inlet)から流体は流入し,右側(outlet)から流体は流出します。流入条件としてinletで流速固定(x方向成分10m/s,y,z方向成分0m/s)とし,outletは0勾配条件を課します。上下壁(upperWall,lowerWall)はノースリップ条件とします。z軸に垂直となる境界面(frontAndBack)はemptyと設定することで2次元解析とします。

3.2 物性値ファイル

物性値ファイルconstant/transportPropertiesでは動粘性係数を設定します。


transportModel  Newtonian;

nu              [0 2 -1 0 0 0 0] 1e-05;

3.3 乱流モデル設定ファイル

乱流モデルはconstant/momentumTransportファイルで設定します。なお,バージョン7までは設定ファイル名はmomentumTransportではなく,ファイルはturbulencePropertiesが使用されていました。


simulationType RAS;

RAS
{
    model           kEpsilon;
    turbulence     on;
    printCoeffs    on;
}

OpenFOAMでは,ここで設定した標準k-εモデルだけではなく,数多くの乱流モデルが利用できます。

3.4 離散化スキーム設定ファイル

離散化スキームの設定はsystem/fvSchemesファイルで行います。OpenFOAMではさまざまな離散化スキームを提供しています。system/fvSchemesファイルでは,非定常項,勾配項,発散項,ラプラシアン項,内挿スキーム,面法線方向勾配スキーム,壁面からの距離評価法に対してそれぞれ設定を行います。


ddtSchemes
{
    default         steadyState;
}

gradSchemes
{
    default         Gauss linear;
}

divSchemes
{
    default         none;
    div(phi,U)      bounded Gauss linearUpwind grad(U);
    div(phi,k)      bounded Gauss limitedLinear 1;
    div(phi,epsilon) bounded Gauss limitedLinear 1;
    div(phi,omega)  bounded Gauss limitedLinear 1;
    div(phi,v2)     bounded Gauss limitedLinear 1;
    div((nuEff*dev2(T(grad(U))))) Gauss linear;
    div(nonlinearStress) Gauss linear;
}

laplacianSchemes
{
    default         Gauss linear corrected;
}

interpolationSchemes
{
    default         linear;
}

snGradSchemes
{
    default         corrected;
}

wallDist
{
    method meshWave;
}

3.5 収束条件設定ファイル

SIMPLE法,線形ソルバー,定常収束判定値の設定はconstant/fvSolutionファイルで行います。収束判定値は,SIMPLE辞書のresidualControlで,緩和係数はrelaxationFactors辞書で設定します。


solvers
{
    p
    {
        solver          GAMG;
        tolerance       1e-06;
        relTol          0.1;
        smoother        GaussSeidel;
    }

    "(U|k|epsilon|omega|f|v2)"
    {
        solver          smoothSolver;
        smoother        symGaussSeidel;
        tolerance       1e-05;
        relTol          0.1;
    }
}

SIMPLE
{
    nNonOrthogonalCorrectors 0;
    consistent      yes;

    residualControl
    {
        p               1e-2;
        U               1e-3;
        "(k|epsilon|omega|f|v2)" 1e-3;
    }
}

relaxationFactors
{
    equations
    {
        U               0.9;
        ".*"            0.9;
    }
}

3.6 解析制御設定ファイル

解析制御を設定するファイルはsystem/controlDictです。controlDictファイルでは,実行開始時刻と終了時刻(定常解析では時刻をサイクル数と読み替えます),時間刻み幅や,途中経過のデータを出力する間隔を設定します。

実行開始時刻に関してはstartFromをstartTimeとし,startTimeに開示時刻のデータ保存ディレクトリ名を,終了時刻(最大反復サイクル数)をendTimeに設定します。deltaTには時間刻み幅を指定しますが,定常解析ソルバーの場合には1とします。途中経過のデータを出力する間隔はwriteIntervalに設定します。


application     simpleFoam;

startFrom       startTime;

startTime       0;

stopAt           endTime;

endTime          2000;

deltaT           1;

writeControl    timeStep;

writeInterval   100;

// その他省略

ソルバー実行

ソルバーの実行はソルバー名と同じコマンドで実行します。

$ simpleFoam

このように実行すると,端末にはソルバーからの出力が表示されます。以下は,端末に表示されたソルバーからの出力の一部を示しています。

Time = 1

smoothSolver: Solving for Ux, Initial residual = 1, Final residual = 0.0538101, No Iterations 1
smoothSolver: Solving for Uy, Initial residual = 1, Final residual = 0.030925, No Iterations 2
GAMG: Solving for p, Initial residual = 1, Final residual = 0.068427, No Iterations 17
time step continuity errors : sum local = 1.19733, global = 0.179883, cumulative = 0.179883
smoothSolver: Solving for epsilon, Initial residual = 0.232889, Final residual = 0.0114607, No Iterations 3
bounding epsilon, min: -1.98669 max: 1033.28 average: 35.8882
smoothSolver: Solving for k, Initial residual = 1, Final residual = 0.0454605, No Iterations 3
ExecutionTime = 0.16 s ClockTime = 0 s

pitzDailyチュートリアルでは,287サイクルで定常解が得られます。
計算結果のデータは,サイクル数(非定常解析の場合には時刻)をディレクトリ名としたディレクトリ下に変数ファイルが出力されます。

ポスト処理

OpenFOAMのソルバーが出力した計算結果を可視化表示するには,フリーソフトウェアのParaViewを使用します。

ParaViewでOpenFOAMのデータを読み込むには,はじめに,実行ディレクトリ下に実行ディレクトリ名の拡張子がfoamとなるファイルを作成します。

$ touch pitzDaily.foam

ParaViewを起動し,pitzDaily.foamを読み込みと計算結果を表示することができます。図2は,収束した287サイクルでの流速コンターを示したものです。

図2 流速分布

最後に

OpenFOAMを使用するには,解析目的に合致したソルバーの選択,メッシュ生成や解析を行うための入力ファイルの内容の理解が必要となります。当社では,OpenFOAMの導入支援(WSLやLinuxへのインストール)や使い方などに関するサポートサービスを提供しています。また,解析目的に合致したソルバーの選択から入力ファイルの作成をGUI(グラフィカルユーザインタフェース)で行うソフトウェアGUI-FOAMの販売もしております。GUI-FOAMを使用すると,入力ファイルの作成方法がわからなくても,GUIにしたがってパラメータを設定することで入力ファイルの作成ができます。

当社のOpenFOAMに関するお問い合わせはこちらからお願いいたします。

PAGETOP