diff --git a/Cantera/src/ConstDensityThermo.h b/Cantera/src/ConstDensityThermo.h index 1a53493e7..6305c706b 100755 --- a/Cantera/src/ConstDensityThermo.h +++ b/Cantera/src/ConstDensityThermo.h @@ -170,6 +170,12 @@ namespace Cantera { setDensity(c[0]); } + virtual void getParameters(int &n, doublereal * const c) { + double d = density(); + c[0] = d; + n = 1; + } + virtual void setParametersFromXML(const XML_Node& eosdata); protected: diff --git a/Cantera/src/NasaPoly1.h b/Cantera/src/NasaPoly1.h index 12309ebc3..1b3921244 100755 --- a/Cantera/src/NasaPoly1.h +++ b/Cantera/src/NasaPoly1.h @@ -59,7 +59,7 @@ namespace Cantera { copy(coeffs, coeffs + 7, m_coeff.begin()); } - virtual ~NasaPoly1(){} + ~NasaPoly1(){} doublereal minTemp() const { return m_lowT;} doublereal maxTemp() const { return m_highT;} @@ -67,9 +67,12 @@ namespace Cantera { /** * Update the properties for this species. This method is called - * with a pointer to an array containing the functions of temperature needed by this - * parameterization, and three pointers to arrays where the computed property values - * should be written. This method updates only one value in each array. + * with a pointer to an array containing the functions of + * temperature needed by this + * parameterization, and three pointers to arrays where the + * computed property values + * should be written. This method updates only one value in + * each array. */ void updateProperties(const doublereal* tt, doublereal* cp_R, doublereal* h_RT, doublereal* s_R) const { @@ -94,6 +97,18 @@ namespace Cantera { s_R[m_index] = s; } + void reportParameters(int &n, doublereal &tlow, doublereal &thigh, + doublereal &pref, + doublereal* const coeffs) const { + n = m_index; + tlow = m_lowT; + thigh = m_highT; + pref = m_Pref; + for (int i = 0; i < 7; i++) { + coeffs[i] = m_coeff[i]; + } + } + protected: doublereal m_lowT; // lowest valid temperature diff --git a/Cantera/src/NasaThermo.h b/Cantera/src/NasaThermo.h index 5ff27568f..d2b93f6a6 100755 --- a/Cantera/src/NasaThermo.h +++ b/Cantera/src/NasaThermo.h @@ -65,7 +65,8 @@ namespace Cantera { * - c[8] - c[14] coefficients for high T range */ virtual void install(int index, int type, const doublereal* c, - doublereal minTemp, doublereal maxTemp, doublereal refPressure) { + doublereal minTemp, doublereal maxTemp, + doublereal refPressure) { int imid = int(c[0]); // midpoint temp converted to integer int igrp = m_index[imid]; // has this value been seen before? @@ -77,6 +78,10 @@ namespace Cantera { m_index[imid] = igrp = static_cast(m_high.size()); m_ngroups++; } + + m_group_map[index] = igrp; + m_posInGroup_map[index] = (int) m_low[igrp-1].size(); + doublereal tlow = minTemp; doublereal tmid = c[0]; doublereal thigh = maxTemp; @@ -92,13 +97,12 @@ namespace Cantera { pref, chigh.begin())); m_low[igrp-1].push_back(NasaPoly1(index, tlow, tmid, pref, clow)); + if (tlow > m_tlow_max) m_tlow_max = tlow; if (thigh < m_thigh_min) m_thigh_min = thigh; m_tlow.push_back(tlow); m_thigh.push_back(thigh); m_p0 = pref; - m_high_map[index] = &m_high[igrp-1].back(); - m_low_map[index] = &m_low[igrp-1].back(); } /** @@ -114,11 +118,17 @@ namespace Cantera { m_t[4] = 1.0/t; m_t[5] = log(t); - doublereal tmid = m_low_map[k]->maxTemp(); - if (t < tmid) - m_low_map[k]->updateProperties(m_t.begin(), cp_R, h_RT, s_R); - else - m_high_map[k]->updateProperties(m_t.begin(), cp_R, h_RT, s_R); + int grp = m_group_map[k]; + int pos = m_posInGroup_map[k]; + const NasaPoly1 *nlow = &(m_low[grp-1].at(pos)); + + doublereal tmid = nlow->maxTemp(); + if (t < tmid) { + nlow->updateProperties(m_t.begin(), cp_R, h_RT, s_R); + } else { + const NasaPoly1 *nhigh = &(m_high[grp-1].at(pos)); + nhigh->updateProperties(m_t.begin(), cp_R, h_RT, s_R); + } } @@ -173,10 +183,53 @@ namespace Cantera { virtual doublereal refPressure() const {return m_p0;} + /** + * This utility function reports the type of parameterization + * used for the species, index. + */ + virtual int reportType(int index) const { return NASA; } + + /** + * This utility function reports back the type of + * parameterization and all of the parameters for the + * species, index. + * For the NASA object, there are 15 coefficients. + */ + virtual void reportParams(int index, int &type, + doublereal * const c, + doublereal &minTemp, + doublereal &maxTemp, + doublereal &refPressure) { + type = reportType(index); + if (type == NASA) { + int grp = m_group_map[index]; + int pos = m_posInGroup_map[index]; + const NasaPoly1 *lowPoly = &(m_low[grp-1].at(pos)); + const NasaPoly1 *highPoly = &(m_high[grp-1].at(pos)); + + doublereal tmid = lowPoly->maxTemp(); + c[0] = tmid; + int n; + double ttemp; + lowPoly->reportParameters(n, minTemp, ttemp, refPressure, + c + 1); + if (n != index) { + throw CanteraError(" ", "confused"); + } + highPoly->reportParameters(n, ttemp, maxTemp, refPressure, + c + 8); + if (n != index) { + throw CanteraError(" ", "confused"); + } + } else { + throw CanteraError(" ", "confused"); + } + } + protected: - mutable map m_low_map; - mutable map m_high_map; + // mutable map m_low_map; + // mutable map m_high_map; vector > m_high; vector > m_low; map m_index; @@ -189,6 +242,9 @@ namespace Cantera { int m_ngroups; mutable vector_fp m_t; + mutable map m_group_map; + mutable map m_posInGroup_map; + private: // see SpeciesThermoFactory.cpp for the definition @@ -215,32 +271,3 @@ namespace Cantera { #endif -// $Log$ -// Revision 1.6 2004-07-01 23:47:45 hkmoffa -// static_cast to eliminate VC++ warnings. -// -// Revision 1.5 2004/04/24 12:53:00 dggoodwin -// *** empty log message *** -// -// Revision 1.4 2004/04/23 19:03:22 dggoodwin -// *** empty log message *** -// -// Revision 1.3 2004/04/22 21:44:36 dggoodwin -// *** empty log message *** -// -// Revision 1.2 2003/11/01 04:50:35 dggoodwin -// *** empty log message *** -// -// Revision 1.1.1.1 2003/04/14 17:57:51 dggoodwin -// Initial import. -// -// Revision 1.16 2003/01/13 10:14:32 dgg -// *** empty log message *** -// -// -// Revision 1.3 2001/12/19 03:14:27 dgg -// Added an offset to the high temperature cp constant coefficient so -// that the high and low cp fits agree precisely at Tmid. This is -// necessary to avoid spurious errors that can occur when integrators -// begin at an initial temperature precisely equal to Tmid. -// diff --git a/Cantera/src/PolyThermoMgr.h b/Cantera/src/PolyThermoMgr.h index 25241bc21..9bd8c06ce 100755 --- a/Cantera/src/PolyThermoMgr.h +++ b/Cantera/src/PolyThermoMgr.h @@ -76,6 +76,7 @@ namespace Cantera { virtual doublereal minTemp(int k=-1) const {return m_minTemp;} virtual doublereal maxTemp(int k=-1) const {return m_maxTemp;} virtual doublereal refPressure() const {return m_p0;} + virtual int reportType(int index) const { return POLYNOMIAL_4;} protected: diff --git a/Cantera/src/ShomatePoly.h b/Cantera/src/ShomatePoly.h index 190157c2c..05bbb9a11 100755 --- a/Cantera/src/ShomatePoly.h +++ b/Cantera/src/ShomatePoly.h @@ -50,7 +50,7 @@ namespace Cantera { copy(coeffs, coeffs + 7, m_coeff.begin()); } - virtual ~ShomatePoly(){} + ~ShomatePoly(){} doublereal minTemp() const { return m_lowT;} doublereal maxTemp() const { return m_highT;} @@ -87,6 +87,18 @@ namespace Cantera { s_R[m_index] = 1.e3 * s * tt[5]; } + + void reportParameters(int &n, doublereal &tlow, doublereal &thigh, + doublereal &pref, + doublereal* const coeffs) const { + n = m_index; + tlow = m_lowT; + thigh = m_highT; + pref = m_Pref; + for (int i = 0; i < 7; i++) { + coeffs[i] = m_coeff[i]; + } + } protected: doublereal m_lowT, m_highT, m_Pref; diff --git a/Cantera/src/ShomateThermo.h b/Cantera/src/ShomateThermo.h index 421cde944..194e987d7 100755 --- a/Cantera/src/ShomateThermo.h +++ b/Cantera/src/ShomateThermo.h @@ -66,6 +66,8 @@ namespace Cantera { m_index[imid] = igrp = static_cast(m_high.size()); m_ngroups++; } + m_group_map[index] = igrp; + m_posInGroup_map[index] = (int) m_low[igrp-1].size(); doublereal tlow = minTemp; doublereal tmid = c[0]; doublereal thigh = maxTemp; @@ -83,6 +85,33 @@ namespace Cantera { m_p0 = pref; } + /** + * update the properties for only one species. + */ + virtual void update_one(int k, doublereal t, doublereal* cp_R, + doublereal* h_RT, doublereal* s_R) const { + + doublereal tt = 1.e-3*t; + m_t[0] = tt; + m_t[1] = tt*tt; + m_t[2] = m_t[1]*tt; + m_t[3] = 1.0/m_t[1]; + m_t[4] = log(tt); + m_t[5] = 1.0/GasConstant; + m_t[6] = 1.0/(GasConstant * t); + + int grp = m_group_map[k]; + int pos = m_posInGroup_map[k]; + const ShomatePoly *nlow = &(m_low[grp-1].at(pos)); + + doublereal tmid = nlow->maxTemp(); + if (t < tmid) { + nlow->updateProperties(m_t.begin(), cp_R, h_RT, s_R); + } else { + const ShomatePoly *nhigh = &(m_high[grp-1].at(pos)); + nhigh->updateProperties(m_t.begin(), cp_R, h_RT, s_R); + } + } virtual void update(doublereal t, doublereal* cp_R, doublereal* h_RT, doublereal* s_R) const { @@ -129,8 +158,48 @@ namespace Cantera { virtual doublereal refPressure() const {return m_p0;} + virtual int reportType(int index) const { return SHOMATE; } + + /** + * This utility function reports back the type of + * parameterization and all of the parameters for the + * species, index. + * For the NASA object, there are 15 coefficients. + */ + virtual void reportParams(int index, int &type, + doublereal * const c, + doublereal &minTemp, + doublereal &maxTemp, + doublereal &refPressure) { + type = reportType(index); + if (type == NASA) { + int grp = m_group_map[index]; + int pos = m_posInGroup_map[index]; + const ShomatePoly *lowPoly = &(m_low[grp-1].at(pos)); + const ShomatePoly *highPoly = &(m_high[grp-1].at(pos)); + doublereal tmid = lowPoly->maxTemp(); + c[0] = tmid; + int n; + double ttemp; + lowPoly->reportParameters(n, minTemp, ttemp, refPressure, + c + 1); + if (n != index) { + throw CanteraError(" ", "confused"); + } + highPoly->reportParameters(n, ttemp, maxTemp, refPressure, + c + 8); + if (n != index) { + throw CanteraError(" ", "confused"); + } + } else { + throw CanteraError(" ", "confused"); + } + } + protected: + //mutable map m_low_map; + //mutable map m_high_map; vector > m_high; vector > m_low; map m_index; @@ -142,6 +211,9 @@ namespace Cantera { doublereal m_p0; int m_ngroups; mutable vector_fp m_t; + + mutable map m_group_map; + mutable map m_posInGroup_map; }; } diff --git a/Cantera/src/SimpleThermo.h b/Cantera/src/SimpleThermo.h index 06487613b..547503f86 100644 --- a/Cantera/src/SimpleThermo.h +++ b/Cantera/src/SimpleThermo.h @@ -1,5 +1,5 @@ /** - * + * $Id$ */ #ifndef CT_SIMPLETHERMO_H @@ -57,6 +57,15 @@ namespace Cantera { } } + virtual void update_one(int k, doublereal t, doublereal* cp_R, + doublereal* h_RT, doublereal* s_R) const { + doublereal logt = log(t); + doublereal rt = 1.0/t; + cp_R[k] = m_cp0_R[k]; + h_RT[k] = rt*(m_h0_R[k] + (t - m_t0[k]) * m_cp0_R[k]); + s_R[k] = m_s0_R[k] + m_cp0_R[k] * (logt - m_logt0[k]); + } + virtual doublereal minTemp(int k=-1) const { if (k < 0) return m_tlow_max; @@ -73,6 +82,32 @@ namespace Cantera { virtual doublereal refPressure() const {return m_p0;} + virtual int reportType(int index) const { return SIMPLE; } + + /** + * This utility function reports back the type of + * parameterization and all of the parameters for the + * species, index. + * For the SimpleThermo object, there are 4 coefficients. + */ + virtual void reportParams(int index, int &type, + doublereal * const c, + doublereal &minTemp, + doublereal &maxTemp, + doublereal &refPressure) { + type = reportType(index); + if (type == SIMPLE) { + c[0] = m_t0[index]; + c[1] = m_h0_R[index] * GasConstant; + c[2] = m_s0_R[index] * GasConstant; + c[3] = m_cp0_R[index] * GasConstant; + minTemp = m_tlow[index]; + maxTemp = m_thigh[index]; + refPressure = m_p0; + } + } + + protected: map m_index; diff --git a/Cantera/src/SpeciesThermo.h b/Cantera/src/SpeciesThermo.h index 0a1d73ca7..6ab58bf00 100755 --- a/Cantera/src/SpeciesThermo.h +++ b/Cantera/src/SpeciesThermo.h @@ -84,7 +84,9 @@ namespace Cantera { virtual void update_one(int k, doublereal T, doublereal* cp_R, doublereal* h_RT, - doublereal* s_R) const {} + doublereal* s_R) const { + update(T, cp_R, h_RT, s_R); + } /** * Minimum temperature. If no argument is supplied, this @@ -109,13 +111,25 @@ namespace Cantera { * for the same standard-state pressure. */ virtual doublereal refPressure() const =0; + + /** + * This utility function reports the type of parameterization + * used for the species, index. + */ + virtual int reportType(int index) const = 0; + + /** + * This utility function reports back the type of + * parameterization and all of the parameters for the + * species, index. + */ + virtual void reportParams(int index, int &type, + doublereal * const c, + doublereal &minTemp, + doublereal &maxTemp, + doublereal &refPressure)=0; }; } #endif - - - - - diff --git a/Cantera/src/SpeciesThermoMgr.h b/Cantera/src/SpeciesThermoMgr.h index 8529baa5d..14e2f749b 100755 --- a/Cantera/src/SpeciesThermoMgr.h +++ b/Cantera/src/SpeciesThermoMgr.h @@ -16,6 +16,8 @@ #include "ctexceptions.h" #include "stringUtils.h" #include "SpeciesThermo.h" +#include +using namespace std; namespace Cantera { @@ -111,12 +113,15 @@ namespace Cantera { virtual void install(int sp, int type, const doublereal* c, doublereal minTemp, doublereal maxTemp, doublereal refPressure) { - if (type == m_thermo1.ID) + if (type == m_thermo1.ID) { m_thermo1.install(sp, 0, c, minTemp, maxTemp, refPressure); - else if (type == m_thermo2.ID) + speciesToType[sp] = m_thermo1.ID; + } else if (type == m_thermo2.ID) { m_thermo2.install(sp, 0, c, minTemp, maxTemp, refPressure); - else + speciesToType[sp] = m_thermo2.ID; + } else { throw UnknownSpeciesThermo("SpeciesThermoDuo:install",type); + } } virtual void update(doublereal t, doublereal* cp_R, @@ -141,10 +146,37 @@ namespace Cantera { return m_thermo1.refPressure(); } + virtual int reportType(int k) const { + map::const_iterator p = speciesToType.find(k); + if (p != speciesToType.end()) { + const int type = p->second; + return type; + } + return -1; + } + + virtual void reportParams(int index, int &type, + doublereal * const c, + doublereal &minTemp, + doublereal &maxTemp, + doublereal &refPressure) { + int ctype = reportType(index); + if (ctype == m_thermo1.ID) { + m_thermo1.reportParams(index, type, c, minTemp, maxTemp, + refPressure); + } else if (ctype == m_thermo1.ID) { + m_thermo2.reportParams(index, type, c, minTemp, maxTemp, + refPressure); + } else { + throw CanteraError(" ", "confused"); + } + } + private: T1 m_thermo1; T2 m_thermo2; + map speciesToType; }; @@ -200,6 +232,13 @@ namespace Cantera { return m_pref; } + + virtual int reportType(int k) const { + return m_thermo[k]->reportType(k); + + } + + private: vector m_thermo; doublereal m_pref; diff --git a/Cantera/src/StoichSubstance.cpp b/Cantera/src/StoichSubstance.cpp index 5bb59e88f..27f0f4c2b 100644 --- a/Cantera/src/StoichSubstance.cpp +++ b/Cantera/src/StoichSubstance.cpp @@ -44,6 +44,16 @@ namespace Cantera { } } + void StoichSubstance::setParameters(int n, double * c) { + double rho = c[0]; + setDensity(rho); + } + + void StoichSubstance::getParameters(int &n, double * const c) { + double rho = density(); + c[0] = rho; + } + void StoichSubstance::setParametersFromXML(const XML_Node& eosdata) { eosdata.require("model","StoichSubstance"); doublereal rho = getFloat(eosdata, "density", "-"); diff --git a/Cantera/src/StoichSubstance.h b/Cantera/src/StoichSubstance.h index 72f4743ee..e850fd8d8 100644 --- a/Cantera/src/StoichSubstance.h +++ b/Cantera/src/StoichSubstance.h @@ -189,7 +189,10 @@ namespace Cantera { virtual void initThermo(); - virtual void setParametersFromXML(const XML_Node& eosdata); + virtual void setParameters(int n, double *c); + virtual void getParameters(int &n, double * const c); + + virtual void setParametersFromXML(const XML_Node& eosdata); protected: diff --git a/Cantera/src/ThermoPhase.h b/Cantera/src/ThermoPhase.h index 9da24ea51..b24db9c5c 100755 --- a/Cantera/src/ThermoPhase.h +++ b/Cantera/src/ThermoPhase.h @@ -519,6 +519,7 @@ namespace Cantera { * @param c array of \i n coefficients */ virtual void setParameters(int n, doublereal* c) {} + virtual void getParameters(int &n, doublereal * const c) {} virtual void setParametersFromXML(const XML_Node& eosdata) {} virtual void setStateFromXML(const XML_Node& state);