XML記述でのモデリング
こちらのcrazyeasyxmlmodeler.htmlをクリックいただきますと、XMLでのモデリングができるページが開きます。
XMLは<タグ>を利用した様々な情報交換に使用されている形式のことです。
画面左側にXMLのテキストが表示されてますので、そこを編集することで、右側画面のモデル表示の形状が変化します。
では、早速内容を編集してみましょう。
room01
-3.1, -1.7, 0.1
-3.1, -1.7, 5.5
-3.1, 1.7, 5.5
-3.1, 1.7, 0.1
28.0, -2.7, 0.1
28.0, -2.7, 5.5
28.0, 2.7, 5.5
28.0, 2.7, 0.1
と表示されている部分の-2.7という数字を全部-7.7にしてみましょうか。以下のようにします。
28.0, -7.7, 0.1
28.0, -7.7, 5.5
それで、[REDRAW]ボタンを押すと、横方向に出っ張りが大きくなりました。
右の画面内でマウスのホイールを回転させて拡大してみてください。
次に、[UNDO]ボタンを何度か押して、押せなくなるまで何度か押してみましょう。
これでXMLの記述も元に戻りました。やり直すには[REDO]ボタンを押します。
戻ったところで、再度[REDRAW]ボタンを押すと、横方向に出っ張りが元に戻りました。
先ほど編集したタグはX,Y,Zの座標(単位m)を表わしてますので、Y座標(奥行)が変化しました。
タグで囲われた部分ですから、これは終了面の定義を変更したことになります。
タグで囲われた部分でしたら、開始面のことです。
開始面および終了面ではpタグが4つ並んでます。これは4つの頂点を示してます。
面には表と裏がありまして、
開始面では表から見て、頂点が左回りの順で4点が定義されてます。
終了面では裏から見て、頂点が左回りの順で4点が定義されてます。
そのような定義で、開始面の1点目と終了面の1点目を結ぶ線ができます。同様に2点目、3点目、4点目も同様です。
そうしますと、開始面、終了面に加えて、側面4面が追加されて、6面体の立体が出来上がるというわけです。
開始面は青色、終了面は赤色で表示されてます。Start/End Color (Blue/Red)のチェックを外してみますと、青色/赤色表示はされなくなります。
右の画面内でマウスを左ボタンを押しながら視点を回転させて確認してみてください。
マウスの右ボタンを押しながらですと、上下左右に視点の平行移動ができます。
[COPY]ボタンを押すと、XMLの記述が全部コピーされますので、メモ帳などにコピーしてXMLファイルを作成できます。保存する時には文字コードはUTF-8(BOMなし)で保存してください。
また、左画面のXML編集の画面に既存のXMLファイルをドロップするとXMLファイルを読み込むこともできます。
それでは、XMLファイルの構造について説明します。
1行目はXMLのヘッダですので、この通りでいつも記述してください。2行目のworldタグは一番階層が上のタグです。このままでご利用ください。
XMLの最後には
worldの終了タグがあります。このように終了タグはタグ名前>のように記述します。
3行目からはコメントが記載されてます。の部分は説明ですので、このチュートリアルが終了しましたら読んでおいてください。
次に、
0.0, 0.0, 1.0
のshapeタグの部分ですが、nameとtypeの属性が付加されてます。typeごとに意味を持たせてます。
typeにはstartpos,room,dox,doorの4種類あり、それぞれ計算開始点、部屋、箱、ドアの意味です。
モデルを見ていただくと、大きい6面体が3つあります。これがboxです。
boxは必ずどこかのroomに属してます。今回は1つのboxが1つのroomに対応してます。
複数のboxが1つのroomに属している構成も可能です。
boxの境目に配管のようなものが2つありますが、これがdoorです。doorはroomとroomを接続するためのものです。文字通りドアの役割です。
よく見ますと、全体を囲うような直方体がありますね。これは外気の空間を表わしてます。シミュレーションで計算される範囲を示してます。
[Show Outer Room]のチェックを外しますと、その大きな直方体が非表示になって、中身のモデルが見やすくなりますね。
[Show Face Normals]のチェックを外しますと、黄色の法線が非表示になります。法線とは表面が向いている方向です。
右側画面でスペースキーを押しますと、平行投影(遠くを小さく表示しない)と透視投影(遠くを小さく表示する)が切り替わります。見やすい投影で確認できます。
法線は箱の外側に向くように作成します。開始面、終了面の頂点の並び順が間違っていると法線方向が違ってしまいます。
さて、さきほどのstartposについてですが、名前nameがstartpos0となってます。基本的に名前は自由ですが、スペースを入れないようにお願いします。
startposは計算開始点でして、今回の場合は横に細長いbox内に位置させてます。内部の気圧変化をシミュレーションする場合には内部のどこかの座標にしてください。
外気だけをシミュレーションしたい場合は、外気部分のどこかの座標にしてください。
外部か内部かという違いを設定するだけです。XMLで1つだけ定義してください。
5.696
-15.0
5.0
0.0,0.0,0.0
このshapeタグはtypeがroomですから、部屋の定義です。特別にisouterという属性がyesとなってます。これは外気を表わしてます。他のroomではこの属性はありません。
一番大きな全体を囲う直方体の定義となってます。nameは自由ですが、room00という名前です。
外気はXMLの中で1つだけにしておきましょう。
pressureタグでは気圧を単位Paで設定しますがこの例では単位をpsiにしてます。1気圧が14.6959psiです。OpenFOAMの内部的にはPa単位となりますが、自動的に単位変換されます。
psi単位で記述したい場合はunit属性をpsiで指定してください。
temperatureタグでは温度を単位摂氏で設定します。OpenFOAMの内部的にはK(ケルビン)単位となりますが、自動的に単位変換されます。摂氏1度が274.15ケルビンです。
humidityタグでは相対湿度を単位%で設定します。
velocityタグでは風速ベクトルを単位m/secで設定します。X軸方向速度,Y軸方向速度,Z軸方向速度です。(単位ベクトルにする必要はありません。)
さて、roomのタグはだいたい説明しました。
他の内部のroomとしましては、今回はroom01,room02,room03の3つが定義されてますが記述方法はisouter属性が無いということだけで、あとは同様です。
つぎにboxを見ていきましょう。
room00
-7.0,-8.0,-6.0
-8.0,-9.0,-7.0
-8.0,-9.0, 18.0
-8.0, 9.0, 18.0
-8.0, 9.0,-7.0
50.0,-9.0,-7.0
50.0,-9.0, 18.0
50.0, 9.0, 18.0
50.0,9.0,-7.0
これはtypeがboxとなってますから箱の定義です。boxは必ずroomに属してますから、roomnameタグで所属room名を記述します。
この例ですとroom00と記載がありますから、これは先ほどの外気roomに属しているということです。
probeタグとは計測点の定義です。シミュレーションの結果として画面にダンプおよびCSVファイルに出力する点となります。
このタグが未記載の場合は、boxの中心が計測点となります。計測点は1つだけしか記載できません。
ただし、OpenFOAMとしましては計測点だけでなく計算対象の全セルに対して計算をおこなってますから、その結果はOpenFOAM標準的なビューアのParaViewで見ることができます。
probeタグでの情報はそこからピックアップする計測点の定義です。
特に外気のboxの場合は中心点が他のroom内に位置することが多いですから、probeで外気部分の場所で定義しておいたほうがいいでしょう。
startタグとendタグでの開始面、終了面の定義方法は前述した通りです。それぞれ4つの頂点で構成されます。これをみますと、開始面と終了面ではX座標しか違いがありませんね。
つまり、開始面を定義したら、それをコピペして終了面はX座標だけずらせばいいということです。それで、開始面は表面からみて左回り、終了面は裏面からみて左回りの頂点定義になってます。
他のboxも同様に定義されてます。今回は他のboxではprobeタグはありませんが、記述しても結構です。box0101,box0201,box0301の各roomに対応したboxが定義されてます。
shapeタグにcolor属性があります。右画面での描画ではboxの色colorで表示されてます。(roomにはcolorの属性はありますが使っておりません。)
RGBA(赤、緑、青、透明)をそれぞれ2文字で表現してます。それぞれ00からFFまで設定できます。FFは進数です。0,1,2,3,4,5,6,7,8,9の次がA,B,C,D,E,Fとなってます。
透明の値の意味は不透明がFFで透明が00です。
色はこちらのカラーピッカーで簡単に決めることができます。
次はdoorの定義を見てみましょう。
room00,room01
99999.9
-3.3, -0.2, 1.1
-3.3, -0.2, 1.6
-3.3, 0.2, 1.6
-3.3, 0.2, 1.1
-3.1, -0.2, 1.1
-3.1, -0.2, 1.6
-3.1, 0.2, 1.6
-3.1, 0.2, 1.1
typeがdoorですね。ドアを表わしてます。nameは任意の名前ですから分かりやすい名前がいいでしょう。接続する2つのroomの番号を使うのが分かりやすいかと思います。colorで色が定義されます。
doorはroomとroomを接続するので、その2つのroomはconnectタグでカンマ区切りで2つroom名前を記述します。
この例ですと、room00とroom01を接続するという意味です。
toleranceタグで耐圧をデフォルトでは単位Paで指定しますがこの例ではunit="psi"として単位psiで設定してます。ドア開始面とドア終了面のそれぞれ中心位置から少し部屋の中心の位置での気圧を計測して、ドアの開始面位置と終了面位置での差圧が耐圧を超えた場合はドアは破壊されます。
ドアが破壊されますと、brokenの状態となりまして、空気が通ります。brokenでない場合は空気が遮断されます。
つまり、遮断されているドアというのは部屋の壁と同じです。
この例の場合はtoleranceが99999.9ですから、壊れないドアと定義されてます。これでは空気が通らないので、存在自体不要かと思われるかもしれませんが、内部のシミュレーションを行う際に
少なくとも1か所は内部と外気が接続するdoorがあれば外気も計算されます。この場合はダミーのドアです。外気を含めない場合はダミーのドアは不要です。
doorの開始面と終了面の定義方法はboxと同様です。ドアの厚みは薄いほうが好ましいですが、薄すぎてもうまくいかないです。
今回のように全体的に数十メートルのシミュレーションの場合には0.2mくらいが適切です。
つまり、roomとroomの間も0.2mは離しておきましょう。1つのroomで複数のboxが存在する場合は、boxとboxの間は0で基本的には結構ですがうまくメッシュが作成されない場合はドアをboxに少し入れ込む位置にするだど工夫が必要になります。
全体的に数十センチの大きさをシミュレーションする場合は、全体からみて同様の比率くらいの距離で離しておいてください。また、その場合はmscaleというコマンド引数を0.1にするなどで実行します(後述)。
今回の例ではドアの厚みは結構大きめです。サンプルとしまして分かりやすいようにそのようにしてます。
ドアの開始面または終了面がboxの境界から離れている場合は、うまく接続されず、空気が移動できなくなります。そのような場合は少しドアをbox側に突き出すか、ドアの開始面、終了面サイズを大きくしてください。
今回のように各軸に沿った方向でドアがある場合はbox境界ピッタリの座標でうまくいきます。
今回のdoorは上記の他にdoor0102,door0203があります。こちらの耐圧は4.0psiとなってますから、空気の差圧で破壊されることになるでしょう。
door0102の定義を確認してみます。
room01,room02
4.0
0.001
28.0, -1.2, 3.1
28.0, -1.2, 4.6
28.0, 0.0, 4.6
28.0, 0.0, 3.1
31.2, -1.2, 3.1
31.2, -1.2, 4.6
31.2, 0.0, 4.6
31.2, 0.0, 3.1
他のドアと違うのはenabletimeというタグがあることです。これは任意にdoorには設定できるタグでして、ドア破壊判定を行う時間帯を定義できます。
カンマ区切りで、開始時刻,終了時刻の2つを記述しますが、終了時刻は省略可能でその場合は開始時刻のみ(カンマなし)を記述します。
enabletimeタグが無い場合はつねにドア破壊判定を行うという意味になります。
この例ですと、0.001ですから、0.001秒未満では、仮にドア差圧が耐圧を超えていたとしても、ドアは破壊されないということです。
シミュレーション開始と同時にドアが破壊されたくない場合、開始してから少し時間が経過してから空気の移動をさせたい場合に使用するといいでしょう。
終了時刻を記述した場合は、仮にドアが破壊後であっても、終了時刻以降はドアは破壊されていない状態に戻りまして空気は通りません。
このようなシミュレーションを標準的なOpenFOAMで行うには難易度が高いのですが、本システムでは容易に実現できます。
ところで、doorには気圧pressureや温度temperatureのタグが定義できません。doorの内部は自動的にconnectタグの初めに記述されたroomのpressureおよびtemperatureになります。
風速はconnectタグに記述された2つのroomの平均の風速velocityとなります。
あと、今回のサンプルにないのはboxまたはdoorのshapeのisbrick属性です。通常のboxとdoorの定義と記載はほぼ同じですが、次のようにisbrick属性がyesの場合は
他のbox内部に配置する障害物として使えます。isbrickが無い場合はbox内部にboxを配置したとしても消えてしまいます。
基本的に通常のboxとboxは内包状態にはできませんが、isbrick属性をyesにすると独立した六面体として存在させることができます。
doorでisbrickをyesにする場合は耐圧を999999.9にするなど破壊不能にしておくといいと思います。
計測点を増やしたい場合もダミーとしてisbrickがyesのドアは利用できると思います。ドアが他のbox内部に存在する場合はconnectタグには同じroomの名前を2つ記述していただければ結構です。
もうひとつ、boxまたはdoorにはistube属性もあります。通常のboxとdoorの定義と記載はほぼ同じですが、次のようにisbrick属性がyesの場合は
開始面と終了面が削除されたトンネル構造になります。このtubeもisbrickと同様にbox内部に内包されていても形状が作成されるという特徴がありますので、
box内部を貫通するトンネル構造を作成する場合に便利です。
さて、XML定義が出来上がりましたら、これで準備はほとんど終わりのようなものです。
右側画面下に情報表示パネルがありまして、XMLの各roomとdoorの定義が表形式となってます。
roomのほうには容量がありまして自動的に所属するboxの合計容量が計算されてます。doorのほうにはareaの面積表示がありまして開始面の面積が計算されてます。
一応、右側の画面には[Drop STL files here]という領域があり、そこに任意のSTLファイルをドロップするとXMLのモデルと混在させて表示することができますから、既存のSTL形状を参考に作成する場合には利用してください。
また、左画面上部にはエクスポート機能としまして、[OBJ+mtl] [STL(text)] [STL(binary)]の3つのボタンがありまして、XMLからOBJ(+マテリアル)形式やSTLファイル形式へ変換して保存する機能があります。
STLはテキスト形式とバイナリ形式の2種類がありまして、バイナリ形式は色情報がすこし保存できます。対応しているビューアでは色が表示できるでしょう。
ただし、色情報はフルカラーでは保存できませんので、色落ちする場合があります。
ところで、このエクスポート機能があるということは、XMLでモデリングが出来るという意味になりますから、6面体の組み合わせだけですが、一般的なモデリング用途でも使うことができるツールということです。
また、このエクスポート機能で出力されるSTLファイルというのは、実は本システムでは使用しませんので、あくまでおまけ確認機能と考えて下さい。
本システムはXMLを使用します。内部的には似たようなSTLファイルも作成される(プロジェクト名/constant/triSurface/all_shapes.stl)のですが、機能的に異なる実装で変換されます。OpenFOAM向けに利用しやすい形式になってます。
一応、STLを表示するビューアというのもWebアプリで用意してます。STLを確認する場合はこちらcrazyeasystlviewer.htmlをご利用ください。
右画面にSTLファイルをドロップしますと表示できます。
XMLで座標を指定するのが、難しい場合は、座標をマウスクリックで確定できるcrazyeasyposget.htmlがあります。
XMLファイルまたはSTLファイルをドロップしますと三面図で表示できます。STLファイルは背景として薄っすらと表示されます。
JPEG画像ファイルを配置することもできます。XMLのコメント欄を参考にしてbackgroundタグをXMLに追記して画像ファイルを指定しておきます。
三面図の画面にXMLファイルと画像ファイルを一緒にドロップすることで表示させることができます。
3画面のどれかで、マウス左ボタンをクリックしますと、赤い点がでます。同時にpタグの座標が表示されます。
数学的には3面図のうち2画面でクリックしますとX,Y,Zの座標が決まりますので、赤い点の位置がきまりましたら、Enterキーを押すと確定となって点の色がすこし暗くなって残ります。
また、新たにクリックしますと、新規で赤い点が出現します。これらの操作で座標を出力することができますから、それをコピペしてXML作成で使用すると簡単にpタグの座標位置が確定できます。
確定した点を消すには右下のボタンを押します。[delete recent red point]で最新の1つの赤い点が消えます。全部の赤い点を消すには[delete all red points]を押してください。
三面図の画面でスペースキーを押すと、位置が反転表示になり後ろから見ることができます。
オブジェクトごとに位置移動や回転や拡大縮小を行いたい場合はcrazyeasytransform.htmlがあります。
オブジェクトごとにスライダーバーがありますので、それを操作しますと、更新しますと、右下のAbsolute XML内容が変化します。
Original XMLが入力ファイルで、Absolute XMLが更新後の内容です。[COPY Absolute XML]ボタンを押すことでクリップボードにコピーされますからペーストして利用できます。
一部分だけをマウスで選択してコピペして利用すると便利です。
表示ウインドウ上でスペースキーを押しますと、平行投影と透視投影が切り替わりますから見やすいやり方で操作してください。
X,Y,Zキーで各軸と平行な視点に移動します。Ctrlキーを押しながらですと、裏側からの表示となります。
はい、これでモデリングとXML定義のチュートリアルが終了しました。
XMLファイルの改行コードはLinux形式でもWindows形式でもどちらでも結構ですが、文字コードはUTF-8(BOMなし)としてください。
シミュレーション実行
さて、次はシミュレーションを実行します。通常のOpenFOAMの運用ですと各種設定ファイルを作らないことには始められないのですが、本システムはXMLファイルだけあればシミュレーションを実行できます。OpenFOAMの設定ファイルは自動作成します。
Docker上のUbuntu Linuxのシェル画面を出しましょう。
Dockerの操作方法はこちらで説明してます。
C:/wcfdフォルダで作業すると仮定して説明します。
先ほどのCrazyEasy XML Modeler で表示されているXMLの記述をtest.xmlとして保存してください。
これから実行しますがシミュレーション実行の前に念のためXMLからSTLへ正しく変換できるかを実験してみましょう。
実行ファイル名がcrazyeasycfdです。プロジェクト名を-pで指定しますがAirSimとします。-fオプションでXMLファイル名を指定します。-sオプションを指定することでSTL作成のみの実行を指示できます。
crazyeasycfd -p AirSim -f test.xml -s
で実行できます。
さてSTLに変換するだけですので、すぐに実行は終了します。
STLファイルは、AirSim/constant/triSurface/all_shapes.stlに出来上がりました。ファイル名は本システムでは固定となってます。
これを先ほどのWebアプリのSTLビューアにドロップしますと、XMLと似たような形状に仕上がっていることが確認できますね。
正しくブーリアン演算がされていることが確認できました。
次に実際の計算実行をしますが、その前にPCのスリープ設定について確認しておきましょう。
シミュレーション実行は数日の長期間におよぶことも多いです。1秒の計算で1日かかることもあります。
その間にPCがスリープしてはいけませんので、例えばノートPCの場合ですと、電源をつなげている場合とつなげていない場合で別々で設定できると思いますが、
電源は付けている状態にして、その設定でスリープを常にしないように設定しておいてください。
また、画面については人間が操作しない間はOFFになるほうがいいと思いますから、画面は時間でOFFにして、PC自体はスリープはしないようにします。
インターネットに接続してシミュレーション実行する必要は特にないのですが、つなげた環境の場合も多いと思います。
Windows ProではWindowsアップデートを一定期間停止する設定ができますので、それもやっておくといいでしょう。
さて、ここまでで準備は整いました。シミュレーション実行をしてみましょう。
プロジェクト名(ケース)をAirSimとします。XML名をtest.xmlとします。ドアの破壊が0.0001秒後から判定開始と定義しましたので、オフセット時刻をそれに合わせます。
一応、こちらにtest.xmlを置いておきました。リンクを右クリックして保存してください。
crazyeasyroomcfd -p AirSim -f test.xml -t 1.0 -d 0.0001,0.5:0.002,0.7:0.004 -o 0.001
で実行できます。
実行ファイル名がcrazyeasyroomcfdです。
-pでプロジェクト名AirSimを指定します。任意の名前で結構ですがスペースを入れないようにしてください。この名前のディレクトリ内に各種ファイルが生成されます。
-fで今回のXMLファイル名test.xmlを指定します。
-tが終了時間です。1.0秒間のシミュレーションを行うという意味です。
-dが計算時間間隔です。初期計算時間間隔として0.0001秒を指定してます。自動的に計算時間間隔の10倍の間隔で結果が出力されます。
カンマで区切って 秒数:時間間隔 を複数記述できます。その秒数に達したら、その時間間隔に切り替えて実行するという意味です。
0.0001,0.5:0.002,0.7:0.004の意味としましては、初めは0.0001秒間で、時刻0.5秒からは0.002秒間、時刻0.7秒からは0.004秒間で行うという意味です。
あまり時間間隔が長いと計算が収束せずにエラーとなり、トレースバックが頻発します。
-oがオフセット時間です。XMLの最初に破壊されるドアの時刻に合わせると、最初のドア破壊が時刻0となり見やすくなります。
-rを指定しますと、前回実行の続きとして実行されます。
本システムは数メートルから数十メートルの大きさの空間をメインターゲットとしてます。
全体が数十センチの大きさの場合は上記説明では省略してますが、 -mオプションを使って、-m 0.01のように小さい値を設定する必要があります。
XMLの定義上の長さの単位は常にmのままです。つまり数センチを表現するには小さい小数で定義されますから、それを考慮するパラメータとなってます。
もし他のXMLファイルで実行したい場合は、別のWindows PowerShellでdockerコマンドでUbuntu Linuxのシェル画面を起動して、同じように実行してください。搭載メモリによりますが、3つ、4つくらいまででしたら同時に実行できると思います。(実行速度は落ちます)
その場合は、プロジェクト名を固有にしてください。実行開始時にプロジェクト名のディレクトリ内は全部削除されます。
プロジェクト名が同じですと、実行済や実行中のディレクトリは消えてしまいますのでご注意ください。
少し変更して実験したいという用途はしばしば出てくるものです。XMLファイルを編集するだけでいいのは本システムの利点です。
実行を中断する場合はキーボードでCtrl+Cを何度かしつこく連続で押すと止まります。
指定した終了時刻前に中断したとしても、結果は中断したところまでは残りますから、それで結果の解析をすることも可能です。
ただし、最後の書き出しの時刻のデータやファイルは中途半端になっている可能性がありますので、そのデータは削除するなり無視したほうがいいと思います。
正しく中断するにはsuspendという空のファイルを作成しますと、次の結果書き出し時のきりのいいタイミングで一時停止します。
suspendファイルを削除すると再開します。中断した状態でParaViewなどのそれまでの結果を確認することも可能です。
ところで、結果の書き出し頻度なども設定で変更できます。
プロジェクト名(ケース名)と同じ名前で拡張子が.configというファイルを作成しておきます。この例の場合ですと、AirSim.config
デフォルト設定は以下のようなものです。
rhoPimpleFoam
10.0
Pa
RAS
RAS { RASModel kEpsilon; turbulence on; printCoeffs on; }
bounded Gauss upwind
bounded Gauss upwind
10
2
level (0 1)
AirSim.configの場合は圧力単位のPaをpsiに変えておくといいです。これはCSVファイル書き出しの時の圧力単位のことです。XMLで定義している圧力単位と合わせると分かりやすいでしょう。
10.0が書き出し頻度です。
例えば0.0001秒ごとに計算する指定(-d 0.0001)で実行している場合はその10倍の0.0001秒ごとに結果が書き出されます。
CSV書き出しやドアの破壊判定は書き出しタイミングごとに処理されます。
結果はプロジェクト名のフォルダが作成されます。その直下に数字のフォルダが作成されますが、それが秒数です。
また、プロジェクト名のフォルダ下のpostProcessing/allProbesフォルダ内にも数字のフォルダが作成されます。そこに観測点の結果データが出力されます。
このあたりはOpenFoamの動作と同様です。
結果確認
さて、実行が終了しましたら、プロジェクトフォルダ直下にプロジェクト名.foamというファイルが出来てます。
これをOpenFoamの標準的な表示アプリであるParaViewで読み込みますと、3次元表示などで確認できます。
ParaViewの公式サイトはこちらですから、ダウンロードしてインストールしておきましょう。
Windows版のインストーラはParaView-6.1.0-RC1-Windows-Python3.12-msvc2017-AMD64.msiのようなファイル名(バージョンにより異なります)となってます。
.foamファイルをダブルクリックでもParaViewは起動しますから、その後、[Apply]ボタンを押すと表示されます。
(その後Skip Zero Timeをチェックして再度Applyボタンで0秒時の形状も読み込まれます。)
単なる直方体しか表示されない場合は、透明度を変えると中身が見えると思います。
Opecityを0.3くらいで見えると思います。マウス左クリックしながらドラッグして表示モデルを回転させて確認しましょう。
初期読み込み時はp(気圧)が表示されていると思いますが、T(温度)やU(流速)などに切り替えることもできます。
2次元で見たほうが見やすい場合もあります。
再生ボタンで状態が変わることを確認できます。
Sliceのアイコンがありますから、それを押して[Y Normal]ボタンを押してからApplyすると2次元に切り取られます。
+Y軸アイコンあたりをクリックすると見やすいと思います。
Show Planeチェックを外すと視点の回転はやりやすいです。
さて、本システムでは結果としてプロジェクトのフォルダ下にresultbox.csvおよびresultdoor.csvファイルが作成されます。
それをグラフ画像にして確認しますと分かりやすいです。
また、ParaViewでJPEG連番画像ファイルのエクスポートを行っておきますと、makemovie.pyでアニメーションMP4動画に変換できます。
こちらのチュートリアルのmakegraph.pyやmakemovie.pyの項目の通りで簡単です。
応用
.configファイルの例を示します。
simulationType等を変更しますと計算モデルが変わります。計算が収束しない場合や温度が下がり続ける場合などはこれらの設定変更で適切な値に落ち着く場合があります。
デフォルト設定は以下です。デフォルト設定を使用する場合はプロジェクト名.configファイルの作成は不要です。
rhoPimpleFoam
10.0
Pa
RAS
RAS { RASModel kEpsilon; turbulence on; printCoeffs on; }
bounded Gauss upwind
bounded Gauss upwind
10
2
level (0 1)
.configファイルを変更してどのような変化があるかを確認してみました。
1つのBOXを1つのDOORで気圧の低い外気と連結して気圧差による断熱膨張の空気の移動をシミュレーションしたサンプルです。
ParaViewで半透明で表示。外気へ抜けるドアがあるために外気のBOXを含めた計算領域全体が表示されます。

