cfMeshのオプションパラメタ

cfMeshはsnappyHexMeshに比べて、メッシュ設定用のパラメタの数が少なく、さほど混みいった形状でない場合には、拙作のFreeCAD用マクロ(makeCfMeshSetting.py)のGUIでほとんど用が足りると思います。

そうでない場合に、その他のオプションパラメタで改善される可能性は有るということですが、そもそも設定パラメタとして何があるのか・・・先日の講習会では、以下のような一覧でまとめました。

範囲を選択_560

cfMeshのマニュアル(cfMesh User Guide)にも記してありますが、これらのうち必須(Mandatory)パラメタは、

  • maxCellSize
  • surfaceFile

の2つだけです。その他のパラメタはすべてオプションで、指定してもしなくてもOK。上図右半分のレイヤー(boundaryLayers)とパッチの名前変更(renameBoundary)を除外すると、オプションパラメタとしては、以下8つある事になります。

  1. boundaryCellSize
  2. miniCellSize
  3. keepCellsIntersectingBoundary
  4. checkForGluedMesh(removeGluedMesh?)
  5. keepCellsIntersectingPatch
  6. removeCellsIntersectingPatch
  7. localRefinement
  8. ojectRefinements

拙作のFreeCAD用マクロ において、青字部分はGUIパネルにて設定変更が可能で、赤字部分はmeshDictにパラメタだけは記述してあり、内容をmeshDictの直接編集で追記可能な構造になっています(先に引用したパラメタ総覧での説明内容と一部異なっていますが、こちらの説明が正しい)。

本来であれば、これらのパラメタの意味をしっかり理解してマクロを作成すべきでしたが、それでもこれだけカバーしておけばそこそこ使えそうだ・・・ということで、期日の制限もあり、中途半端でしたがリリースの運びとなりました。

その後、オプションパラメタの意味を自分なりに実例を使いながら調べていますが、いまだよく判らない点は残ってはいるものの、ある程度は判ってきたので、以下にその調査結果を記しておくことにしたのと、改良版マクロ(meshDictに記述するパラメタリストに洩れが無いようにしたもの)を(近日中に)公開することとしました。

 

checkForGluedMesh(removeGluedMesh?)

範囲を選択_561

cfMesh User Guide の10ページ目をキャプチャーしたのが上の図で、本文中にはcheckForGluedMeshとありますが、添付図(Figure 14)ではremoveGluedMeshとなっています。どっちが正しいのか? ってことです。

拙作マクロでは、removeGluedMeshを出力するようにしていましたが、どうやら間違いで、checkForGluedMeshが正しいようです(その効能は後述)。

実は、スペルミスなど間違った名前で記しても無視されるだけで、構文(カッコの位置など)さえ間違っていなければプログラム実行には支障を来たさないという、ロバスト(?)なつくりになっていることも判りました。

 

keepCellsIntersectingBoundary/checkForGluedMesh

上に引用したcfMesh User Guideを見ても判るように、これらは対で使います。つまり、keepCellsIntersectingBoundaryが有効(=1)の場合に、checkForGluedMeshが意味を持ち、(無効=0)の場合には、無視されるということです。

なお、これらはglobal option ということで、メッシュ全体に適用されるパラメタであり、類似の

keepCellsIntersectingPatch/removeCellsIntersectingPatch

は、同様の指定を個別のpatchで使ってもよいということです。

問題は、これらがどうやって作用するかってことですが、ようやく判りやすい具体事例をbackStepモデル(後流領域の高さのサイズは3)で作成できたので、以下に示します。

範囲を選択_562

ベースのメッシュサイズ(maxCellSize)と境界面の関係が下図のようになっていて、

範囲を選択_563

ベースメッシュと境界が交叉する要素(cellsIntersectingBoundary)をkeep(メッシュ作成)するかどうかってことです。模式的に描くと出来上がりメッシュが下図の格子のようになるってことです。

範囲を選択_564

もちろん、実際にはこの模式図のような等間隔にはならなくて、backStepモデルで示すように、maxCellSizeを目安とした不等間隔メッシュになります。

checkForGluedMeshの効能については、maxCellSizeによって、現れる場合(backStepモデルでmaxCellSize=0.3の場合)と、現れない場合(maxCellSize=0.4の場合)もあるってことでした。

