cantera/include/cantera/tpx/Sub.h

220 lines
5.8 KiB
C++

/*
* This is the base substance class from which all substances are derived
*
* Kate Talmazan: SURF -- July, 1995
* original implementation of this class and all derived classes from
* formulas given in TPSI. Implementation of P(Rho, T), cv0(T), ldens(T),
* and Psat(T) for all substances in TPSI.f
*
* Dave Goodwin: Fall, 1996
* functions for u, h, s, f, g;
* functions to set state
* error handling
* documentation
*
* Sept., 2001: minor modifications to use with Cantera
*
*/
#ifndef TPX_SUB_H
#define TPX_SUB_H
#include "cantera/base/ctexceptions.h"
#include <iostream>
#include <string>
namespace tpx
{
class TPX_Error : public Cantera::CanteraError
{
public:
TPX_Error(const std::string& p, const std::string& e) :
CanteraError(p, e) { }
};
namespace PropertyPair
{
enum type {
TV = 12, HP = 34, SP = 54, PV = 42, TP = 14, UV = 62, ST = 51,
SV = 52, UP = 64, VH = 23, TH = 13, SH = 53, PX = 47, TX = 17,
VT = -12, PH = -34, PS = -54, VP = -42, PT = -14, VU = -62, TS = -51,
VS = -52, PU = -64, HV = -23, HT = -13, HS = -53, XP = -47, XT = -17
};
}
const int Pgiven = 0, Tgiven = 1;
namespace propertyFlag
{
enum type { H, S, U, V, P, T };
}
const double Undef = 999.1234;
class Substance
{
public:
Substance();
virtual ~Substance() {}
void setStdState(double h0 = 0.0, double s0 = 0.0,
double t0 = 298.15, double p0 = 1.01325e5) {
Set(PropertyPair::TP, t0, p0);
double hh = h();
double ss = s();
double hoff = h0 - hh;
double soff = s0 - ss;
m_entropy_offset += soff;
m_energy_offset += hoff;
}
// information about a substance:
virtual double MolWt()=0; // molecular weight, kg/kmol
virtual double Tcrit()=0; // critical temperature, K
virtual double Pcrit()=0; // critical pressure, Pa
virtual double Vcrit()=0; // critical specific vol, m^3/kg
virtual double Tmin()=0; // min. temp for which equations valid
virtual double Tmax()=0; // max. temp for which equations valid
virtual char* name() = 0; // name
virtual char* formula() = 0; // chemical formula
// properties:
double P(); // pressure, Pa
double Temp() {
return T; // temperature, K
}
double v() { // specific vol, m^3/kg
return prop(propertyFlag::V);
}
double u() { // int. energy, J/kg
return prop(propertyFlag::U);
}
double h() { // enthalpy, J/kg
return prop(propertyFlag::H);
}
double s() { // entropy, J/kg/K
return prop(propertyFlag::S);
}
double f() { // Helmholtz function, J/kg
return u() - T*s();
}
double g() { // Gibbs function, J/kg
return h() - T*s();
}
virtual double cv() {
double Tsave = T, dt = 1.e-4*T;
set_T(Tsave - dt);
double s1 = s();
set_T(Tsave + dt);
double s2 = s();
set_T(Tsave);
return T*(s2 - s1)/(2.0*dt);
}
virtual double cp() {
double Tsave = T, dt = 1.e-4*T;
double p0 = P();
Set(PropertyPair::TP, Tsave - dt, p0);
double s1 = s();
Set(PropertyPair::TP, Tsave + dt, p0);
double s2 = s();
Set(PropertyPair::TP, Tsave, p0);
return T*(s2 - s1)/(2.0*dt);
}
virtual double thermalExpansionCoeff() {
double Tsave = T, dt = 1.e-4*T;
double p0 = P();
Set(PropertyPair::TP, Tsave - dt, p0);
double v1 = v();
Set(PropertyPair::TP, Tsave + dt, p0);
double v2 = v();
Set(PropertyPair::TP, Tsave, p0);
return (v2 - v1)/((v2 + v1)*dt);
}
virtual double isothermalCompressibility() {
double Psave = P(), dp = 1.e-4*Psave;
Set(PropertyPair::TP, T, Psave - dp);
double v1 = v();
Set(PropertyPair::TP, T, Psave + dp);
double v2 = v();
Set(PropertyPair::TP, T, Psave);
return -(v2 - v1)/((v2 + v1)*dp);
}
// saturation properties
double Ps();
virtual double dPsdT(); // d(Psat)/dT, Pa/K
double Tsat(double p); // saturation temp at p
double x(); // vapor mass fraction
int TwoPhase(); // =1 if vapor/liquid, 0 otherwise
virtual double Pp()=0;
double hp() {
return up() + Pp()/Rho;
}
double gp() {
return hp() - T*sp();
}
double prop(propertyFlag::type ijob);
void set_TPp(double t0, double p0); // set T and P
// functions to set or change state:
void Set(PropertyPair::type XY, double x0, double y0);
protected:
double T, Rho;
double Tslast, Rhf, Rhv;
double Pst;
double m_energy_offset;
double m_entropy_offset;
std::string m_name;
std::string m_formula;
//virtual double Xm(int k) { return 1.0;}
//virtual int Species() { return 1;}
virtual double ldens()=0;
virtual double Psat()=0; // saturation pressure, Pa
virtual double up()=0;
virtual double sp()=0;
virtual int ideal() {
return 0; // added 9/2/98; default is false
}
double vp() {
return 1.0/Rho;
}
int Lever(int itp, double sat, double val, propertyFlag::type ifunc);
void update_sat();
private:
void set_Rho(double r0);
void set_T(double t0);
void set_v(double v0);
void BracketSlope(double p);
double vprop(propertyFlag::type ijob);
void set_xy(propertyFlag::type if1, propertyFlag::type if2,
double X, double Y,
double atx, double aty, double rtx, double rty);
int kbr;
double Vmin, Vmax;
double Pmin, Pmax;
double dvbf, dv;
double v_here, P_here;
};
}
#endif