Conflicts: Cantera/Makefile.in Cantera/clib/src/clib_defs.h Cantera/clib/src/ctreactor.cpp Cantera/clib/src/ctstagn.cpp Cantera/clib/src/ctstagn.h Cantera/cxx/Makefile.in Cantera/cxx/demos/combustor/combustor.cpp Cantera/cxx/demos/flamespeed/flamespeed.cpp Cantera/cxx/demos/kinetics1/example_utils.h Cantera/cxx/demos/kinetics1/kinetics1.cpp Cantera/cxx/include/Cantera.h Cantera/cxx/include/Cantera.mak.in Cantera/cxx/include/Cantera_bt.mak.in Cantera/cxx/include/Edge.h Cantera/cxx/include/GRI30.h Cantera/cxx/include/Interface.h Cantera/cxx/include/zerodim.h Cantera/fortran/f77demos/Makefile.in Cantera/fortran/src/Makefile.in Cantera/fortran/src/fct.cpp Cantera/fortran/src/fctxml.cpp Cantera/fortran/src/flib_defs.h Cantera/matlab/Makefile.in Cantera/matlab/cantera/Contents.m Cantera/matlab/setup_winmatlab.py Cantera/matlab/src/ctfunctions.cpp Cantera/matlab/src/ctmatutils.h Cantera/matlab/src/mixturemethods.cpp Cantera/matlab/src/mllogger.h Cantera/matlab/src/phasemethods.cpp Cantera/matlab/src/reactormethods.cpp Cantera/matlab/src/reactornetmethods.cpp Cantera/matlab/src/thermomethods.cpp Cantera/matlab/src/wallmethods.cpp Cantera/matlab/src/xmlmethods.cpp Cantera/python/Cantera/Edge.py Cantera/python/Cantera/Interface.py Cantera/python/Cantera/Phase.py Cantera/python/Cantera/importFromFile.py Cantera/python/Makefile.in Cantera/python/ctml_writer.py Cantera/python/setup.py.in Cantera/python/src/Makefile.in Cantera/python/src/ctkinetics_methods.cpp Cantera/python/src/ctonedim_methods.cpp Cantera/python/src/pylogger.h Cantera/src/Makefile.in Cantera/src/base/config.h.in Cantera/src/base/ctml.cpp Cantera/src/base/ctml.h Cantera/src/base/mdp_allo.cpp Cantera/src/base/mdp_allo.h Cantera/src/base/vec_functions.h Cantera/src/base/xml.cpp Cantera/src/base/xml.h Cantera/src/converters/CKParser.h Cantera/src/converters/Element.h Cantera/src/converters/Reaction.h Cantera/src/converters/RxnSpecies.h Cantera/src/converters/Species.h Cantera/src/converters/ckr_defs.h Cantera/src/converters/ckr_utils.h Cantera/src/equil/BasisOptimize.cpp Cantera/src/equil/Makefile.in Cantera/src/equil/MultiPhase.cpp Cantera/src/equil/vcs_MultiPhaseEquil.cpp Cantera/src/equil/vcs_VolPhase.cpp Cantera/src/equil/vcs_VolPhase.h Cantera/src/equil/vcs_linmaxc.cpp Cantera/src/equil/vcs_phaseStability.cpp Cantera/src/equil/vcs_rxnadj.cpp Cantera/src/equil/vcs_solve.cpp Cantera/src/equil/vcs_solve.h Cantera/src/equil/vcs_solve_TP.cpp Cantera/src/equil/vcs_util.cpp Cantera/src/equil/vcs_xerror.c Cantera/src/kinetics/GasKinetics.cpp Cantera/src/kinetics/GasKinetics.h Cantera/src/kinetics/InterfaceKinetics.cpp Cantera/src/kinetics/InterfaceKinetics.h Cantera/src/kinetics/Kinetics.h Cantera/src/kinetics/ReactionStoichMgr.h Cantera/src/kinetics/RxnRates.h Cantera/src/kinetics/StoichManager.h Cantera/src/numerics/BandMatrix.cpp Cantera/src/numerics/BandMatrix.h Cantera/src/numerics/DAE_Solver.h Cantera/src/numerics/DAE_solvers.cpp Cantera/src/numerics/DenseMatrix.cpp Cantera/src/numerics/DenseMatrix.h Cantera/src/numerics/FuncEval.h Cantera/src/numerics/IDA_Solver.cpp Cantera/src/numerics/IDA_Solver.h Cantera/src/numerics/Integrator.h Cantera/src/numerics/Makefile.in Cantera/src/numerics/NonlinearSolver.cpp Cantera/src/numerics/NonlinearSolver.h Cantera/src/numerics/ResidEval.h Cantera/src/numerics/ResidJacEval.cpp Cantera/src/numerics/ResidJacEval.h Cantera/src/numerics/SquareMatrix.cpp Cantera/src/numerics/SquareMatrix.h Cantera/src/numerics/ctlapack.h Cantera/src/oneD/Domain1D.h Cantera/src/oneD/OneDim.cpp Cantera/src/oneD/OneDim.h Cantera/src/oneD/Resid1D.h Cantera/src/oneD/Solid1D.cpp Cantera/src/oneD/Solid1D.h Cantera/src/oneD/StFlow.cpp Cantera/src/oneD/Surf1D.h Cantera/src/spectra/LineBroadener.h Cantera/src/thermo/Constituents.cpp Cantera/src/thermo/GibbsExcessVPSSTP.cpp Cantera/src/thermo/IonsFromNeutralVPSSTP.cpp Cantera/src/thermo/IonsFromNeutralVPSSTP.h Cantera/src/thermo/LatticePhase.cpp Cantera/src/thermo/LatticeSolidPhase.cpp Cantera/src/thermo/LatticeSolidPhase.h Cantera/src/thermo/Makefile.in Cantera/src/thermo/MargulesVPSSTP.cpp Cantera/src/thermo/MargulesVPSSTP.h Cantera/src/thermo/NasaThermo.h Cantera/src/thermo/PDSS_IonsFromNeutral.cpp Cantera/src/thermo/PDSS_IonsFromNeutral.h Cantera/src/thermo/PDSS_SSVol.cpp Cantera/src/thermo/Phase.cpp Cantera/src/thermo/PseudoBinaryVPSSTP.cpp Cantera/src/thermo/PseudoBinaryVPSSTP.h Cantera/src/thermo/PureFluidPhase.cpp Cantera/src/thermo/ShomateThermo.h Cantera/src/thermo/SimpleThermo.h Cantera/src/thermo/SpeciesThermoFactory.cpp Cantera/src/thermo/State.h Cantera/src/thermo/StoichSubstance.h Cantera/src/thermo/ThermoFactory.cpp Cantera/src/thermo/ThermoPhase.cpp Cantera/src/thermo/ThermoPhase.h Cantera/src/transport/AqueousTransport.cpp Cantera/src/transport/AqueousTransport.h Cantera/src/transport/DustyGasTransport.cpp Cantera/src/transport/DustyGasTransport.h Cantera/src/transport/L_matrix.h Cantera/src/transport/LiquidTransport.cpp Cantera/src/transport/LiquidTransport.h Cantera/src/transport/LiquidTransportData.h Cantera/src/transport/MMCollisionInt.cpp Cantera/src/transport/MMCollisionInt.h Cantera/src/transport/Makefile.in Cantera/src/transport/MixTransport.cpp Cantera/src/transport/MixTransport.h Cantera/src/transport/MultiTransport.cpp Cantera/src/transport/MultiTransport.h Cantera/src/transport/SimpleTransport.cpp Cantera/src/transport/SimpleTransport.h Cantera/src/transport/SolidTransport.cpp Cantera/src/transport/SolidTransport.h Cantera/src/transport/TransportBase.h Cantera/src/transport/TransportFactory.cpp Cantera/src/transport/TransportFactory.h Cantera/src/transport/TransportParams.h Cantera/src/transport/WaterTransport.h Cantera/src/zeroD/FlowDevice.h Cantera/src/zeroD/Reactor.h Cantera/src/zeroD/ReactorBase.cpp Cantera/src/zeroD/ReactorBase.h Cantera/src/zeroD/ReactorNet.h Cantera/src/zeroD/Wall.h Cantera/user/Makefile.in License.rtf Makefile.in apps/bvp/stagnation.cpp configure configure.in data/transport/misc_tran.dat docs/Makefile.in docs/install_examples/README.txt docs/install_examples/cygwin_gcc434_dbg_f2c_numpy.sh docs/install_examples/linux_64_gcc424_dbg_python252_numpy docs/install_examples/linux_64_gcc424_opt_python252_numpy docs/install_examples/mac_gcc401_python251_numpy docs/python/.cvsignore ext/Makefile.in ext/blas/Makefile.in ext/cvode/Makefile.in ext/f2c_blas/Makefile.in ext/f2c_lapack/Makefile.in ext/f2c_math/Makefile.in ext/f2c_math/xersve.c ext/f2c_recipes/Makefile.in ext/lapack/Makefile.in ext/math/Makefile.in ext/recipes/Makefile.in ext/tpx/CarbonDioxide.cpp ext/tpx/Makefile.in ext/tpx/Sub.cpp ext/tpx/utils.cpp preconfig test_problems/ChemEquil_gri_matrix/gri_matrix.cpp test_problems/ChemEquil_gri_pairs/gri_pairs.cpp test_problems/ChemEquil_ionizedGas/ionizedGasEquil.cpp test_problems/ChemEquil_ionizedGas/runtest test_problems/ChemEquil_red1/basopt_red1.cpp test_problems/CpJump/CpJump.cpp test_problems/Makefile.in test_problems/VCSnonideal/Makefile.in test_problems/VCSnonideal/NaCl_equil/HMW_NaCl.xml test_problems/VCSnonideal/NaCl_equil/nacl_equil.cpp test_problems/VPsilane_test/silane_equil.cpp test_problems/cathermo/DH_graph_1/DH_graph_1.cpp test_problems/cathermo/DH_graph_NM/DH_graph_1.cpp test_problems/cathermo/DH_graph_Pitzer/DH_graph_1.cpp test_problems/cathermo/DH_graph_acommon/DH_graph_1.cpp test_problems/cathermo/DH_graph_bdotak/DH_graph_1.cpp test_problems/cathermo/HMW_dupl_test/HMW_NaCl_sp1977_alt.xml test_problems/cathermo/HMW_dupl_test/HMW_dupl_test.cpp test_problems/cathermo/HMW_dupl_test/TemperatureTable.h test_problems/cathermo/HMW_dupl_test/sortAlgorithms.cpp test_problems/cathermo/HMW_dupl_test/sortAlgorithms.h test_problems/cathermo/HMW_graph_CpvT/HMW_NaCl_sp1977_alt.xml test_problems/cathermo/HMW_graph_CpvT/HMW_graph_CpvT.cpp test_problems/cathermo/HMW_graph_CpvT/TemperatureTable.h test_problems/cathermo/HMW_graph_CpvT/sortAlgorithms.cpp test_problems/cathermo/HMW_graph_CpvT/sortAlgorithms.h test_problems/cathermo/HMW_graph_GvI/HMW_NaCl.xml test_problems/cathermo/HMW_graph_GvI/HMW_graph_GvI.cpp test_problems/cathermo/HMW_graph_GvI/TemperatureTable.h test_problems/cathermo/HMW_graph_GvI/sortAlgorithms.cpp test_problems/cathermo/HMW_graph_GvI/sortAlgorithms.h test_problems/cathermo/HMW_graph_GvT/HMW_NaCl_sp1977_alt.xml test_problems/cathermo/HMW_graph_GvT/HMW_graph_GvT.cpp test_problems/cathermo/HMW_graph_GvT/TemperatureTable.h test_problems/cathermo/HMW_graph_GvT/sortAlgorithms.cpp test_problems/cathermo/HMW_graph_GvT/sortAlgorithms.h test_problems/cathermo/HMW_graph_HvT/HMW_NaCl_sp1977_alt.xml test_problems/cathermo/HMW_graph_HvT/HMW_graph_HvT.cpp test_problems/cathermo/HMW_graph_HvT/TemperatureTable.h test_problems/cathermo/HMW_graph_HvT/sortAlgorithms.cpp test_problems/cathermo/HMW_graph_HvT/sortAlgorithms.h test_problems/cathermo/HMW_graph_VvT/HMW_NaCl_sp1977_alt.xml test_problems/cathermo/HMW_graph_VvT/HMW_graph_VvT.cpp test_problems/cathermo/HMW_graph_VvT/TemperatureTable.h test_problems/cathermo/HMW_graph_VvT/sortAlgorithms.cpp test_problems/cathermo/HMW_graph_VvT/sortAlgorithms.h test_problems/cathermo/HMW_test_1/HMW_test_1.cpp test_problems/cathermo/HMW_test_3/HMW_test_3.cpp test_problems/cathermo/Makefile.in test_problems/cathermo/VPissp/ISSPTester.cpp test_problems/cathermo/ims/IMSTester.cpp test_problems/cathermo/issp/ISSPTester.cpp test_problems/cathermo/stoichSubSSTP/TemperatureTable.h test_problems/cathermo/stoichSubSSTP/sortAlgorithms.cpp test_problems/cathermo/stoichSubSSTP/sortAlgorithms.h test_problems/cathermo/stoichSubSSTP/stoichSubSSTP.cpp test_problems/cathermo/testIAPWS/testIAPWSphi.cpp test_problems/cathermo/testWaterPDSS/testWaterPDSS.cpp test_problems/cathermo/testWaterTP/testWaterSSTP.cpp test_problems/cathermo/wtWater/wtWater.cpp test_problems/ck2cti_test/Makefile.in test_problems/ck2cti_test/runtest.in test_problems/cxx_ex/Makefile.in test_problems/cxx_ex/equil_example1.cpp test_problems/cxx_ex/example_utils.h test_problems/cxx_ex/kinetics_example1.cpp test_problems/cxx_ex/kinetics_example2.cpp test_problems/cxx_ex/kinetics_example3.cpp test_problems/cxx_ex/runtest test_problems/cxx_ex/rxnpath_example1.cpp test_problems/cxx_ex/transport_example1.cpp test_problems/cxx_ex/transport_example2.cpp test_problems/min_python/Makefile.in test_problems/min_python/minDiamond/Makefile.in test_problems/min_python/negATest/negATest.cpp test_problems/mixGasTransport/runtest test_problems/nasa9_reader/Makefile.in test_problems/nasa9_reader/runtest.in test_problems/negATest/negATest.cpp test_problems/printUtilUnitTest/pUtest.cpp test_problems/pureFluidTest/testPureWater.cpp test_problems/silane_equil/silane_equil.cpp test_problems/surfkin/surfdemo.cpp tools/Makefile.in tools/bin/cvs2cl.pl tools/src/ck2cti.cpp tools/templates/f77/demo_ftnlib.cpp win32/vc7/Sundials/sundials/sundials_config.h win32/vc9/Sundials/SUNDIALS_SHARED/sundials_config.h winconfig.h
264 lines
6.6 KiB
C++
264 lines
6.6 KiB
C++
#include "ReactorNet.h"
|
|
#include "Integrator.h"
|
|
#include "FlowDevice.h"
|
|
#include "Wall.h"
|
|
|
|
using namespace std;
|
|
using namespace Cantera;
|
|
|
|
namespace Cantera {
|
|
|
|
ReactorNet::ReactorNet() : Cantera::FuncEval(), m_nr(0), m_nreactors(0),
|
|
m_integ(0), m_time(0.0), m_init(false),
|
|
m_nv(0), m_rtol(1.0e-9), m_rtolsens(1.0e-4),
|
|
m_atols(1.0e-15), m_atolsens(1.0e-4),
|
|
m_maxstep(-1.0),
|
|
m_verbose(false), m_ntotpar(0)
|
|
{
|
|
#ifdef DEBUG_MODE
|
|
m_verbose = true;
|
|
#endif
|
|
m_integ = newIntegrator("CVODE");// CVodeInt;
|
|
|
|
// use backward differencing, with a full Jacobian computed
|
|
// numerically, and use a Newton linear iterator
|
|
|
|
m_integ->setMethod(BDF_Method);
|
|
m_integ->setProblemType(DENSE + NOJAC);
|
|
m_integ->setIterator(Newton_Iter);
|
|
}
|
|
|
|
ReactorNet::~ReactorNet() {
|
|
for (size_t n = 0; n < m_nr; n++) {
|
|
if (m_iown[n]) {
|
|
delete m_r[n];
|
|
}
|
|
m_r[n] = 0;
|
|
}
|
|
m_r.clear();
|
|
m_reactors.clear();
|
|
deleteIntegrator(m_integ);
|
|
}
|
|
|
|
void ReactorNet::initialize(doublereal t0) {
|
|
size_t n, nv;
|
|
char buf[100];
|
|
m_nv = 0;
|
|
m_reactors.clear();
|
|
m_nreactors = 0;
|
|
if (m_verbose) {
|
|
writelog("Initializing reactor network.\n");
|
|
}
|
|
if (m_nr == 0)
|
|
throw CanteraError("ReactorNet::initialize",
|
|
"no reactors in network!");
|
|
for (n = 0; n < m_nr; n++) {
|
|
if (m_r[n]->type() >= ReactorType) {
|
|
m_r[n]->initialize(t0);
|
|
Reactor* r = (Reactor*)m_r[n];
|
|
m_reactors.push_back(r);
|
|
nv = r->neq();
|
|
m_size.push_back(nv);
|
|
m_nparams.push_back(r->nSensParams());
|
|
m_ntotpar += r->nSensParams();
|
|
m_nv += nv;
|
|
m_nreactors++;
|
|
|
|
if (m_verbose) {
|
|
sprintf(buf,"Reactor %d: %d variables.\n",n,nv);
|
|
writelog(buf);
|
|
sprintf(buf," %d sensitivity params.\n",
|
|
r->nSensParams());
|
|
writelog(buf);
|
|
}
|
|
if (m_r[n]->type() == FlowReactorType && m_nr > 1) {
|
|
throw CanteraError("ReactorNet::initialize",
|
|
"FlowReactors must be used alone.");
|
|
}
|
|
}
|
|
}
|
|
|
|
m_connect.resize(m_nr*m_nr,0);
|
|
m_ydot.resize(m_nv,0.0);
|
|
size_t i, j, nin, nout, nw;
|
|
ReactorBase *r, *rj;
|
|
for (i = 0; i < m_nr; i++) {
|
|
r = m_reactors[i];
|
|
for (j = 0; j < m_nr; j++) {
|
|
if (i == j) connect(i,j);
|
|
else {
|
|
rj = m_reactors[j];
|
|
nin = rj->nInlets();
|
|
for (n = 0; n < nin; n++) {
|
|
if (&rj->inlet(n).out() == r) connect(i,j);
|
|
}
|
|
nout = rj->nOutlets();
|
|
for (n = 0; n < nout; n++) {
|
|
if (&rj->outlet(n).in() == r) connect(i,j);
|
|
}
|
|
nw = rj->nWalls();
|
|
for (n = 0; n < nw; n++) {
|
|
if (&rj->wall(n).left() == rj
|
|
&& &rj->wall(n).right() == r) connect(i,j);
|
|
else if (&rj->wall(n).left() == r
|
|
&& &rj->wall(n).right() == rj) connect(i,j);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
m_atol.resize(neq());
|
|
fill(m_atol.begin(), m_atol.end(), m_atols);
|
|
m_integ->setTolerances(m_rtol, neq(), DATA_PTR(m_atol));
|
|
m_integ->setSensitivityTolerances(m_rtolsens, m_atolsens);
|
|
m_integ->setMaxStepSize(m_maxstep);
|
|
if (m_verbose) {
|
|
sprintf(buf, "Number of equations: %d\n", neq());
|
|
writelog(buf);
|
|
sprintf(buf, "Maximum time step: %14.6g\n", m_maxstep);
|
|
writelog(buf);
|
|
}
|
|
m_integ->initialize(t0, *this);
|
|
m_init = true;
|
|
}
|
|
|
|
void ReactorNet::advance(doublereal time) {
|
|
if (!m_init) {
|
|
if (m_maxstep < 0.0)
|
|
m_maxstep = time - m_time;
|
|
initialize();
|
|
}
|
|
m_integ->integrate(time);
|
|
m_time = time;
|
|
updateState(m_integ->solution());
|
|
}
|
|
|
|
double ReactorNet::step(doublereal time) {
|
|
if (!m_init) {
|
|
if (m_maxstep < 0.0)
|
|
m_maxstep = time - m_time;
|
|
initialize();
|
|
}
|
|
m_time = m_integ->step(time);
|
|
updateState(m_integ->solution());
|
|
return m_time;
|
|
}
|
|
|
|
|
|
void ReactorNet::addReactor(ReactorBase* r, bool iown) {
|
|
if (r->type() >= ReactorType) {
|
|
m_r.push_back(r);
|
|
m_iown.push_back(iown);
|
|
m_nr++;
|
|
if (m_verbose) {
|
|
writelog("Adding reactor "+r->name()+"\n");
|
|
}
|
|
}
|
|
else {
|
|
if (m_verbose) {
|
|
writelog("Not adding reactor "+r->name()+
|
|
", since type = "+int2str(r->type())+"\n");
|
|
}
|
|
}
|
|
}
|
|
|
|
// void ReactorNet::addSensitivityParam(int n, int stype, int i) {
|
|
// m_reactors[n]->addSensitivityParam(int stype, int i);
|
|
// m_sensreactor.push_back(n);
|
|
// m_nSenseParams++;
|
|
// }
|
|
|
|
// void ReactorNet::setParameters(int np, double* p) {
|
|
// int n, nr;
|
|
// for (n = 0; n < np; n++) {
|
|
// if (n < m_nSenseParams) {
|
|
// nr = m_sensreactor[n];
|
|
// m_reactors[nr]->setParameter(n, p[n]);
|
|
// }
|
|
// }
|
|
// }
|
|
|
|
|
|
void ReactorNet::eval(doublereal t, doublereal* y,
|
|
doublereal* ydot, doublereal* p) {
|
|
size_t n;
|
|
size_t start = 0;
|
|
size_t pstart = 0;
|
|
// use a try... catch block, since exceptions are not passed
|
|
// through CVODE, since it is C code
|
|
try {
|
|
updateState(y);
|
|
for (n = 0; n < m_nreactors; n++) {
|
|
m_reactors[n]->evalEqs(t, y + start,
|
|
ydot + start, p + pstart);
|
|
start += m_size[n];
|
|
pstart += m_nparams[n];
|
|
}
|
|
}
|
|
catch (...) {
|
|
showErrors();
|
|
error("Terminating execution.");
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void ReactorNet::evalJacobian(doublereal t, doublereal* y,
|
|
doublereal* ydot, doublereal* p, Array2D* j) {
|
|
doublereal ysave, dy;
|
|
Array2D& jac = *j;
|
|
|
|
// use a try... catch block, since exceptions are not passed
|
|
// through CVODE, since it is C code
|
|
try {
|
|
//evaluate the unperturbed ydot
|
|
eval(t, y, ydot, p);
|
|
for (size_t n = 0; n < m_nv; n++) {
|
|
|
|
// perturb x(n)
|
|
ysave = y[n];
|
|
dy = m_atol[n] + fabs(ysave)*m_rtol;
|
|
y[n] = ysave + dy;
|
|
dy = y[n] - ysave;
|
|
|
|
// calculate perturbed residual
|
|
eval(t, y, DATA_PTR(m_ydot), p);
|
|
|
|
// compute nth column of Jacobian
|
|
for (size_t m = 0; m < m_nv; m++) {
|
|
jac(m,n) = (m_ydot[m] - ydot[m])/dy;
|
|
}
|
|
y[n] = ysave;
|
|
}
|
|
}
|
|
catch (...) {
|
|
showErrors();
|
|
error("Terminating execution.");
|
|
}
|
|
}
|
|
|
|
void ReactorNet::updateState(doublereal* y) {
|
|
size_t start = 0;
|
|
for (size_t n = 0; n < m_nreactors; n++) {
|
|
m_reactors[n]->updateState(y + start);
|
|
start += m_size[n];
|
|
}
|
|
}
|
|
|
|
void ReactorNet::getInitialConditions(doublereal t0,
|
|
size_t leny, doublereal* y) {
|
|
size_t start = 0;
|
|
for (size_t n = 0; n < m_nreactors; n++) {
|
|
m_reactors[n]->getInitialConditions(t0, m_size[n], y + start);
|
|
start += m_size[n];
|
|
}
|
|
}
|
|
|
|
size_t ReactorNet::globalComponentIndex(string species, size_t reactor) {
|
|
size_t start = 0;
|
|
size_t n;
|
|
for (n = 0; n < reactor; n++) start += m_size[n];
|
|
return start + m_reactors[n]->componentIndex(species);
|
|
}
|
|
|
|
}
|