Skip to content

Commit

Permalink
Implement cp,cv,mu,cond for mixture tabular backends based on REFPROP;
Browse files Browse the repository at this point in the history
…closes #871
  • Loading branch information
ibell committed Dec 13, 2015
1 parent 826c441 commit 4f0b5ca
Show file tree
Hide file tree
Showing 4 changed files with 58 additions and 10 deletions.
12 changes: 8 additions & 4 deletions include/PhaseEnvelope.h
Expand Up @@ -5,7 +5,7 @@
#include "CPmsgpack.h"

#define PHASE_ENVELOPE_MATRICES X(K) X(lnK) X(x) X(y)
#define PHASE_ENVELOPE_VECTORS X(T) X(p) X(lnT) X(lnp) X(rhomolar_liq) X(rhomolar_vap) X(lnrhomolar_liq) X(lnrhomolar_vap) X(hmolar_liq) X(hmolar_vap) X(smolar_liq) X(smolar_vap) X(Q)
#define PHASE_ENVELOPE_VECTORS X(T) X(p) X(lnT) X(lnp) X(rhomolar_liq) X(rhomolar_vap) X(lnrhomolar_liq) X(lnrhomolar_vap) X(hmolar_liq) X(hmolar_vap) X(smolar_liq) X(smolar_vap) X(Q) X(cpmolar_liq) X(cpmolar_vap) X(cvmolar_liq) X(cvmolar_vap) X(viscosity_liq) X(viscosity_vap) X(conductivity_liq) X(conductivity_vap)

namespace CoolProp{

Expand Down Expand Up @@ -47,9 +47,13 @@ class PhaseEnvelopeData
y.resize(N);
}
void clear(){
T.clear(); p.clear(); lnT.clear(); lnp.clear(); rhomolar_liq.clear(); rhomolar_vap.clear();
lnrhomolar_liq.clear(); lnrhomolar_vap.clear(); hmolar_liq.clear(); hmolar_vap.clear(); smolar_liq.clear(); smolar_vap.clear();
K.clear(); lnK.clear(); x.clear(); y.clear(); Q.clear();
/* Use X macros to auto-generate the clearing code; each will look something like: T.clear(); */
#define X(name) name.clear();
PHASE_ENVELOPE_VECTORS
#undef X
#define X(name) name.clear();
PHASE_ENVELOPE_MATRICES
#undef X
}
/// Take all the vectors that are in the class and pack them into the vectors map for easy unpacking using msgpack
void pack(){
Expand Down
4 changes: 4 additions & 0 deletions src/Backends/Helmholtz/PhaseEnvelopeRoutines.cpp
Expand Up @@ -365,6 +365,10 @@ double PhaseEnvelopeRoutines::evaluate(const PhaseEnvelopeData &env, parameters
case iDmolar: y = &(env.rhomolar_vap); break;
case iHmolar: y = &(env.hmolar_vap); break;
case iSmolar: y = &(env.smolar_vap); break;
case iCpmolar: y = &(env.cpmolar_vap); break;
case iCvmolar: y = &(env.cvmolar_vap); break;
case iviscosity: y = &(env.viscosity_vap); break;
case iconductivity: y = &(env.conductivity_vap); break;
default: throw ValueError("Pointer to vector y is unset in is_inside");
}

Expand Down
16 changes: 16 additions & 0 deletions src/Backends/REFPROP/REFPROPMixtureBackend.cpp
Expand Up @@ -920,6 +920,7 @@ void REFPROPMixtureBackend::calc_phase_envelope(const std::string &type)
PhaseEnvelope.lnrhomolar_vap.push_back(log(rho_molL*1000));
isp = nc + 1;
SPLNVALdll(&isp, &iderv, &rho_molL, &y, &ierr, herr, errormessagelength);
double T = y;
PhaseEnvelope.T.push_back(y);
PhaseEnvelope.lnT.push_back(log(y));
isp = nc + 2;
Expand All @@ -928,6 +929,7 @@ void REFPROPMixtureBackend::calc_phase_envelope(const std::string &type)
PhaseEnvelope.lnp.push_back(log(y*1000));
isp = nc + 3;
SPLNVALdll(&isp, &iderv, &rho_molL, &y, &ierr, herr, errormessagelength);
double rhoV_molL = y;
PhaseEnvelope.rhomolar_liq.push_back(y*1000);
PhaseEnvelope.lnrhomolar_liq.push_back(log(y*1000));
PhaseEnvelope.Q.push_back(static_cast<double>(y > rho_molL));
Expand All @@ -937,6 +939,20 @@ void REFPROPMixtureBackend::calc_phase_envelope(const std::string &type)
isp = nc + 5;
SPLNVALdll(&isp, &iderv, &rho_molL, &y, &ierr, herr, errormessagelength);
PhaseEnvelope.smolar_vap.push_back(y);

// Other outputs that could be useful
long ierr = 0;
char herr[255];
double p_kPa, emol, hmol, smol, cvmol, cpmol, w, hjt, eta, tcx;
// "Vapor"
THERMdll(&T, &rho_molL, &(mole_fractions[0]), &p_kPa, &emol, &hmol, &smol, &cvmol, &cpmol, &w, &hjt);
PhaseEnvelope.cpmolar_vap.push_back(cpmol);
PhaseEnvelope.cvmolar_vap.push_back(cvmol);
TRNPRPdll(&T, &rho_molL, &(mole_fractions[0]), // Inputs
&eta, &tcx, // Outputs
&ierr, herr, errormessagelength); // Error message
PhaseEnvelope.viscosity_vap.push_back(eta/1e6);
PhaseEnvelope.conductivity_vap.push_back(tcx);
}
}
CoolPropDbl REFPROPMixtureBackend::calc_cpmolar_idealgas(void)
Expand Down
36 changes: 30 additions & 6 deletions src/Backends/Tabular/TabularBackends.cpp
Expand Up @@ -511,24 +511,38 @@ CoolPropDbl CoolProp::TabularBackend::calc_umolar(void){
}
}
CoolPropDbl CoolProp::TabularBackend::calc_cpmolar(void){
PhaseEnvelopeData & phase_envelope = dataset->phase_envelope;
PureFluidSaturationTableData &pure_saturation = dataset->pure_saturation;
if (using_single_phase_table){
return calc_first_partial_deriv(iHmolar, iT, iP);
}
else{
throw ValueError("Two-phase not possible for cpmolar currently");
if (is_mixture){
return phase_envelope_sat(phase_envelope, iCpmolar, iP, _p);
}
else{
return pure_saturation.evaluate(iCpmolar, _p, _Q, cached_saturation_iL, cached_saturation_iV);
}
}
}
CoolPropDbl CoolProp::TabularBackend::calc_cvmolar(void){
PhaseEnvelopeData & phase_envelope = dataset->phase_envelope;
PureFluidSaturationTableData &pure_saturation = dataset->pure_saturation;
if (using_single_phase_table){
return calc_first_partial_deriv(iUmolar, iT, iDmolar);
}
else{
throw ValueError("Two-phase not possible for cvmolar currently");
if (is_mixture){
return phase_envelope_sat(phase_envelope, iCvmolar, iP, _p);
}
else{
return pure_saturation.evaluate(iCvmolar, _p, _Q, cached_saturation_iL, cached_saturation_iV);
}
}
}

