From 77f3bdec7ab7c6dfe5464d558856d87bda4a4701 Mon Sep 17 00:00:00 2001 From: Ian Bell Date: Sat, 8 Jan 2022 18:28:50 -0500 Subject: [PATCH] Fix PHI0 delta derivatives for REFPROP backend. Closes #2073 --- include/DataStructures.h | 2 ++ src/AbstractState.cpp | 4 ++++ .../REFPROP/REFPROPMixtureBackend.cpp | 23 ++++++++++++++++++- src/DataStructures.cpp | 2 ++ 4 files changed, 30 insertions(+), 1 deletion(-) diff --git a/include/DataStructures.h b/include/DataStructures.h index 97c34b24..613dcedf 100644 --- a/include/DataStructures.h +++ b/include/DataStructures.h @@ -125,6 +125,8 @@ enum parameters{ ialpha0, idalpha0_dtau_constdelta, idalpha0_ddelta_consttau, + id2alpha0_ddelta2_consttau, + id3alpha0_ddelta3_consttau, // Other functions and derivatives iBvirial, ///< Second virial coefficient diff --git a/src/AbstractState.cpp b/src/AbstractState.cpp index f26b6f08..3c231819 100644 --- a/src/AbstractState.cpp +++ b/src/AbstractState.cpp @@ -461,6 +461,10 @@ double AbstractState::keyed_output(parameters key) return alpha0(); case idalpha0_ddelta_consttau: return dalpha0_dDelta(); + case id2alpha0_ddelta2_consttau: + return d2alpha0_dDelta2(); + case id3alpha0_ddelta3_consttau: + return d3alpha0_dDelta3(); case idalpha0_dtau_constdelta: return dalpha0_dTau(); case idalphar_ddelta_consttau: diff --git a/src/Backends/REFPROP/REFPROPMixtureBackend.cpp b/src/Backends/REFPROP/REFPROPMixtureBackend.cpp index 68619e04..528d7e50 100644 --- a/src/Backends/REFPROP/REFPROPMixtureBackend.cpp +++ b/src/Backends/REFPROP/REFPROPMixtureBackend.cpp @@ -1988,7 +1988,7 @@ CoolPropDbl REFPROPMixtureBackend::call_phi0dll(int itau, int idel) double val = 0, tau = _tau, __T = T(), __rho = rhomolar()/1000; if (PHI0dll == NULL){throw ValueError("PHI0dll function is not available in your version of REFPROP. Please upgrade");} PHI0dll(&itau, &idel, &__T, &__rho, &(mole_fractions[0]), &val); - return static_cast(val)/pow(tau,itau); // Not multiplied by delta^idel + return static_cast(val)/pow(static_cast(_delta),idel)/pow(tau,itau); } /// Calculate excess properties void REFPROPMixtureBackend::calc_excess_properties(){ @@ -2290,4 +2290,25 @@ TEST_CASE("Check trivial inputs for REFPROP work", "[REFPROP_trivial]") } } +TEST_CASE("Check PHI0 derivatives", "[REFPROP_PHI0]") +{ + + const int num_inputs = 3; + std::string inputs[num_inputs] = {"DALPHA0_DDELTA_CONSTTAU", "D2ALPHA0_DDELTA2_CONSTTAU", "D3ALPHA0_DDELTA3_CONSTTAU"}; + for (int i = 0; i < num_inputs; ++i){ + std::ostringstream ss; + ss << "Check " << inputs[i]; + SECTION(ss.str(),"") + { + double cp_val = CoolProp::PropsSI(inputs[i],"P",101325,"T",298,"HEOS::Water"); + double rp_val = CoolProp::PropsSI(inputs[i],"P",101325,"T",298,"REFPROP::Water"); + + std::string errstr = CoolProp::get_global_param_string("errstring"); + CAPTURE(errstr); + double err = std::abs((cp_val - rp_val)/cp_val); + CHECK(err < 1e-12); + } + } +} + #endif diff --git a/src/DataStructures.cpp b/src/DataStructures.cpp index 5760051e..38f42339 100644 --- a/src/DataStructures.cpp +++ b/src/DataStructures.cpp @@ -96,6 +96,8 @@ const parameter_info parameter_info_list[] = { {ialpha0, "alpha0", "O", "-", "Ideal Helmholtz energy", false}, {idalpha0_dtau_constdelta, "dalpha0_dtau_constdelta", "O", "-", "Derivative of ideal Helmholtz energy with tau",false}, {idalpha0_ddelta_consttau, "dalpha0_ddelta_consttau", "O", "-", "Derivative of ideal Helmholtz energy with delta",false}, + {id2alpha0_ddelta2_consttau, "d2alpha0_ddelta2_consttau", "O", "-", "Second derivative of ideal Helmholtz energy with delta",false}, + {id3alpha0_ddelta3_consttau, "d3alpha0_ddelta3_consttau", "O", "-", "Third derivative of ideal Helmholtz energy with delta",false}, {iPhase, "Phase", "O", "-", "Phase index as a float", false},