DEXCSランチャー on CentOS



DEXCSランチャーは、DEXCS2020あたりから、DEXCS for OpenFOAM(on ubuntu)以外のLinux環境でも動かせることを目標に開発しているが、今回具体的にCentOS7で動作することを確認した。DEXCSランチャーがv2.5のままで動作しなかった部分は改変したり、インストール以前のモジュールインストールで諸々回り道もあったが、モジュールインストールも含めて、多分これが最短コースとなるであろうやり方にまとめ直したものを備忘録としてここに記しておく。

但し、今回構築した環境では、以下の難点がある点はお断りしておく。

  • TreeFoamの動作に関して一部不具合がある
  • DEXCSツールバーからの起動についても少々難有りである
  • 日本語メニューになってくれない

動作確認環境

CentOS Linux release 7.9.2009 を仮想環境(VMware Workstation 16 Player)にインストールして動作確認

主要モジュールとインストール先

DEXCSランチャーのうち、DEXCSワークベンチを動かすのに必要なモジュールは、OpenFOAMは当然のこととして、ParaViewとFreeCADがインストールされているのが必須で、ここではそれぞれのモジュールのバージョンやインストール情報が以下のようになっているものとして説明する。すでにOpenFOAMの稼働する環境が存在するのであれば、読み替えて実施もできるであろう。但し、FreeCADに関しては、AppImage版以外の動作は確認できておらず、DEXCS for OpenFOAMでの古いバージョンでの経験からすると、難しそうである。

  • OpenFOAM-v2106 ⇒ (インストール先)/usr/lib/openfoam/openfoam2106
  • ParaView-5.10.0-RC1-MPI-Linux-Python3.9-x86_64 ⇒ /usr/bin/paraview で起動できるようにしてある
  • FreeCAD_0.19-24276-Linux-Conda_glibc2.12-x86_64.AppImage
  • TreeFoam-3.07+dexcsSwak

DEXCSツールバーの多くはTreeFoamのサブセットを起動するものであり、TreeFoamがインストールされていることが前提となる。但しTreeFoamがインストールされていないと、これらの機能が使えないというだけで、DEXCSワークベンチ(メッシュ作成とソルバー実行、プロット処理)を使うには支障ない。因みにDEXCS-WBとDEXCSツールバーの違いは以下の図を参照されたい。

DEXCSランチャーのインストール方法

DEXCS2021 for OpenFOAM の内容($HOME/.FreeCAD)そのままでは不具合があるので、GitLabのページからソース一式(v2.5.3以降)をダウンロード(あるいはgit clone git@gitlab.com:dexcsof/dexcs-launcher.git)する。

configDexcs

