DEXCSランチャー v2.5 製作メモ / 2. 4



2.4 CdfOFのソースコードと主要プログラムの動作メカニズム

FreeCAD に対して拡張したワークベンチは、 .FreeCAD/Mod フォルダ中に収納される。 Mod フォルダ下
には、 CfdOF フォルダと Plot フォルダがあり、それぞれのコードが収納される。
Mod フォルダ下には、以下のファイルとサブフォルダ( Gui, pycashe , data, testFiles )が存在する。

├── CfdAnalysis.py
├── CfdCaseWriterFoam.py
├── CfdConsoleProcess.py
├── CfdFaceSelectWidget.py
├── CfdFluidBoundary.py
├── CfdFluidMaterial.py
├── CfdInitialiseFlowField.py
├── CfdMesh.py
├── CfdMeshRefinement.py
├── CfdMeshTools.py
├── CfdPhysicsSelection.py
├── CfdPreferencePage.py
├── CfdPreferencePage.ui
├── CfdResidualPlot.py
├── CfdRunnableFoam.py
├── CfdSolverFoam.py
├── CfdTools.py
├── CfdZone.py
├── Init.py
├── InitGui.py
├── README.md
├── TaskPanelCfdFluidBoundary.ui
├── TaskPanelCfdFluidProperties.ui
├── TaskPanelCfdInitialiseInternalField.ui
├── TaskPanelCfdListOfFaces.ui
├── TaskPanelCfdMesh.ui
├── TaskPanelCfdMeshRefinement.ui
├── TaskPanelCfdSolverControl.ui
├── TaskPanelCfdZone.ui
├── TaskPanelPhysics.ui
├── TemplateBuilder.py
├── TestCfd.py
├── WindowsRunWrapper.py
├── _TaskPanelCfdFluidBoundary.py
├── _TaskPanelCfdFluidProperties.py
├── _TaskPanelCfdInitialiseInternalFlowField.py
├── _TaskPanelCfdMesh.py
├── _TaskPanelCfdMeshRefinement.py
├── _TaskPanelCfdPhysicsSelection.py
├── _TaskPanelCfdSolverControl.py
├── _TaskPanelCfdZone.py
├── metadata.txt

Plot ワークベンチに関しては、 Mod/Plot フォルダ下、 freecad/plot フォルダ中に以下の python コード
と、他にもいくつかのサブフォルダに分けてコードが収納されており、コードの収納方法に決まりは無いよう
である。

├── CMakeLists.txt
├── Plot.py
├── PlotGui.py
├── Plot_rc.py
├── __init__.py
├── compile_resources.py
├── freecad_backend.py
├── init_gui.py
├── plot.dox
└── version.py

どういうイベントでどのプログラムが起動されるのかという、コードの動作原理についてはまだ十分解明できていないが、現時点で判っていることを以下に記しておく。

判明項目1

メッシュ作成および解析実行ケースは、 Default output directory 下の meshcase, case フォルダにそれぞれ収納される仕組みとなっており、 Default output directory は、デフォルトでは /tmp となるが、「編集」⇒「設定」メニューにより、任意に指定は可能。

判明項目2

CfdOF ワークベンチが選択されると、 InitGui.py 中の cmdlist に定義した内容にしたがって、ツールバーのボタンと、ボタンが押された時の実行メニューが割り当てられ、ツールバーが表示される(どういう仕組みで InitGui.py が起動されるのかはわかっていない)。

判明項目3

ツールバー中の CfdAnalysis ボタンを押すと、 CfdAnalysis.py の CommandCfdAnalysis() が実行され、コンボビューに 4 つのコンテナ( PhysicsModel, FluidProperties, InitialFields, CfdSolver )が追加表示される。

判明項目4

コンボビュー上の Part オブジェクトをどれか一つを選択すると、ツールボタンの [Create a mesh usinf…] ボタンがアクティブになるので、これをクリックすると選択した Part オブジェクトを対象にfluidRegion_ Mesh コンテナが作成され、 [CFD Mesh] タスク画面が現れて、メッシュの制御(ケー ス作成、実行、表示)ボタンが使えるようになる(⇒ TaskPanelCfdMesh.py )。

判明項目5

Mesh Parameters として、 3D/2D の選択、 cfMesh/snappyHexMesh/gmsh の選択が可能で、選択に 応じてタスク画面の下部表示内容が変化する。

判明項目6

タスク画面を閉じて、モデルツリー上の fluidRegion_Mesh コンテナを選択すると、ツールボタンの [Creates a mesh refinement] ボタンがアクティブになるので、これをクリックすると [Meshrefinement] タスク画面が現れて、メッシュの細分化設定が可能になる。ここで着目したいのが、細分化対象の設定方法である(図 8 )。本来は、先にパーツを選択して、右クリックメニューなどでこの画面を出したいところであるが、かような方法であれば許容範囲でないかと思われる。

図 8 細分化対象パーツの設定
判明項目7

細分化指定のもう一つの方法、図 9 InternalVolume についても、同様に パーツ選択するだけで、プロパティに登録されるようになっているが、この設定は snappyHexMesh の場合に有効であるが、このコンテナが存在する状態で cfMesh を作成しようとするとエラーになってしまう。

図9 領域細分化の設定
判明項目8

