• 検索結果がありません。

は100

ドキュメント内 MyFirstOpenFOAM (ページ 31-58)

計算メッシュの作成

サンプルモデル ベース・メッシュの準備

ベース・メッシュから

CAD 形状にあったメッシュを抜き出して 必要に応じて詳細メッシュ化、

サーフェス上へのレイヤーセルの追加を行う

レイヤーセルの 追加

CAD に合わせて メッシュを抜き出し

メッシュの詳細化

計算メッシュの作成

snappyHexMeshDict の内容 (1)

FoamFile {

version 2.0;

format ascii;

class dictionary;

location system;

object snappyHexMeshDict;

}

// * * * * * * * * * * * * * * * // running steps

castellatedMesh true;

snap true;

addLayers true;

Geometry {

Throttle.stl

{ type triSurfaceMesh;

name Thrittle;

}

pipeWall.stl

{ type triSurfaceMesh;

name pipeWall;

}

Inlet.stl

{ type triSurfaceMesh;

name Inlet;

}

Outlet.stl

{ type triSurfaceMesh;

name Outlet;

}

計算メッシュの作成

snappyHexMeshDict の内容 (2)

densityBox0

{ type searchableBox;

min (-1.0 -2.0 0.0);

max (10.0 2.0 3.0);

castellatedMeshControls {

maxLocalCells 15000000;

maxGlobalCells 40000000;

maxLoadUnbalance 0.10;

minRefinementCells 0;

nCellsBetweenLevels 3;

resolveFeatureAngle 30;

features ( );

計算メッシュの作成

snappyHexMeshDict の内容 (3)

refinementSurfaces {

Throttle

{ level (9 9); } pipeWall

{ level (9 9); } Inlet

{ level (9 9); } Outlet

{ level (9 9); } }

refinementRegions {

densityBox0

{ mode inside;

levels ((1E15 6));

}

locationInMesh

(9.0001 0.0001 1.0001);

allowFreeStandingZoneFaces true;

snapControls {

nSmoothPatch 3;

tolerance 1.0;

nSolveIter 300;

nRelaxIter 5;

nFeatureSnapIter 10;

implicitFeatureSnap true;

explicitFeatureSnap false;

multiResionFeatureSnap true;

}

計算メッシュの作成

snappyHexMeshDict の内容 (4)

addLayersControls {

relativeSizes false;

layers

{ Throttle_surf

{ nSurfaceLayers 1; } pipeWall_surf

{ nSurfaceLayers 1; } }

finalLayerThickness .0008000;

expansionRatio 1.0;

minThickness .0004000;

nGrow 0;

featureAngle 90;

nSmoothSurfaceNormals 1;

nSmoothNormals 3;

nSmoothThickness 10;

maxFaceThicknessRatio 0.5;

maxThicknessToMedialRatio 0.3;

//

minMedianAxisAngle 80;

nBufferCellsNoExtrude 0;

nLayerIter 50;

meshQualityControls::relaxed.;

nRelaxedIter 20;

nRelaxIter 5;

}

計算メッシュの作成

snappyHexMeshDict の内容 (5)

meshQualityControls {

maxNonOrtho 65;

maxBoundarySkewness 10;

maxInternalSkewness 4;

maxConcave 80;

minVol 1E-14;

minTetQuality 1e-11;

minFlatness 0.5;

minArea .00000008;

minTwist 0.02;

minDeterminant 0.01;

minFaceWeight 0.02;

minVolRatio 0.01;

minTriangleTwist -1;

//minVolCollapseRatio 0.01;

nSmoothScale 4;

errorReduction 0.75;

relaxed {

maxNonOrtho 65;

} }

debug 0;

mergeTolerance 1E-10;

//

計算メッシュの作成

snappyHexMeshDict の内容 (1)

FoamFile {

version 2.0;

format ascii;

class dictionary;

location system;

object snappyHexMeshDict;

}

// * * * * * * * * * * * * * * * // running steps

castellatedMesh true;

snap true;

addLayers true;

計算メッシュの作成

snappyHexMeshDict の内容 (1)

Geometry {

Throttle.stl

{ type triSurfaceMesh;

name Thrittle;

}

pipeWall.stl

{ type triSurfaceMesh;

name pipeWall;

}

Inlet.stl

{ type triSurfaceMesh;

name Inlet;

}

Outlet.stl

{ type triSurfaceMesh;

name Outlet;

}

CAD等で作った形状データをメッシャに渡す。

STLファイルのデータに名前を関連付ける

計算メッシュの作成

snappyHexMeshDict の内容 (2)

densityBox0

{ type searchableBox;

min (-1.0 -2.0 0.0);

max (10.0 2.0 3.0);

}

簡単な幾何学形状であれば、STLファイルが無くても定義できる ここでは、「searchableBox」キーワードで矩形柱定義している

計算メッシュの作成

snappyHexMeshDict の内容 (2)

castellatedMeshControls {

maxLocalCells 15000000;

maxGlobalCells 40000000;

maxLoadUnbalance 0.10;

minRefinementCells 0;

nCellsBetweenLevels 3;

resolveFeatureAngle 30;

features ( );

}

並列処理(MPI)でメッシュを作成することを前提とした諸設定

1コア当たりのメッシュ生成数の上限

全体のメッシュ生成数の上限

コア間で分担するメッシュ数の不釣り合いが発生したら メッシュ生成中に各コアに再分配する。

この係数は再分配を始める上限

この例では、10%以上不釣り合いになると再分配される

計算メッシュの作成

snappyHexMeshDict の内容 (3)

refinementSurfaces {

Throttle

{ level (9 9); } pipeWall

{ level (9 9); } Inlet

{ level (9 9); } Outlet

{ level (9 9); } }

refinementRegions {

densityBox0

{ mode inside;

levels ((1E15 6));

}

locationInMesh

(9.0001 0.0001 1.0001);

allowFreeStandingZoneFaces true;

ベースメッシュを分割する回数 形状に与えた名前ごとに定義できる。

“level ([通常の分割回数] [角部の分割回数] ) “ で 定義される

指定した形状()の内側に対し メッシュの分割回数を一律で定義する

計算空間の中の任意の一点を指定する。

閉空間で区切られている場合、他方の空間にあるメッシュは 計算空間外と認識され、削除される

計算メッシュの作成

snappyHexMeshDict の内容 (3)

snapControls {

nSmoothPatch 3;

tolerance 1.0;

nSolveIter 300;

nRelaxIter 5;

nFeatureSnapIter 10;

implicitFeatureSnap true;

explicitFeatureSnap false;

multiResionFeatureSnap true;

}

メッシュの面を形状面に沿うように変形させる処理に 用いられる定義。

nSolverIterを増やすと形状再現性が改善する

[implicitFeatureSnap] 形状のエッジを探しながら メッシュの面を変形させる機能

[explicitFeatureSnap] 予め*.eMesh形式のファイルでエッジ線を 準備しておき、これにメッシュのエッジを 一致させる機能 事前に不要なエッジを 削除することができる

計算メッシュの作成

snappyHexMeshDict の内容 (4)

addLayersControls {

relativeSizes false;

layers

{ Throttle_surf

{ nSurfaceLayers 1; } pipeWall_surf

{ nSurfaceLayers 1; } }

finalLayerThickness .0008000;

expansionRatio 1.0;

minThickness .0004000;

nGrow 0;

featureAngle 90;

nSmoothSurfaceNormals 1;

nSmoothNormals 3;

nSmoothThickness 10;

maxFaceThicknessRatio 0.5;

maxThicknessToMedialRatio 0.3;

//

壁面近傍の境界層を精度よく再現するために用いる レイヤー・セルの追加作業に用いられる設定 壁面にあるメッシュのサイズに対する比率で指定するか、

直接メートル単位で指定するか、を選択する。

この例では、直接メートル単位で指定している レイヤー・セルを配置する箇所とセルの層数を指定する。

場所の指定は[形状名]_[パート名]で指定する

「パート名」は、STLファイルであればsolid名と一致している 壁面から一番離れたレイヤー・セル一層の厚さ

壁面に接したセルのことではないので注意

空間が狭い場合にどの距離までならレイヤーを追加するか、

という距離を指定。これ以下であればレイヤーが削除される

計算メッシュの作成

snappyHexMeshDict の内容 (4)

minMedianAxisAngle 80;

nBufferCellsNoExtrude 0;

nLayerIter 50;

meshQualityControls::relaxed.;

nRelaxedIter 20;

nRelaxIter 5;

}

レイヤーセルの追加に伴い、歪んだセルの形状を緩和する 処理の繰り返し回数。

増やせばある程度品質が改善する

計算メッシュの作成

snappyHexMeshDict の内容 (5)

meshQualityControls {

maxNonOrtho 65;

maxBoundarySkewness 10;

maxInternalSkewness 4;

maxConcave 80;

minVol 1E-14;

minTetQuality 1e-11;

minFlatness 0.5;

minArea .00000008;

minTwist 0.02;

minDeterminant 0.01;

minFaceWeight 0.02;

minVolRatio 0.01;

minTriangleTwist -1;

//minVolCollapseRatio 0.01;

nSmoothScale 4;

errorReduction 0.75;

セルの非直行性を許容する最大角。

これ以上歪むセルを形状修正の対象にする

メッシュ体積の最低サイズ。

負の体積セルが生成されることを防ぐ メッシュの面に対する最低サイズ

計算メッシュの作成

snappyHexMeshDict の内容 (5)

relaxed {

maxNonOrtho 65;

} }

debug 0;

mergeTolerance 1E-10;

//

計算メッシュの作成

snappyHexMesh の実行

次のようにファイルを配置する コンソールから起動する

ケース・ディレクトリ

constant polyMesh

blockMeshDict

system

controlDict

$> snappyHexMesh -overwrite

単体コア

(CPU)

で実行する場合 単体コア

(CPU)

で実行する場合

snappyHexMeshDict

fvSchemes fvSolution

decomposeParDict

※並列処理でメッシュを

作成する場合

※並列処理でメッシュを

作成する場合

hostfile

$>decomposePar -constant

$>foamJob –p snappyHexMesh ¥ –overwrite

$>reconstructParMesh -constant

複数コアで実行する場合

(MPI)

複数コアで実行する場合

(MPI)

計算条件の設定

境界条件

境界条件と計算結果は同じファイルに保存される

constant polyMesh

blockMeshDict

system

controlDict

snappyHexMeshDict

fvSchemes

fvSolution decomposeParDict

※並列処理でメッシュを 作成する場合

※並列処理でメッシュを 作成する場合

ケース・ディレクトリ

0

p

:圧力

U

:速度

k

:乱流エネルギ

epsilon

:乱流

散逸率

サンプル・モデルの境界条件

サンプルモデル ~境界条件

U: 0m/sec P: zero 勾配

U: 0m/sec

P: zero 勾配

計算条件の設定

境界条件

乱流のパラメータの決め方

乱流エネルギー [k] ここで、 U は流入流速 I は乱流強度

乱流強度のめやす:

・高速、圧縮性、内部流などのケース: 5 ~ 20%

・非圧縮性~弱圧縮性などのケース: 1 ~ 5%

・外部流などのケース : 1% 程度

( )

2

2 3 UI k =

乱流散逸率 [ε] ここで、 は乱流モデル定数 l は乱流長さスケール

乱流長さスケールのめやす:

・通常は水力直径:等価面積の円の直径の、 3.8% 程度

・流入面の境界層厚さの 22% という方法もある l

C k

2 3

ε =

µ

計算条件の設定

境界条件 U

FoamFile {

version 2.0;

format ascii;

class volVectorField;

object U;

}

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

internalField uniform (100 0 0);

boundaryField {

Inlet_surf {

type fixedValue;

value $internalField;

}

Outlet_surf {

type zeroGradient;

}

Throttle_surf {

type fixedValue;

value uniform (0 0 0);

}

pipeWall_surf {

type fixedValue;

value uniform (0 0 0);

} }

U: 0m/sec

U: 0m/sec

計算条件の設定

境界条件 p

FoamFile {

version 2.0;

format ascii;

class volScalarField;

object p;

}

dimensions [0 2 -2 0 0 0 0];

internalField uniform 0;

boundaryField {

Inlet_surf {

type zeroGradient;

}

Outlet_surf {

type fixedValue;

value uniform 0;

}

Throttle_surf {

type zeroGradient;

}

pipeWall_surf {

type zeroGradient;

} }

p:zero 勾配

p:zero 勾配

計算条件の設定

境界条件 k

FoamFile {

version 2.0;

format ascii;

class volScalarField;

object k;

}

dimensions [0 2 -2 0 0 0 0];

internalField uniform 0.05;

boundaryField {

Inlet_surf {

type fixedValue;

value $internalField;

}

Outlet_surf {

type zeroGradient;

}

Throttle_surf {

type kqRWallFunction;

value $internalField;

}

pipeWall_surf {

type kqRWallFunction;

value $internalField;

} }

k: 壁関数 k: 壁関数

乱流強度のめやす:

・高速、圧縮性、内部流などのケース:520%

・非圧縮性~弱圧縮性などのケース:15%

・外部流などのケース :1% 程度

計算条件の設定

境界条件 ε

FoamFile {

version 2.0;

format ascii;

class volScalarField;

object epsilon;

}

dimensions [0 2 -3 0 0 0 0];

internalField uniform 0.01;

boundaryField {

Inlet_surf {

type fixedValue;

value $internalField;

}

Outlet_surf {

type zeroGradient;

}

Throttle_surf {

type epsilonWallFunction;

value $internalField;

}

pipeWall_surf {

type epsilonWallFunction;

value $internalField;

}

ε : 壁関数 ε : 壁関数

乱流長さスケールlのめやす:

・水力直径の、3.8%程度 0.09 (乱流モデル定数)

l C k

2 3

ε =

µ

上式とモデル定数より、

01 . 1 0

. 0

05 . 09 0 . 0

2 3 2

3

×

=

= l

C

µ

k

ε

計算の実行

シミュレーション実行の準備

次のようにファイルを配置する

ケース・ディレクトリ

constant polyMesh

blockMeshDict

system

controlDict

snappyHexMeshDict

fvSchemes fvSolution

decomposeParDict

※並列処理でメッシュを

作成する場合

※並列処理でメッシュを

作成する場合

hostfile 0

p

:圧力

U

:速度

k

:乱流エネルギ

epsilon

:乱流

散逸率

計算の実行

計算プログラムの実行

snappyHexMesh

・ SIMPLE 法の計算を実行する

・定常 / 乱流 / 非圧縮性流体 という特徴

$> simpleFoam > log.simpleFoam 2>&1 &

もしくは

$> foamJob simpleFoam 単体コア (CPU) で計算

・ < ケースディレクトリ >/system/ 内に「 hostfile 」を作成

・以下のコマンドを実行

$> decomposePar –force && foamJob –p simpleFoam

複数コアで計算 (MPI)

ドキュメント内 MyFirstOpenFOAM (ページ 31-58)

関連したドキュメント