Cantera:C++でのプログラミング

※Canteraバージョン:3.0.0

Canteraは、Pythonの他にもC++やFORTRANなどの言語でも使用することができる。

ソースコードのコンパイル

CanteraはC++でソースコードが書かれているため、自分のC++プログラムにCanteraのライブラリをリンクして使用することができる。

そのためには、以下の公式サイトの方法で、ライブラリをインストールして使うか、

https://cantera.org/install/conda-install.html#sec-conda-development-interface

もしくは、以下のページのようにCanteraのソースコードをダウンロードして、ソースからコンパイルする。

https://cantera.org/install/compiling-install.html#sec-compiling

コンパイラーは、GNU、Microsoft Visual Studio、Intel compiler、MinGWなどに対応しているので、自分の環境にあったもので構築できる。

今回は、WindowsのMinGW-W64のコンパイラーで、ソースからコンパイルした。少しややこしいが、公式サイトにしたがって、Anaconda環境でsconsでビルドする。

着火遅れ時間の計算

以下のPythonで行った着火遅れ時間の計算をC++で書いて計算してみる。

※Canteraバージョン:3.0.0 Canteraで着火遅れ時間を計算してみる。n-Heptaneの空気中での燃焼における着火遅...

C++プログラム

全体のフローは、基本的に上記のPythonプログラムと対応している。

CanteraのC++ドキュメントは以下を参照。

https://cantera.org/documentation/docs-3.0/doxygen/html/index.html

今回のプログラムのソースコード(GitHub)

#include "cantera/core.h"
#include "cantera/zerodim.h"
#include "cantera/kinetics.h"
#include "cantera/base/Array.h"

#include <iostream>
#include <fstream>

using namespace Cantera;

ヘッダーとCanteraのnamespaceを設定。

    // define gas state
    auto sol = newSolution("LLNL_heptane_160.yaml");
    auto gas = sol->thermo();
    gas->setState_TP(temp, p);
    gas->setEquivalenceRatio(phi, "nc7h16", "o2:1.0, n2:3.76");

newSolutionで反応メカニズムファイルを指定。ここでは、gasに状態量をセットする。

    // define reactor
    IdealGasReactor r;
    r.insert(sol);

    ReactorNet sim;
    sim.addReactor(r);

IdealGasReactorの反応器オブジェクトと反応器ネットワークを定義する。

    // time loop
    double time = 0.0;
    int nstep = tend / dt;
    Array2D states(2, nstep);
    for (int i = 0; i < nstep; i++)
    {
        sim.advance(time);
        states(0, i) = time;
        states(1, i) = r.contents().temperature();
        time += dt;
    }

時間発展して反応計算を行う。Array2Dは、2次元配列のクラスで、時間と温度を格納するのに使っている。

    // ignition delay time
    double diffMax = 0.0;
    int ix = 0;
    for (int i = 0; i < nstep - 1; i++)
    {
        double diff = states(1, i + 1) - states(1, i);
        if (diff > diffMax)
        {
            diffMax = diff;
            ix = i;
        }
    }
    double time_igd = states(0, ix);
    std::cout << "Ignition Delay Time: " << time_igd * 1e6 << " micro sec" << std::endl;

ここでは、温度勾配が最大となる時刻を取得し、着火遅れ時間time_igdとしている。

    // write csv
    std::ofstream file("output.csv");
    file << "time, temperature" << std::endl;
    for (int i = 0; i < nstep; i++)
    {
        file << states(0, i) << "," << states(1, i) << std::endl;
    }
    file.close();

Pythonではグラフ出力しているが、ここではCSVファイルに結果を出力している。

結果

結果はPythonと同じである。

自分のプログラムに化学反応計算を組み込みたい場合など色々使える。

スポンサーリンク
科学技術計算のご相談は「キャットテックラボ」へ

科学技術計算やCAEに関するご相談、計算用プログラムの開発などお困りのことは「株式会社キャットテックラボ」へお問い合わせください。

お問い合わせはこちら

フォローする

スポンサーリンク