[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.
This commit is contained in:
parent
ac2361ee53
commit
32b3543cbe
14 changed files with 42 additions and 210 deletions
|
|
@ -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<Species> spec);
|
||||
|
||||
protected:
|
||||
virtual void compositionChanged();
|
||||
|
||||
//! utility routine to check mole fraction sum
|
||||
/*!
|
||||
* @param x vector of mole fractions.
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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<double>(1.0/m_mmw));
|
||||
transform(m_ym.begin(), m_ym.begin() + m_kk, m_molwts.begin(),
|
||||
m_y.begin(), multiplies<double>());
|
||||
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<double>());
|
||||
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<double>());
|
||||
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
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue