DEXCSランチャー v2.5 製作メモ / ランチャーツールボタン



課題の背景

先の記事でDEXCSランチャーのツールボタンにおいて、解析ケース(出力先)を整合させる事が出来たので、ユーザー目線での問題は解決できた。しかし、次期DEXCS2021においてFreeCADのバージョン選定に際して、従来通り、FreeCAD-daily版を使用していくのであれば、このままでも使えそうだが、daily版は安定性に不安があり、なおかつFEMモジュールにおいて、Netgenメッシャーが使えないという問題がある。可能であれば、AppImage版を使いたいのだが、そうするとDEXCSツールボタンのうち、TreeFoamのサブプログラムを使用するボタンが機能しなくなってしまう。

今回、CfdOFをdexcsCfdFとして改変作業を実施した事によって、CfdOFのコードの中から、別プロセスを起動する方法を学ぶことができた。これを参考にすれば、上述の問題(AppImage版で動作しない)が解決できる可能性があったので、挑戦してみることとした。因みに、CfdOFは、AppImage版だけでなく、Windows版、Mac版でも動作することを前提としたプログラムになっている点を追記しておく(動作は確認していないが)。

着想

別プロセスを起動する方法は、CfdOFにおいても、DEXCSツールボタン(あるいはTreeFoam)においても、状況に応じた起動スクリプトをカレントディレクトリ内に作成し、そのスクリプトを起動するプロセスを立ち上げているのは変わりない。スクリプトの内容も取り立てて違いがあるわけでもなかった。違いはプロセスを起動する方法であった。

DEXCSツールボタン(あるいはTreeFoam)では、python で一般に使われる、os.system()なり、subprocess.run()を使っていた。一方、CfdOFでは、QProcessを使っていたという違いであった。

方策1

editConstantFolder.py を例にあげて説明する。以下の緑字部分を、朱字部に変更した。

f=open("./run","w")
f.write(cont)
f.close()
#実行権付与
os.system("chmod a+x run")
#実行
#comm = "xfce4-terminal --execute bash ./run"
#comm= "gnome-terminal --geometry=80x15 --zoom=0.9 -- bash --rcfile ./run"
#os.system(comm.encode("utf-8"))
cmd = dexcsCfdTools.makeRunCommand('./run', modelDir, source_env=False)
env = QtCore.QProcessEnvironment.systemEnvironment()
dexcsCfdTools.removeAppimageEnvironment(env)
process = QtCore.QProcess()
process.setProcessEnvironment(env)
process.start(cmd[0], cmd[1:])

このコード中のポイントは2点、朱字部最下行で、「着想」にて記したprocess(Qprocess)を実行している点と、朱字部3行目dexcsCfdTools.removeAppimageEnvironment(env)の、文字通りAppimage環境を除去している関数を使っているという点である。FreeCADのAppImage版でなければ、この行が無くとも実行されるが、AppImage版でこの行が無いと実行されない。また、この行だけ機能するようにしたとして、従来の緑字部分の起動方法を使っても実行してくれない。

このコードだけから読み取れるポイントは2つあったが、これ以外にもう1点ポイントがある。editConstantFolder.py を例にあげて説明したが、editSystemFolder.pyにおいても、プログラムの内容はほとんど同じで、 runの内容で、/constant を対象にするか、/systemを対象にするかの違いでしかなかった。したがって、上記と全く同じ変更にて実行できるものと思われた。しかし、、、動かないのであった。

対象フォルダの違いだけかと思っていたが、実はプログラム全体の構造にも若干の違いがあった。結論からいうと、defブロックの有無であった。editSystemFolder.pyは、defブロックを有しない、ベタのプログラムであった。最終的に、プログラムの最終行に、以下のダミーのdefブロックを追加すれば動くことを確認した。editSystemFolder.py以外のマクロで、defブロックの無いものは、同様の変更が必要であった。

def dummyFunction(): # 何故かこれがないとうまく動かない      
    pass

