Windows10でOpenFOAMのインストール（WSL）

# 0. はじめに
[OpenFOAM](https://openfoam.org/)[^1]はオープンソースの流体解析ツールで、運用コストが掛からないことから、導入を考えている方が多いのではないでしょうか。[^2]

OpenFOAMの導入には、Linux環境が必須のため、Windowユーザは仮想化環境構築、デュアルブート等の対応が必要でした。

しかし、2017年のWindows 10 Fall Creators Updateで、Windows 10の正式機能にLinux互換環境「Windows Subsystem for Linux (WSL)」が搭載されました。[^3]

これにより、Window上で簡単にLinux OSを導入できるようになったので、OpenFOAMの環境構築も大変導入しやすくなりました。ここでは、

-----
Windows Subsystem for LinuxでLinux環境構築から、OpenFOAMのチュートリアル実行までを記します。[^4]

-----

[^1]: OpenFOAM Foundationが提供するバージョンと、OpenCFD社（ESIグループ）がリリースするバージョンがあります。違いはよく分かりません。（Debian系とRed Hat系の関係みたいなもの？）
[^2]: 業務で運用するには、Code Verificationが問題になると思いますが。また、ライセンスフリーと言えども運用に掛かるコスト（人件費）も問題です。だからといって、商用コードにライセンス費を払えば流体解析が出来るようになる訳ではないですけどね。
[^3]: Windows PowerShell ェ…
[^4]: n番煎じですが。ご愛嬌。

# 1. WSLの設定（Windows10上でLinux Subsystemを有効化）
スタートボタンを右クリックして、`アプリと機能`を選択します。
<img src="https://qiita-image-store.s3.amazonaws.com/0/159902/74db183f-bfbb-94d8-71d8-9708fc6ca260.png" width=30%>

表示されたウィンドウの右側にある`プログラムと機能`を選択します。
<img src="https://qiita-image-store.s3.amazonaws.com/0/159902/e31fed87-8e34-ba22-4034-144cd029c351.png" width=80%>

表示されたウィンドウの左側にある`windowsの機能の有効化または無効化`を選択します。

<img src="https://qiita-image-store.s3.amazonaws.com/0/159902/ae5674a3-9930-e5ac-7b5d-40961222ba19.png" width=60%>

開いたWindowの中から`Windows Subsystem for Linux`を探し、チェックしてOKを選択します。インストールが始まり、再起動を要求されたら従って下さい。

<img src="https://qiita-image-store.s3.amazonaws.com/0/159902/ab6d024e-01bc-0cac-0556-292e833e0c76.png" width=30%>

これにて準備完了です。

# 2. Linux(Ubuntu)をインストール
Linuxディストリビューションを`Microsoft Store`からインストールします。
スタートメニューから、`Microsoft Store`を探し、選択します。


検索窓に`Ubuntu`と入力し、検索すると配布ディストリビューションが引っかかるので、それを選択し、入手を選択して下さい。
> 以下の枠中のものは、ubuntu 16.04 LTSです。
2018年4月26日にUbuntu 18.04 LTSがリリースされたため、WSL用にも配布されているようです。
どちらでも構いませんが、本記事は16.04で進めます。[^5]

[^5]: Debian系を導入することが解せなければ他のディストリビューションを入れて下さい。噂ではfedoraも利用できるようになるとか。

<img src="https://qiita-image-store.s3.amazonaws.com/0/159902/253f7505-e9c8-a6d5-f6c5-0a0748387ab2.png" width=50%>

インストールが終われば、スタートメニューにUbuntuが追加されますので、選択して起動して下さい。
<img src="https://qiita-image-store.s3.amazonaws.com/0/159902/49ffa496-471b-4cb5-6848-d36975a1a1e7.png" width=30%>

>なお、Ubuntuの起動は、コマンドプロンプトで`bash`と打ち込むことでも起動できます。
<img src="https://qiita-image-store.s3.amazonaws.com/0/159902/91b7773d-ec7b-85fe-e4c1-e91650c44694.png" width=50%>

## Ubuntuの起動

起動直後に、インストール中と画面表示されるため、暫く待ちます。
完了すると、Ubuntuで使用するユーザ名とパスワード名の設定が要求されるので、入力して下さい。（文字入力し、Enterで実行）
なお、Passwordの項目での入力文字は表示されませんので、ご注意下さい。（再入力を求められるので、どちらもミスがないよう注意）

無事設定が完了すると、以下のように`指定したユーザ名@PC名: $`と表示されます。これでひとまず設定が完了です。

<img src="https://qiita-image-store.s3.amazonaws.com/0/159902/94a115ab-0d2d-d3cf-e623-d61ccddb993f.png" width=50%>

## Ubuntuの初期設定
OpenFOAMを入れる前に、Ubuntuの必要最低限の設定を済ませていきます。

## リポジトリの更新
Linuxでは、コマンドで1行打ち込むだけで、アプリのインストールが出来ます。（もちろん、GUIでも可能です。）
これは、Ubuntuではaptと呼ばれるパッケージ管理ソフト[^6]で、アプリの実行ファイルやマニュアルなど、関連ファイルをパッケージにまとめて管理しているためです。（ざっくりのイメージなので、間違ってたらすみません。）
[^6]: RedHat系ならyumで管理します。
>
パッケージをインストールするには、以下のようにコマンドを打つことで可能です。なお、先頭の＄は入力の必要はありません。また、`sudo`は、root権限で実行する（管理者権限で実行する）ための命令文で、実行した後にパスワードの入力が求められますので注意して下さい。
>
```Bash
$ sudo apt install "パッケージ名" 
[sudo] paddword for "USER":"パスワード"
```

デフォルトの設定では、パッケージの置き場のアクセス先が海外サーバーになっているため、通信速度が遅い場合があります。
そのため、日本のサーバーに切り替えるために、以下を実行します。

```Bash
$ sudo sed -i -e 's%http://.*.ubuntu.com%http://ftp.jaist.ac.jp/pub/Linux%g' /etc/apt/sources.list
```
なお、無視しても問題ありません。

## パッケージのアップデート、アップグレード
OS（つまりUbuntu）をインストール仕立てホヤホヤなので、アップデートしましょう。まず以下を実行し、これによってソフトウェアの更新情報をネットから取得します。

```Bash
$ sudo apt update
```
その後、以下のコマンドで、内部ソフトを更新します。更新しますか？と聞かれるので、`y`と入力して下さい。

```Bash
$ sudo apt upgrade
```

以上の更新作業は、定期的に実行するようにしましょう。

Vim（エディタ）などは、インストールされるはずですが、使えない場合には`apt`でインストールしましょう。

```Bash
$ sudo apt install vim
$ sudo apt install build-essential
```


------
ここまでで、Ubuntuの設定が完了です。

------




# 3. OpenFOAMのインストール
本題です。
>[OpenFOAM Foundationのインストールページ](https://openfoam.org/download/windows-10/)を引用します。

## OpenFOAMのリポジトリを追加
デフォルトでは、aptにOpenFOAMのレポジトリ（つまり置き場）が設定されていないため、以下で設定します。

```Bash
$ sudo add-apt-repository http://dl.openfoam.org/ubuntu
$ sudo sh -c "wget -O - http://dl.openfoam.org/gpg.key | apt-key add -"
```
## リポジトリの更新
前章と同様に以下を実行してリポジトリを更新します。

```Bash
sudo apt-get update
```
## OpenFOAMのインストール
OpenFOAMを以下のコマンドでインストールします。(18/05/17現在はv5.4のパッチリリースが最新ですが、5.0でも問題ないと思います。）

```Bash
sudo apt-get install openfoam5
```

以上でインストールが始まりますので、完了するまで待ちましょう。

## OpenFOAMの初期設定
次に、ubuntuにログイン時に毎回読み込まれる設定ファイルを編集します。設定ファイルはホームディレクトリに置いていますので、以下でホームディレクトリに移動します。`cd`はディレクトリの移動命令で後ろの指定パス先に移動します（空欄の場合、ホームディレクトリが自動で指定）。

```Bash
$ cd
```

もしくは、以下で移動します。（$HOMEは、デフォルトの変数「HOME」に格納している文字を引用しています。）

```Bash
$ cd $HOME 
```



>ホームディレクトリに設定ファイルが存在することを確認します。`ls`はディレクトリ内のフォルダ、データ名を表示する命令で、`-alF`オプションを付けることで、隠しファイルも含めて表示します。

```Bash
ls -alF
```
すると、以下のように`.bashrc`があることがわかります。これが設定ファイルです。

`.bashrc`にOpenFOAMの起動設定するファイルの読み込み命令を書き込みます。
以下の命令では、`echo`の書き込み命令で`.bashrc`の末尾に書き込みます。

```Bash
$ echo "source /opt/openfoam5/etc/bashrc" >> .bashrc
```

> vimなどのエディタで直接.bashrcを編集してもよいです。
>
```Bash
$ vim .bashrc
```

書き込んだ後は、設定を反映させるために以下を実行します。

```Bash
source $HOME/.bashrc
```

以上で初期設定が完了です。
正常動作しているか確認するために、以下を試します。

```Bash
simpleFoam -help
```

以下のように、使い方が表示されれば、正常動作しています。

```
Username@User-PC:~$ simpleFoam -help

Usage: simpleFoam [OPTIONS]
options:
  -case <dir>       specify alternate case directory, default is the cwd
  -fileHandler <handler>
                    override the fileHandler
  -listFunctionObjects
                    List functionObjects
  -listFvOptions    List fvOptions
  -listRegisteredSwitches
                    List switches registered for run-time modification
  -listScalarBCs    List scalar field boundary conditions (fvPatchField<scalar>)
  -listSwitches     List switches declared in libraries but not set in
                    etc/controlDict
  -listTurbulenceModels
                    List turbulenceModels
  -listUnsetSwitches
                    List switches declared in libraries but not set in
                    etc/controlDict
  -listVectorBCs    List vector field boundary conditions (fvPatchField<vector>)
  -noFunctionObjects
                    do not execute functionObjects
  -parallel         run in parallel
  -postProcess      Execute functionObjects only
  -roots <(dir1 .. dirN)>
                    slave root directories for distributed running
  -srcDoc           display source code in browser
  -doc              display application documentation in browser
  -help             print the usage

Using: OpenFOAM-5.x (see www.OpenFOAM.org)
Build: 5.x-197d9d3bf20a

Username@User-PC:~$
```

# 4. Xmingのインストール
前章でOpenFOAMをインストールし、解析を実施する環境は構築できました。
次に、Linux用のGUIを設定することで、ポスト処理用ソフト`Paraview`を起動出来るようにします。

ここでは、X Server としてXmingを導入します。なお、Xmingに縛られなくても良いです。

>#### X serverの補足説明
UNIX/Linuxにおいては、X Window System（以下、X）を使用してGUIを実現していることが多い。Xでは画面表示を行うアプリケーション（Xサーバー）と、GUIを備えた個々のアプリケーション（Xクライアント）が分離されており、Xクライアントが描画命令をXサーバーに送信し、Xサーバーがそれを実際に描画するというクライアント/サーバー構成が取られている。このときXサーバーとXクライアントは同一のマシン上で動作している必要はなく、たとえば遠隔地にあるUNIX/Linuxマシン上でXクライアント（＝アプリケーション）を動作させ、その結果を手元にあるWindowsマシン上で動作するXサーバーで表示させる、といったことが可能だ。
([フリーのWindows用Xサーバー「Xming」のインストールと基本設定、使い方](https://mag.osdn.jp/09/10/14/0753240)より引用

以下からインストーラーをダウンロードし、インストールして下さい。特殊な設定は必要ありません（デフォルトのままで大丈夫です。）
[Xming X Sever for Windowのインストール](https://openfoam.org/download/windows/xming-download)

インストールしたら、スタートメニューから`XLaunch`で起動しましょう。
デフォルトの設定では、`Multiple windows`、`Display number : 0`に設定されているはずなので、`次へ`を押してゆき、デフォルト設定のまま、`完了`まで進めて下さい。

これにより、Xming Serverが起動し、右下のアイコンに格納されていることが確認できます。

## Ubuntu側の環境変数
Ubuntuの環境変数DISPLAYに、X serverのDieplay numberを設定することで、WSL上のUbuntuでGUIソフトが使用可能になります。
以下で設定が可能です。（`.bashrc`に環境変数を書き込む）

```Bash
$ echo "export DISPLAY=:0" >> $HOME/.bashrc
$ source $HOME/.bashrc
```
なお、この設定はXmingインストール後に、一度だけでよいです。

設定が上手くいっているか確認するために、以下を実行してみましょう。目のウィンドウが現れれば、設定が出来ていることになります。

```Bash
$ xeyes
```
------
これで、全ての設定が完了です。

------

# 5. OpenFOAMを試してみる
設定が完了したため、インストール済みのOpenFOAMのチュートリアルであるPitz&Dailyを実行してみます。

まず、チュートリアルのケースファイルをフォルダごと、ホームディレクトリにコピーします。`cp`は、後ろのパスに指定しているデータを、その後ろで指定しているパスにコピーする命令です。

```Bash
$ cp -r $FOAM_TUTORIALS/incompressible/simpleFoam/pitzDaily $HOME
```
> なお、チュートリアルのケースファイルを格納しているフォルダは、以下でアクセスできます。
>
```Bash
$ tut
```
これは、`tut` という命令をすると`cd $FOAM_TUTRIALS`を実行するというように設定されているためです。これは、`alias`を実行すると確認できます。
>
```Bash
$ alias
```

コピーしたフォルダの中に移動します。

```Bash
cd $ cd pitzDaily
```
フォルダの中を確認すると、以下のフォルダ構成になっていることが確認できます。`ls`はフォルダの中のデータ名を表示する命令です。フォルダの中は、`0`、`constant`、`system`のフォルダ構成であることがわかります。それぞれに解析の設定条件が格納されています。

```Bash
$ ls
0  constant  system
```
>
- `0` : フィールド（場）の設定ファイル（U,p,Tなど）を格納するディレクトリ。境界条件や、初期値を設定する。0は初期時刻の意味で、解析を実行すると、同様の形式の計算結果ファイルを含むディレクトリが出力時刻の名前で作成される。
>
- `constant` : メッシュや物性値、乱流モデルなどの設定が含まれるディレクトリ。
>
- `system` : 計算の制御の設定ファイルなどが含まれるディレクトリ。離散化スキーム、ソルバー、解析時間などを設定できる。

次にメッシュを生成します。これにより、メッシュが生成され、解析の準備が完了します。

```Bash
$ blockMesh
```

解析を実行します。ここでは、標準ソルバーのsimpleFoamを実行します。完了すると、0秒以外のフォルダが生成されます。

```Bash
$ simpleFoam
```
最後に、出力した結果を｀Paraview｀で確認します。なお、`paraFoam`はParaviewに解析結果を引き渡してくれます。

```Bash
$ paraFoam
```
`paraview`が起動したら、`Apply`ボタンを押します。
すると、モデルが表示されますので、`Solid Color`の中から`U`を選びます。するとモデルに色が着き、時間を進めると、速度分布の経時変化が確認できます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/159902/f951aca2-fd6d-5c06-79e8-411cb104cc46.png" width=50%>

チュートリアルには、他にも様々なケースファイルが格納されているため、幾つか動かしてみると良いでしょう。

# まとめ
Windows 10 上でOpenFOAMが動作する環境を構築しました。
白紙の状態から解析体系を構築するよりも、チュートリアルが充実しているため、解析したい体系に似た内容のチュートリアルのケースをコピーし修正するのが良いです。多分これが一番早いと思います。[^7]

[^7]: 出典：[ニコニコ大百科掲載記事](http://dic.nicovideo.jp/a/%E5%A4%9A%E5%88%86%E3%81%93%E3%82%8C%E3%81%8C%E4%B8%80%E7%95%AA%E6%97%A9%E3%81%84%E3%81%A8%E6%80%9D%E3%81%84%E3%81%BE%E3%81%99)

## 補足