(タイトル)未定(副題)DEXCS for OpenFOAM の使い方(第7章 DEXCS-OFの拡張例)

(本記事は執筆予定本の下書きにて、工事中の内容である点ご承知おき下さい)

7-3. preCICE



本記事中で使用するマテリアル一式(注記8)のダウンロード

preCICE(Precise Code Interaction Coupling Environment)というのは、ミュンヘン工科大学やシュトゥットガルト大学の研究グループで開発された汎用の連成計算ツールで、LGPL3ライセンスに基づくオープンソースソフトウェアとして、https://www.precice.orgにて公開されているものである。

このツールの特徴は、個々のソルバーに対して、アダプターと呼ばれるライブラリをビルドすることによって、通信やマッピングといった連成機能をソルバーの機能で直接実行できるようになる。これによってボトルネックとならない高精度な連成を実現してくるというものである。

エンドユーザーの立場からすると問題はアダプターの構築法であるが、OpenFOAM、deal.II、FEniCS、SU2、CalculiXなどの有名な商用およびオープンソースソルバー用のすぐに使用できるアダプターが利用可能であるとの事。本項では、これらを使って、OpenFOAMとCalcuiliXの流体構造連成解析(FSI)を試みた結果を紹介する。

説明の内容は、

  1. ツールのインストール
  2. 公開されているチュートリアル問題の動作確認
  3. DEXCSチュートリアル
    1. DEXCSランチャーの拡張
    2. DEXCSランチャーによる簡単な流体構造連成問題の作成演習

の順になっている。

なお、本内容は、オープンCAE勉強会@岐阜の2020年度夏合宿で実施を予定していたもので、全てのツール(1.と3-1.)をインストール済でチュートリアル例題も収納したisoイメージをDEXCS特別版として制作し、これを使った演習(2.と3-2.)となっていたが、コロナ禍で中止となったので、形を変えて公開する事とした。

また、preCICEについて詳細な使い方を説明するものではなく、筆者を含めて、ほとんど初心者の人が、まずは使える状態になることを目指す。これから使いながら勉強していく為の参考情報であるという点もお断りしておきたい。

興味の有る方は、本書を手掛かりとして取り組んで頂ければと思う。


ツールのインストール

DEXCS-OF上でOpenFOAMとCalculiXのpreCICE連成を実現するには、OpenFOAMは既存のものを使えるとして、以下のインストール・ビルド作業が必要になる。

preCICE

preCICEの本体は、最近になってパッケージインストールが可能になってはいる。しかし残念ながら、DEXCS2019(Ubuntu-18.04)向けのパッケージでは、PETScがビルドされていないとあり、これが無いと、一部の並列計算が動いてくれない。

そこで、ここではPETScを含めてソースからビルドする方法を試みた。

まずはビルドに必要なパッケージをインストールする。

$ sudo apt update && sudo apt install build-essential cmake libeigen3-dev libxml2-dev petsc-dev libboost-all-dev python-dev python-numpy git

ビルドはホームディレクトリ下に、preCICEフォルダを作成して実施する。

$ cd $HOME
$ mkdir preCICE

PETSc は、https://www.mcs.anl.gov/petsc/download/index.html
より最新版(petsc-lite-3.13.3.tar.gz)をダウンロードして、$HOME/preCICE以下で展開し、

$ cd petsc-lite-3.13.3
$ ./configure
$ make all test

makeが完了すると、$HOME/preCICE/petsc-lite-3.13.3/petsc-3.13.3/arch-linux2-c-debug/lib/以下にライブラリ(libpetsc.so.3.13.3)が出来ているので、これを標準ライブラリパスに収納しておく。

$ sudo cp ./arch-linux-c-debug/lib/libpetsc.so.3.13.3 /usr/lib/x86_64-linux-gnu/
$ sudo ln -s /usr/lib/x86_64-linux-gnu/libpetsc.so.3.13.3 /usr/lib/x86_64-linux-gnu/libpetsc.so.3.13

preCICE本体は、https://github.com/precice/precice/tags
より、最新版(precice-2.0.2.tar.gz)をダウンロードしたものを展開して、cmakeによる方法でコンパイルしている。その際に、petsc関連パラメタ(-DPETSC…)を上記petscをインストールしたディレクトリ名にて指定しておく。

$ tar xzvf precice-2.0.2.tar.gz
$ cd precice-2.0.2
$ mkdir build
$ cd build
$
cmake -DBUILD_SHARED_LIBS=ON -DCMAKE_BUILD_TYPE=Debug -DPETSC_DIR=$HOME/preCICE/petsc-3.13.3 -DPETSC_ARCH=arch-linux-c-debug ..
$ make -j 4
$ sudo make install

CalculiX

CalculiXはオープンソース(GPL)の有限要素解析ソフトウェアで、応力解析、座屈解析、固有値解析など主に構造解析を中心にした解析ができる。DEXCS-OFでは、FreeCADのFEMモジュールから使えるようになっているが、preCICEの機能を使うには、このモジュールでなく、別にソースビルドしたモジュールをベースにアダプター付きの実行モジュールを作成する事になる。

基本、以下のサイトの情報に基づいてビルドしているが、
https://github.com/precice/calculix-adapter/wiki/Installation-instructions-for-CalculiX
http://penguinitis.g1.xrea.com/study/preCICE/OpenFOAM_CalculiX_FSI/OpenFOAM_CalculiX_FSI.html
上記内容(特にpreciceWikiの資料)が、頻繁に更新されているようなので、今回実施した方法を以下に取り纏めておく。
また、前提として、ホームディレクトリ下に、CalculiXというフォルダを作成し、そのフィルダ内で関連ツールもビルドする。