要は、keepCellsIntersectingBoundaryを1にしてメッシュ作成すると、maxCellSizeより必然的に小さなメッシュが出来て、それらは境界面にしわ寄せされることになる。そういうGlued(くっついて離れない)メッシュを取り除くかどうかってことのようです。

なお、蛇足になりますが、上述の機能、また個別のpatchで使用する際のパラメタの名前removeCellsIntersectingPatch との対比においても、removeGluedMeshであってくれた方が判りやすかったと思います。

 

もうちょっと実用的なサンプル

これは過去記事にある有料セミナーで実施したもので、

範囲を選択_575

その時はsnappyHexMeshでメッシュ作成したのに対し、今回はcfMeshで作成しようとトライしています。

まず、空気領域のメッシュは、普通に拙作マクロを使って、以下設定。

範囲を選択_566

いとも簡単にメッシュが出来ました。

範囲を選択_576

問題は、固体領域です。空気領域の設定(finのcellSize 0.3)に合わせて、以下のように設定すると・・・範囲を選択_574

残念ながら、こうなってしまいます。フィンの厚さが薄いので仕方ないってことでしょうが・・・

範囲を選択_570

しかし、ここでmeshDictを直接編集、範囲を選択_577

keepCellsIntersectingBoundaryを1にしてやれば・・・

範囲を選択_571

となって、お見事! めでたし、めでたしでした。

 

 

 

まとめ

cfMeshのオプションパラメタのうち、 

  • keepCellsIntersectingBoundary
  • checkForGluedMesh(removeGluedMesh?)
  • keepCellsIntersectingPatch
  • removeCellsIntersectingPatch

について、本記事にて説明させていただきました。

  • localRefinement
  • boundaryCellSize
  • ojectRefinements

については、説明するまでない、ほぼ自明ですね。

  • miniCellSize

については、ある程度判ると思いますが、まだ良くわからない点があります⇒(公開掲示版情報を参照下さい)。現在調査中です。

 

 

その他Tips

マルチコアの環境で計算すると、CPUの負荷状況に応じてマルチスレッド処理がダイナミックに変化するためか、同一パラメタを指定してあっても、計算結果が変化する場合が多々あるようです。簡単なモデルではそうでもないですが、DEXCSの標準チュートリアル問題ではよくあることでした。

また上述したように、間違ったパラメタを指定してもエラーにはなってくれないので、パラメタを変えて実行した際に、パラメタ変更の結果なのか、マルチスレッド処理の結果変化なのか、区別できなくなってしまいまうことがあるので要注意です。

パラメタスタディをする際に、これらの事象を念頭において実施する必要があったということで、これに気づくまでかなりの回り道をしてしまいました。

とはいえ、今時シングルコアのマシンもないでしょうから、ちゃんとパラメタスタディする際には、仮想環境でシングルコアの設定にして実施するのがお勧めです。

DEXCS2014 for OpenFOAM(R) 講習情報

先のオープンCAEシンポジウム2014にて実施したDEXCS for OpenFOAM(R)関連のトレーニングは、おかげさまの満員御礼で、恒例の起動トラブルはいくつかあったものの最後まで予定通りの進行、反響もまずまずだったという感触です。

満席だったということもあって、機会を逸したという方の為に、近日中に実施予定の関連講習情報と、講習の際に詳しくは説明しなかった公開版のBug情報をお知らせしておきます。

 

 

オープンCAEを用いた流体解析の基礎と実習講座

  • 2014/11/26(⇒2015/1/7に延期)(水)より、6回シリーズ
  • 場所:名古屋市工業研究所
  • 詳しくは、こちら

 

OpenFOAMによる、設計・開発のための流体解析の基礎と演習講座 〜1人1台PC実習付〜

  •  2014/11/28(金)(⇒2015/12/1(月)に変更)
  • 場所:【東京】日本テクノセンター研修室
  • 詳しくは、こちら

 

これらはオープンCAE学会主催のトレーニングに比べて、いずれも料金は約5万円と、やや高目ですが、時間はたっぷりとってあり、オープンCAE学会主催のトレーニングで実施したのと類似の内容に加えて、さらに盛りだくさんの内容になっていますので、よろしければ申し込んでやって下さい。

