こんにちは(@t_kun_kamakiri)
前回の記事では指定した座標位置の圧力を出力する設定について解説を行いました。
しかし、メッシュが粗いために指定した座標に節点がなく値の出力に失敗しました。
今回は3次元ダムブレイクの障害物近辺のみメッシュの再分割を行うOpenFOAMのユーティリティであるrefimeMeshについて解説します。
使用しているベースとなるチュートリアルは「$FOAM_TUTORIALS/multiphase/interFoam/laminar/damBreakWithObstacle/」よりコピーして使っています。
障害物近辺のメッシュ再分割について解説を行う。
OpenFOAM初心者でチュートリアルを動かしたことがある方を対象にしています。
DEXCS2020
OpenFOAM v2006
refineMeshでメッシュの再分割
まずベースメッシュの障害物がある領域だけをメッシュの再分割を行います。
まず、設定をクリアするために以下のコマンドでフォルダ内をリセットします。
1 | ./Allclean |
ちなみにAllcleanファイルには以下の記述が書かれています。
1 2 3 4 5 6 7 8 | #!/bin/sh cd "${0%/*}" || exit # Run from this directory . ${WM_PROJECT_DIR:?}/bin/tools/CleanFunctions # Tutorial clean functions #------------------------------------------------------------------------------ cleanCase0 #------------------------------------------------------------------------------ |
では、以下のコマンドでベースメッシュを作成しましょう。
1 2 | cp -r 0.org 0 blockMesh |
※「cp -r 0.org 0」は設定ファイルのコピーを行っているだけです。
メッシュの再分割を行うためにはセルセットを作成する必要があります。
その方法は2つありますので好きな方を使ってください。
個人的には方法2を使った方がわかりやすいので方法2を使っています。
方法1 Setsetコマンド
ここからSetsetコマンドによって再分割するセルセットを用意します。
1 | setSet |
このように打つと対話形式に変わります。
以下のように再分割したい領域のmin座標とmax座標を指定します。
1 | readline>cellSet refineCells new boxToCell (0.55 -0.3 0) (0.9 0.3 0.2) |
※実際に書くのは「cellSet refineCells new boxToCell (0.55 -0.3 0) (0.9 0.3 0.2)」の部分のみ。
これにより「refineCells」という名前のセルセットができました。
1 | readline>quit |
このように書くことで対話形式が終了します。
refineMeshを実行するためにはsystem/refineMeshDictを作成して以下の記述を行います。
refineMeshの記述は下記の記事を参考にしました。
system/refineMeshDict
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 | FoamFile { version 2.0; format ascii; class dictionary; object refineMeshDict; } // Cells to refine; name of cell set set refineCells; // Type of coordinate system: // - global : coordinate system same for every cell. Usually aligned with // x,y,z axis. Specify in globalCoeffs section below. // - patchLocal : coordinate system different for every cell. Specify in // patchLocalCoeffs section below. coordinateSystem global; // .. and its coefficients. x,y in this case. (normal direction is calculated // as tan1^tan2) globalCoeffs { tan1 (1 0 0); tan2 (0 1 0); } patchLocalCoeffs { patch patchName; //Normal direction is facenormal of zero'th face of patch tan1 (1 0 0); tan2 (0 1 0); } // List of directions to refine directions ( tan1 tan2 tan3 ); // Whether to use hex topology. This will // - if patchLocal: all cells on selected patch should be hex // - split all hexes in 2x2x2 through the middle of edges. useHexTopology true; // Cut purely geometric (will cut hexes through vertices) or take topology // into account. Incompatible with useHexTopology geometricCut false; // Write meshes from intermediate steps writeMesh false; |
そしてsetSetで指定した領域を以下のコマンドでメッシュの再分割を行います。
1 | refineMesh -overwrite |
ではベースメッシュの障害物近辺のメッシュの再分割ができたかどうかParaviewでy断面を切って確認してみましょう。
ベースメッシュができたら前回の記事で行ったtopoSetとsubsetMeshを使って障害物だけを取り出すようにします。
今回は方法2で2種類のtopoSetDictを使いたいため「topoSetDict2」をいうファイルを用意して以下のように記述します。
system/topoSetDict2
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; } { name c0; type cellSet; action invert; } { name c0; type cellSet; action subtract; source boxToCell; box (0.6635 -0.2015 0) (0.8245 0.2015 0.161); } ); // ************************************************************************* // |
詳しい解説は【topoSetコマンド(OpenFOAM)】3次元ダムブレイクモデル作成(1)をお読みください。
ファイルを指定してtopoSetを実行するためには以下のように書き、ターミナルで実行します。
1 | topoSet -dict system/topoSetDict2 |
これにて「c0」という名前のセルセットが作成されました。
このc0は障害物近辺のメッシュが再分割されたセルセットとなっています。
そしてベースメッシュからセルセットの「c0」を取り出します。
1 | subsetMesh -overwrite c0 -patch walls |
Paraviewで確認してみましょう。
障害物近辺のメッシュの再分割が行えていることと、圧力計測点に節点があることがかくにんできました。
方法2 topoSet
setSetのような対話形式だとスクリプトにしにくいため、topoSetを使って辞書形式で書くことができます。
まずメッシュの再分割用のセルセットのため「system/topoSetDict1」を作成します。
system/topoSetDict1
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 dictionary; object topoSetDict; } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // actions ( { name refineCells; type cellSet; action clear; } { name refineCells; type cellSet; action new; source boxToCell; box (0.55 -0.3 0) (0.9 0.3 0.2); } ); // ************************************************************************* // |
setSetと同様「refineCells」でセルセットを作成しています。
これを使ってrefineMeshを実行します。
1 2 | topoSet -dict system/topoSetDict1 refineMesh -overwrite |
これにてベースメッシュの障害物近辺のメッシュ再分割が行えたので、方法1同様に障害物のメッシュを取り除くようにします。
system/topoSetDict2
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; } { name c0; type cellSet; action invert; } { name c0; type cellSet; action subtract; source boxToCell; box (0.6635 -0.2015 0) (0.8245 0.2015 0.161); } ); // ************************************************************************* // |
方法1と同じ記述内容です。
1 2 | topoSet -dict system/topoSetDict2 subsetMesh -overwrite c0 -patch walls |
今までの流れをまとめると以下のようになります。
- refineMeshDict
- topoSetDict1
- topoSetDict2
スクリプトで以下のように書いて置けば初期状態までが楽ですね
1 2 | touch run chmod 777 run |
「run」という空ファイルを作成し、実行権限を与えます。
「run」ファイルの中身は以下のようにしておきます。
1 2 3 4 5 6 7 8 9 | #!/bin/sh cp -r 0.org 0 blockMesh topoSet -dict system/topoSetDict1 refineMesh -overwrite topoSet -dict system/topoSetDict2 subsetMesh -overwrite c0 -patch walls setFields |
まとめ
今回は前回で問題になったメッシュの粗さによる指定した座標位置に節点が存在しないという問題点を改善するために、障害物近辺のメッシュの再分割を行いました。
これにより指定した座標位置に節点が存在することにより、圧力データを出力することができるようになっているはずです。
次回の記事では、指定した座標位置の圧力の時刻歴を取得し、実験データと比較してみます。
P1点での圧力データに対して実験とOpenFOAMでの結果を比較するためgnuplotを使って重ねてみました。概ね実験データと重なっており良い結果ではないかと思います。
参考書
PENGUINさんサイトを体系的に学べる書籍となっています。ネット記事でも十分勉強できるのですが、OpenFOAMの初学者でOpenFOAMをインストール済みであれば一冊持って置き、体系的に学ぶのが良いでしょう。
あとは初心者向けに丁寧に解説がされているこちらの書籍もお勧めです。最後の章にはオーバーセットメッシュ(重合メッシュ)の機能を使った解析を最後まで丁寧に解説しているので挫折することはないでしょう。