preCICE / OpenFOAM v9 on Macのカスタマイズ

# はじめに
MacでFSIをしたい！ということで、その方法をまとめたものです（未完、随時更新中）。
なお、[先の記事](https://qiita.com/takaf05/items/3a622d6b0b48739d4fe4)をベースに執筆していますので重複している箇所が先の記事と多々ありますこと、ご承知おきください。

**なお、OpenFOAMはFoundation版、ESI版の両方が使いたいということで、Foundation版をベースにDocker Imageのカスタマイズを行うという、回りくどいことをやっております。**
FSIだけに注力するのであれば、ESI版のイメージをもってきた方が良いです。

OFv9のMacへのインストールの詳細はこちらの[Qiitaページ](https://qiita.com/posa/items/d7a79544d1ecd14f739d)やこちらの[cfdengineのページ](https://www.cfdengine.com/blog/how-to-install-openfoam-anywhere-with-docker/)も参考になると思います。

# Dockerのインストール

[Dockerサイト](https://hub.docker.com/editions/community/docker-ce-desktop-mac)から，Docker Desktopをダウンロード，インストールします。ここでは特筆事項はありません・・・（楽でいいですよね）。

インストールが終了しましたら，Docker Desktopを起動します。こんな感じで右上にクジラマークが現れます。

![Screen Shot 2020-10-17 at 23.41.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227359/044cabb6-de45-8029-18c5-b92f300b3e92.png)

# OpenFOAMv9のインストール
Foundationにある[Foundation](https://openfoam.org/download/9-macos/)に従ってインストールします。`openfoam`というディレクトリを作成し，その中で，以下のコマンドを打ち込みます。

```haml:本家から抜粋
sudo curl --create-dirs -o /usr/local/bin/openfoam9-macos http://dl.openfoam.org/docker/openfoam9-macos
sudo chmod 755 /usr/local/bin/openfoam9-macos
```

# OpenFOAMコンテナ
`openfoam`のディレクトリ内で以下のコマンド（スクリプト）を実行することにより，OpenFOAMの環境が立ち上がります。

```bash
openfoam9-macos
```
これでblockMeshやsolversが使えるようになっています。

# イメージのカスタマイズ方法
まず，イメージのIDを確認します。

```bash
docker images
```

![Screen Shot 2020-10-16 at 22.37.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227359/e99b715c-01de-ed30-a2da-35c8d142c2be.png)

この__Image ID__をメモしておきます。その後，rootでImageを立ち上げます。

```bash
docker run -it -u=root <Image ID>
```

スクリプトで立ち上げた場合は，aptなどでアプリをインストールしても，記録されません。が，rootで起動した場合はカスタマイズや各種設定変更はコンテナに記録されます。この状態で自分の所望のアプリをインストールします。

**FSIを行うのに必要なアプリ・パッケージは後述します。**

その後，コンテナを停止（ログアウト），__Container ID__を確認します。

```
docker ps -a
```

変更を加えたコンテナをイメージにcommitさせます。

```
docker commit <container ID> <Repository>
```
`Repository`ですがデフォルト設定を活かし，`openfoam/openfoam8-graphical-app`としておくのが良いです。ここで`Repository`を自分の好きな名に変えることも可能ですが，その際は起動スクリプト`/usr/local/bin/openfoam8-macos`内のDOCKER_IMAGESを修正する必要があります。

たとえば，Repositoryをopenfoam8としたいのであれば，

```bash:example
docker commit <container ID> openfoam8
```
```bash:openfoam8-macos
DOCKER_IMAGE='openfoam8' 
```
とします。


# FSIの追加パッケージリスト

個人的には，`lv`, `gmsh`，`git`, `htop`, `python3.8`, `ffmpeg`, `cmake`, `gfortran`, `python3-pip(numpy, pandas, torch, tensorflow, scikit-learn, Pillow, matplotlib)`[^1], などがあると良いと思います。

そのうえで、FSIを行うためのパッケージは、
- `calculix-cgx`　& `calculix-ccx`
- `libprecice`[^2], 
- `OpenFOAM v2112 & ThirdParty` [^3]
になります。


[^1]: torchインストール時に[ここ](https://github.com/pytorch/pytorch/issues/1022)にあるようなエラーでインストールできないという事象が発生しました。torchを[ここ](https://files.pythonhosted.org/packages/38/53/914885a93a44b96c0dd1c36f36ff10afe341f091230aad68f7228d61db1e/torch-1.6.0-cp36-cp36m-manylinux1_x86_64.whl)から直接ダウンロードし，pip3でインストールすることにより解決できます。または，`pip --no-cache-dir install torch`としても解決することができます。

[^2]: https://github.com/precice/precice/releases/tag/v2.2.1

[^3]: https://develop.openfoam.com/Development/openfoam/-/blob/master/doc/Build.md


それでは個別にインストール方法を見ていきます。

## calclulix

Ubuntuのパッケージライブラリに登録されていますので、aptをするだけでインストールできます。

```bash
apt install caculix-cgx calculix-cxx
```

```bash
apt install libarpack2-dev libspooles-dev libyaml-cpp-dev
```

なお、rootでDockerイメージを立ち上げた際は、`sudo` は不要です。

calculixの結果ファイルfrdをvtk形式に変換する場合は、

```bash
apt install mono-complete
```
をインストールしたのち、
```bash:
mcs -out:frdToVTKConverter.exe frdToVTKConverter.cs
```
でコンバーターを作成します。実際にデータ変換する場合は、
```bash:
mono frdToVTKConverter.exe /path/to/frdFile.frd
```
とすればvtkファイルが得られます。

## preCICE

preciceのインストールは[Quickstart](https://precice.org/quickstart.html)が参考になります。

```bash
wget https://github.com/precice/precice/releases/download/v2.3.0/libprecice2_2.3.0_focal.deb
apt install ./libprecice2_2.3.0_focal.deb
```

### openfoam-adapter

preciceのOFアダプターのコンパイルに必要なパッケージをまずはインストールします。

```bash
apt install build-essential pkg-config cmake git
```

ESI版OFの環境にしたうえで、

```bash
git clone --branch=master --depth 1 https://github.com/precice/openfoam-adapter
cd openfoam-adapter
./Allwmake
```

これでadapterが出来上がります。


# quickstart tutorial

OpenFOAM / preciceの連携がとれているかの確認の[チュートリアル](https://precice.org/quickstart.html)を動かしてみます。

![quickstart-setup.png [^4]](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227359/403069ab-25ae-7757-cd47-564ea25f6e09.png)

[^4]: https://precice.org/quickstart.html より


具体的には、c++で作成されたrigid body solverとOpenFOAMとの連携を行います。
まずはチュートリアルファイルをダウンロードします。
```bash
git clone --branch=master --depth 1 https://github.com/precice/tutorials.git
cd tutorials/quickstart
```
次いで、c++のrigid body solverをコンパイルします。
```bash
cd solid-cpp
cmake . && make
```

あとは実際に実行するだけですが、FSI実行には2つのターミナルを立ち上げる必要があります[^5]。
片方のターミナルで
```bash:terminal-1
cd solid-cpp
run.sh
```
としたうえで、他方のターミナルで
```bash:terminal-2
cd fluid-openfoam
run.sh
```
とするとカップリング計算が開始されます。

計算結果をParaviewで可視化すると、

![quickstart-result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227359/1d7e5268-7aba-4538-40c4-77e59be22559.png)

のような結果がえられます。

[^5]: `docker exec -it <container id> /bin/bash` とすると同一コンテナに入れます。


# 最後に
OpenFOAMのDockerイメージのカスタマイズし、FSIができるような環境構築の方法をまとめてみました。
かならい回りくどいやり方をしております。簡単な方法がありましたら、お教えいただければと思います。