同梱のconfigDexcs.2021等を参考に、configDexcsを作成。本例の場合は、前項のインストール先モジュール情報に基づくと以下の内容になる(行頭の#はコメント)。

# cfMesh がインストールされたOpenFOAM環境
    cfMesh  /usr/lib/openfoam/openfoam2106

#configTreeFoam のインストール場所
    TreeFoam    ~/.TreeFoamUser

#dexcs のインストール場所
    dexcs   /opt/DEXCS

なお、最下行のdexcsのインストール先については、TreeFoam+dexcsSwakを使用する場合に必要なモジュールの収納先を指定するもので、オリジナルのTreeFoamを使用する場合や、そもそもTreeFoamをインストールしていない場合には、2番目のTreeFoam のパラメタも含めて不要である(但し、後述のFreeCADの設定メニューで、雛形フォルダの設定変更が必要になる)。

updateDexcsLauncher.sh

 ソース一式の収納フォルダ中に、updateDexcsLauncher.sh というファイルが存在するので、これを実行する。その際、既存の user.cfg を上書きするかどうかの質問があるので、上書きして良ければ「 Y 」を入力してインストール(.FreeCADのアップデート)は完了である。すでにFreeCADを使い込んで、独自のマクロツールなどを使用している場合には、上書きしないで、同梱README.md中のセットアップ方法の記述を参考に、user.cfgを変更する作業をしても良い。

FreeCADの設定

FreeCADを起動したら、「編集」⇒「設定」メニューを選択した以下の設定画面で、左欄の[dexcsCfdOf]を選択すると、以下の設定画面状態となる。

本記事の前項(主要モジュールとインストール先)で対象としたシステムであれば、このまま確認するだけで良いが、OpenFOAMやParaViewのインストール場所が異なる場合に、この画面を使って指定箇所を変更する。特に、TreeFOAM+dexcsSwak を使わない場合に、4番目の「Template Case」が存在しないことになってしまうので、標準チュートリアルケースなり、事前に雛形に出来そうなケースファイルを用意しておくことが必要になる。

なお、5番目(Software dependencies)以下のボタンについては、DEXCSワークベンチ(dexcsCfdOF)を作成するにおいて元ネタであるCfdOF用に付属していたもので、DEXCSワークベンチ用にはこれらを削除してリリースしたかったが、削除すると全体動作がおかしくなるので、やむを得ず残したままの状態にしてある。それぞれのボタンを押したからといって、システムに不具合を生じる可能性はないと思うが、多分正しく機能しない点はお断りしておく。

DEXCSツールバーの動作について

DEXCSランチャーのうち、DEXCS-WB(ワークベンチ)は凡そ問題なく動作することは確認できているが、DEXCSツールバーについては不具合がいくつかあるので、ここにその内容を取り纏めておく。

また、DEXCSツールバーだけを並び方向を変えて表示すると以下のようになっているが、システム(アイコンファイルの有無)によって異なってくる。

TreeFoamを使わない(インストールされていない)場合

そもそもDEXCSツールバーにおいて、TreeFoamのサブセットを使えないのは当然として、ほとんどのボタンに×マークが付く(アイコンが非表示というだけである)が、以下一部のボタンは使用可能である。

  • 解析ケースファイルの確認
  • 計算結果を削除して、caseを初期化します
  • paraFoamの起動
  • postProcessingファイルのプロット
  • OpenFOAM端末を起動
  • postProcessプロット用GUIエディタ
  • FSI用inpファイルを作成します
  • stlファイル(アスキー形式)を作成します
  • 複数の形状の和集合を作成
  • オブジェクトの体積・表面積・重心を表示します
  • オブジェクトのダウングレード

TreeFoam+dexcsSwakを使う場合

前節(TreeFoamが無い場合)に加えて以下のボタンが使用可能になるが、使えるというだけで、いずれもDEXCS-WBでの使用が推奨される。

  • cfMesh用設定ファイルを作成します
  • solverを起動(但し、単体計算で、計算ログは表示されない)
  • plotWatcherの起動

以下のボタンは、押しても実行はしてくれないが、押した後に、ケースフォルダ中で開いた端末から./run を実行すると、TreeFoamのサブセット機能がそれなりには使える。

  • 新規にcaseを作成。またはsolverやmeshを入れ替え
  • gridEditorの起動
  • Propertiesの編集
  • Dict(system)の編集
  • 並列処理

treefoamを起動します」のボタンだけは機能しないので、TreeFoamを使いたい場合は、コマンドラインでi

$ /opt/TreeFoam/treefoam

と入力して起動する。

TreeFoamの不具合について

上述したように端末から、/opt/TreeFoam/treefoamと入力すれば、起動できるが、一部の機能(vtk表示)が不全である。pytho3-vtkはインストールされているはずなんだが。。。原因は不明。本記事の本来目的からは外れるので、これ以上の追求は中断している。ご要望あれば調査する。

日本語表示について

端末にて、echo $LANG と打ち込んだら、

en_US.UTF-8

と帰ってきた。これが ja_JP.UTF-8 になっていれば、日本語表示されるはずで、こちらはそんなに難しいことでははいはずだが、これも本記事の本来目的から外れるので、これ以上の追求は中断している。これもご要望あれば調査する。

主要モジュールのインストール方法メモ

動作確認には、手元にCentOSで稼働する環境がなかったので、DEXCSランチャー以外のモジュール(OpenFOAM, ParaView, FreeCAD, TreeFoam,…)のインストールも実施することになったので、以下に実際にインストールした方法について取り纏めておく。

なお、ほとんどのモジュールがバイナリファイルの直接コピーなり、yumのパッケージインストールができたので、一昔前の苦労は何だったのかという内容になっている。

OS、デスクトップ環境

何故か、ネットワークがつながらないようであった。そこで、何年かぶりにvi エディタを使わざるを得ない状況となった。

$ sudo vi /etc/sysconfig/network-scripts/ifcfg-ens33

TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=06cfdf96-e304-4765-b67d-d0b28edd6b8f
DEVICE=ens33
ONBOOT=yes

最下行が、no になっていたので、これをyesに変更してreboot したらつながった。

ここで、CentOSって、標準はGUIのデスクトップ環境が組み込まれないということに気付いた。

$ sudo yum update -y
$ sudo yum group install “GNOME Desktop” -y

インストールには10分程かかるが、再起動してログインし、startx と入力してようやくデスクトップ環境が立ち上がる。

最近のvmplayerでは、共有ファイルを使えるようにするのに、ひと手間必要になった。

$ sudo vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other -o nonempty

OpenFOAM

基本的には以下のサイト情報を、ほとんどそのまま信用できたが、

https://develop.openfoam.com/Development/openfoam/-/wikis/precompiled/redhat

dnfが無いといって叱られたので、これも追加インストールした。

$ sudo yum -y install dnf-plugins-core
$ sudo yum -y config-manager –set-enabled PowerTools
$ sudo yum -y install epel-release
$ sudo yum install dnf
$ sudo dnf copr enable user/project
$ sudo dnf -y copr enable openfoam/openfoam
$ sudo yum -y install openfoam-selector
$ sudo yum -y install openfoam

ParaView

Paraviewのダウンロードサイトより最新版(ParaView-5.10.0-RC1-MPI-Linux-Python3.9-x86_64.tar.gz)をダウンロードして展開。これを/opt下に収納し、

$ sudo ln -s /opt/ParaView-5.10.0-RC1-MPI-Linux-Python3.9-x86_64 /opt/paraview

また、ParaViewの実行コマンドとして/usr/bin/paraviewを以下の内容

#!/bin/bash
/opt/paraview --mesa $1

paraFoamの実行コマンドとして、/usr/bin/paraFoamを以下の内容

#!/bin/bash
#paraview launcher
export LD_LIBRARY_PATH=''
a=`pwd`
openName=`basename $a`.foam
touch $openName
/usr/bin/paraview $openName
rm $openName

のスクリプトファイル(実行権限付き)を収納した。

FreeCAD

これもFreeCADのダウンロードサイトより最新のAppImage版(FreeCAD_0.19-24291-Linux-Conda_glibc2.12-x86_64.AppImage)をダウンロードし、そのまま/opt下に収納。

$ sudo chmod +x FreeCAD_0.19-24291-Linux-Conda_glibc2.12-x86_64.AppImage
$ sudo ln -s /opt/FreeCAD_0.19-24291-Linux-Conda_glibc2.12-x86_64.AppImage /opt/freecad
$ sudo yum install -y libXScrnSaver

TreeFoam+dexcsSwak

TreeFoamに関しては、DEXCS2021 for OpenFOAM で構築した仮想マシンの /opt/TreeFoam および/opt/DEXCS以下をまるごと、ホームディレクトリ下の.TreeFoamUser をコピーしたものを予め共有フォルダ下に収納しておいて、

$ sudo cp -r TreeFoam /opt
$ sudo cp -r DEXCS /opt
$ cp -r .TreeFoamUser ~/

としてコピー収納したのと、CentOS7には、python3が入っていないので、以下python3周りでいくつかモジュールインストールが必要であった。

python3

$ sudo yum install -y https://repo.ius.io/ius-release-el7.rpm
$ sudo yum install -y python36u
$ sudo yum install -y python36u-libs
$ sudo  yum install -y python36u-devel
$ sudo  yum install -y python36u-pip
$ sudo yum install -y python36-gobject
$ sudo chmod 666 /opt/TreeFoam/TreeFoamVersion
$ sudo pip3 install -y PySide2
$ sudo pip3 install -y vtk

MPI

OpenFOAMで並列計算できるよう、MPIのインストールも必要であった。

$ sudo yum install -y openmpi

DEXCS2021 for OpenFOAM(R) 不具合・更新情報

表記に関する情報は、このページに集約しておきます。このページに記載されていない不具合情報などあれば、遠慮なくお問い合わせ下さい。



ソフトウェア更新の問題

下に「ソフトウェアの更新」をすると、VitualBoxの問題が解消されると記しましたが、11月3日以降に更新すると、openfoam2106まで更新されてしまいます。何故か、この更新版にはcfMeshが含まれておりませんで、DEXCSでのメッシュ作成ができなくなってしまいます。したがって、更新の際には、これを除外するよう強く推奨します。

万一更新してしまった場合には、別途cfMeshをインストールする方法も考えられますが、旧版も入手できるので、

更新版をアンストール、

$ sudo dpkg -r –force-all openfoam2106

してから、旧版を

https://dl.openfoam.com/repos/deb/dists/focal/main/pool/2106_0/binary-amd64/

より(全部で7つのファイル)をダウンロードして、ダウンロードしたファイルを収納したフォルダにて、以下インストール

$ sudo dpkg -i openfoam*

すれば、元に戻せるはずです。

なお、更新版でcfMeshが使えなくなったのは、単に開発元の手違いだと思うので、当面更新版を使うことはしないで、しばらく様子見することにします。

FreeCADの更新の問題

FreeCADを更新してプロットツールが使えなくなる場合がありますが、これは対応可能で、「ツール」⇒「アドオン・マネージャ」にて、「plot」をインストールすればOKです。

インストール方法の問題

VirtualBoxで、正常にログアウトが出来ないという問題がありましたが、これはsetupDEXCS.shを実行する前に、「ソフトウェアの更新」を実施しておけば解消されるようです。また、「システムのエラーが見つかりました・・・」というエラーメッセージ(実害は無かった)も出る確率がぐっと下がるようです。

ちなみにこの情報は、読者さんから頂きました。感謝ですm(_ _)m

インストール方法の更新版もアップしておきました。

isoイメージの名前について

ダウンロードしたisoイメージのファイル名がDEXCS2021-OFv2006-64.isoとなっていますが、DEXCS2021-OFv2106-64.iso とすべきでした。

python3-vtk エラー

TreeFoamのGridEditorから、「patchViewerを表示」メニューボタンを押すと、以下のエラーメッセージが出ます。

動作確認が不十分であった為の単純ミスです。以下のコマンド入力でインストール出来ます(注記1)。

$ sudo apt install python3-vtk

DEXCSツールボタンの不具合

DEXCSツールバー中の「TreeFoam起動」ボタンと「並列処理」ボタンにおいて、起動画面は正常に立ち上がるが一部の動作が正しく機能しない。これは、FreeCADをAppImage版にて使用した際に(AppImage版との使い分けについてはインストール方法メモのp23,24 を参照)、以下のようなダイヤログで警告が表示されるのだが、AppImage版でない場合にこの警告が出ないのに、当該の不具合が生じてしまうというもの。

これは、Appimage版とそうでない場合に処理を分岐させるべく、FreeCADの環境変数を取得して判別できるところまで判ったので、この時点で警告メッセージを表示させるところまではプログラムが出来ていたのだが、その続きを完成させるのを失念していたというボケであった。

遅ればせながら、修正版をDEXCSランチャーのGitLabサイトにて更新しておいた。.FreeCADのフォルダ毎変更しても良いが、その際には、user.cfgを書き換えるセットアップ作業が必要になり、そのドキュメントが未完なので、runTreeFoam.py と、runParallel.py  だけを変更してもらっても良い。

【注記1】python3-vtkのインストールについて

先に、以下の方法でインストール出来ると記しましたが、この方法だと、vtkのバージョンが合わないのか、表示がおかしかったり、Paraviewの立ち上げで、「メッシュ作成タスク画面」や、「ソルバー実行タスク画面」の「Paraview」ボタンが使えなくなってしまいます。

$ sudo apt install python3-pip
$ pip install vtk

これを実行してしまった場合には、

$ pip uninstall vtk

にてアンインストールして、正しいインストールをやり直して下さい。

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

ダウンロードはこちら(2021/10/〜)



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

詳しくはこちら

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

DEXCS2021では、

  • ベースOSはubuntu-20.04.2 (LTS)
  • OpenFOAMやその他の組み込みツールのヴァージョンアップに対応
    • OpenFOAM-v2106(パッケージインストール版)
    • ParaView-5.9.1(バイナリー版)

(cfMeshはOpenFOAM-v1712以降、modules としてOpenFOAM本体に組み込まれています)

  • ここまでは通常の毎年更新作業ですが、DEXCS2021からはDEXCSランチャーのうちcfMesh作成用マクロとソルバー実行部分は従来通り使うこともできますが、新たにDEXCSワークベンチで実行できるようになり、これを使えば以下のメリットがあります。
    • cfMesh設定の詳細オプション設定もGUIで出来るようになる
    • cfMeshの設定パラメタがFreeCADのモデルファイル情報として保存される
    • ポスト処理の手順が簡単になる
  • DEXCSツールバーも一部変更しています(下図)
    • plotWatcherの起動 はFreeCADの Plotワークベンチを使用する方法に変更しました、自動更新はされませんが、DEXCSワークベンチからソルバー実行すれば、初期残渣グラフが表示され、自動更新されます。
    • postProcessingフォルダ中のファイルの可視化が、これまでのJGPに替えてPlotワークベンチを使用するマクロに変更した事で格段に使い勝手も見栄えも良くなっています。
    • OpenFOAM専用端末の起動ボタンも追加しました。
  • pyFoam は、OpenFOAM-v2106への対応はアナウンスされておりません。TreeFoamで使っている機能(pyFoamPlotWatcher.pyやFoamCleaCase.pyなど)についてのみ動作確認しており、その他の機能については動作未確認です。

インストールと利用法

詳しくはこちら(日本語と英語の切り替え方法も含む)

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

  • 継続利用では起動後にインストール機能により、HDD等に直接インストールできる上、使用するユーザー名等を選択することができます。
  • VMWare Playerや、VirtualBox等の仮想環境で起動して、仮想環境を作成することも簡単です。
  • VirtualBoxにインストールする方法は、書籍「OpenFOAMによる熱移動と流れの数値解析(第2版)」の付録A、または「オープンCAEのためのDEXCS for OpenFOAM ハンドブック」の付録AにDEXCS2020について詳しく記されており、基本は同じですが、setupDEXCS.sh を実行後の再ログイン画面が表示されない場合があります。その場合の対処法についてインストール方法のp.5,7,18,20-22あたりを参考にして下さい。結論的には、「ログアウト」メニューは使えないので、「再起動」メニューを使って下さい、ということです。
  • 共有ファイルの設定方法(インストール方法の39〜42ページ)もDEXCS2020以前と比べてかなり変更されています。
  • 国際化対応のレベルはDEXCS2015に同じ(英語版のみに対応)ですが、日本語⇆英語のベース環境切り替え方法が、DEXCS2015に比べやや煩雑になっています。(インストール方法の8〜13ページ)
  • 一部動作に不具合が確認されています(インストール方法の19ページ)。解決方法が見出だせませんでした。お判りの方、またこれ以外の不具合に気づかれた方はご連絡下さい。
  • FreeCADはDaily最新版(2021/10/9入手)が同梱されていますが、Windows版やMac版と互換性のあるAppImage版も同梱されています。切り替える方法についてはインストール方法メの23ページに、Daily版とAppImage版の機能比較については、24ページに記してあります。
  • FreeCADはDaily最新版は、頻繁に更新されており、ソフトウェア更新は可能ですが、稀に一部の機能不全が生じる可能性もある事を納得した上で実施して下さい。

同梱プログラム

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

  • DEXCSランチャーのヘルプメニュー(上図)を参照下さい。
  • SLURMというリソースマネージャは今回もインストールしてありませんが、下記記事の方法によって追加インストールは可能(のはず)です。
  • JAVA gnuplot GUI の使用方法
    • http://dexcs.net/ocse2/?p=747
    • 上記記事で作成したプロジェクトファイルをケースファイルの在所を変えたり、別ケースで転用利用する際に、プロジェクトファイル中に記されているデータ在所(絶対パス名)を適合するツールを同梱しました。
  • 上記適合ツールは、DEXCSランチャーの左図ボタンにて起動します。⇒ 解説ページ
  • または、TreeFoam /十徳ナイフ /「汎用gnuplot-GUI(jgp)起動」メニューでも起動できます。
  • 但し、十徳ナイフ版では、実行時のダイヤログメッセージが日本語ではありません。
  • 更新された上記ツールの使用方法は、はじめてDEXCS2021、P.30-33を参照下さい。近日中に別途作成予定。
  • TreeFoamの基本的な使い方はTreeFoamのヘルプメニューから、「使い方」を参照して下さい。
    TreeFoamに関する情報は、DEXCS公式HPの AboutTreeFoamの記事にまとめてあります。
    DEXCS2021に搭載のTreeFOAMは、+dexcsSwakとして、上記公式ページに掲載ヴァージョンに対して独自のカスタマイズが加えてあります。

DEXCSランチャーv2.5 製作メモ / 追記事項



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 のものは除外した。

何かもう少しスマートな書き方がいくらでもありそうだが、まぁここが素人プログラマの限界ってことで。とりあえず先に進む事にした。それよりも、モデル中に上述の名前で始まるパーツ名があると厄介な事になるかもしれないので、ここはメモしておきたい。

前へ 目次

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を使い慣れた人に特化されるであろうので我慢してもらうことにする。

前へ 目次