cantera/test_problems/cxx_ex/kinetics_example1.cpp
2012-01-09 17:32:01 +00:00

129 lines
3.9 KiB
C++
Executable file

/////////////////////////////////////////////////////////////
//
// zero-dimensional kinetics example program
//
// copyright California Institute of Technology 2002
//
/////////////////////////////////////////////////////////////
// turn off warnings under Windows
#ifdef WIN32
#pragma warning(disable:4786)
#pragma warning(disable:4503)
#endif
#include <cantera/Cantera.h>
#include <cantera/zerodim.h>
#include <cantera/IdealGasMix.h>
#include "example_utils.h"
using namespace Cantera;
using namespace Cantera_CXX;
using namespace CanteraZeroD;
using namespace std;
// Kinetics example. This is written as a function so that one
// driver program can run multiple examples.
// The action taken depends on input parameter job:
// job = 0: print a one-line description of the example.
// job = 1: print a longer description
// job = 2: print description, then run the example.
//
// Note: although this simulation can be done in C++, as shown here,
// it is much easier in Python or Matlab!
int kinetics_example1(int job) {
try {
cout << "Ignition simulation using class IdealGasMix "
<< "with file gri30.cti."
<< endl;
if (job >= 1) {
cout << "Constant-pressure ignition of a "
<< "hydrogen/oxygen/nitrogen"
" mixture \nbeginning at T = 1001 K and P = 1 atm." << endl;
}
if (job < 2) return 0;
// header
writeCanteraHeader(cout);
// create an ideal gas mixture that corresponds to GRI-Mech
// 3.0
IdealGasMix* gg = new IdealGasMix("gri30.xml", "gri30");
IdealGasMix& gas = *gg;
// set the state
gas.setState_TPX(1001.0, OneAtm, "H2:2.0, O2:1.0, N2:4.0");
int kk = gas.nSpecies();
// create a reactor
Reactor r;
// create a reservoir to represent the environment
Reservoir env;
// specify the thermodynamic property and kinetics managers
r.setThermoMgr(gas);
r.setKineticsMgr(gas);
env.setThermoMgr(gas);
// create a flexible, insulating wall between the reactor and the
// environment
Wall w;
w.install(r,env);
// set the "Vdot coefficient" to a large value, in order to
// approach the constant-pressure limit; see the documentation
// for class Reactor
w.setExpansionRateCoeff(1.e9);
w.setArea(1.0);
// create a container object to run the simulation
// and add the reactor to it
CanteraZeroD::ReactorNet *sim_ptr = new CanteraZeroD::ReactorNet();
sim_ptr->addReactor(&r);
double tm;
double dt = 1.e-5; // interval at which output is written
int nsteps = 100; // number of intervals
// create a 2D array to hold the output variables,
// and store the values for the initial state
Array2D soln(kk+4, 1);
saveSoln(0, 0.0, gas, soln);
// main loop
for (int i = 1; i <= nsteps; i++) {
tm = i*dt;
sim_ptr->advance(tm);
saveSoln(tm, gas, soln);
}
// make a Tecplot data file and an Excel spreadsheet
string plotTitle = "kinetics example 1: constant-pressure ignition";
plotSoln("kin1.dat", "TEC", plotTitle, gas, soln);
plotSoln("kin1.csv", "XL", plotTitle, gas, soln);
// print final temperature
cout << " Tfinal = " << r.temperature() << endl;
cout << " number of residual function evaluations = "
<< sim_ptr->integrator().nEvals() << endl;
cout << "Output files:" << endl
<< " kin1.csv (Excel CSV file)" << endl
<< " kin1.dat (Tecplot data file)" << endl;
delete gg;
return 0;
}
// handle exceptions thrown by Cantera
catch (CanteraError) {
showErrors(cout);
cout << " terminating... " << endl;
appdelete();
return -1;
}
}