CoolProp 6.8.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
14namespace CoolProp {
15
16typedef std::vector<std::vector<CoolPropDbl>> STLMatrix;
17
19{
22};
23
24std::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:
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, const 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