Fumiya Nozaki
最終更新日: 2015年4月26日
日本語版
OpenFOAM
乱流モデル
Turbulence Models
2
Chapter 1.
OpenFOAM の乱流モデル
3
乱流モデルのソースコードのディレクトリ
 乱流モデルのソースコードのディレクトリ:
$FOAM_SRC/turbulenceModels
非圧縮性流れ計算用のモデル
圧縮性流れ計算用のモデル
4
乱流モデルのソースコードのディレクトリ
 非圧縮性流れ計算用の乱流モデル:
$FOAM_SRC/turbulenceModels/incompressible
• RAS ディレクトリ
Reynolds-averaged Navier-Stokes (RANS) の各モデルのクラスの
ソースファイル (~.C) とヘッダファイル (~.H) が格納されています.
• LES ディレクトリ
Large eddy simulation (LES) の各モデルのクラスの
ソースファイルとヘッダファイルが格納されています.
 圧縮性流れ計算用の乱流モデル:
$FOAM_SRC/turbulenceModels/compressible
• RAS ディレクトリ
Reynolds-averaged Navier-Stokes (RANS) の各モデルのクラスの
ソースファイル (~.C) とヘッダファイル (~.H) が格納されています.
• LES ディレクトリ
Large eddy simulation (LES) の各モデルのクラスの
ソースファイルとヘッダファイルが格納されています.
5
乱流モデルのソースコードのディレクトリ
6
使用可能な乱流モデル
 ソルバーにより,使用できる乱流モデルが異なります.
• RANS モデルのみ使用可能なソルバー
• RANS モデルに加えて,LES モデルも使用可能なソルバー
simpleFoam, SRFSimpleFoam, boundaryFoam,
porousSimpleFoam, buoyantSimpleFoam,
buoyantBoussinesqSimpleFoam,
buoyantBoussinesqPimpleFoam, and other solvers
pimpleFoam, pimpleDyMFoam, SRFPimpleFoam,
pisoFoam, buoyantPimpleFoam,
chtMultiRegionFoam, chtMultiRegionSimpleFoam,
and other solvers
7
使用可能な乱流モデル
 ソルバーがどちらのタイプかは,ほとんどの場合,
createFields.H ファイルの以下の記述で確認できます.
• RANS モデルのみ使用可能なソルバー
• RANS モデルに加えて,LES モデルも使用可能なソルバー
autoPtr<incompressible::turbulenceModel> turbulence
(
incompressible::turbulenceModel::New(U, phi, laminarTransport)
);
autoPtr<incompressible::RASModel> turbulence
(
incompressible::RASModel::New(U, phi, laminarTransport)
);
8
乱流モデルの設定ファイル
 2つのタイプのソルバーでは,使用する乱流モデルの指定に必要な