また、今のところ、定員には満たない状況で空席もたくさんありますので、周りの方にもご紹介をお願いします。

 

 

 DEXCS2014 for OpenFOAM(R)公開版のBug情報

makeCfMeshSetting.pyのバグ

ファイルマネージャから、ホームディレクトリ下、.FreeCAD/makeCfMeshSetting.py をダブルクリックしてファイル編集(変更)して下さい。

 

範囲を選択_514

範囲を選択_515

 

  • 321行目、thcknessRatio の後ろにスペースを挿入。これがなかった為、レイヤーの層毎の厚さの比のコントロールが出来なくなっていました。

範囲を選択_516

  • 37行目。これはバグということではありませんが、公開版ではこの値が「9」になっており10層以上のレイヤー指定が出来なくなっていました。9層では不十分というケースもあるようなので、必要な方は変更してご使用下さい。

インストールの問題

ライブモード(ユーザー名はcustom)でなく、ハードディスクや仮想マシンにインストールして使う場合、ユーザー名を任意で指定して良い(但し日本語は不可)となっていましたが、dexcshogehoge など、dexcsで始まるユーザー名は使用出来ません。⇒詳細はこちら

なおこの問題は、先のトレーニングで使用した特別版でも同じです。

DEXCS2014 for OpenFOAM(R) リリースノート

DEXCS for OpenFOAM(R) は、OpenFOAMと、これをより簡単・高度に活用できるようにする為の様々なツールをすべてインストール済のオール・イン・ワンパッケージで、誰でも簡単・即使えるようにしたマシンイメージ(isoファイル)です。

範囲を選択_999(681)

 

詳しくはこちら

DEXCSランチャーのヘルプメニューからも参照できます

DEXCS2014では、

  • OpenFOAMやその他の組み込みツールのヴァージョンアップに対応
  • 初心者向けのDEXCSランチャーは、FreeCADマクロ(cfMesh用簡単設定ツール)を導入することで更なる簡素化が出来ました。
  • DEXCS2011から搭載するようになった中級者向けツール(TreeFoam)の機能強化を図りました。
  • 最適化ツール(OpenMDAO+openfoam_wrapper)を新たに導入しました。

なお、DEXCS2012までは、32/64bit版がありましたが、DEXCS2013からは、64bit版のみです。

 

インストールと利用法

範囲を選択_999(682)

詳しくはこちら

マシンイメージなので、DVDにイメージ書き込みすれば、DVDから起動してそのまま利用することができます。 (DEXCS初体験の人はこのライブDVDとして「まずは使ってみる」方法をお薦めします。)

  • 起動後にインストール機能により、HDD等に直接インストールできる上、使用するユーザー名等を選択することができます。
  • VMWare Playerや、VirtualBox等の仮想環境で起動して、仮想環境を作成することも簡単です。
  • 基本的に、DEXCS2011でやった方法と同じです.DEXCS2012,2013では、同じやり方が通用しない部分が一部ありましたが、それらの不具合はなくなりました。
  • VirtualBoxにインストールする方法は、こちらにDEXCS2013について詳しく記されていますが、基本は同じです。また、DEXCS2011までは、”Guest Additions”が入っておりませんでしたが、DEXCS2014では導入済みなので、共有ファイルの設定なども同様に実施可能です。

 

 

同梱プログラム

範囲を選択_999(684)

 

 

OSはUbuntu-14.04

DEXCS2012,2013 では、ベースOSをそれまでのUbuntu から、Linux Mintに変更しましたが、DEXCS2014では先祖返りして、Ubuntu-14.04になりました。
当初は相応のLinux Mint 17で開発を進めていましたが、TreeFoamでSegmentation Faultが頻発し、どうにも解決できなかった為です。また、致命的とまでいわないが、リマスターツールの挙動がややおかしいという点もありました。

ただ、それにしても、UbuntuはCAE用途には使い難いなぁ・・・と思うのは少数派でしょうか?

 

