cantera/src/thermo/GeneralSpeciesThermo.cpp
Ray Speth 8f36e524fe Do species indexing in GeneralSpeciesThermo instead of STIT
This means that GeneralSpeciesThermo no longer modifies the
SpeciesThermoInterpType objects, permitting them to be shared between
ThermoPhase objects.
2015-04-14 15:29:28 -04:00

257 lines
7.5 KiB
C++

/**
* @file GeneralSpeciesThermo.cpp
* Declarations for a completely general species thermodynamic property
* manager for a phase (see \ref spthermo and
* \link Cantera::GeneralSpeciesThermo GeneralSpeciesThermo\endlink).
*/
// Copyright 2001-2004 California Institute of Technology
#include "cantera/thermo/GeneralSpeciesThermo.h"
#include "cantera/thermo/SpeciesThermoFactory.h"
namespace Cantera
{
GeneralSpeciesThermo::GeneralSpeciesThermo() :
m_tlow_max(0.0),
m_thigh_min(1.0E30),
m_p0(OneAtm)
{
}
GeneralSpeciesThermo::GeneralSpeciesThermo(const GeneralSpeciesThermo& b) :
SpeciesThermo(b),
m_tpoly(b.m_tpoly),
m_speciesLoc(b.m_speciesLoc),
m_tlow_max(b.m_tlow_max),
m_thigh_min(b.m_thigh_min),
m_p0(b.m_p0)
{
m_sp.clear();
// Copy SpeciesThermoInterpTypes from 'b'
for (STIT_map::const_iterator iter = b.m_sp.begin();
iter != b.m_sp.end();
iter++) {
for (size_t k = 0; k < iter->second.size(); k++) {
size_t i = iter->second[k].first;
shared_ptr<SpeciesThermoInterpType> spec(
iter->second[k].second->duplMyselfAsSpeciesThermoInterpType());
m_sp[iter->first].push_back(std::make_pair(i, spec));
}
}
}
GeneralSpeciesThermo&
GeneralSpeciesThermo::operator=(const GeneralSpeciesThermo& b)
{
if (&b == this) {
return *this;
}
SpeciesThermo::operator=(b);
m_sp.clear();
// Copy SpeciesThermoInterpType objects from 'b'
for (STIT_map::const_iterator iter = b.m_sp.begin();
iter != b.m_sp.end();
iter++) {
for (size_t k = 0; k < iter->second.size(); k++) {
size_t i = iter->second[k].first;
shared_ptr<SpeciesThermoInterpType> spec(
iter->second[k].second->duplMyselfAsSpeciesThermoInterpType());
m_sp[iter->first].push_back(std::make_pair(i, spec));
}
}
m_tpoly = b.m_tpoly;
m_speciesLoc = b.m_speciesLoc;
m_tlow_max = b.m_tlow_max;
m_thigh_min = b.m_thigh_min;
m_p0 = b.m_p0;
return *this;
}
SpeciesThermo*
GeneralSpeciesThermo::duplMyselfAsSpeciesThermo() const
{
return new GeneralSpeciesThermo(*this);
}
void GeneralSpeciesThermo::install(const std::string& name,
size_t index,
int type,
const doublereal* c,
doublereal minTemp_,
doublereal maxTemp_,
doublereal refPressure_)
{
warn_deprecated("GeneralSpeciesThermo::install",
"Use newSpeciesThermoInterpType and "
"GeneralSpeciesThermo::install_STIT instead");
if (minTemp_ <= 0.0) {
throw CanteraError("GeneralSpeciesThermo::install",
"T_min must be positive");
}
/*
* Create the necessary object
*/
shared_ptr<SpeciesThermoInterpType> sp(newSpeciesThermoInterpType(type,
minTemp_, maxTemp_, refPressure_, c));
sp->validate(name);
install_STIT(index, sp);
}
void GeneralSpeciesThermo::install_STIT(size_t index,
shared_ptr<SpeciesThermoInterpType> stit_ptr)
{
if (!stit_ptr) {
throw CanteraError("GeneralSpeciesThermo::install_STIT",
"zero pointer");
}
AssertThrow(m_speciesLoc.find(index) == m_speciesLoc.end(),
"Index position isn't null, duplication of assignment: " + int2str(index));
int type = stit_ptr->reportType();
m_speciesLoc[index] = std::make_pair(type, m_sp[type].size());
m_sp[type].push_back(std::make_pair(index, stit_ptr));
if (m_sp[type].size() == 1) {
m_tpoly[type].resize(stit_ptr->temperaturePolySize());
}
// Calculate max and min T
m_tlow_max = std::max(stit_ptr->minTemp(), m_tlow_max);
m_thigh_min = std::min(stit_ptr->maxTemp(), m_thigh_min);
markInstalled(index);
}
void GeneralSpeciesThermo::installPDSShandler(size_t k, PDSS* PDSS_ptr,
VPSSMgr* vpssmgr_ptr)
{
shared_ptr<SpeciesThermoInterpType> stit_ptr(new STITbyPDSS(k, vpssmgr_ptr, PDSS_ptr));
install_STIT(k, stit_ptr);
}
void GeneralSpeciesThermo::update_one(size_t k, doublereal t, doublereal* cp_R,
doublereal* h_RT, doublereal* s_R) const
{
const SpeciesThermoInterpType* sp_ptr = provideSTIT(k);
if (sp_ptr) {
sp_ptr->updatePropertiesTemp(t, cp_R+k, h_RT+k, s_R+k);
}
}
void GeneralSpeciesThermo::update(doublereal t, doublereal* cp_R,
doublereal* h_RT, doublereal* s_R) const
{
STIT_map::const_iterator iter = m_sp.begin();
tpoly_map::iterator jter = m_tpoly.begin();
for (; iter != m_sp.end(); iter++, jter++) {
const std::vector<index_STIT>& species = iter->second;
double* tpoly = &jter->second[0];
species[0].second->updateTemperaturePoly(t, tpoly);
for (size_t k = 0; k < species.size(); k++) {
size_t i = species[k].first;
species[k].second->updateProperties(tpoly, cp_R+i, h_RT+i, s_R+i);
}
}
}
int GeneralSpeciesThermo::reportType(size_t index) const
{
const SpeciesThermoInterpType* sp = provideSTIT(index);
if (sp) {
return sp->reportType();
}
return -1;
}
void GeneralSpeciesThermo::reportParams(size_t index, int& type,
doublereal* const c, doublereal& minTemp_, doublereal& maxTemp_,
doublereal& refPressure_) const
{
const SpeciesThermoInterpType* sp = provideSTIT(index);
size_t n;
if (sp) {
sp->reportParameters(n, type, minTemp_, maxTemp_,
refPressure_, c);
if (n != index) {
throw CanteraError("GeneralSpeciesThermo::reportParams",
"Internal error encountered");
}
} else {
type = -1;
}
}
doublereal GeneralSpeciesThermo::minTemp(size_t k) const
{
if (k != npos) {
const SpeciesThermoInterpType* sp = provideSTIT(k);
if (sp) {
return sp->minTemp();
}
}
return m_tlow_max;
}
doublereal GeneralSpeciesThermo::maxTemp(size_t k) const
{
if (k != npos) {
const SpeciesThermoInterpType* sp = provideSTIT(k);
if (sp) {
return sp->maxTemp();
}
}
return m_thigh_min;
}
doublereal GeneralSpeciesThermo::refPressure(size_t k) const
{
if (k != npos) {
const SpeciesThermoInterpType* sp = provideSTIT(k);
if (sp) {
return sp->refPressure();
}
}
return m_p0;
}
SpeciesThermoInterpType* GeneralSpeciesThermo::provideSTIT(size_t k)
{
try {
const std::pair<int, size_t>& loc = getValue(m_speciesLoc, k);
return getValue(m_sp, loc.first)[loc.second].second.get();
} catch (std::out_of_range&) {
return 0;
}
}
const SpeciesThermoInterpType* GeneralSpeciesThermo::provideSTIT(size_t k) const
{
try {
const std::pair<int, size_t>& loc = getValue(m_speciesLoc, k);
return getValue(m_sp, loc.first)[loc.second].second.get();
} catch (std::out_of_range&) {
return 0;
}
}
doublereal GeneralSpeciesThermo::reportOneHf298(const size_t k) const
{
const SpeciesThermoInterpType* sp_ptr = provideSTIT(k);
doublereal h = -1.0;
if (sp_ptr) {
h = sp_ptr->reportHf298(0);
}
return h;
}
void GeneralSpeciesThermo::modifyOneHf298(const size_t k, const doublereal Hf298New)
{
SpeciesThermoInterpType* sp_ptr = provideSTIT(k);
if (sp_ptr) {
sp_ptr->modifyOneHf298(k, Hf298New);
}
}
}