メッシュ作成
メッシュ作成は以下の手順で作成します。
- blockMesh:ベースメッシュの作成
- surfaceFeatureExtractDict:障害物の特徴線の抽出
- snappyHexMesh:ベースメッシュから障害物の切り抜き
以上、3つの手順でメッシュ作成を行います。
blockMesh ベースメッシュの作成
blockMeshによりベースとなるメッシュを作成します。
「system/blockMeshDict」ファイルを以下のようにします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
/*--------------------------------*- 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 dictionary; object blockMeshDict; } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // scale 1; vertices ( (0 -0.5 0) //0 (3.22 -0.5 0) //1 (3.22 0.5 0) //2 (0 0.5 0) //3 (0 -0.5 1) //4 (3.22 -0.5 1) //5 (3.22 0.5 1) //6 (0 0.5 1) //7 ); blocks ( hex (0 1 2 3 4 5 6 7) (50 18 18) simpleGrading (1 1 1) ); edges ( ); boundary ( minX { type patch; faces ( (0 4 7 3) ); } maxX { type patch; faces ( (2 6 5 1) ); } minY { type patch; faces ( (3 7 6 2) ); } maxY { type patch; faces ( (1 5 4 0) ); } minZ { type patch; faces ( (0 3 2 1) ); } maxZ { type patch; faces ( (4 5 6 7) ); } ); mergePatchPairs ( ); // ************************************************************************* // |
1 2 3 4 5 6 7 8 9 10 11 |
vertices ( (0 -0.5 0) //0 (3.22 -0.5 0) //1 (3.22 0.5 0) //2 (0 0.5 0) //3 (0 -0.5 1) //4 (3.22 -0.5 1) //5 (3.22 0.5 1) //6 (0 0.5 1) //7 ); |
各方向の分割数は↓こちらで設定しています。
※simpleGradingは各方向のメッシュの拡大率を指定できますが、今回は均等にするため(1 1 1)とします。
1 2 3 4 |
blocks ( hex (0 1 2 3 4 5 6 7) (50 18 18) simpleGrading (1 1 1) ); |
以下のboundaryで個々の側面のパッチ設定を行います。
例えば、facesで(0 4 7 3)は頂点の番号を意味し、4点作られる面の名前を「mixX」としています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
boundary ( minX { type patch; faces ( (0 4 7 3) ); } maxX { type patch; faces ( (2 6 5 1) ); } minY { type patch; faces ( (3 7 6 2) ); } maxY { type patch; faces ( (1 5 4 0) ); } minZ { type patch; faces ( (0 3 2 1) ); } maxZ { type patch; faces ( (4 5 6 7) ); } ); |
以上で、blockMeshの実行を行うとベースメッシュが作成できます。
ターミナルで以下のコマンドを実行しベースメッシュを作成します。
1 |
blockMesh |
blockMeshが正常に行われると以下のフォルダにファイルが作成されます。
1 2 3 4 5 6 7 8 |
constant/polyMesh/ ├── boundary ├── faces ├── neighbour ├── owner └── points 0 directories, 5 files |
Paraviewでメッシュを確認してみましょう
ターミナルで以下のコマンドを実行するとParaviewが起動しメッシュ確認ができます。
1 |
paraFoam |
blockMesh変数定義
blockMesh内で変数定義を行うことができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 |
/*--------------------------------*- 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 dictionary; object blockMeshDict; } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // scale 1; xmin 0; xmax 3.22; ymin -0.5; ymax 0.5; zmin 0; zmax 1; deltax 0.0644; // xcells 50; deltay 0.056; // ycells 18; deltaz 0.056; // zcells 18; lx #calc "$xmax - $xmin"; ly #calc "$ymax - $ymin"; lz #calc "$zmax - ($zmin)"; xcells #calc "round($lx/$deltax)"; ycells #calc "round($ly/$deltay)"; zcells #calc "round($lz/$deltaz)"; vertices ( //BLOCK1 ($xmin $ymin $zmin) //0 ($xmax $ymin $zmin) //1 ($xmax $ymax $zmin) //2 ($xmin $ymax $zmin) //3 ($xmin $ymin $zmax) //4 ($xmax $ymin $zmax) //5 ($xmax $ymax $zmax) //6 ($xmin $ymax $zmax) //7 ); blocks ( hex (0 1 2 3 4 5 6 7) ($xcells $ycells $zcells) simpleGrading (1 1 1) ); edges ( ); boundary ( minX { type patch; faces ( (0 4 7 3) ); } maxX { type patch; faces ( (2 6 5 1) ); } minY { type patch; faces ( (3 7 6 2) ); } maxY { type patch; faces ( (1 5 4 0) ); } minZ { type patch; faces ( (0 3 2 1) ); } maxZ { type patch; faces ( (4 5 6 7) ); } ); mergePatchPairs ( ); // ************************************************************************* // |
以下で変数定義を行っています。
1 2 3 4 5 6 7 8 9 10 |
xmin 0; xmax 3.22; ymin -0.5; ymax 0.5; zmin 0; zmax 1; deltax 0.0644; // xcells 50; deltay 0.056; // ycells 18; deltaz 0.056; // zcells 18; |
変数定義した変数同士で演算を行うこともできます。
1 2 3 4 5 6 7 |
lx #calc "$xmax - $xmin"; ly #calc "$ymax - $ymin"; lz #calc "$zmax - ($zmin)"; xcells #calc "round($lx/$deltax)"; ycells #calc "round($ly/$deltay)"; zcells #calc "round($lz/$deltaz)"; |
以上のような変数定義を使ってblockMeshを実行するとコンパイルからはじまるため少しだけ時間がかかりますが、モデル作成が楽でわかりやすくなるように上手く変数を定義しておくのが良いでしょう。
ファイルの説明
blockMeshによって生成されたファイルの簡単な説明を行います。
こちらの生成されたファイルは自身もあまり理解していない部分ではなりますし、普段意識する必要はないですが、OpenFOAMの理解のため書き記したいと思います。
1 2 3 4 5 6 7 8 |
constant/polyMesh/ ├── boundary ├── faces ├── neighbour ├── owner └── points 0 directories, 5 files |
メッシュは以下のようなセル要素で構成されています。
1つのセルに対して、
- 節点
- 面要素
があります。
節点は各座標とIDを持っており、面要素は節点IDで構成されています。
このような予備知識を持ったままファイルを眺めてみましょう。
vectorFieldでメッシュの全ての点を定義
メッシュの全ての点の座標がリストとして定義されている。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
/*--------------------------------*- 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 vectorField; location "constant/polyMesh"; object points; } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // 18369 ( (0 -0.5 0) (0.0648119 -0.5 0) (0.129587 -0.5 0) (0.194321 -0.5 0) (0.259002 -0.5 0) (0.323616 -0.5 0) (以下省略) (3.22 0.5 1) ) |
pointsリスト中の点の位置を参照して、四つの点から面を構成。
vectorFieldにおいて定義したそれぞれの点から面を構成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
/*--------------------------------*- 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 faceList; location "constant/polyMesh"; object faces; } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // 50541 ( 4(1 52 1007 956) 4(51 1006 1007 52) 4(955 956 1007 1006) 4(2 53 1008 957) 4(52 1007 1008 53) (以下省略) 4(18214 18215 18266 18265) 4(18265 18266 18317 18316) 4(18316 18317 18368 18367) ) |
どの面がどのセルに保有されているのかを定義。
(例)最初の3つの面はセル0に保有されている
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
/*--------------------------------*- 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 labelList; note "nPoints:18369 nCells:16128 nFaces:50541 nInternalFaces:46227"; location "constant/polyMesh"; object owner; } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // 50541 ( 0 0 0 1 1 1 2 (以下省略) 16027 16077 16127 ) |
どのセルがどの面と隣接しているセルなのかを保有しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
/*--------------------------------*- 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 labelList; note "nPoints:18369 nCells:16128 nFaces:50541 nInternalFaces:46227"; location "constant/polyMesh"; object neighbour; } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // 46227 ( 1 50 876 2 51 (以下省略) 16126 16127 ) |
blockMeshで設定したメッシュ境界についての情報を含んでる。
※境界のパッチ名やパッチタイプは後述するOpenFOAMのユーティリティである「createPatch」を使うことで変更することができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
/*--------------------------------*- 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 polyBoundaryMesh; location "constant/polyMesh"; object boundary; } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // 7 ( minX { type patch; nFaces 324; startFace 46227; } maxX { type patch; nFaces 324; startFace 46551; } minY { type patch; nFaces 900; startFace 46875; } maxY { type patch; nFaces 900; startFace 47775; } minZ { type patch; nFaces 876; startFace 48675; } maxZ { type patch; nFaces 900; startFace 49551; } walls { type wall; inGroups 1(wall); nFaces 90; startFace 50451; } ) // ************************************************************************* // |
続いて形状の特徴線の抽出を行います。
大変貴重な記事ありがとうございます。