[Thermo] Always use PDSS_ConstVol for constant volume standard state

Remove the redundant (and questionable) implementation of this from the
PDSS_SSVol class. Also fix some values in PDSS_SSVol that were not updated
except in the constant volume case.
This commit is contained in:
Ray Speth 2017-08-13 16:14:34 -04:00
parent 4c630fc592
commit 822cdc7d38
4 changed files with 14 additions and 59 deletions

View file

@ -67,14 +67,13 @@ namespace Cantera
* pressure dependencies to the thermo functions. * pressure dependencies to the thermo functions.
* *
* - PDSS_ConstVol * - PDSS_ConstVol
* - standardState model = "ConstVol" * - standardState model = "ConstVol" or "constant_incompressible"
* - This model assumes that the species in the phase obeys the constant * - This model assumes that the species in the phase obeys the constant
* partial molar volume pressure dependence. The manager uses a * partial molar volume pressure dependence. The manager uses a
* SimpleThermo object to handle the calculation of the reference state. * SimpleThermo object to handle the calculation of the reference state.
* This object adds the pressure dependencies to these thermo functions. * This object adds the pressure dependencies to these thermo functions.
* *
* - PDSS_SSVol * - PDSS_SSVol
* - standardState model = "constant_incompressible" || model == "constant"
* - standardState model = "temperature_polynomial" * - standardState model = "temperature_polynomial"
* - standardState model = "density_temperature_polynomial" * - standardState model = "density_temperature_polynomial"
* - This model assumes that the species in the phase obey a fairly general * - This model assumes that the species in the phase obey a fairly general

View file

@ -42,13 +42,6 @@ namespace Cantera
* The class includes the following models for the representation of the * The class includes the following models for the representation of the
* standard state volume: * standard state volume:
* *
* - Constant Volume
* - This standard state model is invoked with the keyword "constant_incompressible"
* or "constant". The standard state volume is considered constant.
* \f[
* V^o_k(T,P) = a_0
* \f]
*
* - Temperature polynomial for the standard state volume * - Temperature polynomial for the standard state volume
* - This standard state model is invoked with the keyword "temperature_polynomial". * - This standard state model is invoked with the keyword "temperature_polynomial".
* The standard state volume is considered a function of temperature only. * The standard state volume is considered a function of temperature only.
@ -111,29 +104,6 @@ namespace Cantera
* ## XML Example * ## XML Example
* *
* An example of the specification of a standard state for the LiCl molten salt * An example of the specification of a standard state for the LiCl molten salt
* which employs a constant molar volume expression.
*
* @code
* <speciesData id="species_MoltenSalt">
* <species name="LiCl(L)">
* <atomArray> Li:1 Cl:1 </atomArray>
* <standardState model="constant_incompressible">
* <molarVolume> 0.02048004 </molarVolume>
* </standardState>
* <thermo>
* <Shomate Pref="1 bar" Tmax="2000.0" Tmin="700.0">
* <floatArray size="7">
* 73.18025, -9.047232, -0.316390,
* 0.079587, 0.013594, -417.1314,
* 157.6711
* </floatArray>
* </Shomate>
* </thermo>
* </species>
* </speciesData>
* @endcode
*
* An example of the specification of a standard state for the LiCl molten salt
* which has a temperature dependent standard state volume. * which has a temperature dependent standard state volume.
* *
* @code * @code
@ -206,8 +176,6 @@ private:
//! Types of general formulations for the specification of the standard //! Types of general formulations for the specification of the standard
//! state volume //! state volume
enum class SSVolume_Model { enum class SSVolume_Model {
//! This approximation is for a constant volume
constant = 0,
//! This approximation is for a species with a quadratic polynomial in //! This approximation is for a species with a quadratic polynomial in
//! temperature //! temperature
/*! /*!
@ -226,12 +194,6 @@ private:
//! used to calculate the standard state volume of the species //! used to calculate the standard state volume of the species
SSVolume_Model volumeModel_; SSVolume_Model volumeModel_;
//! Value of the constant molar volume for the species
/*!
* m3 / kmol
*/
doublereal m_constMolarVolume;
//! coefficients for the temperature representation //! coefficients for the temperature representation
vector_fp TCoeff_; vector_fp TCoeff_;

View file

@ -26,11 +26,10 @@ PDSSFactory::PDSSFactory()
m_synonyms["waterPDSS"] = m_synonyms["waterIAPWS"] = "water"; m_synonyms["waterPDSS"] = m_synonyms["waterIAPWS"] = "water";
reg("ions-from-neutral", []() { return new PDSS_IonsFromNeutral(); }); reg("ions-from-neutral", []() { return new PDSS_IonsFromNeutral(); });
m_synonyms["IonFromNeutral"] = "ions-from-neutral"; m_synonyms["IonFromNeutral"] = "ions-from-neutral";
reg("constant", []() { return new PDSS_SSVol(); }); reg("temperature_polynomial", []() { return new PDSS_SSVol(); });
m_synonyms["temperature_polynomial"] = "constant"; m_synonyms["temperature-polynomial"] = "temperature_polynomial";
m_synonyms["temperature-polynomial"] = "constant"; m_synonyms["density_temperature_polynomial"] = "temperature_polynomial";
m_synonyms["density_temperature_polynomial"] = "constant"; m_synonyms["density-temperature-polynomial"] = "temperature_polynomial";
m_synonyms["density-temperature-polynomial"] = "constant";
reg("HKFT", []() { return new PDSS_HKFT(); }); reg("HKFT", []() { return new PDSS_HKFT(); });
} }

