こんにちは(@t_kun_kamakiri)(‘◇’)ゞ
本記事ではOpenFOAMのメッシュ生成ユーティリティであるblockMeshを使って球体まわりのメッシュを6面体で生成したいと思います。
こちらの記事のモデル作成です。
[ac-box06 title=”参考記事”]
【OpenFOAM】ゴルフボールはどう打ったら最もよく飛ぶのか※モデルを頂きブログ記事での解説のお許しを得たので皆さんに共有いたします。
記事内で「SALOMEを用いて下図のようなメッシュを作成しました。全てヘキサで作成した後にrefineMeshにて一部をポリヘドラに細分化」と書いてありますが、当ブログではゴルフボールではなくバスケットボールまわりのメッシュ作成をします。また、全てblockMeshのみで作成するので記事内の作り方と異なります。
[/ac-box06]
最終的には以下のようになります。
バスケットボールは前回の記事で作成したので重ねてみると以下のようになります。
1度試しにsnappyHexMeshでメッシュ生成しましたが、バスケットボールの凹みの部分のメッシュを細かくしないといけなく計算時間がかかるので本記事の内容の通りメッシュを作成しなおすことにしました。
以前した球体でしたときの効力係数0.4より約4倍大きい。
メッシュがだめだな。 https://t.co/gcOkMWjD7j— カマキリ🐲Python頑張る昆虫 (@t_kun_kamakiri) September 2, 2022
バスケットボールはシュートの際に1秒間に2回転ほどしているそうです。
味方にパスをするときはもっと高速で回転していると思いますが、果たして回転させるとどう違うのか考察をしていく心意気です(^^)
モデル作成と勉強しながら、アウトプットのため記事にまとめていきます。最終的にはOpenFOAMを使ってバスケットボールまわりの流れを解析します。
- 【回転するバスケットボールまわりの流れ(1)】FreeCADで作るバスケットボール
- 【回転するバスケットボールまわりの流れ(2)】ボール周辺をblockMeshでメッシュ作成←本記事
- 【回転するバスケットボールまわりの流れ(3)】OpenFOAMで無回転のバスケットボールまわりの流れ
- 【回転するバスケットボールまわりの流れ(4)】OpenFOAMで回転のバスケットボールまわりのメッシュ作成
- 【回転するバスケットボールまわりの流れ(5)】OpenFOAMで回転するバスケットボールまわりの流れ
- 【回転するバスケットボールまわりの流れ(6)】OpenFOAMで並列化計算
- 【回転するバスケットボールまわりの流れ(7)】OpenFOAMで抗力と揚力の出力
- 【回転するバスケットボールまわりの流れ(8)】PythonスクリプトによるOpenFOAMの自動計算
頑張りますよ(‘ω’)ノ
使用環境
- Windows11
- FreeCAD:0.19
- OpenFOAM-v2006 (2006)ESI版
- Paraview:5.9.0
幾何学的の寸法を確認
まず作りたいのは大きな立方体の中に小さな立方体をくり抜いたメッシュです。
断面を切ると以下のようになります。
小さな立方体はバスケットボールくらいの大きさにしたいので、バスケットボールの半径250mm(0.25m)の球体に立方体が入ったとしたときの寸法を計算します。
あとで内側と外側の球体面に投影するため少し小さめに作成しておきます。
$\frac{1}{\sqrt{2}}$倍ではなく$\frac{1}{\sqrt{3}}$倍にします。
blockMeshは「vertices」の中に座標点を書くことで立方体の頂点とします。
下部分のメッシュ作成
まずはメッシュを下部分だけ作成してみます。
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 |
/*--------------------------------*- C++ -*----------------------------------*\ | ========= | | | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | | \\ / O peration | Version: v1912 | | \\ / A nd | Website: www.openfoam.com | | \\/ M anipulation | | \*---------------------------------------------------------------------------*/ FoamFile { version 2.0; format ascii; class dictionary; object blockMeshDict; } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // scale 1; verbose yes; // basketball r = 0.125m r_in 0.128; r_ami 0.30; r_out 0.5; n 24; v #calc "1.0/sqrt(3.0)"; v_in #calc "$r_in*$v"; mv_in #calc "-$v_in"; v_ami #calc "$r_ami*$v"; mv_ami #calc "-$v_ami"; vertices ( ($mv_in $mv_in $mv_in) // 0 ( $v_in $mv_in $mv_in) // 1 ( $v_in $v_in $mv_in) // 2 ($mv_in $v_in $mv_in) // 3 ($mv_in $mv_in $v_in) // 4 ( $v_in $mv_in $v_in) // 5 ( $v_in $v_in $v_in) // 6 ($mv_in $v_in $v_in) // 7 ($mv_ami $mv_ami $mv_ami) // 8 ( $v_ami $mv_ami $mv_ami) // 9 ( $v_ami $v_ami $mv_ami) // 10 ($mv_ami $v_ami $mv_ami) // 11 ($mv_ami $mv_ami $v_ami) // 12 ( $v_ami $mv_ami $v_ami) // 13 ( $v_ami $v_ami $v_ami) // 14 ($mv_ami $v_ami $v_ami) // 15 ); blocks ( hex ( 9 8 12 13 1 0 4 5) ($n $n $n) simpleGrading (1 1 1) /* hex (10 9 13 14 2 1 5 6) ($n $n $n) simpleGrading (1 1 1) hex (11 10 14 15 3 2 6 7) ($n $n $n) simpleGrading (1 1 1) hex ( 8 11 15 12 0 3 7 4) ($n $n $n) simpleGrading (1 1 1) hex ( 8 9 10 11 0 1 2 3) ($n $n $n) simpleGrading (1 1 1) hex (13 12 15 14 5 4 7 6) ($n $n $n) simpleGrading (1 1 1) */ ); edges ( ); faces ( ); boundary ( in_to_out { type wall; faces ( ( 9 13 12 8) ); } ball { type wall; faces ( (1 5 4 0) ); } ); // ************************************************************************* // |
ターミナルで以下のコマンドを打ちます。
1 |
blockMesh -dict system/blockMeshDict_1 |
下部分の弧を描いた形状
最終的に球体へ投影した形状にしたいため立方体の辺を中間点を通るような弧を描いた形にします。それには「edges」で設定を行います。
1 |
arc <頂点1> <頂点2> (中間点座標) |
のように書きます。
この中間点は外側の球体や内側の球体を通る点です。
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 |
/*--------------------------------*- C++ -*----------------------------------*\ | ========= | | | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | | \\ / O peration | Version: v1912 | | \\ / A nd | Website: www.openfoam.com | | \\/ M anipulation | | \*---------------------------------------------------------------------------*/ FoamFile { version 2.0; format ascii; class dictionary; object blockMeshDict; } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // scale 1; verbose yes; // basketball r = 0.125m r_in 0.128; r_ami 0.30; r_out 0.5; n 24; v #calc "1.0/sqrt(3.0)"; a #calc "1.0/sqrt(2.0)"; v_in #calc "$r_in*$v"; mv_in #calc "-$v_in"; a_in #calc "$r_in*$a"; ma_in #calc "-$a_in"; v_ami #calc "$r_ami*$v"; mv_ami #calc "-$v_ami"; a_ami #calc "$r_ami*$a"; ma_ami #calc "-$a_ami"; a_out #calc "$r_out*$a"; ma_out #calc "-$a_out"; vertices ( ($mv_in $mv_in $mv_in) // 0 ( $v_in $mv_in $mv_in) // 1 ( $v_in $v_in $mv_in) // 2 ($mv_in $v_in $mv_in) // 3 ($mv_in $mv_in $v_in) // 4 ( $v_in $mv_in $v_in) // 5 ( $v_in $v_in $v_in) // 6 ($mv_in $v_in $v_in) // 7 ($mv_ami $mv_ami $mv_ami) // 8 ( $v_ami $mv_ami $mv_ami) // 9 ( $v_ami $v_ami $mv_ami) // 10 ($mv_ami $v_ami $mv_ami) // 11 ($mv_ami $mv_ami $v_ami) // 12 ( $v_ami $mv_ami $v_ami) // 13 ( $v_ami $v_ami $v_ami) // 14 ($mv_ami $v_ami $v_ami) // 15 ); blocks ( hex ( 9 8 12 13 1 0 4 5) ($n $n $n) simpleGrading (1 1 1) /* hex (10 9 13 14 2 1 5 6) ($n $n $n) simpleGrading (1 1 1) hex (11 10 14 15 3 2 6 7) ($n $n $n) simpleGrading (1 1 1) hex ( 8 11 15 12 0 3 7 4) ($n $n $n) simpleGrading (1 1 1) hex ( 8 9 10 11 0 1 2 3) ($n $n $n) simpleGrading (1 1 1) hex (13 12 15 14 5 4 7 6) ($n $n $n) simpleGrading (1 1 1) */ ); edges ( arc 8 9 (0 $ma_ami $ma_ami) arc 12 13 (0 $ma_ami $a_ami) arc 8 12 ($ma_ami $ma_ami 0) arc 9 13 ($a_ami $ma_ami 0) arc 0 1 (0 $ma_in $ma_in) arc 4 5 (0 $ma_in $a_in) arc 0 4 ($ma_in $ma_in 0) arc 1 5 ($a_in $ma_in 0) ); faces ( ); boundary ( in_to_out { type wall; faces ( ( 9 13 12 8) ); } ball { type wall; faces ( (1 5 4 0) ); } ); // ************************************************************************* // |
ターミナルで以下のコマンドを打ちます。
1 |
blockMesh -dict system/blockMeshDict_2 |
中間点を通るような弧を描いた形状になりました。
球体へ投影
最後に球体へ投影を行います。
まず「geometry」で外側の球体と内側の球体の設定を行います。
1 |
arc <頂点1> <頂点2> (中間点座標) |
のように書きます。
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 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 |
/*--------------------------------*- C++ -*----------------------------------*\ | ========= | | | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | | \\ / O peration | Version: v1912 | | \\ / A nd | Website: www.openfoam.com | | \\/ M anipulation | | \*---------------------------------------------------------------------------*/ FoamFile { version 2.0; format ascii; class dictionary; object blockMeshDict; } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // scale 1; verbose yes; // basketball r = 0.125m r_in 0.128; r_ami 0.30; r_out 0.5; n 24; v #calc "1.0/sqrt(3.0)"; a #calc "1.0/sqrt(2.0)"; v_in #calc "$r_in*$v"; mv_in #calc "-$v_in"; a_in #calc "$r_in*$a"; ma_in #calc "-$a_in"; v_ami #calc "$r_ami*$v"; mv_ami #calc "-$v_ami"; a_ami #calc "$r_ami*$a"; ma_ami #calc "-$a_ami"; a_out #calc "$r_out*$a"; ma_out #calc "-$a_out"; vertices ( ($mv_in $mv_in $mv_in) // 0 ( $v_in $mv_in $mv_in) // 1 ( $v_in $v_in $mv_in) // 2 ($mv_in $v_in $mv_in) // 3 ($mv_in $mv_in $v_in) // 4 ( $v_in $mv_in $v_in) // 5 ( $v_in $v_in $v_in) // 6 ($mv_in $v_in $v_in) // 7 ($mv_ami $mv_ami $mv_ami) // 8 ( $v_ami $mv_ami $mv_ami) // 9 ( $v_ami $v_ami $mv_ami) // 10 ($mv_ami $v_ami $mv_ami) // 11 ($mv_ami $mv_ami $v_ami) // 12 ( $v_ami $mv_ami $v_ami) // 13 ( $v_ami $v_ami $v_ami) // 14 ($mv_ami $v_ami $v_ami) // 15 ); blocks ( hex ( 9 8 12 13 1 0 4 5) ($n $n $n) simpleGrading (1 1 1) /* hex (10 9 13 14 2 1 5 6) ($n $n $n) simpleGrading (1 1 1) hex (11 10 14 15 3 2 6 7) ($n $n $n) simpleGrading (1 1 1) hex ( 8 11 15 12 0 3 7 4) ($n $n $n) simpleGrading (1 1 1) hex ( 8 9 10 11 0 1 2 3) ($n $n $n) simpleGrading (1 1 1) hex (13 12 15 14 5 4 7 6) ($n $n $n) simpleGrading (1 1 1) */ ); edges ( arc 8 9 (0 $ma_ami $ma_ami) arc 12 13 (0 $ma_ami $a_ami) arc 8 12 ($ma_ami $ma_ami 0) arc 9 13 ($a_ami $ma_ami 0) arc 0 1 (0 $ma_in $ma_in) arc 4 5 (0 $ma_in $a_in) arc 0 4 ($ma_in $ma_in 0) arc 1 5 ($a_in $ma_in 0) ); geometry { ball { type sphere; origin (0 0 0); radius $r_in; } ami { type sphere; origin (0 0 0); radius $r_ami; } } faces ( project ( 9 13 12 8) ami project (1 5 4 0) ball ); boundary ( in_to_out { type wall; faces ( ( 9 13 12 8) ); } ball { type wall; faces ( (1 5 4 0) ); } ); // ************************************************************************* // |
ターミナルで以下のコマンドを打ちます。
1 |
blockMesh -dict system/blockMeshDict_3 |
黄色の面が球体に投影された面です。
他の領域も同様に設定
では最後にその他の領域も同様の設定をして外側の球体の中に内側の球体がくり抜かれたメッシュを作成します。
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 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 |
/*--------------------------------*- C++ -*----------------------------------*\ | ========= | | | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | | \\ / O peration | Version: v1912 | | \\ / A nd | Website: www.openfoam.com | | \\/ M anipulation | | \*---------------------------------------------------------------------------*/ FoamFile { version 2.0; format ascii; class dictionary; object blockMeshDict; } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // scale 1; verbose yes; // basketball r = 0.125m r_in 0.128; r_ami 0.30; r_out 0.5; n 24; v #calc "1.0/sqrt(3.0)"; a #calc "1.0/sqrt(2.0)"; v_in #calc "$r_in*$v"; mv_in #calc "-$v_in"; a_in #calc "$r_in*$a"; ma_in #calc "-$a_in"; v_ami #calc "$r_ami*$v"; mv_ami #calc "-$v_ami"; a_ami #calc "$r_ami*$a"; ma_ami #calc "-$a_ami"; a_out #calc "$r_out*$a"; ma_out #calc "-$a_out"; vertices ( ($mv_in $mv_in $mv_in) // 0 ( $v_in $mv_in $mv_in) // 1 ( $v_in $v_in $mv_in) // 2 ($mv_in $v_in $mv_in) // 3 ($mv_in $mv_in $v_in) // 4 ( $v_in $mv_in $v_in) // 5 ( $v_in $v_in $v_in) // 6 ($mv_in $v_in $v_in) // 7 ($mv_ami $mv_ami $mv_ami) // 8 ( $v_ami $mv_ami $mv_ami) // 9 ( $v_ami $v_ami $mv_ami) // 10 ($mv_ami $v_ami $mv_ami) // 11 ($mv_ami $mv_ami $v_ami) // 12 ( $v_ami $mv_ami $v_ami) // 13 ( $v_ami $v_ami $v_ami) // 14 ($mv_ami $v_ami $v_ami) // 15 ); blocks ( hex ( 9 8 12 13 1 0 4 5) ($n $n $n) simpleGrading (1 1 1) hex (10 9 13 14 2 1 5 6) ($n $n $n) simpleGrading (1 1 1) hex (11 10 14 15 3 2 6 7) ($n $n $n) simpleGrading (1 1 1) hex ( 8 11 15 12 0 3 7 4) ($n $n $n) simpleGrading (1 1 1) hex ( 8 9 10 11 0 1 2 3) ($n $n $n) simpleGrading (1 1 1) hex (13 12 15 14 5 4 7 6) ($n $n $n) simpleGrading (1 1 1) ); edges ( arc 8 9 (0 $ma_ami $ma_ami) // 0 arc 10 11 (0 $a_ami $ma_ami) arc 14 15 (0 $a_ami $a_ami) arc 12 13 (0 $ma_ami $a_ami) arc 8 11 ($ma_ami 0 $ma_ami) // 4 arc 9 10 ($a_ami 0 $ma_ami) arc 13 14 ($a_ami 0 $a_ami) arc 12 15 ($ma_ami 0 $a_ami) arc 8 12 ($ma_ami $ma_ami 0) // 8 arc 9 13 ($a_ami $ma_ami 0) arc 10 14 ($a_ami $a_ami 0) arc 11 15 ($ma_ami $a_ami 0) arc 0 1 (0 $ma_in $ma_in) // 12 arc 2 3 (0 $a_in $ma_in) arc 6 7 (0 $a_in $a_in) arc 4 5 (0 $ma_in $a_in) arc 0 3 ($ma_in 0 $ma_in) // 16 arc 1 2 ($a_in 0 $ma_in) arc 5 6 ($a_in 0 $a_in) arc 4 7 ($ma_in 0 $a_in) arc 0 4 ($ma_in $ma_in 0) // 20 arc 1 5 ($a_in $ma_in 0) arc 2 6 ($a_in $a_in 0) arc 3 7 ($ma_in $a_in 0) ); geometry { ball { type sphere; origin (0 0 0); radius $r_in; } ami { type sphere; origin (0 0 0); radius $r_ami; } } faces ( project ( 8 12 15 11) ami project (10 14 13 9) ami project ( 9 13 12 8) ami project (11 15 14 10) ami project ( 8 11 10 9) ami project (12 13 14 15) ami project (0 4 7 3) ball project (2 6 5 1) ball project (1 5 4 0) ball project (3 7 6 2) ball project (0 3 2 1) ball project (4 5 6 7) ball ); boundary ( in_to_out { type wall; faces ( ( 8 12 15 11) (10 14 13 9) ( 9 13 12 8) (11 15 14 10) ( 8 11 10 9) (12 13 14 15) ); } ball { type wall; faces ( (0 4 7 3) (2 6 5 1) (1 5 4 0) (3 7 6 2) (0 3 2 1) (4 5 6 7) ); } ); // ************************************************************************* // |
ターミナルで以下のコマンドを打ちます。
1 |
blockMesh |
このようになります(^^)/
まとめ
今回はバスケットボールのまわりのメッシュ作成をblockMeshのみ使ってメッシュ作成をしました。6面体で作成しているためメッシュ数を多くすることなく球体形状に沿ったメッシュ作成ができています。
次回はバスケットボールまわりの解析領域のメッシュ作成を行います。
今回同様blockMeshのみで行います(^^)/
おすすめ参考図書
☟こちらは、OpenFOAMの日本語書籍として重宝しているわかりやすい参考書だと思います。
☟こちらもOpenFOMの古いバージョンでの和訳になります。さすがにこちらはバージョンに対する日本語でのケアはしていないので、OpenFOAMに慣れている方は購入しても良いかと思います。僕は「日本語でまとまっている内容」なので少し重宝しています。
☟以下に、もっと初心者向けの同人誌を紹介しておきます。
初心者は「ってか、まずどうやってOpenFOAMをインストールするの?」というところからつまずきがちです。
そんな時は、以下の書籍をおすすめします。
インストール方法とチュートリアルで流体解析を体験・・・ちょっと高度な解析まで解説があります。著者曰くOpenFOAMのバージョンの追跡を行いながら、書籍をアップデートするようなので安心ですね。
OpenFOAMコードの辞書的な扱いとしては以下の参考書が大変役に立ちます。
本記事ではESI版のOpenFOAMを使っているため本書のFoundation版で対応していない部分がありますが、その辺を考慮しても持っていて損はないでしょう。
今回の記事はこちらの著者の方からモデル提供をいただきモデル作成の解説を行いました。
OpenFOAMでメッシュ作成