CoolProp  6.6.1dev
An open-source fluid property and humid air property database
ReducingFunctions.h
Go to the documentation of this file.
1 
7 #ifndef MIXTURE_BINARY_PAIRS_H
8 #define MIXTURE_BINARY_PAIRS_H
9 
10 #include <vector>
11 #include "CoolPropFluid.h"
13 
14 namespace CoolProp {
15 
16 typedef std::vector<std::vector<CoolPropDbl>> STLMatrix;
17 
19 {
22 };
23 
24 std::string get_reducing_function_name(const std::string& CAS1, const std::string& CAS2);
25 
32 {
33  protected:
34  std::size_t N;
35 
36  public:
37  ReducingFunction() : N(0){};
38  virtual ~ReducingFunction(){};
39 
40  virtual ReducingFunction* copy() = 0;
41 
42  virtual void set_binary_interaction_double(const std::size_t i, const std::size_t j, const std::string& parameter, double value) = 0;
43 
44  virtual double get_binary_interaction_double(const std::size_t i, const std::size_t j, const std::string& parameter) const = 0;
45 
47  static shared_ptr<ReducingFunction> factory(const std::vector<CoolPropFluid*>& components, STLMatrix& F);
48 
50  virtual CoolPropDbl Tr(const std::vector<CoolPropDbl>& x) const = 0;
52  virtual CoolPropDbl dTrdxi__constxj(const std::vector<CoolPropDbl>& x, std::size_t i, x_N_dependency_flag xN_flag) const = 0;
54  virtual CoolPropDbl rhormolar(const std::vector<CoolPropDbl>& x) const = 0;
56  virtual CoolPropDbl drhormolardxi__constxj(const std::vector<CoolPropDbl>& x, std::size_t i, x_N_dependency_flag xN_flag) const = 0;
57  virtual CoolPropDbl dTr_dgammaT(const std::vector<CoolPropDbl>& x) const {
58  throw CoolProp::NotImplementedError("dTr_dgammaT is not implemented for this backend");
59  }
60  virtual CoolPropDbl dTr_dbetaT(const std::vector<CoolPropDbl>& x) const {
61  throw CoolProp::NotImplementedError("dTr_dbetaT is not implemented for this backend");
62  }
63  virtual CoolPropDbl drhormolar_dgammaV(const std::vector<CoolPropDbl>& x) const {
64  throw CoolProp::NotImplementedError("drhormolar_dgammaV is not implemented for this backend");
65  }
66  virtual CoolPropDbl drhormolar_dbetaV(const std::vector<CoolPropDbl>& x) const {
67  throw CoolProp::NotImplementedError("drhormolar_dbetaV is not implemented for this backend");
68  }
69  virtual CoolPropDbl d2Tr_dxidgammaT(const std::vector<CoolPropDbl>& x, std::size_t i, x_N_dependency_flag xN_flag) const {
70  throw CoolProp::NotImplementedError("d2Tr_dxidgammaT is not implemented for this backend");
71  }
72  virtual CoolPropDbl d2Tr_dxidbetaT(const std::vector<CoolPropDbl>& x, std::size_t i, x_N_dependency_flag xN_flag) const {
73  throw CoolProp::NotImplementedError("d2Tr_dxidbetaT is not implemented for this backend");
74  }
75  virtual CoolPropDbl d2rhormolar_dxidgammaV(const std::vector<CoolPropDbl>& x, std::size_t i, x_N_dependency_flag xN_flag) const {
76  throw CoolProp::NotImplementedError("d2rhormolar_dxidgammaV is not implemented for this backend");
77  }
78  virtual CoolPropDbl d2rhormolar_dxidbetaV(const std::vector<CoolPropDbl>& x, std::size_t i, x_N_dependency_flag xN_flag) const {
79  throw CoolProp::NotImplementedError("d2rhormolar_dxidbetaV is not implemented for this backend");
80  }
81 
82  virtual CoolPropDbl d2rhormolardxi2__constxj(const std::vector<CoolPropDbl>& x, std::size_t i, x_N_dependency_flag xN_flag) const = 0;
83  virtual CoolPropDbl d2rhormolardxidxj(const std::vector<CoolPropDbl>& x, std::size_t i, std::size_t j, x_N_dependency_flag xN_flag) const = 0;
84  virtual CoolPropDbl d3rhormolardxidxjdxk(const std::vector<CoolPropDbl>& x, std::size_t i, std::size_t j, std::size_t k,
85  x_N_dependency_flag xN_flag) const = 0;
86  virtual CoolPropDbl d2Trdxi2__constxj(const std::vector<CoolPropDbl>& x, std::size_t i, x_N_dependency_flag xN_flag) const = 0;
87  virtual CoolPropDbl d2Trdxidxj(const std::vector<CoolPropDbl>& x, std::size_t i, std::size_t j, x_N_dependency_flag xN_flag) const = 0;
88  virtual CoolPropDbl d3Trdxidxjdxk(const std::vector<CoolPropDbl>& x, std::size_t i, std::size_t j, std::size_t k,
89  x_N_dependency_flag xN_flag) const = 0;
90 
102  virtual CoolPropDbl d_ndTrdni_dxj__constxi(const std::vector<CoolPropDbl>& x, std::size_t i, std::size_t j, x_N_dependency_flag xN_flag) const;
103 
104  virtual CoolPropDbl d2_ndTrdni_dxj_dxk__constxi(const std::vector<CoolPropDbl>& x, std::size_t i, std::size_t j, std::size_t k,
105  x_N_dependency_flag xN_flag) const;
106 
120  virtual CoolPropDbl d_ndrhorbardni_dxj__constxi(const std::vector<CoolPropDbl>& x, std::size_t i, std::size_t j,
121  x_N_dependency_flag xN_flag) const;
122 
123  virtual CoolPropDbl d2_ndrhorbardni_dxj_dxk__constxi(const std::vector<CoolPropDbl>& x, std::size_t i, std::size_t j, std::size_t k,
124  x_N_dependency_flag xN_flag) const;
125 
126  virtual CoolPropDbl ndrhorbardni__constnj(const std::vector<CoolPropDbl>& x, std::size_t i, x_N_dependency_flag xN_flag) const;
127  virtual CoolPropDbl ndTrdni__constnj(const std::vector<CoolPropDbl>& x, std::size_t i, x_N_dependency_flag xN_flag) const;
128  virtual CoolPropDbl PSI_rho(const std::vector<CoolPropDbl>& x, std::size_t i, x_N_dependency_flag xN_flag) const;
129  virtual CoolPropDbl d_PSI_rho_dxj(const std::vector<CoolPropDbl>& x, std::size_t i, std::size_t j, x_N_dependency_flag xN_flag) const;
130  virtual CoolPropDbl d2_PSI_rho_dxj_dxk(const std::vector<CoolPropDbl>& x, std::size_t i, std::size_t j, std::size_t k,
131  x_N_dependency_flag xN_flag) const;
132  virtual CoolPropDbl PSI_T(const std::vector<CoolPropDbl>& x, std::size_t i, x_N_dependency_flag xN_flag) const;
133  virtual CoolPropDbl d_PSI_T_dxj(const std::vector<CoolPropDbl>& x, std::size_t i, std::size_t j, x_N_dependency_flag xN_flag) const;
134  virtual CoolPropDbl d2_PSI_T_dxj_dxk(const std::vector<CoolPropDbl>& x, std::size_t i, std::size_t j, std::size_t k,
135  x_N_dependency_flag xN_flag) const;
136 };
137 
144 {
145  private:
146  GERG2008ReducingFunction(const GERG2008ReducingFunction& that); // No copying
147  protected:
154  std::vector<CoolPropDbl> Yc_T;
155  std::vector<CoolPropDbl> Yc_v;
156  std::vector<CoolPropFluid> pFluids;
157 
158  public:
159  GERG2008ReducingFunction(const std::vector<CoolPropFluid>& pFluids, const STLMatrix& beta_v, const STLMatrix& gamma_v, STLMatrix beta_T,
160  const STLMatrix& gamma_T) {
161  this->pFluids = pFluids;
162  this->beta_v = beta_v;
163  this->gamma_v = gamma_v;
164  this->beta_T = beta_T;
165  this->gamma_T = gamma_T;
166  this->N = pFluids.size();
167  T_c.resize(N, std::vector<CoolPropDbl>(N, 0));
168  v_c.resize(N, std::vector<CoolPropDbl>(N, 0));
169  Yc_T.resize(N);
170  Yc_v.resize(N);
171  for (std::size_t i = 0; i < N; ++i) {
172  for (std::size_t j = 0; j < N; j++) {
173  T_c[i][j] = sqrt(pFluids[i].EOS().reduce.T * pFluids[j].EOS().reduce.T);
174  v_c[i][j] = 1.0 / 8.0 * pow(pow(pFluids[i].EOS().reduce.rhomolar, -1.0 / 3.0) + pow(pFluids[j].EOS().reduce.rhomolar, -1.0 / 3.0), 3);
175  }
176  Yc_T[i] = pFluids[i].EOS().reduce.T;
177  Yc_v[i] = 1 / pFluids[i].EOS().reduce.rhomolar;
178  }
179  };
180 
183  };
184 
187 
189  void set_binary_interaction_double(const std::size_t i, const std::size_t j, double betaT, double gammaT, double betaV, double gammaV) {
190  // bound-check indices
191  if (i < 0 || i >= N) {
192  if (j < 0 || j >= N) {
193  throw ValueError(format("Both indices i [%d] and j [%d] are out of bounds. Must be between 0 and %d.", i, j, N-1));
194  } else {
195  throw ValueError(format("Index i [%d] is out of bounds. Must be between 0 and %d.", i, N-1));
196  }
197  } else if (j < 0 || j >= N) {
198  throw ValueError(format("Index j [%d] is out of bounds. Must be between 0 and %d.", j, N-1));
199  }
200  beta_T[i][j] = betaT;
201  beta_T[j][i] = 1 / betaT;
202  gamma_T[i][j] = gammaT;
203  gamma_T[j][i] = gammaT;
204  beta_v[i][j] = betaV;
205  beta_v[j][i] = 1 / betaV;
206  gamma_v[i][j] = gammaV;
207  gamma_v[j][i] = gammaV;
208  }
209 
211  virtual void set_binary_interaction_double(const std::size_t i, const std::size_t j, const std::string& parameter, double value) {
212  // bound-check indices
213  if (i < 0 || i >= N) {
214  if (j < 0 || j >= N) {
215  throw ValueError(format("Both indices i [%d] and j [%d] are out of bounds. Must be between 0 and %d.", i, j, N-1));
216  } else {
217  throw ValueError(format("Index i [%d] is out of bounds. Must be between 0 and %d.", i, N-1));
218  }
219  } else if (j < 0 || j >= N) {
220  throw ValueError(format("Index j [%d] is out of bounds. Must be between 0 and %d.", j, N-1));
221  }
222  if (parameter == "betaT") {
223  beta_T[i][j] = value;
224  beta_T[j][i] = 1 / value;
225  } else if (parameter == "gammaT") {
226  gamma_T[i][j] = value;
227  gamma_T[j][i] = value;
228  } else if (parameter == "betaV") {
229  beta_v[i][j] = value;
230  beta_v[j][i] = 1 / value;
231  } else if (parameter == "gammaV") {
232  gamma_v[i][j] = value;
233  gamma_v[j][i] = value;
234  } else {
235  throw KeyError(format("This key [%s] is invalid to set_binary_interaction_double", parameter.c_str()));
236  }
237  }
239  virtual double get_binary_interaction_double(const std::size_t i, const std::size_t j, const std::string& parameter) const {
240  if (parameter == "betaT") {
241  return beta_T[i][j];
242  } else if (parameter == "gammaT") {
243  return gamma_T[i][j];
244  } else if (parameter == "betaV") {
245  return beta_v[i][j];
246  } else if (parameter == "gammaV") {
247  return gamma_v[i][j];
248  } else {
249  throw KeyError(format("This key [%s] is invalid to get_binary_interaction_double", parameter.c_str()));
250  }
251  }
252 
256  CoolPropDbl Tr(const std::vector<CoolPropDbl>& x) const;
257 
261  CoolPropDbl dTr_dgammaT(const std::vector<CoolPropDbl>& x) const;
262 
266  CoolPropDbl dTr_dbetaT(const std::vector<CoolPropDbl>& x) const;
267 
270  CoolPropDbl d2Tr_dxidgammaT(const std::vector<CoolPropDbl>& x, std::size_t i, x_N_dependency_flag xN_flag) const;
271 
274  CoolPropDbl d2Tr_dxidbetaT(const std::vector<CoolPropDbl>& x, std::size_t i, x_N_dependency_flag xN_flag) const;
275 
280  CoolPropDbl dTrdxi__constxj(const std::vector<CoolPropDbl>& x, std::size_t i, x_N_dependency_flag xN_flag) const;
285  CoolPropDbl d2Trdxi2__constxj(const std::vector<CoolPropDbl>& x, std::size_t i, x_N_dependency_flag xN_flag) const;
290  CoolPropDbl d2Trdxidxj(const std::vector<CoolPropDbl>& x, std::size_t i, std::size_t j, x_N_dependency_flag xN_flag) const;
295  CoolPropDbl d3Trdxidxjdxk(const std::vector<CoolPropDbl>& x, std::size_t i, std::size_t j, std::size_t k, x_N_dependency_flag xN_flag) const;
296 
301  CoolPropDbl dvrmolardxi__constxj(const std::vector<CoolPropDbl>& x, std::size_t i, x_N_dependency_flag xN_flag) const;
306  CoolPropDbl d2vrmolardxi2__constxj(const std::vector<CoolPropDbl>& x, std::size_t i, x_N_dependency_flag xN_flag) const;
311  CoolPropDbl d2vrmolardxidxj(const std::vector<CoolPropDbl>& x, std::size_t i, std::size_t j, x_N_dependency_flag xN_flag) const;
316  CoolPropDbl d3vrmolardxidxjdxk(const std::vector<CoolPropDbl>& x, std::size_t i, std::size_t j, std::size_t k, x_N_dependency_flag xN_flag) const;
321  CoolPropDbl rhormolar(const std::vector<CoolPropDbl>& x) const;
322 
326  CoolPropDbl drhormolar_dgammaV(const std::vector<CoolPropDbl>& x) const;
327 
331  CoolPropDbl drhormolar_dbetaV(const std::vector<CoolPropDbl>& x) const;
332 
335  CoolPropDbl d2vrmolar_dxidgammaV(const std::vector<CoolPropDbl>& x, std::size_t i, x_N_dependency_flag xN_flag) const;
336 
339  CoolPropDbl d2vrmolar_dxidbetaV(const std::vector<CoolPropDbl>& x, std::size_t i, x_N_dependency_flag xN_flag) const;
340 
343  CoolPropDbl d2rhormolar_dxidbetaV(const std::vector<CoolPropDbl>& x, std::size_t i, x_N_dependency_flag xN_flag) const;
344 
347  CoolPropDbl d2rhormolar_dxidgammaV(const std::vector<CoolPropDbl>& x, std::size_t i, x_N_dependency_flag xN_flag) const;
348 
356  CoolPropDbl drhormolardxi__constxj(const std::vector<CoolPropDbl>& x, std::size_t i, x_N_dependency_flag xN_flag) const;
364  CoolPropDbl d2rhormolardxi2__constxj(const std::vector<CoolPropDbl>& x, std::size_t i, x_N_dependency_flag xN_flag) const;
372  CoolPropDbl d2rhormolardxidxj(const std::vector<CoolPropDbl>& x, std::size_t i, std::size_t j, x_N_dependency_flag xN_flag) const;
376  CoolPropDbl d3rhormolardxidxjdxk(const std::vector<CoolPropDbl>& x, std::size_t i, std::size_t j, std::size_t k,
377  x_N_dependency_flag xN_flag) const;
378 
385  CoolPropDbl Yr(const std::vector<CoolPropDbl>& x, const STLMatrix& beta, const STLMatrix& gamma, const STLMatrix& Y_c_ij,
386  const std::vector<CoolPropDbl>& Yc) const;
387 
394  CoolPropDbl dYr_dgamma(const std::vector<CoolPropDbl>& x, const STLMatrix& beta, const STLMatrix& gamma, const STLMatrix& Y_c_ij,
395  const std::vector<CoolPropDbl>& Yc) const;
396 
399  CoolPropDbl dYr_dbeta(const std::vector<CoolPropDbl>& x, const STLMatrix& beta, const STLMatrix& gamma, const STLMatrix& Y_c_ij,
400  const std::vector<CoolPropDbl>& Yc) const;
401 
417  CoolPropDbl dYrdxi__constxj(const std::vector<CoolPropDbl>& x, std::size_t i, const STLMatrix& beta, const STLMatrix& gamma,
418  const STLMatrix& Y_c_ij, const std::vector<CoolPropDbl>& Yc, x_N_dependency_flag xN_flag) const;
419 
422  CoolPropDbl d2Yrdxidgamma(const std::vector<CoolPropDbl>& x, std::size_t i, const STLMatrix& beta, const STLMatrix& gamma,
423  const STLMatrix& Y_c_ij, const std::vector<CoolPropDbl>& Yc, x_N_dependency_flag xN_flag) const;
426  CoolPropDbl d2Yrdxidbeta(const std::vector<CoolPropDbl>& x, std::size_t i, const STLMatrix& beta, const STLMatrix& gamma, const STLMatrix& Y_c_ij,
427  const std::vector<CoolPropDbl>& Yc, x_N_dependency_flag xN_flag) const;
428 
443  CoolPropDbl d2Yrdxi2__constxj(const std::vector<CoolPropDbl>& x, std::size_t i, const STLMatrix& beta, const STLMatrix& gamma,
444  const STLMatrix& Y_c_ij, const std::vector<CoolPropDbl>& Yc, x_N_dependency_flag xN_flag) const;
459  CoolPropDbl d2Yrdxidxj(const std::vector<CoolPropDbl>& x, std::size_t i, std::size_t j, const STLMatrix& beta, const STLMatrix& gamma,
460  const STLMatrix& Y_c_ij, const std::vector<CoolPropDbl>& Yc, x_N_dependency_flag xN_flag) const;
461 
465  CoolPropDbl d3Yrdxidxjdxk(const std::vector<CoolPropDbl>& x, std::size_t i, std::size_t j, std::size_t k, const STLMatrix& beta,
466  const STLMatrix& gamma, const STLMatrix& Y_c_ij, const std::vector<CoolPropDbl>& Yc, x_N_dependency_flag xN_flag) const;
467 
474  const CoolPropDbl c_Y_ij(const std::size_t i, const std::size_t j, const STLMatrix& beta, const STLMatrix& gamma, const STLMatrix& Y_c) const;
475 
480  CoolPropDbl f_Y_ij(const std::vector<CoolPropDbl>& x, std::size_t i, std::size_t j, const STLMatrix& beta) const;
487  CoolPropDbl dfYkidxi__constxk(const std::vector<CoolPropDbl>& x, std::size_t k, std::size_t i, const STLMatrix& beta) const;
494  CoolPropDbl dfYikdxi__constxk(const std::vector<CoolPropDbl>& x, std::size_t i, std::size_t k, const STLMatrix& beta) const;
500  CoolPropDbl d2fYkidxi2__constxk(const std::vector<CoolPropDbl>& x, std::size_t k, std::size_t i, const STLMatrix& beta) const;
506  CoolPropDbl d2fYikdxi2__constxk(const std::vector<CoolPropDbl>& x, std::size_t i, std::size_t k, const STLMatrix& beta) const;
513  CoolPropDbl d2fYijdxidxj(const std::vector<CoolPropDbl>& x, std::size_t i, std::size_t k, const STLMatrix& beta) const;
514 
515  /* Third order mixed partial derivative of \f$f_{Y,ij}\f$
516  * \f[
517  * \left(\dfrac{\partial^3 f_{Y,ij}(x_i, x_j)}{\partial x_i^2\partial x_j}\right)_{j\neq i} = \dfrac{-6 \beta^{2} x_{i} x_{j}^{2} \left(\beta^{2} - 1\right)}{\beta^{8} x_{i}^{4} + 4 \beta^{6} x_{i}^{3} x_{j} + 6 \beta^{4} x_{i}^{2} x_{j}^{2} + 4 \beta^{2} x_{i} x_{j}^{3} + x_{j}^{4}}
518  * \f]
519  */
520  CoolPropDbl d3fYijdxi2dxj(const std::vector<CoolPropDbl>& x, std::size_t i, std::size_t j, const STLMatrix& beta) const;
521  /* Third order mixed partial derivative of \f$f_{Y,ij}\f$
522  * \f[
523  * \left(\dfrac{\partial^3 f_{Y,ij}(x_i, x_j)}{\partial x_i\partial x_j^2}\right)_{j\neq i} = \dfrac{6 \beta^{2} x_{i}^{2} x_{j} \left(\beta^{2} - 1\right)}{\beta^{8} x_{i}^{4} + 4 \beta^{6} x_{i}^{3} x_{j} + 6 \beta^{4} x_{i}^{2} x_{j}^{2} + 4 \beta^{2} x_{i} x_{j}^{3} + x_{j}^{4}}
524  * \f]
525  */
526  CoolPropDbl d3fYijdxidxj2(const std::vector<CoolPropDbl>& x, std::size_t i, std::size_t j, const STLMatrix& beta) const;
527  /* Third order mixed partial derivative of \f$f_{Y,ij}\f$
528  * \f[
529  * \left(\dfrac{ \partial ^ 3 f_{ Y, ki }(x_k, x_i) }{\partial x_i ^ 3}\right)_{ k\neq i } = \dfrac{ \beta_{ Y ki }^{2} x_{ k }^{3} \left(-6 \beta_{ Y ki }^{2} +6\right) }{\left(\beta_{ Y ki }^{2} x_{ k } +x_{ i }\right) ^ { 4 }}
530  * \f]
531  */
532  CoolPropDbl d3fYkidxi3__constxk(const std::vector<CoolPropDbl>& x, std::size_t k, std::size_t i, const STLMatrix& beta) const;
533  /* Third order mixed partial derivative of \f$f_{Y,ij}\f$
534  * \f[
535  * \left(\dfrac{\partial^3 f_{Y,ik}(x_i, x_k)}{\partial x_i^3}\right)_{k\neq i} = \dfrac{6 \beta_{Y ik}^{2} x_{k}^{3} \left(\beta_{Y ik}^{2} - 1\right)}{\beta_{Y ik}^{8} x_{i}^{4} + 4 \beta_{Y ik}^{6} x_{i}^{3} x_{k} + 6 \beta_{Y ik}^{4} x_{i}^{2} x_{k}^{2} + 4 \beta_{Y ik}^{2} x_{i} x_{k}^{3} + x_{k}^{4}}
536  * \f]
537  */
538  CoolPropDbl d3fYikdxi3__constxk(const std::vector<CoolPropDbl>& x, std::size_t i, std::size_t k, const STLMatrix& beta) const;
539 };
540 
547 {
548  private:
549  ConstantReducingFunction(const ConstantReducingFunction& that); // No copying
550  double T_c, rhomolar_c;
551 
552  public:
553  ConstantReducingFunction(const double T_c, const double rhomolar_c) : T_c(T_c), rhomolar_c(rhomolar_c){};
554 
556  return new ConstantReducingFunction(T_c, rhomolar_c);
557  };
558 
559  void set_binary_interaction_double(const std::size_t i, const std::size_t j, const std::string& parameter, double value) {
560  return;
561  }
562  double get_binary_interaction_double(const std::size_t i, const std::size_t j, const std::string& parameter) const {
563  return _HUGE;
564  }
565 
567  CoolPropDbl Tr(const std::vector<CoolPropDbl>& x) const {
568  return T_c;
569  };
571  CoolPropDbl dTrdxi__constxj(const std::vector<CoolPropDbl>& x, std::size_t i, x_N_dependency_flag xN_flag) const {
572  return 0;
573  };
575  CoolPropDbl d2Trdxi2__constxj(const std::vector<CoolPropDbl>& x, std::size_t i, x_N_dependency_flag xN_flag) const {
576  return 0;
577  };
579  CoolPropDbl d2Trdxidxj(const std::vector<CoolPropDbl>& x, std::size_t i, std::size_t j, x_N_dependency_flag xN_flag) const {
580  return 0;
581  };
583  CoolPropDbl d3Trdxidxjdxk(const std::vector<CoolPropDbl>& x, std::size_t i, std::size_t j, std::size_t k, x_N_dependency_flag xN_flag) const {
584  return 0;
585  };
586 
588  CoolPropDbl rhormolar(const std::vector<CoolPropDbl>& x) const {
589  return rhomolar_c;
590  };
592  CoolPropDbl drhormolardxi__constxj(const std::vector<CoolPropDbl>& x, std::size_t i, x_N_dependency_flag xN_flag) const {
593  return 0;
594  };
596  CoolPropDbl d2rhormolardxi2__constxj(const std::vector<CoolPropDbl>& x, std::size_t i, x_N_dependency_flag xN_flag) const {
597  return 0;
598  };
600  CoolPropDbl d2rhormolardxidxj(const std::vector<CoolPropDbl>& x, std::size_t i, std::size_t j, x_N_dependency_flag xN_flag) const {
601  return 0;
602  };
604  CoolPropDbl d3rhormolardxidxjdxk(const std::vector<CoolPropDbl>& x, std::size_t i, std::size_t j, std::size_t k,
605  x_N_dependency_flag xN_flag) const {
606  return 0;
607  };
608 
609  CoolPropDbl dTr_dgammaT(const std::vector<CoolPropDbl>& x) const {
610  return 0;
611  }
612  CoolPropDbl dTr_dbetaT(const std::vector<CoolPropDbl>& x) const {
613  return 0;
614  }
615  CoolPropDbl drhormolar_dgammaV(const std::vector<CoolPropDbl>& x) const {
616  return 0;
617  }
618  CoolPropDbl drhormolar_dbetaV(const std::vector<CoolPropDbl>& x) const {
619  return 0;
620  }
621 
622  CoolPropDbl d2Tr_dxidgammaT(const std::vector<CoolPropDbl>& x, std::size_t i, x_N_dependency_flag xN_flag) const {
623  return 0;
624  }
625  CoolPropDbl d2Tr_dxidbetaT(const std::vector<CoolPropDbl>& x, std::size_t i, x_N_dependency_flag xN_flag) const {
626  return 0;
627  }
628  CoolPropDbl d2rhormolar_dxidgammaV(const std::vector<CoolPropDbl>& x, std::size_t i, x_N_dependency_flag xN_flag) const {
629  return 0;
630  }
631  CoolPropDbl d2rhormolar_dxidbetaV(const std::vector<CoolPropDbl>& x, std::size_t i, x_N_dependency_flag xN_flag) const {
632  return 0;
633  }
634 
635  //virtual CoolPropDbl d_ndTrdni_dxj__constxi(const std::vector<CoolPropDbl> &x, std::size_t i, std::size_t j, x_N_dependency_flag xN_flag){ return 0; };
636  //virtual CoolPropDbl d2_ndTrdni_dxj_dxk__constxi(const std::vector<CoolPropDbl> &x, std::size_t i, std::size_t j, std::size_t k, x_N_dependency_flag xN_flag){ return 0; };
637  //virtual CoolPropDbl d_ndrhorbardni_dxj__constxi(const std::vector<CoolPropDbl> &x, std::size_t i, std::size_t j, x_N_dependency_flag xN_flag){ return 0; };
638  //virtual CoolPropDbl d2_ndrhorbardni_dxj_dxk__constxi(const std::vector<CoolPropDbl> &x, std::size_t i, std::size_t j, std::size_t k, x_N_dependency_flag xN_flag){ return 0; };
639  //virtual CoolPropDbl ndrhorbardni__constnj(const std::vector<CoolPropDbl> &x, std::size_t i, x_N_dependency_flag xN_flag){ return 0; };
640  //virtual CoolPropDbl ndTrdni__constnj(const std::vector<CoolPropDbl> &x, std::size_t i, x_N_dependency_flag xN_flag){ return 0; };
641 
643  virtual CoolPropDbl PSI_rho(const std::vector<CoolPropDbl>& x, std::size_t i, x_N_dependency_flag xN_flag) const {
644  return 1;
645  };
646  virtual CoolPropDbl d_PSI_rho_dxj(const std::vector<CoolPropDbl>& x, std::size_t i, std::size_t j, x_N_dependency_flag xN_flag) const {
647  return 0;
648  };
649  virtual CoolPropDbl d2_PSI_rho_dxj_dxk(const std::vector<CoolPropDbl>& x, std::size_t i, std::size_t j, std::size_t k,
650  x_N_dependency_flag xN_flag) const {
651  return 0;
652  };
653  virtual CoolPropDbl PSI_T(const std::vector<CoolPropDbl>& x, std::size_t i, x_N_dependency_flag xN_flag) const {
654  return 0;
655  };
656  virtual CoolPropDbl d_PSI_T_dxj(const std::vector<CoolPropDbl>& x, std::size_t i, std::size_t j, x_N_dependency_flag xN_flag) const {
657  return 0;
658  };
659  virtual CoolPropDbl d2_PSI_T_dxj_dxk(const std::vector<CoolPropDbl>& x, std::size_t i, std::size_t j, std::size_t k,
660  x_N_dependency_flag xN_flag) const {
661  return 0;
662  };
663 };
664 
689 {
690  protected:
692 
693  public:
695  static void convert_to_GERG(std::vector<CoolPropFluid>& pFluids, std::size_t i, std::size_t j, const Dictionary& d, CoolPropDbl& beta_T,
696  CoolPropDbl& beta_v, CoolPropDbl& gamma_T, CoolPropDbl& gamma_v) {
697  CoolPropDbl xi_ij = d.get_number("xi");
698  CoolPropDbl zeta_ij = d.get_number("zeta");
699  beta_T = 1;
700  beta_v = 1;
701  gamma_T = (pFluids[i].EOS().reduce.T + pFluids[j].EOS().reduce.T + xi_ij) / (2 * sqrt(pFluids[i].EOS().reduce.T * pFluids[j].EOS().reduce.T));
702  CoolPropDbl v_i = 1 / pFluids[i].EOS().reduce.rhomolar;
703  CoolPropDbl v_j = 1 / pFluids[j].EOS().reduce.rhomolar;
704  CoolPropDbl one_third = 1.0 / 3.0;
705  gamma_v = (v_i + v_j + zeta_ij) / (0.25 * pow(pow(v_i, one_third) + pow(v_j, one_third), 3));
706  };
707 };
708 
709 } /* namespace CoolProp */
710 #endif