diff --git a/include/cantera/thermo/DebyeHuckel.h b/include/cantera/thermo/DebyeHuckel.h index 30796a5bc..f9391f686 100644 --- a/include/cantera/thermo/DebyeHuckel.h +++ b/include/cantera/thermo/DebyeHuckel.h @@ -91,11 +91,6 @@ class PDSS_Water; * standard state Gibbs free energy is obtained from the enthalpy and entropy * functions. * - * The vector Phase::m_speciesSize[] is used to hold the base values of species - * sizes. These are defined as the molar volumes of species at infinite dilution - * at 300 K and 1 atm of water. m_speciesSize are calculated during the - * initialization of the DebyeHuckel object and are then not touched. - * * The current model assumes that an incompressible molar volume for all * solutes. The molar volume for the water solvent, however, is obtained from a * pure water equation of state, waterSS. Therefore, the water standard state diff --git a/include/cantera/thermo/HMWSoln.h b/include/cantera/thermo/HMWSoln.h index a3c3ee72b..5d3182ca8 100644 --- a/include/cantera/thermo/HMWSoln.h +++ b/include/cantera/thermo/HMWSoln.h @@ -118,11 +118,6 @@ class WaterProps; * pressure. The solute standard state Gibbs free energy is obtained from the * enthalpy and entropy functions. * - * The vector Phase::m_speciesSize[] is used to hold the base values of species - * sizes. These are defined as the molar volumes of species at infinite dilution - * at 300 K and 1 atm of water. m_speciesSize are calculated during the - * initialization of the HMWSoln object and are then not touched. - * * The current model assumes that an incompressible molar volume for all * solutes. The molar volume for the water solvent, however, is obtained from a * pure water equation of state, waterSS. Therefore, the water standard state diff --git a/include/cantera/thermo/Phase.h b/include/cantera/thermo/Phase.h index c1b868c5c..ca8d244e0 100644 --- a/include/cantera/thermo/Phase.h +++ b/include/cantera/thermo/Phase.h @@ -406,17 +406,13 @@ public: //! units = kg / kmol const vector_fp& molecularWeights() const; - //! This routine returns the size of species k - //! - //! The meaning and dimensions are model-dependent. For surface phases, the - //! size is the number of sites occupied by one molecule of the species - //! [nondimensional]. For models which utilize the species partial molar - //! volumes, this is the molar volume of the species in its reference state. - //! For other models, this value may have no meaning. - //! @param k index of the species - //! @return The size of the species - doublereal size(size_t k) const { - return m_speciesSize[k]; + //! @deprecated To be removed after Cantera 2.4 + //! @see SurfPhase::size + virtual double size(size_t k) const { + warn_deprecated("Phase::size", "Unused except for SurfPhase. " + "To be removed from class Phase after Cantera 2.4. " + "Cast object as SurfPhase to resolve this warning."); + return 1.0; } /// @name Composition @@ -796,11 +792,6 @@ protected: //! The length of this vector is equal to m_kk * m_mm vector_fp m_speciesComp; - //!Vector of species sizes. length m_kk. Used in some equations of state - //! which employ the constant partial molar volume approximation, and for - //! surface phases. - vector_fp m_speciesSize; - vector_fp m_speciesCharge; //!< Vector of species charges. length m_kk. std::map > m_species; diff --git a/include/cantera/thermo/SurfPhase.h b/include/cantera/thermo/SurfPhase.h index d7b0561f7..aecc5036e 100644 --- a/include/cantera/thermo/SurfPhase.h +++ b/include/cantera/thermo/SurfPhase.h @@ -313,6 +313,11 @@ public: return m_n0; } + //! Returns the number of sites occupied by one molecule of species *k*. + virtual double size(size_t k) const { + return m_speciesSize[k]; + } + //! Set the site density of the surface phase (kmol m-2) /*! * @param n0 Site density of the surface phase (kmol m-2) @@ -393,6 +398,9 @@ protected: //! Surface site density (kmol m-2) doublereal m_n0; + //! Vector of species sizes (number of sites occupied). length m_kk. + vector_fp m_speciesSize; + //! log of the surface site density doublereal m_logn0; diff --git a/src/kinetics/InterfaceKinetics.cpp b/src/kinetics/InterfaceKinetics.cpp index 4b23d9c55..19e99a6ea 100644 --- a/src/kinetics/InterfaceKinetics.cpp +++ b/src/kinetics/InterfaceKinetics.cpp @@ -663,7 +663,6 @@ SurfaceArrhenius InterfaceKinetics::buildSurfaceArrhenius( for (const auto& sp : r.reactants) { size_t iPhase = speciesPhaseIndex(kineticsSpeciesIndex(sp.first)); const ThermoPhase& p = thermo(iPhase); - const ThermoPhase& surf = thermo(surfacePhaseIndex()); size_t k = p.speciesIndex(sp.first); if (sp.first == sticking_species) { multiplier *= sqrt(GasConstant/(2*Pi*p.molecularWeight(k))); @@ -675,8 +674,8 @@ SurfaceArrhenius InterfaceKinetics::buildSurfaceArrhenius( // rate constant is evaluated, since we don't assume that the // site density is known at this time. double order = getValue(r.orders, sp.first, sp.second); - if (&p == &surf) { - multiplier *= pow(p.size(k), order); + if (&p == m_surf) { + multiplier *= pow(m_surf->size(k), order); surface_order += order; } else { multiplier *= pow(p.standardConcentration(k), -order); @@ -891,8 +890,7 @@ void InterfaceKinetics::applyStickingCorrection(double T, double* kf) CachedArray cached = m_cache.getArray(cacheId); vector_fp& factors = cached.value; - SurfPhase& surf = dynamic_cast(thermo(reactionPhaseIndex())); - double n0 = surf.siteDensity(); + double n0 = m_surf->siteDensity(); if (!cached.validate(n0)) { factors.resize(m_stickingData.size()); for (size_t n = 0; n < m_stickingData.size(); n++) { diff --git a/src/thermo/DebyeHuckel.cpp b/src/thermo/DebyeHuckel.cpp index 6945b9bc0..c18fc0f80 100644 --- a/src/thermo/DebyeHuckel.cpp +++ b/src/thermo/DebyeHuckel.cpp @@ -146,7 +146,7 @@ void DebyeHuckel::getActivityConcentrations(doublereal* c) const doublereal DebyeHuckel::standardConcentration(size_t k) const { - double mvSolvent = m_speciesSize[0]; + double mvSolvent = providePDSS(0)->molarVolume(); return 1.0 / mvSolvent; } @@ -560,29 +560,19 @@ void DebyeHuckel::initThermo() // Solvent m_waterSS = dynamic_cast(providePDSS(0)); if (m_waterSS) { - m_waterSS->setState_TP(300., OneAtm); - double dens = m_waterSS->density(); - double mw = m_waterSS->molecularWeight(); - m_speciesSize[0] = mw / dens; - // Initialize the water property calculator. It will share the internal // eos water calculator. if (m_form_A_Debye == A_DEBYE_WATER) { m_waterProps.reset(new WaterProps(m_waterSS)); } - } else if (dynamic_cast(providePDSS(0))) { - m_speciesSize[0] = providePDSS(0)->molarVolume(); - } else { + } else if (dynamic_cast(providePDSS(0)) == 0) { throw CanteraError("DebyeHuckel::initThermo", "Solvent standard state" " model must be WaterIAPWS or constant_incompressible."); } // Solutes for (size_t k = 1; k < nSpecies(); k++) { - PDSS_ConstVol* ss = dynamic_cast(providePDSS(k)); - if (ss) { - m_speciesSize[k] = ss->molarVolume(); - } else { + if (dynamic_cast(providePDSS(k)) == 0) { throw CanteraError("DebyeHuckel::initThermo", "Solute standard" " state model must be constant_incompressible."); } @@ -700,7 +690,6 @@ bool DebyeHuckel::addSpecies(shared_ptr spec) { bool added = MolalityVPSSTP::addSpecies(spec); if (added) { - m_speciesSize.push_back(0.0); m_lnActCoeffMolal.push_back(0.0); m_dlnActCoeffMolaldT.push_back(0.0); m_d2lnActCoeffMolaldT2.push_back(0.0); diff --git a/src/thermo/HMWSoln.cpp b/src/thermo/HMWSoln.cpp index 678ec8609..ad2ae8bc5 100644 --- a/src/thermo/HMWSoln.cpp +++ b/src/thermo/HMWSoln.cpp @@ -666,9 +666,6 @@ void HMWSoln::initThermo() elambda[i] = 0.0; elambda1[i] = 0.0; } - for (size_t k = 0; k < nSpecies(); k++) { - m_speciesSize[k] = providePDSS(k)->molarVolume(); - } // Store a local pointer to the water standard state model. m_waterSS = providePDSS(0); @@ -997,7 +994,6 @@ double HMWSoln::d2A_DebyedT2_TP(double tempArg, double presArg) const void HMWSoln::initLengths() { - m_speciesSize.resize(m_kk); m_tmpV.resize(m_kk, 0.0); m_molalitiesCropped.resize(m_kk, 0.0); diff --git a/src/thermo/MineralEQ3.cpp b/src/thermo/MineralEQ3.cpp index 8fa81e13e..b8eea1cc7 100644 --- a/src/thermo/MineralEQ3.cpp +++ b/src/thermo/MineralEQ3.cpp @@ -159,7 +159,6 @@ void MineralEQ3::initThermoXML(XML_Node& phaseNode, const std::string& id_) volVal = getFloat(*aStandardState, "V0_Pr_Tr"); m_V0_pr_tr= volVal; volVal *= Afactor; - m_speciesSize[0] = volVal; } else { throw CanteraError("MineralEQ3::initThermoXML", "wrong standard state mode"); diff --git a/src/thermo/Phase.cpp b/src/thermo/Phase.cpp index d5214b554..efd9a930a 100644 --- a/src/thermo/Phase.cpp +++ b/src/thermo/Phase.cpp @@ -728,7 +728,6 @@ bool Phase::addSpecies(shared_ptr spec) { m_species[ba::to_lower_copy(spec->name)] = spec; m_speciesIndices[ba::to_lower_copy(spec->name)] = m_kk; m_speciesCharge.push_back(spec->charge); - m_speciesSize.push_back(spec->size); size_t ne = nElements(); double wt = 0.0; diff --git a/src/thermo/SurfPhase.cpp b/src/thermo/SurfPhase.cpp index d0f180ac6..39118e107 100644 --- a/src/thermo/SurfPhase.cpp +++ b/src/thermo/SurfPhase.cpp @@ -213,7 +213,8 @@ bool SurfPhase::addSpecies(shared_ptr spec) m_cp0.push_back(0.0); m_mu0.push_back(0.0); m_work.push_back(0.0); - m_logsize.push_back(log(size(m_kk-1))); + m_speciesSize.push_back(spec->size); + m_logsize.push_back(log(spec->size)); if (m_kk == 1) { vector_fp cov{1.0}; setCoverages(cov.data());