Skip to content

Commit

Permalink
[Thermo] Introduce Phase::compositionChanged
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
speth committed Apr 18, 2016
1 parent ac2361e commit 32b3543
Show file tree
Hide file tree
Showing 14 changed files with 42 additions and 210 deletions.
16 changes: 2 additions & 14 deletions include/cantera/thermo/GibbsExcessVPSSTP.h
Original file line number Diff line number Diff line change
Expand Up @@ -226,23 +226,11 @@ class GibbsExcessVPSSTP : public VPStandardStateTP
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.
Expand Down
8 changes: 2 additions & 6 deletions include/cantera/thermo/IdealSolidSolnPhase.h
Original file line number Diff line number Diff line change
Expand Up @@ -247,12 +247,6 @@ class IdealSolidSolnPhase : public ThermoPhase
*/
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);

//@}

/**
Expand Down Expand Up @@ -646,6 +640,8 @@ class IdealSolidSolnPhase : public ThermoPhase
//@}

protected:
virtual void compositionChanged();

/**
* Format for the generalized concentrations.
*
Expand Down
8 changes: 2 additions & 6 deletions include/cantera/thermo/IonsFromNeutralVPSSTP.h
Original file line number Diff line number Diff line change
Expand Up @@ -320,12 +320,6 @@ class IonsFromNeutralVPSSTP : public GibbsExcessVPSSTP
*/
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();
Expand Down Expand Up @@ -386,6 +380,8 @@ class IonsFromNeutralVPSSTP : public GibbsExcessVPSSTP
void s_update_dlnActCoeff_dlnN() const;

protected:
virtual void compositionChanged();

//! Ion solution type
/*!
* There is either mixing on the anion, cation, or both lattices.
Expand Down
8 changes: 2 additions & 6 deletions include/cantera/thermo/LatticePhase.h
Original file line number Diff line number Diff line change
Expand Up @@ -372,12 +372,6 @@ class LatticePhase : public ThermoPhase
*/
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
/**
Expand Down Expand Up @@ -669,6 +663,8 @@ class LatticePhase : public ThermoPhase
//@}

protected:
virtual void compositionChanged();

//! Reference state pressure
doublereal m_Pref;

Expand Down
7 changes: 1 addition & 6 deletions include/cantera/thermo/MixtureFugacityTP.h
Original file line number Diff line number Diff line change
Expand Up @@ -292,13 +292,8 @@ class MixtureFugacityTP : public ThermoPhase
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:
Expand Down
9 changes: 9 additions & 0 deletions include/cantera/thermo/Phase.h
Original file line number Diff line number Diff line change
Expand Up @@ -760,6 +760,15 @@ class Phase
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
Expand Down
7 changes: 1 addition & 6 deletions include/cantera/thermo/RedlichKwongMFTP.h
Original file line number Diff line number Diff line change
Expand Up @@ -99,12 +99,7 @@ class RedlichKwongMFTP : public MixtureFugacityTP
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;
Expand Down
28 changes: 2 additions & 26 deletions src/thermo/GibbsExcessVPSSTP.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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());
}

Expand Down
28 changes: 2 additions & 26 deletions src/thermo/IdealSolidSolnPhase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}

Expand Down
32 changes: 2 additions & 30 deletions src/thermo/IonsFromNeutralVPSSTP.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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());
}
Expand Down
28 changes: 2 additions & 26 deletions src/thermo/LatticePhase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}

Expand Down
28 changes: 2 additions & 26 deletions src/thermo/MixtureFugacityTP.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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());
}

Expand Down
17 changes: 11 additions & 6 deletions src/thermo/Phase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand All @@ -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)
Expand Down Expand Up @@ -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)
Expand All @@ -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)
Expand Down Expand Up @@ -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)
Expand All @@ -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
Expand Down Expand Up @@ -886,4 +887,8 @@ void Phase::invalidateCache() {
m_cache.clear();
}

void Phase::compositionChanged() {
m_stateNum++;
}

} // namespace Cantera
Loading

0 comments on commit 32b3543

Please sign in to comment.