DEXCS2021のリリースに向けて、各種チュートリアルの動作確認、マニュアルを制作中だが、この段階で発覚した機能不足(仕様の見落とし)点についてここに取り纏めておく。
patchタイプの指定
旧版のDEXCSマクロにおいては、パーツ毎に境界のタイプを指定する事が出来ていた。新版のDEXCSワークベンチでは、これに相当する設定箇所が無いので、特に何も指定しないままで放置してあった。その事を放念したまま各種チュートリアルの動作確認をしたのだが、これが原因で動作しないという事は無かった。
しかし、マニュアル作成の段階で、よくよく調べると、下図に示すように、
境界のタイプがすべて wall になってしまっていた。これまで赤矢印部は、当たり前のように、patch としていた箇所であった。patch でなくとも、wallでも問題なく計算できるという点には今更ながら「知らなんだー」なんであるが、かといって、このままでは、OpenFOAMの常識的に違和感有りと言わざる得ない。
ただ、今回作成したGUI画面上で、旧版マクロのように境界タイプを指定する事はアーキテクチャー的に無理なので、ここではデフォルトがpatchになるようにしておくのが無難。ただ境界層レイヤー指定のあるパーツはwallとしておくのは問題無いだろうという、ややいい加減な方針で取り組む事とした。
まず、以下のようにして、境界層レイヤーの数が1以上のパッチの数(patchNumber)と名前リスト(__patch__)を取得しておく。
__patch__ = []
for obj in doc.Objects:
if obj.ViewObject.Visibility:
if hasattr(obj, "Proxy") and isinstance(obj.Proxy, _CfdMeshRefinement):
if obj.NumberLayers > 1 :
for objList in(obj.LinkedObjects):
__patch__.append(objList.Label)
patchNumber = patchNumber + 1
このリストを使って、表示パーツ(obj)毎に、リストに含まれるかどうかを判定し、含まれる(changeLabel=1)ならば、wall、そうでなければ type に変更するようにしたのが以下のコードになる。
for obj in doc.Objects:
if obj.ViewObject.Visibility:
changeLabel = 0
if patchNumber > 0 :
for i in range(patchNumber):
if obj.Label == __patch__[i] :
changeLabel = 1
if changeLabel == 1:
strings9 = [
'\t\t' + str(obj.Label) + '\n',
'\t\t{\n',
'\t\t\tnewName '+ str(obj.Label) + ';\n',
'\t\t\ttype wall;\n',
'\t\t}\n',
]
else:
strings9 = [
'\t\t' + str(obj.Label) + '\n',
'\t\t{\n',
'\t\t\tnewName '+ str(obj.Label) + ';\n',
'\t\t\ttype patch;\n',
'\t\t}\n',
]
meshDict.writelines(strings9)
一応、これにて、マニュアル中のグリッドエディタ画面の説明図は従来通りのものになってくれる。但し、出来上がったmeshDict の renameBoudary ブロックは以下のようなものになってしまう。
renameBoundary
{
newPatchNames
{
Dexcs
{
newName Dexcs;
type wall;
}
inlet
{
newName inlet;
type patch;
}
outlet
{
newName outlet;
type patch;
}
wall
{
newName wall;
type patch;
}
regionBox
{
newName regionBox;
type patch;
}
dexcsCfdAnalysis
{
newName dexcsCfdAnalysis;
type patch;
}
CFDMesh
{
newName CFDMesh;
type patch;
}
CfdSolver
{
newName CfdSolver;
type patch;
}
MeshRefinement
{
newName MeshRefinement;
type patch;
}
MeshRefinement001
{
newName MeshRefinement001;
type patch;
}
}
}
つまり、朱字部regionBox以下の境界でないパーツ名までリストアップされてしまう。実際問題としてこれらがリストアップされたからといって、メッシュ作成に問題が生じるでもなく、最終的な出来上がりのpolyMesh/boundary ファイル中に、これらがリストアップされる事もない。
したがって、実用上はこれで問題無いと言えるのだが、やはり気持ち悪いので、これらがリストアップされないようにすることを考えた。基本的には、region指定用パーツと、Dexcsワークベンチ関連のコンテナである。
まず、region指定用パーツであるが、その数(regionNumber)とパーツリスト(__region__)はすでに取得されているので、以下のようにして、除外判定できる。
regionLabel = 0
if regionNumber >0:
for iregion in range(regionNumber):
if obj.Label == __region__[iregion]:
regionLabel = 1
問題は、Dexcsワークベンチ関連のコンテナであった。当初、CfdOFのコード中、随所に
if hasattr(obj, "Proxy") and isinstance(obj.Proxy, _CfdMeshRefinement):
という判定文があり、これを真似すれば良いだろうと考えた。つまり、上記はメッシュ細分化コンテナを特定する為の判定文であった。このうちの、hasattr(obj, “Proxy”) だけを指定すれば、Dexcsワークベンチ関連のコンテナを指定できると考えてやってみたのだが、これだと確かに関連コンテナを除外できたものの、それ以外のもの(上の例ではwallも)除外されてしまった。何故こういうことになるのかよくわからないのだが、これ以上時間も掛けられないので已む無く、コンテナの名前で除外する事にした。つまり、
lenObjLabel = len(obj.Label)
skipLabel = 0
if lenObjLabel>6:
if obj.Label[0:7] == 'CFDMesh':
skipLabel = 1
if obj.Label[0:7] == 'CfdSolv':
skipLabel = 1
if obj.Label[0:7] == 'MeshRef':
skipLabel = 1
if obj.Label[0:7] == 'dexcsCf':
skipLabel = 1
という判定ブロックにて、skipLabel = 1 のものは除外した。
何かもう少しスマートな書き方がいくらでもありそうだが、まぁここが素人プログラマの限界ってことで。とりあえず先に進む事にした。それよりも、モデル中に上述の名前で始まるパーツ名があると厄介な事になるかもしれないので、ここはメモしておきたい。