先日の、オープンCAE学会の合同勉強会にて話題のあった、chtMultiRegionFoam(固体と流体の熱連成解析)にて求めた固体の温度分布を使ってsolidDisplcementFoamにて固体の熱応力計算をようという試みにて、chtMultiRegionFoamは固体を複数の領域に分割して計算するので、これらを一つのメッシュにまとめる方法がわからない・・・という発表者の疑問に対して、「mergeMeshすればいいじゃん」と簡単にコメントしてしまいました。 ⇒勉強会を記録した動画の30分過ぎあたり
その後、実際に自分でもやってみたんですが、コマンドの使い方が少々違ってはいたものの確かにmergeMeshでメッシュは結合できる。しかし、計算した温度をマッピング(mapField)したり、複数の固体領域を結合(stitchMesh)したりの作業も必要。しかもこれら作業のひとつひとつを端末画面からいちいちキーボード入力しながらやっていたのでは大変な手間がかかってしまうことも判明。勉強会ではひとつの領域だけでこれらの作業イメージを紹介していましたが・・・
DEXCS十徳ナイフを使えばかなり手間が軽減されることも判ったのですが、それでも順番を間違えたりすると、意図したようになってはなってくれませんでした。そこでここにやり方を取りまとめておくこととしました。 ⇒ 十徳ナイフの(かなり高度な)使用例としても使えそうな例題になりました。
DEXCS十徳ナイフ起動画面
- ここでcaseボタンを押して、任意の名前(以下の場合デスクトップ上にmulti1)のフォルダを作成する。
- OpenFOAMのケースフォルダとして認識できない・・・などのエラーメッセージが表示されるが、この時点では問題ない。
テンプレートケースの選択・変更
にて実行ボタンを押すと、caseフォルダの選択画面が現れるので、
tutorials/heatTransfer/chtMultiRegionFoam/multiRegionHeater
を選択する。その後、ダイヤログがいくつか出てくるが、
において、「はい」を押して、メッシュデータも変更しておく。
ファイルマネージャの画面では、以下のようになるはず。
端末画面から、Allrunコマンドを入力し、計算を走らせる
固体部分のメッシュをマージする
計算が終了したら、以下のコマンドを入力する。
mergeMeshes -masterRegion heater -addRegion leftSolid . . mergeMeshes -masterRegion heater -addRegion rightSolid . .
これにて固体部分(heater, leftSolid, rightSolid)のメッシュがマージされたことになる。
時刻フォルダ100.002 の下に出来たpolyMeshフォルダが固体部分(heater + leftSolid + rightSolid)をマージしたメッシュファイルになっている。但し、領域間の境界にはパッチが残ったままなので、このままでは計算できないので、stitchMeshコマンドを使って領域を結合する必要があるが、その前に各領域の温度データをマッピングする。
熱応力計算用に新たにcaseフォルダ(solid)を作成
テンプレートケースの選択・変更
実行ボタンを押して・・・
tutorials/stressAnalysis/solidDisplacementFoam/plateHole
を選択する。 なおこの場合、メッシュデータの変更は、してもしなくても、どちらでも良い。
引き続き、
メッシュデータの選択・変更
実行ボタンを押して、先にmergeMeshコマンドにて作成したメッシュを選択する
チュートリアルケースからコピーしたモデルと上のメッシュは当然境界の名前が異なっているので、まずは・・・
patch名の一括整合
しかし、実行ボタンを押すと、何やらエラーメッセージが出てくる。
-
Error in /usr/local/bin/pyFoamCreateBoundaryPatches.py : PyFoam FATAL ERROR on line 971 of file /usr/local/lib/python2.6/dist-packages/PyFoam/ThirdParty/ply/yacc.py: Can not parse binary files. It is not implemented
- binaryファイルがなんたら書いてあって、実はこんなエラーは初体験。原因探しにかなりアレコレやりましたが、なんのこともなく、境界条件(boundary)に該当部分がありました。
初期条件の一括参照・変更
実行ボタンを押すと、以下でてくる
boundary 11行目に binaryの記述があるので、これをasciiに変更して保存。
再度、patch名の一括変更
今度は成功する(はず)
再度、初期条件の一括参照・変更
このままでも先へ進めないこともないが、初期条件データを入れておかないと、後でマッピングする際にエラーになるので、
フィールドデータのマッピング
まずは、mapFieldDict を用意せねばならないが、普通はすぐ出てくるところには置いていないであろう。ゼロから作るのも大変です。こういう時にDEXCS十徳ナイフの「検索」メニューが役立ちます。
mapFieldをキーワードにして検索すると、いくつか出てきました。
適当に選んでダブルクリックして開きます。
これを別名で保存して、caseフォルダ(solid)の下、systemフォルダに収納してやれば良いのです。
あとは必要事項を書きこむ。具体的には、cuttingPatchesのセクションに使用しているpatchの名前をすべて記入しておくだけです。このpatchの名前もいちいちキーボード入力していたらミスタイプもあり得るので、マルチタブで開いている隣のboudaryファイルからコピペするのが簡単でしょう。
固体部分の温度データをマッピング
mapFieldDictが準備できたら、以下のコマンドを入力する。
mapFields -sourceRegion heater -sourceTime 100 ../multi1 mapFields -sourceRegion leftSolid -sourceTime 100 ../multi1 mapFields -sourceRegion rightSolid -sourceTime 100 ../multi1
これで、固体部分の温度データをすべてマッピングできたことになる。
stichMeshコマンドで3つの領域を結合する
stitchMesh -perfect heater_to_rightSolid rightSolid_to_heater -overwrite stitchMesh -perfect heater_to_leftSolid leftSolid_to_heater -overwrite
constデータの一括参照・変更
mechanicalProperties
24行目: planeStress
yes ⇒ no に変更
hermalProperties
24行目: thermalStress
no ⇒ yes に変更
いよいよソルバーの実行
そうは簡単に進まない・・・
-
--> FOAM FATAL IO ERROR: Unknown patchField type directMappedWall for patch type directMappedWall
directMappedWall という境界条件は使えないということのようですが、これはmapFieldを実行した時に自動的につけられた境界条件タイプでしかありません・
初期条件の一括参照・変更
- min* の部分はすべて変位拘束(5箇所)
type fixedValue; value uniform(0 0 0);
- それ以外の部分(10箇所)は、
type zeroGradient; value uniform(0 0 0);
に変更
再度、ソルバーの実行
T(温度)についても同じ変更が必要
directMappedWall ⇒ fixedValue に変更(10箇所)
再々度、ソルバーの実行
--> FOAM FATAL IO ERROR: keyword ddt(T) is undefined in dictionary "/home/dexcs/Desktop/solid/system/fvSchemes::ddtSchemes"
systemデータの一括参照・変更
再々々度、ソルバーの実行
- ようやく計算が動いた!