余談になるが、最初にeditConstantFolder.pyの改造に取り組んだことがラッキーであった。editSystemFolder.pyを先に取り組んでいたとしたら、この解決法(ダミーのdefブロック追加)は有りえなかっただろう。逆に言えば他の解決法はあるのかもしれないが、お手上げになっていた可能性大であった。

他にも、ifブロックのネスト深さの違いもあったが、これは関係無かった。

方策2

方策1によって、DEXCSツールボタンのrunSolver.py以外の全てが機能する(ボタンを押せば所定の画面が現れる)ようにはなった。

ただ、runSolver.pyも、従来のように、端末画面が現れて、計算ログが表示されることはないのであるが、計算そのものは実行してくれている。また、そもそもDEXCSワークベンチで実行すれば良いので、これは無くす方向で考えているので、当面問題無いこととした。

問題は、runTreeFoam.pyとrunGridEditor.pyであり、根は同じ現象に至った。初期画面は現れるのであるが、肝心なGridEditor画面が表示されないのであった。runGridEditor.pyでは、TreeFoamモジュールのopenGridEditorDialog.pyが起動され、以下の画面が立ち上がる。

ここで、「開く」ボタンを押せば、おなじみの表形式画面が現れるはずなのだが、これがあがってこないということである。TreeFoamも同じで、TreeFoam本体は立ち上がるが、GridEditorを起動できない(他のボタンは問題無さそうであったが)。これを解決するには、TreeFoam本体の改造が必要になった。「開く」ボタンを押した時に実行されていたのは、

        pyTreeFoam.run(caseDir).command(comm)

であり、pyTreeFoam.py中の関数が使用されている。この実体は、

    def command(self, comm):
        """ commandを実行する。"""
        os.chdir(self.caseDir)
        dummy_proc = subprocess.run(comm, shell=True) 

という簡単なものであったが、この内容が問題であった。方策1で問題になったのと類似で、こちらはsubprocess.run にてプロセスを実行していた。

したがって、方策1と同様の対策によって解決するのではないかと思って対処したところ、GridEditorの表形式画面が現れるようになった。

めでたし、めでたし、となるはずであったが、、、

方策3

今度は、editConstantFolder.pyや、editSystemFolder.pyの挙動がおかしくなった。起動画面は問題無かったが、実際にエディタ画面が表示された段階にて、中味が真っ白な画面になってしまった。

これも調べると、上述のpyTreeFoam.py 中の同じ関数を経由してエディターを起動している事がわかった。この関数を変更した結果が、こちらには災いしたということであった。

諸々試行錯誤の末、今の所下記変更にて、問題は生じていないようである。

    def command(self, comm):
        """ commandを実行する。"""
        os.chdir(self.caseDir)
        #print('comm = ',comm)
        if comm[0] == '.':
            from PyQt5 import QtCore
            process = QtCore.QProcess()
            working_dir = self.caseDir
            if working_dir:
                process.setWorkingDirectory(working_dir)
            qcomm = 'bash -c ' + '"' + comm + '"'
            ret = process.startDetached(qcomm)
        else:
            dummy_proc = subprocess.run(comm, shell=True) 

つまり、スクリプトを作成して実行するタイプのもの(というか、環境変数を変更して実行するもの)は、Qprocessを使って起動する必要がありそうで、そうでないもの(エディターを起動するなど)は、subprocess.run で問題なく動きそうだということと、かつスクリプトで動くものは、最初に「.」という環境変数組み込みが記述されているという前提での処置である。逆に言うと、スクリプトの内容で、最初に「.」以外の文字があると、AppImage版では動かない可能性があることになる。

DEXCSランチャーから起動するTreeFoamのサブモジュール(プログラム)については、GridEditorの表形式画面が出る前に一瞬ダイヤログ画面が現れてすぐ消滅するという問題以外は、今の所、致命的問題が表出していないが、TreeFoamトータルの観点から問題があるかもしれない。このあたり、

  • 上記改造をDEXCS版固有で適用していくしかないのか
  • 上記改造をTreeFoam本体に適用する可能性
  • 他にもう少し手は無いか