$ cd $HOME
$ mkdir Calculix
$ cd Calculix

CalculiXをコンパイルするには、その前に、

をビルドする必要がある。

SPOOLES

$ cd $HOME/CalculiX
$ wget http://www.netlib.org/linalg/spooles/spooles.2.2.tgz
$ mkdir SPOOLES.2.2
$ tar zxvf spooles.2.2.tgz -C SPOOLES.2.2
$ cd SPOOLES.2.2

Make.incを以下編集

14 CC = gcc
15 # CC = /usr/lang-4.0/bin/cc

コンパイル

$ make lib

ARPACK

$ cd $HOME/CalculiX
$ wget https://www.caam.rice.edu/software/ARPACK/SRC/arpack96.tar.gz
$ wget https://www.caam.rice.edu/software/ARPACK/SRC/patch.tar.gz
$ tar xzfv arpack96.tar.gz
$ tar xzfv patch.tar.gz
$ cd ARPACK/

ARmake.inc を以下編集

28 #home = $(HOME)/ARPACK
29 home = $(HOME)/CalculiX/ARPACK

116 #MAKE = /bin/make
117 MAKE = make

105 #FC = f77
106 FC = gfortran
107 #FFLAGS = -O -cg89

36 #PLAT = SUN4
37 PLAT = INTEL

UTIL/second.fを以下編集

24 * EXTERNAL ETIME

コンパイル

$ make lib

yaml-cpp

yampl-cppはアダプターが使用するもので、静的ライブラリーと共有ライブラリーが必要になるとの事。

$ cd $HOME/CalculiX
$ wget https://github.com/jbeder/yaml-cpp/archive/yaml-cpp-0.6.2.zip
$ unzip yaml-cpp-0.6.2.zip
$ cd yaml-cpp-yaml-cpp-0.6.2

コンパイル(静的ライブラリー)

$ mkdir build
$ cd build
$ cmake ..
$ make

もう一度、別にコンパイル(共有ライブラリー)

$ cd ..
$ mkdir build2
$ cd build2
$ cmake -DBUILD_SHARED_LIBS=ON ..
$ make

ccx(CalculiX本体)

ccxの最新版はv2.16であり、次項のcalculix-adapterも最新版に対応したものが公開されているが、後述するFreeCADを使って固体領域の計算モデルを作成するのに使用するccxは2.15であるので、Verを併せておく必要がある。FreeCADで使用するccxのVerを上げるのも方法ではあったが、最新版よりも2.15の方が公開チュートリアルの動作が安定しており計算速度も早かったので、ccxは2.15を使う事とした(注記1)。

$ cd $HOME/CalculiX
$ wget http://www.dhondt.de/ccx_2.15.src.tar.bz2
$ tar xvjf ccx_2.15.src.tar.bz2
$ cd CalculiX/ccx_2.15/src
$ make

cgx

CalculiXのプリプロセッサーであり、preCICEアダプターには必要無いが、チュートリアルケースで使用するので、これもインストールしておくが、これはパッケージインストールしたものでOK。

$ sudo apt install calculix-cgx

calculix-adapter

calculix-adapterも、preCICEやccxのヴァージョンに応じてソースが異なるので、ソースを間違えないようにしよう。

$ cd $HOME/preCICE
$ wget https://github.com/precice/calculix-adapter/archive/v2.15_preCICE2.x.zip
$ unzip master.zip
$ cd calculix-adapter-master

Makefile を以下変更。

5 CCX = $(HOME)/CalculiX/CalculiX/ccx_2.15/src
7 SPOOLES = $(HOME)/CalculiX/SPOOLES.2.2
9 ARPACK = $(HOME)/CalculiX/ARPACK
11 YAML = $(HOME)/CalculiX/yaml-cpp-yaml-cpp-0.6.2

コンパイル

$ make
$ sudo cp bin/ccx_preCICE /usr/bin

openfaom-adapter

openfaom-adapterをビルドするには、OpenFOAMの環境下で実行する必要があるので、OF専用端末にて実施するが、その際、先に作成した、yaml-cppも必要になるので、

$ export CPLUS_INCLUDE_PATH=$HOME/CalculiX/yaml-cpp-yaml-cpp-0.6.2/include:$CPLUS_INCLUDE_PATH

として、在所を設定する。

$ cd $HOME/preCICE
$ git clone https://github.com/precice/openfoam-adapter.git
$ cd openfoam-adapter
$ ./Allwmake

preCICE tutorials

$ cd $HOME/preCICE
$ git clone https://github.com/precice/tutorials.git


公開チュートリアルの動作確認

前項において、公開されているチュートリアルを一式ダウンロードした事になるが、公開されているアーカイブにおいては、一つの解析ケースに対して、様々なソルバー連携する方法が公開されている。つまり、tutorialsフォルダ内は、

  • カテゴリー(CHT, FSI, etc)
    • 解析ケース1
      • ソルバー連携法(OpenFOAM-CalculiX, OpenFOAM-FEniCS, erc)
    • 解析ケース2
      • ソルバー連携法

といった階層構造にて収録されている。したがって、ここで取り扱う事の出来ない例題も多いので、デスクトップ上のDEXCSフォルダ内、preCICEtutorialsというフォルダを作成し、ここに実行可能なチュートリアルケースだけを、コピーして実行確認する事とした。その際に、フォルダの階層構造も、ソルバー連携法で名前を区分する意味はなくなるので、実行可能な連携法の名前に収納されているファイル一式を、解析ケース名の直下に収納し直す事とした。

