PlanckEinstein and PlanckEinstein2 classes replaced with PlanckEinsteinGeneralized. Docs to follow.

Aly-Lee not yet removed.  Next step.

Signed-off-by: Ian Bell <ian.h.bell@gmail.com>
This commit is contained in:
Ian Bell
2014-06-03 12:04:16 +02:00
parent 6db102b47f
commit bff7e2afeb
11 changed files with 396 additions and 286 deletions

View File

@@ -143,20 +143,36 @@ protected:
long double a = cpjson::get_double(contribution,"a");
EOS.alpha0.LogTau = IdealHelmholtzLogTau(a);
}
else if (!type.compare("IdealGasHelmholtzPlanckEinsteinGeneralized"))
{
// Retrieve the values
std::vector<long double> n = cpjson::get_long_double_array(contribution["n"]);
std::vector<long double> t = cpjson::get_long_double_array(contribution["t"]);
std::vector<long double> c = cpjson::get_long_double_array(contribution["c"]);
std::vector<long double> d = cpjson::get_long_double_array(contribution["d"]);
if (EOS.alpha0.PlanckEinstein.is_enabled() == true){
EOS.alpha0.PlanckEinstein.extend(n, t, c, d);
}
else{
EOS.alpha0.PlanckEinstein = IdealHelmholtzPlanckEinsteinGeneralized(n, t, c, d);
}
}
else if (!type.compare("IdealGasHelmholtzPlanckEinstein"))
{
if (EOS.alpha0.PlanckEinstein.is_enabled() == true){throw ValueError("Cannot add ");}
// Retrieve the values
std::vector<long double> n = cpjson::get_long_double_array(contribution["n"]);
std::vector<long double> t = cpjson::get_long_double_array(contribution["t"]);
EOS.alpha0.PlanckEinstein = IdealHelmholtzPlanckEinstein(n, t);
}
else if (!type.compare("IdealGasHelmholtzPlanckEinstein2"))
{
if (EOS.alpha0.PlanckEinstein2.is_enabled() == true){throw ValueError("Cannot add");}
std::vector<long double> n = cpjson::get_long_double_array(contribution["n"]);
std::vector<long double> t = cpjson::get_long_double_array(contribution["t"]);
std::vector<long double> c = cpjson::get_long_double_array(contribution["c"]);
EOS.alpha0.PlanckEinstein2 = IdealHelmholtzPlanckEinstein2(n, t, c);
// Flip the sign of theta
for (std::size_t i = 0; i < t.size(); ++i){ t[i] *= -1;}
std::vector<long double> c(n.size(), 1);
std::vector<long double> d(c.size(), -1);
if (EOS.alpha0.PlanckEinstein.is_enabled() == true){
EOS.alpha0.PlanckEinstein.extend(n, t, c, d);
}
else{
EOS.alpha0.PlanckEinstein = IdealHelmholtzPlanckEinsteinGeneralized(n, t, c, d);
}
}
else if (!type.compare("IdealGasHelmholtzCP0Constant"))
{
@@ -177,11 +193,45 @@ protected:
}
else if (!type.compare("IdealGasHelmholtzCP0AlyLee"))
{
if (EOS.alpha0.CP0AlyLee.is_enabled() == true){std::cout << "Cannot add IdealGasHelmholtzCP0AlyLee\n";}
std::vector<long double> c = cpjson::get_long_double_array(contribution["c"]);
std::vector<long double> constants = cpjson::get_long_double_array(contribution["c"]);
long double Tc = cpjson::get_double(contribution, "Tc");
long double T0 = cpjson::get_double(contribution, "T0");
EOS.alpha0.CP0AlyLee = IdealHelmholtzCP0AlyLee(c, Tc, T0);
// Take the constant term if nonzero and set it as a polyT term
if (fabs(constants[0]) > 1e-14){
std::vector<long double> c(1,constants[0]), t(1,0);
if (EOS.alpha0.CP0PolyT.is_enabled() == true){
EOS.alpha0.CP0PolyT.extend(c,t);
}
else{
EOS.alpha0.CP0PolyT = IdealHelmholtzCP0PolyT(c, t, Tc, T0);
}
}
std::vector<long double> n, c, d, t;
if (fabs(constants[1]) > 1e-14){
// sinh term can be converted by setting a_k = C, b_k = 2*D, c_k = -1, d_k = 1
n.push_back(constants[1]);
t.push_back(-2*constants[2]/Tc);
c.push_back(1);
d.push_back(-1);
}
if (fabs(constants[3]) > 1e-14){
// cosh term can be converted by setting a_k = C, b_k = 2*D, c_k = 1, d_k = 1
n.push_back(-constants[3]);
t.push_back(-2*constants[4]/Tc);
c.push_back(1);
d.push_back(1);
}
if (EOS.alpha0.PlanckEinstein.is_enabled() == true){
EOS.alpha0.PlanckEinstein.extend(n, t, c, d);
}
else{
EOS.alpha0.PlanckEinstein = IdealHelmholtzPlanckEinsteinGeneralized(n, t, c, d);
}
}
else if (!type.compare("IdealGasHelmholtzEnthalpyEntropyOffset"))
{

View File

@@ -1715,42 +1715,50 @@ long double HelmholtzEOSMixtureBackend::calc_alphar_deriv_nocache(const int nTau
long double HelmholtzEOSMixtureBackend::calc_alpha0_deriv_nocache(const int nTau, const int nDelta, const std::vector<long double> &mole_fractions,
const long double &tau, const long double &delta, const long double &Tr, const long double &rhor)
{
long double val;
if (is_pure_or_pseudopure)
{
if (nTau == 0 && nDelta == 0){
return components[0]->pEOS->base0(tau, delta);
val = components[0]->pEOS->base0(tau, delta);
}
else if (nTau == 0 && nDelta == 1){
return components[0]->pEOS->dalpha0_dDelta(tau, delta);
val = components[0]->pEOS->dalpha0_dDelta(tau, delta);
}
else if (nTau == 1 && nDelta == 0){
return components[0]->pEOS->dalpha0_dTau(tau, delta);
val = components[0]->pEOS->dalpha0_dTau(tau, delta);
}
else if (nTau == 0 && nDelta == 2){
return components[0]->pEOS->d2alpha0_dDelta2(tau, delta);
val = components[0]->pEOS->d2alpha0_dDelta2(tau, delta);
}
else if (nTau == 1 && nDelta == 1){
return components[0]->pEOS->d2alpha0_dDelta_dTau(tau, delta);
val = components[0]->pEOS->d2alpha0_dDelta_dTau(tau, delta);
}
else if (nTau == 2 && nDelta == 0){
return components[0]->pEOS->d2alpha0_dTau2(tau, delta);
val = components[0]->pEOS->d2alpha0_dTau2(tau, delta);
}
else if (nTau == 0 && nDelta == 3){
return components[0]->pEOS->d3alpha0_dDelta3(tau, delta);
val = components[0]->pEOS->d3alpha0_dDelta3(tau, delta);
}
else if (nTau == 1 && nDelta == 2){
return components[0]->pEOS->d3alpha0_dDelta2_dTau(tau, delta);
val = components[0]->pEOS->d3alpha0_dDelta2_dTau(tau, delta);
}
else if (nTau == 2 && nDelta == 1){
return components[0]->pEOS->d3alpha0_dDelta_dTau2(tau, delta);
val = components[0]->pEOS->d3alpha0_dDelta_dTau2(tau, delta);
}
else if (nTau == 3 && nDelta == 0){
return components[0]->pEOS->d3alpha0_dTau3(tau, delta);
val = components[0]->pEOS->d3alpha0_dTau3(tau, delta);
}
else
{
throw ValueError();
}
if (!ValidNumber(val)){
calc_alpha0_deriv_nocache(nTau,nDelta,mole_fractions,tau,delta,Tr,rhor);
throw ValueError(format("calc_alpha0_deriv_nocache returned invalid number with inputs nTau: %d, nDelta: %d", nTau, nDelta));
}
else{
return val;
}
}
else{
// See Table B5, GERG 2008 from Kunz Wagner, JCED, 2012

View File

@@ -1691,10 +1691,11 @@ long double IdealHelmholtzCP0AlyLee::dTau(const long double &tau, const long dou
}
long double IdealHelmholtzCP0AlyLee::anti_deriv_cp0_tau2(const long double &tau)
{
return -c[0]/tau + 2*c[1]*c[2]/(Tc*(exp(-(2*c[2]*tau)/Tc)-1)) + 2*c[3]*c[4]/(Tc*(exp(-(2*c[4]*tau)/Tc)+1));
return -c[0]/tau + 2*c[1]*c[2]/Tc/(exp(-2*c[2]*tau/Tc)-1) - 2*c[3]*c[4]/Tc*(exp(2*c[4]*tau/Tc)+1);
}
long double IdealHelmholtzCP0AlyLee::anti_deriv_cp0_tau(const long double &tau)
{
long double lnarg =-1 + exp(-2*c[2]*tau/Tc);
long double term1 = c[0]*log(tau);
long double term2 = 2*c[1]*c[2]*tau/(-Tc + Tc*exp(-2*c[2]*tau/Tc)) + c[1]*log(-1 + exp(-2*c[2]*tau/Tc)) + 2*c[1]*c[2]*tau/Tc;
long double term3 = -c[3]*(Tc*exp(2*c[4]*tau/Tc)*log(exp(2*c[4]*tau/Tc) + 1) + Tc*log(exp(2*c[4]*tau/Tc) + 1) - 2*c[4]*tau*exp(2*c[4]*tau/Tc))/(Tc*(exp(2*c[4]*tau/Tc) + 1));
@@ -1716,7 +1717,6 @@ long double IdealHelmholtzCP0AlyLee::dTau3(const long double &tau, const long do
/*
IdealHelmholtzEnthalpyEntropyOffset EnthalpyEntropyOffset;
IdealHelmholtzCP0AlyLee CP0AlyLee;
*/
#ifdef ENABLE_CATCH
@@ -1728,8 +1728,8 @@ class HelmholtzConsistencyFixture
public:
long double numerical, analytic;
std::tr1::shared_ptr<CoolProp::BaseHelmholtzTerm> Lead, LogTau, IGPower, PlanckEinstein, PlanckEinstein2,
CP0Constant, CP0PolyT, CP0AlyLee, Gaussian, Lemmon2005, Power, SAFT, NonAnalytic, Exponential, GERG2008;
std::tr1::shared_ptr<CoolProp::BaseHelmholtzTerm> Lead, LogTau, IGPower, PlanckEinstein,
CP0Constant, CP0PolyT, Gaussian, Lemmon2005, Power, SAFT, NonAnalytic, Exponential, GERG2008;
HelmholtzConsistencyFixture(){
Lead.reset(new CoolProp::IdealHelmholtzLead(1,3));
@@ -1739,12 +1739,8 @@ public:
IGPower.reset(new CoolProp::IdealHelmholtzPower(n,t));
}
{
std::vector<long double> n(4,0), t(4,1); n[0] = 0.1; n[2] = 0.5; t[1] = 1; t[2] = 2; t[3] = 2;
PlanckEinstein.reset(new CoolProp::IdealHelmholtzPlanckEinstein(n, t));
}
{
std::vector<long double> n(4,0), t(4,1), c(4,1); n[0] = -0.1; n[2] = 0.1; t[1] = -1; t[2] = -2; t[3] = 2;
PlanckEinstein2.reset(new CoolProp::IdealHelmholtzPlanckEinstein2(n, t, c));
std::vector<long double> n(4,0), t(4,1), c(4,1), d(4,1); n[0] = 0.1; n[2] = 0.5; t[1] = 1; t[2] = 2; t[3] = 2;
PlanckEinstein.reset(new CoolProp::IdealHelmholtzPlanckEinsteinGeneralized(n, t, c, d));
}
{
long double T0 = 273.15, Tc = 345.857, c = 1.0578, t = 0.33;
@@ -1752,11 +1748,6 @@ public:
std::vector<long double>(1,t),
Tc, T0));
}
{
long double T0 = 518.109977174843, Tc = 645.78, c[] = {56.37158920013201, 118.0111016069331, 1792.1, 82.5909330141469, 786.8};
CP0AlyLee.reset(new CoolProp::IdealHelmholtzCP0AlyLee(std::vector<long double>(c, c+sizeof(c)/sizeof(c[0])),
Tc, T0));
}
CP0Constant.reset(new CoolProp::IdealHelmholtzCP0Constant(4/8.314472,300,250));
{
long double beta[] = {1.24, 0.821, 15.45, 2.21, 437, 0.743},
@@ -1871,10 +1862,8 @@ public:
else if (!t.compare("LogTau")){return LogTau;}
else if (!t.compare("IGPower")){return IGPower;}
else if (!t.compare("PlanckEinstein")){return PlanckEinstein;}
else if (!t.compare("PlanckEinstein2")){return PlanckEinstein2;}
else if (!t.compare("CP0Constant")){return CP0Constant;}
else if (!t.compare("CP0PolyT")){return CP0PolyT;}
else if (!t.compare("CP0AlyLee")){return CP0AlyLee;}
else if (!t.compare("Gaussian")){return Gaussian;}
else if (!t.compare("Lemmon2005")){return Lemmon2005;}

View File

@@ -154,8 +154,8 @@ int main()
}
if (1)
{
double rrr0 = PropsSI("O","T",350,"Q",0,"REFPROP::Water");
double rrr2 = PropsSI("O","T",350,"Q",0,"Water");
double rrr0 = PropsSI("C","T",350,"D",1e-13,"REFPROP::MDM");
double rrr2 = PropsSI("C","T",350,"D",1e-13,"MDM");
double rrr =0 ;
}
if (1)
@@ -171,7 +171,8 @@ int main()
}
if (1)
{
double h1 = PropsSI("H","T",273.15,"Q",0,"CO2");
double h1 = PropsSI("S","P",101325,"Q",0,"n-Pentane");
std::string er = get_global_param_string("errstring");
set_reference_stateS("n-Propane","NBP");
double h2 = PropsSI("H","P",101325,"Q",0,"n-Propane");