JModelicaをUbuntuにインストールする

#JModelicaって
##ユーザガイドによると
* モデリング言語Modelicaの元、異なる分野の複雑な物理シミュレーションを実施
* Optimicaの拡張をサポートし最適化問題を扱うことができる
* コンパイラ構築フレームJastAddベースのコンパイラを使用
* ユーザーインターフェイスはPython
* FMI(Function Mock-up Interface)のExchange Moldel, Co-simulationをサポート

##わかりやすくいうと
+  Modelica言語のモデルをFMUs(Function Mock-up Units)としてコンパイルできる
+  FMUsをインポートして計算実行できる

---
#JModelicaの基本情報
|ソフト名  |JModelica                        |
|---------|---------------------------------|
|バージョン|1.17                           |
|開発元    |ルンド大学 <br> (現在はModelon ABが開発・保守)|
|ライセンス|GPL v3   ※1                     |
|URL      |http://www.jmodelica.org/        |
|platform |Linux(32/64bit)  Windows(32/64bit)|
※1…ランタイムライブラリはCPL v1.0 (JModelicaでコンパイルされたFMUsはCPL v1.0準拠)

---
#インストール
基本のユーザーガイド通り実施すればよい（丸投げ)
##Windows
  http://www.jmodelica.org/page/27667
##Ubuntu 12.04
  http://www.jmodelica.org/page/27667
##Ubuntu 15.04
  http://www.jmodelica.org/27663

Ubuntuはいいけど今は2016年だし、Anacondaがいいし、という人向けに　　
以下では、Ubuntu 16.04へのAnaconda,JModelicaのインストールについて解説

----
#Anaconda環境を整える
Anacondaで仮想環境を用意する。
まずはpyenvをインストールする

```bash:bash
git clone https://github.com/yyuu/pyenv.git ~/.pyenv
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
source ~/.bashrc
```

次にAnacondaのインストール、caeという名前の仮想環境を作成する。

```bash:bash
wget -P $(pyenv root)/cache https://repo.continuum.io/archive/Anaconda2-4.1.0-Linux-x86_64.sh
pyenv install anaconda2-4.1.0
pyenv global anaconda2-4.1.0
pyenv rehash
conda update -y conda
```
通常、上記１行目は不要のはず。```pyenv install``` 内でcurlがTLSの暗号化サイズにエラーを出して悩ましいとき、
先に```wget```でダウンロードした後インストールする。

---
#Ubuntu16.04(64bit)にJModelicaをインストールする下準備
##必要なパッケージのインストール
JModelicaが必要とするパッケージをUbuntu 16.04にインストール。
ターミナルにて下記を入力

```bash:bash
sudo apt install -y g++ subversion gfortran cmake swig ant openjdk-8-jdk  zlib1g-dev libboost-dev automake autoconf pkg-config
```

##必要なPythonパッケージのインストール
JModelicaが必要とするPythonパッケージを先に作成したPython環境にインストール。
jpypeとjccはAnaconda Cloudからインストール。

```bash:bash
conda install -y anaconda
conda install -y -c omnia jpype1=0.6.0
conda install -y -c ssc jcc=2.21
```

<!--
---
##Ipoptのインストールの前に
###pacoのインストール
野良ビルドの管理のためpacoをインストール。パッケージ管理をしない場合このページは飛ばす

```bash:bash
sudo apt-get install paco
```

/usr/localなどに```sudo make install```する際、```sudo paco -lp "パッケージ名" "make install"```と入力すれば
pacoで管理が可能。

```bash:bash例
#野良パッケージのインストール(sudo が必要な場合)
sudo paco -lp "パッケージ名" "make install"
#pacoで管理しているパッケージ
paco -a
#インストールされたファイル
paco -f "パッケージ名"
#アンインストール
paco -r "パッケージ名"
```
-->

---
##Ipoptのインストール
Ubuntuのパッケージとして提供されているらしいが、
Ubuntu12.04の頃はパッケージに不備があり？うまく動作しなかったらしい。
今回もソースからコンパイルする。configure時のprefixは各自の環境で変更。

```bash:bash
mkdir ~/Ipopt
cd ~/Ipopt
wget http://www.coin-or.org/download/source/Ipopt/Ipopt-3.12.6.tgz
tar xzf Ipopt-3.12.6.tgz
cd Ipopt-3.12.6/ThirdParty/Blas
./get.Blas
cd ../Lapack
./get.Lapack
cd ../Mumps
./get.Mumps
cd ../Metis
./get.Metis
cd ../../
mkdir build
cd build
../configure --prefix=/home/ubuntu/Ipopt
make
make install
```