具体的に、本環境で実行可能なソルバー連携は3通りしかないので、

  • Calculix-Calculix
    • SSI
      • loaded_beam
  • OpenFOAM-Calculix
    • CHT
      • heat_exchanger
    • FSI
      • 3D_Tube
      • cylinderFlap
      • flap_perp

という形で、5つのチュートリアルケースを動作検証対象と出来る。また、openfaom-adapter内にもチュートリアルケースが存在するので、これらも以下追加した(こちらは階層構造を変えていない)。

  • OpenFOAM-OpenFOAM
    • CHT
      • flow-over-plate
        • bupyantPimpleFoam-laplacianFoam
        • bupyantPimpleFoam-laplacianFoam_nearest-projection

以上の操作をファイルマネージャ上での操作イメージとして取り纏めたのが図7-3-1.である。

図7-3-1.チュートリアルケース

また、各チュートリアルケース内には、自動実行できるべく、Allrun, Allrun-parallel, Allcleanが同梱されているが、OpenFOAMとpreCICEの環境設定を組み込むべく、スクリプトの冒頭に、以下の行を追加した。

. $HOME/OpenFOAM/OpenFOAM-v1906/etc/bashrc
export CPLUS_INCLUDE_PATH=$HOME/CalculiX/yaml-cpp-yaml-cpp-0.6.2/include:$CPLUS_INCLUDE_PATH
export LD_LIBRARY_PATH=$HOME/CalculiX/yaml-cpp-yaml-cpp-0.6.2/build2:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH=/usr/local/lib:/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH

念の為、それぞれの意味を記しておく。

1行目は、OpenFOAMの実行環境を組み込んでいる。

2行目と3行目は、アダプターが使用するyaml-cppに関して、静的ライブラリと共有ライブラリのパスを示している。

4行目は、openfoam-adaptorが使用するライブラリの一部(/usr/lib/x86_64-linux-gnu/libfftw3_mpi.so.3)が、OpenFOAM固有で設定したものとバッティングするのを、本来パスに含まれる/usr/lib/x86_64-linux-gnu:をOpenFOAM の指定パスより前に持ってきているということである。

その他、公開されたケースをそのまま使ったのでは、使い難い点がいくつかあったので、以下修正を施したものを、preCICETutrials.ta.gz として拙宅HPよりダウンロード出来るようにしておいた(注記8-1.)。

  • OpenFOAM-Calculix/CHT/heat_exchangerのチュートリアルケースについては、メッシュデータが含まれていないので、同梱されているDownload_meshesを予め実行してメッシュデータを含めたものとした。
  • OpenFOAM-Calculix/FSI以下に含まれるOpenFOAMのケースファイルについて、0または、0.origフォルダ下に収納されたフィールド変数データであるが、OpenFOAMのヘッダファイルが含まれていなかったので追加した。ヘッダファイルの有無はOpenFOAMの動作そのものに影響は無いが、TreeFoamのファイル操作に影響が出るので(注記2)。
  • OpenFOAM-Calculix/FSI/3D_Tube のAllcleanはそのままでは計算結果を削除してくれなかった。これはAllclean中17行目のcleancaseをコメントアウトしてあった為であった。ただ単純にこのコメントを外してcleancaseを実行してしまうと、メッシュデータまで削除されてしまう。このメッシュデータはAllrunのプロセスで作成されたものでないので、削除してしまうと再度の計算が出来なくなってしまうので、cleancaseをコメントアウトしたのは苦肉の策であったと推察された。
    • しかしcleancaseのスクリプトを調べたところ、polyMeshフォルダ中に、blockMeshDictファイルが存在すれば、メッシュデータを削除しない事が判ったので、ダミーのblockMeshDictを配置して、cleancase を実行させるよう変更した。
  • OpenFOAM-Calculix/FSI/cylinderFlap のケースでは総計算時間が長大になるので、現象時間の10秒分になっていたのを6秒分に短縮した。Fluidの出力間隔は0.1秒間隔であったのを0.05秒間隔とした。
  • 上記ケースSolid計算の計算結果が毎ステップ出力され、出力ファイルサイズが2Gバイトを超えてしまう。このままだとよほどの高スペックマシンでないと可視化が出来なくなってしまうので、flap.inpの出力指定行において、下記のように、, FREQUENCY= 50を追記して、Fluidの出力間隔に合わせるようにした。

*NODE FILE, FREQUENCY=50
U, RF
*EL FILE, FREQUENCY=50
S, E

  • CalculiX-CalculiX/SSI/loaded_beamのAllrunは別途(11行目のパスを)変更し、Allcleanを追加した。またOpenFOAM系のAllrun-parallelの一部(Allrunをコールするタイプのもの)は変更していない。
  • 3D_Tube用にAllrun_parallelを追加、Allclean一部修正

公開チュートリアルDEXCS改の実行方法

これらの変更により、DEXCS的にGUI(ファイルマネージャ上)でプログラムを実行出来るようにしておいた(AllrunもしくはAllrun-parallelをダブルクリックして実行、Allcleanをダブルクリックして初期化可能)ので、実際に動かしてみて頂きたい。

チュートリアルケースの構造と実行の仕組み

まずはエラーなく動作する事が確認できたとしても、初心者にとってAllrunの内容は難解で、筆者にとってそうであったように、最初のうちは何をやっているのかが判らないというのが、正直なところでないかと推察される。