View file

@ -17,8 +17,7 @@ namespace Cantera
{ {
PDSS_SSVol::PDSS_SSVol() PDSS_SSVol::PDSS_SSVol()
: volumeModel_(SSVolume_Model::constant) : volumeModel_(SSVolume_Model::tpoly)
, m_constMolarVolume(-1.0)
{ {
TCoeff_[0] = 0.0; TCoeff_[0] = 0.0;
TCoeff_[1] = 0.0; TCoeff_[1] = 0.0;
@ -35,10 +34,7 @@ void PDSS_SSVol::setParametersFromXML(const XML_Node& speciesNode)
"no standardState Node for species " + speciesNode.name()); "no standardState Node for species " + speciesNode.name());
} }
std::string model = ss->attrib("model"); std::string model = ss->attrib("model");
if (model == "constant_incompressible" || model == "constant") { if (model == "temperature_polynomial") {
volumeModel_ = SSVolume_Model::constant;
m_constMolarVolume = getFloat(*ss, "molarVolume", "toSI");
} else if (model == "temperature_polynomial") {
volumeModel_ = SSVolume_Model::tpoly; volumeModel_ = SSVolume_Model::tpoly;
size_t num = getFloatArray(*ss, TCoeff_, true, "toSI", "volumeTemperaturePolynomial"); size_t num = getFloatArray(*ss, TCoeff_, true, "toSI", "volumeTemperaturePolynomial");
if (num != 4) { if (num != 4) {
@ -54,7 +50,8 @@ void PDSS_SSVol::setParametersFromXML(const XML_Node& speciesNode)
} }
} else { } else {
throw CanteraError("PDSS_SSVol::constructPDSSXML", throw CanteraError("PDSS_SSVol::constructPDSSXML",
"standardState model for species isn't constant_incompressible: " + speciesNode.name()); "Unknown standardState model '{}'' for species '{}'",
model, speciesNode.name());
} }
} }
@ -64,8 +61,6 @@ void PDSS_SSVol::initThermo()
m_minTemp = m_spthermo->minTemp(); m_minTemp = m_spthermo->minTemp();
m_maxTemp = m_spthermo->maxTemp(); m_maxTemp = m_spthermo->maxTemp();
m_p0 = m_spthermo->refPressure(); m_p0 = m_spthermo->refPressure();
m_V0 = m_constMolarVolume;
m_Vss = m_constMolarVolume;
} }
doublereal PDSS_SSVol::intEnergy_mole() const doublereal PDSS_SSVol::intEnergy_mole() const
@ -81,15 +76,15 @@ doublereal PDSS_SSVol::cv_mole() const
void PDSS_SSVol::calcMolarVolume() void PDSS_SSVol::calcMolarVolume()
{ {
if (volumeModel_ == SSVolume_Model::constant) { if (volumeModel_ == SSVolume_Model::tpoly) {
m_Vss = m_constMolarVolume;
} else if (volumeModel_ == SSVolume_Model::tpoly) {
m_Vss = TCoeff_[0] + m_temp * (TCoeff_[1] + m_temp * (TCoeff_[2] + m_temp * TCoeff_[3])); m_Vss = TCoeff_[0] + m_temp * (TCoeff_[1] + m_temp * (TCoeff_[2] + m_temp * TCoeff_[3]));
m_V0 = m_Vss;
dVdT_ = TCoeff_[1] + 2.0 * m_temp * TCoeff_[2] + 3.0 * m_temp * m_temp * TCoeff_[3]; dVdT_ = TCoeff_[1] + 2.0 * m_temp * TCoeff_[2] + 3.0 * m_temp * m_temp * TCoeff_[3];
d2VdT2_ = 2.0 * TCoeff_[2] + 6.0 * m_temp * TCoeff_[3]; d2VdT2_ = 2.0 * TCoeff_[2] + 6.0 * m_temp * TCoeff_[3];
} else if (volumeModel_ == SSVolume_Model::density_tpoly) { } else if (volumeModel_ == SSVolume_Model::density_tpoly) {
doublereal dens = TCoeff_[0] + m_temp * (TCoeff_[1] + m_temp * (TCoeff_[2] + m_temp * TCoeff_[3])); doublereal dens = TCoeff_[0] + m_temp * (TCoeff_[1] + m_temp * (TCoeff_[2] + m_temp * TCoeff_[3]));
m_Vss = m_mw / dens; m_Vss = m_mw / dens;
m_V0 = m_Vss;
doublereal dens2 = dens * dens; doublereal dens2 = dens * dens;
doublereal ddensdT = TCoeff_[1] + 2.0 * m_temp * TCoeff_[2] + 3.0 * m_temp * m_temp * TCoeff_[3]; doublereal ddensdT = TCoeff_[1] + 2.0 * m_temp * TCoeff_[2] + 3.0 * m_temp * m_temp * TCoeff_[3];
doublereal d2densdT2 = 2.0 * TCoeff_[2] + 6.0 * m_temp * TCoeff_[3]; doublereal d2densdT2 = 2.0 * TCoeff_[2] + 6.0 * m_temp * TCoeff_[3];
@ -149,12 +144,12 @@ void PDSS_SSVol::setState_TP(doublereal temp, doublereal pres)
void PDSS_SSVol::setState_TR(doublereal temp, doublereal rho) void PDSS_SSVol::setState_TR(doublereal temp, doublereal rho)
{ {
doublereal rhoStored = m_mw / m_constMolarVolume; setTemperature(temp);
doublereal rhoStored = m_mw / m_Vss;
if (fabs(rhoStored - rho) / (rhoStored + rho) > 1.0E-4) { if (fabs(rhoStored - rho) / (rhoStored + rho) > 1.0E-4) {
throw CanteraError("PDSS_SSVol::setState_TR", throw CanteraError("PDSS_SSVol::setState_TR",
"Inconsistent supplied rho"); "Inconsistent supplied rho");
} }
setTemperature(temp);
} }
doublereal PDSS_SSVol::satPressure(doublereal t) doublereal PDSS_SSVol::satPressure(doublereal t)