UbuntuにCanteraをインストールして，C++のコードを実行するまで

Canteraといつ反応解析のソフトウェアのソースコードを変更したいと思い，[以前に書いた記事](https://qiita.com/syoukera/items/50f7720122ae4c7ad626)ではWindows環境下でソースコードからインストールする過程を示した．
しかしながらCanteraではC++で記述されたクラスをCythonを経由することでPythonのインターフェースで使用するという，そこそこ複雑な構造になっていて，デバッグなどの昨日だったりエディタのハイライトが対応できないという事から，コードを改変するときに結構不便になってしまう．
そこでこの記事では，C++のソースコードを実行及び改変可能な環境を構築することを目指し，WSLを使用して構築したUbuntuに対してCanteraをインストールしてC++のコードを実行する手順を示しておく．

## 環境
- ホストOS: Windows 10
- 実行環境: Ubuntu 20.04 LTS (WSL2)


## インストール

公式のUbuntuへの[インストール](https://www.cantera.org/install/ubuntu-install.html)に関するページを参考に実行する．

以下のコマンドを実行してCanteraのインストールを行う．

```
sudo apt install software-properties-common
sudo apt-add-repository ppa:cantera-team/cantera
sudo apt install cantera-python3 cantera-dev
```

必要なパッケージのインストールを行う．

```
sudo apt install libfmt-dev libboost-all-dev g++
```

## サンプルコードの実行
[公式のページ](https://www.cantera.org/tutorials/cxx-guide/simple-example.html)を参考に実行する．ただし，実行用のコマンドは変更している．


```combustor.cpp
#include "cantera/thermo.h"
#include <iostream>

using namespace Cantera;

// The actual code is put into a function that
// can be called from the main program.
void simple_demo()
{
    // Create a new phase
    std::unique_ptr<ThermoPhase> gas(newPhase("h2o2.yaml", "ohmech"));

    // Set its state by specifying T (500 K) P (2 atm) and the mole
    // fractions. Note that the mole fractions do not need to sum to
    // 1.0 - they will be normalized internally. Also, the values for
    // any unspecified species will be set to zero.
    gas->setState_TPX(500.0, 2.0*OneAtm, "H2O:1.0, H2:8.0, AR:1.0");

    // Print a summary report of the state of the gas
    std::cout << gas->report() << std::endl;
}

// the main program just calls function simple_demo within
// a 'try' block, and catches CanteraError exceptions that
// might be thrown
int main()
{
    try {
        simple_demo();
    } catch (CanteraError& err) {
        std::cout << err.what() << std::endl;
    }
}
```

実行コマンドは以下
`-llapack`と`-lyaml-cpp`のフラッグを付け加えている．

```
g++ combustor.cpp -o combustor -pthread -O3 -std=c++0x -lcantera -lsundials_cvodes -lsundials_ida -lsundials_nvecserial -llapack -lyaml-cpp
./combustor
```

無事に実行できると以下の結果が出力される．

```
  ohmech:

       temperature   500 K
          pressure   2.0265e+05 Pa
           density   0.36118 kg/m^3
  mean mol. weight   7.4093 kg/kmol
   phase of matter   gas

                          1 kg             1 kmol     
                     ---------------   ---------------
          enthalpy       -2.4772e+06       -1.8354e+07  J
   internal energy       -3.0382e+06       -2.2511e+07  J
           entropy             20699        1.5337e+05  J/K
    Gibbs function       -1.2827e+07       -9.5038e+07  J
 heat capacity c_p            3919.1             29038  J/K
 heat capacity c_v              2797             20724  J/K

                      mass frac. Y      mole frac. X     chem. pot. / RT
                     ---------------   ---------------   ---------------
                H2           0.21767               0.8           -15.644
                 H                 0                 0  
                 O                 0                 0  
                O2                 0                 0  
                OH                 0                 0  
               H2O           0.24314               0.1           -82.953
               HO2                 0                 0  
              H2O2                 0                 0  
                AR           0.53919               0.1           -20.503
                N2                 0                 0
```