そこで、本来であれば、個別のチュートリアル毎に解説したいところではあるが、紙面の関係もあり、ファイル構造と動作の仕組みについて、全体に共通する要点について取り纏めておく。

まず、計算の実行前の状態である。

  • 複数のフォルダがあって、フォルダー毎に計算領域と計算方法が異なっている。
    • 本書で紹介する事例では、Calculix またはOpenFOAMのどちらかである。
  • Allrunは上記のフォルダ毎に順番にソルバーを起動する。起動した後は、実行の終了をモニタリングして、エラーの有無に応じて処理
  • precice-config.xml というファイル中に、連成の具体的な方法が設定してある。
  • ソルバー毎に具体的な連成境界をソルバーアダプターが解釈できる形で定義した下記のファイルがあり、これらの中で上記precice-config.xmlも指定されているので、これらの内容に基づいて連成データがオンメモリー上で作成される。
    • OpenFOAMのケースでは、各ケースフォルダー内の、system/preciceDict
    • Calculixのケース用には、ルートフォルダに、config.yml

次に計算が始まると、

  • ソルバー毎の計算結果は、各ソルバー毎のケースファイル中に出力される。
  • 但し、計算ログはルートフォルダに、
    • フォルダ名.log
    • フォルダー名+サブプログラム名.log
    • 及び、precice関連ログが(precice-*.log)

という名前で出力される。特にフォルダ名.logが各ソルバーのメインプログラムの出力となるので、これをウォッチする事で、計算状況を把握できる。

また、計算を途中で止めたい場合には、「c」キーを押す、という点もpreCICEに独特の作法であり、これもAllrun実行中に以下のようにメッセージ表記されている。

(you may run ‘tail -f Fluid.log’ in another terminal to check the progress)
To interrupt the simulation, press ‘c’. Ctrl+C will only send the processes to the background.

実行結果の確認方法

計算が終了すると、「フォルダ名.log」ファイルの最終行の少し前にpreCICE関連の計算時間情報なども、まとめて出力されるようになっているので、これを読めば計算にかかる凡そのボトルネックが把握できる。

また、OpenFOAMの計算結果は、TreeFoamを使って、通常のOpenFOAMのケースファイルと同様の取扱(ParaView可視化や境界条件表示)が可能である。

但し注意点として、ケースによっては時間フォルダ中にフィールド出力のないものがあり、そういうケースをremoveObsoleteFolders.shを実行(ファイルマネージャ上でダブルクリックでもOK)する必要がある(注記3.)。

CalculiXの計算結果(拡張子.frdのファイル)の可視化に関しては、GUIで起動できる環境は用意してはいないので、cgxなどの可視化ツールをケースフォルダ中で、以下のようにしてコマンドラインで起動する事になる。

$ ls
all.msh graph_0.ps interface.sur tube.cvg tube.inp wall.nam
graph_0.gnu inlet.nam outlet.nam tube.dat tube.rout
graph_0.out interface.nam tube.12d tube.frd tube.sta

lsコマンドで、ディレクトリ内のファイル確認。拡張子.frdのファイルが計算結果ファイルなので、その存在と名前(上例ではtube.frd)を確認したら、

$ cgx -v tube.frd

として起動する。

図7-3-1. プルダウンメニューの使い方

結果を見るだけであれば、基本的に上図に示すGUIのプルダウンメニュー(注記4)を使って事足りるはずであるが、残念ながらLinux版に固有の不具合があるようで、データセットの選択にはコマンドライン入力(注記5)が必要である。

図7-3-2. .データセットの選択方法

データセットというのは、非定常(動的)計算なので、指定した時間ステップ毎、指定した出力(変位、応力等)を節点毎に出力したデータブロックがあって、これらを順番並べた際の番号という事になる。個々の番号は上図左側のGUIメニュー操作によって確認する事は出来る。しかしGUIプルダウンメニューでクリックすると、画面が突然落ちてしまう。cgxを起動した端末画面には、

freeglut (cgx): Menu manipulation not allowed while menus in use.

というエラーメッセージが表示されているというものである。これを回避する為にGUI画面上でのコマンドライン入力の必要がある、という事である。コマンドは、

ds 26 e 1

といった入力になる。「ds」がデータセットの意味であるが、「e」はエンティイティの意味である。エンティティの番号は出力内容によって数が異なるので、取り敢えず「1」を入力しておくのが無難。

図7-3-3. エンティティの選択

GUIプルダウンメニューによって、「Datasets」⇒「Entity」を選ぶと番号によって表示内容を変える事ができるとわかるので、ここで本当に見たいものをクリック選択すれば良い。

cgxを使うのでなく、FreeCADで可視化も可能である。この場合の起動はGUIボタンが使える。

図7-3-4. FreeCADの起動⇒Calculix計算結果の読み込み

普通にFreeCADを起動して、結果ファイル(拡張子.frd)を選択すれば良い。但し、cgxで表示する場合に比べると、データの読み込みに時間がかかり、大抵の場合、⑤「応答を待つ」という事態になる点は承知置きされたい。

図7-3-5. alculix計算結果の可視化

ロードが完了すると、モデルツリー上にデータセット毎にコンポーネントツリーが表示されるので、見たいものをダブルクリックして表示内容を選択すれば良い。

cgxで可視化する方法に比べれば分り易いかと思うが、ロードに時間がかかるのと、CHT/の結果(温度データ)が読み取れないといった難点がある。

