preCICE のセットアップ

2019年1月26日

はじめに

プログラム同士の連成を行うツール preCICE のセットアップを行う。ここでは こちら の OpenFOAM/CalculiX による流体-構造連成計算を目指してセットアップを行う。

環境

Ubuntu 16.04 LTS, preCICE 1.3.0, CalculiX 2.13, OpenFOAM v1812

OpenFOAM については別途セットアップしてあるものとする。

preCICE のコンパイル

準備が必要なものは、preCICE、連成させる 2 つのソルバーとそれぞれのアダプタ、そして依存ライブラリである。コンパイル作業はここでは $HOME/build で行う。バイナリのインストール先は $HOME/opt とする。preCICE のみそのまま $HOME/opt 上でコンパイルしている。

Ubuntu 用の手順は こちら に従う。よく読まずに こちら の指示通りにやるとうまくいかない (ステップ 1 にちゃんと書いてはあるが)。

必要なパッケージのインストール

preCICE のコンパイルには SCons を用いる。また、PETSc などいくつか必要なライブラリがある。

$ sudo apt-get update
$ sudo apt-get install scons libeigen3-dev libxml2-dev petsc-dev

パスの設定 (指示とちょっと変えている)。

~/.bashrc

export PETSC_DIR=/usr/lib/petscdir/3.6.2/x86_64-linux-gnu-real

読み込み。

$ . ~/.bashrc

Boost

preCICE が比較的最近の Boost を要求してくるので、コンパイルする。こちら からソースを入手。

$ tar xvzf boost_1_69_0.tar.gz
$ cd boost_1_69_0
$ ./bootstrap.sh --with-libraries=log,thread,system,filesystem,program_options,test --prefix=/home/xxxx/opt/boost_1_69_0
$ ./b2 install

ユーザー名 "xxxx" として $HOME/opt 以下にインストールしている。指示ではシステム上にインストールするようになっているが、パスを設定してやればその必要はない。ちなみに、何も考えずに Boost 本家の指示に従ってコンパイルすると、preCICE のコンパイルがすんなり行かない上、計算時に preCICE の内部の Boost のロギング機能の呼び出し時に stdc++ で落ちる。

パスの設定。

~/.bashrc

export BOOST_ROOT=~/opt/boost_1_69_0
export CPLUS_INCLUDE_PATH=$BOOST_ROOT/include:$CPLUS_INCLUDE_PATH
export LIBRARY_PATH=~/opt/boost_1_69_0/lib:$LIBRARY_PATH
export LD_LIBRARY_PATH=~/opt/boost_1_69_0/lib:$LD_LIBRARY_PATH

読み込み。

$ . ~/.bashrc

preCICE

preCICE をコンパイル。

$ wget https://github.com/precice/precice/archive/v1.3.0.tar.gz
$ tar xvzf v1.3.0.tar.gz
$ cd precice-1.3.0
$ scons petsc=yes python=no -j 4 solib symlink

$HOME/opt 以下で実施している。何も考えずに本家の一般的な指示に従うとうまくいかないかもしれない。Ubuntu 用の指示では上記になっている。Boost で落ちるのと関係があるのかもしれない。

パスの設定。

~/.bashrc

export PRECICE_ROOT=~/opt/precice-1.3.0
export LD_LIBRARY_PATH=$PRECICE_ROOT/build/last:$LD_LIBRARY_PATH

読み込み。

$ . ~/.bashrc

CalculiX のコンパイル

CalculiX を使うので、コンパイルする。バージョンは本家の指示に合わせている。

CGX

$ wget http://www.dhondt.de/cgx_2.13.all.tar.bz2
$ tar xvjf cgx_2.13.all.tar.bz2
$ cd CalculiX/cgx_2.13/src
$ make

バイナリを好きなところに置く。

$ mkdir ~/opt/CalculiX
$ cp cgx ~/opt/CalculiX/

パスを設定。

~/.bashrc

export PATH=~/opt/CalculiX:$PATH

CCX

ここ の指示に従う。

SPOOLES

注意: パッケージをそのまま展開すると大変なことになる (1回やらかした) ので、ディレクトリを作ってその中で展開する。