openSimで公開されているチュートリアル資料「 CFD Tutorial 4 – External Aerodynamics of a UAV.pdf」によれば、 [Mesh region] というタスク画面で、 cfMesh 用のプリミティブ定義メニュー(図 10 )を使えているのだが、現行モジュールではこのタスク画面が出てこない。というか、タスク画面の名前そのものが異なっている。

図 10 領域細分化の設定 [Mesh region] タスク画面
判明項目9

図 9 で設定が完了し [ 閉じる ] をクリックすると、コンボビュー上でコンテナに対するプロパティとして登録されるようになる(図 9 の右下赤破線の四角枠内)。上述の cfMesh の region 設定に係る不具合もあって現行の設定メニューをそのまま使うことはできないが、このようにパーツ毎の設定情報をFreeCAD モデル本体に具現することができれば、現行 DEXCS でやっているような meshDict を読み込み直して設定を再現するという回りくどいやり方をしないで済むようになるということである。

判明項目10

CfdSolver コンテナをダブルクリックすると、 [Analysis control] タスク画面が現れる( TaskPanelCfdControl.py )。Case[Write] ボタンをクリックすればケースファイルが作られて、 Solver[Run] ボタンがアクティブになるので、それをクリックすれば計算が開始すると同時に、残差グラフが現れて、その表示内容が計算の進行とともに更新されていく。

判明項目11

Case[Write] ボタンをクリックした時に起動されるプログラムが CfdWriterFoam.py で、この中で 118行目、

TemplateBuilder.TemplateBuilder(self.case folder, self.template path, self.settings)

によって解析実行用のケースファイルが作成されている。ここに、 self.case folder が出力先フォルダ、self.template path がテンプレートケース(デフォルトでは、 FreeCAD/Mod/CfdOF/data/defaults )であり、 self.settings に様々な設定条件パラメタが収納されるという仕組みである。本 CfdWriter-Foam.py では、計算実行に必要な全パラメタセットを対象に一括してテンプレートケースを書き換えることになるが、この TemplateBuilder は汎用的に使えるようになっているので、特定ファイル中の特定のパラメタだけを対象にして、この構文を使って書き換えることもできるという点を強調しておきたい。

判明項目12

テンプレートファイルを書き換える仕組みの基本は、テンプレートファイル中 %( と %) で括られたパラメタを setting の Dict ファイルを使って書き換えるというものである。単なる置き換えだけでなく、 %{ や、 %: を使って、簡単な if 構文的な書き換えもできるようになっている。

判明項目12

残差グラフ表示は、 [Analysis control] タスク画面で、 Solver[Run] ボタンをクリックした時に起動される CfdRunnableFoam.py の(89 行目 )get solver cmd が起動され、この中で (92 行目 )

self.residualPlot = ResidualPlot()

として、 CfdRedisualPlot.py の ResidualPlot() が起動される。

判明項目13

ResidualPlot() は、 QtCore.QTimer() オブジェクトで、 self.Timer.start(2000) として、 2 秒毎に更新( self.refresh )されるようになっている。その他、グラフ軸の表示方法( Plot モジュールの設定)などはここで実施している。

判明項目14

残差データそのものは、 TaskPanelCfdControl.py 中( 55 行目)

self.solver run process = CfdConsoleProcess(finishedHook=self.solverFinished,
std-outHook=self.gotOutputLines, stderrHook=self.gotErrorLines)

として、 self.gotOutputLines にストアされた計算ログ出力が CfdRunnableFoam.py の( 102 行目)
process output(self, text): に渡されて、ログの解析を実施した後、( 138 行目) updateResidual されるようになっているので、これを CfdRedisualPlot.py の (43 行目 )def updateResiduals(self, residuals):
で受けて、 self.update フラグが True に更新されるので、残差グラフの更新も実施されという仕組みで
ある。

判明項目15

CFD Mesh タスク画面において [Write mesh case] ボタンを押すと、 184 行目の writeMesh() 関数が実行され、

208 FreeCADGui.doCommand("cart_mesh.setupMeshCaseDir()")
209 self.consoleMessage("Exporting mesh refinement data ...")
210 FreeCADGui.doCommand("cart_mesh.processRefinements()") # Writes stls so need file structure
211 FreeCADGui.doCommand("cart_mesh.processDimension()")
212 FreeCADGui.doCommand("cart_mesh.writeMeshCase()")

208 行目でメッシュ作成用ケースフォルダを作成、 212 行目にて CfdMeshTools.py の writeMesh-
Case() 関数により、ファイルの実体が書き換えられる事になるが、ここでも最終的に、 718 行目の
TemplateBuilder が使用されている。

TemplateBuilder.TemplateBuilder(self.meshCaseDir, self.template path, self.settings)
判明項目16

CFD Mesh タスク画面において [Run mesher] ボタンを押すと、 228 行目の runMesh() 関数が実行され、上記 writeMeshCase() 関数により作成された Allmesh コマンドを使って、以下のようにして、コマンドを実行し、コンソール出力している。

235 cmd = CfdTools.makeRunCommand(’./Allmesh’, cart_mesh.meshCaseDir, source_env=False)
236 FreeCAD.Console.PrintMessage("Executing: " + ’ ’.join(cmd) + "\n")

前へ 目次 次へ

Share

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください