初心者向けの計算事例「キャビティー流れシミュレーション」を説明します。
使用するソルバーはicoFoam(非圧縮性流体ソルバー)です。icoFoamはIncompressible(非圧縮性)とContinuous(連続体)の頭文字から省略した名前であり、層流・乱流の両方の計算が可能です。
本記事に説明するキャビティー流れシミュレーションは、二次元正方形キャビティ内の層流流れを計算するものであり、キャビティ内部に大きな渦が発生する典型的な例題です。
1.計算フォルダの作成
WSL2のUbuntuを立ち上げて、以下のコマンドを使って計算用フォルダを作成し、チュートリアルにあるデータをコピーします。
(「E:\OpenFOAM\v2312」は既存フォルダです。)
openfoam2312
mkdir /mnt/e/OpenFOAM/v2312/cavity
cd /mnt/e/OpenFOAM/v2312/cavity
cp -r $FOAM_TUTORIALS/incompressible/icoFoam/cavity/cavity/* ./
2.計算フォルダにある各ファイルの説明
計算フォルダに「0」「constant」「system」の3つのフォルダが入っています。
「0」:初期条件と境界条件を設定するファイル群
「constant」:物性などの定数値を設定するファイル群
「system」:メッシュ生成、計算スキーム、行列解法などを設定するファイル群
3.メッシュの生成・計算の実施
コマンド「blockMesh」を入力して、ブロック領域におけるメッシュを生成します。
コマンド「icoFoam」で計算を実施します。
4.計算結果の可視化
コマンド「touch cavity.foam」を使って、ParaViewによる可視化のためのファイルを作成します。
ParaViewを立ち上げ、流速ベクトルを表示します。
5.計算ファイルの説明
「0」「constant」「system」の3つのフォルダそれぞれを説明します。
5.1 「0」フォルダ 「p」
「0」フォルダの中にあるファイル「p」について説明します。
/*~*/ または // | コメント行。 |
FoamFile | ヘッダー。FoamFile以下の行が定義条件です。 |
p | 圧力(密度ρで割った圧力)。 |
dimensions | ファイルで定義する物理用の次元を設定する項目。左から、「kg(質量)」、「m(長さ)」、「s(時間)」、「K(熱力学温度)」、mol「物質量」、「A(電流)」、cd「光度」を表します。ここでのpは密度ρで割った圧力のため、次元がm2/s2となります。 |
internalField | 初期値を定義する項目。「uniform」は一様を示します。 |
boundaryField | 各境界面の境界条件を設定する項目。「zeroGradient」は勾配ゼロ条件(完全反射)、「empty」は境界面の法線方向の計算を実施しない条件(2次元計算)です。 |
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: v2312 |
| \\ / A nd | Website: www.openfoam.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class volScalarField;
object p;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
dimensions [0 2 -2 0 0 0 0];
internalField uniform 0;
boundaryField
{
movingWall
{
type zeroGradient;
}
fixedWalls
{
type zeroGradient;
}
frontAndBack
{
type empty;
}
}
// ************************************************************************* //
5.2 「0」フォルダ 「U」
U | 流速U。 |
dimensions | ファイルで定義する物理用の次元を設定する項目。ここでの流速Uの次元がm/sです。 |
internalField | 初期値を定義する項目。「uniform」は一様を示します。流速Uはベクトル型データですので、(X Y Z)の形式で指定します。 |
boundaryField | 各境界面の境界条件を設定する項目。「fixedValue」は値を直接指定すること、「noSlip」はすべりなし条件(速度ゼロ)、「empty」は境界面の法線方向の計算を実施しない条件(2次元計算)です。 |
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: v2312 |
| \\ / A nd | Website: www.openfoam.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class volVectorField;
object U;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
dimensions [0 1 -1 0 0 0 0];
internalField uniform (0 0 0);
boundaryField
{
movingWall
{
type fixedValue;
value uniform (1 0 0);
}
fixedWalls
{
type noSlip;
}
frontAndBack
{
type empty;
}
}
// ************************************************************************* //
5.3 「constant」フォルダ 「transportProperties」
transportProperties | 物性値に関するファイル。 |
nu | 動粘性係数(次元はm2/s)。 |
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: v2312 |
| \\ / A nd | Website: www.openfoam.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
object transportProperties;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
nu 0.01;
// ************************************************************************* //
5.4 「system」フォルダ 「blockMeshDict」
blockMeshDict | ブロック領域におけるメッシュを生成するコマンド「blockMesh」の定義ファイル。 |
scale | メッシュ全体の大きさをスケーリングする係数を指定する項目。デフォルトは1です。 |
vertices | blockMeshで作成するブロック領域の頂点を定義する項目。記述順に0から連番の数字がIDとして設定します。 |
blocks | ブロック領域を定義する項目。「hex」は6面体のメッシュを示し、左の( )はブロック領域を構成する頂点を定義します。中央の( )はX,Y,Z座標のブロック分割数です。「simpleGrading」は分割サイズの拡大率を示し、今回は(1 1 1)なので均等分割となります。 |
Edges | 直線以外の線をブロックに定義する場合に使用する項目。通常は使わない場合が多いです。 |
boundary | 境界面(名称、種類、面を構成する頂点番号)を定義する項目。面の頂点設定は、計算領域内部から見て右回り(計算領域外部から左回り)で定義します。 |
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: v2312 |
| \\ / A nd | Website: www.openfoam.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
object blockMeshDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
scale 0.1;
vertices
(
(0 0 0)
(1 0 0)
(1 1 0)
(0 1 0)
(0 0 0.1)
(1 0 0.1)
(1 1 0.1)
(0 1 0.1)
);
blocks
(
hex (0 1 2 3 4 5 6 7) (20 20 1) simpleGrading (1 1 1)
);
edges
(
);
boundary
(
movingWall
{
type wall;
faces
(
(3 7 6 2)
);
}
fixedWalls
{
type wall;
faces
(
(0 4 7 3)
(2 6 5 1)
(1 5 4 0)
);
}
frontAndBack
{
type empty;
faces
(
(0 3 2 1)
(4 5 6 7)
);
}
);
// ************************************************************************* //
5.5 「system」フォルダ 「controlDict」
controlDict | 計算時間、時間ステップ間隔、出力データの時間などを定義するファイル。 |
application | 計算ソルバーを指定する項目。 |
startFrom | 計算開始時間。「startTime」はstartTimeで設定した時間から計算を開始します。 |
startTime | 計算開始時間を設定する項目。通常は0から開始です。 |
stopAt | 計算終了時間。「endTime」はendTimeで設定した時間まで計算を実施します。 |
endTime | 計算終了時間を設定する項目。ここでは、定常計算を実施しているため、反復計算の回数を意味します。 |
deltaT | 計算ステップ間隔を設定する項目。ここでは、定常計算を実施しているため、stopAt/deltaT=0.5/0.005=100回の反復計算を意味します。 値が小さいほど精度は上がりますが、計算コストも高くなります。 |
writeControl | 出力データ間隔を設定する項目。「timeStep」は、「writeInterval」で定義される時間毎にデータを出力されます。ここでは、deltaT×writeInterval=0.005×20=0.1s毎に出力されます。 |
writeInterval | 出力データの間隔を設定する項目。 |
purgeWrite | 出力データを間引く間隔を設定する項目。 |
writeFormat | 出力データの様式をascii、binaryで選択する項目。 |
writePrecision | 出力データの精度を設定する項目。 |
writeCompression | 出力データの圧縮をon・offで設定する項目。 |
timeFormat | 時間の書式を設定する項目。通常はgeneralで良いです。 |
timePrecision | 時間の精度を設定する項目。 |
runTimeModifiable | 計算実行時にcontroiDictを読み直すかを設定する項目。通常はtrueで良いです。 |
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: v2312 |
| \\ / A nd | Website: www.openfoam.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
object controlDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
application icoFoam;
startFrom startTime;
startTime 0;
stopAt endTime;
endTime 0.5;
deltaT 0.005;
writeControl timeStep;
writeInterval 20;
purgeWrite 0;
writeFormat ascii;
writePrecision 6;
writeCompression off;
timeFormat general;
timePrecision 6;
runTimeModifiable true;
// ************************************************************************* //
5.6 「system」フォルダ 「decomposeParDict」
decomposeParDict | 並列計算を行う際の領域分割を定義するファイル。 今回の計算では使用していません。 |
numberOfSubdomains | 分割領域の総数を設定する項目。 |
method | 分割手法をhierarchicalに設定する項目。領域を繰り返して分割し、すべての領域のセル数が指定した最大セル数以下になるように分割される手法です。 |
coeffs | nは(x y z)の方向の分割数。 |
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: v2312 |
| \\ / A nd | Website: www.openfoam.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
object decomposeParDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
numberOfSubdomains 9;
method hierarchical;
coeffs
{
n (3 3 1);
}
// ************************************************************************* //
5.7 「system」フォルダ 「fvSchemes」
fvSchemes | 支配方程式の離散化スキーム(手法)を定義するファイル。 |
ddtSchemes | 時間微分の離散化スキームを設定する項目。ここでは、Euler(1次精度Euler法)を指定します。 |
default | 個別に指定がなければ、この設定を使用します。 |
gradSchemes | 勾配の離散化スキームを設定する項目。ここでは、Gauss linear(線形補間)を指定します。 |
divSchemes | 発散の離散化スキームを設定する項目。 |
laplacianSchemes | ラプラシアンの離散化スキームを設定する項目。ここでは、Gauss linear orthogonal(直交性線形補間)を指定します。 |
interpolationSchemes | 界面の補間スキームを設定する項目。 |
snGradSchemes | 自由表面の法線方向勾配のスキームを設定する項目。 |
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: v2312 |
| \\ / A nd | Website: www.openfoam.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
object fvSchemes;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
ddtSchemes
{
default Euler;
}
gradSchemes
{
default Gauss linear;
grad(p) Gauss linear;
}
divSchemes
{
default none;
div(phi,U) Gauss linear;
}
laplacianSchemes
{
default Gauss linear orthogonal;
}
interpolationSchemes
{
default linear;
}
snGradSchemes
{
default orthogonal;
}
// ************************************************************************* //
5.8 「system」フォルダ 「fvSolution」
fvSolution | 代数方程式(連立一次方程式)の解法ソルバーを定義するファイル。 |
solvers | 各変数の代数方程式の解法ソルバーを設定する項目。 |
p | 圧力を対象。solverはPCG(前処理付き共役勾配法)、 preconditionerはDIC(対角ベース不完全Cholesky分解)、tolerance(残差)とrelTol(初期残差に対する比)は計算の打ち切り条件を設定します。残差がtoleranceよりも小さくなるか、初期残差に対する比がrelTolよりも小さくなったときに計算が終了します。relTolを0に設定した場合、toleranceだけで判定します。 |
pFinal | 反復計算最後で使用されるソルバーを設定する項目。 |
U | 流速を対象。solverはsmoothSolver(Gauss-Seidel法)、smootherはsymGaussSeidel (Gauss-Seidel法) 、toleranceとrelTolは計算の打ち切り条件を設定します。 |
PISO | 圧力-速度連成手法の一つであるPISO (Pressure-Implicit with Splitting of Operators) を設定する項目。 nCorrectorsはPISO法の圧力補正ループの回数で、通常は2を設定します。 |
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: v2312 |
| \\ / A nd | Website: www.openfoam.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
object fvSolution;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
solvers
{
p
{
solver PCG;
preconditioner DIC;
tolerance 1e-06;
relTol 0.05;
}
pFinal
{
$p;
relTol 0;
}
U
{
solver smoothSolver;
smoother symGaussSeidel;
tolerance 1e-05;
relTol 0;
}
}
PISO
{
nCorrectors 2;
nNonOrthogonalCorrectors 0;
pRefCell 0;
pRefValue 0;
}
// ************************************************************************* //
5.9 「system」フォルダ 「PDRblockMeshDict」
PDRblockMeshDict | PDRFoam(圧縮性予混合/部分予混合燃焼ソルバー)のチュートリアルで使用されるファイルであり、本計算と関係ありません。 |
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: v2312 |
| \\ / A nd | Website: www.openfoam.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
object PDRblockMeshDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
scale 0.1;
x
{
points (0 1);
nCells (20);
ratios (1);
}
y
{
points (0 1);
nCells (20);
ratios (1);
}
z
{
points (0 0.1);
nCells (1);
ratios (1);
}
boundary
(
movingWall
{
type wall;
faces (3);
}
fixedWalls
{
type wall;
faces (0 1 2);
}
frontAndBack
{
type empty;
faces (4 5);
}
);
// ************************************************************************* //
以上。
コメント