snappyHexMeshを利用してOpenFOAMモデル作成について

2,675 views
Skip to first unread message

sach1o

unread,
Jul 14, 2012, 10:07:15 AM7/14/12
to open...@googlegroups.com
はじめまして、sach1oと申します。

WindowsのOpenFOAM 1.7のバイナリ版を導入して、
サーバルームの定常熱流体解析を行いたいと考えております。

初心者なりにいろいろと調べてみて、
buoyantBoussinesqSimpleFoamを利用すればよいということがわかったのですが、
モデルの作成方法について質問があります。

形状を別アプリでモデリングし、ASCII stl形式で出力した後、
snappyHexMeshを利用してOpenFOAMモデル(直交格子)を作成しようと考えてます。

モデル化方針は以下の通りです。

 [1]部屋を1つの直方体で表現(室内に8つのサーバラックと1つの空調(inlet/outlet)を設置)
 [2]サーバラックの筐体(全体形状)は、1つの直方体としてモデル化(添付の画像)
   [2.1]内部に発熱体を設置 (オレンジ色の直方体)
   [2.2]吸気口を直方体の面上に設置(青色の板)
   [2.3]排気口(ファン)を吸気口と対面上に設置(黄緑色の板)

この場合のモデル作成について、質問です。(添付のzipファイルがラックのstlファイルです)

 [Q1]サーバラック筐体の形状は単なる直方体で大丈夫なのでしょうか?
   それとも、[2.2]、[2.3]の吸気口、排気口の位置に穴が開くように
   モデリングしないといけないのでしょうか。
   (2形状が重なる部分はどのようになるのでしょうか。)
 [Q2]サーバラックを隙間のないように横に並べた場合
   サーバラック同士の面が重ってしまいますが、
   これは問題ないのでしょうか
 [Q3]snappyHexMeshでメッシュを直交格子に限定する方法はありますでしょうか。
 [Q4]snappyHexMeshでモデル生成後の境界条件の設定は、
   テキスト編集で行うのでしょうか?
   なにか定番の方法があるようでしたら教えてください。

このあたりもちろん自分で試してみればわかるのでしょうが、
形状作成にいかんせん時間がかかるので、
先にご存じの方がいらっしゃたら情報を教えていただけたらと思います。

ServerRack.png
ServerRack.zip

ohbuchi

unread,
Jul 14, 2012, 9:19:59 PM7/14/12
to OpenFOAM
[Q1]境界条件を指定するパッチごとにSTLを作成して下さい
[Q2]ラック同士が密接する場合はバッフル境界で仕切ることが可能だと思います
[Q3]ベースメッシュがSTLファセットでカットされなければスナップしませんが
 6面体が必要ならblockMeshを使った方が良いでしょう
[Q4]boundaryファイルは生成されますが、エディタによる修正は必須です

まずはユーザガイド(オープンCAE学会に和訳版があります)を参照し、
チュートリアルを試して動作確認することをおすすめします。
このグループの過去ログにもsnappy関連のスレッドが多数あります。
> ServerRack.png
> 29KViewDownload
>
> ServerRack.zip
> 1KViewDownload

sach1o

unread,
Jul 15, 2012, 8:48:47 AM7/15/12
to open...@googlegroups.com
ohbuchi様、回答ありがとうございます。

>[Q1]境界条件を指定するパッチごとにSTLを作成して下さい

やはりそうなのですね。
小さい単位に分割して平面単位でモデル化するようにしたいと思います。

> [Q3]ベースメッシュがSTLファセットでカットされなければスナップしませんが
> 6面体が必要ならblockMeshを使った方が良いでしょう

ベースメッシュがSTLファセットでカットされるとはどう意味でしょうか。

また、それと私の調査不足なのかもしれませんが、
blockMeshで形状をstl形式のファイルで指定することが可能なのでしょうか。
それとも直交格子モデルを生成したい場合には
stl→blockMesh形式に変換するようなスクリプトを書く方が適切ということでしょうか。

質問ばかりで大変申し訳ありませんが、
回答是非お願いいたします。

一応私なりにチュートリアルは動作させてみて、基本的な動作は確認しました。
色々と調査と試行錯誤をしながらという感じになりそうですね。


2012年7月14日土曜日 23時07分15秒 UTC+9 sach1o:

ohbuchi

unread,
Jul 15, 2012, 8:43:18 PM7/15/12
to OpenFOAM
ユーザガイドを見ればわかることですが、snappyHexMeshはベースとなる直交メッシュ
をSTLの三角パッチが交差する部分で再分割およびスナップすることで自動生成する
非構造メッシュ生成ツールです。STL形状がベースメッシュを横切らなければスナップ
しないので6面体セルが維持されますが、snappyHexMeshの本来の使い方ではない
と思います。

