cantera/Cantera/src/thermo/VPStandardStateTP.h
Harry Moffat ca4f9cc31d Work on VPStandardStateTP. Started to formalize what it actually
does, putting in doxygen documentation. Tried to fix some holes
in DebyeHuckel wherein calculations may be returned without
updating the underlying water standard state.
2007-03-08 18:23:52 +00:00

591 lines
20 KiB
C++

/**
* @file VPStandardStateTP.h
*
* Header file for a derived class of ThermoPhase that handles
* variable pressure standard state methods for calculating
* thermodynamic properties. These include most of the
* methods for calculating liquid electrolyte thermodynamics.
*/
/*
* Copywrite (2005) Sandia Corporation. Under the terms of
* Contract DE-AC04-94AL85000 with Sandia Corporation, the
* U.S. Government retains certain rights in this software.
*/
/*
* $Author$
* $Date$
* $Revision$
*/
#ifndef CT_VPSTANDARDSTATETP_H
#define CT_VPSTANDARDSTATETP_H
#include "ThermoPhase.h"
namespace Cantera {
class XML_Node;
/**
* @ingroup thermoprops
*
* This is a filter class for ThermoPhase that implements some prepatory
* steps for efficiently handling
* a variable pressure standard state for species.
*
* Several concepts are introduced. The first concept is there are temporary
* variables for holding the species standard state values
* of Cp, H, S, G, and V at the
* last temperature and pressure called. These functions are not recalculated
* if a new call is made using the previous temperature and pressure.
*
* There are also temporary
* variables for holding the species reference-state values of Cp, H, S, and G at the
* last temperature and reference pressure called. These functions are not recalculated
* if a new call is made using the previous temperature.
*
* To support the above functionality, pressure and temperature variables,
* m_plast and m_tlast, are kept which store the last pressure and temperature
* used in the evaluation of standard state properties. An optional utility is provided
* to store the results from the last temperature and pressure standard
* state calculation and use it on subsequent calculations, if the temperature
* and pressure are unchanged.
*
* If #m_useTmpRefStateStorage is set to true, then the following internal
* arrays, containing information about the reference arrays,
* are calculated and kept up to date at every call.
*
* - #m_h0_RT
* - #m_g0_RT
* - #m_s0_R
* - #m_cp0_R
*
* The virtual function #_updateRefStateThermo() is supplied to do this
* and may be reimplemented in child routines. A default implementation
* based on the speciesThermo class is supplied in this base class.
* #_updateStandardStateThermo() is called whenever a reference state property is needed.
*
* When #m_useTmpStandardStateStorage is true, then the following
* internal arrays, containing information on the standard state properties
* are calculated and kept up to date.
*
* - #m_hss_RT;
* - #m_cpss_R;
* - #m_gss_RT;
* - #m_sss_R;
* - #m_Vss
*
* The virtual function #_updateStandardStateThermo() is supplied to do this
* and must be reimplemented in child routines, when #m_useTmpStandardStateStorage is true.
* It may be optionally reimplemented in child routines if
* #m_useTmpStandardStateStorage is false.
* #_updateStandardStateThermo() is called whenever a standard state property is needed.
*
* This class is usually used for nearly incompressible phases. For those phases, it
* makes sense to change the equation of state independent variable from density to pressure.
*
* @todo
* Put some teeth into this level by overloading the setDensity() function. It should
* now throw an exception. Instead, setPressure routines should calculate the
* solution density and then call State:setDensity() directly.
*
* @nosubgrouping
*/
class VPStandardStateTP : public ThermoPhase {
public:
/*!
*
* @name Constructors and Duplicators for %VPStandardStateTP
*
*/
/// Constructor.
VPStandardStateTP();
/// Copy Constructor.
VPStandardStateTP(const VPStandardStateTP &);
/// Assignment operator
VPStandardStateTP& operator=(const VPStandardStateTP &);
/// Destructor.
virtual ~VPStandardStateTP();
/*
* Duplication routine
*/
virtual ThermoPhase *duplMyselfAsThermoPhase();
//@}
/**
* @name Utilities (VPStandardStateTP)
*/
//@{
/**
* Equation of state type flag. The base class returns
* zero. Subclasses should define this to return a unique
* non-zero value. Constants defined for this purpose are
* listed in mix_defs.h.
*/
virtual int eosType() const { return 0; }
//@}
/// @name Partial Molar Properties of the Solution (VPStandardStateTP)
//@{
//! Get the array of non-dimensional species chemical potentials
//! These are partial molar Gibbs free energies.
/*!
* \f$ \mu_k / \hat R T \f$.
* Units: unitless
*
* We close the loop on this function, here, calling
* getChemPotentials() and then dividing by RT. No need for child
* classes to handle.
*
* @param mu Output vector of non-dimensional species chemical potentials
* Length: m_kk.
*/
void getChemPotentials_RT(doublereal* mu) const;
//@}
/*!
* @name Properties of the Standard State of the Species in the Solution (VPStandardStateTP)
*
* Within VPStandardStateTP, these properties are calculated via a common routine,
* _updateStandardStateThermo(),
* which must be overloaded in inherited objects.
* The values are cached within this object, and are not recalculated unless
* the temperature or pressure changes.
*/
//@{
//!Get the array of chemical potentials at unit activity.
/*!
* These are the standard state chemical potentials \f$ \mu^0_k(T,P)
* \f$. The values are evaluated at the current temperature and pressure.
*
* @param mu Output vector of standard state chemical potentials.
* length = m_kk. units are J / kmol.
*/
virtual void getStandardChemPotentials(doublereal* mu) const;
/**
* Get the nondimensional Enthalpy functions for the species
* at their standard states at the current
* <I>T</I> and <I>P</I> of the solution.
*
* @param hrt Output vector of standard state enthalpies.
* length = m_kk. units are unitless.
*/
virtual void getEnthalpy_RT(doublereal* hrt) const;
/**
* Get the array of nondimensional Enthalpy functions for the
* standard state species
* at the current <I>T</I> and <I>P</I> of the solution.
*
* @param sr Output vector of nondimensional standard state
* entropies. length = m_kk.
*/
virtual void getEntropy_R(doublereal* sr) const;
/**
* Get the nondimensional Gibbs functions for the species
* at their standard states of solution at the current T and P
* of the solution.
*
* @param grt Output vector of nondimensional standard state
* Gibbs free energies. length = m_kk.
*/
virtual void getGibbs_RT(doublereal* grt) const;
//! Get the nondimensional Gibbs functions for the standard
//! state of the species at the current T and P.
/*!
* (Note resolved at this level)
*
* @param gpure Output vector of standard state
* Gibbs free energies. length = m_kk.
* units are J/kmol.
*
* @todo This could be eliminated. It doesn't fit into the current
* naming convention.
*/
void getPureGibbs(doublereal* gpure) const;
/**
* Returns the vector of nondimensional
* internal Energies of the standard state at the current temperature
* and pressure of the solution for each species.
* \f[
* u^{ss}_k(T,P) = h^{ss}_k(T) - P * V^{ss}_k
* \f]
*
* @param urt Output vector of nondimensional standard state
* internal energies. length = m_kk.
*/
virtual void getIntEnergy_RT(doublereal *urt) const;
/**
* Get the nondimensional Heat Capacities at constant
* pressure for the standard state of the species
* at the current T and P.
*
* This is redefined here to call the internal function, _updateStandardStateThermo(),
* which calculates all standard state properties at the same time.
*
* @param cpr Output vector containing the
* the nondimensional Heat Capacities at constant
* pressure for the standard state of the species.
* Length: m_kk.
*/
virtual void getCp_R(doublereal* cpr) const;
/**
* Get the molar volumes of each species in their standard
* states at the current
* <I>T</I> and <I>P</I> of the solution.
* units = m^3 / kmol
*
* This is redefined here to call the internal function, _updateStandardStateThermo(),
* which calculates all standard state properties at the same time.
*
* @param vol Output vector of species volumes. length = m_kk.
* units = m^3 / kmol
*/
virtual void getStandardVolumes(doublereal *vol) const;
protected:
//! Updates the standard state thermodynamic functions at the current T and P of the solution.
/*!
* @internal
*
* If m_useTmpStandardStateStorage is true,
* this function must be called for every call to functions in this
* class. It checks to see whether the temperature or pressure has changed and
* thus the ss thermodynamics functions for all of the species
* must be recalculated.
*
* This function is responsible for updating the following internal members,
* when m_useTmpStandardStateStorage is true.
*
* - m_hss_RT;
* - m_cpss_R;
* - m_gss_RT;
* - m_sss_R;
* - m_Vss
*
* If m_useTmpStandardStateStorage is not true, this function may be
* required to be called by child classes to update internal member data.
*
* Note, this will throw an error. It must be reimplemented in derived classes.
*
* @param pres Pressure at which to carry out the calculation.
* The default is to use the current pressure, storred in m_Pcurrent.
*/
virtual void _updateStandardStateThermo(doublereal pres = -1.0) const;
public:
//@}
/// @name Thermodynamic Values for the Species Reference States (VPStandardStateTP)
/*!
* There are also temporary
* variables for holding the species reference-state values of Cp, H, S, and V at the
* last temperature and reference pressure called. These functions are not recalculated
* if a new call is made using the previous temperature.
* All calculations are done within the routine _updateRefStateThermo().
*/
//@{
/*!
* Returns the vector of nondimensional
* enthalpies of the reference state at the current temperature
* of the solution and the reference pressure for the species.
*
* @param hrt Output vector contains the nondimensional enthalpies
* of the reference state of the species
* length = m_kk, units = dimensionless.
*/
virtual void getEnthalpy_RT_ref(doublereal *hrt) const;
/*!
* Returns the vector of nondimensional
* Gibbs free energies of the reference state at the current temperature
* of the solution and the reference pressure for the species.
*
* @param grt Output vector contains the nondimensional Gibbs free energies
* of the reference state of the species
* length = m_kk, units = dimensionless.
*/
virtual void getGibbs_RT_ref(doublereal *grt) const;
/*!
* Returns the vector of the
* gibbs function of the reference state at the current temperature
* of the solution and the reference pressure for the species.
* units = J/kmol
*
* @param g Output vector contain the Gibbs free energies
* of the reference state of the species
* length = m_kk, units = J/kmol.
*/
virtual void getGibbs_ref(doublereal *g) const;
/*!
* Returns the vector of nondimensional
* entropies of the reference state at the current temperature
* of the solution and the reference pressure for the species.
*
* @param er Output vector contain the nondimensional entropies
* of the species in their reference states
* length: m_kk, units: dimensionless.
*/
virtual void getEntropy_R_ref(doublereal *er) const;
/*!
* Returns the vector of nondimensional
* constant pressure heat capacities of the reference state
* at the current temperature of the solution
* and reference pressure for the species.
*
* @param cprt Output vector contains the nondimensional heat capacities
* of the species in their reference states
* length: m_kk, units: dimensionless.
*/
virtual void getCp_R_ref(doublereal *cprt) const;
//! Get the molar volumes of the species reference states at the current
//! <I>T</I> and <I>P_ref</I> of the solution.
/*!
* units = m^3 / kmol
*
* @param vol Output vector containing the standard state volumes.
* Length: m_kk.
*/
virtual void getStandardVolumes_ref(doublereal *vol) const;
protected:
//! Recalculate the Reference state thermo functions
/*!
* This function checks to see whether the temperature has changed and
* thus the reference thermodynamics functions for all of the species
* must be recalculated.
* It must be called for every reference state function evaluation,
* if m_useTmpRefStateStorage is set to true.
* If the temperature has changed, the species thermo manager is called
* to recalculate the following internal arrays at the current temperature and at
* the reference pressure:
*
* - m_h0_RT
* - m_g0_RT
* - m_s0_R
* - m_cp0_R
*
* This function may be reimplemented in child objects. However, it doesn't
* necessarily have to be, if the species thermo manager can carry
* out the full calculation.
*/
virtual void _updateRefStateThermo() const;
//@}
public:
//! @name Initialization Methods - For Internal use (VPStandardState)
/*!
* The following methods are used in the process of constructing
* the phase and setting its parameters from a specification in an
* input file. They are not normally used in application programs.
* To see how they are used, see files importCTML.cpp and
* ThermoFactory.cpp.
*/
//@{
/**
* Set equation of state parameter values from XML
* entries. This method is called by function importPhase in
* file importCTML.cpp when processing a phase definition in
* an input file. It should be overloaded in subclasses to set
* any parameters that are specific to that particular phase
* model.
*
* @param eosdata An XML_Node object corresponding to
* the "thermo" entry for this phase in the input file.
*/
virtual void setParametersFromXML(const XML_Node& eosdata) {}
//! @internal Initialize the object
/*!
* This method is provided to allow
* subclasses to perform any initialization required after all
* species have been added. For example, it might be used to
* resize internal work arrays that must have an entry for
* each species. The base class implementation does nothing,
* and subclasses that do not require initialization do not
* need to overload this method. When importing a CTML phase
* description, this method is called just prior to returning
* from function importPhase().
*
* @see importCTML.cpp
*/
virtual void initThermo();
//! Initialize a ThermoPhase object, potentially reading activity
//! coefficient information from an XML database.
/*!
*
* This routine initializes the lengths in the current object and
* then calls the parent routine.
* This method is provided to allow
* subclasses to perform any initialization required after all
* species have been added. For example, it might be used to
* resize internal work arrays that must have an entry for
* each species. The base class implementation does nothing,
* and subclasses that do not require initialization do not
* need to overload this method. When importing a CTML phase
* description, this method is called just prior to returning
* from function importPhase().
*
* @param phaseNode This object must be the phase node of a
* complete XML tree
* description of the phase, including all of the
* species data. In other words while "phase" must
* point to an XML phase object, it must have
* sibling nodes "speciesData" that describe
* the species in the phase.
* @param id ID of the phase. If nonnull, a check is done
* to see if phaseNode is pointing to the phase
* with the correct id.
*/
virtual void initThermoXML(XML_Node& phaseNode, std::string id);
private:
//! @internal Initialize the internal lengths in this object.
/*!
* Note this is not a virtual function.
*/
void initLengths();
//@}
protected:
//! The current pressure of the solution (Pa)
/*!
* It gets initialized to 1 atm.
*/
mutable doublereal m_Pcurrent;
//! The last temperature at which the reference thermodynamic properties were calculated at.
mutable doublereal m_tlast;
//! The last temperature at which the reference thermodynamic properties were calculated at.
mutable doublereal m_tlast_ref;
//! The last pressure at which the Standard State thermodynamic properties were calculated at.
mutable doublereal m_plast;
/*!
* Reference pressure (Pa) must be the same for all species
* - defaults to 1 atm.
*/
doublereal m_p0;
/*!
* boolean indicating whether temporary reference state storage is used
* -> default is true
*/
bool m_useTmpRefStateStorage;
/*!
* Vector containing the species reference enthalpies at T = m_tlast
* and P = p_ref.
*/
mutable vector_fp m_h0_RT;
/**
* Vector containing the species reference constant pressure
* heat capacities at T = m_tlast and P = p_ref.
*/
mutable vector_fp m_cp0_R;
/**
* Vector containing the species reference Gibbs functions
* at T = m_tlast and P = p_ref.
*/
mutable vector_fp m_g0_RT;
/**
* Vector containing the species reference entropies
* at T = m_tlast and P = p_ref.
*/
mutable vector_fp m_s0_R;
/*!
* boolean indicating whether temporary standard state storage is used
* -> default is false
*/
bool m_useTmpStandardStateStorage;
/**
* Vector containing the species Standard State enthalpies at T = m_tlast
* and P = m_plast.
*/
mutable vector_fp m_hss_RT;
/**
* Vector containing the species Standard State constant pressure
* heat capacities at T = m_tlast and P = m_plast.
*/
mutable vector_fp m_cpss_R;
/**
* Vector containing the species Standard State Gibbs functions
* at T = m_tlast and P = m_plast.
*/
mutable vector_fp m_gss_RT;
/**
* Vector containing the species Standard State entropies
* at T = m_tlast and P = m_plast.
*/
mutable vector_fp m_sss_R;
/**
* Vector containing the species standard state volumes
* at T = m_tlast and P = m_plast
*/
mutable vector_fp m_Vss;
private:
/*!
* VPStandardStateTP has its own err routine
*/
doublereal err(std::string msg) const;
};
}
#endif