その他のドキュメントについて

    • DEXCSランチャーのヘルプメニューを参照下さい。
    • 本当に初めて使う人は、「ランチャーの使い方」-「まずは使ってみる」をご覧下さい。
    • 「ランチャーの使い方」-「形状作成」にて、FreeCADの使い方を概略説明しています。
    • 「ランチャーの使い方」-「メッシュ」「計算実行」「結果処理」を理解できるようになると、OpenFOAMの基本的なファイル構造を理解できたことにもなります。
    • 以上は動画チュートリアルになっていますが、「フラッシュプレーヤー」を変更して参照することを強くお勧めします。変更方法は、最下段の「フラッシュプレーヤーの変更方法」をご覧ください。
      • Blender⇒SwiftツールをDEXCSランチャーから使用することはなくなりましたが、ツールそのものは使用可能で、メッシュ作成用のテンプレートフォルダもBlenderモデルと併せて同梱してあります(デスクトップ上:DEXCS/template/swift_dexcsMesh)。
      • Swiftツールもヴァージョンアップして、出力ファイルの仕様が少々変更になっていますが、基本的な使用方法は変わっておりません。使用法の詳細を知りたい方はDEXCS2013のリリースノートをご覧ください。
      • openfoam_wrapper の使用法については、OpenMDAO端末を起動して、以下のコマンドを入力すれば、粘度の同定問題のドキュメントが表示されるので参考にして下さい。
        • $ openmdao docs openfoam_wrapper
      • SLURMというリソースマネージャもインストールしてあり、サブミット用のサンプルスクリプトを含んだケースファイルも同梱してあります(デスクトップ上:DEXCS/template/slurm_damBreak)。コア数が4つのマシンであれば、以下のコマンドを、そのまま利用可能(のはず)です。
        • $ sbatch submit.sh  (ジョブサブミット)
        • $ squeue  (ジョブ確認)
        • $ scancel [jobID] (ジョブ停止)
      • コア数が4でないなどの環境で、バッチジョブがペンディング状態のまま実行出来ない場合は、デスクトップ上、DEXCS/launcherOpen/doc/slurm.pdf を参考に設定ファイル(slurm.conf)を変更して使用して下さい。
      • ジョブサブミット、ジョブ確認は、TreeFoamの十徳ナイフからも起動できます.
      • 上記を含めて、TreeFoamから起動する十徳ナイフのメニューは大幅に変更しました。(http://dexcs.net/ocse2/?p=1836
      • JAVA gnuplot GUI の使用方法
      • TreeFoamの基本的な使い方はTreeFoamのヘルプメニューから、「使い方」を参照して下さい。
    • TreeFoamの実践的な使用方法

makeCfMeshSetting.py プログラムの解説

FreeCADからcfMesh作成用の設定ファイル一式を自動生成するスクリプトとケースファイルを紹介した記事のなかでお約束したスクリプトの解説を以下に記しておきます。

但し先の記事の中でも記したように、筆者は本職のプログラマでないので、ええ加減、あるいは間違っている部分もあるかもしれないことを最初にお断りしておきます。また、こうして解説という形でプログラムを見直してみると、もっとああしたら、こうしたら・・・という箇所がたくさんあるし、何よりも下手くそな事やってるなぁ!など、とても他人様に見せられたものでないなぁとお恥ずかしい限りです。

それでも敢えて公開するのは、備忘録という面もありますが、どなたかにこのプログラムを引き継いで開発してもらいたいという期待があるからです。また、これが出来てこそのオープンCAEだからです・・・ということで宜しくお願いします。

 

 

全体の流れ

クラスや関数定義(def文)の中味をトップレベルで折り畳んでプログラム全体を総覧すると、以下のようになります。

範囲を選択_999(624)

 

なおこの閲覧表示には、SPE(Stani’s Python Editor)というpythonの統合開発環境(DEXCS for OpenFOAM(R)には標準搭載しています)を使ってています。

これは、キーワードを色分け表示したり、階層部分を折り畳んで表示するなどして、全体の総覧が判り易くなる為です。

最初に、import文で、必要なライブラリモジュールが組み込まれ、その後、class文やdef文で定義される様々なクラスや関数が定義してあって、一番下にメインプログラムがあります。

pythonプログラムというのは大体このような構成(フレームワーク)になっているようですが、最初からスクラッチで作ったものではありません。本例の場合には、wx-pythonのサンプルプログラム(確かTableGridを取り扱ったものの一つ)を持ってきて、その段階で本例でキーとなるTableGridを取り扱う為のフレームワークは出来ているので、関数の名前や、中味を書き換えていくという方法で作ったものです。

メインプログラムの中味は、

範囲を選択_999(625)

と、いたってシンプル。ここで注目していただきたいのは、L.447の

frame = objSetting(None, sys.stdout)

です。objSettingという名前(メインプログラムの中で、参照したwx-pythonサンプルプログラムから変更したのはこの部分だけです)になっているので、これでL.120の関数定義が実行されるわけですが、このframe を定義して、その次の行で、これをShow、さらにその下でMainLoopってことは、この処理をずっとループさせてるってこと。何かイベントが発生したら、定義されたプログラム(何が定義されているのかは関数の詳細を調べないと判りません)が起動するという仕組みです。

ここでカッコ()の中の引数が、Noneとかsys.stdoutとなっており、これらは引き合いにしたwx-pythonサンプルプログラムにあったものをそのまま使っています。引数そのものの意味はある程度推定できるのですが、これらを引数にしなければならない理由とか、これを変えたらどうなるか(無闇に追加したりすると叱られます)・・・など良く判らないまま作っています。

 

 

プログラムの本体は objSetting

ということで、この中味を調べてみます。

範囲を選択_999(626)

 

またしても、def文がたくさん出てきました。

最初に__init__()と特殊な名前のdef文(クラスの中ではメソッドと呼ぶんだそうです)があり、これはクラスのインスタンスが生成された直後に呼び出される決まりになっているそうで、この構成までは引き合いにしたwx-pythonサンプルプログラムにあったものをそのまま使っていて、その中味を今回の用途に合わせて書き換えたのと、それ以下のメソッドは今回新たに追加したものになります。

それでは、次に__init__()の中味を見ていきます。

範囲を選択_999(639)範囲を選択_999(640)

基本的には、GUI画面(パネル)の設計図のようなもので、L.140〜L.151あたりで、このパネルに配置している部品のクラスや名前を定義しており、これらをどうレイアウトしているかを決めているのがL.159〜L.173です。これら部品のうち、このアプリでキーとなる部品が表形式のテーブルで、これだけは

self.grid = CustTableGrid(p, log)

として、CustTableGridという別のクラスを呼び出して定義しています(後述)。

なお、この部分、この部品だけにself.がついていたり、引数の中味が(p,log)と記されており、この前段でpやlogが定義されている部分については、件のサンプルプログラムで使っているものをそのまま転用しているだけで、そうすることの意味をちゃんと理解して使っているわけではありません。

かなりゴチャゴチャしていますが、GUI画面と対比させながら読むと理解しやすいと思います。

範囲を選択_999(641)

 

 

あと独自の追加項目としてL.123の、

global caseFile, maxCellSize, minCellSize, featureAngle

これら4つのパラメタ(caseFile, maxCellSize, minCellSize, featureAngle)の内容(具体的数値)は、GUIを通してユーザーが任意に設定変更できるもので、他の関数やメソッドに渡して使用するものです。

当初はglobal変数にするつもりはなかったのですが、引き渡す際の方法(引数で渡すのか、self.なんたらで書けば良いのかなど)がわからなくて、やむ無くglobal変数にしたといういきさつがあります。今になって思えば、self.なんたらという書き方をしておけば良かっただけの事かもしれません。

 

また、L.126

cellMax = searchBound2cellMax()

では、FreeCAD上で表示されているすべてのobjのBoundBox情報から、領域全体のBoundBox情報をベースに、概略のセルサイズ情報を算出しています。これをデフォルト値として、maxCellSizeのテキストボックスに表示させています(後述)。

 

 

TableGridの作成

L.140で、

self.grid = CustTableGrid(p, log)

として、クラスCustTableGridを呼び出す、そのクラス定義はL.101にあって、範囲を選択_999(628)

ここからさらにL.104

self.table = CustomDataTable(log)

でクラスCustomDataTable(L.24)を呼び出す、という構造になっています。

範囲を選択_999(642)

ここも当然__init__()というメソッドがあって、それ以外にもたくさんのメソッドが定義されていますが、__init__()以外のすべてのメソッドは、件のサンプルプログラムをそのまま使っています。

このクラスを利用することで、__init__()の中味で、このテーブルに対するプロパティと初期値を定義しておけば、その他に定義済みのメソッドを使ってテーブルの内容を変更できるようにしたり、変更した時にその内容を取得したり、といったことが出来るようになっている訳です。

その他のメソッド(たとえばGetColLabelValue)の役割は、ほとんどその名前(と英文のコメント)から想像できると思いますが、その具体的なプログラム内容は知らなくても)使えるようになっているところがポイントで、ここでもその中味の説明は致しません(というか出来ません)。