こちらが必要なファイルを圧縮したZIPファイルoneroom.zipのリンクです。解凍してご利用ください。
oneroomというフォルダ内にtest1,test2,test3,test4の4つのサブフォルダがあります。4種類の設定のサンプルです。
1つ目のサンプルの設定ファイル
rhoPimpleFoam
30.0
psi
RAS
RAS { RASModel kEpsilon; turbulence on; printCoeffs on; }
bounded Gauss upwind
bounded Gauss upwind
10
2
level (0 1)
ratioOfWTtoDTで30.0を指定してますので、dt時間(以下スクリプト内-dで指定した0.0001秒)で計算した30回ごとに結果を書き出すという指定です。
csvpressureunitでpsiを指定してますので、CSV出力の圧力単位がpsiとなります。モデル定義のXMLファイル(oneroom.xml)内でもunit="psi"を指定してます。
実行方法
cd /home/user/wcfd/oneroom/test1
./oneroom.sh
cdコマンドで絶対パスでtest1フォルダに移動してからスクリプトを実行してます。./という指定は作業フォルダでのファイル指定という意味です。
スクリプトを実行するだけでシミュレーション実行ができますが、実はこの計算は0.05秒付近でループを繰り返して収束しませんでしたのでCtrl+Cで中断しました。
oneroom.shのスクリプトの中身はこちらです。
#!/bin/bash
crazyeasysys -p oneroom -f oneroom.xml -t 0.3 -d 0.0001
0.3秒間のシミュレーションを指定してます。
気圧変化と温度変化のグラフです。
python ../../makegraph.py oneroom/resultbox.csv 4 --xlim -0.03 0.33
python ../../makegraph.py oneroom/resultbox.csv 5 --xlim -0.03 0.33
のようにしてグラフは作成してます。本システム付属アプリのmakegraph.pyにて作成しました。makgraph.pyが/home/user/wcfdに配置してある前提です。
付属アプリの詳細はこちらで説明があります。
../../というのは2階層上のフォルダのパス指定という意味です。中断したため、グラフ横軸の範囲を他と合わせるためにxlimを調整してます。
作成されたグラフ画像は以下です。
-60度以下に温度が下がり収束しませんでした。
2つ目のサンプルの設定ファイル
rhoPimpleFoam
30.0
psi
RAS
RAS { RASModel kEpsilon; turbulence on; printCoeffs on; }
Gauss linearUpwind grad(U)
Gauss linearUpwind grad(e)
10
2
level (0 1)
デフォルトのupwindよりもlinearUpwind gradのほうが精度が高いとされてます。
実行方法
cd /home/user/wcfd/oneroom/test2
./oneroom.sh
oneroom.shの内容は1つ目と同じです。(以下省略)
気圧変化と温度変化のグラフです。
python ../../makegraph.py oneroom/resultbox.csv 4
python ../../makegraph.py oneroom/resultbox.csv 5
のようにしてグラフは作成してます。
作成されたグラフ画像は以下です。
気圧が外気圧とほぼ同じになり、外気温よりも低い-43度あたりで収束しました。
3つ目のサンプルの設定ファイル
rhoPimpleFoam
30.0
psi
RAS
RAS { RASModel kEpsilon; turbulence on; printCoeffs on; }
Gauss limitedLinear 1
Gauss limitedLinear 1
10
2
level (0 1)
デフォルトのupwindよりもlimitedLinear 1のほうが精度が高いとされてます。
実行方法
cd /home/user/wcfd/oneroom/test3
./oneroom.sh
気圧変化と温度変化のグラフです。
4つ目のサンプルの設定ファイル
rhoPimpleFoam
30.0
psi
laminar
Gauss linearUpwind grad(U)
Gauss linearUpwind grad(e)
10
2
level (0 1)
laminar(層流)を指定してます。流体をひと繋がりの滑らかな層として計算します
デフォルトのRASは乱流の指定です。
実行方法
cd /home/user/wcfd/oneroom/test4
./oneroom.sh
気圧変化と温度変化のグラフです。
メッシュ関連の設定項目としましては、minRefinementCellsを小さく、nCellsBetweenLevelsとrefinementSurfacesを大きくすることでメッシュ分解を細かくします。
ただし、この設定よりもコマンドラインオプションの-mの値を小さくするほうが簡単です。
メッシュ数が多ければ計算時間が長くなります。
5
3
level (2 3)
本システムでは以下のファイル名のユーザー定義スクリプトを作業フォルダに配置しておくことでスクリプトを自動的に実行することが可能です。
・ userscriptbegin.sh 0秒のステップ開始前に実行されます。つまり、各種OpenFoamの設定ファイルが自動的に作成された後に1度だけ実行されます。
・ userscriptstepbegin.sh ステップ開始前に実行されます。結果書き出しタイミング間隔で毎回実行されます。
・ userscriptstepend.sh ステップ終了後に実行されます。結果書き出しタイミング間隔で毎回実行されます。
・ userscriptend.sh すべてのステップ終了後に1度だけ実行されます。
モデル定義のXMLファイルの応用としまして、ドアが破壊された場合に半壊にします。
破壊前のドアで空気を流さない値は1e10で、破壊後は空気を流す0がデフォルトなのですが、
resisitaneタグを記載して値を1e7とすることで破壊後に少しだけ空気を流すことができます。
1e6ですともう少し空気を流します。1e9ですともう少し空気を流しません。
何%流すかというのは差圧が関係するために算出することが難しいので分かりにくいですが、調整できることを知っておきましょう。
また以下の例ではenabletimeが1.0,2.0となってます。これはドア破壊判定の有効期間が1.0秒から2.0秒であることを意味してます。
有効期間外はドアは閉じている処理となります。enabletimeタグは1つの数値の場合は有効期間の開始時刻の意味となります。
2つの数値がカンマで区切られている場合は有効期間の開始時刻と終了時刻の意味となります。
room01,room02
4.0
1e7
1.0,2.0
28.0, -1.2, 3.1
28.0, -1.2, 4.6
28.0, 0.0, 4.6
28.0, 0.0, 3.1
31.2, -1.2, 3.1
31.2, -1.2, 4.6
31.2, 0.0, 4.6
31.2, 0.0, 3.1
2つのBOXを1つのDOORで連結して気圧差による空気の移動をシミュレーションしたサンプルです。
こちらが必要なファイルを圧縮したZIPファイルtworoomnormal.zipのリンクです。解凍してご利用ください。
tworoomnormal.shにはcrazyeasysysのコマンド文が記述されてますので、
./tworoomnormal.sh
と実行するだけでシミュレーション実行ができます。
./とは現在の作業フォルダのファイルを指定する表記です。../とすると一つ上のフォルダ内を指定する意味です。../../としますと2つ上のフォルダ内を指定する意味です。
結果から生成した画像と動画は以下となります。

