cantera/include/cantera/kinetics/FalloffMgr.h

98 lines
2.7 KiB
C++

/**
* @file FalloffMgr.h
*/
// Copyright 2001 California Institute of Technology
#ifndef CT_FALLOFFMGR_H
#define CT_FALLOFFMGR_H
#include "reaction_defs.h"
#include "FalloffFactory.h"
namespace Cantera
{
/**
* A falloff manager that implements any set of falloff functions.
* @ingroup falloffGroup
*/
class FalloffMgr
{
public:
//! Constructor.
FalloffMgr(/*FalloffFactory* f = 0*/) :
m_worksize(0) {
//if (f == 0)
m_factory = FalloffFactory::factory(); // RFB:TODO This raw pointer should be encapsulated
// because accessing a 'Singleton Factory'
//else m_factory = f;
}
//! Destructor. Deletes all installed falloff function calculators.
virtual ~FalloffMgr() {
for (size_t i = 0; i < m_falloff.size(); i++) {
delete m_falloff[i];
}
//if (m_factory) {
//FalloffFactory::deleteFalloffFactory();
//m_factory = 0;
//}
}
//! Install a new falloff function calculator.
/*
* @param rxn Index of the falloff reaction. This will be used to
* determine which array entry is modified in method pr_to_falloff.
* @param type of falloff function to install.
* @param c vector of coefficients for the falloff function.
*/
void install(size_t rxn, int type,
const vector_fp& c) {
m_rxn.push_back(rxn);
Falloff* f = m_factory->newFalloff(type,c);
m_offset.push_back(m_worksize);
m_worksize += f->workSize();
m_falloff.push_back(f);
}
//! Size of the work array required to store intermediate results.
size_t workSize() {
return m_worksize;
}
/**
* Update the cached temperature-dependent intermediate
* results for all installed falloff functions.
* @param t Temperature [K].
* @param work Work array. Must be dimensioned at least workSize().
*/
void updateTemp(doublereal t, doublereal* work) {
for (size_t i = 0; i < m_rxn.size(); i++) {
m_falloff[i]->updateTemp(t, work + m_offset[i]);
}
}
/**
* Given a vector of reduced pressures for each falloff reaction,
* replace each entry by the value of the falloff function.
*/
void pr_to_falloff(doublereal* values, const doublereal* work) {
for (size_t i = 0; i < m_rxn.size(); i++) {
double pr = values[m_rxn[i]];
values[m_rxn[i]] *=
m_falloff[i]->F(pr, work + m_offset[i]) /(1.0 + pr);
}
}
protected:
std::vector<size_t> m_rxn;
std::vector<Falloff*> m_falloff;
FalloffFactory* m_factory;
vector_int m_loc;
std::vector<vector_fp::difference_type> m_offset;
size_t m_worksize;
};
}
#endif