From 32b3543cbe846ef0594b4b03727415a8df1cd2a0 Mon Sep 17 00:00:00 2001 From: Ray Speth Date: Sun, 17 Apr 2016 23:58:34 -0400 Subject: [PATCH] [Thermo] Introduce Phase::compositionChanged This function is called after any change in composition, and can be used by phases to update quantities that are affected by the composition change, instead of needing to overload all of the different functions which update the composition. --- include/cantera/thermo/GibbsExcessVPSSTP.h | 16 ++-------- include/cantera/thermo/IdealSolidSolnPhase.h | 8 ++--- .../cantera/thermo/IonsFromNeutralVPSSTP.h | 8 ++--- include/cantera/thermo/LatticePhase.h | 8 ++--- include/cantera/thermo/MixtureFugacityTP.h | 7 +--- include/cantera/thermo/Phase.h | 9 ++++++ include/cantera/thermo/RedlichKwongMFTP.h | 7 +--- src/thermo/GibbsExcessVPSSTP.cpp | 28 ++-------------- src/thermo/IdealSolidSolnPhase.cpp | 28 ++-------------- src/thermo/IonsFromNeutralVPSSTP.cpp | 32 ++----------------- src/thermo/LatticePhase.cpp | 28 ++-------------- src/thermo/MixtureFugacityTP.cpp | 28 ++-------------- src/thermo/Phase.cpp | 17 ++++++---- src/thermo/RedlichKwongMFTP.cpp | 28 ++-------------- 14 files changed, 42 insertions(+), 210 deletions(-) diff --git a/include/cantera/thermo/GibbsExcessVPSSTP.h b/include/cantera/thermo/GibbsExcessVPSSTP.h index 39d3dbccd..0519c6a23 100644 --- a/include/cantera/thermo/GibbsExcessVPSSTP.h +++ b/include/cantera/thermo/GibbsExcessVPSSTP.h @@ -226,23 +226,11 @@ public: virtual void getPartialMolarVolumes(doublereal* vbar) const; virtual const vector_fp& getPartialMolarVolumesVector() const; - /** - * @} - * @name Setting the State - * These methods set all or part of the thermodynamic state. - * @{ - */ - - virtual void setMassFractions(const doublereal* const y); - virtual void setMassFractions_NoNorm(const doublereal* const y); - virtual void setMoleFractions(const doublereal* const x); - virtual void setMoleFractions_NoNorm(const doublereal* const x); - virtual void setConcentrations(const doublereal* const c); - //@} - virtual bool addSpecies(shared_ptr spec); protected: + virtual void compositionChanged(); + //! utility routine to check mole fraction sum /*! * @param x vector of mole fractions. diff --git a/include/cantera/thermo/IdealSolidSolnPhase.h b/include/cantera/thermo/IdealSolidSolnPhase.h index a4894630e..6e9d4692d 100644 --- a/include/cantera/thermo/IdealSolidSolnPhase.h +++ b/include/cantera/thermo/IdealSolidSolnPhase.h @@ -247,12 +247,6 @@ public: */ virtual void setMolarDensity(const doublereal rho); - virtual void setMoleFractions(const doublereal* const x); - virtual void setMoleFractions_NoNorm(const doublereal* const x); - virtual void setMassFractions(const doublereal* const y); - virtual void setMassFractions_NoNorm(const doublereal* const y); - virtual void setConcentrations(const doublereal* const c); - //@} /** @@ -646,6 +640,8 @@ public: //@} protected: + virtual void compositionChanged(); + /** * Format for the generalized concentrations. * diff --git a/include/cantera/thermo/IonsFromNeutralVPSSTP.h b/include/cantera/thermo/IonsFromNeutralVPSSTP.h index 53a54a1c6..46e023034 100644 --- a/include/cantera/thermo/IonsFromNeutralVPSSTP.h +++ b/include/cantera/thermo/IonsFromNeutralVPSSTP.h @@ -320,12 +320,6 @@ public: */ virtual void calcNeutralMoleculeMoleFractions() const; - virtual void setMassFractions(const doublereal* const y); - virtual void setMassFractions_NoNorm(const doublereal* const y); - virtual void setMoleFractions(const doublereal* const x); - virtual void setMoleFractions_NoNorm(const doublereal* const x); - virtual void setConcentrations(const doublereal* const c); - //@} virtual void initThermo(); @@ -386,6 +380,8 @@ private: void s_update_dlnActCoeff_dlnN() const; protected: + virtual void compositionChanged(); + //! Ion solution type /*! * There is either mixing on the anion, cation, or both lattices. diff --git a/include/cantera/thermo/LatticePhase.h b/include/cantera/thermo/LatticePhase.h index 6cb2d9b50..946406f7b 100644 --- a/include/cantera/thermo/LatticePhase.h +++ b/include/cantera/thermo/LatticePhase.h @@ -372,12 +372,6 @@ public: */ doublereal calcDensity(); - virtual void setMoleFractions(const doublereal* const x); - virtual void setMoleFractions_NoNorm(const doublereal* const x); - virtual void setMassFractions(const doublereal* const y); - virtual void setMassFractions_NoNorm(const doublereal* const y); - virtual void setConcentrations(const doublereal* const c); - //@} /// @name Activities, Standard States, and Activity Concentrations /** @@ -669,6 +663,8 @@ public: //@} protected: + virtual void compositionChanged(); + //! Reference state pressure doublereal m_Pref; diff --git a/include/cantera/thermo/MixtureFugacityTP.h b/include/cantera/thermo/MixtureFugacityTP.h index 1572bed81..627f19af3 100644 --- a/include/cantera/thermo/MixtureFugacityTP.h +++ b/include/cantera/thermo/MixtureFugacityTP.h @@ -292,13 +292,8 @@ public: virtual void setState_TR(doublereal T, doublereal rho); virtual void setState_TPX(doublereal t, doublereal p, const doublereal* x); - virtual void setMassFractions(const doublereal* const y); - virtual void setMassFractions_NoNorm(const doublereal* const y); - virtual void setMoleFractions(const doublereal* const x); - virtual void setMoleFractions_NoNorm(const doublereal* const x); - virtual void setConcentrations(const doublereal* const c); - protected: + virtual void compositionChanged(); void setMoleFractions_NoState(const doublereal* const x); public: diff --git a/include/cantera/thermo/Phase.h b/include/cantera/thermo/Phase.h index 180cb8d13..441878d1a 100644 --- a/include/cantera/thermo/Phase.h +++ b/include/cantera/thermo/Phase.h @@ -760,6 +760,15 @@ protected: m_rmolwts[k] = 1.0/mw; } + //! Apply changes to the state which are needed after the composition + //! changes. This function is called after any call to setMassFractions(), + //! setMoleFractions(), or similar. For phases which need to execute a + //! callback after any change to the composition, it should be done by + //! overriding this function rather than overriding all of the composition- + //! setting functions. Derived class implementations of compositionChanged() + //! should call the parent class method as well. + virtual void compositionChanged(); + size_t m_kk; //!< Number of species in the phase. //! Dimensionality of the phase. Volumetric phases have dimensionality 3 diff --git a/include/cantera/thermo/RedlichKwongMFTP.h b/include/cantera/thermo/RedlichKwongMFTP.h index 8d0910dd2..e0710350e 100644 --- a/include/cantera/thermo/RedlichKwongMFTP.h +++ b/include/cantera/thermo/RedlichKwongMFTP.h @@ -99,12 +99,7 @@ protected: virtual void calcDensity(); virtual void setTemperature(const doublereal temp); - - virtual void setMassFractions(const doublereal* const y); - virtual void setMassFractions_NoNorm(const doublereal* const y); - virtual void setMoleFractions(const doublereal* const x); - virtual void setMoleFractions_NoNorm(const doublereal* const x); - virtual void setConcentrations(const doublereal* const c); + virtual void compositionChanged(); public: virtual void getActivityConcentrations(doublereal* c) const; diff --git a/src/thermo/GibbsExcessVPSSTP.cpp b/src/thermo/GibbsExcessVPSSTP.cpp index 683a17c03..05cc09cf1 100644 --- a/src/thermo/GibbsExcessVPSSTP.cpp +++ b/src/thermo/GibbsExcessVPSSTP.cpp @@ -52,33 +52,9 @@ ThermoPhase* GibbsExcessVPSSTP::duplMyselfAsThermoPhase() const return new GibbsExcessVPSSTP(*this); } -void GibbsExcessVPSSTP::setMassFractions(const doublereal* const y) +void GibbsExcessVPSSTP::compositionChanged() { - Phase::setMassFractions(y); - getMoleFractions(moleFractions_.data()); -} - -void GibbsExcessVPSSTP::setMassFractions_NoNorm(const doublereal* const y) -{ - Phase::setMassFractions_NoNorm(y); - getMoleFractions(moleFractions_.data()); -} - -void GibbsExcessVPSSTP::setMoleFractions(const doublereal* const x) -{ - Phase::setMoleFractions(x); - getMoleFractions(moleFractions_.data()); -} - -void GibbsExcessVPSSTP::setMoleFractions_NoNorm(const doublereal* const x) -{ - Phase::setMoleFractions_NoNorm(x); - getMoleFractions(moleFractions_.data()); -} - -void GibbsExcessVPSSTP::setConcentrations(const doublereal* const c) -{ - Phase::setConcentrations(c); + Phase::compositionChanged(); getMoleFractions(moleFractions_.data()); } diff --git a/src/thermo/IdealSolidSolnPhase.cpp b/src/thermo/IdealSolidSolnPhase.cpp index 7966b0f40..051dc8b44 100644 --- a/src/thermo/IdealSolidSolnPhase.cpp +++ b/src/thermo/IdealSolidSolnPhase.cpp @@ -168,33 +168,9 @@ void IdealSolidSolnPhase::setMolarDensity(const doublereal n) "Density is not an independent variable"); } -void IdealSolidSolnPhase::setMoleFractions(const doublereal* const x) +void IdealSolidSolnPhase::compositionChanged() { - Phase::setMoleFractions(x); - calcDensity(); -} - -void IdealSolidSolnPhase::setMoleFractions_NoNorm(const doublereal* const x) -{ - Phase::setMoleFractions(x); - calcDensity(); -} - -void IdealSolidSolnPhase::setMassFractions(const doublereal* const y) -{ - Phase::setMassFractions(y); - calcDensity(); -} - -void IdealSolidSolnPhase::setMassFractions_NoNorm(const doublereal* const y) -{ - Phase::setMassFractions_NoNorm(y); - calcDensity(); -} - -void IdealSolidSolnPhase::setConcentrations(const doublereal* const c) -{ - Phase::setConcentrations(c); + Phase::compositionChanged(); calcDensity(); } diff --git a/src/thermo/IonsFromNeutralVPSSTP.cpp b/src/thermo/IonsFromNeutralVPSSTP.cpp index 34b67f5f9..acd7db67c 100644 --- a/src/thermo/IonsFromNeutralVPSSTP.cpp +++ b/src/thermo/IonsFromNeutralVPSSTP.cpp @@ -551,37 +551,9 @@ void IonsFromNeutralVPSSTP::getNeutralMoleculeMoleGrads(const doublereal* const } } -void IonsFromNeutralVPSSTP::setMassFractions(const doublereal* const y) +void IonsFromNeutralVPSSTP::compositionChanged() { - GibbsExcessVPSSTP::setMassFractions(y); - calcNeutralMoleculeMoleFractions(); - neutralMoleculePhase_->setMoleFractions(NeutralMolecMoleFractions_.data()); -} - -void IonsFromNeutralVPSSTP::setMassFractions_NoNorm(const doublereal* const y) -{ - GibbsExcessVPSSTP::setMassFractions_NoNorm(y); - calcNeutralMoleculeMoleFractions(); - neutralMoleculePhase_->setMoleFractions(NeutralMolecMoleFractions_.data()); -} - -void IonsFromNeutralVPSSTP::setMoleFractions(const doublereal* const x) -{ - GibbsExcessVPSSTP::setMoleFractions(x); - calcNeutralMoleculeMoleFractions(); - neutralMoleculePhase_->setMoleFractions(NeutralMolecMoleFractions_.data()); -} - -void IonsFromNeutralVPSSTP::setMoleFractions_NoNorm(const doublereal* const x) -{ - GibbsExcessVPSSTP::setMoleFractions_NoNorm(x); - calcNeutralMoleculeMoleFractions(); - neutralMoleculePhase_->setMoleFractions_NoNorm(NeutralMolecMoleFractions_.data()); -} - -void IonsFromNeutralVPSSTP::setConcentrations(const doublereal* const c) -{ - GibbsExcessVPSSTP::setConcentrations(c); + GibbsExcessVPSSTP::compositionChanged(); calcNeutralMoleculeMoleFractions(); neutralMoleculePhase_->setMoleFractions(NeutralMolecMoleFractions_.data()); } diff --git a/src/thermo/LatticePhase.cpp b/src/thermo/LatticePhase.cpp index dd1974a22..d40c09812 100644 --- a/src/thermo/LatticePhase.cpp +++ b/src/thermo/LatticePhase.cpp @@ -96,33 +96,9 @@ void LatticePhase::setPressure(doublereal p) calcDensity(); } -void LatticePhase::setMoleFractions(const doublereal* const x) +void LatticePhase::compositionChanged() { - Phase::setMoleFractions(x); - calcDensity(); -} - -void LatticePhase::setMoleFractions_NoNorm(const doublereal* const x) -{ - Phase::setMoleFractions(x); - calcDensity(); -} - -void LatticePhase::setMassFractions(const doublereal* const y) -{ - Phase::setMassFractions(y); - calcDensity(); -} - -void LatticePhase::setMassFractions_NoNorm(const doublereal* const y) -{ - Phase::setMassFractions_NoNorm(y); - calcDensity(); -} - -void LatticePhase::setConcentrations(const doublereal* const c) -{ - Phase::setConcentrations(c); + Phase::compositionChanged(); calcDensity(); } diff --git a/src/thermo/MixtureFugacityTP.cpp b/src/thermo/MixtureFugacityTP.cpp index f1510a57d..c154bf750 100644 --- a/src/thermo/MixtureFugacityTP.cpp +++ b/src/thermo/MixtureFugacityTP.cpp @@ -277,33 +277,9 @@ void MixtureFugacityTP::setPressure(doublereal p) setState_TP(temperature(), p); } -void MixtureFugacityTP::setMassFractions(const doublereal* const y) +void MixtureFugacityTP::compositionChanged() { - Phase::setMassFractions(y); - getMoleFractions(moleFractions_.data()); -} - -void MixtureFugacityTP::setMassFractions_NoNorm(const doublereal* const y) -{ - Phase::setMassFractions_NoNorm(y); - getMoleFractions(moleFractions_.data()); -} - -void MixtureFugacityTP::setMoleFractions(const doublereal* const x) -{ - Phase::setMoleFractions(x); - getMoleFractions(moleFractions_.data()); -} - -void MixtureFugacityTP::setMoleFractions_NoNorm(const doublereal* const x) -{ - Phase::setMoleFractions_NoNorm(x); - getMoleFractions(moleFractions_.data()); -} - -void MixtureFugacityTP::setConcentrations(const doublereal* const c) -{ - Phase::setConcentrations(c); + Phase::compositionChanged(); getMoleFractions(moleFractions_.data()); } diff --git a/src/thermo/Phase.cpp b/src/thermo/Phase.cpp index de071e5d4..59a4c8887 100644 --- a/src/thermo/Phase.cpp +++ b/src/thermo/Phase.cpp @@ -307,6 +307,7 @@ void Phase::saveState(size_t lenstate, doublereal* state) const void Phase::restoreState(const vector_fp& state) { restoreState(state.size(),&state[0]); + compositionChanged(); } void Phase::restoreState(size_t lenstate, const doublereal* state) @@ -350,7 +351,7 @@ void Phase::setMoleFractions(const doublereal* const x) // Calculate the normalized molecular weight m_mmw = sum/norm; - m_stateNum++; + compositionChanged(); } void Phase::setMoleFractions_NoNorm(const doublereal* const x) @@ -359,7 +360,7 @@ void Phase::setMoleFractions_NoNorm(const doublereal* const x) transform(x, x + m_kk, m_ym.begin(), timesConstant(1.0/m_mmw)); transform(m_ym.begin(), m_ym.begin() + m_kk, m_molwts.begin(), m_y.begin(), multiplies()); - m_stateNum++; + compositionChanged(); } void Phase::setMoleFractionsByName(const compositionMap& xMap) @@ -392,7 +393,7 @@ void Phase::setMassFractions(const doublereal* const y) transform(m_y.begin(), m_y.end(), m_rmolwts.begin(), m_ym.begin(), multiplies()); m_mmw = 1.0 / accumulate(m_ym.begin(), m_ym.end(), 0.0); - m_stateNum++; + compositionChanged(); } void Phase::setMassFractions_NoNorm(const doublereal* const y) @@ -403,7 +404,7 @@ void Phase::setMassFractions_NoNorm(const doublereal* const y) multiplies()); sum = accumulate(m_ym.begin(), m_ym.end(), 0.0); m_mmw = 1.0/sum; - m_stateNum++; + compositionChanged(); } void Phase::setMassFractionsByName(const compositionMap& yMap) @@ -611,7 +612,7 @@ void Phase::setConcentrations(const doublereal* const conc) m_ym[k] = m_y[k] * rsum; m_y[k] = m_ym[k] * m_molwts[k]; // m_y is now the mass fraction } - m_stateNum++; + compositionChanged(); } void Phase::setConcentrationsNoNorm(const double* const conc) @@ -628,7 +629,7 @@ void Phase::setConcentrationsNoNorm(const double* const conc) m_ym[k] = conc[k] * rsum; m_y[k] = m_ym[k] * m_molwts[k]; } - m_stateNum++; + compositionChanged(); } doublereal Phase::elementalMassFraction(const size_t m) const @@ -886,4 +887,8 @@ void Phase::invalidateCache() { m_cache.clear(); } +void Phase::compositionChanged() { + m_stateNum++; +} + } // namespace Cantera diff --git a/src/thermo/RedlichKwongMFTP.cpp b/src/thermo/RedlichKwongMFTP.cpp index d9a419004..90307fb7c 100644 --- a/src/thermo/RedlichKwongMFTP.cpp +++ b/src/thermo/RedlichKwongMFTP.cpp @@ -198,33 +198,9 @@ void RedlichKwongMFTP::setTemperature(const doublereal temp) updateAB(); } -void RedlichKwongMFTP::setMassFractions(const doublereal* const x) +void RedlichKwongMFTP::compositionChanged() { - MixtureFugacityTP::setMassFractions(x); - updateAB(); -} - -void RedlichKwongMFTP::setMassFractions_NoNorm(const doublereal* const x) -{ - MixtureFugacityTP::setMassFractions_NoNorm(x); - updateAB(); -} - -void RedlichKwongMFTP::setMoleFractions(const doublereal* const x) -{ - MixtureFugacityTP::setMoleFractions(x); - updateAB(); -} - -void RedlichKwongMFTP::setMoleFractions_NoNorm(const doublereal* const x) -{ - MixtureFugacityTP::setMoleFractions(x); - updateAB(); -} - -void RedlichKwongMFTP::setConcentrations(const doublereal* const c) -{ - MixtureFugacityTP::setConcentrations(c); + MixtureFugacityTP::compositionChanged(); updateAB(); }