---
#Ubuntu16.04(64bit)にJModelicaをインストール
configure時のprefixやwith-ipoptのパスは各自の環境で変更
configureファイルによるとPYTHON_HOMEの環境変数があると
PYTHON_INCLUDEやPYTHON_LIBがAnaconda環境に合わないパスが設定されてしますので注意。

```bash:bash
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export LD_LIBRARY_PATH=$JAVA_HOME/jre/lib/amd64:$JAVA_HOME/jre/lib/amd64/server
export PYTHON_INCLUDE=/home/ubuntu/.pyenv/versions/anaconda2-4.1.0/include/python2.7
export PYTHON_LIB=/home/ubuntu/.pyenv/versions/anaconda2-4.1.0/lib/libpython2.7.so

mkdir -p ~/JModelica
cd ~/JModelica
svn co https://svn.jmodelica.org/trunk JModelica.org
cd JModelica.org
mkdir build
cd build
../configure --prefix=/home/ubuntu/JModelica --with-ipopt=/home/ubuntu/Ipopt
make
make install
make casadi_interface
```
---
#動作テスト
JModelicaの使用に必要なパスの通ったipythonを起動させる

```bash:bash
/home/ubuntu/JModelica/bin/jm_ipython.sh
```

プロット表示のためXの環境が必要。以降、ipythonのターミナルで動作テスト。

---

## テスト１

```py:ipython
from pyjmi.examples import VDP_sim
VDP_sim.run_demo()
```
結果

 ![VDP_sim_result.png](https://qiita-image-store.s3.amazonaws.com/0/132571/aaf10ec2-36a8-1cb4-df3c-6add70ebda07.png)             |
---|

何を計算したのだろうか？

---
## テスト２

```py:ipython
from pyjmi.examples import cstr
cstr.run_demo()
```
結果

|![CSTR_result1.png](https://qiita-image-store.s3.amazonaws.com/0/132571/08a4a285-e5af-9414-7b31-ca594932d426.png)     | ![CSTR_result2.png](https://qiita-image-store.s3.amazonaws.com/0/132571/94c82521-4f6d-5248-171d-4b305e727390.png)        | ![CSTR_result3.png](https://qiita-image-store.s3.amazonaws.com/0/132571/879c0ed6-8752-66f3-d981-d82bfdac6607.png)      |
|---------|------------|--------------|


何かを最適化しているっぽい。

---

## テスト３

```py:ipython
from pyjmi.examples import cstr_casadi
cstr_casadi.run_demo()
```

結果

```
RuntimeError: The assertion "handle!=0" on line 171 of file "/home/ubuntu/JModelica/JModelica.org/ThirdParty/CasADi/CasADi/casadi/core/function/plugin_interface.hpp" failed. 
PluginInterface::loadPlugin: Cannot load shared library:
  Tried libcasadi_nlpsolver_ipopt.so:
    Error code: libcasadi_nlpsolver_ipopt.so: cannot open shared object file: No such file or directory
  Tried /home/ubuntu/JModelica/ThirdParty/CasADi/lib/libcasadi_nlpsolver_ipopt.so:
    Error code: /home/ubuntu/JModelica/ThirdParty/CasADi/lib/libcasadi_nlpsolver_ipopt.so: cannot open shared object file: No such file or directory
```
確かにlibcasadi_nlpsolver_ipopt.soはいない。まいっか。

---
#おまけ<br>jupyter notebookでJModelicaを使えるようにする
JModelicaのインストールパスが/home/ubuntu/JModelicaである場合の例を示す。
インストールパスの部分は、各自の環境に合わせて変更すること

```bash:bash
sed 's/ipython/jupyter notebook --no-browser/g' /home/ubuntu/JModelica/bin/jm_ipython.sh >/home/ubuntu/JModelica/bin/jm_jupyter_notebook.sh
chmod +x /home/ubuntu/JModelica/bin/jm_jupyter_notebook.sh
```
jupyter notebookを起動する。

```bash:bash
/home/ubuntu/JModelica/bin/jm_jupyter_notebook.sh
```

ブラウザを立ち上げ、http://localhost:8888/ にアクセスする。