それでは、__init__()の中味を見ていきます。

範囲を選択_999(643)

 

L.28でテーブル1行目の見出しセルの内容を定義しています。

L.29〜L.36では、各列のデータ形式を定義しています。

そして、L.42〜L.44を使って、テーブルに初期値を与えているわけです。この部分だけ若干説明しておくと、docというのがグローバル変数(L.19,20参照)で、FreeCADで開いているモデルそのものになります。これのobjすなわちdoc.Objects(L.42)はモデルに含まれるコンポーネントを意味して、obj.ViewObject.Visibility(L.43)はモデルコンポーネントの中の表示されているもの、という事になります。

したがって、表示されているモデルコンポーネントについて、obl.Label(その名前)を1列目に、2列目には、とりあえず”patch”を選択、、、、(L.44)ということをやってるわけです。

 

以上で、クラスobjSettingの__init__()というメソッドで、このスクリプトを起動した際にデフォルトのGUI画面が作成されるまでの仕組みを見てきたことになります。

 

次に、クラスobjSettingのL.154〜L.156では、3つのボタン(b1,b2,b3)のそれぞれで、ボタンが押された時(wx.EVT_BUTTON)の実行関数(メソッド)を定義していますが、それぞれの内容について調べていきます。順不同で、簡単なものから説明します。

 