公開チュートリアルの計算結果サマリー

個々のチュートリアルの結果を詳細に解説する紙面もないので、ここにメッシュ数や計算結果、必要ディスクスペースの総覧を取り纏めておく。

表7-3-1. preCICE公開チュートリアルの計算結果概要

また、代表的な可視化例を以下に示しておく。

図7-3-6 .SSI/loades_beam の可視化例
図7-3-7. FSI/3D_Tube の可視化例
図7-3-8. FSI/cylindrt_flap の可視化例
図7-3-9. FSI/flap_perp の可視化例

DEXCSチュートリアル

公開されたチュートリアル事例で動作が確認できたとはいえ、いざ現実の課題に適用しようとすると、どこから手を付けたものかと途方に暮れる人も多いのでないかと思われるが、基本はOpenFOAMの場合と同じである。OpenFOAMの実践的活用法に記した要点を再掲しよう。

  1. 他の解析例や標準チュートリアルケースを精査し、自分が解きたい現象・モデルに近いものを探し出す。
  2. 上記ケースファイルのメッシュを自前で作成したメッシュに置き換える。
  3. モデルパラメタ、境界条件の細部詳細を整合する。

ここでは、流体構造連成問題(FSI)を例に取り上げ、実用的な課題解決への足掛かりを得たいものとする。

もっとも簡単なflap_perpのチュートリアルケースは、2次元の平板問題であったが、これを下右図に示すような3次元の矩形版の問題へ拡張する事を考えよう。

図7-3-10. 3D_Flap_perp

このFreeCADモデルの作成法は後述するが、面倒な人は拙宅HPで公開しているので、それをダウンロードしてもらっても良い(注記8-2.)。

DEXCS-OFに搭載したFreeCADを使えば、このモデルから領域(流体/構造)毎にメッシュ作成から計算まで可能であった。これらを連成して計算が出来るようになれば、矩形版をより複雑な形状に変更したり、流体側の流路を変更したような実用的な問題であったとしても応用できそうな感触は得られよう。

つまり、上記活用法のステップ2までは、これまでのやり方の延長で何とかなりそうで、問題はステップ3のモデルパラメタの詳細適合である。領域ごとの計算パラメタはこれまでのやり方を踏襲できるとして、連成境界(preCICE関連ファイル)の適合をいかに実施するかである。

しかしこれも、境界面の名前を同一にしてあれば、公開チュートリアルケースに同梱されたパラメタファイル(拡張子が.xml, .ymlのファイル)をそのまま使って、まずは動くものが作れるのでないか。動くようになったら、詳細(パラメタの役割を調べて)適合するというやり方が出来そうだ。

なお、FreeCADで構造計算も可能であったが、preCICE連携でCalculiX(ccx_preCICE)を使う場合に、通常のCalculiX(ccx)で起動する場合と異なり、パラメタカードを追加・変更する必要がある。

これらをテキストエディタで修正する事はさほど難しくはないが、間違い防止の為、手修正作業は極力減らしたいという狙いから、新たにFreeCADマクロ(FSI用マクロ)を開発したので、これを使う事にしよう。

FreeCADマクロの更新

実は、DEXCSオリジナルツール(FreeCADマクロ)の更新を実行すれば、このFSI用マクロも組み込まれることになっている。ただ、DEXCSランチャーとして起動できるようにするためのボタンを登録する作業と、FreeCADでの構造解析の為の設定変更作業が必要であるので、以下にそのやり方を記しておく。

まずは、①FreeCADを起動して、「ツール」⇒「カスタマイズ」メニューを起動し、

図3-7-11. マクロの登録画面を起動

③「マクロ」タブを開く。④マクロ選択メニューから、アップデートで追加されたマクロ(exportFSIinp.FCMacro)を選択する(図3-7-11.)。

図3-7-12.マクロの登録

メニューテキスト等、空白欄の説明と、ビクセルマップ(アイコン)を選択(②〜④)して、⑤「追加」ボタンを押せば良い(図3-7-12.)。記述内容やアイコンは好みに応じて変更して構わない。

図3-7-13.追加したマクロボタンをDEXCSツールバーへ登録

引き続き、「ツールバー」のタグ画面を開いて、②「全体」ツールバーを選択し、現れたDEXCSツールバーを展開する。先のステップで③追加したマクロを選択して、④「右矢印」ボタンを押せば、DEXCSツールバーの最下段に追加される。これを⑤選択して、中央の⑥「上下矢印」ボタンを使って、好みの位置に変更して完了(⑥閉じる)である。

構造解析のプションは、①「FEMワークベンチ」の状態で、②「編集」⇒「設定」にて設定画面を起動できる(図3-7-14.)。ここに、④「FEM」ボタンを押して「General」タブ画面中の、

図3-7-14. FEMワークベンチのオプション変更

Working directory for solving analysis が、デフォルトでは、「Temporary directories」になっていたのを、「Beside .FCStd file」に変更する。これによってccx用入力ファイルの在所が確定し、マクロによる変更が可能になる。

以上で準備完了。引き続きDEXCSチュートリアルケース(3D_Flap_perp)を作成実行してみよう。おおまかには以下の手順で実施する事になる。

  • 雛形ケースファイルのコピーとAllrunの修正等
  • 流体領域のケースファイル作成
  • 固体領域のケースファイル作成
  • 計算実行確認
  • パラメタスタディ

雛形ケースファイルのコピーとAllrunの修正等

