macOS SierraでOpenFOAM-4.1をdockerから起動

# 概要
- OpenFOAM-4.1をDockerを使ってmacOSで起動する手順の紹介
- OpenFOAMの正式HPの手順通りやったら簡単にできましたが、可視化でつまづいたのでその代替手段について

# 必要環境
HPより引用：https://openfoam.org/download/4-1-macos/

- Intelのハードウェアが乗っている2010年以降のモデル
- macOSは10.10.3 Yosemiteより新しいこと
- 最低4GBのRAM
- version 4.3.30より以前のVirtualBoxがインストールされていないこと

Docker for Macを使用するために必要な環境らしいです。

# Dockerのダウンロード
Dockerは、軽量な仮想化環境です。
Dockerはそのままではただの空箱ですが、Linuxで動くソフトのパッケージ（コンテナ）をDockerにマウントすることで、Macのターミナルからソフトを使うことができるようになります。

Docker for Macをインストールします。
https://docs.docker.com/docker-for-mac/install/#download-docker-for-mac

Stable channel（安定版）のGet Docker for Macをクリックしてdmgをダウンロードし、インストールします。
Applications内のDocker.appをクリックし、起動します。

```
$ docker --version
```

として、バージョンが表示されればOKです。また、

```
$ docker ps -a
```
を実行すると、これまで実行したコンテナリストの一覧を確認することができます。
初期状態では何も表示されません。試しにhello-worldをDockerから起動すると以下のようになります。
（引用：https://docs.docker.com/engine/getstarted/step_one/#step-2-install-docker）

```
$ docker run hello-world
 Unable to find image 'hello-world:latest' locally
 latest: Pulling from library/hello-world
 535020c3e8ad: Pull complete
 af340544ed62: Pull complete
 Digest: sha256:a68868bfe696c00866942e8f5ca39e3e31b79c1e50feaee4ce5e28df2f051d5c
 Status: Downloaded newer image for hello-world:latest

 Hello from Docker.
 This message shows that your installation appears to be working correctly.

 To generate this message, Docker took the following steps:
 1. The Docker Engine CLI client contacted the Docker Engine daemon.
 2. The Docker Engine daemon pulled the "hello-world" image from the Docker Hub.
 3. The Docker Engine daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker Engine daemon streamed that output to the Docker Engine CLI client, which sent it
    to your terminal.

 To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

 Share images, automate workflows, and more with a free Docker Hub account:
 https://hub.docker.com

 For more examples and ideas, visit:
 https://docs.docker.com/userguide/
```
必要なファイルを自動的にダウンロードしています。
一度ダウンロードすると、次回以降の起動は速くなります。

# openfoam4-macosのダウンロード
以下サイト
http://dl.openfoam.org/
の、docker/openfoam4-macosをダウンロードします。
実行権限を与え、PATHが通っているディレクトリに移動します。

```
$ sudo chmod 755 openfoam4-macos
$ sudo mv openfoam4-macos /usr/local/bin
```

# XQuartzのインストール
1. 以下のサイト
https://www.xquartz.org/
からXQuartzをダウンロードし、インストールします。

2. XQuartzを起動します。

3. XQuartz → 環境設定 → セキュリティ
「ネットワーク・クライアントからの接続を許可」にチェックを入れます。

4.  XQuartzを再起動します。

XQuartzは、dockerで可視化ソフトを立ち上げたり、gnuplotで描画するときに必要です。
何らかのコマンド入力時に

```
cannot connect to X server 
```
とエラーが出たら、dockerからexitして、XQuartzを起動したのちに再びdockerを起動する必要があります。

# openfoam-macos-file-systemのダウンロード
以下サイト
http://dl.openfoam.org/
の、docker/openfoam-macos-file-systemをダウンロードします。
実行権限を与え、PATHが通っているディレクトリに移動します。

```
$ sudo chmod 755 openfoam-macos-file-system
$ sudo mv openfoam-macos-file-system /usr/local/bin
```

openfoam-macos-file-systemは、dockerにOpenFOAMのファイルシステムをマウントするのに使います。
$HOME以下にopenfoamディレクトリを作成し、openfoamにファイルシステムをマウントします。

```
$ mkdir $HOME/openfoam
$ cd $HOME/openfoam
$ openfoam-macos-file-system mount
```

openfoamディレクトリが、dockerを起動した際のホームディレクトリになります。
また、docker実行時にopenfoam以下にファイルを保存すると、Mac側とファイルを共有できます。

# openfoam4-macosの実行

openfoamディレクトリ内で、openfoam4-macosを実行します。

```
$ cd $HOME/openfoam
$ openfoam4-macos -p
```

-pオプションは、可視化ソフトであるparaFoamを使うために必要です。
必要ファイルがダウンロードされ、

```
OpenFOAM-4.1(1) 
```
と表示されれば成功です。

```
$ pwd
/home/openfoam
```
と、ホームディレクトリがopenfoamになっていることを確認します。

# OpenFOAMの実行

runディレクトリを/home/openfoam以下に作成します。

```
$ mkdir -p $FOAM_RUN
```
`ls`するとrunディレクトリが生成されているのがわかります。
OpenFOAMのチュートリアルを実行します。

```
$ cd $FOAM_RUN
$ cp -r $FOAM_TUTORIALS/incompressible/simpleFoam/pitzDaily .
$ cd pitzDaily
$ blockMesh
$ simpleFoam
```

計算が実行され、結果ファイルが生成されます。

```
0  100	200  298  constant  postProcessing  system
```

# 結果の可視化

```
$ paraFoam -builtin
```

を起動すると、paraviewが立ち上がる…はずだったのですが、以下のエラーが出ました。

```
Created temporary 'pitzDaily.OpenFOAM'
libGL error: No matching fbConfigs or visuals found
libGL error: failed to load driver: swrast
X Error: BadValue (integer parameter out of range for operation) 2
  Extension:    149 (Uknown extension)
  Minor opcode: 3 (Unknown request)
  Resource id:  0x0
```

エラーを追いかけるに、ドライバ関係が上手くいっていない？
http://askubuntu.com/questions/541343/problems-with-libgl-fbconfigs-swrast-through-each-update
https://www.centos.org/forums/viewtopic.php?t=56273

わからないので、ひとまずMacにparaviewをインストールしました。
http://www.paraview.org/download/

dockerに戻り、pitzDailyディレクトリ内で、

```
$ paraFoam -builtin -touch
```
と打ち、pitzDaily.foamを生成します。
これをMacにインストールしたparaviewから開くと、読み込めました。
今のところ、実用上はこれで問題ないです。