cantera/src/thermo/VPSSMgr_IdealGas.cpp

129 lines
3.4 KiB
C++

/**
* @file VPSSMgr_IdealGas.cpp
* Definition file for a derived class that handles the calculation
* of standard state thermo properties for
* a set of species which have an Ideal Gas dependence
* (see \ref thermoprops and
* class \link Cantera::VPSSMgr_IdealGas VPSSMgr_IdealGas\endlink).
*/
/*
* Copyright (2005) Sandia Corporation. Under the terms of
* Contract DE-AC04-94AL85000 with Sandia Corporation, the
* U.S. Government retains certain rights in this software.
*/
#include "cantera/thermo/VPSSMgr_IdealGas.h"
#include "cantera/base/utilities.h"
#include "cantera/base/xml.h"
#include "cantera/base/ctml.h"
#include "cantera/thermo/SpeciesThermoFactory.h"
#include "cantera/thermo/PDSS_IdealGas.h"
using namespace std;
using namespace ctml;
namespace Cantera
{
VPSSMgr_IdealGas::VPSSMgr_IdealGas(VPStandardStateTP* vp_ptr, SpeciesThermo* spth) :
VPSSMgr(vp_ptr, spth)
{
m_useTmpRefStateStorage = true;
m_useTmpStandardStateStorage = true;
}
VPSSMgr_IdealGas::VPSSMgr_IdealGas(const VPSSMgr_IdealGas& right) :
VPSSMgr(right.m_vptp_ptr, right.m_spthermo)
{
m_useTmpRefStateStorage = true;
m_useTmpStandardStateStorage = true;
*this = right;
}
VPSSMgr_IdealGas& VPSSMgr_IdealGas::operator=(const VPSSMgr_IdealGas& b)
{
if (&b == this) {
return *this;
}
VPSSMgr::operator=(b);
return *this;
}
VPSSMgr* VPSSMgr_IdealGas::duplMyselfAsVPSSMgr() const
{
return new VPSSMgr_IdealGas(*this);
}
void VPSSMgr_IdealGas::getIntEnergy_RT(doublereal* urt) const
{
getEnthalpy_RT(urt);
for (size_t k = 0; k < m_kk; k++) {
urt[k] -= 1.0;
}
}
void VPSSMgr_IdealGas::getStandardVolumes(doublereal* vol) const
{
copy(m_Vss.begin(), m_Vss.end(), vol);
}
void VPSSMgr_IdealGas::_updateStandardStateThermo()
{
doublereal pp = log(m_plast / m_p0);
doublereal v = temperature() *GasConstant /m_plast;
for (size_t k = 0; k < m_kk; k++) {
m_hss_RT[k] = m_h0_RT[k];
m_cpss_R[k] = m_cp0_R[k];
m_sss_R[k] = m_s0_R[k] - pp;
m_gss_RT[k] = m_hss_RT[k] - m_sss_R[k];
m_Vss[k] = v;
}
}
void
VPSSMgr_IdealGas::initThermoXML(XML_Node& phaseNode, const std::string& id)
{
VPSSMgr::initThermoXML(phaseNode, id);
}
PDSS*
VPSSMgr_IdealGas::createInstallPDSS(size_t k, const XML_Node& speciesNode,
const XML_Node* const phaseNode_ptr)
{
//VPSSMgr::installSpecies(k, speciesNode, phaseNode_ptr);
const XML_Node* ss = speciesNode.findByName("standardState");
if (ss) {
std::string model = (*ss)["model"];
if (model != "ideal_gas") {
throw CanteraError("VPSSMgr_IdealGas::initThermoXML",
"standardState model for species isn't "
"ideal_gas: " + speciesNode.name());
}
}
if (m_Vss.size() < k+1) {
m_Vss.resize(k+1, 0.0);
}
SpeciesThermoFactory* f = SpeciesThermoFactory::factory();
f->installThermoForSpecies(k, speciesNode,(ThermoPhase*) m_vptp_ptr, *m_spthermo, phaseNode_ptr);
PDSS* kPDSS = new PDSS_IdealGas(m_vptp_ptr, k, speciesNode,
*phaseNode_ptr, true);
m_p0 = m_spthermo->refPressure(k);
return kPDSS;
}
PDSS_enumType VPSSMgr_IdealGas::reportPDSSType(int k) const
{
return cPDSS_IDEALGAS;
}
VPSSMgr_enumType VPSSMgr_IdealGas::reportVPSSMgrType() const
{
return cVPSSMGR_IDEALGAS;
}
}