119 lines
3.9 KiB
C++
119 lines
3.9 KiB
C++
///////////////////////////////////////////////////////////////////////
|
|
//
|
|
// This demonstration program builds an object representing a
|
|
// reacting gas mixture, and uses it to compute thermodynamic
|
|
// properties, chemical equilibrium, and transport properties.
|
|
//
|
|
///////////////////////////////////////////////////////////////////////
|
|
|
|
// Include cantera header files. They should be included in the form
|
|
// "cantera/*.h". These headers are designed for use in C++ programs and
|
|
// provide a simplified interface to the Cantera header files. If you need
|
|
// to include core headers directly, use the format "cantera/module/*.h".
|
|
|
|
#include "cantera/thermo/IdealGasPhase.h" // defines class IdealGasPhase
|
|
#include "cantera/kinetics/GasKinetics.h"
|
|
#include "cantera/transport.h" // transport properties
|
|
#include <cstdio>
|
|
|
|
// All Cantera kernel names are in namespace Cantera. You can either
|
|
// reference everything as Cantera::<name>, or include the following
|
|
// 'using namespace' line.
|
|
using namespace Cantera;
|
|
|
|
// The program is put into a function so that error handling code can
|
|
// be conveniently put around the whole thing. See main() below.
|
|
|
|
void demoprog()
|
|
{
|
|
writelog("\n**** C++ Test Program ****\n");
|
|
|
|
auto sol = newSolution("h2o2.yaml", "ohmech");
|
|
auto gas = sol->thermo();
|
|
double temp = 1200.0;
|
|
double pres = OneAtm;
|
|
gas->setState_TPX(temp, pres, "H2:1, O2:1, AR:2");
|
|
|
|
|
|
// Thermodynamic properties
|
|
|
|
writelog("\n\nInitial state:\n\n");
|
|
writelog(
|
|
"Temperature: {:14.5g} K\n"
|
|
"Pressure: {:14.5g} Pa\n"
|
|
"Density: {:14.5g} kg/m3\n"
|
|
"Molar Enthalpy: {:14.5g} J/kmol\n"
|
|
"Molar Entropy: {:14.5g} J/kmol-K\n"
|
|
"Molar cp: {:14.5g} J/kmol-K\n",
|
|
gas->temperature(), gas->pressure(), gas->density(),
|
|
gas->enthalpy_mole(), gas->entropy_mole(), gas->cp_mole());
|
|
|
|
// set the gas to the equilibrium state with the same specific
|
|
// enthalpy and pressure
|
|
gas->equilibrate("HP");
|
|
|
|
writelog("\n\nEquilibrium state:\n\n");
|
|
writelog(
|
|
"Temperature: {:14.5g} K\n"
|
|
"Pressure: {:14.5g} Pa\n"
|
|
"Density: {:14.5g} kg/m3\n"
|
|
"Molar Enthalpy: {:14.5g} J/kmol\n"
|
|
"Molar Entropy: {:14.5g} J/kmol-K\n"
|
|
"Molar cp: {:14.5g} J/kmol-K\n",
|
|
gas->temperature(), gas->pressure(), gas->density(),
|
|
gas->enthalpy_mole(), gas->entropy_mole(), gas->cp_mole());
|
|
|
|
|
|
// Reaction information
|
|
|
|
auto kin = sol->kinetics();
|
|
int irxns = kin->nReactions();
|
|
vector_fp qf(irxns);
|
|
vector_fp qr(irxns);
|
|
vector_fp q(irxns);
|
|
|
|
// since the gas has been set to an equilibrium state, the forward
|
|
// and reverse rates of progress should be equal for all
|
|
// reversible reactions, and the net rates should be zero.
|
|
kin->getFwdRatesOfProgress(&qf[0]);
|
|
kin->getRevRatesOfProgress(&qr[0]);
|
|
kin->getNetRatesOfProgress(&q[0]);
|
|
|
|
writelog("\n\n");
|
|
for (int i = 0; i < irxns; i++) {
|
|
writelog("{:30s} {:14.5g} {:14.5g} {:14.5g} kmol/m3/s\n",
|
|
kin->reactionString(i), qf[i], qr[i], q[i]);
|
|
}
|
|
|
|
|
|
// transport properties
|
|
|
|
// create a transport manager for the gas that computes
|
|
// mixture-averaged properties
|
|
std::unique_ptr<Transport> tr(newTransportMgr("Mix", &gas, 0));
|
|
|
|
// print the viscosity, thermal conductivity, and diffusion
|
|
// coefficients
|
|
writelog("\n\nViscosity: {:14.5g} Pa-s\n", tr->viscosity());
|
|
writelog("Thermal conductivity: {:14.5g} W/m/K\n", tr->thermalConductivity());
|
|
|
|
int nsp = gas->nSpecies();
|
|
vector_fp diff(nsp);
|
|
tr->getMixDiffCoeffs(&diff[0]);
|
|
int k;
|
|
writelog("\n\n{:20s} {:26s}\n", "Species", "Diffusion Coefficient");
|
|
for (k = 0; k < nsp; k++) {
|
|
writelog("{:20s} {:14.5g} m2/s \n", gas->speciesName(k), diff[k]);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
int main()
|
|
{
|
|
try {
|
|
demoprog();
|
|
} catch (CanteraError& err) {
|
|
std::cout << err.what() << std::endl;
|
|
}
|
|
}
|