blockMeshはブロック構造格子用のメッシュ生成ツールです。STLではなく、直線、円弧
スプラインでエッジを、4つのエッジからフェースを、6つのフェースからブロックをと、
順に定義することで形状を作る必要があります。
今回のキャビネットならblockMeshでも十分に扱えるとおもいます。
テキストエディタで定義するのが大変なら、BlenderプラグインのSwiftBlockという
ツールもあります。
 http://mogura7.zenno.info/~et/wordpress/ocse/?p=500

フリーのメッシュ生成ツールで非構造ヘキサを自動生成できるものはないと思います。
市販メッシャを含めてもHexProやCubitなど限られたメッシャぐらいではないでしょうか?

sach1o

unread,
Jul 15, 2012, 9:50:33 PM7/15/12
to open...@googlegroups.com
いろいろと情報、アドバイスありがとうございます。

SwiftBlockも直交格子を作成するのには向かないようですので、
(修正が必要とあり、現状の私の技術では厳しそうなので)
まずは勉強もかねて自作でstl各部品のバウンディングボックスの頂点を抽出し、
blockMeshDictを作成してみようと思います。

blockMeshで直交格子を作成する場合は、
ざっくりと言ってhexの集合でラフな直交格子を作成するればよいと理解しておるのですが、
こちらの理解であっておりますでしょうか。

2012年7月16日月曜日 9時43分18秒 UTC+9 ohbuchi:

sach1o

unread,
Jul 17, 2012, 1:48:35 PM7/17/12
to open...@googlegroups.com
まずは第一歩として、いろいろ調査しながら
解析空間にトンネル上の物体とその出口にファン(流速一定)が設置された
モデル(1個のサーバ相当)を作成するようにblockMeshDictを作成しています。

トンネル上の物体(壁)の設置と解析領域のInlet/Outletに関してはうまく設定できたのですが、
解析領域内部で境界条件を指定するためのパッチ?の生成方法がわかりません。

下記[1][2]については、現状私が自力で解決できませんでした。
こちらの解決方法をご存じであればご教示いただけないでしょうか。

[1] パッチ(面)ではなく有限体積の領域に境界条件を指定する方法
   ・トンネル内部に発熱条件を設定したいと考えております

[2] 解析領域内部に境界条件を指定するためのパッチを定義する方法
   ・上記のようにトンネル出口で流速をしていたいと考えております。
   ・この部分にパッチを定義しようとすると、
    解析領域内部の面なので定義できないとの趣旨の下記のエラーが出ます。

-- 以下、blockMeshの出力
Reading block mesh description dictionary

Creating block mesh

Creating blockCorners

Creating curved edges

Creating blocks

Creating patches

Creating block mesh topology

Default patch type set to empty


Trying to specify a boundary face 4(72 77 107 102) on the face on cell 47 which
is either an internal face or already belongs to some other patch.  This is face
 0 of patch 8 named subX1.

--

念のため、blockMeshDictを含むケースファイルをzipファイルとして添付しておきます。
(blockMeshDictが長くなっているためここに直接書くのは避けました)

なお、添付ファイル中のblockMeshDictでは、
私が流速指定したかった部分(subX1)のブロック(hex)の定義行をコメントアウトしてあります。
(結果的に実行するとその部分は壁になってしまっている)


2012年7月14日土曜日 23時07分15秒 UTC+9 sach1o:
model.png
3D_flow_obs.zip

ohbuchi

unread,
Jul 17, 2012, 4:57:09 PM7/17/12
to OpenFOAM
熱源を設定する方法は、過去ログ下記ページの今野先生の投稿にプレゼン資料が
リンクされていますので、それを参照下さい。
https://groups.google.com/group/openfoam/browse_thread/thread/65c5b8185be8e430

内部面のパッチ定義は、topoSetで内部フェースをfaceZoneに設定してから
createBafflesユーティリティを使うことでパッチに変換することができます。
> model.png
> 1049KViewDownload
>
> 3D_flow_obs.zip
> 1830KViewDownload

sach1o

unread,
Jul 18, 2012, 2:24:34 AM7/18/12
to open...@googlegroups.com
ohbuchi様回答ありがとうございます。

> 内部面のパッチ定義は、topoSetで内部フェースをfaceZoneに設定してから
> createBafflesユーティリティを使うことでパッチに変換することができます。

教えていただいた方法で内部パッチを定義できることを確認しました。
実際には、setSetユーティリティでfaceZoneを設定→createBafflesでパッチ変換を行いました。
これから熱源の定義もやってみたいと思います。


