再メッシュ切りについて

912 views
Skip to first unread message

Yamazaki Takashi

unread,
Jan 13, 2016, 4:36:03 AM1/13/16
to OpenFOAM

お世話になっております。
今回、幾つか質問があり投稿させていただきます。


OpenFOAMので解析を行っているのですが、
計算を開始し、ある時間になった時に再度メッシュ切りを行い、その前の流体の状態を維持したまま計算を再開したいのですが、
OpenFOAMでこのような操作は可能なのでしょうか?

また、もしそのような方法がないのであれば、
拡張版のfoam-extendに搭載されているlaplaceのlaplaceFaceDecompositionというソルバでstlファイルで定義したメッシュを変形させたいのですが、
を参考にしても、dynamicMeshDictなどの設定ファイルの書き方がイマイチ理解できません。
(英語力に難ありな部分があると思いますが)
もし使用したことのある方がいらっしゃれば、教えていたたけないでしょうか?


よろしくお願いします。

Fumiya Nozaki

unread,
Jan 13, 2016, 10:20:07 AM1/13/16
to open...@googlegroups.com
移動境界 (Dynamic Mesh) の機能を使用してメッシュの変形を行い、
破綻してしまった場合のご質問と想定し回答致します。
経験があるのは以下のような方法です。

■ボリュームメッシュが破綻した場合
①surfaceMeshTriangulateを使用して、変形後のサーフェスメッシュからSTLを生成
②リメッシュ
③mapFieldsを使用して、データのマッピング

dynamicMeshDictの書式については、名前にDyMが付いているソルバーの
チュートリアルをご参照ください。

もっとスマートな方法があるかもしれませんが、
1つの方法としてご紹介致しました。

野崎

2016年1月13日 18:36 Yamazaki Takashi <taaaaa...@gmail.com>:

--
このメールは Google グループのグループ「OpenFOAM」に登録しているユーザーに送られています。
このグループから退会し、グループからのメールの配信を停止するには openfoam+u...@googlegroups.com にメールを送信してください。
このグループに投稿するには open...@googlegroups.com にメールを送信してください。
https://groups.google.com/group/openfoam からこのグループにアクセスしてください。
その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。

Yamazaki Takashi

unread,
Jan 13, 2016, 9:00:03 PM1/13/16
to OpenFOAM
野崎さん
返信ありがとうございます!

おっしゃった通りの状況です。説明の補足ありがとうございます。

surfaceMeshTriangulateというのはsystem以下に制御ファイルは必要なのでしょうか?
また、ボリュームメッシュの破綻前にあらかじめ時間を指定しておいて、動作させることは可能なのでしょうか?

dynamicMeshDictについて
dynamicmotionfvMeshのvelocitylaplacianなどについてはチュートリアルを確認して、理解しているつもりなのですが、
チュートリアルのsurfacetracking下にdynamicmotionfvMeshのlaplace(1つ目の投稿では少し間違えて書いてしまいました)というメッシュの動きの定義を行っているチュートリアルがあります。
それぞれ、dynamicMeshDictと0ディレクトリにあるmotionUでメッシュの動きを定義していると思うのですが、どのようなパラメータがあり、それをどのように設定するのかが調べても理解できていません。
でももしリメッシュが可能でしたら、その方法で大丈夫だと思います!

長々とすいません。
surfaceMeshTriangulateについてだけでも教えていただけないでしょうか?

2016年1月14日木曜日 0時20分07秒 UTC+9 nozaki:

Fumiya Nozaki

unread,
Jan 14, 2016, 7:17:38 AM1/14/16
to open...@googlegroups.com
surfaceMeshTriangulate の実行には、設定ファイルは必要ありません。
OpenFOAMのユーティリティは、-help オプションを指定して実行することで、
使用方法が標準出力されます。

$ surfaceMeshTriangulate -help

まずは、こちらの情報を参考に実際にコマンドを実行してみてください。
やってみて具体的なご不明点があれば、ご質問ください。

スクリプトを作成すれば、自動化も可能かもしれませんが、
まずは、非定常計算結果のディレクトリを保存しておいて、
手動で実行されてはいかがでしょうか。

野崎

2016年1月14日 11:00 Yamazaki Takashi <taaaaa...@gmail.com>:

Yamazaki Takashi

unread,
Jan 14, 2016, 11:53:58 PM1/14/16
to OpenFOAM
ありがとうございます!
-helpオプションを参考に実行してみます。

少し話は変わるのですが、
mapFieldsで計算結果を引き継いだときに引き継いだデータを格納した0ディレクトリに-nanという値が
入ってしまい、計算が開始されない状況になっています。
-nanは浮動小数点演算例外を起こした時の値だと認識しているのですが、
元の計算結果に-nanは存在していません。
mapfieldsの使い方が悪いのでしょうか?

