cantera/include/cantera/zeroD/Reactor.h
2017-02-12 19:22:33 -05:00

188 lines
6.4 KiB
C++

//! @file Reactor.h
// This file is part of Cantera. See License.txt in the top-level directory or
// at http://www.cantera.org/license.txt for license and copyright information.
#ifndef CT_REACTOR_H
#define CT_REACTOR_H
#include "ReactorBase.h"
#include "cantera/kinetics/Kinetics.h"
namespace Cantera
{
/**
* Class Reactor is a general-purpose class for stirred reactors. The reactor
* may have an arbitrary number of inlets and outlets, each of which may be
* connected to a "flow device" such as a mass flow controller, a pressure
* regulator, etc. Additional reactors may be connected to the other end of
* the flow device, allowing construction of arbitrary reactor networks.
*
* The reactor class integrates the same governing equations no matter what
* type of reactor is simulated. The differences among reactor types are
* completely specified by the attached flow devices and the time-dependent
* user-specified boundary conditions.
*
* If an instance of class Reactor is used directly, it will simulate an
* adiabatic, constant volume reactor with gas-phase chemistry but no surface
* chemistry. Other reactor types may be simulated by deriving a class from
* Reactor. This method allows specifying the following in terms of the
* instantaneous reactor state:
*
* - rate of change of the total volume (m^3/s)
* - surface heat loss rate (W)
* - species surface production rates (kmol/s)
*/
class Reactor : public ReactorBase
{
public:
Reactor();
virtual int type() const {
return ReactorType;
}
/**
* Insert something into the reactor. The 'something' must belong to a class
* that is a subclass of both ThermoPhase and Kinetics.
*/
template<class G>
void insert(G& contents) {
setThermoMgr(contents);
setKineticsMgr(contents);
}
void setKineticsMgr(Kinetics& kin);
//! Enable or disable changes in reactor composition due to chemical reactions.
void setChemistry(bool cflag = true) {
m_chem = cflag;
}
//! Returns `true` if changes in the reactor composition due to chemical reactions are enabled.
bool chemistryEnabled() const {
return m_chem;
}
//! Set the energy equation on or off.
void setEnergy(int eflag = 1) {
if (eflag > 0) {
m_energy = true;
} else {
m_energy = false;
}
}
//! Returns `true` if solution of the energy equation is enabled.
bool energyEnabled() const {
return m_energy;
}
//! Number of equations (state variables) for this reactor
virtual size_t neq() {
if (!m_nv) {
initialize();
}
return m_nv;
}
//! Get the the current state of the reactor.
/*!
* @param[out] y state vector representing the initial state of the reactor
*/
virtual void getState(doublereal* y);
virtual void initialize(doublereal t0 = 0.0);
/*!
* Evaluate the reactor governing equations. Called by ReactorNet::eval.
* @param[in] t time.
* @param[in] y solution vector, length neq()
* @param[out] ydot rate of change of solution vector, length neq()
* @param[in] params sensitivity parameter vector, length ReactorNet::nparams()
*/
virtual void evalEqs(doublereal t, doublereal* y,
doublereal* ydot, doublereal* params);
virtual void syncState();
//! Set the state of the reactor to correspond to the state vector *y*.
virtual void updateState(doublereal* y);
//! Number of sensitivity parameters associated with this reactor
//! (including walls)
virtual size_t nSensParams();
//! Add a sensitivity parameter associated with the reaction number *rxn*
//! (in the homogeneous phase).
virtual void addSensitivityReaction(size_t rxn);
//! Add a sensitivity parameter associated with the enthalpy formation of
//! species *k* (in the homogeneous phase)
virtual void addSensitivitySpeciesEnthalpy(size_t k);
//! Return the index in the solution vector for this reactor of the
//! component named *nm*. Possible values for *nm* are "mass", "volume",
//! "int_energy", the name of a homogeneous phase species, or the name of a
//! surface species.
virtual size_t componentIndex(const std::string& nm) const;
//! Return the name of the solution component with index *i*.
//! @see componentIndex()
virtual std::string componentName(size_t k);
protected:
//! Set reaction rate multipliers based on the sensitivity variables in
//! *params*.
virtual void applySensitivity(double* params);
//! Reset the reaction rate multipliers
virtual void resetSensitivity(double* params);
//! Return the index in the solution vector for this reactor of the species
//! named *nm*, in either the homogeneous phase or a surface phase, relative
//! to the start of the species terms. Used to implement componentIndex for
//! specific reactor implementations.
virtual size_t speciesIndex(const std::string& nm) const;
//! Evaluate terms related to Walls. Calculates #m_vdot and #m_Q based on
//! wall movement and heat transfer.
//! @param t the current time
virtual void evalWalls(double t);
//! Evaluate terms related to surface reactions. Calculates #m_sdot and rate
//! of change in surface species coverages.
//! @param t the current time
//! @param[out] ydot array of d(coverage)/dt for surface species
//! @returns Net mass flux from surfaces
virtual double evalSurfaces(double t, double* ydot);
//! Update the state of SurfPhase objects attached to this reactor
virtual void updateSurfaceState(double* y);
//! Get initial conditions for SurfPhase objects attached to this reactor
virtual void getSurfaceInitialConditions(double* y);
//! Pointer to the homogeneous Kinetics object that handles the reactions
Kinetics* m_kin;
doublereal m_vdot; //!< net rate of volume change from moving walls [m^3/s]
doublereal m_Q; //!< net heat transfer through walls [W]
doublereal m_mass; //!< total mass
vector_fp m_work;
//! Production rates of gas phase species on surfaces [kmol/s]
vector_fp m_sdot;
vector_fp m_wdot; //!< Species net molar production rates
vector_fp m_uk; //!< Species molar internal energies
bool m_chem;
bool m_energy;
size_t m_nv;
// Data associated each sensitivity parameter
std::vector<SensitivityParameter> m_sensParams;
};
}
#endif