diff --git a/dev/fluids/Ethane.json b/dev/fluids/Ethane.json index f41a6c7f..554b2a96 100644 --- a/dev/fluids/Ethane.json +++ b/dev/fluids/Ethane.json @@ -414,5 +414,20 @@ "rhoVtriple_units": "mol/m^3" } ], - "NAME": "Ethane" + "NAME": "Ethane", + "TRANSPORT": { + "viscosity": { + "BibTeX": "Friend-JPCRD-1991", + "dilute": { + "hardcoded": "Ethane" + }, + "epsilon_over_k": 245.0, + "epsilon_over_k_units": "K", + "higher_order": { + "hardcoded": "Ethane" + }, + "sigma_eta": 4.3682e-10, + "sigma_eta_units": "m" + } + } } \ No newline at end of file diff --git a/include/CoolPropFluid.h b/include/CoolPropFluid.h index 7987e33f..595fc05d 100644 --- a/include/CoolPropFluid.h +++ b/include/CoolPropFluid.h @@ -63,12 +63,16 @@ struct ViscosityDiluteVariables enum ViscosityDiluteEnum {VISCOSITY_DILUTE_COLLISION_INTEGRAL, VISCOSITY_DILUTE_COLLISION_INTEGRAL_POWERS_OF_TSTAR, VISCOSITY_DILUTE_KINETIC_THEORY, - VISCOSITY_DILUTE_POWERS_OF_T + VISCOSITY_DILUTE_ETHANE, + VISCOSITY_DILUTE_POWERS_OF_T, + VISCOSITY_DILUTE_NOT_SET }; int type; ViscosityDiluteGasCollisionIntegralData collision_integral; ViscosityDiluteCollisionIntegralPowersOfTstarData collision_integral_powers_of_Tstar; ViscosityDiluteGasPowersOfT powers_of_T; + + ViscosityDiluteVariables(){type = VISCOSITY_DILUTE_NOT_SET;} }; struct ViscosityRainWaterFriendData @@ -96,6 +100,7 @@ struct ViscosityHigherOrderVariables enum ViscosityDiluteEnum {VISCOSITY_HIGHER_ORDER_BATSCHINKI_HILDEBRAND, VISCOSITY_HIGHER_ORDER_HYDROGEN, VISCOSITY_HIGHER_ORDER_HEXANE, + VISCOSITY_HIGHER_ORDER_ETHANE, VISCOSITY_HIGHER_ORDER_FRICTION_THEORY, VISCOSITY_HIGHER_ORDER_NOT_SET }; diff --git a/src/Backends/Helmholtz/Fluids/FluidLibrary.h b/src/Backends/Helmholtz/Fluids/FluidLibrary.h index 9f425862..9fa46687 100644 --- a/src/Backends/Helmholtz/Fluids/FluidLibrary.h +++ b/src/Backends/Helmholtz/Fluids/FluidLibrary.h @@ -260,6 +260,12 @@ protected: /// Parse the transport properties void parse_dilute_viscosity(rapidjson::Value &dilute, CoolPropFluid & fluid) { + if (dilute.HasMember("hardcoded")){ + std::string target = cpjson::get_string(dilute, "hardcoded"); + if (!target.compare("Ethane")){ + fluid.transport.viscosity_dilute.type = CoolProp::ViscosityDiluteVariables::VISCOSITY_DILUTE_ETHANE; return; + } + } std::string type = cpjson::get_string(dilute, "type"); if (!type.compare("collision_integral")){ // Get a reference to the entry in the fluid instance @@ -328,12 +334,13 @@ protected: if (higher.HasMember("hardcoded")){ std::string target = cpjson::get_string(higher,"hardcoded"); if (!target.compare("Hydrogen")){ - fluid.transport.viscosity_higher_order.type = CoolProp::ViscosityHigherOrderVariables::VISCOSITY_HIGHER_ORDER_HYDROGEN; - return; + fluid.transport.viscosity_higher_order.type = CoolProp::ViscosityHigherOrderVariables::VISCOSITY_HIGHER_ORDER_HYDROGEN; return; } else if (!target.compare("n-Hexane")){ - fluid.transport.viscosity_higher_order.type = CoolProp::ViscosityHigherOrderVariables::VISCOSITY_HIGHER_ORDER_HEXANE; - return; + fluid.transport.viscosity_higher_order.type = CoolProp::ViscosityHigherOrderVariables::VISCOSITY_HIGHER_ORDER_HEXANE; return; + } + else if (!target.compare("Ethane")){ + fluid.transport.viscosity_higher_order.type = CoolProp::ViscosityHigherOrderVariables::VISCOSITY_HIGHER_ORDER_ETHANE; return; } else{ throw ValueError(format("hardcoded higher order viscosity term [%s] is not understood for fluid %s",target.c_str(), fluid.name.c_str())); diff --git a/src/Backends/Helmholtz/HelmholtzEOSMixtureBackend.cpp b/src/Backends/Helmholtz/HelmholtzEOSMixtureBackend.cpp index 997092e1..093b51a6 100644 --- a/src/Backends/Helmholtz/HelmholtzEOSMixtureBackend.cpp +++ b/src/Backends/Helmholtz/HelmholtzEOSMixtureBackend.cpp @@ -158,6 +158,8 @@ long double HelmholtzEOSMixtureBackend::calc_viscosity(void) eta_dilute = TransportRoutines::viscosity_dilute_powers_of_T(*this); break; case ViscosityDiluteVariables::VISCOSITY_DILUTE_COLLISION_INTEGRAL_POWERS_OF_TSTAR: eta_dilute = TransportRoutines::viscosity_dilute_collision_integral_powers_of_T(*this); break; + case ViscosityDiluteVariables::VISCOSITY_DILUTE_ETHANE: + eta_dilute = TransportRoutines::viscosity_dilute_ethane(*this); break; default: throw ValueError(format("dilute viscosity type [%d] is invalid for fluid %s", components[0]->transport.viscosity_dilute.type, name().c_str())); } @@ -179,7 +181,8 @@ long double HelmholtzEOSMixtureBackend::calc_viscosity(void) delta_eta_h = TransportRoutines::viscosity_hydrogen_higher_order_hardcoded(*this); break; case ViscosityHigherOrderVariables::VISCOSITY_HIGHER_ORDER_HEXANE: delta_eta_h = TransportRoutines::viscosity_hexane_higher_order_hardcoded(*this); break; - + case ViscosityHigherOrderVariables::VISCOSITY_HIGHER_ORDER_ETHANE: + delta_eta_h = TransportRoutines::viscosity_ethane_higher_order_hardcoded(*this); break; default: throw ValueError(format("higher order viscosity type [%d] is invalid for fluid %s", components[0]->transport.viscosity_dilute.type, name().c_str())); } diff --git a/src/Backends/Helmholtz/TransportRoutines.cpp b/src/Backends/Helmholtz/TransportRoutines.cpp index a23ec1ef..5ce36ef4 100644 --- a/src/Backends/Helmholtz/TransportRoutines.cpp +++ b/src/Backends/Helmholtz/TransportRoutines.cpp @@ -415,4 +415,34 @@ long double TransportRoutines::viscosity_R23_hardcoded(HelmholtzEOSMixtureBacken return (pow((rhoL-rhobar)/rhoL,C1)*eta_DG+pow(rhobar/rhoL,C1)*eta_L+DELTAeta_c)/1e6; } +long double TransportRoutines::viscosity_dilute_ethane(HelmholtzEOSMixtureBackend &HEOS) +{ + double C[] = {0, -3.0328138281, 16.918880086, -37.189364917, 41.288861858, -24.615921140, 8.9488430959, -1.8739245042, 0.20966101390, -9.6570437074e-3}; + double OMEGA_2_2 = 0, e_k = 245, sigma = 0.43682, Tstar; + + Tstar = HEOS.T()/e_k; + for (int i = 1; i<= 9; i++) + { + OMEGA_2_2 += C[i]*pow(Tstar,(i-1)/3.0-1); + } + + return 12.0085*sqrt(Tstar)*OMEGA_2_2/1e6; //[Pa-s] +} +long double TransportRoutines::viscosity_ethane_higher_order_hardcoded(HelmholtzEOSMixtureBackend &HEOS) +{ + double r[] = {0,1,1,2,2,2,3,3,4,4,1,1}; + double s[] = {0,0,1,0,1,1.5,0,2,0,1,0,1}; + double g[] = {0, 0.47177003, -0.23950311, 0.39808301, -0.27343335, 0.35192260, -0.21101308, -0.00478579, 0.07378129, -0.030435255, -0.30435286, 0.001215675}; + + double sum1 = 0, sum2 = 0, tau = 305.33/HEOS.T(), delta = HEOS.rhomolar()/6870; + + for (int i = 1; i<= 9; ++i){ + sum1 += g[i]*pow(delta,r[i])*pow(tau,s[i]); + } + for (int i = 10; i<= 11; ++i){ + sum2 += g[i]*pow(delta,r[i])*pow(tau,s[i]); + } + return 15.977*sum1/(1+sum2)/1e6; +} + }; /* namespace CoolProp */ \ No newline at end of file diff --git a/src/Backends/Helmholtz/TransportRoutines.h b/src/Backends/Helmholtz/TransportRoutines.h index e291c9d6..978eeb0c 100644 --- a/src/Backends/Helmholtz/TransportRoutines.h +++ b/src/Backends/Helmholtz/TransportRoutines.h @@ -82,6 +82,9 @@ public: */ static long double viscosity_higher_order_modified_Batschinski_Hildebrand(HelmholtzEOSMixtureBackend &HEOS); + static long double viscosity_dilute_ethane(HelmholtzEOSMixtureBackend &HEOS); + static long double viscosity_ethane_higher_order_hardcoded(HelmholtzEOSMixtureBackend &HEOS); + static long double viscosity_water_hardcoded(HelmholtzEOSMixtureBackend &HEOS); static long double viscosity_helium_hardcoded(HelmholtzEOSMixtureBackend &HEOS); diff --git a/src/Tests/CoolProp-Tests.cpp b/src/Tests/CoolProp-Tests.cpp index 60c546f0..e6b16196 100644 --- a/src/Tests/CoolProp-Tests.cpp +++ b/src/Tests/CoolProp-Tests.cpp @@ -183,6 +183,11 @@ vel("Helium", "T", 400, "P", 0.180e6, "V", 24.29e-6, 1e-2), vel("R23", "T", 180, "Dmolar", 21097, "V", 353.88e-6, 1e-4), vel("R23", "T", 420, "Dmolar", 7564, "V", 39.459e-6, 1e-4), vel("R23", "T", 370, "Dmolar", 32.62, "V", 18.213e-6, 1e-4), + +// From Friend, JPCRD, 1991 +vel("Ethane", "T", 100, "Dmolar", 21330, "V", 878.6e-6, 1e-2), +vel("Ethane", "T", 430, "Dmolar", 12780, "V", 58.70e-6, 1e-2), +vel("Ethane", "T", 500, "Dmolar", 11210, "V", 48.34e-6, 1e-2), }; class ViscosityValidationFixture