/////////////////////////////////////////////////////////////////////// // // 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/IdealGasMix.h" // defines class IdealGasMix #include "cantera/transport.h" // transport properties #include // All Cantera kernel names are in namespace Cantera. You can either // reference everything as Cantera::, 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"); IdealGasMix gas("h2o2.cti","ohmech"); 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 int irxns = gas.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. gas.getFwdRatesOfProgress(&qf[0]); gas.getRevRatesOfProgress(&qr[0]); gas.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", gas.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 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; } }