testmappreとtestmapのディレクトリを用意し、
testmappreの計算結果を
$ mapFields ./testmappre/ -sourceTime latestTime -case ./testmap
でtestmapに引き継いでいるつもりです。

また、使用しているソルバはpimpleDyMFoamで、velocityLaplacianを使用してメッシュを移動させています。


よろしくお願いします。



2016年1月14日木曜日 21時17分38秒 UTC+9 nozaki:

Yamazaki Takashi

unread,
Jan 15, 2016, 5:00:31 AM1/15/16
to OpenFOAM
野崎さん

連投申し訳ありません。
先ほどの問題はsurfaceMeshTriangulateを行わずにmapFieldsを行った場合に起こったのですが、

今度はsurfaceMeshTriangulateを行った後にmapFieldsを行うと、

$ mapFields ../testmap   -sourceTime latestTime


/*---------------------------------------------------------------------------*\

| =========                 |                                                 |

| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |

|  \\    /   O peration     | Version:  2.4.0                                 |

|   \\  /    A nd           | Web:      www.OpenFOAM.org                      |

|    \\/     M anipulation  |                                                 |

\*---------------------------------------------------------------------------*/

Build  : 2.4.0-dcea1e13ff76

Exec   : mapFields ../testmap -sourceTime latestTime

Date   : Jan 15 2016

Time   : 18:42:34

Host   : "helium"

PID    : 20429

Case   : /net/proton/srv/home/tyamazaki/testmap2

nProcs : 1

sigFpe : Enabling floating point exception trapping (FOAM_SIGFPE).

fileModificationChecking : Monitoring run-time modified files using timeStampMaster

allowSystemOperations : Allowing user-supplied system call operations


// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

Source: ".." "testmap"

Target: "/net/proton/srv/home/tyamazaki" "testmap2"


Create databases as time

Case   : ../testmap

nProcs : 1


Source time: 0.0001

Target time: 0


Create meshes


Source mesh size: 39385 Target mesh size: 39333



Creating and mapping fields for time 0.0001


Creating mesh-to-mesh addressing for region0 and region0 regions using cellVolumeWeight

    Overlap volume: 39516.91347

    interpolating nut

#0  Foam::error::printStack(Foam::Ostream&) in "/opt/OpenFOAM/OpenFOAM-2.4.0/platforms/linux64Gcc48DPOpt/lib/libOpenFOAM.so"

#1  Foam::sigSegv::sigHandler(int) in "/opt/OpenFOAM/OpenFOAM-2.4.0/platforms/linux64Gcc48DPOpt/lib/libOpenFOAM.so"

#2  ? in "/lib64/libc.so.6"

#3  ? in "/opt/OpenFOAM/OpenFOAM-2.4.0/platforms/linux64Gcc48DPOpt/bin/mapFields"

#4  ? in "/opt/OpenFOAM/OpenFOAM-2.4.0/platforms/linux64Gcc48DPOpt/bin/mapFields"

#5  ? in "/opt/OpenFOAM/OpenFOAM-2.4.0/platforms/linux64Gcc48DPOpt/bin/mapFields"

#6  ? in "/opt/OpenFOAM/OpenFOAM-2.4.0/platforms/linux64Gcc48DPOpt/bin/mapFields"

#7  ? in "/opt/OpenFOAM/OpenFOAM-2.4.0/platforms/linux64Gcc48DPOpt/bin/mapFields"

#8  ? in "/opt/OpenFOAM/OpenFOAM-2.4.0/platforms/linux64Gcc48DPOpt/bin/mapFields"

#9  __libc_start_main in "/lib64/libc.so.6"

#10  ? in "/opt/OpenFOAM/OpenFOAM-2.4.0/platforms/linux64Gcc48DPOpt/bin/mapFields"

セグメンテーション違反です


このようにセグメンテーション違反を起こしてしまいます。

stlの面が多すぎたりすると起こってしまったりするのでしょうか?



現在行っている操作の手順は

testmapとtestmap2を用意し、

testmapで

blockMesh

surfaceFeatureExtract

snappyhexMesh -overwrite

を行い、pimpleDyMFoamを実行

破綻する前に計算を止めて、surfaceMeshTriangulateを実行
生成されたstlファイルをtestmap/constant/trisurfaceにコピー

testmapで

blockMesh

surfaceFeatureExtract

snappyhexMesh -overwrite

を行い、mapFields ../testmap   -sourceTime latestTime
を実行しています。

初めの計算で使用しているstlファイルは481面のメッシュデータです。

よろしくお願いします。