2012年7月18日水曜日 5時57分09秒 UTC+9 ohbuchi:
Message has been deleted

sach1o

unread,
Jul 19, 2012, 9:37:32 AM7/19/12
to open...@googlegroups.com
重ね重ねの質問申し訳ございません。
発熱条件の指定へ進む前に
解析領域内部の有限体積の領域に境界条件を指定する方法が
わからず困っております。

5x5x5[m]の部屋(inlet/outletあり)の中央に固定温度の領域があったときの
定常状態の計算を行おうとしているのですが、
部屋の中央の固定温度の領域で温度が指定されません。

解析領域内部の有限体積の領域に境界条件を指定する方法が
どうも根本的に誤っているのではと思い始めました。

この問題について、どなたが解決策をご教示いただけないでしょうか。

念のためケースファイルを添付させていただきます。

###-- 実行コマンド
blockMesh -case 3D_thermoflow
setSet -case 3D_thermoflow -batch 3D_thermoflow\setSetBatch-subHeatSource.txt
createBaffles subHeatSource-Zone subHeatSource -case 3D_thermoflow -overwrite
(境界条件の設定)
buoyantBoussinesqSimpleFoam -case 3D_thermoflow


#####-- 0/U
dimensions      [0 1 -1 0 0 0 0];

internalField   uniform (0 0 0);

boundaryField
{
    inlet
    {
        type    fixedValue;
        value    uniform (2 0 0);
    }
    outlet
    {
        type    inletOutlet;
        inletValue    uniform (2 0 0);
        value    uniform (2 0 0);
    }
    X0
    {
        type    fixedValue;
        value    uniform (0 0 0);
    }
    Y0
    {
        type    fixedValue;
        value    uniform (0 0 0);
    }
    Z0
    {
        type    fixedValue;
        value    uniform (0 0 0);
    }
    X1
    {
        type    fixedValue;
        value    uniform (0 0 0);
    }
    Y1
    {
        type    fixedValue;
        value    uniform (0 0 0);
    }
    Z1
    {
        type    fixedValue;
        value    uniform (0 0 0);
    }
    subHeatSource
    {
        type    zeroGradient;
    }

}

#####-- 0/p_rgh
dimensions      [0 2 -2 0 0 0 0];

internalField   uniform 0;

boundaryField
{
    inlet
    {
        type    zeroGradient;
    }
    outlet
    {
        type    fixedValue;
        value    uniform 0;
    }
    X0
    {
        type    buoyantPressure;
        rho    rhok;
        value    uniform 0;
    }
    Y0
    {
        type    buoyantPressure;
        rho    rhok;
        value    uniform 0;
    }
    Z0
    {
        type    buoyantPressure;
        rho    rhok;
        value    uniform 0;
    }
    X1
    {
        type    buoyantPressure;
        rho    rhok;
        value    uniform 0;
    }
    Y1
    {
        type    buoyantPressure;
        rho    rhok;
        value    uniform 0;
    }
    Z1
    {
        type    buoyantPressure;
        rho    rhok;
        value    uniform 0;
    }
    subHeatSource
    {
        type    zeroGradient;
    }
}
#####-- 0/U
dimensions      [0 0 0 1 0 0 0];

internalField uniform 300;

boundaryField
{
    inlet
    {
        type            fixedValue;
        value           uniform 291;
    }
    outlet
    {
        type            zeroGradient;
    }
    X0
    {
        type            zeroGradient;
    }
    Y0
    {
        type            zeroGradient;
    }
    Z0
    {
        type            zeroGradient;
    }
    X1
    {
        type            zeroGradient;
    }
    Y1
    {
        type            zeroGradient;
    }
    Z1
    {
        type            zeroGradient;
    }
    subHeatSource
    {
        type            fixedValue;
        value           uniform 320;
    }
}


2012年7月18日水曜日 15時24分34秒 UTC+9 sach1o:
3D_thermoflow.zip

ohbuchi

unread,
Jul 21, 2012, 3:51:43 AM7/21/12
to OpenFOAM
polyMesh/boundaryを見ると、subHeatSourceのnFacesが0になっており
バッフルの生成がうまくいっていない様です。
paraviewでSetを表示させると一部歯抜けになっていますが、選択はされています。
しかし、BOXで選択したすべてのフェースが選ばれています。
おそらく上下左右の側壁のみを選択したいのではないでしょうか?
setSetのコマンドを各側面ごとに正しく選択できる様に座標値を選んで4回同じSet
にaddすれば良いと思います。

その上で、バッフルは内部面境界なので左右の面を別のパッチに指定しますので
 subHeatSource1, subHeatSource2