tworoomnormalanimenormal_0.01x.mp4
動画はParaViewで連番JPEGを書き出したのちに本システム付属アプリのmakemovie.pyにて作成しました。
3つのBOXを2つのDOORで連結して気圧差による空気の移動をシミュレーションしたサンプルです。
こちらが必要なファイルを圧縮したZIPファイルthreeroom.zipのリンクです。解凍してご利用ください。
threeroom.shにはcrazyeasysysのコマンド文が記述されてますので、
./threeroom.sh
と実行するだけでシミュレーション実行ができます。
結果から生成した画像と動画と温度変化のグラフ画像は以下となります。グラフ画像は付属アプリのmakegraph.pyで作成しました。

threeroomanimethreeroom_0.01x.mp4

外気に風速を与えて円柱で遮る空気の移動をシミュレーションしたサンプルです。
半径8cmの円柱をモデリングしてます。
まず扇形を開始面、終了面とする6面体を作成して、回転後に複製を繰り返すことで円柱を作成。最後にスケール変更しました。
このような小さい形状はcrazyeasysys実行の際に-m 0.005のように小さいスケールを指定するとメッシュが潰れずにうまくいきます。
こちらが必要なファイルを圧縮したZIPファイルcylindersmall.zipのリンクです。解凍してご利用ください。
./cylindersmall.sh
と実行するだけでシミュレーション実行ができます。
結果から生成した画像は以下となります。
ParaView上でU(流速)を表示してます。3次元形状は点描画にして、それに2次元スライスを重ねてます。