CoolPropDbl CoolProp::TabularBackend::calc_viscosity(void){
//PhaseEnvelopeData & phase_envelope = dataset->phase_envelope;
PhaseEnvelopeData & phase_envelope = dataset->phase_envelope;
PureFluidSaturationTableData &pure_saturation = dataset->pure_saturation;
if (using_single_phase_table){
switch (selected_table){
Expand All @@ -539,11 +553,16 @@ CoolPropDbl CoolProp::TabularBackend::calc_viscosity(void){
return _HUGE; // not needed, will never be hit, just to make compiler happy
}
else{
return pure_saturation.evaluate(iviscosity, _p, _Q, cached_saturation_iL, cached_saturation_iV);
if (is_mixture){
return phase_envelope_sat(phase_envelope, iviscosity, iP, _p);
}
else{
return pure_saturation.evaluate(iviscosity, _p, _Q, cached_saturation_iL, cached_saturation_iV);
}
}
}
CoolPropDbl CoolProp::TabularBackend::calc_conductivity(void){
//PhaseEnvelopeData & phase_envelope = dataset->phase_envelope;
PhaseEnvelopeData & phase_envelope = dataset->phase_envelope;
PureFluidSaturationTableData &pure_saturation = dataset->pure_saturation;
if (using_single_phase_table){
switch (selected_table){
Expand All @@ -554,7 +573,12 @@ CoolPropDbl CoolProp::TabularBackend::calc_conductivity(void){
return _HUGE; // not needed, will never be hit, just to make compiler happy
}
else{
return pure_saturation.evaluate(iconductivity, _p, _Q, cached_saturation_iL, cached_saturation_iV);
if (is_mixture){
return phase_envelope_sat(phase_envelope, iconductivity, iP, _p);
}
else{
return pure_saturation.evaluate(iconductivity, _p, _Q, cached_saturation_iL, cached_saturation_iV);
}
}
}
CoolPropDbl CoolProp::TabularBackend::calc_first_partial_deriv(parameters Of, parameters Wrt, parameters Constant){
Expand Down

0 comments on commit 4f0b5ca

Please sign in to comment.