など、TreeFoamの作者さんに問い合わせてみることとしたい。

方策4

方策3について、TreeFoam作者さんにも動作検証してもらったところ、FreeCADのランチャーボタンから起動したTreeFoamを使うと、いくつか問題が生じる事が判明した。

1.並列処理のdecomposeParによるメッシュ分割が機能しない。(分割できない。)
2.メッシュ作成時の特徴線(featureEdge)が抽出できない。

などである。特に1.については、FreeCADのランチャーボタンから起動した並列処理画面においても同様であった。

一方、FreeCAD-Daily版であるが、最新版は ver-0.20となっており、

起動オプションのカスタマイズが柔軟になった。すなわち、これまでDEXCSツールバーのダウングレードアイコンを使えるようにするには、一旦、ドラフトワークベンチを表示させる必要があった。今回のDEXCSワークベンチにおいてもスタート画面をDEXCSワークベンチにしておくとDEXCSツールバーのダウングレードアイコンが表示されないのは同様であったが、FreeCAD-Daily の新板を使うとこの問題が解消された。DEXCSランチャーボタンの挙動も問題無い。さらに、FEMワークベンチにおいて、様々な境界条件設定ツールが追加されていたという発見もあった。

一方で、今回のDEXCS2021においては、OpenFOAMのバイナリインストールや、Helyx-OSの搭載中止によって、isoイメージのサイズに余裕が出来ており、FreeCADについてDaily版とAppImage版の両方を収納する事も可能であることを確認できた。

また、CfdOFのソース中には、FreeCADがAppImage版であるかどうかを判定するコードがあったので、これを活用すれば、上述の問題に対する場合分けも可能となる。そこで、最終的に、以下の方針であたることとした。つまり、

DEXCS2021の標準では最新Daily版(ver-0.20)を使う設定とし、ニッチユーザー向けにAppImage(ver-0.19)に切り替えられるようにする。AppImageで使う場合には、DEXCSツールバーから、TreeFoamのボタンと、並列ボタンを押した場合に、正常に動作しない旨の警告を出すようにする、というものである。なお、念の為に記しておくが、FreeCADはDaily版を使おうが、AppImage版を使おうが、FreeCADのマクロやワークベンチ(一式がホームディレクトリ下の.FreeCAD中に収納される)は同じものを使うことになる。

具体的に、AppImage版からTreeFoamの起動ボタンを押すと、以下の警告メッセージが表示され、Daily版ではこのメッセージが現れないるようにした。

因みにこのメッセージは、以下のようにしてAppImage版かどうかの判定をした結果次第で表示されることになる。

env = QtCore.QProcessEnvironment.systemEnvironment()

if env.contains("APPIMAGE"):
    message = (_("this FreeCAD is AppImage version.\n  some function of TreeFoam doesen't work.\n if you want utilize the function, use normal TreeFoam clicked by dock-launcher button.")) 
    ans = QtGui.QMessageBox.critical(None, _("AppImage Warning"), message, QtGui.QMessageBox.Yes)
    dexcsCfdTools.removeAppimageEnvironment(env)

また、FreeCADをDaily版/AppImage版 切り替える方法は、それぞれの起動コマンドを、

/usr/bin/freecad-daily -> /etc/alternatives/freecad-daily
/usr/bin/freecad-AppImage -> /opt/freecad

として、/usr/bin フォルダ下に収納しておく。FreeCADの起動コマンドを、freecad として以下がデフォルトの状態。

/usr/bin/freecad -> /bin/freecad-daily

AppImage版に切り替えたい時は、

$ sudo rm /usr/bin/freecad
$ sudo ln -s /usr/bin/freecad-AppImage /usr/bin/freecad

として使ってもらおうというものである。少々面倒だが、どうしてもAppImage版を使いたい人というのは、ある程度オープンCAEを使い慣れた人に特化されるであろうので我慢してもらうことにする。

前へ 目次

Share

コメントする

メールアドレスが公開されることはありません。

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