まずは、OpenFOAM-Calculix/FSI/flap_perpのケースフォルダをコピーして、名前を変更しておこう。ここでは以下、デスクトップ上、3D_Flap_perpにて実施するものとする。

ここで、改めてAllrunの内容を吟味し、必要な修正を実施しよう。公開チュートリアルケースではメッシュ作成にあたり、OpenFOAMのケースではblockMesh、Calculixのケースではcgxのコマンドを使って作成していたのに対して、これから実施するのは予めDEXCSに搭載したツールを使って作成するので、メッシュを作成する部分はコメントアウト(削除でもOK)しておく。41行目と、74〜78行目。

但し、OpenFOAMのケースではAllcleanを実行した際に、メッシュまで消去されてしまうので、41行目はblockMeshでなくcaetesianMeshとして、Allcleanを実行した後の再計算のある事も想定して、本スクリプト中でもメッシュ作成するようにしておいた。

28 # =============== Participant 1: Fluid ===========================
29 Participant1=”Fluid”
30
31 # Prepare
32 echo “Preparing the ${Participant1} participant…”
33
34 #cd $Participant1
35 #echo ” Restoring 0/ from 0.orig/…”
36 # rm -rfv 0
37 # cp -r 0.orig 0
38 #cd ..
39
40 echo ” Preparing the mesh…”
41 cartesianMesh -case ${Participant1} > ${Participant1}_cartesianMesh.log 2>&1
42 checkMesh -case ${Participant1} > ${Participant1}_checkMesh.log 2>&1
43
44 # Initialize the internal field with a potential flow
45 # potentialFoam -case ${Participant1} > ${Participant1}_potentialFoam.log 2>&1
46
47 # get application information
48 cd ${Participant1}
49 Solver1=$(getApplication) # solver
50 echo ” ${Participant1} Solver: ${Solver1}.”
51 cd ..
52
53 # Run and get the process id

(途中省略)

68 # =============== Participant 2: Solid ===========================

69 Participant2=”Solid”
70 Solver2=”ccx_preCICE”
71
72 # Prepare in silent mode
73 echo “Preparing the ${Participant2} participant…”
74 # cd ${Participant2}
75 # # We use CalculiX CGX to setup the structural simulation
76 # echo ” Executing cgx (provided by CalculiX, make sure this exists)…”
77 # cgx -bg pre_flap.fbd > prepare_flap.log 2>&1
78 # cd ..
79
80 # Run

36〜38行において初期値フォルダ「0」を都度「0.orig」で再構成しているのは、45行目でpotentialFoamによる初期ポテンシャル流れ場を作成している為であったが、本例の場合初期ポテンシャル流れ場を計算しても意味のない却って不自然な流れ場が計算されてしまうので、これらを使わない事とした。

一方、Allcleanスクリプトにおいても、上記初期値およびメッシュデータ処理の変更に伴って、以下修正(朱字部分)を施した。

14 # Participant 1: Fluid
15 Participant1=”Fluid”
16 cd ${Participant1}
17 # Clean the case
18 cleanCase
19 #rm -rfv 0
20 # Create an empty .foam file for ParaView
21 # Note: “.foam” triggers the native OpenFOAM reader of ParaView.
22 # Change to “.OpenFOAM” to use the OpenFOAM reader provided with OpenFOAM.
23 touch ${Participant1}.foam
24 cd ..
25 # Remove the log files
26 rm -fv ${Participant1}_blockMesh.log
27 rm -fv ${Participant1}_checkMesh.log
28 rm -fv ${Participant1}_potentialFoam.log
29 rm -fv ${Participant1}_decomposePar.log
30 rm -fv ${Participant1}.log
31 rm -fv ${Participant1}_reconstructPar.log
32
33 # Participant 2: Solid
34 Participant2=”Solid”
35 cd ${Participant2}
36 # Clean the case
37 # rm -fv *.nam
38 # rm -fv *.msh
39 rm -fv *.log
40 rm -fv flap.cvg
41 rm -fv flap.dat

preCICE関連ファイル(拡張子が.xml, .ymlのファイル)は境界面の名前を同一にしてあれば、公開チュートリアルケースに同梱されたパラメタファイルをそのまま使えそうだと記したが、1箇所モデルデータ如何によって修正が必要な箇所があった(precise-config.xml)。

<participant name=”Calculix”>
<use-mesh name=”Solid” provide=”yes”/>
<read-data name=”Forces0″ mesh=”Solid”/>
<write-data name=”Displacements0″ mesh=”Solid”/>
<watch-point mesh=”Solid” name=”point1″ coordinate=”-0.05;-0.2;1” />
</participant>

watch-point meshとして、メッシュの動きをモニタリングする位置を指定する箇所があり、これはSolidモデルの形状が変われば応じて修正する必要があるという点である。ただ、これは修正していなくとも、計算の実行そのものに支障はない。

流体領域のケースファイル作成

流体領域のケースファイル作成に先立って、Fluidフォルダ下の「0.orig」フォルダを「0」 に変更しておく事を忘れないようにしよう(注記6.)。

作成(またはダウンロード)したFreeCADモデルはこのままでも流体計算用と出来るが、明示的に分り易くする為、Fluidフォルダ下に①Fluid.FCStdとして収納し、②「メッシュ作成マクロ」を起動しよう。

図7-3-15. FreeCADマクロによるcfMesh作成

cfMeshパラメタ設定画面の使い方は、これまでにも何度も説明しているので詳細は割愛するが、これまでの説明と最下段のボタンの数が異なる(「checkMesh」ボタンが追加されている)のは、FreeCADマクロの更新によるものである。