Exitボタン

 

155行目で

self.Bind(wx.EVT_BUTTON, self.OnExitButton, b2)

OnExitButtonが指定されており。この内容は、L.403で、

 

範囲を選択_999(644)

 

内容は説明するまでありません。ただ本当はClose()する前に、変更があったらその内容を保存しておくとかの機能も追加したいところですが、そこまで手が回っておりません。

 

 

caseボタン

L.156で

self.Bind(wx.EVT_BUTTON, self.selectCase, b3)

selectCaseが指定されており。この具体的内容は、L.178で、

範囲を選択_999(645)

 

となっており、wx.DirDialogという、いわゆるファイルマネージャーでフォルダーを選択する際に定番で出てくる画面を使っています。ここで選択したフォルダー名が、caseFile.Label にフルパス名で書き換えられる訳です。

ここ(caseFile.Label)には、デフォルトでは、FreeCADのモデルが存在していたディレクトリ名が入っていた(L.144←L.132)のに対し、メッシュを作成したいフォルダ名が異なる場合に使うことを想定しています。

なお、本当は、ここで選択した後に、そのフォルダがOpenFOAMのケースファイルになっているかどうかをチェックして、そうでない場合に警告を出すなどしたかったのですが、そこまで手が回っておりません。

 

 

 

Exportボタン

L.154で

self.Bind(wx.EVT_BUTTON, self.exportSettingFiles, b1)

exportSettingFilesが指定されており。この内容は、L.191以降で、

範囲を選択_999(646)

となっており、ここからが一番肝心な部分です。

L.192〜L.195で、GUI画面の中で、テーブル以外の部分でユーザーが書き換えた(かもしれない)情報を取得しています。

L.198で作成するかどうかの確認ダイヤログを表示、OKとなった場合、以下4つのステップで設定ファイルを作成します。

  1. STLファイルの作成
  2. fmsファイルへの変換
  3. fmsファイルの修正
  4. system/meshDictの作成

以下、順番に説明します。

STLファイルの作成(L,224:def makeStlFile)

範囲を選択_999(630)

 

FreeCADのオブジェクト毎にSTLファイルへ出力しているのは、L.233〜L.249の部分ですが、これらのほとんどの部分は、オープンCAE勉強会@関西の有志メンバーにて作成されたものをそのまま借用しています。

