OpenFOAM v2006で正方形断面ダクトに発生するプラントルの第二種二次流れの計算を行う
計算に使ったファイルはGithubにアップしてある
≫mtkbirdman.com/OpenFOAM/
はじめに
矩形断面ダクトでは,レイノルズ応力の非等方性に起因して主流方向に垂直な断面に二次流が生じる
プラントルの第二種二次流れと呼ばれるこの流れは矩形部の角で特に顕著であり,角に向かう流れを生じる
前回の記事(≫【OpenFOAM v2006】低Re数型非線形RANSモデルの実装)で非等方性のRANSモデルを実装したので,正方形断面の第二種二次流れを計算してみようと思う
モデル作成
OpenFOAMに矩形ダクトのチュートリアルはないようなので,channel395をベースに側面をすべてwall
に変更したものを用いる
メッシュ作成
system/blockMeshDict
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: v1812 |
| \\ / A nd | Web: www.OpenFOAM.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
object blockMeshDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
scale 1;
vertices
(
(0 0 0)
(4 0 0)
(0 1 0)
(4 1 0)
(0 2 0)
(4 2 0)
(0 0 2)
(4 0 2)
(0 1 2)
(4 1 2)
(0 2 2)
(4 2 2)
(0 0 1)
(4 0 1)
(0 1 1)
(4 1 1)
(0 2 1)
(4 2 1)
);
blocks
(
hex (0 1 3 2 12 13 15 14) (60 36 36) simpleGrading (1 36 36)
hex (2 3 5 4 14 15 17 16) (60 36 36) simpleGrading (1 -36 36)
hex (12 13 15 14 6 7 9 8) (60 36 36) simpleGrading (1 36 -36)
hex (14 15 17 16 8 9 11 10) (60 36 36) simpleGrading (1 -36 -36)
);
edges
(
);
boundary
(
bottomWall
{
type wall;
faces ((0 1 13 12)(12 13 7 6));
}
topWall
{
type wall;
faces ((4 16 17 5)(16 10 11 17));
}
sideWalls
{
type wall;
faces ((0 1 3 2)(2 3 5 4)(6 7 9 8)(8 9 11 10));
}
inlet
{
type cyclic;
neighbourPatch outlet;
faces ((0 2 14 12)(2 4 16 14)(14 16 10 8)(12 14 8 6));
}
outlet
{
type cyclic;
neighbourPatch inlet;
faces ((1 3 15 13)(3 5 17 15)(15 17 11 9)(13 15 9 7));
}
);
mergePatchPairs
(
);
// ************************************************************************* //
適当にメッシュを切って適当にGradingをつけてみた
条件設定
主要なものだけ
ここにないものはGithubのコードを参照
≫mtkbirdman.com/OpenFOAM/duct395/
0/epsilon
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: v2006 |
| \\ / A nd | Website: www.openfoam.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class volScalarField;
object epsilon;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
dimensions [0 2 -3 0 0 0 0];
internalField uniform 1;
boundaryField
{
bottomWall
{
type epsilonLowReWallFunction;
value $internalField;
}
topWall
{
type epsilonLowReWallFunction;
value $internalField;
}
sideWalls
{
type epsilonLowReWallFunction;
value $internalField;
}
inlet
{
type cyclic;
}
outlet
{
type cyclic;
}
}
// ************************************************************************* //
epsilonLowReWallFunction
は自作の壁関数
≫【OpenFOAM v2006】低Re数型非線形RANSモデルの実装
0/k
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: v1812 |
| \\ / A nd | Web: www.OpenFOAM.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class volScalarField;
location "1";
object k;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
dimensions [0 2 -2 0 0 0 0];
internalField uniform 1;
boundaryField
{
bottomWall
{
type fixedValue;
value uniform 1e-32;
}
topWall
{
type fixedValue;
value uniform 1e-32;
}
sideWalls
{
type fixedValue;
value uniform 1e-32;
}
inlet
{
type cyclic;
}
outlet
{
type cyclic;
}
}
// ************************************************************************* //
壁面では滑りなし条件\(k=0\)だが,0割りを防ぐために小さい値を指定
0/nut
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: v1812 |
| \\ / A nd | Web: www.OpenFOAM.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class volScalarField;
location "1";
object nut;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
dimensions [0 2 -1 0 0 0 0];
internalField uniform 0;
boundaryField
{
bottomWall
{
type nutLowReWallFunction;
value uniform 0;
}
topWall
{
type nutLowReWallFunction;
value uniform 0;
}
sideWalls
{
type nutLowReWallFunction;
value uniform 0;
}
inlet
{
type cyclic;
}
outlet
{
type cyclic;
}
}
// ************************************************************************* //
組み込みのnutLowReWallFunctionを使用
constant/turbulenceProperties
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: v2006 |
| \\ / A nd | Website: www.openfoam.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2;
format ascii;
class dictionary;
location "constant";
object turbulenceProperties;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
simulationType RAS;
RAS
{
RASModel AJL2005;
//RASModel LamBremhorstKE;
turbulence on;
printCoeffs on;
}
// ************************************************************************* //
自作の非線形RANSモデルAJL2005と,比較として組み込みの低Re数型線形RANSモデルLamBremhorstKEを回してみる
system/controlDict
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: v1812 |
| \\ / A nd | Web: www.OpenFOAM.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
location "system";
object controlDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
application simpleFoam;
startFrom startTime;
startTime 0;
stopAt endTime;
endTime 5000;
deltaT 1;
writeControl timeStep;
writeInterval 5000;
purgeWrite 0;
writeFormat ascii;
writePrecision 6;
writeCompression off;
timeFormat general;
timePrecision 6;
runTimeModifiable true;
functions
{
#includeFunc residuals
#includeFunc "sample"
#includeFunc "turbulenceFields"
#includeFunc "wallShearStress"
}
libs
(
"libmyTurbulenceModels.so"
"libmyWallFunctions.so"
);
// ************************************************************************* //
ぶっちゃけ5000回も計算する必要ない.2000回くらいで十分
Allrun
#!/bin/sh
cd ${0%/*} || exit 1 # Run from this directory
. $WM_PROJECT_DIR/bin/tools/RunFunctions # Tutorial run functions
#------------------------------------------------------------------------------
runApplication blockMesh
runApplication decomposePar -cellDist
runParallel $(getApplication)
runApplication reconstructPar -latestTime
runApplication postChannel
exit
#------------------------------------------------------------------------------
計算実行
./Allrun
で計算を実行する
AJL2005の残差の推移はこんな感じ
2000回を超えたくらいで残差が収束していることがわかる
結果
paraViewで可視化した結果を示す
まずはAJL2005で計算した流れ場から
参考文献に書いてあるような角に向かう二次流れが発生している
次にLamBremhorstKEで計算した流れ場
線形モデルでは応力テンソルの非等方性を表現できないので二次流れは発生していない
まとめ
正方形断面ダクトの二次流れが計算できた
自分が作ったものでこういう事実を確認・検証できるのは面白い
コメント