メッシュ作成は、ほんの数秒で、必要に応じて「viewMesh」ボタンでメッシュ表示確認や、上記「checkMesh」ボタンによる確認されたい。

物性値、計算制御パラメタは、とりあえず公開チュートリアルと同じにするので何をする必要もない。

境界条件は、流体・固体連成境界以外は異なる名前・タイプなので適合する必要がある。①GridEditorを起動すれば、flap以外の境界条件が全てブランク状態で表示されるが、空白部はほとんどコピペ作業で埋める事は容易であろう。

図7-3-16. 境界条件の適合

全体空間の外表面(air)のFreeStreem境界の条件は、標準チュートリアルケース($FOAM_TUTORIALS/incompressible/simpleFoam/airFoil2D)よりコピペしている(DAKOTAによるOpenFOAMジョブ制御演習において使用したもの)。

固体領域のケースファイル作成

固体領域については、作成(またはダウンロード)したFreeCADモデル中の固体モデル(flap)だけを表示状態にして、Solidフォルダ下に①「Solid.FCStd」としておこう。これを開いたら、②「FEMワークベンチ」を使って、ケースファイルを作成出来る(図7-3-17.)。

図7-3-17. FEMワークベンチの起動

メッシュ作成法等については簡単な構造解析にて説明してあるので、これも操作イメージのスクリーンショットのみで詳細説明は割愛するが、異なるのは、解析の実行の前段階(図7-3-22.)までを、すでに説明したのと同じ方法で実施し、その後でFSI計算用の解析ファイルに変更するステップ(図7-3-23.)があって、解析そのものは前述のAllrunにて起動するという点である。

また、境界条件の設定において、条件が付与された事を示す赤色のピンや矢印のオブジェクトが異常に大きく表示されてしまい(面選択の邪魔になる)が、FreeCAD上でミリメートルサイズで作成したものがOpenFOAM上でメートルとして解釈されるという関係上、止むを得ないものと思って使って頂きたい。

図7-3-18. メッシュ作成
図7-3-19. 材料特性の設定
図7-3-20. 固定端の拘束条件
図7-3-21. 連成境界面の設定
図7-3-22. 解析(ccx)用.inpファイルの作成

以上で、静解析用のinpファイルが出来た事になる。次にこれをFSI用のinpファイルに変換する。

新たに登録したマクロボタンをクリックすると、連成境界面の名前と、動的解析の為のパラメタを設定する画面が現れる。本例の場合はデフォルトで表示される値をそのまま使えば、公開チュートリアル(flap_perp)と同じ設定になるので、そのまま最下段の②「make inputFile for FSI」ボタンを押せば良い。

図7-3-23. FSI用.inpファイルへの変換

ほとんど待ち時間無しで、変換終了の確認画面が現れるはずである。

因みにinpファイルの実体がどうなっているのかを図7-3-24.にて説明する。図7-3-22.の「Write .inp file」ボタンを押した事による、図7-3-24.中央のFEMMeshGmsh.inp ファイルが作成される。上記マクロは、このファイルを変換して「flap.inp」「interface.nam」という2つのファイルに分割収納している。

図7-3-24. inpファイルの実体

変換の内容は、基本的には、

  • 静解析を動解析に変更、併せて動解析パラメタの追加
  • 連成境界面データの再構築

であるが、詳細に興味の有る方は、マクロの内容を見るなり、上記ファイルの内容を比較して頂きたい。

計算実行

計算実行は、Allrun、もしくはAllrun_parallelをダブルクリックすれば良い。その際、以下の実行確認ダイヤログにおいては、

図7-3-25. 実行確認ダイヤログ

「端末内で実行する」とした方が良いであろう。実行が終了するまで端末が開いた状態が維持されるので。

また、並列計算する場合は、並列分割方法(Fluid/system/decomposeParDict)がデフォルトで

numberOfSubdomains 6;

method hierarchical;
hierarchicalCoeffs
{
n (3 2 1);
delta 0.001;
order xyz;
}

となっているので、使用している計算機のリソースに合わせて変更して使用されたい。

結果確認

計算結果の可視化例を以下に示しておく。

図7-3-26. 計算結果の可視化例

公開チュートリアルflip_flap(2D)の結果(図7-3-9.)と比べて、固体梁のスペック(大きさ、材料定数)、流体の風速条件も同じであるので、振動の変位や周期は大凡近い値になっている事が確認された。一方、3次元でしか計算できないねじれ状態も観察された。

計算時間について比較したのが以下の表になる。

表7-3-2. 計算結果の比較

solverの計算時間でみると、メッシュ数に相応した違いが出ている事は納得できるが、global の計算時間で桁違いの差になってしまっている。Fluid.logを詳細に調べたところ、

図7-3-27. 実行ログの分析

赤枠で囲った部分(advance/map.pet.mapData…)にて長大な時間が消費されていることが判った。

パラメタスタディ

map….とあるからには、マッピング方法に問題がありそうな感触が得られたが、これは具体的には、precice-config.xml 中、

