WindowsでFEniCSを試す！

# はじめに

[CAE](https://ja.wikipedia.org/wiki/CAE)の世界もOpen Sourceで利用できるものが増えてきた。今回は、[有限要素法](https://ja.wikipedia.org/wiki/%E6%9C%89%E9%99%90%E8%A6%81%E7%B4%A0%E6%B3%95)のOpen Sourceの一つで、Pythonインターフェースを持つ[FEniCS](https://fenicsproject.org/)を試してみる。

# この記事で実施すること

CAEのOpen Sourceの多くは、Linux環境が多いが、今回はWindows10（WSLは利用）で実行して、FEniCSのチュートリアルのExampleを動かすところまで行う。

# 環境

Windows 10 home
WSL Ubuntu
Anaconda(Python 3.7.6 WSL上でインストール)
Chrome 80.0.3987.132

# WSL環境構築

FEniCSはLinux環境が必要なため、WSLでLinux環境を構築する。構築方法は他サイトを参照する。LinuxはUnbuntuを入れた。

- https://docs.microsoft.com/ja-jp/windows/wsl/install-win10

# WSLにAnacondaをインストール

適当な場所に、[Anaconda](https://www.anaconda.com/distribution/)よりダウンロードしたLinux版のAnaconda3をインストールする。何も考えずに、ホームディレクトリにインストールする。

```Bash:WSL
$sh Anaconda3-2020.02-Linux-x86_64.sh
```

# FEniCSのインストール

[FEniCSのDownloadサイト](https://fenicsproject.org/download/)によれば、condaでFEniCSライブラリをインストール可能である。pipでもインストールをやってみたが、imoprt fenicsがimport errorとなったので、はまりたくなければcondaでインストールしたほうが良いかもしれない。（fenicsモジュールは、本体ライブラリのdolfinをimportしているだけなので、import fenicsできることは重要でない気もする。ただ、Open Source CAEの世界は、公式と違うことをするとだいたい路頭に迷う）

```bash:WSL
$conda install -c conda-forge feincs
```

# WSLからJupyterLabを立ち上げ、Windows側のブラウザに表示する

WSL上で計算実行して、結果ファイルをWindowsのフォルダに保存し、Windows側で読んでポスト処理すれば、FEniCSを使うことはできる。ただ、せっかくPython環境で実行するので、JupyterLab(Jupyter Notebookでもよい)を使って、計算実行、ポスト処理までを同じ環境で実行したい。
そのため、まずWSLでJupyterLabをインストールする。

```bash:WSL
$conda install jupyterlab
```

インストールが終われば、WSLでJupyterLabを立ち上げる。

```bash:WSL
$jupyter lab
```

Xming等をWindows側にインストールして実行していなければ、GUIをWindows側で立ち上げられないので、何も立ち上がることはない。Xmingを入れてもよいが、WSL上に表示されている`http://localhost:8888/?token=xxx`(xxxはその時のトークン）をWindows側のブラウザに入力すれば、WSLから立ち上げたJupyterLabが表示される。

<img width="550" alt="boot.png" title="WSL上で実行したJupyterLabをWindows側のブラウザで表示" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585573/97fcba1a-daea-db76-aa03-8a003bcd0a95.png">

# FEniCSをJupyterLab上で試す

FEniCSのサイトにある[Example ft03_heat.py](https://github.com/hplgit/fenics-tutorial/blob/master/pub/python/vol1/ft03_heat.py)をコピーして実行する。そのまま実行すると、エラーがでる。

<img width="350" alt="error.png" title="arrayがなく、エラー" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585573/84281e09-cfaf-2883-c00c-836a34cb4611.png">

[このサイト](https://github.com/hplgit/fenics-tutorial/issues/52)によると、関数名が古いようで、get_localとするといいらしい。arrayをget_localに書き換え実行する。しかし、修正しても、エラーがでる。

<img width="350" alt="error2.png" title="interactiveがなくエラー" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585573/6a2c51bd-4f63-412f-1d40-624a129a2d0c.png">

エラーを見るとinteractiveがないらしい。[調べると](https://stackoverflow.com/questions/53730427/fenics-did-not-show-figure-nameerror-name-interactive-is-not-defined)、interactive()がplt.show()に変更になっているとのこと。FEniCSの実行本体である[DOLFINのドキュメント](https://fenicsproject.org/docs/dolfin/2019.1.0/python/demos/navier-stokes/documentation.html?highlight=interactive)に記載されていることを言っているのだろうか？ただ、すでに図が表示されているので、削除して実行する。

<img width="350" alt="success.png" title="成功！" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585573/b7737f56-5915-1006-4500-a906d305350b.png">

当たり前だが、エラーなしで実行完了できる。[公式のExample](https://fenicsproject.org/tutorial/)は、内容が修正されていないものもあるので、注意が必要である。