Upload
buixuyen
View
428
Download
8
Embed Size (px)
Citation preview
blockMeshコマンドを用いたメッシュ生成
若嶋振一郎(NIT, Ichinoseki College)
2017/5/21 1
初出: 2017/01/05更新: 2017/05/20
Outline
1. blockMeshコマンドについて
2. blockMeshDictファイルの書き方
3. メッシュ生成と確認
2017/5/21 2
blockMeshコマンド
• OpenFOAMで最も基本となるメッシュ生成コマンド(ユーティリティ)
•点・線・面・ブロックのデータを設定ファイル (blockMeshDict)に記述し、これをもとに規則的な構造メッシュを生成する
• Multi block対応• メッシュトポロジーの設計が重要
2017/5/21 3点 線・面 ブロック
4
0
1 2
35 6
7
blockMeshDictの書き方
• blockMeshDictはsystemフォルダに置く (昔のバージョンと異なる)
• blockMeshDictの作成方法• 直接テキストファイルとして作成
• マクロ言語プロセッサm4を用いた半自動生成
• blockMeshDict内にコードを記述して半自動生成(後述)• 実行時のコード実行許可が必要(OFのdefaultで許可されている)
• sin, cosなどを利用できる
2017/5/21 4
blockMeshDictの構造
2017/5/21 5
/*--------------------------------*- C++ -*----------------------------------*¥| ========= | || ¥¥ / F ield | OpenFOAM: The Open Source CFD Toolbox || ¥¥ / O peration | Version: 4.1 || ¥¥ / A nd | Web: www.OpenFOAM.org || ¥¥/ M anipulation | |¥*---------------------------------------------------------------------------*/FoamFile{
version 2.0;format ascii;class dictionary;object blockMeshDict;
}// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
convertToMeters 1;
vertices ( );
blocks ( );
edges ( );
boundary ( );
mergePatchPairs ( );
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
メートル単位へのスケール変換ファクタの指定(OFはSI単位で計算)
節点(vertices)の座標数値の指定
ブロック(blocks)の指定
稜線(edges)の指定(節点間をどうつなぐかを指定)
境界面(boundary patch)の指定
マージする境界面ペアの指定
blockMeshDict: vertices ()
•節点の座標を指定
2017/5/21 6
vertices(
(0 0 0) // 節点番号0 (1 0 0) // 節点番号1 (1 1 0) // 節点番号2 (0 1 0) // 節点番号3 (0 0 0.1) // 節点番号4 (1 0 0.1) // 節点番号5 (1 1 0.1) // 節点番号6 (0 1 0.1) // 節点番号7
);
C/C++と同様に,//以降はコメント(間違えないように記入しておくとよい)
• 指定した順に節点番号が暗黙に振られる• 番号は0からスタートする
blockMeshDict: blocks ()
•節点番号を用いて6面体ブロックを指定(複数可能)
2017/5/21 7
blocks(
hex (0 1 2 3 4 5 6 7) (20 20 1) simpleGrading (1 1 1));
6面体(Hexahedra)を指定
6面体を構成する6つの節点番号を指定
ブロックの各稜線方向の分割数を指定
各方向の分割の拡大率を指定
blockMeshDict: blocks ()
2017/5/21 8
blocks(
hex (0 1 2 3 4 5 6 7) (20 20 1) simpleGrading (1 1 1));
Ref: http://cfd.direct/openfoam/user-guide/blockmesh/
x3方向に小さい順に、右手系で節点番号を指定する
x1,x2,x3方向の分割数を指定する
20分割
1分割20分割
blockMeshDict: blocks ()
2017/5/21 9
blocks(
hex (0 1 2 3 4 5 6 7) (20 20 1) simpleGrading (1 1 1));
Ref: http://cfd.direct/openfoam/user-guide/blockmesh/
x1,x2,x3方向の拡大率を指定する
simpleGrading (1 1 1)・・・すべての方向に等分割simpleGrading (2 1 1)・・・x1方向に徐々に大きく
拡大比2となるように分割(最初と最後の分割サイズの比)
simpleGrading (0.5 1 1)・・・x1方向に徐々に小さく拡大比0.5となるように分割
拡大率
blockMeshDict: blocks ()
2017/5/21 10
blocks(
hex (0 1 2 3 4 5 6 7) (20 20 20)edgeGrading (1 1 1 1 2 2 2 2 3 3 3 3)
// simpleGrading (1 2 3)と等価);
Ref: http://cfd.direct/openfoam/user-guide/blockmesh/
その他のgrading: edgeGrading・・・・12本のedge毎に分割比を指定
blockMeshDict: blocks ()
2017/5/21 11
blocks(
hex (0 1 2 3 4 5 6 7) (20 20 1)simpleGrading (1
( (0.2 0.3 4) //20% x2-dir,30% cells, exptn.=4 (0.6 0.4 1) //60% x2-dir,40% cells, exptn.=1 (0.2 0.3 0.25) //20% x2-dir,30% cells, exptn.=0.25
) 1)
);
Ref: http://cfd.direct/openfoam/user-guide/blockmesh/
その他のgrading:multiGrading・・・・simpleGradingの指定の仕方を以下のように変えることで、分割幅を小→大→小のようにも指定できる(便利!)
この場合、x2方向の最初の20%の範囲に、メッシュ分割数の30%が割り振られ、拡大率4で分割され中間の60%の範囲に、メッシュ分割数の40%が割り振られ、拡大率1で等分割され最後の20%の範囲に、メッシュ分割数の30%が割り振られ、拡大率0.25で分割される
blockmeshDict: edges();
•節点と節点をつなぐ線の形式を指定
• とくに指定しなければ直線(Line)でつなぐ
•線の種類: arc, spline(スプライン曲線), polyLine(折れ線), BSpline(Bスプライン曲線), (Line: default)
2017/5/21 12
edges(
arc 1 5 (0.1 0.1 0.5)spline 2 3 ((0 0.1 0.1)(0 0.1 0.2)(0 0.1 0.1))
);
円弧 節点番号1と5を結ぶ 通過点の座標を指定
通過点の座標点列を指定
blockMeshDict: boundary()
•境界条件となるパッチ面の名前、種類を指定
2017/5/21 13
boundary(
fixedWalls{
type wall;faces(
(0 4 7 3)(2 6 5 1)(1 5 4 0)
);}
);
名前を指定(0/U, pなどの境界条件で使用する)
パッチ面のtype
• パッチ面を形成する面を4つの節点番号で指定
• 複数の面を指定した場合は、まとめて名前が付けられる
blockMeshDict: boundary()
•主なパッチ面の種類(type ****)
2017/5/21 14
type 説明 備考
patch 一般的なパッチ面(流入・流出面など)
wall 個体壁面
symmetry 対称面(平面)
symmetryPlane 対称面
empty 2次元計算で利用する仮想境界面
wedge くさび面
cyclic 周期境界条件(メッシュ形状が一致する)neighbourPatchなどの追加指定が必要cyclicAMI 周期境界条件(メッシュ形状が一致しない場合)
Ref: http://cfd.direct/openfoam/user-guide/boundaries/#x24-1680005.2.1
blockMeshDict: mergePatchPairs()
•パッチ名を2つ指定して、結合する
• masterパッチはそのままで、slaveパッチ面の節点などは修正される
2017/5/21 15
mergePatchPairs(
( <masterPatch> <slavePatch> ) // merge patch pair 0( <masterPatch> <slavePatch> ) // merge patch pair 1…
)
blockMeshコマンドの演習(cavityチュートリアルを参考)
1. 1m×1m×3mの直方体(1ブロック)の作成(分割数は任意。zおよびy軸に平行な壁面にメッシュを寄せる設定)
2. 直方体の一部を曲線(円弧)にしたマルチブロックメッシュの作成
2017/5/21 16
1m
1m
3m
1m
1m
1m1m
R=1m
R=2m
cavityチュートリアルを適当にコピー&リネーム blockMeshDictを編集 blockMeshコマンド実行 paraFoamコマンドで確認
1mz
x
y
z
x
y
paraFoamの便利機能
• paraFoamを-blockオプション付きで実行すると、blockMeshDictを読み込み、記述が正しいか事前検討ができます(メッシュ生成前でもOK)
2017/5/21 17
codeStream機能
• blockMeshDict内で変数定義や計算(やや記述が煩雑)が可能です。
2017/5/21 18
R 1.0;x1 #calc “$R*sin(degToRad(30.0))”;x2 2.0;dx #calc “$x1 - $x2”;
vertices(
($R 0 0) // 節点番号0 ($x1 0 0) // 節点番号1
:);
2017/5/21 19
edges( spline 0 1 (
#codeStream{
codeInclude#{
#include "pointField.H" #};
code #{
label nbPoints = 20; for (label i = 0; i < nbPoints; i++) {
scalar xi = 0 + i*$L/(nbPoints-1);scalar yi = $Ri - ($Re-$Ri) * (6*pow(xi/$L,5) - 15*pow(xi/$L,4) + 10*pow(xi/$L,3)); os << point(xi, -yi, 0) << endl;
} #};
};)
);
以上で、blockMeshに関するハンズオンセミナーは終了です。お疲れ様でした!
2017/5/21 20