などと別の名前にしてboundary, 0/U,p_rgh,alphat,k,epsilon,nut,Tを修正します。
その後、
createBaffles -overwrite subHeatSource-Zone "(subHeatSource1
subHeatSource2)"
と入力することでバッフルの両面のパッチが登録されると思います。
なお、バッフル面のUの境界条件はfixedValue (0 0 0)だと思います。

以上、ご参考まで。
> >>https://groups.google.com/group/openfoam/browse_thread/thread/65c5b81...
> 3D_thermoflow.zip
> 111KViewDownload

sach1o

unread,
Jul 24, 2012, 9:09:36 AM7/24/12
to open...@googlegroups.com
返信が遅れてすみません。
ohbuchi様返信ありがとうございます。

教えていただいた方法ですと、厚さ0の壁が出来上がってしまいます。
私が試したかったのは下記の条件です。

[1] BOX内部の領域全体の温度を指定
[2] 流れに関しては特に指定しない

いろいろ試してみてはいるのですがうまくいきません
やはりなにか根本的になにか間違っているのでしょうか。

それと、createBaffles実行時にboundaryのFace数が0となっている場合は、
それまでの作業に問題あるという理解であっておりますでしょうか。


2012年7月21日土曜日 16時51分43秒 UTC+9 ohbuchi:

ohbuchi

unread,
Jul 25, 2012, 1:13:00 AM7/25/12
to open...@googlegroups.com
つまりBOX部分では、温度は指定値となり計算しないが、速度は通常通り計算するという
ことでしょうか?
これは、なかなか厄介です。熱エネルギーが保存しなくなってしまいます。
むしろBOX部を計算せず、その出入口を境界にしてしまった方が簡単だと思いますが、
BOX内の流速分布に関心があるのでしょうか?

BOX部にHeat Sourceを与え、温度は出たなりに計算するのであれば、今野先生の
資料の方法で可能だと思いますが。



2012年7月24日火曜日 22時09分36秒 UTC+9 sach1o:

sach1o

unread,
Jul 25, 2012, 2:37:25 AM7/25/12
to open...@googlegroups.com
誤解を与えてすみません。
モデル作成の練習として、そういう条件の与え方をしてみていただけで
本当に解きたい問題ではありません。

最終的にはHeatSourceとして設定することを目標にしております。
この場合は、BOX内の流れには興味はないので、BOX内を出入口を境界にしてしまった方が適格ですね。

実際に知りたかったことは、一般論としてBOXで囲んだ領域の物理量を指定する方法です。


2012年7月25日水曜日 14時13分00秒 UTC+9 ohbuchi:

E.Mogura

unread,
Aug 1, 2012, 5:59:55 AM8/1/12
to open...@googlegroups.com
E.Mogura です。

話をぶり返すようで申し訳ないですが、本ケースは
SwiftBlockを使ってモデル作成できる格好の題材かと思って、
「サーバールームの熱流れ解析」のケースサンプル
を作ってみました。(寸法関係は少々変更してありますが・・・)


ご参考まで。
本文中にも記しておきましたが、
Swiftモデルそのものは30分もあれば作成できてしまいます。



2012年7月16日月曜日 10時50分33秒 UTC+9 sach1o:

sach1o

unread,
Aug 1, 2012, 7:57:14 AM8/1/12
to open...@googlegroups.com
質問者のsach1oです。

E.Mogura様、非常に参考になります。ありがとうございます。
SwiftBlockを使用することで、Blenderで視覚的に確認しながらモデリングすることが可能なのですね。
現在多忙につきちょっとすぐに時間はとれないのですが、時間が空いた時に是非試させていただきます。

ちなみに記事中のサンプルケースがダウンロードできません。(リンクが誤っている?)
是非参考にしたいと思いますので、リンクを修正していただけると幸いです。


2012年8月1日水曜日 18時59分55秒 UTC+9 E.Mogura:

E.Mogura

unread,
Aug 1, 2012, 9:08:41 AM8/1/12
to open...@googlegroups.com
E.Mogura です。

失礼しました。
リンクを修正しておきました。

2012年8月1日 20:57 sach1o <sachio...@gmail.com>:
--
このメールは Google グループのグループ「OpenFOAM」の登録者に送られています。
このディスカッションをウェブ上で閲覧するには、https://groups.google.com/d/msg/openfoam/-/VDyiX1VgPxsJ にアクセスしてください。

このグループに投稿するには、open...@googlegroups.com にメールを送信してください。
このグループから退会するには、openfoam+u...@googlegroups.com にメールを送信してください。
詳細については、http://groups.google.com/group/openfoam?hl=ja からこのグループにアクセスしてください。

Reply all
Reply to author
Forward
0 new messages