27 <participant name=”Fluid”>
28 <use-mesh name=”Fluid-Mesh-Faces” provide=”yes”/>
29 <use-mesh name=”Fluid-Mesh-Nodes” provide=”yes”/>
30 <use-mesh name=”Solid” from=”Calculix”/>
31 <write-data name=”Forces0″ mesh=”Fluid-Mesh-Faces”/>
32 <read-data name=”Displacements0″ mesh=”Fluid-Mesh-Nodes”/>
33 <mapping:rbf-thin-plate-splines direction=”write” from=”Fluid-Mesh-Faces” to=”Solid” constraint=”conservative” y-dead=”true” />
34 <mapping:rbf-thin-plate-splines direction=”read” from=”Solid” to=”Fluid-Mesh-Nodes” constraint=”consistent”/>
35 </participant>

33行目と34行目で指定されたものと推察されよう。

preCICEのソースコードレポジトリによれば、mappingの方法には4種類のものがあるという点、また3次元FSI(3DTube)の事例で使用している方法を勘案して、

<!–
<mapping:rbf-thin-plate-splines direction=”write” from=”Fluid-Mesh-Faces” to=”Solid” constraint=”conservative” y-dead=”true” />
<mapping:rbf-thin-plate-splines direction=”read” from=”Solid” to=”Fluid-Mesh-Nodes” constraint=”consistent”/>
–>
<mapping:nearest-neighbor direction=”write” from=”Fluid-Mesh-Faces” to=”Solid” constraint=”conservative” timing=”initial” />
<mapping:nearest-projection direction=”read” from=”Solid” to=”Fluid-Mesh-Nodes” constraint=”consistent” timing=”initial” />

と変更して計算をやり直してみた。結果を以下に対比して示す。上段がデフォルト、下段がマッピング方法を変更したものである。

図7-3-28. マッピング方法の違いによる結果の相違

デフォルト(mapping:rbf-thin-plate-splines)の結果に比べて、計算時間(global)は大幅に短縮された。その代わりというべきか、計算結果が微妙に異なるものとなった。巨視的に見た振動周期はほとんど変化が無いが、ねじれ様の3次元的な挙動は見られない。

もう少し詳細に調べたく、Paraviewにて、Fluidのflap部patchデータだけを抽出してアニメーション化したものを掲載しておく。

  

図7-3-29. flapの動き

これを見ると平板が単純に振動する挙動ではなく、どちらかといえば旗がなびく挙動のようにも見える。固体の特性として、ヤング率が400,000Paと非常に小さな値でありながら密度は3,000kg/m3という(アルミニウムの剛性を5桁ほど小さくした材料か)、1x0.4メートルの厚みが0.1メートルというコンニャクのような材料が無重力状態下で正立して風が当たるとした計算なので、これだけのデータでどちらが正しいのか判断は出来ないが、興味の尽きない結果であり、今後のより詳細な検証が期待されよう。


3D_Flap_perpの作成方法例

作成方法はいくつもあるかとは思うが、ここでは初心者にとって直感的に分り易いであろう、Partデザインを使った作成例を示しておく。

図7-3-30. 3D_Flap_perp モデル作成方法(1/8)
図7-3-31. 3D_Flap_perp モデル作成方法(2/8)
図7-3-32. 3D_Flap_perp モデル作成方法(3/8)
図7-3-33. 3D_Flap_perp モデル作成方法(4/8)
図7-3-34. 3D_Flap_perp モデル作成方法(5/8)
図7-3-35. 3D_Flap_perp モデル作成方法(6/8)
図7-3-36. 3D_Flap_perp モデル作成方法(7/8)region(メッシュ細分化領域)
図7-3-37. 3D_Flap_perp モデル作成方法(8/8)flap(垂直平板)


注記1

ccx-2.16を使った場合、perp_flap のケースにおいて、単体計算ではマッピングエラーにて実行出来なかった。場当たり的な処置ではあったが、precice-config.xml 中の、coupling-schemeを、serial-implicitから、serial-implicit にした所動作した。逆に並列計算では、serial-implicitでは動作しなかった。

注記2

TreeFoamをヴァージョンアップして、TreeFoam3系を使用すればヘッダが無くとも動作に支障はない。

注記3.

Allrunスクリプト中、最下行の少し上にある以下のスクリプトの意味がこれである。

# Workaround for issue #26
echo “Problems with time directories without results? Run the script removeObsoleteFolders.sh and see issue #26 on GitHub.”
# ./removeObsoleteFolders.sh

注記4.

初心者の人には、このプルダウンメニューの出し方に戸惑うかもしれないが、GUI画面中のモデルが表示された四角の枠があるが、この枠外でマウスクリックするとプルダウンメニューが現れ、枠内でのマウス操作はモデルの表示視点を変える事になる。

注記5

コマンドライン入力の方法も独特で、マウスカーソルを四角の枠外に置いた状態にて入力する。その入力内容は、cgxを起動した端末画面に反映されるので、その内容を確認、またカーソル移動キーを使って修正やコマンドヒストリー入力も可能、Enterキー入力で確定される。

注記6.

0.origのまま(時間フォルダが存在しない)だと、FreeCADマクロでメッシュ作成時に、正常なOpenFOAMのケースファイルでないとされ、DEXCSランチャーデフォルトのケースファイルに更新されてしまう。

注記7.

なお、preCICE-1.6系までは、precice-config.xmlを、単体計算の場合と並列計算の場合とで使い分けしていたが、preCICE-2系となってからこの使い分けも無くなったようである。コマンド表記もかなり変更されている。

注記8.

ダウンロ−ドして解凍すると、以下3つのファイルが現れるはずである。

  1. preCICEtutorials.tar.xz
  2. 3D_Flap_perp.fcstd
  3. 3D_Flap_perp.tar.xz

1.と3.は更に解凍して使用されたい。


この章の最初へ 全体目次