こんにちは(@t_kun_kamakiri)
OpenFOAMのメッシュ操作のユーティリティであるtopoSetについて解説を行います。
- topoSetコマンドの使い方を理解する。
- topoSetでセルセットを作成する。
OpenFOAM初心者でチュートリアルを動かしたことがある方を対象にしています。
DEXCS2020
OpenFOAM v2006
チュートリアルのケースファイル
実験データとOpenFOAMのチュートリアルケースファイルを入手します。
実験データ
今後、3次元ダムブレイクの実験との比較を行うため実験データを入手します。
OpenFOAMで作成する寸法も実験に合わせて作成します。
ケースファイルの入手
実験の寸法に近しいケースファイルのチュートリアルから入手します。
以下のコマンドを打って解析実行したいフォルダにコピーしてきます。
1 | cp -r $FOAM_TUTORIALS/multiphase/interFoam/laminar/damBreakWithObstacle/ . |
ファイル構成は以下のようになっています。
treeコマンドを打って確かみましょう。
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 | kamakiri@kamakiri-VirtualBox /opt/OpenFOAM/OpenFOAM-v2006/tutorials/multiphase/interFoam/laminar/damBreakWithObstacle $ tree . ├── 0.orig │ ├── U │ ├── alpha.water │ ├── k │ ├── nut │ ├── omega │ └── p_rgh ├── Allclean ├── Allrun ├── constant │ ├── dynamicMeshDict │ ├── g │ ├── transportProperties │ └── turbulenceProperties └── system ├── blockMeshDict ├── controlDict ├── decomposeParDict ├── fvSchemes ├── fvSolution ├── setFieldsDict └── topoSetDict 3 directories, 19 files |
今回はsystem/topoSetDictの中身の解説を行います。
ベースメッシュ作成 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 | /*--------------------------------*- 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 (minX minY minZ) (3.22 -0.5 0) // 節点1 (maxX minY minZ) (3.22 0.5 0) // 節点2 (maxX maxY minZ) (0 0.5 0) // 節点3 (minX maxY minZ) (0 -0.5 1) // 節点4 (minX minY maxZ) (3.22 -0.5 1) // 節点5 (maxX minY maxZ) (3.22 0.5 1) // 節点6 (maxX maxY maxZ) (0 0.5 1) // 節点7 (minX maxY maxZ) ); blocks ( hex (0 1 2 3 4 5 6 7) (81 25 25) simpleGrading (1 1 1) ); edges ( ); boundary ( region_maxZ { type patch; faces ( (4 5 6 7) ); } walls { type wall; faces ( (0 4 7 3) (3 7 6 2) (2 6 5 1) (1 5 4 0) (0 3 2 1) ); } ); mergePatchPairs ( ); // ************************************************************************* // |
ターミナルで以下のコマンドを打つとベースメッシュが作成されます。
1 | blockMesh |
作成されたメッシュをparaviewで確認します。
topoSetコマンド
topoSetコマンドはディクショナリファイルを元にsystem/topoSetDict の設定に従ってセルセット、フェイスセット、セルゾーン、フェイスゾーンなどを作成するユーティリティです。
system/topoSetDict
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 | /*--------------------------------*- 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 topoSetDict; } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // actions ( { name c0; type cellSet; //セルセット action clear; //clear セットの中身を削除 new/clear/invert } { name c0; type cellSet; action invert; //invert セットの選択を反転 new/clear/invert } { name c0; type cellSet; action subtract; //選択されたセルをこのセルセットから削除する source boxToCell; //範囲の指定方法 boxToCellは六面体により指定 box (0.6635 -0.2015 0) (0.8245 0.2015 0.161); //Min座標 Max座標 } ); // ************************************************************************* // |
- セットの中身を削除
セットの初期化を行っている。 - セットの反転
現在選択していないセットを選択する。
まだ何もセットを作成していないから選択されたセットはblockMeshで作成されたメッシュ全体のセットとなります。 - box作成
boxでMin座標とMax座標を指定
「action subtract」で②で作成したセットから③で作成したboxを削除している
では、以下のコマンドでtopoSetを実行してみましょう。
1 | topoSet |
topoSetのオプションとしては以下があります。
-case <dir> | ケースディレクトリを指定します。デフォルトでは現在いるディレクトリです。 |
---|---|
-constant | constantディレクトリにも適用します。 |
-decomposeParDict <file> | 特定の場所からdecomposeParDictファイルを読み込む場合に使用します。 |
-dict | ディクショナリファイルを指定します。(デフォルトはsystem/topoSetDict) |
-latestTime | 最新の時間ステップのみに適用します。 |
-newTimes | 新しい時間ステップのみに適用します。 |
-noFunctionObjects | functionObjects を実行しないようにします。 |
-noSync | 隣り合ったパッチを選択しないようにします。 |
-noZero | 0ディレクトリを除外します。 |
-parallel | 並列で実行します。 |
-region <name> | 別のメッシュ領域を指定します。 |
-roots <(dir1 .. dirN)> | 複数のケースを処理する場合にディレクトリを指定します。 |
-time <ranges> | 指定した時間ステップ内に適用します。 設定例: ‘:10,20,40:70,1000:’ |
-srcDoc | ブラウザを用いてソースコードを表示します。 |
-doc | ブラウザを用いてドキュメントを表示します。 |
-help | ヘルプを表示します。 |
paraviewで確認してみましょう。
cellset/c0を選択すると障害物があるセルセットができています。
topoSetコマンドを使って色々なセルセットを作ることもできます。
(おまけ)球体のセルセット
次は、先ほどのblockMeshで作成したベースメッシュを使って球体のセルセットを作ってみましょう。
system/topoSetDictは以下のようにします。
記述方法は公式サイトのユーザーガイドから参考にします。
system/topoSetDict
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 dictionary; object topoSetDict; } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // actions ( { name c0; type cellSet; action new; source sphereToCell; origin (1.5 0 0.5); radius 0.2; innerRadius 0.05; } ); // ************************************************************************* // |
先ほど作成したセルセットは、リセットするスクリプトを使っていったん削除する必要があります。以下のコマンドを打ってリセットしましょう。
1 | ./Allclean |
これにてリセットできましたので、またblockMeshコマンドを打ってベースメッシュを作成し、上のtopoSetDictを使ってセルセットを作成します。
1 2 | blockMesh topoSet |
paraviewで結果を見てみましょう。
topoSetDictで以下のような球体(中心 (1.5 0 0.5)、内径0.05、外形0.2)を作成するようにしています。
1 2 3 4 | source sphereToCell; origin (1.5 0 0.5); radius 0.2; innerRadius 0.05; |
ベースメッシュが球体形状になっていないためメッシュがカクカクしていますね。
ちゃんと球体形状にしたい場合はベースメッシュのセルも球体に沿った形で作成をする必要があります。
ちなみにセルセットからセルゾーンを作成する場合は「source setToCellZone」とすれば良いです。
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 | /*--------------------------------*- 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 topoSetDict; } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // actions ( { name c0; type cellSet; action new; source sphereToCell; origin (1.5 0 0.5); radius 0.2; innerRadius 0.05; } { name c0-zone; type cellZoneSet; action new; source setToCellZone; sourceInfo { set c0; } } ); // ************************************************************************* // |
今回のような球体のセルゾーンは例えばバスケットボールまわりの流れをMRF(Multiple Reference Frame)で回転を与える場合などに使うことができます。
こちらの記事はOpenFOAMの使い方シリーズとして書いていきます。
まとめ
今回は3次元ダムブレイクのチュートリアルで使われているtopoSetコマンドについて解説を行いました。
次回の記事で紹介するsebsetMeshコマンドと合わせて使うことで色々なメッシュ作成がOpenFOAMのユーティリティだけで作成することができます。
参考書
PENGUINさんサイトを体系的に学べる書籍となっています。ネット記事でも十分勉強できるのですが、OpenFOAMの初学者でOpenFOAMをインストール済みであれば一冊持って置き、体系的に学ぶのが良いでしょう。
あとは初心者向けに丁寧に解説がされているこちらの書籍もお勧めです。最後の章にはオーバーセットメッシュ(重合メッシュ)の機能を使った解析を最後まで丁寧に解説しているので挫折することはないでしょう。