blockMeshとsnappyHexMeshで二次元の円柱後方の流れ場モデルを作成する方法~その2~ blockMesh

ヒョウ

その1で説明したモデルの背景メッシュを blockMesh により作成します。blockMeshでは別途freeCAD作成するジオメトリ形状(ここでは円柱のことです)をsnappyHexMeshで読み込むための背景となるメッシュを作成します。つまり,このblockMeshという操作ではx軸方向に1.05 m (=35D), y軸方向に0.3 m (=10D),z軸方向に0.003 m (=1メッシュ)の長方形のメッシュ領域を作成するということです。Dは円柱の直径としD=0.03 mとしていました。blockMeshでは円柱形状はまだ登場しません。下図のようなメッシュ領域を作ります。円柱がないメッシュ領域です。

blockMeshDictの中身

主要な部分は下記の内容になります。
*****************************
convertToMeters 1;

vertices
(
( -0.15 -0.15 0)
( 0.9 -0.15 0)
( 0.9 0.15 0)
( -0.15 0.15 0)
( -0.15 -0.15 0.003)
( 0.9 -0.15 0.003)
( 0.9 0.15 0.003)
( -0.15 0.15 0.003)
);

blocks
(
hex (0 1 2 3 4 5 6 7) (350 100 1) simpleGrading (1 1 1)
);

edges
(
);

boundary
(
frontAndBack
{
type empty;
faces
(
(4 5 6 7)
(0 3 2 1)
);
}
y_min
{
type patch;
faces ((0 1 5 4));
}
y_max
{
type patch;
faces ((2 3 7 6));
}
x_min
{
type patch;
faces ((0 4 7 3));
}
x_max
{
type patch;
faces ((1 2 6 5));
}
);
*****************************

convertToMeters

距離の単位系をメートルで入力する場合は次のように1とします。
***********
convertToMeters 1;
***********
この数値を1以外にすることはふつうしません。距離の単位をmmとして座標を入力したい場合は0.001を入力することになりますが,他の設定(境界条件など)との整合性を合わせる際に手入力の間違いが発生しやすくなると思います。

vertices

blockMeshの背景メッシュ領域はここでは直方体です。このverticesで背景メッシュ領域の各頂点の座標を指定します。一番初めに示した図で原点位置を円柱の底面の中心としていますので8つの頂点はそれぞれ下記の座標になります。
*************
vertices
(
( -0.15  -0.15        0)
( 0.9     -0.15        0)
( 0.9      0.15        0)
( -0.15   0.15        0)
( -0.15  -0.15 0.003)
( 0.9     -0.15 0.003)
( 0.9      0.15 0.003)
( -0.15   0.15 0.003)
);
*************
各頂点の座標の指定方法は(x座標 y座標 z座標)の順番で記入し,スペースキーで区切ります。このスペースは1つである必要はありません。上記のように見やすくなるように複数回スペースを入れてまくて構いません。ここで記入した順番に次のblocksで座標に番号が与えられます。

blocks

背景メッシュ領域の指定,x, y, z方向のメッシュ分割数の指定,各方向のメッシュ分割幅の成長比率を指定します。下記の記載内容ですが,ひとつずつ見ていきましょう。
*****************************
blocks
(
hex (0 1 2 3 4 5 6 7) (350 100 1) simpleGrading (1 1 1)
);
*****************************

上段のverticesで記入した各座標点について,記入した順番に次のように番号がついています。
0 ( -0.15  -0.15        0)
1 ( 0.9     -0.15        0)
2 ( 0.9      0.15        0)
3 ( -0.15   0.15        0)
4 ( -0.15  -0.15 0.003)
5 ( 0.9     -0.15 0.003)
6 ( 0.9      0.15 0.003)
7 ( -0.15   0.15 0.003)
この番号を意識して,冒頭で示した直方体の背景メッシュ領域を作成する場合はまず
“hex (0 1 2 3 4 5 6 7)”
と記載します。このとき背景メッシュの輪郭を構成する面の中から,向かい合う二つの平面に注目し同じ方向に周る順番で,一つ目の面の頂点(0 1 2 3 )と二つ目の面の頂点(4 5 6 7)と記載します。これで背景メッシュ領域を認識させます。イメージは下図のようになります。