2016年1月14日木曜日 21時17分38秒 UTC+9 nozaki:
surfaceMeshTriangulate の実行には、設定ファイルは必要ありません。

Fumiya Nozaki

unread,
Jan 15, 2016, 10:15:43 AM1/15/16
to open...@googlegroups.com
surfaceMeshTriangulate により生成された STL と破綻前のメッシュを
一緒に可視化してみて、(初期時刻ではなくて) 意図した時刻のメッシュから
STL が生成されている (形状的に重なっている) でしょうか?

もし、上記の点に問題ない場合には、次の点をチェックされたらよろしいと思います。

1) 境界の数と名前が一致していることを確認
  testmap と testmap2 の boundary ファイルを見て、
  両方で境界の数と名前が一致していることを確認します
2) 境界条件が一致していることを確認
  testmap2 の0ディレクトリに設置している変数ファイルが、
  testmap の0ディレクトリに設置したファイルと一緒かどうか確認します
3) 上記の2点が共にOKでしたら、mapFields を -consistent オプションを指定して

野崎

2016年1月15日 19:00 Yamazaki Takashi <taaaaa...@gmail.com>:

Yamazaki Takashi

unread,
Jan 16, 2016, 12:32:54 AM1/16/16
to OpenFOAM
生成された STL と破綻前のメッシュをParaviewで一緒に可視化してみました。
すると、初期状態のメッシュと生成されたSTLデータがの形状が一致しました。
dynamicMeshで計算中に境界面の移動は行えてはいる様ですが、
velocityLaplacianで普通ならば破綻するものを無理やり移動させているためなのでしょうか?

aが初期状態のメッシュ、bがdynamicMeshを使って境界を移動させたもの、cがsurfaceMeshTriangulate で生成したメッシュと初期状態のメッシュを重ねたものとなっています。



2016年1月16日土曜日 0時15分43秒 UTC+9 nozaki:
c.png
b.png
a.png

Fumiya Nozaki

unread,
Jan 16, 2016, 1:00:48 AM1/16/16
to open...@googlegroups.com
surfaceMeshTriangulate ユーティリティは、時刻を指定して実行できないので、
constant/polyMesh ディレクトリに設置してある初期状態のメッシュのデータから
stl ファイルが生成されていると思います。

変形後のメッシュから stl を生成するためには、
時間ディレクトリ/polyMesh/points ファイルを constant/polyMesh/ にコピーしてから、
surfaceMeshTriangulate を実行する必要があります。

上記の操作で、元々の constant/polyMesh/points ファイルを上書きしてしまわないように、
一時的に別名で保存するなどご注意ください。
ケース自体をコピーして、操作されるのが安心だと思います。

野崎

2016年1月16日 14:32 Yamazaki Takashi <taaaaa...@gmail.com>:
Message has been deleted

Yamazaki Takashi

unread,
Jan 16, 2016, 3:05:06 AM1/16/16
to OpenFOAM
教えていただいた方法で変形後のSTLデータを生成することができました。
ありがとうございます。
しかし、別のケース(生成したSTLデータを使用)にマッピングするときに境界パッチ名が変更されており、
マッピングできませんでした。

初期メッシュのSTLファイル"B.stl"のsolid名を"AAA"とすると、
snappyHexMeshを実行したときのboundaryファイルの境界パッチ名が"B_AAA"となってしまい、
surfaceMeshTriangulate で作成したSTLファイルのsolid名が"B_AAA"と定義されることが原因だと思います。

マッピングを一度行うだけでしたらmapFielsDictの設定で対処できるかと思うのですが、
数回繰り返し行いたいと思っているのでそれでは難しそうです。

それで少し調べたのですが、snappyHexMeshの後でcreateFieldを毎度行うことで境界パッチ名を"AAA"と
変更し続ければマッピングが可能であると考えたのですが、どうでしょうか?
ご意見お願い致します。


2016年1月16日土曜日 15時00分48秒 UTC+9 nozaki:

Fumiya Nozaki

unread,
Jan 16, 2016, 5:51:01 AM1/16/16
to open...@googlegroups.com
生成した STL ファイルの solid 名を B_AAA から AAA に
変更するのはいかがでしょうか(初期STLファイル名_ を削除)?

置き換えコマンドの sed を使用すれば、可能だと思います。

野崎

2016年1月16日 17:05 Yamazaki Takashi <taaaaa...@gmail.com>:

Yamazaki Takashi

unread,
Jan 16, 2016, 7:47:23 AM1/16/16
to OpenFOAM
ありがとうございます!
その方法でmapFieldsの実行ができました。
また、20ステップ中18ステップで破綻していた計算が10ステップ×2で計算可能になりました。
トータル4000ステップを行う予定ですがこの繰り返しなのでなんとかなるように思います!