ここでは、オブジェクトの中で、grid.tableにリストアップされており(L.234)、Typeがregionのもの(L.235)を出力するように手を加えました。

 

fmsファイルへの変換(L.207〜L215)

範囲を選択_999(647)

 

stlファイルは、単に面情報しか持ちませんが、surfaceFeatureEdgesコマンドによって、稜線情報を含んだfmsファイル形式に変換しています。(詳細の説明はこちら

4つのステップのうち、なんでここだけがdef関数化されてないの?と指摘されそうですが・・・

fmsファイルの修正(L217⇒L.259:def modyfyFMS)

範囲を選択_999(631)

 

fmsファイルは面の幾何学的情報の他に稜線情報も含んでいるだけでなく、形式的には面のtype情報も定義できますが、単にsurfaceFeatureEdges変換しただけでは、面のtype情報を組み込むことは出来ません。通常は、type empty として取り扱われるようです。

そこで、ここでは<empty>が、テーブル第2列目(Type)で指定した境界typeになるよう、sedコマンドを使って書き換えています。但し、単純サーチしただけでは境界ごと個別に書き換えができないので、テーブル中でのregion以外(stl出力されるオブジェクト)の並び順に応じて、書き換え範囲を限定してsedコマンドを適用するという方法で対処することとしました。

あまりスマートなやり方でないなぁ・・・と思いつつ、色々方法を試しても上手くいかない状況が続いたなかで、まぁこの方法ならとりあえず動いてくれるようになったし、今のところ不具合例もなさそうなので・・・というレベルです。もうちょっとスマートなやり方をしたいところです。

その後、cfMeshマニュアルを読みなおしたところ、後段のmeshDictを作成する際に、renameBoundaryというセクションの中で定義してやれば良さそうという感触を得ましたが、今後の課題です。

 

system/meshDictの作成(L219⇒L.280:def makeMeshDict)

範囲を選択_999(632)

L.300以降省略しており、関数ブロックとしては、この部分が一番長いのですが、cfMesh作成時に必要となるsystem/meshDictをオープンし(L.282)、以下、一行ずつベタに書き込んでいるだけだからです。

GUI画面にユーザーが書き込んだ数値は、L.294のようにして取得できるので、他の数値も同様にしてやっています。

唯一補足しておきたいのは、以下のobject refinement の定義ブロックを作成する部分です。

範囲を選択_999(648)ソース中のコメント文にも記してあるように、 Box要素であることを前提に作ってあります。cfMesh本来の仕様では、

The supported objects which can
be used for refinement are: lines, spheres, boxes, and truncated cones.

となっているので、Box要素以外にも対応させたいところですが、そこまで手が回っておりません。

 

 

その他

searchBound2cellMax(L.412)

範囲を選択_999(649)

 

ここでは、FreeCADで開いているモデルの全オブジェクのなかで、表示されているオブジェクトについて、寸法の最大・最小値を調べています。

FORTRANプログラムのような書き方をしていますが、素の地が出たということでご容赦。また、最大値の初期値として、-10000としています(L.413)が、もちろんこれじゃ万能でありません。意地悪なモデルには対応できていないということです。

初めてFreeCADのpythonを経験する人にとって、obj.Shape.BoundBox.XMaxといったプロパティの名前をどうやって知ったら良いのか?という問題があると思います。そのあたり詳細なマニュアルがある訳ではなく、Pythonコンソールの使い方マニュアルを理解して自分で調べろ!ということらしいです。調査例のイメージを下に掲載します。

範囲を選択_999(651)

round_sig(L.440)

上のsearchBound2cellMaxでの計算は倍精度計算で、結果は長大な数字の列になってしまい、これをそのまま表示したのでは見苦しくなってしまいます。有効数字を丸める方法はないかと調べていたら、彼山の知識というサイトで見つけて、そのまま借用しました。

範囲を選択_999(650)

L.441はなんとなく理解はできますが、これを自分でゼロから作れと云われるとまず無理でしょうな・・・このあたり素人プログラマの限界です。

 

 

追加したい機能

本文中の所々で、手付かずで未熟な部分についてコメントしておきましたが、ここではまだ触れていない項目について記しておきます。

設定保存機能

起動したばかりのデフォルト状態から、様々な設定を施しますが、一度終了してしまうと最初からやり直しで、その手間も馬鹿になりません。当初はそういう設定状態を保存するのに、専用に設定ファイルを作るアイデアで構想していましたが、それよりも起動時、またはcaseボタンを押してケースフォルダーを変更した際に、そこに存在するfmsファイルや、system/meshDictの中味を読み取って、GUI画面に反映(するかしないかはユーザーに決めさせる)方法の方が良さそうだと思っており構想中です。

その他にもいろいろ

あったと思いますが、まとめきれていません。また、ご要望・ご意見などあれば、適宜ここにリストアップしていく予定です。

 

最後に

GUI画面のレイアウト

は手作業で実施している為、読み難くなってしまいました。

当初、DEXCSランチャーやTreeFoamと同じく、wx-gladeを使って作成するつもりでしたが、画面レイアウトがなかなかしっくり来なかったのと、wx-gladeで使うテーブルの取り扱い方がよく判らなかったこともあって、wx-tutorialを雛形に手作業で修正することになったという舞台裏です。

ただ、じゃぁ今のレイアウトで満足しているかというと、大いに不満です。かろうじて及第点のレベルで、直したいところは山ほどあるんですが・・・

また、

FreeCADから起動するpythonスクリプト

であるということから、プログラム開発上、なかなか厄介な面があります。早い話がスクリプトを単体で実行できないということです。実行しようとすれば、ソーズ冒頭(L.4)の、

import Mesh

で、Meshがないよ!といっていきなり叱られてしまう訳です。

仮にこれを解消できたとしても、FreeCADで対象としているモデル情報(ファイルの名前)をどうやって引き渡すかの方法もわからないという問題もあります。

また、そもそもスクリプト単体で実行したくなるのは、FreeCADのマクロ画面からの実行だと、実行時のエラーメッセージが表示されない場合が頻出するからです。途中まで正常に実行できていて、どこでエラーが生じたのかが判らない。デバッグ用にprint文で出力させても、そのメッセージが何処に掃き出されるのかもわからない。

「Export」ボタンを押した後、何度も異なったメッセージダイヤログが出力されるのは、ユーザーさんにとってはどうでも良いことでウザイと思われるかもしれませんが、うまくいかなかった場合に、上述のように実行時のエラーメッセージが出ないので、どこに問題があるかを特定するのに重要な足掛かりになるからです。

このあたり、FreeCADのpythonに詳しい方なら、解決策をお持ちのような気もしますがいかがでしょう?

 

 

makeCfMeshSetting.py

範囲を選択_999(636)

ただいま製作中のDEXCS2014 for OpenFOAM(R)で、一番の目玉になりそうな表題のツールがほぼ完成したので、ここにそのツール(のアルファ版)とケースファイル一式、また使用法説明を公開することとしました。

使用法説明は、DEXCS2014-for OpenFOAM(R)のプロトタイプ版で使用することを前提に記してありますが、OpenFOAM、cfMesh,FreeCADの使える環境であれば動くと思います(本文中にも記してあり、未確認ですが・・・)。

使ってみたいが、プロトタイプ版を持っていなくて、公開版(にはケースファイル同梱の予定はありませんが)まで待てない、環境整備が面倒でやってられない、という人は、DEXCS2014-for OpenFOAM(R)のプロトタイプ版2(今回のケースファイルも同梱してあります)の購入(3,000円)をお申し込み下さい。

なお、公開の目的の一つは、このツールがまだアルファ版ということで、様々な改良が必要であるという点は重々承知しており、問題点や要望点をいただきたいという点があります。

ただ、すでに自分自身でリストアップしている項目もいくつかあって、問題はこれらの作業を自分一人でやっていたのでは他にやるべきことに手が回らなくなってしまうという点です。というのも自分は本職のプログラマでないし、下手な作り方をしているところも随所にあるからです。

したがって、単に問題や要望を指摘いただくだけでなく、もう一歩踏み込んで、プログラムを改造、もしくは作り替えてしまう、というリアクションを期待しているということです。

幸いなことに、まだpythonのスクリプトとして450行程度(なので自分一人で作れることが出来た)という代物です。別記事にて備忘録を兼ねて、簡単なプログラムの概要と説明を記しておきますので、我こそ!という人にはチャレンジをお願いします。