mirror of
https://github.com/CoolProp/CoolProp.git
synced 2026-02-08 12:55:16 -05:00
ECS conductivity work - nearly works, just need to sort out the conformal state solver.
Goodbye to AbstractStateWrapper - can use std::tr1::shared_ptr, much nicer Signed-off-by: Ian Bell <ian.h.bell@gmail.com>
This commit is contained in:
@@ -332,28 +332,7 @@ TEST_CASE("Check AbstractState","[AbstractState]")
|
||||
{
|
||||
SECTION("bad backend")
|
||||
{
|
||||
CoolProp::AbstractStateWrapper Water;
|
||||
CHECK_THROWS(Water.set("DEFINITELY_A_BAD_BACKEND", "Water"));
|
||||
}
|
||||
}
|
||||
|
||||
TEST_CASE("Check AbstractStateWrapper","[AbstractStateWrapper]")
|
||||
{
|
||||
SECTION("empty on init")
|
||||
{
|
||||
CoolProp::AbstractStateWrapper Water;
|
||||
CHECK_NOTHROW(Water.empty());
|
||||
CHECK(Water.empty() == true);
|
||||
CHECK_THROWS(Water.update(CoolProp::QT_INPUTS,1,300));
|
||||
}
|
||||
SECTION("initialized")
|
||||
{
|
||||
CoolProp::AbstractStateWrapper Water;
|
||||
CHECK_NOTHROW(Water.empty());
|
||||
CHECK(Water.empty() == true);
|
||||
Water.set("HEOS", "Water");
|
||||
CHECK(Water.empty() == false);
|
||||
CHECK_NOTHROW(Water.update(CoolProp::QT_INPUTS,1,300));
|
||||
CHECK_THROWS(std::tr1::shared_ptr<CoolProp::AbstractState> Water(CoolProp::AbstractState::factory("DEFINITELY_A_BAD_BACKEND", "Water")));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -437,6 +437,21 @@ protected:
|
||||
}
|
||||
};
|
||||
|
||||
void parse_ECS_conductivity(rapidjson::Value &conductivity, CoolPropFluid & fluid)
|
||||
{
|
||||
fluid.transport.conductivity_ecs.reference_fluid = cpjson::get_string(conductivity,"reference_fluid");
|
||||
|
||||
// Parameters for correction polynomials
|
||||
fluid.transport.conductivity_ecs.psi_a = cpjson::get_long_double_array(conductivity["psi"]["a"]);
|
||||
fluid.transport.conductivity_ecs.psi_t = cpjson::get_long_double_array(conductivity["psi"]["t"]);
|
||||
fluid.transport.conductivity_ecs.psi_rhomolar_reducing = cpjson::get_double(conductivity["psi"],"rhomolar_reducing");
|
||||
fluid.transport.conductivity_ecs.f_int_a = cpjson::get_long_double_array(conductivity["f_int"]["a"]);
|
||||
fluid.transport.conductivity_ecs.f_int_t = cpjson::get_long_double_array(conductivity["f_int"]["t"]);
|
||||
fluid.transport.conductivity_ecs.f_int_T_reducing = cpjson::get_double(conductivity["f_int"],"T_reducing");
|
||||
|
||||
fluid.transport.conductivity_using_ECS = true;
|
||||
}
|
||||
|
||||
void parse_ECS_viscosity(rapidjson::Value &viscosity, CoolPropFluid & fluid)
|
||||
{
|
||||
fluid.transport.viscosity_ecs.reference_fluid = cpjson::get_string(viscosity,"reference_fluid");
|
||||
@@ -446,7 +461,7 @@ protected:
|
||||
fluid.transport.viscosity_ecs.psi_t = cpjson::get_long_double_array(viscosity["psi"]["t"]);
|
||||
fluid.transport.viscosity_ecs.psi_rhomolar_reducing = cpjson::get_double(viscosity["psi"],"rhomolar_reducing");
|
||||
|
||||
fluid.transport.using_ECS = true;
|
||||
fluid.transport.viscosity_using_ECS = true;
|
||||
}
|
||||
|
||||
/// Parse the transport properties
|
||||
@@ -635,6 +650,12 @@ protected:
|
||||
/// Parse the thermal conductivity data
|
||||
void parse_thermal_conductivity(rapidjson::Value &conductivity, CoolPropFluid & fluid)
|
||||
{
|
||||
// If it is using ECS, set ECS parameters and quit
|
||||
if (conductivity.HasMember("type") && !cpjson::get_string(conductivity, "type").compare("ECS")){
|
||||
parse_ECS_conductivity(conductivity, fluid);
|
||||
return;
|
||||
}
|
||||
|
||||
if (conductivity.HasMember("hardcoded")){
|
||||
std::string target = cpjson::get_string(conductivity, "hardcoded");
|
||||
if (!target.compare("Water")){
|
||||
|
||||
@@ -199,9 +199,14 @@ long double HelmholtzEOSMixtureBackend::calc_viscosity(void)
|
||||
CoolPropFluid &component = *(components[0]);
|
||||
|
||||
// Check if using ECS
|
||||
if (component.transport.using_ECS)
|
||||
if (component.transport.viscosity_using_ECS)
|
||||
{
|
||||
return TransportRoutines::viscosity_ECS(*this, *this);
|
||||
// Get reference fluid name
|
||||
std::string fluid_name = component.transport.viscosity_ecs.reference_fluid;
|
||||
// Get a managed pointer to the reference fluid for ECS
|
||||
std::tr1::shared_ptr<HelmholtzEOSMixtureBackend> ref_fluid(new HelmholtzEOSMixtureBackend(std::vector<std::string>(1, fluid_name)));
|
||||
// Get the viscosity using ECS
|
||||
return TransportRoutines::viscosity_ECS(*this, *(ref_fluid.get()));
|
||||
}
|
||||
|
||||
if (component.transport.hardcoded_viscosity != CoolProp::TransportPropertyData::VISCOSITY_NOT_HARDCODED)
|
||||
@@ -234,13 +239,42 @@ long double HelmholtzEOSMixtureBackend::calc_viscosity(void)
|
||||
throw NotImplementedError(format("viscosity not implemented for mixtures"));
|
||||
}
|
||||
}
|
||||
long double HelmholtzEOSMixtureBackend::calc_conductivity_background(void)
|
||||
{
|
||||
// Residual part
|
||||
long double lambda_residual = _HUGE;
|
||||
switch(components[0]->transport.conductivity_residual.type)
|
||||
{
|
||||
case ConductivityResidualVariables::CONDUCTIVITY_RESIDUAL_POLYNOMIAL:
|
||||
lambda_residual = TransportRoutines::conductivity_residual_polynomial(*this); break;
|
||||
case ConductivityResidualVariables::CONDUCTIVITY_RESIDUAL_POLYNOMIAL_AND_EXPONENTIAL:
|
||||
lambda_residual = TransportRoutines::conductivity_residual_polynomial_and_exponential(*this); break;
|
||||
default:
|
||||
throw ValueError(format("residual conductivity type [%d] is invalid for fluid %s", components[0]->transport.conductivity_residual.type, name().c_str()));
|
||||
}
|
||||
return lambda_residual;
|
||||
}
|
||||
long double HelmholtzEOSMixtureBackend::calc_conductivity(void)
|
||||
{
|
||||
if (is_pure_or_pseudopure)
|
||||
{
|
||||
if (components[0]->transport.hardcoded_conductivity != CoolProp::TransportPropertyData::CONDUCTIVITY_NOT_HARDCODED)
|
||||
// Get a reference for code cleanness
|
||||
CoolPropFluid &component = *(components[0]);
|
||||
|
||||
// Check if using ECS
|
||||
if (component.transport.conductivity_using_ECS)
|
||||
{
|
||||
switch(components[0]->transport.hardcoded_conductivity)
|
||||
// Get reference fluid name
|
||||
std::string fluid_name = component.transport.conductivity_ecs.reference_fluid;
|
||||
// Get a managed pointer to the reference fluid for ECS
|
||||
std::tr1::shared_ptr<HelmholtzEOSMixtureBackend> ref_fluid(new HelmholtzEOSMixtureBackend(std::vector<std::string>(1, fluid_name)));
|
||||
// Get the viscosity using ECS
|
||||
return TransportRoutines::conductivity_ECS(*this, *(ref_fluid.get()));
|
||||
}
|
||||
|
||||
if (component.transport.hardcoded_conductivity != CoolProp::TransportPropertyData::CONDUCTIVITY_NOT_HARDCODED)
|
||||
{
|
||||
switch(component.transport.hardcoded_conductivity)
|
||||
{
|
||||
case CoolProp::TransportPropertyData::CONDUCTIVITY_HARDCODED_WATER:
|
||||
return TransportRoutines::conductivity_hardcoded_water(*this);
|
||||
@@ -255,7 +289,7 @@ long double HelmholtzEOSMixtureBackend::calc_conductivity(void)
|
||||
|
||||
// Dilute part
|
||||
long double lambda_dilute = _HUGE;
|
||||
switch(components[0]->transport.conductivity_dilute.type)
|
||||
switch(component.transport.conductivity_dilute.type)
|
||||
{
|
||||
case ConductivityDiluteVariables::CONDUCTIVITY_DILUTE_RATIO_POLYNOMIALS:
|
||||
lambda_dilute = TransportRoutines::conductivity_dilute_ratio_polynomials(*this); break;
|
||||
@@ -269,21 +303,11 @@ long double HelmholtzEOSMixtureBackend::calc_conductivity(void)
|
||||
throw ValueError(format("dilute conductivity type [%d] is invalid for fluid %s", components[0]->transport.conductivity_dilute.type, name().c_str()));
|
||||
}
|
||||
|
||||
// Residual part
|
||||
long double lambda_residual = _HUGE;
|
||||
switch(components[0]->transport.conductivity_residual.type)
|
||||
{
|
||||
case ConductivityResidualVariables::CONDUCTIVITY_RESIDUAL_POLYNOMIAL:
|
||||
lambda_residual = TransportRoutines::conductivity_residual_polynomial(*this); break;
|
||||
case ConductivityResidualVariables::CONDUCTIVITY_RESIDUAL_POLYNOMIAL_AND_EXPONENTIAL:
|
||||
lambda_residual = TransportRoutines::conductivity_residual_polynomial_and_exponential(*this); break;
|
||||
default:
|
||||
throw ValueError(format("residual conductivity type [%d] is invalid for fluid %s", components[0]->transport.conductivity_residual.type, name().c_str()));
|
||||
}
|
||||
long double lambda_residual = calc_conductivity_background();
|
||||
|
||||
// Critical part
|
||||
long double lambda_critical = _HUGE;
|
||||
switch(components[0]->transport.conductivity_critical.type)
|
||||
switch(component.transport.conductivity_critical.type)
|
||||
{
|
||||
case ConductivityCriticalVariables::CONDUCTIVITY_CRITICAL_SIMPLIFIED_OLCHOWY_SENGERS:
|
||||
lambda_critical = TransportRoutines::conductivity_critical_simplified_Olchowy_Sengers(*this); break;
|
||||
@@ -1305,7 +1329,7 @@ long double HelmholtzEOSMixtureBackend::solver_rho_Tp(long double T, long double
|
||||
if (!ValidNumber(rhomolar)){throw ValueError();}
|
||||
return rhomolar;
|
||||
}
|
||||
catch(std::exception &e)
|
||||
catch(std::exception &)
|
||||
{
|
||||
try{
|
||||
// Next we try with Secant method
|
||||
@@ -1313,7 +1337,7 @@ long double HelmholtzEOSMixtureBackend::solver_rho_Tp(long double T, long double
|
||||
if (!ValidNumber(rhomolar)){throw ValueError();}
|
||||
return rhomolar;
|
||||
}
|
||||
catch(std::exception &e)
|
||||
catch(std::exception &)
|
||||
{
|
||||
Secant(resid, rhomolar_guess, 0.0001*rhomolar_guess, 1e-8, 100, errstring);
|
||||
return _HUGE;
|
||||
@@ -1538,6 +1562,19 @@ long double HelmholtzEOSMixtureBackend::calc_cpmolar(void)
|
||||
|
||||
return static_cast<double>(_cpmolar);
|
||||
}
|
||||
long double HelmholtzEOSMixtureBackend::calc_cpmolar_idealgas(void)
|
||||
{
|
||||
// Calculate the reducing parameters
|
||||
_delta = _rhomolar/_reducing.rhomolar;
|
||||
_tau = _reducing.T/_T;
|
||||
|
||||
// Calculate derivatives if needed, or just use cached values
|
||||
long double d2a0_dTau2 = d2alpha0_dTau2();
|
||||
long double R_u = static_cast<double>(_gas_constant);
|
||||
|
||||
// Get cp of the ideal gas
|
||||
return R_u*-pow(_tau.pt(),2)*d2a0_dTau2;
|
||||
}
|
||||
long double HelmholtzEOSMixtureBackend::calc_speed_sound(void)
|
||||
{
|
||||
// Calculate the reducing parameters
|
||||
|
||||
@@ -93,6 +93,7 @@ public:
|
||||
long double calc_pressure(void);
|
||||
long double calc_cvmolar(void);
|
||||
long double calc_cpmolar(void);
|
||||
long double calc_cpmolar_idealgas(void);
|
||||
long double calc_hmolar(void);
|
||||
long double calc_smolar(void);
|
||||
long double calc_pressure_nocache(long double T, long double rhomolar);
|
||||
@@ -123,6 +124,7 @@ public:
|
||||
long double calc_viscosity_background(void);
|
||||
long double calc_viscosity_background(long double eta_dilute);
|
||||
long double calc_conductivity(void);
|
||||
long double calc_conductivity_background(void);
|
||||
|
||||
long double calc_Tmax(void);
|
||||
long double calc_pmax(void);
|
||||
|
||||
@@ -542,7 +542,7 @@ long double TransportRoutines::conductivity_critical_simplified_Olchowy_Sengers(
|
||||
double Xref = Pcrit/pow(rhoc, 2)*HEOS.rhomolar()/dp_drho_ref*Tref/HEOS.T();
|
||||
num = X - Xref;
|
||||
|
||||
// no critical enhancement if numerator is negative, zero, or just a tiny bit positive due to roundoff
|
||||
// No critical enhancement if numerator is negative, zero, or just a tiny bit positive due to roundoff
|
||||
// See also Lemmon, IJT, 2004, page 27
|
||||
if (num < DBL_EPSILON*10)
|
||||
return 0.0;
|
||||
@@ -827,21 +827,18 @@ long double TransportRoutines::viscosity_ECS(HelmholtzEOSMixtureBackend &HEOS, H
|
||||
rhocmolar = HEOS.rhomolar_critical(),
|
||||
rhocmolar0 = HEOS_Reference.rhomolar_critical();
|
||||
|
||||
// Get a reference to the ECS data
|
||||
CoolProp::ViscosityECSVariables &ECS = HEOS.components[0]->transport.viscosity_ecs;
|
||||
|
||||
std::vector<long double> &a = ECS.psi_a, &t = ECS.psi_t;
|
||||
|
||||
// The correction polynomial psi_eta
|
||||
double psi = 0;
|
||||
for (std::size_t i=0; i < a.size(); i++)
|
||||
psi += a[i]*pow(HEOS.rhomolar()/ECS.psi_rhomolar_reducing, t[i]);
|
||||
for (std::size_t i=0; i < ECS.psi_a.size(); i++){
|
||||
psi += ECS.psi_a[i]*pow(HEOS.rhomolar()/ECS.psi_rhomolar_reducing, ECS.psi_t[i]);
|
||||
}
|
||||
|
||||
// The dilute gas portion for the fluid of interest [Pa-s]
|
||||
long double eta_dilute = viscosity_dilute_kinetic_theory(HEOS);
|
||||
|
||||
// Calculate the correction polynomial
|
||||
|
||||
|
||||
/// \todo To be solved for...
|
||||
// TODO: To be solved for...
|
||||
long double theta = 1;
|
||||
@@ -869,4 +866,76 @@ long double TransportRoutines::viscosity_ECS(HelmholtzEOSMixtureBackend &HEOS, H
|
||||
|
||||
return eta;
|
||||
}
|
||||
|
||||
long double TransportRoutines::conductivity_ECS(HelmholtzEOSMixtureBackend &HEOS, HelmholtzEOSMixtureBackend &HEOS_Reference)
|
||||
{
|
||||
// Collect some parameters
|
||||
long double M = HEOS.molar_mass(),
|
||||
M_kmol = M*1000,
|
||||
M0 = HEOS_Reference.molar_mass(),
|
||||
Tc = HEOS.T_critical(),
|
||||
Tc0 = HEOS_Reference.T_critical(),
|
||||
rhocmolar = HEOS.rhomolar_critical(),
|
||||
rhocmolar0 = HEOS_Reference.rhomolar_critical(),
|
||||
R_u = HEOS.gas_constant(),
|
||||
R = HEOS.gas_constant()/HEOS.molar_mass(), //[J/kg/K]
|
||||
R_kJkgK = R_u/M_kmol;
|
||||
|
||||
// Get a reference to the ECS data
|
||||
CoolProp::ConductivityECSVariables &ECS = HEOS.components[0]->transport.conductivity_ecs;
|
||||
|
||||
// The correction polynomial psi_eta in rho/rho_red
|
||||
double psi = 0;
|
||||
for (std::size_t i=0; i < ECS.psi_a.size(); ++i){
|
||||
psi += ECS.psi_a[i]*pow(HEOS.rhomolar()/ECS.psi_rhomolar_reducing, ECS.psi_t[i]);
|
||||
}
|
||||
|
||||
// The correction polynomial f_int in T/T_red
|
||||
double fint = 0;
|
||||
for (std::size_t i=0; i < ECS.f_int_a.size(); ++i){
|
||||
fint += ECS.f_int_a[i]*pow(HEOS.T()/ECS.f_int_T_reducing, ECS.f_int_t[i]);
|
||||
}
|
||||
|
||||
// The dilute gas density for the fluid of interest [uPa-s]
|
||||
long double eta_dilute = viscosity_dilute_kinetic_theory(HEOS)*1e6;
|
||||
|
||||
// The mass specific ideal gas constant-pressure specific heat [J/kg/K]
|
||||
long double cp0 = HEOS.calc_cpmolar_idealgas()/HEOS.molar_mass();
|
||||
|
||||
// The internal contribution to the thermal conductivity [W/m/K]
|
||||
long double lambda_int = fint*eta_dilute*(cp0 - 2.5*R)/1e3;
|
||||
|
||||
// The dilute gas contribution to the thermal conductivity [W/m/K]
|
||||
long double lambda_dilute = 15.0e-3/4.0*R_kJkgK*eta_dilute;
|
||||
|
||||
/// \todo To be solved for...
|
||||
// TODO: To be solved for...
|
||||
long double theta = 1;
|
||||
long double phi = 1;
|
||||
|
||||
// The equivalent substance reducing ratios
|
||||
long double f = Tc/Tc0*theta;
|
||||
long double h = rhocmolar0/rhocmolar*phi; // Must be the ratio of MOLAR densities!!
|
||||
|
||||
// To be solved for
|
||||
long double T0 = HEOS.T()/f;
|
||||
long double rhomolar0 = HEOS.rhomolar()*h;
|
||||
|
||||
// Update the reference fluid with the conformal state
|
||||
HEOS_Reference.update(DmolarT_INPUTS, rhomolar0*psi, T0);
|
||||
|
||||
// The reference fluid's contribution to the conductivity [W/m/K]
|
||||
long double lambda_resid = HEOS_Reference.calc_conductivity_background();
|
||||
|
||||
// The F factor
|
||||
long double F_lambda = sqrt(f)*pow(h, static_cast<long double>(-2.0/3.0))*sqrt(M0/M);
|
||||
|
||||
// The critical contribution from the fluid of interest [W/m/K]
|
||||
long double lambda_critical = conductivity_critical_simplified_Olchowy_Sengers(HEOS);
|
||||
|
||||
// The total thermal conductivity considering the contributions of the fluid of interest and the reference fluid [Pa-s]
|
||||
long double lambda = lambda_int + lambda_dilute + lambda_resid*F_lambda + lambda_critical;
|
||||
|
||||
return lambda;
|
||||
}
|
||||
}; /* namespace CoolProp */
|
||||
@@ -193,6 +193,8 @@ public:
|
||||
*/
|
||||
static long double viscosity_ECS(HelmholtzEOSMixtureBackend &HEOS, HelmholtzEOSMixtureBackend &HEOS_Reference);
|
||||
|
||||
static long double conductivity_ECS(HelmholtzEOSMixtureBackend &HEOS, HelmholtzEOSMixtureBackend &HEOS_Reference);
|
||||
|
||||
|
||||
}; /* class TransportRoutines */
|
||||
|
||||
|
||||
@@ -16,19 +16,18 @@
|
||||
#include <string.h>
|
||||
#include <iostream>
|
||||
|
||||
CoolProp::AbstractStateWrapper Water;
|
||||
CoolProp::AbstractStateWrapper Air;
|
||||
std::tr1::shared_ptr<CoolProp::AbstractState> Water, Air;
|
||||
|
||||
namespace HumidAir
|
||||
{
|
||||
|
||||
void check_fluid_instantiation()
|
||||
{
|
||||
if (Water.empty()){
|
||||
Water.set("HEOS", "Water");
|
||||
if (!Water.get()){
|
||||
Water.reset(CoolProp::AbstractState::factory("HEOS", "Water"));
|
||||
}
|
||||
if (Air.empty()){
|
||||
Air.set("HEOS", "Air");
|
||||
if (!Air.get()){
|
||||
Air.reset(CoolProp::AbstractState::factory("HEOS", "Air"));
|
||||
}
|
||||
};
|
||||
|
||||
@@ -42,60 +41,60 @@ double f_factor(double T, double p);
|
||||
static double MM_Air(void)
|
||||
{
|
||||
check_fluid_instantiation();
|
||||
return Air.keyed_output(CoolProp::imolar_mass);
|
||||
return Air->keyed_output(CoolProp::imolar_mass);
|
||||
}
|
||||
static double MM_Water(void)
|
||||
{
|
||||
check_fluid_instantiation();
|
||||
return Water.keyed_output(CoolProp::imolar_mass);
|
||||
return Water->keyed_output(CoolProp::imolar_mass);
|
||||
}
|
||||
static double B_Air(double T)
|
||||
{
|
||||
check_fluid_instantiation();
|
||||
Air.update(CoolProp::DmolarT_INPUTS,1e-12,T);
|
||||
return Air.keyed_output(CoolProp::iBvirial);
|
||||
Air->update(CoolProp::DmolarT_INPUTS,1e-12,T);
|
||||
return Air->keyed_output(CoolProp::iBvirial);
|
||||
}
|
||||
static double dBdT_Air(double T)
|
||||
{
|
||||
check_fluid_instantiation();
|
||||
Air.update(CoolProp::DmolarT_INPUTS,1e-12,T);
|
||||
return Air.keyed_output(CoolProp::idBvirial_dT);
|
||||
Air->update(CoolProp::DmolarT_INPUTS,1e-12,T);
|
||||
return Air->keyed_output(CoolProp::idBvirial_dT);
|
||||
}
|
||||
static double B_Water(double T)
|
||||
{
|
||||
check_fluid_instantiation();
|
||||
Water.update(CoolProp::DmolarT_INPUTS,1e-12,T);
|
||||
return Water.keyed_output(CoolProp::iBvirial);
|
||||
Water->update(CoolProp::DmolarT_INPUTS,1e-12,T);
|
||||
return Water->keyed_output(CoolProp::iBvirial);
|
||||
}
|
||||
static double dBdT_Water(double T)
|
||||
{
|
||||
check_fluid_instantiation();
|
||||
Water.update(CoolProp::DmolarT_INPUTS,1e-12,T);
|
||||
return Water.keyed_output(CoolProp::idBvirial_dT);
|
||||
Water->update(CoolProp::DmolarT_INPUTS,1e-12,T);
|
||||
return Water->keyed_output(CoolProp::idBvirial_dT);
|
||||
}
|
||||
static double C_Air(double T)
|
||||
{
|
||||
check_fluid_instantiation();
|
||||
Air.update(CoolProp::DmolarT_INPUTS,1e-12,T);
|
||||
return Air.keyed_output(CoolProp::iCvirial);
|
||||
Air->update(CoolProp::DmolarT_INPUTS,1e-12,T);
|
||||
return Air->keyed_output(CoolProp::iCvirial);
|
||||
}
|
||||
static double dCdT_Air(double T)
|
||||
{
|
||||
check_fluid_instantiation();
|
||||
Air.update(CoolProp::DmolarT_INPUTS,1e-12,T);
|
||||
return Air.keyed_output(CoolProp::idCvirial_dT);
|
||||
Air->update(CoolProp::DmolarT_INPUTS,1e-12,T);
|
||||
return Air->keyed_output(CoolProp::idCvirial_dT);
|
||||
}
|
||||
static double C_Water(double T)
|
||||
{
|
||||
check_fluid_instantiation();
|
||||
Water.update(CoolProp::DmolarT_INPUTS,1e-20,T);
|
||||
return Water.keyed_output(CoolProp::iCvirial);
|
||||
Water->update(CoolProp::DmolarT_INPUTS,1e-20,T);
|
||||
return Water->keyed_output(CoolProp::iCvirial);
|
||||
}
|
||||
static double dCdT_Water(double T)
|
||||
{
|
||||
check_fluid_instantiation();
|
||||
Water.update(CoolProp::DmolarT_INPUTS,1e-12,T);
|
||||
return Water.keyed_output(CoolProp::idCvirial_dT);
|
||||
Water->update(CoolProp::DmolarT_INPUTS,1e-12,T);
|
||||
return Water->keyed_output(CoolProp::idCvirial_dT);
|
||||
}
|
||||
void UseVirialCorrelations(int flag)
|
||||
{
|
||||
@@ -364,7 +363,7 @@ static double dC_m_dT(double T, double psi_w)
|
||||
// NDG for fluid EOS for virial terms
|
||||
Tj=132.6312;
|
||||
tau_Air=Tj/T;
|
||||
tau_Water=Water.keyed_output(CoolProp::iT_reducing)/T;
|
||||
tau_Water=Water->keyed_output(CoolProp::iT_reducing)/T;
|
||||
if (FlagUseVirialCorrelations)
|
||||
{
|
||||
dC_dT_aaa=-2.46582342273e-10 +4.425401935447e-12*T -3.669987371644e-14*pow(T,2) +1.765891183964e-16*pow(T,3) -5.240097805744e-19*pow(T,4) +9.502177003614e-22*pow(T,5) -9.694252610339e-25*pow(T,6) +4.276261986741e-28*pow(T,7);
|
||||
@@ -390,8 +389,8 @@ static double HenryConstant(double T)
|
||||
double p_ws,beta_N2,beta_O2,beta_Ar,beta_a,tau,Tr,Tc=647.096;
|
||||
Tr=T/Tc;
|
||||
tau=1-Tr;
|
||||
Water.update(CoolProp::QT_INPUTS, 1.0, T);
|
||||
p_ws = Water.keyed_output(CoolProp::iP); //[Pa]
|
||||
Water->update(CoolProp::QT_INPUTS, 1.0, T);
|
||||
p_ws = Water->keyed_output(CoolProp::iP); //[Pa]
|
||||
beta_N2=p_ws*exp(-9.67578/Tr+4.72162*pow(tau,0.355)/Tr+11.70585*pow(Tr,-0.41)*exp(tau));
|
||||
beta_O2=p_ws*exp(-9.44833/Tr+4.43822*pow(tau,0.355)/Tr+11.42005*pow(Tr,-0.41)*exp(tau));
|
||||
beta_Ar=p_ws*exp(-8.40954/Tr+4.29587*pow(tau,0.355)/Tr+10.52779*pow(Tr,-0.41)*exp(tau));
|
||||
@@ -411,8 +410,8 @@ double isothermal_compressibility(double T, double p)
|
||||
}
|
||||
else
|
||||
{
|
||||
Water.update(CoolProp::PT_INPUTS, p, T);
|
||||
k_T = Water.keyed_output(CoolProp::iisothermal_compressibility);
|
||||
Water->update(CoolProp::PT_INPUTS, p, T);
|
||||
k_T = Water->keyed_output(CoolProp::iisothermal_compressibility);
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -436,8 +435,8 @@ double f_factor(double T, double p)
|
||||
// It is liquid water
|
||||
p_ws=CoolProp::PropsSI("P","T",T,"Q",0,"Water");
|
||||
beta_H = HenryConstant(T); //[1/Pa]
|
||||
Water.update(CoolProp::PT_INPUTS, p, T);
|
||||
vbar_ws = 1.0/Water.keyed_output(CoolProp::iDmolar); //[m^3/mol]
|
||||
Water->update(CoolProp::PT_INPUTS, p, T);
|
||||
vbar_ws = 1.0/Water->keyed_output(CoolProp::iDmolar); //[m^3/mol]
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -459,7 +458,7 @@ double f_factor(double T, double p)
|
||||
// NDG for fluid EOS for virial terms
|
||||
Tj=132.6312;
|
||||
tau_Air=Tj/T;
|
||||
tau_Water=Water.keyed_output(CoolProp::iT_reducing)/T;
|
||||
tau_Water=Water->keyed_output(CoolProp::iT_reducing)/T;
|
||||
if (FlagUseVirialCorrelations)
|
||||
{
|
||||
B_aa=-0.000721183853646 +1.142682674467e-05*T -8.838228412173e-08*pow(T,2)
|
||||
@@ -560,11 +559,11 @@ double Viscosity(double T, double p, double psi_w)
|
||||
Mw=MM_Water();
|
||||
Ma=MM_Air();
|
||||
// Viscosity of dry air at dry-bulb temp and total pressure
|
||||
Air.update(CoolProp::PT_INPUTS,p,T);
|
||||
mu_a=Air.keyed_output(CoolProp::iviscosity);
|
||||
Air->update(CoolProp::PT_INPUTS,p,T);
|
||||
mu_a=Air->keyed_output(CoolProp::iviscosity);
|
||||
// Viscosity of pure saturated water at dry-bulb temperature
|
||||
Water.update(CoolProp::PQ_INPUTS,p,1);
|
||||
mu_w=Water.keyed_output(CoolProp::iviscosity);
|
||||
Water->update(CoolProp::PQ_INPUTS,p,1);
|
||||
mu_w=Water->keyed_output(CoolProp::iviscosity);
|
||||
Phi_av=sqrt(2.0)/4.0*pow(1+Ma/Mw,-0.5)*pow(1+sqrt(mu_a/mu_w)*pow(Mw/Ma,0.25),2); //[-]
|
||||
Phi_va=sqrt(2.0)/4.0*pow(1+Mw/Ma,-0.5)*pow(1+sqrt(mu_w/mu_a)*pow(Ma/Mw,0.25),2); //[-]
|
||||
return (1-psi_w)*mu_a/((1-psi_w)+psi_w*Phi_av)+psi_w*mu_w/(psi_w+(1-psi_w)*Phi_va);
|
||||
@@ -583,13 +582,13 @@ double Conductivity(double T, double p, double psi_w)
|
||||
Ma=MM_Air();
|
||||
|
||||
// Viscosity of dry air at dry-bulb temp and total pressure
|
||||
Air.update(CoolProp::PT_INPUTS,p,T);
|
||||
mu_a=Air.keyed_output(CoolProp::iviscosity);
|
||||
k_a=Air.keyed_output(CoolProp::iconductivity);
|
||||
Air->update(CoolProp::PT_INPUTS,p,T);
|
||||
mu_a=Air->keyed_output(CoolProp::iviscosity);
|
||||
k_a=Air->keyed_output(CoolProp::iconductivity);
|
||||
// Viscosity of pure saturated water at dry-bulb temperature
|
||||
Water.update(CoolProp::PQ_INPUTS,p,1);
|
||||
mu_w=Water.keyed_output(CoolProp::iviscosity);
|
||||
k_w=Water.keyed_output(CoolProp::iconductivity);
|
||||
Water->update(CoolProp::PQ_INPUTS,p,1);
|
||||
mu_w=Water->keyed_output(CoolProp::iviscosity);
|
||||
k_w=Water->keyed_output(CoolProp::iconductivity);
|
||||
Phi_av=sqrt(2.0)/4.0*pow(1+Ma/Mw,-0.5)*pow(1+sqrt(mu_a/mu_w)*pow(Mw/Ma,0.25),2); //[-]
|
||||
Phi_va=sqrt(2.0)/4.0*pow(1+Mw/Ma,-0.5)*pow(1+sqrt(mu_w/mu_a)*pow(Ma/Mw,0.25),2); //[-]
|
||||
return (1-psi_w)*k_a/((1-psi_w)+psi_w*Phi_av)+psi_w*k_w/(psi_w+(1-psi_w)*Phi_va);
|
||||
@@ -637,19 +636,19 @@ double IdealGasMolarEnthalpy_Water(double T, double vmolar)
|
||||
double hbar_w_0, tau, rhomolar, hbar_w;
|
||||
// Ideal-Gas contribution to enthalpy of water
|
||||
hbar_w_0 = -0.01102303806;//[J/mol]
|
||||
tau = Water.keyed_output(CoolProp::iT_reducing)/T;
|
||||
tau = Water->keyed_output(CoolProp::iT_reducing)/T;
|
||||
rhomolar = 1/vmolar; //[mol/m^3]
|
||||
Water.update(CoolProp::DmolarT_INPUTS, rhomolar, T);
|
||||
hbar_w = hbar_w_0+R_bar*T*(1+tau*Water.keyed_output(CoolProp::idalpha0_dtau_constdelta));
|
||||
Water->update(CoolProp::DmolarT_INPUTS, rhomolar, T);
|
||||
hbar_w = hbar_w_0+R_bar*T*(1+tau*Water->keyed_output(CoolProp::idalpha0_dtau_constdelta));
|
||||
return hbar_w;
|
||||
}
|
||||
double IdealGasMolarEntropy_Water(double T, double p)
|
||||
{
|
||||
double sbar_w, tau, R_bar;
|
||||
R_bar = 8.314371; //[J/mol/K]
|
||||
tau = Water.keyed_output(CoolProp::iT_reducing)/T;
|
||||
Water.update(CoolProp::DmolarT_INPUTS,p/(R_bar*T),T);
|
||||
sbar_w = R_bar*(tau*Water.keyed_output(CoolProp::idalpha0_dtau_constdelta)-Water.keyed_output(CoolProp::ialpha0)); //[kJ/kmol/K]
|
||||
tau = Water->keyed_output(CoolProp::iT_reducing)/T;
|
||||
Water->update(CoolProp::DmolarT_INPUTS,p/(R_bar*T),T);
|
||||
sbar_w = R_bar*(tau*Water->keyed_output(CoolProp::idalpha0_dtau_constdelta)-Water->keyed_output(CoolProp::ialpha0)); //[kJ/kmol/K]
|
||||
return sbar_w;
|
||||
}
|
||||
double IdealGasMolarEnthalpy_Air(double T, double vmolar)
|
||||
@@ -661,9 +660,9 @@ double IdealGasMolarEnthalpy_Air(double T, double vmolar)
|
||||
tau = 132.6312/T;
|
||||
rhomolar = 1/vmolar; //[mol/m^3]
|
||||
R_bar_Lemmon = 8.314510; //[J/mol/K]
|
||||
Air.update(CoolProp::DmolarT_INPUTS, rhomolar, T);
|
||||
double dd = Air.keyed_output(CoolProp::idalpha0_dtau_constdelta);
|
||||
hbar_a = hbar_a_0 + R_bar_Lemmon*T*(1+tau*Air.keyed_output(CoolProp::idalpha0_dtau_constdelta)); //[J/mol]
|
||||
Air->update(CoolProp::DmolarT_INPUTS, rhomolar, T);
|
||||
double dd = Air->keyed_output(CoolProp::idalpha0_dtau_constdelta);
|
||||
hbar_a = hbar_a_0 + R_bar_Lemmon*T*(1+tau*Air->keyed_output(CoolProp::idalpha0_dtau_constdelta)); //[J/mol]
|
||||
return hbar_a;
|
||||
}
|
||||
double IdealGasMolarEntropy_Air(double T, double vmolar_a)
|
||||
@@ -678,9 +677,9 @@ double IdealGasMolarEntropy_Air(double T, double vmolar_a)
|
||||
|
||||
vmolar_a_0 = R_bar_Lemmon*T0/p0; //[m^3/mol]
|
||||
|
||||
Air.update(CoolProp::DmolarT_INPUTS,1/vmolar_a_0,T);
|
||||
Air->update(CoolProp::DmolarT_INPUTS,1/vmolar_a_0,T);
|
||||
|
||||
sbar_a=sbar_0_Lem+R_bar_Lemmon*(tau*Air.keyed_output(CoolProp::idalpha0_dtau_constdelta)-Air.keyed_output(CoolProp::ialpha0))+R_bar_Lemmon*log(vmolar_a/vmolar_a_0); //[J/mol/K]
|
||||
sbar_a=sbar_0_Lem+R_bar_Lemmon*(tau*Air->keyed_output(CoolProp::idalpha0_dtau_constdelta)-Air->keyed_output(CoolProp::ialpha0))+R_bar_Lemmon*log(vmolar_a/vmolar_a_0); //[J/mol/K]
|
||||
|
||||
return sbar_a; //[J/mol/K]
|
||||
}
|
||||
@@ -802,8 +801,8 @@ double DewpointTemperature(double T, double p, double psi_w)
|
||||
|
||||
// 0.61165... is the triple point pressure of water in kPa
|
||||
if (p_w > 0.6116547241637944){
|
||||
Water.update(CoolProp::PQ_INPUTS, p, 1.0);
|
||||
T0 = Water.keyed_output(CoolProp::iT);
|
||||
Water->update(CoolProp::PQ_INPUTS, p, 1.0);
|
||||
T0 = Water->keyed_output(CoolProp::iT);
|
||||
}
|
||||
else{
|
||||
T0 = 268;
|
||||
@@ -821,8 +820,8 @@ double DewpointTemperature(double T, double p, double psi_w)
|
||||
if (Tdp >= 273.16)
|
||||
{
|
||||
// Saturation pressure at dewpoint [kPa]
|
||||
Water.update(CoolProp::QT_INPUTS, 0.0, Tdp);
|
||||
p_ws_dp = Water.keyed_output(CoolProp::iP);
|
||||
Water->update(CoolProp::QT_INPUTS, 0.0, Tdp);
|
||||
p_ws_dp = Water->keyed_output(CoolProp::iP);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -872,8 +871,8 @@ public:
|
||||
if (Twb > 273.16)
|
||||
{
|
||||
// Saturation pressure at wetbulb temperature [Pa]
|
||||
Water.update(CoolProp::QT_INPUTS,0,Twb);
|
||||
p_ws_wb= Water.keyed_output(CoolProp::iP);
|
||||
Water->update(CoolProp::QT_INPUTS,0,Twb);
|
||||
p_ws_wb= Water->keyed_output(CoolProp::iP);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -890,8 +889,8 @@ public:
|
||||
if (Twb > 273.16)
|
||||
{
|
||||
// Enthalpy of water [J/kg_water]
|
||||
Water.update(CoolProp::PT_INPUTS, _p, Twb);
|
||||
h_w = Water.keyed_output(CoolProp::iHmass); //[J/kg_water]
|
||||
Water->update(CoolProp::PT_INPUTS, _p, Twb);
|
||||
h_w = Water->keyed_output(CoolProp::iHmass); //[J/kg_water]
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -939,8 +938,8 @@ double WetbulbTemperature(double T, double p, double psi_w)
|
||||
// If the temperature is above the saturation temperature corresponding to the atmospheric pressure,
|
||||
// then the maximum value for the wetbulb temperature is the saturation temperature
|
||||
double Tmax = T;
|
||||
Water.update(CoolProp::PQ_INPUTS,p,1.0);
|
||||
double Tsat = Water.keyed_output(CoolProp::iT);
|
||||
Water->update(CoolProp::PQ_INPUTS,p,1.0);
|
||||
double Tsat = Water->keyed_output(CoolProp::iT);
|
||||
if (T >= Tsat)
|
||||
{
|
||||
Tmax = Tsat;
|
||||
@@ -1031,8 +1030,8 @@ double MoleFractionWater(double T, double p, int HumInput, double InVal)
|
||||
if (T>=273.16)
|
||||
{
|
||||
// Saturation pressure [Pa]
|
||||
Water.update(CoolProp::QT_INPUTS,0,T);
|
||||
p_ws= Water.keyed_output(CoolProp::iP);;
|
||||
Water->update(CoolProp::QT_INPUTS,0,T);
|
||||
p_ws= Water->keyed_output(CoolProp::iP);;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1055,8 +1054,8 @@ double MoleFractionWater(double T, double p, int HumInput, double InVal)
|
||||
// Saturation pressure at dewpoint [Pa]
|
||||
if (Tdp>=273.16)
|
||||
{
|
||||
Water.update(CoolProp::QT_INPUTS,0,Tdp);
|
||||
p_ws_dp = Water.keyed_output(CoolProp::iP); //[Pa]
|
||||
Water->update(CoolProp::QT_INPUTS,0,Tdp);
|
||||
p_ws_dp = Water->keyed_output(CoolProp::iP); //[Pa]
|
||||
}
|
||||
else{
|
||||
// Sublimation pressure [Pa]
|
||||
@@ -1081,8 +1080,8 @@ double RelativeHumidity(double T, double p, double psi_w)
|
||||
double p_ws, f, p_s, W;
|
||||
if (T >= 273.16){
|
||||
// Saturation pressure [Pa]
|
||||
Water.update(CoolProp::QT_INPUTS, 0, T);
|
||||
p_ws = Water.keyed_output(CoolProp::iP); //[Pa]
|
||||
Water->update(CoolProp::QT_INPUTS, 0, T);
|
||||
p_ws = Water->keyed_output(CoolProp::iP); //[Pa]
|
||||
}
|
||||
else{
|
||||
// sublimation pressure [Pa]
|
||||
@@ -1400,7 +1399,7 @@ double HAProps_Aux(const char* Name,double T, double p, double W, char *units)
|
||||
|
||||
Tj=132.6312;
|
||||
tau_Air=Tj/T;
|
||||
tau_Water=Water.keyed_output(CoolProp::iT_critical)/T;
|
||||
tau_Water=Water->keyed_output(CoolProp::iT_critical)/T;
|
||||
|
||||
try{
|
||||
if (!strcmp(Name,"Baa"))
|
||||
@@ -1497,8 +1496,8 @@ double HAProps_Aux(const char* Name,double T, double p, double W, char *units)
|
||||
strcpy(units,"1/Pa");
|
||||
if (T>273.16)
|
||||
{
|
||||
Water.update(CoolProp::PT_INPUTS, p, T);
|
||||
return Water.keyed_output(CoolProp::iisothermal_compressibility);
|
||||
Water->update(CoolProp::PT_INPUTS, p, T);
|
||||
return Water->keyed_output(CoolProp::iisothermal_compressibility);
|
||||
}
|
||||
else
|
||||
return IsothermCompress_Ice(T,p); //[1/Pa]
|
||||
@@ -1508,8 +1507,8 @@ double HAProps_Aux(const char* Name,double T, double p, double W, char *units)
|
||||
strcpy(units,"Pa");
|
||||
if (T>273.16)
|
||||
{
|
||||
Water.update(CoolProp::QT_INPUTS, 0, T);
|
||||
return Water.keyed_output(CoolProp::iP);
|
||||
Water->update(CoolProp::QT_INPUTS, 0, T);
|
||||
return Water->keyed_output(CoolProp::iP);
|
||||
}
|
||||
else
|
||||
return psub_Ice(T);
|
||||
@@ -1519,8 +1518,8 @@ double HAProps_Aux(const char* Name,double T, double p, double W, char *units)
|
||||
strcpy(units,"m^3/mol");
|
||||
if (T>273.16)
|
||||
{
|
||||
Water.update(CoolProp::QT_INPUTS, 0, T);
|
||||
return 1.0/Water.keyed_output(CoolProp::iDmolar);
|
||||
Water->update(CoolProp::QT_INPUTS, 0, T);
|
||||
return 1.0/Water->keyed_output(CoolProp::iDmolar);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user