cantera/Cantera/src/thermo/PDSS_HKFT.h
Harry Moffat 54988b2b5f Doxygen update -> no real changes.
Working on doxygen docs and SAND report and validation for
  EQ3 import.
2008-09-29 16:05:40 +00:00

638 lines
19 KiB
C++

/**
* @file PDSS_HKFT.h
* Declarations for the class PDSS_HKFT (pressure dependent standard state)
* which handles calculations for a single species in a phase using the
* HKFT standard state
* (see class \link Cantera::PDSS_HKFT PDSS_HKFT\endlink).
*/
/* $Author$
* $Date$
* $Revision$
*
*
*/
#ifndef CT_PDSS_HKFT_H
#define CT_PDSS_HKFT_H
#include "ct_defs.h"
class WaterPropsIAPWS;
#include "PDSS.h"
namespace Cantera {
class XML_Node;
class VPStandardState;
class PDSS_Water;
class WaterProps;
//! Class for pressure dependent standard states corresponding to
//! ionic solutes in electrolyte water.
/*!
*
* Virtual base class for calculation of the
* pressure dependent standard state for a single species
*
* Class %PDSS is the base class
* for a family of classes that compute properties of a set of
* species in their standard states at a range of temperatures
* and pressures. The independent variables for this object
* are temperature and pressure.
* The class may mave a reference to a SpeciesThermo object
* which handles the calculation of the reference state temperature
* behavior of a subset of species.
*
* This class is analagous to the SpeciesThermoInterpType
* class, except that the standard state inherently incorporates
* the pressure dependence.
*
* The class operates on a setState temperature and pressure basis.
* It only recalculates the standard state when the setState functions
* for temperature and pressure are called
*
*/
class PDSS_HKFT : public PDSS {
public:
/**
* @name Constructors
* @{
*/
//! Constructor that initializes the object by examining the XML entries
//! from the ThermoPhase object
/*!
* This function calls the constructPDSS member function.
*
* @param tp Pointer to the ThermoPhase object pertaining to the phase
* @param spindex Species index of the species in the phase
*/
PDSS_HKFT(VPStandardStateTP *tp, int spindex);
//! Copy Constructor
/*!
* @param b object to be copied
*/
PDSS_HKFT(const PDSS_HKFT &b);
//! Assignment operator
/*!
* @param b Object to be copied
*/
PDSS_HKFT& operator=(const PDSS_HKFT&b);
//! Constructor that initializes the object by examining the input file
//! of the ThermoPhase object
/*!
* This function calls the constructPDSSFile member function.
*
* @param vptp_ptr Pointer to the ThermoPhase object pertaining to the phase
* @param spindex Species index of the species in the phase
* @param inputFile String name of the input file
* @param id String name of the phase in the input file. The default
* is the empty string, in which case the first phase in the
* file is used.
*/
PDSS_HKFT(VPStandardStateTP *vptp_ptr, int spindex,
std::string inputFile, std::string id = "");
//! Constructor that initializes the object by examining the input file
//! of the ThermoPhase object
/*!
* This function calls the constructPDSSXML member function.
*
* @param vptp_ptr Pointer to the ThermoPhase object pertaining to the phase
* @param spindex Species index of the species in the phase
* @param speciesNode Reference to the species XML tree.
* @param phaseRef Reference to the XML tree containing the phase information.
* @param spInstalled Boolean indicating whether the species is installed yet
* or not.
*/
PDSS_HKFT(VPStandardStateTP *vptp_ptr, int spindex, const XML_Node& speciesNode,
const XML_Node& phaseRef, bool spInstalled);
//! Destructor for the phase
virtual ~PDSS_HKFT();
//! Duplicator
virtual PDSS *duplMyselfAsPDSS() const;
/**
* @}
* @name Utilities
* @{
*/
virtual int pdssType() const { return -1; }
/**
* @}
* @name Molar Thermodynamic Properties of the Species Standard State
* in the Solution
* @{
*/
/**
* @}
* @name Molar Thermodynamic Properties of the Solution --------------
* @{
*/
//! Return the molar enthalpy in units of J kmol-1
/*!
* Returns the species standard state enthalpy in J kmol-1 at the
* current temperature and pressure.
*
* @return returns the species standard state enthalpy in J kmol-1
*/
virtual doublereal enthalpy_mole() const;
//! Return the standard state molar enthalpy divided by RT
/*!
* Returns the species standard state enthalpy divided by RT at the
* current temperature and pressure.
*
* @return returns the species standard state enthalpy in unitless form
*/
virtual doublereal enthalpy_RT() const;
//! Return the molar internal Energy in units of J kmol-1
/*!
* Returns the species standard state internal Energy in J kmol-1 at the
* current temperature and pressure.
*
* @return returns the species standard state internal Energy in J kmol-1
*/
virtual doublereal intEnergy_mole() const;
//! Return the molar entropy in units of J kmol-1 K-1
/*!
* Returns the species standard state entropy in J kmol-1 K-1 at the
* current temperature and pressure.
*
* @return returns the species standard state entropy in J kmol-1 K-1
*/
virtual doublereal entropy_mole() const;
//! Return the molar gibbs free energy in units of J kmol-1
/*!
* Returns the species standard state gibbs free energy in J kmol-1 at the
* current temperature and pressure.
*
* @return returns the species standard state gibbs free energy in J kmol-1
*/
virtual doublereal gibbs_mole() const;
//! Return the molar const pressure heat capacity in units of J kmol-1 K-1
/*!
* Returns the species standard state Cp in J kmol-1 K-1 at the
* current temperature and pressure.
*
* @return returns the species standard state Cp in J kmol-1 K-1
*/
virtual doublereal cp_mole() const;
//! Return the molar const volume heat capacity in units of J kmol-1 K-1
/*!
* Returns the species standard state Cv in J kmol-1 K-1 at the
* current temperature and pressure.
*
* @return returns the species standard state Cv in J kmol-1 K-1
*/
virtual doublereal cv_mole() const;
//! Return the molar volume at standard state
/*!
* Returns the species standard state molar volume at the
* current temperature and pressure
*
* @return returns the standard state molar volume divided by R
* units are m**3 kmol-1.
*/
virtual doublereal molarVolume() const;
//! Return the standard state density at standard state
/*!
* Returns the species standard state density at the
* current temperature and pressure
*
* @return returns the standard state density
* units are kg m-3
*/
virtual doublereal density() const;
/**
* @}
* @name Properties of the Reference State of the Species
* in the Solution
* @{
*/
//! Return the reference pressure for this phase.
doublereal refPressure() const {
return m_p0;
}
//! Return the molar gibbs free energy divided by RT at reference pressure
/*!
* Returns the species reference state gibbs free energy divided by RT at the
* current temperature.
*
* @return returns the reference state gibbs free energy divided by RT
*/
virtual doublereal gibbs_RT_ref() const;
//! Return the molar enthalpy divided by RT at reference pressure
/*!
* Returns the species reference state enthalpy divided by RT at the
* current temperature.
*
* @return returns the reference state enthalpy divided by RT
*/
virtual doublereal enthalpy_RT_ref() const;
//! Return the molar entropy divided by R at reference pressure
/*!
* Returns the species reference state entropy divided by R at the
* current temperature.
*
* @return returns the reference state entropy divided by R
*/
virtual doublereal entropy_R_ref() const;
//! Return the molar heat capacity divided by R at reference pressure
/*!
* Returns the species reference state heat capacity divided by R at the
* current temperature.
*
* @return returns the reference state heat capacity divided by R
*/
virtual doublereal cp_R_ref() const;
//! Return the molar volume at reference pressure
/*!
* Returns the species reference state molar volume at the
* current temperature.
*
* @return returns the reference state molar volume divided by R
* units are m**3 kmol-1.
*/
virtual doublereal molarVolume_ref() const;
/**
* @}
* @name Mechanical Equation of State Properties
* @{
*/
//! Returns the pressure (Pa)
virtual doublereal pressure() const;
//! Sets the pressure in the object
/*!
* Currently, this sets the pressure in the PDSS object.
* It is indeterminant what happens to the owning VPStandardStateTP
* object and to the VPSSMgr object.
*
* @param pres Pressure to be set (Pascal)
*/
virtual void setPressure(doublereal pres);
//! Set the internal temperature
/*!
* @param temp Temperature (Kelvin)
*/
virtual void setTemperature(doublereal temp);
//! Return the current storred temperature
doublereal temperature() const;
//! Set the internal temperature and pressure
/*!
* @param temp Temperature (Kelvin)
* @param pres pressure (Pascals)
*/
virtual void setState_TP(doublereal temp, doublereal pres);
/**
* @}
* @name Miscellaneous properties of the standard state
* @{
*/
/// critical temperature
virtual doublereal critTemperature() const;
/// critical pressure
virtual doublereal critPressure() const;
/// critical density
virtual doublereal critDensity() const;
/**
* @}
* @name Initialization of the Object
* @{
*/
//! Initialization routine for all of the shallow pointers
/*!
* This is a cascading call, where each level should call the
* the parent level.
*
* The initThermo() routines get called before the initThermoXML() routines
* from the constructPDSSXML() routine.
*
*
* Calls initPtrs();
*/
virtual void initThermo();
//! Initialization of a PDSS object using an
//! input XML file.
/*!
*
* This routine is a precursor to constructPDSSXML(XML_Node*)
* routine, which does most of the work.
*
* @param vptp_ptr Pointer to the Variable pressure %ThermoPhase object
* This object must have already been malloced.
*
* @param spindex Species index within the phase
*
* @param inputFile XML file containing the description of the
* phase
*
* @param id Optional parameter identifying the name of the
* phase. If none is given, the first XML
* phase element will be used.
*/
void constructPDSSFile(VPStandardStateTP *vptp_ptr, int spindex,
std::string inputFile, std::string id);
//! Initialization of a PDSS object using an xml tree
/*!
* This routine is a driver for the initialization of the
* object.
*
* basic logic:
* initThermo() (cascade)
* getStuff from species Part of XML file
* initThermoXML(phaseNode) (cascade)
*
* @param vptp_ptr Pointer to the Variable pressure %ThermoPhase object
* This object must have already been malloced.
*
* @param spindex Species index within the phase
*
* @param speciesNode XML Node containing the species information
*
* @param phaseNode Reference to the phase Information for the phase
* that owns this species.
*
* @param spInstalled Boolean indicating whether the species is
* already installed.
*/
void constructPDSSXML(VPStandardStateTP *vptp_ptr, int spindex,
const XML_Node& speciesNode,
const XML_Node& phaseNode, bool spInstalled);
//! Initialization routine for the PDSS object based on the phaseNode
/*!
* This is a cascading call, where each level should call the
* the parent level.
*
* @param phaseNode Reference to the phase Information for the phase
* that owns this species.
*
* @param id Optional parameter identifying the name of the
* phase. If none is given, the first XML
* phase element will be used.
*/
virtual void initThermoXML(const XML_Node& phaseNode, std::string& id);
//@}
private:
//! Main routine that actually calculates the gibbs free energy difference
//! between the reference state at Tr, Pr and T,P
/*!
* This is eEqn. 59 in Johnson et al. (1992).
*
*/
doublereal deltaG() const;
//! Main routine that actually calculates the entropy difference
//! between the reference state at Tr, Pr and T,P
/*!
* This is eEqn. 61 in Johnson et al. (1992). Actually, there appears to
* be an error in the latter. This is a correction.
*/
doublereal deltaS() const;
//! Internal formula for the calculation of a_g()
/*!
* The output of this is in units of Angstroms
*
* @param temp Temperature (K)
*
* @param ifunc parameters specifying the desired information
* - 0 function value
* - 1 derivative wrt temperature
* - 2 2nd derivative wrt temperature
* - 3 derivative wrt pressure
*/
doublereal ag(const doublereal temp, const int ifunc = 0) const;
//! Internal formula for the calculation of b_g()
/*!
* the output of this is unitless
*
* @param temp Temperature (K)
*
* @param ifunc parameters specifying the desired information
* - 0 function value
* - 1 derivative wrt temperature
* - 2 2nd derivative wrt temperature
* - 3 derivative wrt pressure
*/
doublereal bg(const doublereal temp, const int ifunc = 0) const;
//! function g appearing in the formulation
/*!
* Function g appearing in the Johnson et al formulation
*
* @param temp Temperature kelvin
* @param pres Pressure (pascal)
* @param ifunc parameters specifying the desired information
* - 0 function value
* - 1 derivative wrt temperature
* - 2 2nd derivative wrt temperature
* - 3 derivative wrt pressure
*/
doublereal g(const doublereal temp, const doublereal pres, const int ifunc = 0) const;
//! Difference function f appearing in the formulation
/*!
* Function f appearing in the Johnson et al formulation of omega_j
* Eqn. 33 ref
*
* @param temp Temperature kelvin
* @param pres Pressure (pascal)
* @param ifunc parameters specifying the desired information
* - 0 function value
* - 1 derivative wrt temperature
* - 2 2nd derivative wrt temperature
* - 3 derivative wrt pressure
*/
doublereal f(const doublereal temp, const doublereal pres, const int ifunc = 0) const;
//! Evaluate the Gstar value appearing in the HKFT formulation
/*!
*
* @param temp Temperature kelvin
* @param pres Pressure (pascal)
* @param ifunc parameters specifying the desired information
* - 0 function value
* - 1 derivative wrt temperature
* - 2 2nd derivative wrt temperature
* - 3 derivative wrt pressure
*/
doublereal gstar(const doublereal temp, const doublereal pres, const int ifunc = 0) const;
//! Function to look up Element Free Energies
/*!
*
* This static function looks up the argument string in the
* element database and returns the associated 298 K Gibbs Free energy
* of the element in its stable state
*
* @param elemName String. Only the first 3 characters are significant
*
* @return
* Return value contains the Gibbs free energy for that element
*
* @exception CanteraError
* If a match is not found, a CanteraError is thrown as well
*/
doublereal LookupGe(const std::string& elemName);
//! Translate a Gibbs free energy of formation value to a NIST-based Chemical potential
/*!
* Internally, this function is used to translate the input value, m_deltaG_formation_tr_pr,
* to the internally storred value, m_Mu0_tr_pr.
*/
void convertDGFormation();
private:
//! Water standard state calculator
/*!
* derived from the equation of state for water.
*/
PDSS_Water *m_waterSS;
//! Current value of the pressure for this object
mutable doublereal m_pres;
//! density of standard-state water
/*!
* internal temporary variable
*/
mutable doublereal m_densWaterSS;
/**
* Pointer to the water property calculator
*/
WaterProps *m_waterProps;
//! Born coefficient for the current ion or species
doublereal m_born_coeff_j;
//! Electrostatic radii
doublereal m_r_e_j;
//! Value of deltaG of Formation at Tr and Pr (cal gmol-1)
/*!
* Tr = 298.15 Pr = 1 atm
*
* This is the delta G for the formation reaction of the
* ion from elements in their stable state at Tr, Pr.
*/
doublereal m_deltaG_formation_tr_pr;
//! Value of deltaH of Formation at Tr and Pr (cal gmol-1)
/*!
* Tr = 298.15 Pr = 1 atm
*
* This is the delta H for the formation reaction of the
* ion from elements in their stable state at Tr, Pr.
*/
doublereal m_deltaH_formation_tr_pr;
//! Value of the Absolute Gibbs Free Energy NIST scale at tr and pr
/*!
* this is the NIST scale value of Gibbs free energy at T_r = 298.15
* and P_r = 1 atm.
*
* J kmol-1
*/
doublereal m_Mu0_tr_pr;
//! Value of S_j at Tr and Pr (cal gmol-1 K-1)
/*!
* Tr = 298.15 Pr = 1 atm
*/
doublereal m_Entrop_tr_pr;
//! a1 coefficient (cal gmol-1 bar-1)
doublereal m_a1;
//! a2 coefficient (cal gmol-1)
doublereal m_a2;
//! a3 coefficient (cal K gmol-1 bar-1)
doublereal m_a3;
//! a4 coefficient (cal K gmol-1)
doublereal m_a4;
//! c1 coefficient (cal gmol-1 K-1)
doublereal m_c1;
//! c2 coefficient (cal K gmol-1)
doublereal m_c2;
//! omega_pr_tr coefficient(cal gmol-1)
doublereal m_omega_pr_tr;
//! y = dZdT = 1/(esp*esp) desp/dT at 298.15 and 1 bar
doublereal m_Y_pr_tr;
//! Z = -1 / relEpsilon at 298.15 and 1 bar
doublereal m_Z_pr_tr;
//! Reference pressure is 1 atm in units of bar= 1.0132
doublereal m_presR_bar;
//! small value that is not quite zero
doublereal m_domega_jdT_prtr;
//! Charge of the ion
doublereal m_charge_j;
};
}
#endif