さらに質問がありまして、よろしければお願いいたします。
table入力などによって時間によって境界条件値を与える方法は調べたのですが、
それを初めの初期境界条件条件として与えると、
その初期に与えた条件を加味して次のケースにマッピングされていくのでしょうか?




2016年1月16日土曜日 19時51分01秒 UTC+9 nozaki:

Fumiya Nozaki

unread,
Jan 16, 2016, 9:32:52 AM1/16/16
to open...@googlegroups.com
mapFields は、単に解をマッピング (射影) しているだけという点にご注意ください。
計算が上手く流れるようになったら、もっと良い dynamicMeshDict の設定がないか
ご検討されると良いかもしれません。

ご指摘の境界値のマッピングは、重要なポイントだと思います。
実際に結果をご確認されるとよろしいと思います。

以前のご質問も拝見しましたが、とても興味深い計算だと思います。
実際にやってみて、また具体的なご質問があれば、ご投稿ください。

野崎

2016年1月16日 21:47 Yamazaki Takashi <taaaaa...@gmail.com>:

Yamazaki Takashi

unread,
Jan 17, 2016, 12:09:30 AM1/17/16
to OpenFOAM
ありがとうございます!
以前も返信していただいたようで、何度もお世話になりありがとうがざいます。
拡張版のfoam-extendのlaplaceを用いてメッシュの移動を定義できればと思ったのですが、
使い方がよくわからず、現在のvelocityLaplacianで計算を行っている次第です。
余裕ができましたら、dynamicMeshDict の設定についてもしっかり調べていきます!


なるほど、では条件を変えて結果を比較してみようと思います。
ちなみに、
inflowを速度ディレクレ条件,圧力ノイマン0条件
outflowを速度outletInlet (outletvalue 0) 圧力ノイマン0条件
で計算したのですが、

--> FOAM FATAL ERROR: 

Continuity error cannot be removed by adjusting the outflow.

Please check the velocity boundary conditions and/or run potentialFoam to initialise the outflow.

Total flux              : 4162881.91

Specified mass inflow   : 398513.7613

Specified mass outflow  : 281660.1161

Adjustable mass outflow : 0


というエラーが吐き出されました。

メッシュの移動で解析領域は広がるように定義したのですが、

この場合もoutflowを定義しないといけないのでしょうか?

outflowをwallとして計算しましたが、同じ結果となりました。


よろしくお願いします。



2016年1月16日土曜日 23時32分52秒 UTC+9 nozaki:

Fumiya Nozaki

unread,
Jan 18, 2016, 10:00:41 AM1/18/16
to open...@googlegroups.com
どの境界でも圧力の値を規定していない場合に、
計算領域に流入出する流量のバランスが取れないと、
このエラーメッセージが表示されます。
ソースコード: src/finiteVolume/cfdTools/general/adjustPhi/adjustPhi.C

境界条件の設定の見直しが必要だと思います。

野崎

2016年1月17日 14:09 Yamazaki Takashi <taaaaa...@gmail.com>:

Yamazaki Takashi

unread,
Jan 18, 2016, 10:48:26 AM1/18/16
to OpenFOAM

なるほど、OpenFOAMに搭載されている境界条件の性質についてもしっかり確認が必要なようですね。
実現したい状況は、以前の私の投稿(時間変化するメッシュの定義について)の部分で少し説明しましたが、
時間的に変形する袋状の形状の中の非定常流体の問題で、
領域内の体積の変化によって流入、流出の条件を決めたいのです。

具体的には、出入り口のpatchは一つで、
流入する場合は速度圧力共にメッシュを変形させて拡大した体積に依存する形で定義
流出する場合は、メッシュを変形させて上がった袋の内圧が一定値(P)を超えた場合、Pとの差圧によって速度が決まり、流出をする
というものです。

もしこのような場合の境界条件の設定について思い当たるものがあればアドバイスをお願いしたいです。

長期に渡り質問ばかりで申しわけありませんが、どうかよろしくお願い致します。


2016年1月19日火曜日 0時00分41秒 UTC+9 nozaki:

Yamazaki Takashi

unread,
Jan 19, 2016, 3:23:12 AM1/19/16
to OpenFOAM
間違えました。patch数は流入用、流出用の二つで考えています。
しかし、流出しているときは流入口はwallで定義し、
その逆も考えています。

よろしければ新しくスレッドを立てましたので目を等していただけたらと思います。
よろしくお願いいたします。




2016年1月19日火曜日 0時48分26秒 UTC+9 Yamazaki Takashi:
Reply all
Reply to author
Forward
0 new messages