設定ファイルが異なります.
• RANS モデルのみ使用可能なソルバーの場合
- constant/RASProperties のみ必要
• RANS モデルに加えて,LES モデルも使用可能なソルバーの場合
- constant/turbulenceProperties
RANS 計算(RASModel),LES 計算(LESModel),層流計算(laminar)
のどの計算を行うのかをこのファイルで指定します.
加えて
- constant/LESProperties (LES 計算を行う場合に必要)
- constant/RASProperties (RANS 計算を行う場合に必要)
層流計算の場合には,constant/turbulenceProperties のみ必要です.
9
乱流モデルの設定ファイル:turbulenceProperties
/*--------------------------------*- C++ -*----------------------------------*¥
| ========= | |
| ¥¥ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| ¥¥ / O peration | Version: 2.3.0 |
| ¥¥ / A nd | Web: www.OpenFOAM.org |
| ¥¥/ M anipulation | |
¥*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
location "constant";
object turbulenceProperties;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
simulationType RASModel;
// ************************************************************************* //
 simulationType RASModel
 simulationType LESModel
 simulationType laminar
: RANS 計算の場合
: LES 計算の場合
: 層流計算の場合
10
乱流モデルの設定ファイル:RASProperties
/*--------------------------------*- C++ -*----------------------------------*¥
| ========= | |
| ¥¥ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| ¥¥ / O peration | Version: 2.3.0 |
| ¥¥ / A nd | Web: www.OpenFOAM.org |
| ¥¥/ M anipulation | |
¥*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
location "constant";
object RASProperties;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
RASModel kEpsilon;
turbulence on;
printCoeffs on;
// ************************************************************************* //
• RASModel: 計算に使用する RANS モデルを指定
• turbulence: 乱流計算 (on) と層流計算 (off) の
切り替え
• printCoeffs: ソルバー開始時にモデル定数を
ターミナルへ標準出力するか否かのコントロール
/*--------------------------------*- C++ -*----------------------------------*¥
| ========= | |
| ¥¥ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| ¥¥ / O peration | Version: 2.3.0 |
| ¥¥ / A nd | Web: www.OpenFOAM.org |
| ¥¥/ M anipulation | |
¥*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
location "constant";
object RASProperties;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
RASModel hogehoge;
turbulence on;
printCoeffs on;
// ************************************************************************* //
11
RANS モデルのリストの表示
 RASModel に適当な名前を指定して,ソルバーを実行すると,
使用可能な RANS モデルのリストを表示してくれます.
次のページに続きます.
12
RANS モデルのリストの表示
--> FOAM FATAL ERROR:
Unknown RASModel type hogehoge
Valid RASModel types:
18
(
LRR
LamBremhorstKE
LaunderGibsonRSTM
LaunderSharmaKE
LienCubicKE
LienCubicKELowRe
LienLeschzinerLowRe
NonlinearKEShih
RNGkEpsilon
SpalartAllmaras
kEpsilon
kOmega
kOmegaSST
kkLOmega
laminar
qZeta
realizableKE
v2f
)
例えば,simpleFoam の場合,
非圧縮流れ計算用の RANS モデル が 18種類
選択可能であることが分かります.
laminar は,層流計算用なので,
実質 17 種類のモデルです.
13
モデル定数
 それぞれの乱流モデルには,モデル定数が定義されています.
 例えば,非圧縮性流れ計算用の 標準 k-ε モデル (kEpsilon) の場合
 ソースコードにデフォルト値が定義されています:
$FOAM_SRC/turbulenceModels/incompressible/RAS/kEpsilon
𝑅 𝑘 = 𝑣𝑗
𝜕𝑘
𝜕𝑥𝑗
−
𝜕
𝜕𝑥𝑗
𝜈 +
𝜈𝑡
𝜎 𝑘
𝜕𝑘
𝜕𝑥𝑗
− 𝑃𝑘 + 𝜀 = 0
𝑅 𝜀 = 𝑣𝑗
𝜕𝜀
𝜕𝑥𝑗
−
𝜕
𝜕𝑥𝑗
𝜈 +
𝜈𝑡
𝜎𝜀
𝜕𝜀
𝜕𝑥𝑗
− 𝑐1 𝑃𝑘
𝜀
𝑘
+ 𝑐2
𝜀2
𝑘
= 0
𝜈𝑡 = 𝑐 𝜇
𝑘2
𝜀
:OpenFOAMでの変数名
C1 C2Cmu
sigmaEps
14
モデル定数の確認
 設定ファイル RASProperties において,printCoeffs の設定を on にする
ことで,ソルバー実行時にモデル定数値を標準出力できます.
Create time
Create mesh for time = 0
Reading field p
Reading field U
Reading/calculating face flux field phi
Selecting incompressible transport model Newtonian
Selecting RAS turbulence model kEpsilon
kEpsilonCoeffs
{
Cmu 0.09;
C1 1.44;
C2 1.92;
sigmaEps 1.4;
}
No finite volume options present
15
モデル定数の編集
 モデル定数をデフォルト値から変更したい場合
1. 前ページのようにデフォルト値を表示させて、
2. これを RASProperties ファイルにコピー & ペーストして,
3. デフォルト値から変更したい変数の値を編集
FoamFile
{
version 2.0;
format ascii;
class dictionary;
location "constant";
object RASProperties;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
RASModel kEpsilon;
turbulence on;
printCoeffs on;
kEpsilonCoeffs
{
Cmu 0.09;
C1 1.44;
C2 1.92;
sigmaEps 1.4;
}
// ************************************************************************* //
デフォルト値は、
標準的な値が設定されているので
変更が必要な機会は
あまり多くないかもしれません.
16
Chapter 2.
RANS モデルのクラスの設計
17
乱流モデルのクラスの関係
/*---------------------------------------------------------------------------*¥
Class kEpsilon Declaration
¥*---------------------------------------------------------------------------*/
class kEpsilon
:
public RASModel
{
protected:
// Protected data
// Model coefficients
dimensionedScalar Cmu_;
dimensionedScalar C1_;
dimensionedScalar C2_;
dimensionedScalar sigmaEps_;
派生クラス名
基底クラス名
 kEpsilon クラスは,RASModel クラスの派生クラスです.
 kOmega クラスなど,その他の RANS モデルのクラスも
RASModel の派生クラスです.
RASModel
kEpsilon
親クラス
子クラス
継承
18
kEpsilon クラスのメンバ
 kEpsilon クラスのメンバ
• データメンバ
- モデル定数 (Cmu_,C1_,C2_,sigmaEps_)
- 乱流変数 (k_,epsilon_,nut_)
- Runtime タイプ名
• コンストラクタ,デストラクタ
• メンバ関数
- DkEff(),DepsilonEff(): 乱流変数の拡散係数
- R(): レイノルズ応力テンソル
- divDevReff(volVectorField& U): 拡散項の離散化
- correct(): 乱流変数 𝑘 と 𝜀 の輸送方程式を解いて,
渦粘性係数 𝜈𝑡 を計算
など
19
メンバ関数: correct()
 RANS モデルにより,渦粘性係数の計算方法は異なります.
 turbulenceModel クラスは,correct() を純粋仮想関数として定義した
抽象クラスです.
RASModel
kEpsilon
継承
turbulence
Model
継承
virtual void correct() = 0;
void turbulenceModel::correct()
{
transportModel_.correct();
if (mesh_.changing())
{
y_.correct();
}
}
20
メンバ関数: correct()
 RANS モデルにより,渦粘性係数の計算方法は異なります.
 RASModel クラスでも,correct() を仮想関数として定義しています.
virtual void correct();
void RASModel::correct()
{
turbulenceModel::correct();
}
RASModel
kEpsilon
継承
turbulence
Model
継承
21
メンバ関数: correct()
 RANS モデルにより,渦粘性係数の計算方法は異なります.
 基底クラスの仮想関数 correct() を再定義することにより,
RANS モデルの渦粘性計算をカスタマイズしています.
void kEpsilon::correct()
{
RASModel::correct();
if (!turbulence_)
{
return;
}
volScalarField G(GName(), nut_*2*magSqr(symm(fvc::grad(U_))));
// Update epsilon and G at the wall
epsilon_.boundaryField().updateCoeffs();
// Dissipation equation
tmp<fvScalarMatrix> epsEqn
(
fvm::ddt(epsilon_)
+ fvm::div(phi_, epsilon_)
- fvm::laplacian(DepsilonEff(), epsilon_)
==
C1_*G*epsilon_/k_
- fvm::Sp(C2_*epsilon_/k_, epsilon_)
);
epsEqn().relax();
epsEqn().boundaryManipulate(epsilon_.boundaryField());
solve(epsEqn);
bound(epsilon_, epsilonMin_);
(以下省略)
RASModel
kEpsilon
継承
turbulence
Model
継承
22
Chapter 3.
乱流モデルのカスタマイズ
23
カスタマイズの手順
 Chalmers 大学の Håkan Nilsson 先生の資料 [1] の手順でカスタマイズが
可能です.
 ここでは,この資料の手順にしたがって kEpsilon モデルのカスタマイズを
行ってみます.
 kEpsilon モデルのソースコードをコピーします.
$ cd $WM_PROJECT_DIR
$ cp -r --parents src/turbulenceModels/incompressible/RAS/kEpsilon ¥
> $WM_PROJECT_USER_DIR
$ cd $WM_PROJECT_USER_DIR/src/turbulenceModels/incompressible/RAS
$ mv kEpsilon mykEpsilon
補足説明
• 入力コマンドが長くなる場合には,バックスラッシュ『¥』で改行を行い,
コマンド入力を複数行に分けることができます.
• WM_PROJECT_USER_DIR などの OpenFOAM の環境変数は,
etc/bashrc ファイルで定義されています.
24
カスタマイズの手順
 $FOAM_SRC/turbulenceModels/incompressible/RAS/Make を参考にし
て,ビルドに必要な Make/files と Make/options ファイルを準備します.
 Make ディレクトリを作成します.
$ mkdir Make
 Make ディレクトリの下に files という名前のファイルを作成します.この
ファイルに,次の2行を記述して保存します.
mykEpsilon/mykEpsilon.C
LIB = $(FOAM_USER_LIBBIN)/libmyIncompressibleRASModels
25
カスタマイズの手順
 Make ディレクトリの下に options という名前のファイルを作成します.
このファイルには,以下のように記述します.
EXE_INC = ¥
-I$(LIB_SRC)/turbulenceModels ¥
-I$(LIB_SRC)/transportModels ¥
-I$(LIB_SRC)/finiteVolume/lnInclude ¥
-I$(LIB_SRC)/meshTools/lnInclude ¥
-I$(LIB_SRC)/turbulenceModels/incompressible/RAS/lnInclude
LIB_LIBS = ¥
-lincompressibleTurbulenceModel ¥
-lfiniteVolume ¥
-lmeshTools
 ソースコードのファイル名を Make/files の記述に合わせて修正します.
$ cd mykEpsilon
$ mv kEpsilon.C mykEpsilon.C
$ mv kEpsilon.H mykEpsilon.H
$ rm kEpsilon.dep
26
カスタマイズの手順
 ソースコード内のクラス名を修正します.
$ sed -i -e "s/kEpsilon/mykEpsilon/g" mykEpsilon.C
$ sed -i -e "s/kEpsilon/mykEpsilon/g" mykEpsilon.H
 (オプション) カスタマイズしたモデルを使用している目印を作成します.
mysimpleFoam.C ファイルに次の1行を加えます.
補足説明
• sed コマンドの –i オプションで,対象ファイルの上書き編集が可能です.
{
Info << "Defining my own kEpsilon model" << endl;
bound(k_, kMin_);
bound(epsilon_, epsilonMin_);
nut_ = Cmu_*sqr(k_)/epsilon_;
nut_.correctBoundaryConditions();
printCoeffs();
}
27
カスタマイズの手順
 その他必要なカスタマイズを行います.
 コンパイルして,動的リンクライブラリを作成します.
$ cd ../
$ wmake libso
User Guide [2] 75ページ
28
カスタマイズの手順
 次のような表示があれば,コンパイル成功です.
(省略)
/platforms/linux64GccDPDebug/lib/libmyIncompressibleRASModels.so
' is up to date.
以上が,乱流モデルのカスタマイズの手順です.
29
カスタマイズした乱流モデルの使用
 カスタマイズした乱流モデルの使用
 system/controlDict ファイルに次の行を加えます.
FoamFile
{
version 2.0;
format ascii;
class dictionary;
location "system";
object controlDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * //
libs ("libmyIncompressibleRASModels.so");
application simpleFoam;
startFrom latestTime;
30
カスタマイズした乱流モデルの使用
 設定ファイル RASProperties において,RASModel に mykEpsilon を指
定することでカスタマイズした乱流モデルを使用できます.
 RASModel に適当な名前を指定して
ソルバーを実行してみると,
新しいモデルがリストに
加わっているのが確認できます.
--> FOAM FATAL ERROR:
Unknown RASModel type hogehoge
Valid RASModel types:
19
(
LRR
LamBremhorstKE
LaunderGibsonRSTM
LaunderSharmaKE
LienCubicKE
LienCubicKELowRe
LienLeschzinerLowRe
NonlinearKEShih
RNGkEpsilon
SpalartAllmaras
kEpsilon
kOmega
kOmegaSST
kkLOmega
laminar
mykEpsilon
qZeta
realizableKE
v2f
)
31
Chapter 4. RANS モデル
Launder-Sharma low-Re k-𝜀 モデル
32
支配方程式
𝜕𝑘
𝜕𝑡
+
𝜕 𝑢𝑗 𝑘
𝜕𝑥𝑗
−
𝜕
𝜕𝑥𝑗
𝜈 + 𝜈𝑡
𝜕𝑘
𝜕𝑥𝑗
= 𝑃𝑘 − 𝜀 − 𝐷
𝜕𝜀
𝜕𝑡
+
𝜕 𝑢𝑗 𝜀
𝜕𝑥𝑗
−
𝜕
𝜕𝑥𝑗
𝜈 +
𝜈𝑡
𝜎𝜀
𝜕𝜀
𝜕𝑥𝑗
= 𝑐1 𝑓1 𝑃𝑘
𝜀
𝑘
− 𝑐2 𝑓2
𝜀2
𝑘
+ 𝐸
ここで
𝜈𝑡 = 𝑐 𝜇 𝑓𝜇
𝑘2
𝜀
𝑃𝑘 = 𝜈𝑡
𝜕𝑢𝑖
𝜕𝑥𝑗
+
𝜕𝑢𝑗
𝜕𝑥𝑖
𝜕𝑢𝑖
𝜕𝑥𝑗
, 𝐷 = 2𝜈
𝜕 𝑘
𝜕𝑥𝑗
2
, 𝐸 = 2𝜈𝜈𝑡
𝜕2 𝑢 𝑘
𝜕𝑥𝑖 𝜕𝑥𝑗
2
𝑓𝜇 = exp
−3.4
1 +
𝑅𝑒𝑡
50
2 , 𝑓1 = 1, 𝑎𝑓2 = 1 − 0.3exp −𝑅𝑒𝑡
2
, 𝑅𝑒𝑡 =
𝑘2
𝜈𝜀
渦粘性係数
Damping
functions
𝜀 = 𝜀 − 𝐷
33
モデル定数
モデル定数 OpenFOAMの表記 デフォルト値
𝑐 𝜇 Cmu 0.09
𝑐1 C1 1.44
𝑐2 C2 1.92
σ 𝜀 sigmaEps 1.3
34
モデルに関して
 通常のエネルギー散逸率 𝜀 の代わりに,𝜀 についての方程式を解きます.
𝐷 の壁面での値が,𝜀 の壁面での値に等しいので,変数 𝜀 = 𝜀 − 𝐷 の壁面で
の値は,𝜀 = 0 となり,壁面上の境界条件が取り扱いやすくなります.
 高 Re 型のモデルには無い項 𝐸 が追加されている理由
Its inclusion is simply due to the fact that without it the peak level of
turbulence kinetic energy at y+ ≈ 20 did not accord with experiment.
Several other forms were tried including choosing f1 to be a function
of Reynolds number. The form quoted is however, the only one which
generated the desired profile of k near the wall.
これによると,
壁近傍での乱流エネルギー k の分布が実験と合うように,導入されている項
のようです.
文献 [4]
35
モデルに関して
 Damping 関数の分布
拡大
36
OpenFOAM の実装|𝑘 の輸送方程式
𝜕𝑘
𝜕𝑡
+
𝜕 𝑢𝑗 𝑘
𝜕𝑥𝑗
−
𝜕
𝜕𝑥𝑗
𝜈 + 𝜈𝑡
𝜕𝑘
𝜕𝑥𝑗
= 𝑃𝑘 − 𝜀 − 𝐷
数式 OpenFOAM
𝜕𝑘
𝜕𝑡
fvm::ddt(k_)
𝜕 𝑢𝑗 𝑘
𝜕𝑥𝑗
fvm::div(phi_, k_)
−
𝜕
𝜕𝑥𝑗
𝜈 + 𝜈𝑡
𝜕𝑘
𝜕𝑥𝑗
- fvm::laplacian(DkEff(), k_)
𝑃𝑘 G
−𝜀 − 𝐷 - fvm::Sp((epsilonTilda_ + D)/k_, k_)
37
OpenFOAM の実装|𝜀 の輸送方程式
𝜕𝜀
𝜕𝑡
+
𝜕 𝑢𝑗 𝜀
𝜕𝑥𝑗
−
𝜕
𝜕𝑥𝑗
𝜈 +
𝜈𝑡
𝜎𝜀
𝜕𝜀
𝜕𝑥𝑗
= 𝑐1 𝑃𝑘
𝜀
𝑘
− 𝑐2 𝑓2
𝜀2
𝑘
+ 𝐸
数式 OpenFOAM
𝜕𝜀
𝜕𝑡
fvm::ddt(epsilonTilda_)
𝜕 𝑢𝑗 𝜀
𝜕𝑥𝑗
fvm::div(phi_, epsilonTilda_)
−
𝜕
𝜕𝑥𝑗
𝜈 +
𝜈𝑡
𝜎𝜀
𝜕𝜀
𝜕𝑥𝑗
- fvm::laplacian(DepsilonEff(),
epsilonTilda_)
𝑐1 𝑃𝑘
𝜀
𝑘
C1_*G*epsilonTilda_/k_
−𝑐2 𝑓2
𝜀2
𝑘
- fvm::Sp(C2_*f2()*epsilonTilda_/k_,
epsilonTilda_)
𝐸 E
38
OpenFOAM の実装|乱流変数の輸送方程式
 前の2ページの離散化を注意深く見ると,右辺の項で,fvm::Sp が使われて
いる項といない項があるのが分かります.
• 符号がマイナスの項 fvm::Sp を使用している
• 符号がプラスの項 fvm::Sp を使用していない
 今考えている方程式では,右辺でマイナス符号が付いている項を左辺に移項
すると係数行列の対角成分を大きくする効果があるので,陰的に扱うために,
fvm::Sp を使用しています.
 連立方程式を反復法で解く場合,係数行列の対角成分が大きい方が解きやす
いため,このような工夫を行っています.
 fvm::Sp の詳細は,こちらのスライドの 80 ページをご覧ください.
39
OpenFOAM の実装|Damping functions
𝑓𝜇 = exp
−3.4
1 +
𝑅𝑒𝑡
50
2 , 𝑓2 = 1 − 0.3exp −𝑅𝑒𝑡
2
, 𝑅𝑒𝑡 =
𝑘2
𝜈𝜀
LaunderSharmaKE.C
40
OpenFOAM の実装|乱流エネルギーの生産率の計算
𝐺 = 2𝜈𝑡
1
2
𝜕𝑢𝑖
𝜕𝑥𝑗
+
𝜕𝑢𝑗
𝜕𝑥𝑖
2
=
𝜈𝑡
2
𝜕𝑢𝑖
𝜕𝑥𝑗
𝜕𝑢𝑖
𝜕𝑥𝑗
+
𝜕𝑢𝑗
𝜕𝑥𝑖
𝜕𝑢𝑗
𝜕𝑥𝑖
+ 2
𝜕𝑢𝑖
𝜕𝑥𝑗
𝜕𝑢𝑗
𝜕𝑥𝑖
= 𝜈𝑡
𝜕𝑢𝑖
𝜕𝑥𝑗
+
𝜕𝑢𝑗
𝜕𝑥𝑖
𝜕𝑢𝑖
𝜕𝑥𝑗
= 𝑃𝑘
乱流エネルギーの生産率の表現
LaunderSharmaKE.C
41
OpenFOAM の実装|D 項と E 項の計算
𝐷 = 2𝜈
𝜕 𝑘
𝜕𝑥𝑗
2
, 𝐸 = 2𝜈𝜈𝑡
𝜕2
𝑢 𝑘
𝜕𝑥𝑖 𝜕𝑥𝑗
2
LaunderSharmaKE.C
 E 項は,各 𝑘 = 0,1,2 について,次のヘッセ行列の magSqr の和を計算して
います(magSqrGradGrad,次ページ).
𝛻 𝛻𝑢 𝑘 =
𝜕2 𝑢 𝑘
𝜕𝑥0 𝜕𝑥0
𝜕2 𝑢 𝑘
𝜕𝑥0 𝜕𝑥1
𝜕2 𝑢 𝑘
𝜕𝑥0 𝜕𝑥2
𝜕2 𝑢 𝑘
𝜕𝑥1 𝜕𝑥0
𝜕2 𝑢 𝑘
𝜕𝑥1 𝜕𝑥1
𝜕2 𝑢 𝑘
𝜕𝑥1 𝜕𝑥2
𝜕2 𝑢 𝑘
𝜕𝑥2 𝜕𝑥0
𝜕2 𝑢 𝑘
𝜕𝑥2 𝜕𝑥1
𝜕2 𝑢 𝑘
𝜕𝑥2 𝜕𝑥2
42
OpenFOAM の実装|magSqrGradGrad
fvcMagSqrGradGrad.C
43
Turbulent Flat Plate|流速分布
𝑢+ =
𝑢
𝑢 𝜏
𝑦+ =
𝑦𝑢 𝜏
𝜈
 Turbulent Flat Plate [5] で検証
Spalding 則については
こちらのスライドの 23 ページ
44
Turbulent Flat Plate|𝑘+
分布
𝑘+ =
𝑘
𝑢 𝜏
2
45
Turbulent Flat Plate|𝜀+
分布
𝜀+ =
𝜀𝜈
𝑢 𝜏
4
46
𝜀+
分布に関して補足
 前ページの図を見ると,対数則領域において,おおよそ次の関係が成り立っ
ているのが分かります.
𝜀+ =
𝜀𝜈
𝑢 𝜏
4
=
1
𝜅𝑦+
 これは次式のように変形できます.
𝜀 =
𝑢 𝜏
3
𝜅𝑦
 この式に, 𝑢 𝜏 = 𝐶𝜇
1 4
𝑘 という関係式を代入すれば,壁関数を使用した場合
の境界条件 (epsilonWallFunction) で使用している関係式が得られます.
𝜀 𝑃 =
𝐶𝜇
3 4
𝑘 𝑃
3 2
𝜅𝑦 𝑃
47
Turbulent Flat Plate|k 方程式の項のバランス
𝜕𝑘
𝜕𝑡
+
𝜕 𝑢𝑗 𝑘
𝜕𝑥𝑗
−
𝜕
𝜕𝑥𝑗
𝜈 + 𝜈𝑡
𝜕𝑘
𝜕𝑥𝑗
= 𝑃𝑘 − 𝜀 + 𝐷
Production (生成)
Dissipation (散逸)
対数則領域では,乱流エネルギーの
生成と散逸のバランスが取れています.
 43 ページの図は,下記の gnuplot 設定ファイルを使用して作成しています.
 この設定ファイルを,Uprofile.gp 等の名前で保存して,𝑦+
と𝑢+
の
計算結果ファイル data.txt を用意して,次のコマンドを実行します.
gnuplot> load “Uprofile.gp"
48
付録|gnuplot の設定ファイル
set terminal pngcairo enhanced size 800,600
set output "Uprofile.png"
set title "Turbulent Flat Plate - Velocity Profile"
set logscale x
set mxtics 10
set format x "10^{%T}"
set grid xtics mxtics ytics
set xlabel "y+"
set ylabel "u+"
set key top left
set parametric
# u+ range
set trange [0:25]
# Spaldings law
k=0.41
E=9.8
f(t) = t + (exp(k*t) - 1 - k*t*(1 + 0.5*k*t) - 1/6*(k*t)**3)/E
set style line 1 lc rgb '#8b1a0e' pt 1 ps 1 lt 1 lw 2 # red
set style line 2 lc rgb '#0072bd' pt 6 ps 1.5 lt 1 lw 2 # blue
plot f(t),t title "Spalding" with lines ls 1,¥
"data.txt" title "OpenFOAM" with points ls 2
49
参考資料
[1] http://www.tfd.chalmers.se/~hani/kurser/OS_CFD/implementTurbulenceModel.pdf
[2] http://foam.sourceforge.net/docs/Guides-a4/UserGuide.pdf
[3] https://www.youtube.com/watch?v=Eu_4ppppQmw
[4] Jones, W., and Launder, B. The prediction of laminarization with a two-equationmodel of
turbulence. Int. J. HeatMass Transfer 15 (1972), 301–314.
[5] http://www.grc.nasa.gov/WWW/wind/valid/fpturb/fpturb.html
50
Have
fun!

Turbulence Models in OpenFOAM

  • 1.
  • 2.
  • 3.
  • 4.
    4 乱流モデルのソースコードのディレクトリ  非圧縮性流れ計算用の乱流モデル: $FOAM_SRC/turbulenceModels/incompressible • RASディレクトリ Reynolds-averaged Navier-Stokes (RANS) の各モデルのクラスの ソースファイル (~.C) とヘッダファイル (~.H) が格納されています. • LES ディレクトリ Large eddy simulation (LES) の各モデルのクラスの ソースファイルとヘッダファイルが格納されています.
  • 5.
     圧縮性流れ計算用の乱流モデル: $FOAM_SRC/turbulenceModels/compressible • RASディレクトリ Reynolds-averaged Navier-Stokes (RANS) の各モデルのクラスの ソースファイル (~.C) とヘッダファイル (~.H) が格納されています. • LES ディレクトリ Large eddy simulation (LES) の各モデルのクラスの ソースファイルとヘッダファイルが格納されています. 5 乱流モデルのソースコードのディレクトリ
  • 6.
    6 使用可能な乱流モデル  ソルバーにより,使用できる乱流モデルが異なります. • RANSモデルのみ使用可能なソルバー • RANS モデルに加えて,LES モデルも使用可能なソルバー simpleFoam, SRFSimpleFoam, boundaryFoam, porousSimpleFoam, buoyantSimpleFoam, buoyantBoussinesqSimpleFoam, buoyantBoussinesqPimpleFoam, and other solvers pimpleFoam, pimpleDyMFoam, SRFPimpleFoam, pisoFoam, buoyantPimpleFoam, chtMultiRegionFoam, chtMultiRegionSimpleFoam, and other solvers
  • 7.
    7 使用可能な乱流モデル  ソルバーがどちらのタイプかは,ほとんどの場合, createFields.H ファイルの以下の記述で確認できます. •RANS モデルのみ使用可能なソルバー • RANS モデルに加えて,LES モデルも使用可能なソルバー autoPtr<incompressible::turbulenceModel> turbulence ( incompressible::turbulenceModel::New(U, phi, laminarTransport) ); autoPtr<incompressible::RASModel> turbulence ( incompressible::RASModel::New(U, phi, laminarTransport) );
  • 8.
    8 乱流モデルの設定ファイル  2つのタイプのソルバーでは,使用する乱流モデルの指定に必要な 設定ファイルが異なります. • RANSモデルのみ使用可能なソルバーの場合 - constant/RASProperties のみ必要 • RANS モデルに加えて,LES モデルも使用可能なソルバーの場合 - constant/turbulenceProperties RANS 計算(RASModel),LES 計算(LESModel),層流計算(laminar) のどの計算を行うのかをこのファイルで指定します. 加えて - constant/LESProperties (LES 計算を行う場合に必要) - constant/RASProperties (RANS 計算を行う場合に必要) 層流計算の場合には,constant/turbulenceProperties のみ必要です.
  • 9.
    9 乱流モデルの設定ファイル:turbulenceProperties /*--------------------------------*- C++ -*----------------------------------*¥ |========= | | | ¥¥ / F ield | OpenFOAM: The Open Source CFD Toolbox | | ¥¥ / O peration | Version: 2.3.0 | | ¥¥ / A nd | Web: www.OpenFOAM.org | | ¥¥/ M anipulation | | ¥*---------------------------------------------------------------------------*/ FoamFile { version 2.0; format ascii; class dictionary; location "constant"; object turbulenceProperties; } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // simulationType RASModel; // ************************************************************************* //  simulationType RASModel  simulationType LESModel  simulationType laminar : RANS 計算の場合 : LES 計算の場合 : 層流計算の場合
  • 10.
    10 乱流モデルの設定ファイル:RASProperties /*--------------------------------*- C++ -*----------------------------------*¥ |========= | | | ¥¥ / F ield | OpenFOAM: The Open Source CFD Toolbox | | ¥¥ / O peration | Version: 2.3.0 | | ¥¥ / A nd | Web: www.OpenFOAM.org | | ¥¥/ M anipulation | | ¥*---------------------------------------------------------------------------*/ FoamFile { version 2.0; format ascii; class dictionary; location "constant"; object RASProperties; } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // RASModel kEpsilon; turbulence on; printCoeffs on; // ************************************************************************* // • RASModel: 計算に使用する RANS モデルを指定 • turbulence: 乱流計算 (on) と層流計算 (off) の 切り替え • printCoeffs: ソルバー開始時にモデル定数を ターミナルへ標準出力するか否かのコントロール
  • 11.
    /*--------------------------------*- C++ -*----------------------------------*¥ |========= | | | ¥¥ / F ield | OpenFOAM: The Open Source CFD Toolbox | | ¥¥ / O peration | Version: 2.3.0 | | ¥¥ / A nd | Web: www.OpenFOAM.org | | ¥¥/ M anipulation | | ¥*---------------------------------------------------------------------------*/ FoamFile { version 2.0; format ascii; class dictionary; location "constant"; object RASProperties; } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // RASModel hogehoge; turbulence on; printCoeffs on; // ************************************************************************* // 11 RANS モデルのリストの表示  RASModel に適当な名前を指定して,ソルバーを実行すると, 使用可能な RANS モデルのリストを表示してくれます. 次のページに続きます.
  • 12.
    12 RANS モデルのリストの表示 --> FOAMFATAL ERROR: Unknown RASModel type hogehoge Valid RASModel types: 18 ( LRR LamBremhorstKE LaunderGibsonRSTM LaunderSharmaKE LienCubicKE LienCubicKELowRe LienLeschzinerLowRe NonlinearKEShih RNGkEpsilon SpalartAllmaras kEpsilon kOmega kOmegaSST kkLOmega laminar qZeta realizableKE v2f ) 例えば,simpleFoam の場合, 非圧縮流れ計算用の RANS モデル が 18種類 選択可能であることが分かります. laminar は,層流計算用なので, 実質 17 種類のモデルです.
  • 13.
    13 モデル定数  それぞれの乱流モデルには,モデル定数が定義されています.  例えば,非圧縮性流れ計算用の標準 k-ε モデル (kEpsilon) の場合  ソースコードにデフォルト値が定義されています: $FOAM_SRC/turbulenceModels/incompressible/RAS/kEpsilon 𝑅 𝑘 = 𝑣𝑗 𝜕𝑘 𝜕𝑥𝑗 − 𝜕 𝜕𝑥𝑗 𝜈 + 𝜈𝑡 𝜎 𝑘 𝜕𝑘 𝜕𝑥𝑗 − 𝑃𝑘 + 𝜀 = 0 𝑅 𝜀 = 𝑣𝑗 𝜕𝜀 𝜕𝑥𝑗 − 𝜕 𝜕𝑥𝑗 𝜈 + 𝜈𝑡 𝜎𝜀 𝜕𝜀 𝜕𝑥𝑗 − 𝑐1 𝑃𝑘 𝜀 𝑘 + 𝑐2 𝜀2 𝑘 = 0 𝜈𝑡 = 𝑐 𝜇 𝑘2 𝜀 :OpenFOAMでの変数名 C1 C2Cmu sigmaEps
  • 14.
    14 モデル定数の確認  設定ファイル RASPropertiesにおいて,printCoeffs の設定を on にする ことで,ソルバー実行時にモデル定数値を標準出力できます. Create time Create mesh for time = 0 Reading field p Reading field U Reading/calculating face flux field phi Selecting incompressible transport model Newtonian Selecting RAS turbulence model kEpsilon kEpsilonCoeffs { Cmu 0.09; C1 1.44; C2 1.92; sigmaEps 1.4; } No finite volume options present
  • 15.
    15 モデル定数の編集  モデル定数をデフォルト値から変更したい場合 1. 前ページのようにデフォルト値を表示させて、 2.これを RASProperties ファイルにコピー & ペーストして, 3. デフォルト値から変更したい変数の値を編集 FoamFile { version 2.0; format ascii; class dictionary; location "constant"; object RASProperties; } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // RASModel kEpsilon; turbulence on; printCoeffs on; kEpsilonCoeffs { Cmu 0.09; C1 1.44; C2 1.92; sigmaEps 1.4; } // ************************************************************************* // デフォルト値は、 標準的な値が設定されているので 変更が必要な機会は あまり多くないかもしれません.
  • 16.
  • 17.
    17 乱流モデルのクラスの関係 /*---------------------------------------------------------------------------*¥ Class kEpsilon Declaration ¥*---------------------------------------------------------------------------*/ classkEpsilon : public RASModel { protected: // Protected data // Model coefficients dimensionedScalar Cmu_; dimensionedScalar C1_; dimensionedScalar C2_; dimensionedScalar sigmaEps_; 派生クラス名 基底クラス名  kEpsilon クラスは,RASModel クラスの派生クラスです.  kOmega クラスなど,その他の RANS モデルのクラスも RASModel の派生クラスです. RASModel kEpsilon 親クラス 子クラス 継承
  • 18.
    18 kEpsilon クラスのメンバ  kEpsilonクラスのメンバ • データメンバ - モデル定数 (Cmu_,C1_,C2_,sigmaEps_) - 乱流変数 (k_,epsilon_,nut_) - Runtime タイプ名 • コンストラクタ,デストラクタ • メンバ関数 - DkEff(),DepsilonEff(): 乱流変数の拡散係数 - R(): レイノルズ応力テンソル - divDevReff(volVectorField& U): 拡散項の離散化 - correct(): 乱流変数 𝑘 と 𝜀 の輸送方程式を解いて, 渦粘性係数 𝜈𝑡 を計算 など
  • 19.
    19 メンバ関数: correct()  RANSモデルにより,渦粘性係数の計算方法は異なります.  turbulenceModel クラスは,correct() を純粋仮想関数として定義した 抽象クラスです. RASModel kEpsilon 継承 turbulence Model 継承 virtual void correct() = 0; void turbulenceModel::correct() { transportModel_.correct(); if (mesh_.changing()) { y_.correct(); } }
  • 20.
    20 メンバ関数: correct()  RANSモデルにより,渦粘性係数の計算方法は異なります.  RASModel クラスでも,correct() を仮想関数として定義しています. virtual void correct(); void RASModel::correct() { turbulenceModel::correct(); } RASModel kEpsilon 継承 turbulence Model 継承
  • 21.
    21 メンバ関数: correct()  RANSモデルにより,渦粘性係数の計算方法は異なります.  基底クラスの仮想関数 correct() を再定義することにより, RANS モデルの渦粘性計算をカスタマイズしています. void kEpsilon::correct() { RASModel::correct(); if (!turbulence_) { return; } volScalarField G(GName(), nut_*2*magSqr(symm(fvc::grad(U_)))); // Update epsilon and G at the wall epsilon_.boundaryField().updateCoeffs(); // Dissipation equation tmp<fvScalarMatrix> epsEqn ( fvm::ddt(epsilon_) + fvm::div(phi_, epsilon_) - fvm::laplacian(DepsilonEff(), epsilon_) == C1_*G*epsilon_/k_ - fvm::Sp(C2_*epsilon_/k_, epsilon_) ); epsEqn().relax(); epsEqn().boundaryManipulate(epsilon_.boundaryField()); solve(epsEqn); bound(epsilon_, epsilonMin_); (以下省略) RASModel kEpsilon 継承 turbulence Model 継承
  • 22.
  • 23.
    23 カスタマイズの手順  Chalmers 大学のHåkan Nilsson 先生の資料 [1] の手順でカスタマイズが 可能です.  ここでは,この資料の手順にしたがって kEpsilon モデルのカスタマイズを 行ってみます.  kEpsilon モデルのソースコードをコピーします. $ cd $WM_PROJECT_DIR $ cp -r --parents src/turbulenceModels/incompressible/RAS/kEpsilon ¥ > $WM_PROJECT_USER_DIR $ cd $WM_PROJECT_USER_DIR/src/turbulenceModels/incompressible/RAS $ mv kEpsilon mykEpsilon 補足説明 • 入力コマンドが長くなる場合には,バックスラッシュ『¥』で改行を行い, コマンド入力を複数行に分けることができます. • WM_PROJECT_USER_DIR などの OpenFOAM の環境変数は, etc/bashrc ファイルで定義されています.
  • 24.
    24 カスタマイズの手順  $FOAM_SRC/turbulenceModels/incompressible/RAS/Make を参考にし て,ビルドに必要なMake/files と Make/options ファイルを準備します.  Make ディレクトリを作成します. $ mkdir Make  Make ディレクトリの下に files という名前のファイルを作成します.この ファイルに,次の2行を記述して保存します. mykEpsilon/mykEpsilon.C LIB = $(FOAM_USER_LIBBIN)/libmyIncompressibleRASModels
  • 25.
    25 カスタマイズの手順  Make ディレクトリの下にoptions という名前のファイルを作成します. このファイルには,以下のように記述します. EXE_INC = ¥ -I$(LIB_SRC)/turbulenceModels ¥ -I$(LIB_SRC)/transportModels ¥ -I$(LIB_SRC)/finiteVolume/lnInclude ¥ -I$(LIB_SRC)/meshTools/lnInclude ¥ -I$(LIB_SRC)/turbulenceModels/incompressible/RAS/lnInclude LIB_LIBS = ¥ -lincompressibleTurbulenceModel ¥ -lfiniteVolume ¥ -lmeshTools  ソースコードのファイル名を Make/files の記述に合わせて修正します. $ cd mykEpsilon $ mv kEpsilon.C mykEpsilon.C $ mv kEpsilon.H mykEpsilon.H $ rm kEpsilon.dep
  • 26.
    26 カスタマイズの手順  ソースコード内のクラス名を修正します. $ sed-i -e "s/kEpsilon/mykEpsilon/g" mykEpsilon.C $ sed -i -e "s/kEpsilon/mykEpsilon/g" mykEpsilon.H  (オプション) カスタマイズしたモデルを使用している目印を作成します. mysimpleFoam.C ファイルに次の1行を加えます. 補足説明 • sed コマンドの –i オプションで,対象ファイルの上書き編集が可能です. { Info << "Defining my own kEpsilon model" << endl; bound(k_, kMin_); bound(epsilon_, epsilonMin_); nut_ = Cmu_*sqr(k_)/epsilon_; nut_.correctBoundaryConditions(); printCoeffs(); }
  • 27.
  • 28.
  • 29.
    29 カスタマイズした乱流モデルの使用  カスタマイズした乱流モデルの使用  system/controlDictファイルに次の行を加えます. FoamFile { version 2.0; format ascii; class dictionary; location "system"; object controlDict; } // * * * * * * * * * * * * * * * * * * * * * * * * * * // libs ("libmyIncompressibleRASModels.so"); application simpleFoam; startFrom latestTime;
  • 30.
    30 カスタマイズした乱流モデルの使用  設定ファイル RASPropertiesにおいて,RASModel に mykEpsilon を指 定することでカスタマイズした乱流モデルを使用できます.  RASModel に適当な名前を指定して ソルバーを実行してみると, 新しいモデルがリストに 加わっているのが確認できます. --> FOAM FATAL ERROR: Unknown RASModel type hogehoge Valid RASModel types: 19 ( LRR LamBremhorstKE LaunderGibsonRSTM LaunderSharmaKE LienCubicKE LienCubicKELowRe LienLeschzinerLowRe NonlinearKEShih RNGkEpsilon SpalartAllmaras kEpsilon kOmega kOmegaSST kkLOmega laminar mykEpsilon qZeta realizableKE v2f )
  • 31.
    31 Chapter 4. RANSモデル Launder-Sharma low-Re k-𝜀 モデル
  • 32.
    32 支配方程式 𝜕𝑘 𝜕𝑡 + 𝜕 𝑢𝑗 𝑘 𝜕𝑥𝑗 − 𝜕 𝜕𝑥𝑗 𝜈+ 𝜈𝑡 𝜕𝑘 𝜕𝑥𝑗 = 𝑃𝑘 − 𝜀 − 𝐷 𝜕𝜀 𝜕𝑡 + 𝜕 𝑢𝑗 𝜀 𝜕𝑥𝑗 − 𝜕 𝜕𝑥𝑗 𝜈 + 𝜈𝑡 𝜎𝜀 𝜕𝜀 𝜕𝑥𝑗 = 𝑐1 𝑓1 𝑃𝑘 𝜀 𝑘 − 𝑐2 𝑓2 𝜀2 𝑘 + 𝐸 ここで 𝜈𝑡 = 𝑐 𝜇 𝑓𝜇 𝑘2 𝜀 𝑃𝑘 = 𝜈𝑡 𝜕𝑢𝑖 𝜕𝑥𝑗 + 𝜕𝑢𝑗 𝜕𝑥𝑖 𝜕𝑢𝑖 𝜕𝑥𝑗 , 𝐷 = 2𝜈 𝜕 𝑘 𝜕𝑥𝑗 2 , 𝐸 = 2𝜈𝜈𝑡 𝜕2 𝑢 𝑘 𝜕𝑥𝑖 𝜕𝑥𝑗 2 𝑓𝜇 = exp −3.4 1 + 𝑅𝑒𝑡 50 2 , 𝑓1 = 1, 𝑎𝑓2 = 1 − 0.3exp −𝑅𝑒𝑡 2 , 𝑅𝑒𝑡 = 𝑘2 𝜈𝜀 渦粘性係数 Damping functions 𝜀 = 𝜀 − 𝐷
  • 33.
    33 モデル定数 モデル定数 OpenFOAMの表記 デフォルト値 𝑐𝜇 Cmu 0.09 𝑐1 C1 1.44 𝑐2 C2 1.92 σ 𝜀 sigmaEps 1.3
  • 34.
    34 モデルに関して  通常のエネルギー散逸率 𝜀の代わりに,𝜀 についての方程式を解きます. 𝐷 の壁面での値が,𝜀 の壁面での値に等しいので,変数 𝜀 = 𝜀 − 𝐷 の壁面で の値は,𝜀 = 0 となり,壁面上の境界条件が取り扱いやすくなります.  高 Re 型のモデルには無い項 𝐸 が追加されている理由 Its inclusion is simply due to the fact that without it the peak level of turbulence kinetic energy at y+ ≈ 20 did not accord with experiment. Several other forms were tried including choosing f1 to be a function of Reynolds number. The form quoted is however, the only one which generated the desired profile of k near the wall. これによると, 壁近傍での乱流エネルギー k の分布が実験と合うように,導入されている項 のようです. 文献 [4]
  • 35.
  • 36.
    36 OpenFOAM の実装|𝑘 の輸送方程式 𝜕𝑘 𝜕𝑡 + 𝜕𝑢𝑗 𝑘 𝜕𝑥𝑗 − 𝜕 𝜕𝑥𝑗 𝜈 + 𝜈𝑡 𝜕𝑘 𝜕𝑥𝑗 = 𝑃𝑘 − 𝜀 − 𝐷 数式 OpenFOAM 𝜕𝑘 𝜕𝑡 fvm::ddt(k_) 𝜕 𝑢𝑗 𝑘 𝜕𝑥𝑗 fvm::div(phi_, k_) − 𝜕 𝜕𝑥𝑗 𝜈 + 𝜈𝑡 𝜕𝑘 𝜕𝑥𝑗 - fvm::laplacian(DkEff(), k_) 𝑃𝑘 G −𝜀 − 𝐷 - fvm::Sp((epsilonTilda_ + D)/k_, k_)
  • 37.
    37 OpenFOAM の実装|𝜀 の輸送方程式 𝜕𝜀 𝜕𝑡 + 𝜕𝑢𝑗 𝜀 𝜕𝑥𝑗 − 𝜕 𝜕𝑥𝑗 𝜈 + 𝜈𝑡 𝜎𝜀 𝜕𝜀 𝜕𝑥𝑗 = 𝑐1 𝑃𝑘 𝜀 𝑘 − 𝑐2 𝑓2 𝜀2 𝑘 + 𝐸 数式 OpenFOAM 𝜕𝜀 𝜕𝑡 fvm::ddt(epsilonTilda_) 𝜕 𝑢𝑗 𝜀 𝜕𝑥𝑗 fvm::div(phi_, epsilonTilda_) − 𝜕 𝜕𝑥𝑗 𝜈 + 𝜈𝑡 𝜎𝜀 𝜕𝜀 𝜕𝑥𝑗 - fvm::laplacian(DepsilonEff(), epsilonTilda_) 𝑐1 𝑃𝑘 𝜀 𝑘 C1_*G*epsilonTilda_/k_ −𝑐2 𝑓2 𝜀2 𝑘 - fvm::Sp(C2_*f2()*epsilonTilda_/k_, epsilonTilda_) 𝐸 E
  • 38.
    38 OpenFOAM の実装|乱流変数の輸送方程式  前の2ページの離散化を注意深く見ると,右辺の項で,fvm::Spが使われて いる項といない項があるのが分かります. • 符号がマイナスの項 fvm::Sp を使用している • 符号がプラスの項 fvm::Sp を使用していない  今考えている方程式では,右辺でマイナス符号が付いている項を左辺に移項 すると係数行列の対角成分を大きくする効果があるので,陰的に扱うために, fvm::Sp を使用しています.  連立方程式を反復法で解く場合,係数行列の対角成分が大きい方が解きやす いため,このような工夫を行っています.  fvm::Sp の詳細は,こちらのスライドの 80 ページをご覧ください.
  • 39.
    39 OpenFOAM の実装|Damping functions 𝑓𝜇= exp −3.4 1 + 𝑅𝑒𝑡 50 2 , 𝑓2 = 1 − 0.3exp −𝑅𝑒𝑡 2 , 𝑅𝑒𝑡 = 𝑘2 𝜈𝜀 LaunderSharmaKE.C
  • 40.
    40 OpenFOAM の実装|乱流エネルギーの生産率の計算 𝐺 =2𝜈𝑡 1 2 𝜕𝑢𝑖 𝜕𝑥𝑗 + 𝜕𝑢𝑗 𝜕𝑥𝑖 2 = 𝜈𝑡 2 𝜕𝑢𝑖 𝜕𝑥𝑗 𝜕𝑢𝑖 𝜕𝑥𝑗 + 𝜕𝑢𝑗 𝜕𝑥𝑖 𝜕𝑢𝑗 𝜕𝑥𝑖 + 2 𝜕𝑢𝑖 𝜕𝑥𝑗 𝜕𝑢𝑗 𝜕𝑥𝑖 = 𝜈𝑡 𝜕𝑢𝑖 𝜕𝑥𝑗 + 𝜕𝑢𝑗 𝜕𝑥𝑖 𝜕𝑢𝑖 𝜕𝑥𝑗 = 𝑃𝑘 乱流エネルギーの生産率の表現 LaunderSharmaKE.C
  • 41.
    41 OpenFOAM の実装|D 項とE 項の計算 𝐷 = 2𝜈 𝜕 𝑘 𝜕𝑥𝑗 2 , 𝐸 = 2𝜈𝜈𝑡 𝜕2 𝑢 𝑘 𝜕𝑥𝑖 𝜕𝑥𝑗 2 LaunderSharmaKE.C  E 項は,各 𝑘 = 0,1,2 について,次のヘッセ行列の magSqr の和を計算して います(magSqrGradGrad,次ページ). 𝛻 𝛻𝑢 𝑘 = 𝜕2 𝑢 𝑘 𝜕𝑥0 𝜕𝑥0 𝜕2 𝑢 𝑘 𝜕𝑥0 𝜕𝑥1 𝜕2 𝑢 𝑘 𝜕𝑥0 𝜕𝑥2 𝜕2 𝑢 𝑘 𝜕𝑥1 𝜕𝑥0 𝜕2 𝑢 𝑘 𝜕𝑥1 𝜕𝑥1 𝜕2 𝑢 𝑘 𝜕𝑥1 𝜕𝑥2 𝜕2 𝑢 𝑘 𝜕𝑥2 𝜕𝑥0 𝜕2 𝑢 𝑘 𝜕𝑥2 𝜕𝑥1 𝜕2 𝑢 𝑘 𝜕𝑥2 𝜕𝑥2
  • 42.
  • 43.
    43 Turbulent Flat Plate|流速分布 𝑢+= 𝑢 𝑢 𝜏 𝑦+ = 𝑦𝑢 𝜏 𝜈  Turbulent Flat Plate [5] で検証 Spalding 則については こちらのスライドの 23 ページ
  • 44.
  • 45.
  • 46.
    46 𝜀+ 分布に関して補足  前ページの図を見ると,対数則領域において,おおよそ次の関係が成り立っ ているのが分かります. 𝜀+ = 𝜀𝜈 𝑢𝜏 4 = 1 𝜅𝑦+  これは次式のように変形できます. 𝜀 = 𝑢 𝜏 3 𝜅𝑦  この式に, 𝑢 𝜏 = 𝐶𝜇 1 4 𝑘 という関係式を代入すれば,壁関数を使用した場合 の境界条件 (epsilonWallFunction) で使用している関係式が得られます. 𝜀 𝑃 = 𝐶𝜇 3 4 𝑘 𝑃 3 2 𝜅𝑦 𝑃
  • 47.
    47 Turbulent Flat Plate|k方程式の項のバランス 𝜕𝑘 𝜕𝑡 + 𝜕 𝑢𝑗 𝑘 𝜕𝑥𝑗 − 𝜕 𝜕𝑥𝑗 𝜈 + 𝜈𝑡 𝜕𝑘 𝜕𝑥𝑗 = 𝑃𝑘 − 𝜀 + 𝐷 Production (生成) Dissipation (散逸) 対数則領域では,乱流エネルギーの 生成と散逸のバランスが取れています.
  • 48.
     43 ページの図は,下記のgnuplot 設定ファイルを使用して作成しています.  この設定ファイルを,Uprofile.gp 等の名前で保存して,𝑦+ と𝑢+ の 計算結果ファイル data.txt を用意して,次のコマンドを実行します. gnuplot> load “Uprofile.gp" 48 付録|gnuplot の設定ファイル set terminal pngcairo enhanced size 800,600 set output "Uprofile.png" set title "Turbulent Flat Plate - Velocity Profile" set logscale x set mxtics 10 set format x "10^{%T}" set grid xtics mxtics ytics set xlabel "y+" set ylabel "u+" set key top left set parametric # u+ range set trange [0:25] # Spaldings law k=0.41 E=9.8 f(t) = t + (exp(k*t) - 1 - k*t*(1 + 0.5*k*t) - 1/6*(k*t)**3)/E set style line 1 lc rgb '#8b1a0e' pt 1 ps 1 lt 1 lw 2 # red set style line 2 lc rgb '#0072bd' pt 6 ps 1.5 lt 1 lw 2 # blue plot f(t),t title "Spalding" with lines ls 1,¥ "data.txt" title "OpenFOAM" with points ls 2
  • 49.
    49 参考資料 [1] http://www.tfd.chalmers.se/~hani/kurser/OS_CFD/implementTurbulenceModel.pdf [2] http://foam.sourceforge.net/docs/Guides-a4/UserGuide.pdf [3]https://www.youtube.com/watch?v=Eu_4ppppQmw [4] Jones, W., and Launder, B. The prediction of laminarization with a two-equationmodel of turbulence. Int. J. HeatMass Transfer 15 (1972), 301–314. [5] http://www.grc.nasa.gov/WWW/wind/valid/fpturb/fpturb.html
  • 50.