17 const vector<shared_ptr<ReactorBase>>& reactors,
22 if (reactors.empty()) {
24 "Surface requires at least one adjacent reactor.");
26 vector<shared_ptr<Solution>> adjacent;
27 for (
auto R : reactors) {
28 adjacent.push_back(R->phase());
29 m_reactors.push_back(R.get());
33 m_solution = soln->clone(adjacent,
true,
false);
38 m_surf = std::dynamic_pointer_cast<SurfPhase>(
m_solution->thermo());
41 "Solution object must have a SurfPhase object as the thermo manager.");
44 if (!soln->kinetics() ) {
46 "Solution object must have kinetics manager.");
47 }
else if (!std::dynamic_pointer_cast<InterfaceKinetics>(soln->kinetics())) {
49 "Kinetics manager must be an InterfaceKinetics object.");
52 m_thermo = m_surf.get();
53 m_cov.resize(m_surf->nSpecies());
54 m_surf->getCoverages(m_cov.data());
69 copy(cov, cov + m_cov.size(), m_cov.begin());
74 m_surf->setCoveragesByName(cov);
75 m_surf->getCoverages(m_cov.data());
80 m_surf->setCoveragesByName(cov);
81 m_surf->getCoverages(m_cov.data());
86 copy(m_cov.begin(), m_cov.end(), cov);
91 m_surf->setTemperature(m_reactors[0]->
temperature());
92 m_surf->setCoveragesNoNorm(m_cov.data());
97 warn_user(
"ReactorSurface::syncState",
"Behavior changed in Cantera 3.2 for "
98 "consistency with ReactorBase. To set SurfPhase state from ReactorSurface "
99 "object, use restoreState().");
100 m_surf->getCoverages(m_cov.data());
105 if (rxn >= m_kinetics->nReactions()) {
106 throw CanteraError(
"ReactorSurface::addSensitivityReaction",
107 "Reaction number out of range ({})", rxn);
109 size_t p = m_reactors[0]->network().registerSensitivityParameter(
110 m_kinetics->reaction(rxn)->equation(), 1.0, 1.0);
111 m_sensParams.emplace_back(
117 for (
auto& p : m_sensParams) {
118 p.value = m_kinetics->multiplier(p.local);
119 m_kinetics->setMultiplier(p.local, p.value*params[p.global]);
125 for (
auto& p : m_sensParams) {
126 m_kinetics->setMultiplier(p.local, p.value);
Base class for kinetics managers and also contains the kineticsmgr module documentation (see Kinetics...
Header file for class ReactorSurface.
Header for a simple thermodynamics model of a surface phase derived from ThermoPhase,...
Base class for exceptions thrown by Cantera classes.
Base class for reactor objects.
shared_ptr< Solution > m_solution
Composite thermo/kinetics/transport handler.
double temperature() const
Returns the current temperature (K) of the reactor's contents.
void restoreState() override
Set the coverages and temperature in the surface phase object to the values for this surface.
double area() const override
Returns the surface area [m²].
void setSensitivityParameters(const double *params)
Set reaction rate multipliers.
ReactorSurface(shared_ptr< Solution > soln, const vector< shared_ptr< ReactorBase > > &reactors, bool clone, const string &name="(none)")
Create a new ReactorSurface.
void setArea(double a) override
Set the surface area [m²].
void getCoverages(double *cov) const
Get the surface coverages.
void resetSensitivityParameters()
Set reaction rate multipliers back to their initial values.
void addSensitivityReaction(size_t rxn) override
Add a sensitivity parameter associated with the reaction number rxn
void syncState() override
Set the coverages for this ReactorSurface based on the attached SurfPhase.
void setCoverages(const double *cov)
Set the surface coverages.
void warn_user(const string &method, const string &msg, const Args &... args)
Print a user warning raised from method as CanteraWarning.
Namespace for the Cantera kernel.
map< string, double > Composition
Map from string names to doubles.