17# include "MultiComplex/MultiComplex.hpp"
30#define LIST_OF_DERIVATIVE_VARIABLES \
36 X(d2alphar_ddelta_dtau) \
38 X(d3alphar_ddelta_dtau2) \
39 X(d3alphar_ddelta2_dtau) \
42 X(d4alphar_ddelta3_dtau) \
43 X(d4alphar_ddelta2_dtau2) \
44 X(d4alphar_ddelta_dtau3) \
46 X(delta_x_dalphar_ddelta) \
47 X(tau_x_dalphar_dtau) \
48 X(delta2_x_d2alphar_ddelta2) \
49 X(deltatau_x_d2alphar_ddelta_dtau) \
50 X(tau2_x_d2alphar_dtau2)
54#define X(name) CoolPropDbl name;
60#define X(name) name = v;
65#define X(name) _new.name = name + other.name;
72#define X(name) _new.name = name * other;
81 double get(std::size_t itau, std::size_t idelta) {
85 }
else if (idelta == 1) {
86 return dalphar_ddelta;
87 }
else if (idelta == 2) {
88 return d2alphar_ddelta2;
89 }
else if (idelta == 3) {
90 return d3alphar_ddelta3;
91 }
else if (idelta == 4) {
92 return d4alphar_ddelta4;
96 }
else if (itau == 1) {
99 }
else if (idelta == 1) {
100 return d2alphar_ddelta_dtau;
101 }
else if (idelta == 2) {
102 return d3alphar_ddelta2_dtau;
103 }
else if (idelta == 3) {
104 return d4alphar_ddelta3_dtau;
108 }
else if (itau == 2) {
110 return d2alphar_dtau2;
111 }
else if (idelta == 1) {
112 return d3alphar_ddelta_dtau2;
113 }
else if (idelta == 2) {
114 return d4alphar_ddelta2_dtau2;
118 }
else if (itau == 3) {
120 return d3alphar_dtau3;
121 }
else if (idelta == 1) {
122 return d4alphar_ddelta_dtau3;
126 }
else if (itau == 4) {
128 return d4alphar_dtau4;
137#undef LIST_OF_DERIVATIVE_VARIABLES
177 all(tau, delta, deriv);
186 all(tau, delta, deriv);
187 return deriv.dalphar_dtau;
195 all(tau, delta, deriv);
196 return deriv.d2alphar_dtau2;
204 all(tau, delta, deriv);
205 return deriv.d2alphar_ddelta_dtau;
213 all(tau, delta, deriv);
214 return deriv.dalphar_ddelta;
222 all(tau, delta, deriv);
223 return deriv.d2alphar_ddelta2;
231 all(tau, delta, deriv);
232 return deriv.d3alphar_ddelta2_dtau;
240 all(tau, delta, deriv);
241 return deriv.d3alphar_ddelta_dtau2;
249 all(tau, delta, deriv);
250 return deriv.d3alphar_dtau3;
258 all(tau, delta, deriv);
259 return deriv.d3alphar_ddelta3;
267 all(tau, delta, deriv);
268 return deriv.d4alphar_dtau4;
272 all(tau, delta, deriv);
273 return deriv.d4alphar_ddelta_dtau3;
277 all(tau, delta, deriv);
278 return deriv.d4alphar_ddelta2_dtau2;
282 all(tau, delta, deriv);
283 return deriv.d4alphar_ddelta3_dtau;
287 all(tau, delta, deriv);
288 return deriv.d4alphar_ddelta4;
293 virtual mcx::MultiComplex<double> one_mcx(
const mcx::MultiComplex<double>& tau,
const mcx::MultiComplex<double>& delta)
const {
305 CoolPropDbl c,
l_double,
omega,
m_double,
eta1,
epsilon1,
eta2,
epsilon2,
beta1,
gamma1,
beta2,
gamma2;
346 std::vector<CoolPropDbl>
s;
351 std::vector<double>
n,
d,
t,
c,
l_double,
omega,
m_double,
eta1,
epsilon1,
eta2,
epsilon2,
beta1,
gamma1,
beta2,
gamma2;
357 std::vector<ResidualHelmholtzGeneralizedExponentialElement>
elements;
366 void add_Power(
const std::vector<CoolPropDbl>&
n,
const std::vector<CoolPropDbl>&
d,
const std::vector<CoolPropDbl>&
t,
367 const std::vector<CoolPropDbl>& l) {
368 for (std::size_t i = 0; i <
n.size(); ++i) {
388 void add_Exponential(
const std::vector<CoolPropDbl>&
n,
const std::vector<CoolPropDbl>&
d,
const std::vector<CoolPropDbl>&
t,
389 const std::vector<CoolPropDbl>& g,
const std::vector<CoolPropDbl>& l) {
390 for (std::size_t i = 0; i <
n.size(); ++i) {
407 void add_Gaussian(
const std::vector<CoolPropDbl>&
n,
const std::vector<CoolPropDbl>&
d,
const std::vector<CoolPropDbl>&
t,
408 const std::vector<CoolPropDbl>& eta,
const std::vector<CoolPropDbl>& epsilon,
const std::vector<CoolPropDbl>& beta,
409 const std::vector<CoolPropDbl>& gamma) {
410 for (std::size_t i = 0; i <
n.size(); ++i) {
429 void add_GERG2008Gaussian(
const std::vector<CoolPropDbl>&
n,
const std::vector<CoolPropDbl>&
d,
const std::vector<CoolPropDbl>&
t,
430 const std::vector<CoolPropDbl>& eta,
const std::vector<CoolPropDbl>& epsilon,
const std::vector<CoolPropDbl>& beta,
431 const std::vector<CoolPropDbl>& gamma) {
432 for (std::size_t i = 0; i <
n.size(); ++i) {
451 void add_Lemmon2005(
const std::vector<CoolPropDbl>&
n,
const std::vector<CoolPropDbl>&
d,
const std::vector<CoolPropDbl>&
t,
452 const std::vector<CoolPropDbl>& l,
const std::vector<CoolPropDbl>& m) {
453 for (std::size_t i = 0; i <
n.size(); ++i) {
474 void add_DoubleExponential(
const std::vector<CoolPropDbl>&
n,
const std::vector<CoolPropDbl>&
d,
const std::vector<CoolPropDbl>&
t,
475 const std::vector<CoolPropDbl>& gd,
const std::vector<CoolPropDbl>& ld,
const std::vector<CoolPropDbl>& gt,
476 const std::vector<CoolPropDbl>& lt) {
477 for (std::size_t i = 0; i <
n.size(); ++i) {
508 for (std::size_t i = 0; i <
elements.size(); ++i) {
537 void to_json(rapidjson::Value& el, rapidjson::Document& doc);
543 virtual mcx::MultiComplex<double> one_mcx(
const mcx::MultiComplex<double>& tau,
const mcx::MultiComplex<double>& delta)
const override;
556 std::vector<CoolPropDbl>
s;
557 std::vector<ResidualHelmholtzNonAnalyticElement>
elements;
566 const std::vector<CoolPropDbl>& beta,
const std::vector<CoolPropDbl>& A,
const std::vector<CoolPropDbl>& B,
567 const std::vector<CoolPropDbl>& C,
const std::vector<CoolPropDbl>& D) {
570 for (std::size_t i = 0; i < n.size(); ++i) {
583 void to_json(rapidjson::Value& el, rapidjson::Document& doc);
586 virtual mcx::MultiComplex<double> one_mcx(
const mcx::MultiComplex<double>& tau,
const mcx::MultiComplex<double>& delta)
const override;
594 std::vector<double>
z;
605 z = std::vector<double>(1, 1);
608 void to_json(rapidjson::Value& el, rapidjson::Document& doc);
627 const std::vector<CoolPropDbl>&
eta,
const std::vector<CoolPropDbl>&
beta,
const std::vector<CoolPropDbl>&
gamma,
628 const std::vector<CoolPropDbl>&
epsilon,
const std::vector<CoolPropDbl>&
b)
633 void to_json(rapidjson::Value& el, rapidjson::Document& doc);
637 virtual mcx::MultiComplex<double> one_mcx(
const mcx::MultiComplex<double>& tau,
const mcx::MultiComplex<double>& delta)
const override;
658 virtual mcx::MultiComplex<double> one_mcx(
const mcx::MultiComplex<double>& tau,
const mcx::MultiComplex<double>& delta)
const override;
716 void to_json(rapidjson::Value& el, rapidjson::Document& doc);
740 std::array<double, 16>
cache = create_filled_array<double, 16>(_HUGE);
741 std::array<bool, 16>
is_cached = create_filled_array<bool, 16>(
false);
742 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,
760 return all(tau, delta,
false).alphar;
766 return all(tau, delta,
false).dalphar_ddelta;
772 return all(tau, delta,
false).dalphar_dtau;
778 return all(tau, delta,
false).d2alphar_ddelta2;
784 return all(tau, delta,
false).d2alphar_ddelta_dtau;
790 return all(tau, delta,
false).d2alphar_dtau2;
796 return all(tau, delta,
false).d3alphar_ddelta3;
802 return all(tau, delta,
false).d3alphar_ddelta2_dtau;
808 return all(tau, delta,
false).d3alphar_ddelta_dtau2;
814 return all(tau, delta,
false).d3alphar_dtau3;
819 return all(tau, delta,
false).d4alphar_ddelta4;
822 return all(tau, delta,
false).d4alphar_ddelta3_dtau;
825 return all(tau, delta,
false).d4alphar_ddelta2_dtau2;
828 return all(tau, delta,
false).d4alphar_ddelta_dtau3;
831 return all(tau, delta,
false).d4alphar_dtau4;
866 cache[
i20] = derivs.d2alphar_ddelta2;
868 cache[
i11] = derivs.d2alphar_ddelta_dtau;
869 cache[
i30] = derivs.d3alphar_ddelta3;
871 cache[
i21] = derivs.d3alphar_ddelta2_dtau;
872 cache[
i12] = derivs.d3alphar_ddelta_dtau2;
911 void to_json(rapidjson::Value& el, rapidjson::Document& doc) {
912 el.AddMember(
"type",
"IdealHelmholtzLead", doc.GetAllocator());
913 el.AddMember(
"a1",
static_cast<double>(a1), doc.GetAllocator());
914 el.AddMember(
"a2",
static_cast<double>(a2), doc.GetAllocator());
930 std::string reference;
942 if (enabled ==
false) {
946 }
else if (ref ==
"DEF") {
956 this->reference = ref;
963 void to_json(rapidjson::Value& el, rapidjson::Document& doc) {
964 el.AddMember(
"type",
"IdealHelmholtzEnthalpyEntropyOffset", doc.GetAllocator());
965 el.AddMember(
"a1",
static_cast<double>(a1), doc.GetAllocator());
966 el.AddMember(
"a2",
static_cast<double>(a2), doc.GetAllocator());
993 void to_json(rapidjson::Value& el, rapidjson::Document& doc) {
994 el.AddMember(
"type",
"IdealHelmholtzLogTau", doc.GetAllocator());
995 el.AddMember(
"a1",
static_cast<double>(a1), doc.GetAllocator());
1009 std::vector<CoolPropDbl> n, t;
1016 IdealHelmholtzPower(
const std::vector<CoolPropDbl>& n,
const std::vector<CoolPropDbl>& t) : n(n), t(t), N(n.size()), enabled(true) {};
1022 void to_json(rapidjson::Value& el, rapidjson::Document& doc) {
1023 el.AddMember(
"type",
"IdealHelmholtzPower", doc.GetAllocator());
1080 std::vector<CoolPropDbl> n, theta, c, d;
1088 const std::vector<CoolPropDbl>& c,
const std::vector<CoolPropDbl>& d)
1089 : n(n), theta(theta), c(c), d(d), N(n.size()), enabled(true) {}
1092 void extend(
const std::vector<CoolPropDbl>& n,
const std::vector<CoolPropDbl>& theta,
const std::vector<CoolPropDbl>& c,
1093 const std::vector<CoolPropDbl>& d) {
1094 this->n.insert(this->n.end(), n.begin(), n.end());
1095 this->theta.insert(this->theta.end(), theta.begin(), theta.end());
1096 this->c.insert(this->c.end(), c.begin(), c.end());
1097 this->d.insert(this->d.end(), d.begin(), d.end());
1105 void to_json(rapidjson::Value& el, rapidjson::Document& doc) {
1106 el.AddMember(
"type",
"IdealHelmholtzPlanckEinsteinGeneralized", doc.GetAllocator());
1117 double cp_over_R, Tc, T0, tau0;
1139 void to_json(rapidjson::Value& el, rapidjson::Document& doc) {
1140 el.AddMember(
"type",
"IdealGasHelmholtzCP0Constant", doc.GetAllocator());
1141 el.AddMember(
"cp_over_R", cp_over_R, doc.GetAllocator());
1142 el.AddMember(
"Tc", Tc, doc.GetAllocator());
1143 el.AddMember(
"T0", T0, doc.GetAllocator());
1152 std::vector<CoolPropDbl> c, t;
1162 : c(c), t(t), Tc(Tc), T0(T0), tau0(Tc / T0), N(c.size()), enabled(true) {
1163 assert(c.size() == t.size());
1166 void extend(
const std::vector<CoolPropDbl>& c,
const std::vector<CoolPropDbl>& t) {
1167 this->c.insert(this->c.end(), c.begin(), c.end());
1168 this->t.insert(this->t.end(), t.begin(), t.end());
1176 void to_json(rapidjson::Value& el, rapidjson::Document& doc);
1179 virtual mcx::MultiComplex<double> one_mcx(
const mcx::MultiComplex<double>& tau,
const mcx::MultiComplex<double>& delta)
const override;
1188 std::vector<CoolPropDbl> n, theta;
1198 : n(n), theta(theta), Tc(Tc), _Tr(_HUGE), N(n.size()), enabled(true) {
1199 assert(n.size() == theta.size());
1202 void extend(
const std::vector<CoolPropDbl>& c,
const std::vector<CoolPropDbl>& t) {
1203 this->n.insert(this->n.end(), n.begin(), n.end());
1204 this->theta.insert(this->theta.end(), theta.begin(), theta.end());
1217 virtual mcx::MultiComplex<double> one_mcx(
const mcx::MultiComplex<double>& tau,
const mcx::MultiComplex<double>& delta)
const override;
1224 std::vector<CoolPropDbl> n, theta;
1234 : n(n), theta(theta), Tc(Tc), _Tr(_HUGE), N(n.size()), enabled(true) {
1235 assert(n.size() == theta.size());
1238 void extend(
const std::vector<CoolPropDbl>& n,
const std::vector<CoolPropDbl>& theta) {
1239 this->n.insert(this->n.end(), n.begin(), n.end());
1240 this->theta.insert(this->theta.end(), theta.begin(), theta.end());
1253 virtual mcx::MultiComplex<double> one_mcx(
const mcx::MultiComplex<double>& tau,
const mcx::MultiComplex<double>& delta)
const override;
1410 _prefactor = prefactor;
1445 cache[
i00] = derivs.alphar * _prefactor;
1446 cache[
i10] = derivs.dalphar_ddelta * _prefactor;
1447 cache[
i01] = derivs.dalphar_dtau * _prefactor;
1448 cache[
i20] = derivs.d2alphar_ddelta2 * _prefactor;
1449 cache[
i02] = derivs.d2alphar_dtau2 * _prefactor;
1450 cache[
i11] = derivs.d2alphar_ddelta_dtau * _prefactor;
1451 cache[
i30] = derivs.d3alphar_ddelta3 * _prefactor;
1452 cache[
i03] = derivs.d3alphar_dtau3 * _prefactor;
1453 cache[
i21] = derivs.d3alphar_ddelta2_dtau * _prefactor;
1454 cache[
i12] = derivs.d3alphar_ddelta_dtau2 * _prefactor;
1457 return derivs * _prefactor;