$ mkdir SPOOLES.2.2
$ cd SPOOLES.2.2
$ wget http://www.netlib.org/linalg/spooles/spooles.2.2.tgz
$ tar xvzf spooles.2.2.tgz

Make.inc の編集。

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

コンパイル。

$ make lib

ARPACK

$ 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 xvzf arpack96.tar.gz
$ tar xvzf patch.tar.gz
$ cd ARPACK

ARmake.inc の編集。

 28 #home = $(HOME)/ARPACK
 29 home = $(HOME)/build/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

CCX

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

バイナリをとりあえず CGX と同じところに置く。実は、これは連成計算には使わない。

$ cp ccx_2.13 ~/opt/CalculiX/ccx

YAML

YAML はアダプタが使うらしいが、OpenFOAM のアダプタと CalculiX のアダプタがそれぞれ共有ライブラリと静的ライブラリを要求するので、2 回コンパイルした。

$ 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

コンパイル。

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

もう一度別にコンパイル。

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

パスの設定。

~/.bashrc

export CPLUS_INCLUDE_PATH=~/build/yaml-cpp-yaml-cpp-0.6.2/include:$CPLUS_INCLUDE_PATH
export LD_LIBRARY_PATH=~/build/yaml-cpp-yaml-cpp-0.6.2/build2:$LD_LIBRARY_PATH

※今考えると共有ライブラリは ~/opt のほうに入れるべきかも。まあ好みの問題。

アダプタのコンパイル

OpenFOAM adapter

こちら の指示に従う。

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

OpenFOAM の設定を有効にして、コンパイル。

$ ./Allwmake

なんか言ってくる。

Building completed with linking problems: there were undefined symbols. See wmake.log and ldd.log for more.

ldd.log

undefined symbol: fftw_taint    (/usr/lib/x86_64-linux-gnu/libfftw3_mpi.so.3)
undefined symbol: fftw_join_taint   (/usr/lib/x86_64-linux-gnu/libfftw3_mpi.so.3)

libfftw3_mpi.so.3 が OpenFOAM の中の libfftw3.so.3 を参照しているようなので、パスを設定。

~/.bashrc

export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH

"/usr/lib/x86_64-linux-gnu" 自体は検索パスに含まれているはずなので、上記は OpenFOAM のパスより前に持って行く設定になる。

もう一度。

$ ./Allwmake
...
Building completed successfully!

CalculiX adapter

こちら の指示に従う。

$ git clone https://github.com/precice/calculix-adapter.git
$ cd calculix-adapter

Makefile を編集。ここでは preCICE 以外は $HOME/build でコンパイルしている。

  2 CCX             = $(HOME)/build/CalculiX/ccx_2.13/src
  3 SPOOLES         = $(HOME)/build/SPOOLES.2.2
  4 ARPACK          = $(HOME)/build/ARPACK
  5 PRECICE_ROOT    = $(HOME)/opt/precice-1.3.0
  6 YAML            = $(HOME)/build/yaml-cpp-yaml-cpp-0.6.2

コンパイル。

$ make

bin/ccx_preCICE ができれば OK。バイナリをパスの通ったところに置く。

$ cp bin/ccx_preCICE ~/opt/CalculiX

実行

チュートリアルのダウンロード。

$ git clone https://github.com/precice/tutorials.git

frap_perp の例を実行。OpenFOAM の設定を有効にして実行する。

$ cp -r tutorials/FSI/flap_perp/OpenFOAM-CalculiX/ flap_perp
$ cd flap_perp
$ ./Allrun

別の端末でログをチェック。

$ tail -f Fluid.log

注意: 実行時にメッセージが出るように、Ctrl-C するとバックグラウンドで計算が継続するので、計算を止めたい場合は単に c と打つ。

うまくいっていたら、ParaView で結果を見る。

$ paraview --data=Fluid/Fluid.foam

cylinderFlap の実行。

$ cp -r tutorials/FSI/cylinderFlap/OpenFOAM-CalculiX cylinderFlap
$ cd cylinderFlap
$ ./Allrun

変なデータが出ている?ので整理して結果を見る。

$ cd Fluid
$ mkdir backup
$ mv *.?99* backup
$ mv 9.89* 9.99* backup
$ paraview --data=Fluid.foam