Cantera 2.6.0
ConstPressureReactor.cpp
Go to the documentation of this file.
1//! @file ConstPressureReactor.cpp A constant pressure zero-dimensional reactor
2
3// This file is part of Cantera. See License.txt in the top-level directory or
4// at https://cantera.org/license.txt for license and copyright information.
5
12
13using namespace std;
14
15namespace Cantera
16{
17
19{
20 if (m_thermo == 0) {
21 throw CanteraError("ConstPressureReactor::getState",
22 "Error: reactor is empty.");
23 }
24 m_thermo->restoreState(m_state);
25
26 // set the first component to the total mass
27 y[0] = m_thermo->density() * m_vol;
28
29 // set the second component to the total enthalpy
30 y[1] = m_thermo->enthalpy_mass() * m_thermo->density() * m_vol;
31
32 // set components y+2 ... y+K+1 to the mass fractions Y_k of each species
33 m_thermo->getMassFractions(y+2);
34
35 // set the remaining components to the surface species
36 // coverages on the walls
38}
39
41{
43 m_nv -= 1; // Constant pressure reactor has one fewer state variable
44}
45
47{
48 // The components of y are [0] the total mass, [1] the total enthalpy,
49 // [2...K+2) are the mass fractions of each species, and [K+2...] are the
50 // coverages of surface species on each wall.
51 m_mass = y[0];
52 m_thermo->setMassFractions_NoNorm(y+2);
53 if (m_energy) {
54 m_thermo->setState_HP(y[1]/m_mass, m_pressure);
55 } else {
56 m_thermo->setPressure(m_pressure);
57 }
58 m_vol = m_mass / m_thermo->density();
59 updateConnected(false);
61}
62
63void ConstPressureReactor::eval(double time, double* LHS, double* RHS)
64{
65 double& dmdt = RHS[0];
66 double* mdYdt = RHS + 2; // mass * dY/dt
67
68 dmdt = 0.0;
69
70 evalWalls(time);
71
72 m_thermo->restoreState(m_state);
73 const vector_fp& mw = m_thermo->molecularWeights();
74 const doublereal* Y = m_thermo->massFractions();
75
76 evalSurfaces(LHS + m_nsp + 2, RHS + m_nsp + 2, m_sdot.data());
77 double mdot_surf = dot(m_sdot.begin(), m_sdot.end(), mw.begin());
78 dmdt += mdot_surf;
79
80 if (m_chem) {
81 m_kin->getNetProductionRates(&m_wdot[0]); // "omega dot"
82 }
83
84 for (size_t k = 0; k < m_nsp; k++) {
85 // production in gas phase and from surfaces
86 mdYdt[k] = (m_wdot[k] * m_vol + m_sdot[k]) * mw[k];
87 // dilution by net surface mass flux
88 mdYdt[k] -= Y[k] * mdot_surf;
89 //Assign left-hand side of dYdt ODE as total mass
90 LHS[k+2] = m_mass;
91 }
92
93 // external heat transfer
94 double dHdt = m_Qdot;
95
96 // add terms for outlets
97 for (auto outlet : m_outlet) {
98 double mdot = outlet->massFlowRate();
99 dmdt -= mdot;
100 dHdt -= mdot * m_enthalpy;
101 }
102
103 // add terms for inlets
104 for (auto inlet : m_inlet) {
105 double mdot = inlet->massFlowRate();
106 dmdt += mdot; // mass flow into system
107 for (size_t n = 0; n < m_nsp; n++) {
108 double mdot_spec = inlet->outletSpeciesMassFlowRate(n);
109 // flow of species into system and dilution by other species
110 mdYdt[n] += mdot_spec - mdot * Y[n];
111 }
112 dHdt += mdot * inlet->enthalpy_mass();
113 }
114
115 if (m_energy) {
116 RHS[1] = dHdt;
117 } else {
118 RHS[1] = 0.0;
119 }
120}
121
122size_t ConstPressureReactor::componentIndex(const string& nm) const
123{
124 size_t k = speciesIndex(nm);
125 if (k != npos) {
126 return k + 2;
127 } else if (nm == "mass") {
128 return 0;
129 } else if (nm == "enthalpy") {
130 return 1;
131 } else {
132 return npos;
133 }
134}
135
137 if (k == 0) {
138 return "mass";
139 } else if (k == 1) {
140 return "enthalpy";
141 } else if (k >= 2 && k < neq()) {
142 k -= 2;
143 if (k < m_thermo->nSpecies()) {
144 return m_thermo->speciesName(k);
145 } else {
146 k -= m_thermo->nSpecies();
147 }
148 for (auto& S : m_surfaces) {
149 ThermoPhase* th = S->thermo();
150 if (k < th->nSpecies()) {
151 return th->speciesName(k);
152 } else {
153 k -= th->nSpecies();
154 }
155 }
156 }
157 throw CanteraError("ConstPressureReactor::componentName",
158 "Index is out of bounds.");
159}
160
161}
Base class for kinetics managers and also contains the kineticsmgr module documentation (see Kinetics...
Header for a simple thermodynamics model of a surface phase derived from ThermoPhase,...
Header file for base class WallBase.
Base class for exceptions thrown by Cantera classes.
Definition: ctexceptions.h:61
virtual size_t componentIndex(const std::string &nm) const
Return the index in the solution vector for this reactor of the component named nm.
virtual void updateState(doublereal *y)
Set the state of the reactor to correspond to the state vector y.
virtual void eval(double t, double *LHS, double *RHS)
Evaluate the reactor governing equations.
virtual void getState(doublereal *y)
Get the the current state of the reactor.
std::string componentName(size_t k)
Return the name of the solution component with index i.
virtual void initialize(doublereal t0=0.0)
Initialize the reactor.
double outletSpeciesMassFlowRate(size_t k)
Mass flow rate (kg/s) of outlet species k.
Definition: FlowDevice.cpp:59
double enthalpy_mass()
specific enthalpy
Definition: FlowDevice.cpp:71
double massFlowRate()
Mass flow rate (kg/s).
Definition: FlowDevice.h:48
virtual void getNetProductionRates(doublereal *wdot)
Species net production rates [kmol/m^3/s or kmol/m^2/s].
Definition: Kinetics.cpp:484
size_t nSpecies() const
Returns the number of species in the phase.
Definition: Phase.h:273
virtual void setMassFractions_NoNorm(const double *const y)
Set the mass fractions to the specified values without normalizing.
Definition: Phase.cpp:405
const vector_fp & molecularWeights() const
Return a const reference to the internal vector of molecular weights.
Definition: Phase.cpp:509
virtual void setPressure(double p)
Set the internally stored pressure (Pa) at constant temperature and composition.
Definition: Phase.h:712
std::string speciesName(size_t k) const
Name of the species with index k.
Definition: Phase.cpp:200
const double * massFractions() const
Return a const pointer to the mass fraction array.
Definition: Phase.h:532
virtual double density() const
Density (kg/m^3).
Definition: Phase.h:679
void restoreState(const vector_fp &state)
Restore a state saved on a previous call to saveState.
Definition: Phase.cpp:310
void getMassFractions(double *const y) const
Get the species mass fractions.
Definition: Phase.cpp:585
FlowDevice & outlet(size_t n=0)
Return a reference to the n-th outlet FlowDevice connected to this reactor.
double m_pressure
Current pressure in the reactor [Pa].
Definition: ReactorBase.h:263
FlowDevice & inlet(size_t n=0)
Return a reference to the n-th inlet FlowDevice connected to this reactor.
double m_vol
Current volume of the reactor [m^3].
Definition: ReactorBase.h:260
size_t m_nsp
Number of homogeneous species in the mixture.
Definition: ReactorBase.h:257
double m_enthalpy
Current specific enthalpy of the reactor [J/kg].
Definition: ReactorBase.h:261
virtual void evalSurfaces(double *LHS, double *RHS, double *sdot)
Evaluate terms related to surface reactions.
Definition: Reactor.cpp:279
virtual void updateSurfaceState(double *y)
Update the state of SurfPhase objects attached to this reactor.
Definition: Reactor.cpp:175
Kinetics * m_kin
Pointer to the homogeneous Kinetics object that handles the reactions.
Definition: Reactor.h:216
virtual void evalWalls(double t)
Evaluate terms related to Walls.
Definition: Reactor.cpp:267
size_t neq()
Number of equations (state variables) for this reactor.
Definition: Reactor.h:92
double m_Qdot
net heat transfer into the reactor, through walls [W]
Definition: Reactor.h:225
doublereal m_mass
total mass
Definition: Reactor.h:227
vector_fp m_sdot
Production rates of gas phase species on surfaces [kmol/s].
Definition: Reactor.h:231
virtual void initialize(doublereal t0=0.0)
Initialize the reactor.
Definition: Reactor.cpp:84
virtual void getSurfaceInitialConditions(double *y)
Get initial conditions for SurfPhase objects attached to this reactor.
Definition: Reactor.cpp:75
virtual size_t speciesIndex(const std::string &nm) const
Return the index in the solution vector for this reactor of the species named nm, in either the homog...
Definition: Reactor.cpp:340
vector_fp m_wdot
Species net molar production rates.
Definition: Reactor.h:233
virtual void updateConnected(bool updatePressure)
Update the state information needed by connected reactors and flow devices.
Definition: Reactor.cpp:184
Base class for a phase with thermodynamic properties.
Definition: ThermoPhase.h:102
virtual void setState_HP(double h, double p, double tol=1e-9)
Set the internally stored specific enthalpy (J/kg) and pressure (Pa) of the phase.
doublereal enthalpy_mass() const
Specific enthalpy. Units: J/kg.
Definition: ThermoPhase.h:748
Namespace for the Cantera kernel.
Definition: AnyMap.h:29
const size_t npos
index returned by functions to indicate "no position"
Definition: ct_defs.h:192
doublereal dot(InputIter x_begin, InputIter x_end, InputIter2 y_begin)
Function that calculates a templated inner product.
Definition: utilities.h:77
std::vector< double > vector_fp
Turn on the use of stl vectors for the basic array type within cantera Vector of doubles.
Definition: ct_defs.h:184
Various templated functions that carry out common vector operations (see Templated Utility Functions)...