Support mass and molar inputs to TTSE and BICUBIC; see #634

Added test as well
This commit is contained in:
Ian Bell
2015-05-05 20:02:32 -06:00
parent fc4d9c2aeb
commit a20824b5df
2 changed files with 55 additions and 6 deletions

View File

@@ -409,7 +409,34 @@ TEST_CASE_METHOD(TabularFixture, "Tests for tabular backends with water", "[Tabu
CHECK(std::abs((expected-actual_TTSE)/expected) < 1e-6);
CHECK(std::abs((expected-actual_BICUBIC)/expected) < 1e-6);
}
SECTION("first_partial_deriv dHmass/dT|P"){
setup();
ASHEOS->update(CoolProp::PT_INPUTS, 101325, 300);
double expected = ASHEOS->cpmass();
ASTTSE->update(CoolProp::PT_INPUTS, 101325, 300);
double dhdT_TTSE = ASTTSE->first_partial_deriv(CoolProp::iHmass, CoolProp::iT, CoolProp::iP);
ASBICUBIC->update(CoolProp::PT_INPUTS, 101325, 300);
double dhdT_BICUBIC = ASBICUBIC->first_partial_deriv(CoolProp::iHmass, CoolProp::iT, CoolProp::iP);
CAPTURE(expected);
CAPTURE(dhdT_TTSE);
CAPTURE(dhdT_BICUBIC);
CHECK(std::abs((expected-dhdT_TTSE)/expected) < 1e-4);
CHECK(std::abs((expected-dhdT_BICUBIC)/expected) < 1e-4);
}
SECTION("first_partial_deriv dHmolar/dT|P"){
setup();
ASHEOS->update(CoolProp::PT_INPUTS, 101325, 300);
double expected = ASHEOS->cpmolar();
ASTTSE->update(CoolProp::PT_INPUTS, 101325, 300);
double dhdT_TTSE = ASTTSE->first_partial_deriv(CoolProp::iHmolar, CoolProp::iT, CoolProp::iP);
ASBICUBIC->update(CoolProp::PT_INPUTS, 101325, 300);
double dhdT_BICUBIC = ASBICUBIC->first_partial_deriv(CoolProp::iHmolar, CoolProp::iT, CoolProp::iP);
CAPTURE(expected);
CAPTURE(dhdT_TTSE);
CAPTURE(dhdT_BICUBIC);
CHECK(std::abs((expected-dhdT_TTSE)/expected) < 1e-4);
CHECK(std::abs((expected-dhdT_BICUBIC)/expected) < 1e-4);
}
}
#endif // ENABLE_CATCH

View File

@@ -25,6 +25,25 @@
namespace CoolProp{
/// Get a conversion factor from mass to molar if needed
inline void mass_to_molar(parameters &param, double &conversion_factor, double molar_mass){
switch(param){
case iDmass: conversion_factor = molar_mass; param = iDmolar; break;
case iHmass: conversion_factor = 1/molar_mass; param = iHmolar; break;
case iSmass: conversion_factor = 1/molar_mass; param = iSmolar; break;
case iUmass: conversion_factor = 1/molar_mass; param = iUmolar; break;
case iDmolar:
case iHmolar:
case iSmolar:
case iUmolar:
case iT:
case iP:
return;
default:
throw ValueError("I don't know how to convert this parameter");
}
}
/** \brief This class holds the data for a two-phase table that is log spaced in p
*
* It contains very few members or methods, mostly it just holds the data
@@ -722,6 +741,12 @@ class TabularBackend : public AbstractState
CoolPropDbl calc_first_partial_deriv(parameters Of, parameters Wrt, parameters Constant){
if (using_single_phase_table){
CoolPropDbl dOf_dx, dOf_dy, dWrt_dx, dWrt_dy, dConstant_dx, dConstant_dy;
// If a mass-based parameter is provided, get a conversion factor and change the key to the molar-based key
double Of_conversion_factor = 1.0, Wrt_conversion_factor = 1.0, Constant_conversion_factor = 1.0;
mass_to_molar(Of, Of_conversion_factor, AS->molar_mass());
mass_to_molar(Wrt, Wrt_conversion_factor, AS->molar_mass());
mass_to_molar(Constant, Constant_conversion_factor, AS->molar_mass());
switch(selected_table){
case SELECTED_PH_TABLE: {
@@ -744,11 +769,8 @@ class TabularBackend : public AbstractState
}
case SELECTED_NO_TABLE: throw ValueError("table not selected");
}
return (dOf_dx*dConstant_dy-dOf_dy*dConstant_dx)/(dWrt_dx*dConstant_dy-dWrt_dy*dConstant_dx);
//return 1/(evaluate_single_phase_phmolar_derivative(iT,cached_single_phase_i, cached_single_phase_j,1,0));
double val = (dOf_dx*dConstant_dy-dOf_dy*dConstant_dx)/(dWrt_dx*dConstant_dy-dWrt_dy*dConstant_dx);
return val*Of_conversion_factor/Wrt_conversion_factor;
}
else{
return pure_saturation.evaluate(iconductivity, _p, _Q, cached_saturation_iL, cached_saturation_iV);