エアコン冷気の移動をシミュレーションしたサンプルです。
BOX内部に冷気を吹きだすBOXをつくります。
type="room"の通常のroomに下記のようにisacc="yes"属性をついておきます
101325
12.0
5.0
10.0,0.0,0.0
そのroomに属するBOX(roomnameがこの例ですとacc01)からroomで定義している温度、風速で常に一定の空気が吹きだします。
こちらが必要なファイルを圧縮したZIPファイルaccroom.zipのリンクです。解凍してご利用ください。
./accroom.sh
と実行するだけでシミュレーション実行ができます。
結果から生成した画像は以下となります。
ParaView上でT(気温[単位ケルビン])をボリュームレンダリングをしてます。
参考に摂氏で表示するには、ParaViewのFiltersメニューでCalculatorを選択して、Result Array Nameに分かりやすい名称と、
その下の空欄にT-273.15と入れておくと摂氏表示にすることができます。このように計算式のフィルターで単位変更ができます。
ParaViewのColor Map Editorの"Enable Opacity Mapping For Surfaces"にチェックを入れて、
カラーマップのグラフを青色は不透明に赤色は透明に調整しますと、冷気が見やすく表示されます。

accroomanimeaccroom_0.5x.mp4
航空機で事故が起きた際の空気噴流のシミュレーション例
1985年の日航123便墜落事故の事故調査報告書での空気噴流計算を本システムの3次元解析で検証しました。
3次元流体シミュレーションでの日航123便空気噴流の解析