CoolProp
IncompressibleBackend.h
1 
2 #ifndef INCOMPRESSIBLEBACKEND_H_
3 #define INCOMPRESSIBLEBACKEND_H_
4 
5 #include "DataStructures.h"
6 #include "IncompressibleFluid.h"
7 #include "AbstractState.h"
8 #include "Exceptions.h"
9 
10 #include <vector>
11 
12 namespace CoolProp {
13 
15 {
16 
17  protected:
19  //double _T, _p; // From AbstractState
20  std::vector<CoolPropDbl> _fractions;
21 
23  CachedElement _T_ref, _p_ref, _x_ref, _h_ref, _s_ref;
24  CachedElement _hmass_ref, _smass_ref;
25 
27  CachedElement _cmass, _hmass, _rhomass, _smass, _umass;
28  CachedElement _drhodTatPx, _dsdTatPx, _dhdTatPx, _dsdTatPxdT, _dhdTatPxdT, _dsdpatTx, _dhdpatTx;
29 
30  IncompressibleFluid* fluid;
31 
33 
36  void set_fractions(const std::vector<CoolPropDbl>& fractions);
37 
38  public:
40  virtual ~IncompressibleBackend(){};
41  std::string backend_name(void) {
42  return get_backend_string(INCOMP_BACKEND);
43  }
44 
50  IncompressibleBackend(const std::string& fluid_name);
53  IncompressibleBackend(const std::vector<std::string>& component_names);
54 
55  // Incompressible backend uses different compositions
56  bool using_mole_fractions(void) {
57  return this->fluid->getxid() == IFRAC_MOLE;
58  };
59  bool using_mass_fractions(void) {
60  return (this->fluid->getxid() == IFRAC_MASS || this->fluid->getxid() == IFRAC_PURE);
61  };
62  bool using_volu_fractions(void) {
63  return this->fluid->getxid() == IFRAC_VOLUME;
64  };
65 
67 
75  void update(CoolProp::input_pairs input_pair, double value1, double value2);
76 
77  std::string fluid_param_string(const std::string& ParamName) {
78  if (!ParamName.compare("long_name")) {
79  return calc_name();
80  } else {
81  throw ValueError(format("Input value [%s] is invalid.", ParamName.c_str()));
82  }
83  }
84 
86  bool clear();
87 
89  void set_reference_state(double T0 = 20 + 273.15, double p0 = 101325, double x0 = 0.0, double h0 = 0.0, double s0 = 0.0);
90 
92 
95  void set_mole_fractions(const std::vector<CoolPropDbl>& mole_fractions);
96  const std::vector<CoolPropDbl>& get_mole_fractions(void) {
97  throw NotImplementedError("get_mole_fractions not implemented for this backend");
98  };
99 
101 
104  void set_mass_fractions(const std::vector<CoolPropDbl>& mass_fractions);
105 
107 
110  void set_volu_fractions(const std::vector<CoolPropDbl>& volu_fractions);
111 
113  void check_status();
114 
120  double rhomass(void);
123  double hmass(void);
125  double smass(void);
127  double umass(void);
129  double cmass(void);
130 
131  double drhodTatPx(void);
132  double dsdTatPx(void);
133  double dhdTatPx(void);
134  double dsdTatPxdT(void);
135  double dhdTatPxdT(void);
136  double dsdpatTx(void);
137  double dhdpatTx(void);
138 
140  double T_ref(void);
142  double p_ref(void);
144  double x_ref(void);
146  double h_ref(void);
148  double s_ref(void);
149 
151  double hmass_ref(void);
153  double smass_ref(void);
154 
158 
164  CoolPropDbl DmassP_flash(CoolPropDbl rhomass, CoolPropDbl p);
166 
171  CoolPropDbl HmassP_flash(CoolPropDbl hmass, CoolPropDbl p);
173 
178  CoolPropDbl PSmass_flash(CoolPropDbl p, CoolPropDbl smass);
179 
180  // /// Calculate T given pressure and internal energy
181  // /**
182  // @param umass The mass internal energy in J/kg
183  // @param p The pressure in Pa
184  // @returns T The temperature in K
185  // */
186  // CoolPropDbl PUmass_flash(CoolPropDbl p, CoolPropDbl umass);
187 
189  CoolPropDbl calc_rhomass(void) {
190  return fluid->rho(_T, _p, _fractions[0]);
191  };
192  CoolPropDbl calc_cmass(void) {
193  return fluid->c(_T, _p, _fractions[0]);
194  };
195  CoolPropDbl calc_cpmass(void) {
196  return cmass();
197  };
198  CoolPropDbl calc_cvmass(void) {
199  return cmass();
200  };
201  CoolPropDbl calc_viscosity(void) {
202  return fluid->visc(_T, _p, _fractions[0]);
203  };
204  CoolPropDbl calc_conductivity(void) {
205  return fluid->cond(_T, _p, _fractions[0]);
206  };
207  CoolPropDbl calc_T_freeze(void) {
208  // No update is called - T_freeze is a trivial output
209  fluid->checkX(_fractions[0]);
210  return fluid->Tfreeze(_p, _fractions[0]);
211  };
212  CoolPropDbl calc_melting_line(int param, int given, CoolPropDbl value);
213  CoolPropDbl calc_umass(void);
214 
216  CoolPropDbl calc_hmass(void);
217  CoolPropDbl calc_smass(void);
218 
219  public:
221  CoolPropDbl raw_calc_hmass(double T, double p, double x);
222  CoolPropDbl raw_calc_smass(double T, double p, double x);
223 
224  protected:
226  CoolPropDbl calc_first_partial_deriv(parameters Of, parameters Wrt, parameters Constant);
227 
228  /* Below are direct calculations of the derivatives. Nothing
229  * special is going on, we simply use the polynomial class to
230  * derive the different functions with respect to temperature.
231  */
233  double calc_drhodTatPx(double T, double p, double x) {
234  return fluid->drhodTatPx(T, p, x);
235  };
237  double calc_dsdTatPx(double T, double p, double x) {
238  return fluid->c(T, p, x) / T;
239  };
241  double calc_dhdTatPx(double T, double p, double x) {
242  return fluid->c(T, p, x);
243  };
247  double calc_dsdTatPxdT(double T, double p, double x) {
248  return fluid->dsdTatPxdT(T, p, x);
249  };
253  double calc_dhdTatPxdT(double T, double p, double x) {
254  return fluid->dhdTatPxdT(T, p, x);
255  };
256 
257  /* Other useful derivatives
258  */
261  double calc_dsdpatTx(double rho, double drhodTatPx);
264  double calc_dhdpatTx(double T, double rho, double drhodTatPx);
265 
266  public:
268  CoolPropDbl calc_Tmax(void) {
269  return fluid->getTmax();
270  };
271  CoolPropDbl calc_Tmin(void) {
272  return fluid->getTmin();
273  };
274  CoolPropDbl calc_fraction_min(void) {
275  return fluid->getxmin();
276  };
277  CoolPropDbl calc_fraction_max(void) {
278  return fluid->getxmax();
279  };
280  std::string calc_name(void) {
281  return fluid->getName();
282  };
283  std::string calc_description(void) {
284  return fluid->getDescription();
285  };
286 };
287 
288 } /* namespace CoolProp */
289 #endif /* INCOMPRESSIBLEBACKEND_H_ */
double T(void)
Return the temperature in K.
Definition: AbstractState.h:1048
double calc_drhodTatPx(double T, double p, double x)
Partial derivative of density with respect to temperature at constant pressure and composition...
Definition: IncompressibleBackend.h:233
CoolPropDbl calc_Tmin(void)
Using this backend, calculate the minimum temperature in K.
Definition: IncompressibleBackend.h:271
CachedElement _cmass
Additional cached elements used for the partial derivatives.
Definition: IncompressibleBackend.h:27
void set_fractions(const std::vector< CoolPropDbl > &fractions)
Set the fractions.
Definition: IncompressibleBackend.cpp:193
CoolPropDbl DmassP_flash(CoolPropDbl rhomass, CoolPropDbl p)
These functions should be protected, but that requires new tests.
Definition: IncompressibleBackend.cpp:395
CoolPropDbl calc_melting_line(int param, int given, CoolPropDbl value)
Calculate T given pressure and internal energy **.
Definition: IncompressibleBackend.cpp:501
double hmass(void)
Return the mass enthalpy in J/kg.
Definition: IncompressibleBackend.cpp:303
bool clear()
Clear all the cached values.
Definition: IncompressibleBackend.cpp:155
void update(CoolProp::input_pairs input_pair, double value1, double value2)
Updating function for incompressible fluid.
Definition: IncompressibleBackend.cpp:59
double umass(void)
Return the molar internal energy in J/mol.
Definition: IncompressibleBackend.cpp:313
double drhodTatPx(double T, double p, double x)
Partial derivative of density.
Definition: IncompressibleFluid.cpp:232
void set_mole_fractions(const std::vector< CoolPropDbl > &mole_fractions)
Set the mole fractions.
Definition: IncompressibleBackend.cpp:212
std::string fluid_param_string(const std::string &ParamName)
Return a string from the backend for the mixture/fluid - backend dependent - could be CAS #...
Definition: IncompressibleBackend.h:77
CoolPropDbl calc_hmass(void)
... and continue with the ones that depend on reference conditions.
Definition: IncompressibleBackend.cpp:513
CoolPropDbl calc_conductivity(void)
Using this backend, calculate the thermal conductivity in W/m/K.
Definition: IncompressibleBackend.h:204
CoolPropDbl calc_first_partial_deriv(parameters Of, parameters Wrt, parameters Constant)
Calculate the first partial derivative for the desired derivative.
Definition: IncompressibleBackend.cpp:529
CoolPropDbl calc_rhomass(void)
Definition: IncompressibleBackend.h:189
void set_mass_fractions(const std::vector< CoolPropDbl > &mass_fractions)
Set the mass fractions.
Definition: IncompressibleBackend.cpp:238
double T_ref(void)
Return the temperature in K.
Definition: IncompressibleBackend.cpp:353
A property provider for incompressible solutions and pure fluids.
Definition: IncompressibleFluid.h:57
CoolPropDbl raw_calc_hmass(double T, double p, double x)
Functions that can be used with the solver, they miss the reference values!
Definition: IncompressibleBackend.cpp:521
double calc_dsdTatPx(double T, double p, double x)
Partial derivative of entropy with respect to temperature at constant pressure and composition...
Definition: IncompressibleBackend.h:237
double calc_dhdpatTx(double T, double rho, double drhodTatPx)
Partial derivative of enthalpy with respect to pressure at constant temperature and composition ...
Definition: IncompressibleBackend.cpp:564
The mother of all state classes.
Definition: AbstractState.h:78
std::vector< CoolPropDbl > _fractions
Bulk values, state variables.
Definition: IncompressibleBackend.h:20
double visc(double T, double p, double x)
Viscosity as a function of temperature, pressure and composition.
Definition: IncompressibleFluid.cpp:146
double calc_dsdTatPxdT(double T, double p, double x)
Partial derivative of entropy with respect to temperature at constant pressure and composition integr...
Definition: IncompressibleBackend.h:247
CoolPropDbl HmassP_flash(CoolPropDbl hmass, CoolPropDbl p)
Calculate T given pressure and enthalpy.
Definition: IncompressibleBackend.cpp:404
double smass_ref(void)
Return the molar entropy in J/mol/K.
Definition: IncompressibleBackend.cpp:384
double calc_dsdpatTx(double rho, double drhodTatPx)
Partial derivative of entropy with respect to pressure at constant temperature and composition ...
Definition: IncompressibleBackend.cpp:559
double calc_dhdTatPxdT(double T, double p, double x)
Partial derivative of enthalpy with respect to temperature at constant pressure and composition integ...
Definition: IncompressibleBackend.h:253
CoolPropDbl PSmass_flash(CoolPropDbl p, CoolPropDbl smass)
Calculate T given pressure and entropy.
Definition: IncompressibleBackend.cpp:436
CoolPropDbl calc_viscosity(void)
Using this backend, calculate the viscosity in Pa-s.
Definition: IncompressibleBackend.h:201
std::string calc_description(void)
Using this backend, get the description of the fluid.
Definition: IncompressibleBackend.h:283
Definition: IncompressibleBackend.h:14
input_pairs
These are input pairs that can be used for the update function (in each pair, input keys are sorted a...
Definition: DataStructures.h:274
double hmass_ref(void)
Return the mass enthalpy in J/kg.
Definition: IncompressibleBackend.cpp:379
Definition: Exceptions.h:45
std::string calc_name(void)
Using this backend, get the name of the fluid.
Definition: IncompressibleBackend.h:280
double rho(double T, double p, double x)
Density as a function of temperature, pressure and composition.
Definition: IncompressibleFluid.cpp:110
double c(double T, double p, double x)
Heat capacities as a function of temperature, pressure and composition.
Definition: IncompressibleFluid.cpp:131
CoolPropDbl calc_fraction_max(void)
Get the maximum fraction (mole, mass, volume) for incompressible fluid.
Definition: IncompressibleBackend.h:277
void set_volu_fractions(const std::vector< CoolPropDbl > &volu_fractions)
Set the volume fractions.
Definition: IncompressibleBackend.cpp:264
double dhdTatPxdT(double T, double p, double x)
Partial derivative of enthalpy.
Definition: IncompressibleFluid.cpp:262
double p_ref(void)
Return the pressure in Pa.
Definition: IncompressibleBackend.cpp:358
bool checkX(double x)
Check validity of composition input.
Definition: IncompressibleFluid.cpp:461
void check_status()
Check if the mole fractions have been set, etc.
Definition: IncompressibleBackend.cpp:288
CoolPropDbl calc_fraction_min(void)
Get the minimum fraction (mole, mass, volume) for incompressible fluid.
Definition: IncompressibleBackend.h:274
double Tfreeze(double p, double x)
Freezing temperature as a function of pressure and composition.
Definition: IncompressibleFluid.cpp:207
double rhomass(void)
We have to override some of the functions from the AbstractState.
Definition: IncompressibleBackend.cpp:298
CachedElement _T_ref
Reference values, no need to calculate them each time.
Definition: IncompressibleBackend.h:23
double p(void)
Return the pressure in Pa.
Definition: AbstractState.h:1060
double h_ref(void)
Return the mass enthalpy in J/kg.
Definition: IncompressibleBackend.cpp:368
double x_ref(void)
Return the composition.
Definition: IncompressibleBackend.cpp:363
void set_reference_state(double T0=20+273.15, double p0=101325, double x0=0.0, double h0=0.0, double s0=0.0)
Update the reference values and clear the state.
Definition: IncompressibleBackend.cpp:176
double cond(double T, double p, double x)
Thermal conductivity as a function of temperature, pressure and composition.
Definition: IncompressibleFluid.cpp:166
double calc_dhdTatPx(double T, double p, double x)
Partial derivative of enthalpy with respect to temperature at constant pressure and composition...
Definition: IncompressibleBackend.h:241
double smass(void)
Return the molar entropy in J/mol/K.
Definition: IncompressibleBackend.cpp:308
double dsdTatPxdT(double T, double p, double x)
Partial derivative of entropy.
Definition: IncompressibleFluid.cpp:247
const std::vector< CoolPropDbl > & get_mole_fractions(void)
Get the mole fractions of the fluid.
Definition: IncompressibleBackend.h:96
This file contains flash routines in which the state is unknown, and a solver of some kind must be us...
Definition: AbstractState.h:19
parameters
Define some constants that will be used throughout These are constants for the input and output para...
Definition: DataStructures.h:64
std::string backend_name(void)
Get a string representation of the backend - for instance "HelmholtzEOSMixtureBackend" for the core m...
Definition: IncompressibleBackend.h:41
Definition: CachedElement.h:32
double s_ref(void)
Return the molar entropy in J/mol/K.
Definition: IncompressibleBackend.cpp:373
double cmass(void)
Return the mass constant pressure specific heat in J/kg/K.
Definition: IncompressibleBackend.cpp:318
CoolPropDbl calc_Tmax(void)
Constants from the fluid object.
Definition: IncompressibleBackend.h:268