次にx方向,y方向,z方向のメッシュ分割数をカッコ内に記載します。ここでは
“(350 100 1)”
と記載します。これはx方向にメッシュを350分割,y方向にメッシュを100分割,z方向にメッシュを1分割することを意味します。また1分割とは1メッシュのみ作成することを意味します。冒頭で3 mmのメッシュサイズでメッシュ作成すると書きましたが,モデルのx方向の長さは1.05 mであり,350分割することでメッシュサイズを3 mmとなります。y方向も同様です。y方向の長さは0.3 m であり100分割することでメッシュサイズを3 mmとできます。z方向は1メッシュのみなので分割数1とします。このような考えで設定します。

各方向のメッシュ分割幅の成長比率は次のように書きます。
“simpleGrading (1 1 1)”
すべて1と入力することで,x, y, z方向に均等なメッシュ幅とします。

edges

ここでは使いません。気にせず下記の内容でOKです。
******
edges
(
);
******

boundary

境界面を設定します。ここで使用する境界面のタイプはemptypatchです。
emptyは二次元モデルを作るときに使用するタイプです。
patchは入口面や出口面,壁面を設定するときに使用するタイプです。

今回のモデルではz軸方向に1メッシュだけ作成しています。openfoamで二次元モデルを作成するときにわかりにくいところはx-y平面の二次元モデルを作成するのにz軸方向に1つのボリュームメッシュを作ることです。(今回のモデルではz軸方向です。)

z方向の計算をしないようにするために下記のようにemptyを設定します。境界面の設定方法は「境界面の名前」,「タイプ」,「面の指定」の順番で次のように書きます。
*********
frontAndBack
{
type empty;
faces
(
(4 5 6 7)
(0 3 2 1)
);
}
*********
ここでは境界面の名前を”frontAndBack”とし,境界面のタイプをemptyとし,境界面を(4 5 6 7)と(0 3 2 1)の2つとして指定しています。面の指定は背景メッシュ領域を外側から見たときに反時計回りになるように面の頂点を指定します。
結果として,z=0の面とz=0.003の面をemptyと設定していることになります。

次に入口面(速度境界),出口面(圧力境界),壁面を設定する目的で残りの面をpatchとして指定します。それぞれの面は後ほど,”0″ディレクトリ中の”U”および”P”を記述する際に入口面,出口面,壁面として設定しますが,blockMeshDictではすべてpatchとして設定します。後ほど下記の内容で設定します。
面      境界設定       境界面の名前
x=-0.15   入口面(速度境界)  x_min
x=0.9    出口面(圧力境界)  x_max
y=-0.15   壁面         y_min
y=0.15    壁面         y_max

それぞれ,下記のように記述することでpatchとして設定します。emptyの場合と同様に,面の指定は背景メッシュ領域を外側から見たときに反時計回りになるように面の頂点を指定します。

************
y_min
{
type patch;
faces ((0 1 5 4));
}
y_max
{
type patch;
faces ((2 3 7 6));
}
x_min
{
type patch;
faces ((0 4 7 3));
}
x_max
{
type patch;
faces ((1 2 6 5));
}
************

blockMeshの実行

以上の内容でblockMeshDictを編集したらblockMeshを実行しましょう。ubuntuの場合は端末で所定のディレクトリに移動し実行します。ディレクトの移動は”cd”と”ls”を駆使しましょう。一つ上の階層へ戻りたいときは”cd ..”のコマンドで戻れます。所定のディレクトリに移動したら次のコマンドでblockMeshを実行できます。
*******
blockMesh
*******
エラーなく実行できれば,”constant”ディレクトリの中に”polyMesh”ディレクトリが生成されています。この”polyMesh”の中に冒頭の図で示した背景メッシュの情報が含まれています。blockMeshの実行前にすでに”constant”ディレクトリの中に”polyMesh”ディレクトリが存在している場合は上書きされます。

以上がblockMeshDictの作り方です。お疲れさまでした。この後,freeCADで作成した円柱のstlファイルを用意して,snappyHexMeshを実行することにより二次元の円柱後方流れをシミュレーションするためのメッシュを作ることができます。

スポンサーリンク
プロフィール
この記事を書いた人

openfoamを使って流体力学のシミュレーションをやっています。openfoamはまだまだ始めたばかりの人にとってわかりにくさがあると思います。そういったわかりにくさを説明するtipsを書いていきながら,他のこともいろいろやっていきたいと思ます。

ヒョウをフォローする
ヒョウ 流体力学
ヒョウをフォローする
mister Big5  サファリ系サラリーマンblog

コメント

タイトルとURLをコピーしました