27# include "MultiComplex/MultiComplex.hpp"
40#define LIST_OF_DERIVATIVE_VARIABLES \
46 X(d2alphar_ddelta_dtau) \
48 X(d3alphar_ddelta_dtau2) \
49 X(d3alphar_ddelta2_dtau) \
52 X(d4alphar_ddelta3_dtau) \
53 X(d4alphar_ddelta2_dtau2) \
54 X(d4alphar_ddelta_dtau3) \
56 X(delta_x_dalphar_ddelta) \
57 X(tau_x_dalphar_dtau) \
58 X(delta2_x_d2alphar_ddelta2) \
59 X(deltatau_x_d2alphar_ddelta_dtau) \
60 X(tau2_x_d2alphar_dtau2)
64#define X(name) CoolPropDbl name;
70#define X(name) name = v;
75#define X(name) _new.name = name + other.name;
82#define X(name) _new.name = name * other;
91 double get(std::size_t itau, std::size_t idelta) {
95 }
else if (idelta == 1) {
96 return dalphar_ddelta;
97 }
else if (idelta == 2) {
98 return d2alphar_ddelta2;
99 }
else if (idelta == 3) {
100 return d3alphar_ddelta3;
101 }
else if (idelta == 4) {
102 return d4alphar_ddelta4;
106 }
else if (itau == 1) {
109 }
else if (idelta == 1) {
110 return d2alphar_ddelta_dtau;
111 }
else if (idelta == 2) {
112 return d3alphar_ddelta2_dtau;
113 }
else if (idelta == 3) {
114 return d4alphar_ddelta3_dtau;
118 }
else if (itau == 2) {
120 return d2alphar_dtau2;
121 }
else if (idelta == 1) {
122 return d3alphar_ddelta_dtau2;
123 }
else if (idelta == 2) {
124 return d4alphar_ddelta2_dtau2;
128 }
else if (itau == 3) {
130 return d3alphar_dtau3;
131 }
else if (idelta == 1) {
132 return d4alphar_ddelta_dtau3;
136 }
else if (itau == 4) {
138 return d4alphar_dtau4;
147#undef LIST_OF_DERIVATIVE_VARIABLES
187 all(tau, delta, deriv);
196 all(tau, delta, deriv);
197 return deriv.dalphar_dtau;
205 all(tau, delta, deriv);
206 return deriv.d2alphar_dtau2;
214 all(tau, delta, deriv);
215 return deriv.d2alphar_ddelta_dtau;
223 all(tau, delta, deriv);
224 return deriv.dalphar_ddelta;
232 all(tau, delta, deriv);
233 return deriv.d2alphar_ddelta2;
241 all(tau, delta, deriv);
242 return deriv.d3alphar_ddelta2_dtau;
250 all(tau, delta, deriv);
251 return deriv.d3alphar_ddelta_dtau2;
259 all(tau, delta, deriv);
260 return deriv.d3alphar_dtau3;
268 all(tau, delta, deriv);
269 return deriv.d3alphar_ddelta3;
277 all(tau, delta, deriv);
278 return deriv.d4alphar_dtau4;
282 all(tau, delta, deriv);
283 return deriv.d4alphar_ddelta_dtau3;
287 all(tau, delta, deriv);
288 return deriv.d4alphar_ddelta2_dtau2;
292 all(tau, delta, deriv);
293 return deriv.d4alphar_ddelta3_dtau;
297 all(tau, delta, deriv);
298 return deriv.d4alphar_ddelta4;
303 virtual mcx::MultiComplex<double> one_mcx(
const mcx::MultiComplex<double>& tau,
const mcx::MultiComplex<double>& delta)
const {
315 CoolPropDbl c,
l_double,
omega,
m_double,
eta1,
epsilon1,
eta2,
epsilon2,
beta1,
gamma1,
beta2,
gamma2;
357 std::vector<CoolPropDbl>
s;
362 std::vector<double>
n,
d,
t,
c,
l_double,
omega,
m_double,
eta1,
epsilon1,
eta2,
epsilon2,
beta1,
gamma1,
beta2,
gamma2;
368 std::vector<ResidualHelmholtzGeneralizedExponentialElement>
elements;
377 void add_Power(
const std::vector<CoolPropDbl>&
n,
const std::vector<CoolPropDbl>&
d,
const std::vector<CoolPropDbl>&
t,
378 const std::vector<CoolPropDbl>& l) {
379 for (std::size_t i = 0; i <
n.size(); ++i) {
399 void add_Exponential(
const std::vector<CoolPropDbl>&
n,
const std::vector<CoolPropDbl>&
d,
const std::vector<CoolPropDbl>&
t,
400 const std::vector<CoolPropDbl>& g,
const std::vector<CoolPropDbl>& l) {
401 for (std::size_t i = 0; i <
n.size(); ++i) {
418 void add_Gaussian(
const std::vector<CoolPropDbl>&
n,
const std::vector<CoolPropDbl>&
d,
const std::vector<CoolPropDbl>&
t,
419 const std::vector<CoolPropDbl>& eta,
const std::vector<CoolPropDbl>& epsilon,
const std::vector<CoolPropDbl>& beta,
420 const std::vector<CoolPropDbl>& gamma) {
421 for (std::size_t i = 0; i <
n.size(); ++i) {
440 void add_GERG2008Gaussian(
const std::vector<CoolPropDbl>&
n,
const std::vector<CoolPropDbl>&
d,
const std::vector<CoolPropDbl>&
t,
441 const std::vector<CoolPropDbl>& eta,
const std::vector<CoolPropDbl>& epsilon,
const std::vector<CoolPropDbl>& beta,
442 const std::vector<CoolPropDbl>& gamma) {
443 for (std::size_t i = 0; i <
n.size(); ++i) {
462 void add_Lemmon2005(
const std::vector<CoolPropDbl>&
n,
const std::vector<CoolPropDbl>&
d,
const std::vector<CoolPropDbl>&
t,
463 const std::vector<CoolPropDbl>& l,
const std::vector<CoolPropDbl>& m) {
464 for (std::size_t i = 0; i <
n.size(); ++i) {
485 void add_DoubleExponential(
const std::vector<CoolPropDbl>&
n,
const std::vector<CoolPropDbl>&
d,
const std::vector<CoolPropDbl>&
t,
486 const std::vector<CoolPropDbl>& gd,
const std::vector<CoolPropDbl>& ld,
const std::vector<CoolPropDbl>& gt,
487 const std::vector<CoolPropDbl>& lt) {
488 for (std::size_t i = 0; i <
n.size(); ++i) {
519 for (std::size_t i = 0; i <
elements.size(); ++i) {
552 mcx::MultiComplex<double> one_mcx(
const mcx::MultiComplex<double>& tau,
const mcx::MultiComplex<double>& delta)
const override;
565 std::vector<CoolPropDbl>
s;
566 std::vector<ResidualHelmholtzNonAnalyticElement>
elements;
576 const std::vector<CoolPropDbl>& beta,
const std::vector<CoolPropDbl>& A,
const std::vector<CoolPropDbl>& B,
577 const std::vector<CoolPropDbl>& C,
const std::vector<CoolPropDbl>& D)
581 for (std::size_t i = 0; i < n.size(); ++i) {
596 mcx::MultiComplex<double> one_mcx(
const mcx::MultiComplex<double>& tau,
const mcx::MultiComplex<double>& delta)
const override;
604 std::vector<double>
z;
616 z = std::vector<double>(1, 1);
638 const std::vector<CoolPropDbl>&
eta,
const std::vector<CoolPropDbl>&
beta,
const std::vector<CoolPropDbl>&
gamma,
639 const std::vector<CoolPropDbl>&
epsilon,
const std::vector<CoolPropDbl>&
b)
647 mcx::MultiComplex<double> one_mcx(
const mcx::MultiComplex<double>& tau,
const mcx::MultiComplex<double>& delta)
const override;
669 mcx::MultiComplex<double> one_mcx(
const mcx::MultiComplex<double>& tau,
const mcx::MultiComplex<double>& delta)
const override;
750 std::array<double, 16>
cache = create_filled_array<double, 16>(_HUGE);
751 std::array<bool, 16>
is_cached = create_filled_array<bool, 16>(
false);
752 constexpr static std::size_t
i00 = 0,
i01 = 1,
i02 = 2,
i03 = 3,
i04 = 4,
i10 = 5,
i11 = 6,
i12 = 7,
i13 = 8,
i20 = 9,
i21 = 10,
i22 = 11,
770 return all(tau, delta,
false).alphar;
776 return all(tau, delta,
false).dalphar_ddelta;
782 return all(tau, delta,
false).dalphar_dtau;
788 return all(tau, delta,
false).d2alphar_ddelta2;
794 return all(tau, delta,
false).d2alphar_ddelta_dtau;
800 return all(tau, delta,
false).d2alphar_dtau2;
806 return all(tau, delta,
false).d3alphar_ddelta3;
812 return all(tau, delta,
false).d3alphar_ddelta2_dtau;
818 return all(tau, delta,
false).d3alphar_ddelta_dtau2;
824 return all(tau, delta,
false).d3alphar_dtau3;
829 return all(tau, delta,
false).d4alphar_ddelta4;
832 return all(tau, delta,
false).d4alphar_ddelta3_dtau;
835 return all(tau, delta,
false).d4alphar_ddelta2_dtau2;
838 return all(tau, delta,
false).d4alphar_ddelta_dtau3;
841 return all(tau, delta,
false).d4alphar_dtau4;
876 cache[
i20] = derivs.d2alphar_ddelta2;
878 cache[
i11] = derivs.d2alphar_ddelta_dtau;
879 cache[
i30] = derivs.d3alphar_ddelta3;
881 cache[
i21] = derivs.d3alphar_ddelta2_dtau;
882 cache[
i12] = derivs.d3alphar_ddelta_dtau2;
934 std::string reference;
946 if (enabled ==
false) {
950 }
else if (ref ==
"DEF") {
960 this->reference = ref;
1017 std::vector<CoolPropDbl> n, t;
1024 IdealHelmholtzPower(
const std::vector<CoolPropDbl>& n,
const std::vector<CoolPropDbl>& t) : n(n), t(t), N(n.size()), enabled(true) {};
1083 std::vector<CoolPropDbl> n, theta, c, d;
1091 const std::vector<CoolPropDbl>& c,
const std::vector<CoolPropDbl>& d)
1092 : n(n), theta(theta), c(c), d(d), N(n.size()), enabled(true) {}
1095 void extend(
const std::vector<CoolPropDbl>& n,
const std::vector<CoolPropDbl>& theta,
const std::vector<CoolPropDbl>& c,
1096 const std::vector<CoolPropDbl>& d) {
1097 this->n.insert(this->n.end(), n.begin(), n.end());
1098 this->theta.insert(this->theta.end(), theta.begin(), theta.end());
1099 this->c.insert(this->c.end(), c.begin(), c.end());
1100 this->d.insert(this->d.end(), d.begin(), d.end());
1115 double cp_over_R, Tc, T0, tau0;
1121 : cp_over_R(_HUGE), Tc(_HUGE), T0(_HUGE), tau0(_HUGE), enabled(false) {
1127 : cp_over_R(cp_over_R), Tc(Tc), T0(T0), enabled(true), tau0(Tc / T0) {
1144 std::vector<CoolPropDbl> c, t;
1154 : c(c), t(t), Tc(Tc), T0(T0), tau0(Tc / T0), N(c.size()), enabled(true) {
1155 assert(c.size() == t.size());
1158 void extend(
const std::vector<CoolPropDbl>& c,
const std::vector<CoolPropDbl>& t) {
1159 this->c.insert(this->c.end(), c.begin(), c.end());
1160 this->t.insert(this->t.end(), t.begin(), t.end());
1170 mcx::MultiComplex<double> one_mcx(
const mcx::MultiComplex<double>& tau,
const mcx::MultiComplex<double>& delta)
const override;
1179 std::vector<CoolPropDbl> n, theta;
1189 : n(n), theta(theta), Tc(Tc), _Tr(_HUGE), N(n.size()), enabled(true) {
1190 assert(n.size() == theta.size());
1193 void extend(
const std::vector<CoolPropDbl>& c,
const std::vector<CoolPropDbl>& t) {
1194 this->n.insert(this->n.end(), n.begin(), n.end());
1195 this->theta.insert(this->theta.end(), theta.begin(), theta.end());
1208 mcx::MultiComplex<double> one_mcx(
const mcx::MultiComplex<double>& tau,
const mcx::MultiComplex<double>& delta)
const override;
1215 std::vector<CoolPropDbl> n, theta;
1225 : n(n), theta(theta), Tc(Tc), _Tr(_HUGE), N(n.size()), enabled(true) {
1226 assert(n.size() == theta.size());
1229 void extend(
const std::vector<CoolPropDbl>& n,
const std::vector<CoolPropDbl>& theta) {
1230 this->n.insert(this->n.end(), n.begin(), n.end());
1231 this->theta.insert(this->theta.end(), theta.begin(), theta.end());
1244 mcx::MultiComplex<double> one_mcx(
const mcx::MultiComplex<double>& tau,
const mcx::MultiComplex<double>& delta)
const override;
1399 _prefactor = prefactor;
1441 cache[
i00] = derivs.alphar * _prefactor;
1442 cache[
i10] = derivs.dalphar_ddelta * _prefactor;
1443 cache[
i01] = derivs.dalphar_dtau * _prefactor;
1444 cache[
i20] = derivs.d2alphar_ddelta2 * _prefactor;
1445 cache[
i02] = derivs.d2alphar_dtau2 * _prefactor;
1446 cache[
i11] = derivs.d2alphar_ddelta_dtau * _prefactor;
1447 cache[
i30] = derivs.d3alphar_ddelta3 * _prefactor;
1448 cache[
i03] = derivs.d3alphar_dtau3 * _prefactor;
1449 cache[
i21] = derivs.d3alphar_ddelta2_dtau * _prefactor;
1450 cache[
i12] = derivs.d3alphar_ddelta_dtau2 * _prefactor;
1453 return derivs * _prefactor;