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;
66#define X(name) _new.name = name + other.name;
73#define X(name) _new.name = name * other;
84 double get(std::size_t itau, std::size_t idelta) {
88 }
else if (idelta == 1) {
89 return dalphar_ddelta;
90 }
else if (idelta == 2) {
91 return d2alphar_ddelta2;
92 }
else if (idelta == 3) {
93 return d3alphar_ddelta3;
94 }
else if (idelta == 4) {
95 return d4alphar_ddelta4;
99 }
else if (itau == 1) {
102 }
else if (idelta == 1) {
103 return d2alphar_ddelta_dtau;
104 }
else if (idelta == 2) {
105 return d3alphar_ddelta2_dtau;
106 }
else if (idelta == 3) {
107 return d4alphar_ddelta3_dtau;
111 }
else if (itau == 2) {
113 return d2alphar_dtau2;
114 }
else if (idelta == 1) {
115 return d3alphar_ddelta_dtau2;
116 }
else if (idelta == 2) {
117 return d4alphar_ddelta2_dtau2;
121 }
else if (itau == 3) {
123 return d3alphar_dtau3;
124 }
else if (idelta == 1) {
125 return d4alphar_ddelta_dtau3;
129 }
else if (itau == 4) {
131 return d4alphar_dtau4;
140#undef LIST_OF_DERIVATIVE_VARIABLES
180 all(tau, delta, deriv);
189 all(tau, delta, deriv);
190 return deriv.dalphar_dtau;
198 all(tau, delta, deriv);
199 return deriv.d2alphar_dtau2;
207 all(tau, delta, deriv);
208 return deriv.d2alphar_ddelta_dtau;
216 all(tau, delta, deriv);
217 return deriv.dalphar_ddelta;
225 all(tau, delta, deriv);
226 return deriv.d2alphar_ddelta2;
234 all(tau, delta, deriv);
235 return deriv.d3alphar_ddelta2_dtau;
243 all(tau, delta, deriv);
244 return deriv.d3alphar_ddelta_dtau2;
252 all(tau, delta, deriv);
253 return deriv.d3alphar_dtau3;
261 all(tau, delta, deriv);
262 return deriv.d3alphar_ddelta3;
270 all(tau, delta, deriv);
271 return deriv.d4alphar_dtau4;
275 all(tau, delta, deriv);
276 return deriv.d4alphar_ddelta_dtau3;
280 all(tau, delta, deriv);
281 return deriv.d4alphar_ddelta2_dtau2;
285 all(tau, delta, deriv);
286 return deriv.d4alphar_ddelta3_dtau;
290 all(tau, delta, deriv);
291 return deriv.d4alphar_ddelta4;
296 virtual mcx::MultiComplex<double> one_mcx(
const mcx::MultiComplex<double>& tau,
const mcx::MultiComplex<double>& delta)
const {
308 CoolPropDbl c,
l_double,
omega,
m_double,
eta1,
epsilon1,
eta2,
epsilon2,
beta1,
gamma1,
beta2,
gamma2;
349 std::vector<CoolPropDbl>
s;
354 std::vector<double>
n,
d,
t,
c,
l_double,
omega,
m_double,
eta1,
epsilon1,
eta2,
epsilon2,
beta1,
gamma1,
beta2,
gamma2;
360 std::vector<ResidualHelmholtzGeneralizedExponentialElement>
elements;
369 void add_Power(
const std::vector<CoolPropDbl>&
n,
const std::vector<CoolPropDbl>&
d,
const std::vector<CoolPropDbl>&
t,
370 const std::vector<CoolPropDbl>& l) {
371 for (std::size_t i = 0; i <
n.size(); ++i) {
391 void add_Exponential(
const std::vector<CoolPropDbl>&
n,
const std::vector<CoolPropDbl>&
d,
const std::vector<CoolPropDbl>&
t,
392 const std::vector<CoolPropDbl>& g,
const std::vector<CoolPropDbl>& l) {
393 for (std::size_t i = 0; i <
n.size(); ++i) {
410 void add_Gaussian(
const std::vector<CoolPropDbl>&
n,
const std::vector<CoolPropDbl>&
d,
const std::vector<CoolPropDbl>&
t,
411 const std::vector<CoolPropDbl>& eta,
const std::vector<CoolPropDbl>& epsilon,
const std::vector<CoolPropDbl>& beta,
412 const std::vector<CoolPropDbl>& gamma) {
413 for (std::size_t i = 0; i <
n.size(); ++i) {
432 void add_GERG2008Gaussian(
const std::vector<CoolPropDbl>&
n,
const std::vector<CoolPropDbl>&
d,
const std::vector<CoolPropDbl>&
t,
433 const std::vector<CoolPropDbl>& eta,
const std::vector<CoolPropDbl>& epsilon,
const std::vector<CoolPropDbl>& beta,
434 const std::vector<CoolPropDbl>& gamma) {
435 for (std::size_t i = 0; i <
n.size(); ++i) {
454 void add_Lemmon2005(
const std::vector<CoolPropDbl>&
n,
const std::vector<CoolPropDbl>&
d,
const std::vector<CoolPropDbl>&
t,
455 const std::vector<CoolPropDbl>& l,
const std::vector<CoolPropDbl>& m) {
456 for (std::size_t i = 0; i <
n.size(); ++i) {
478 const std::vector<CoolPropDbl>&
n,
const std::vector<CoolPropDbl>&
d,
const std::vector<CoolPropDbl>&
t,
479 const std::vector<CoolPropDbl>& gd,
const std::vector<CoolPropDbl>& ld,
480 const std::vector<CoolPropDbl>& gt,
const std::vector<CoolPropDbl>& lt) {
481 for (std::size_t i = 0; i <
n.size(); ++i) {
512 for (std::size_t i = 0; i <
elements.size(); ++i) {
541 void to_json(rapidjson::Value& el, rapidjson::Document& doc);
547 virtual mcx::MultiComplex<double> one_mcx(
const mcx::MultiComplex<double>& tau,
const mcx::MultiComplex<double>& delta)
const override;
560 std::vector<CoolPropDbl>
s;
561 std::vector<ResidualHelmholtzNonAnalyticElement>
elements;
570 const std::vector<CoolPropDbl>& beta,
const std::vector<CoolPropDbl>& A,
const std::vector<CoolPropDbl>& B,
571 const std::vector<CoolPropDbl>& C,
const std::vector<CoolPropDbl>& D) {
574 for (std::size_t i = 0; i < n.size(); ++i) {
587 void to_json(rapidjson::Value& el, rapidjson::Document& doc);
590 virtual mcx::MultiComplex<double> one_mcx(
const mcx::MultiComplex<double>& tau,
const mcx::MultiComplex<double>& delta)
const override;
598 std::vector<double>
z;
609 z = std::vector<double>(1, 1);
612 void to_json(rapidjson::Value& el, rapidjson::Document& doc);
631 const std::vector<CoolPropDbl>&
eta,
const std::vector<CoolPropDbl>&
beta,
const std::vector<CoolPropDbl>&
gamma,
632 const std::vector<CoolPropDbl>&
epsilon,
const std::vector<CoolPropDbl>&
b)
637 void to_json(rapidjson::Value& el, rapidjson::Document& doc);
641 virtual mcx::MultiComplex<double> one_mcx(
const mcx::MultiComplex<double>& tau,
const mcx::MultiComplex<double>& delta)
const override;
662 virtual mcx::MultiComplex<double> one_mcx(
const mcx::MultiComplex<double>& tau,
const mcx::MultiComplex<double>& delta)
const override;
720 void to_json(rapidjson::Value& el, rapidjson::Document& doc);
744 std::array<double, 16>
cache = create_filled_array<double, 16>(_HUGE);
745 std::array<bool, 16>
is_cached = create_filled_array<bool, 16>(
false);
767 return all(tau, delta,
false).alphar;
773 return all(tau, delta,
false).dalphar_ddelta;
779 return all(tau, delta,
false).dalphar_dtau;
785 return all(tau, delta,
false).d2alphar_ddelta2;
791 return all(tau, delta,
false).d2alphar_ddelta_dtau;
797 return all(tau, delta,
false).d2alphar_dtau2;
803 return all(tau, delta,
false).d3alphar_ddelta3;
809 return all(tau, delta,
false).d3alphar_ddelta2_dtau;
815 return all(tau, delta,
false).d3alphar_ddelta_dtau2;
821 return all(tau, delta,
false).d3alphar_dtau3;
826 return all(tau, delta,
false).d4alphar_ddelta4;
829 return all(tau, delta,
false).d4alphar_ddelta3_dtau;
832 return all(tau, delta,
false).d4alphar_ddelta2_dtau2;
835 return all(tau, delta,
false).d4alphar_ddelta_dtau3;
838 return all(tau, delta,
false).d4alphar_dtau4;
873 cache[
i20] = derivs.d2alphar_ddelta2;
875 cache[
i11] = derivs.d2alphar_ddelta_dtau;
876 cache[
i30] = derivs.d3alphar_ddelta3;
878 cache[
i21] = derivs.d3alphar_ddelta2_dtau;
879 cache[
i12] = derivs.d3alphar_ddelta_dtau2;
918 void to_json(rapidjson::Value& el, rapidjson::Document& doc) {
919 el.AddMember(
"type",
"IdealHelmholtzLead", doc.GetAllocator());
920 el.AddMember(
"a1",
static_cast<double>(a1), doc.GetAllocator());
921 el.AddMember(
"a2",
static_cast<double>(a2), doc.GetAllocator());
937 std::string reference;
949 if (enabled ==
false) {
953 }
else if (ref ==
"DEF") {
963 this->reference = ref;
970 void to_json(rapidjson::Value& el, rapidjson::Document& doc) {
971 el.AddMember(
"type",
"IdealHelmholtzEnthalpyEntropyOffset", doc.GetAllocator());
972 el.AddMember(
"a1",
static_cast<double>(a1), doc.GetAllocator());
973 el.AddMember(
"a2",
static_cast<double>(a2), doc.GetAllocator());
1000 void to_json(rapidjson::Value& el, rapidjson::Document& doc) {
1001 el.AddMember(
"type",
"IdealHelmholtzLogTau", doc.GetAllocator());
1002 el.AddMember(
"a1",
static_cast<double>(a1), doc.GetAllocator());
1016 std::vector<CoolPropDbl> n, t;
1023 IdealHelmholtzPower(
const std::vector<CoolPropDbl>& n,
const std::vector<CoolPropDbl>& t) : n(n), t(t), N(n.size()), enabled(true){};
1029 void to_json(rapidjson::Value& el, rapidjson::Document& doc) {
1030 el.AddMember(
"type",
"IdealHelmholtzPower", doc.GetAllocator());
1087 std::vector<CoolPropDbl> n, theta, c, d;
1095 const std::vector<CoolPropDbl>& c,
const std::vector<CoolPropDbl>& d)
1096 : n(n), theta(theta), c(c), d(d), N(n.size()), enabled(true) {}
1099 void extend(
const std::vector<CoolPropDbl>& n,
const std::vector<CoolPropDbl>& theta,
const std::vector<CoolPropDbl>& c,
1100 const std::vector<CoolPropDbl>& d) {
1101 this->n.insert(this->n.end(), n.begin(), n.end());
1102 this->theta.insert(this->theta.end(), theta.begin(), theta.end());
1103 this->c.insert(this->c.end(), c.begin(), c.end());
1104 this->d.insert(this->d.end(), d.begin(), d.end());
1112 void to_json(rapidjson::Value& el, rapidjson::Document& doc) {
1113 el.AddMember(
"type",
"IdealHelmholtzPlanckEinsteinGeneralized", doc.GetAllocator());
1124 double cp_over_R, Tc, T0, tau0;
1146 void to_json(rapidjson::Value& el, rapidjson::Document& doc) {
1147 el.AddMember(
"type",
"IdealGasHelmholtzCP0Constant", doc.GetAllocator());
1148 el.AddMember(
"cp_over_R", cp_over_R, doc.GetAllocator());
1149 el.AddMember(
"Tc", Tc, doc.GetAllocator());
1150 el.AddMember(
"T0", T0, doc.GetAllocator());
1159 std::vector<CoolPropDbl> c, t;
1169 : c(c), t(t), Tc(Tc), T0(T0), tau0(Tc / T0), N(c.size()), enabled(true) {
1170 assert(c.size() == t.size());
1173 void extend(
const std::vector<CoolPropDbl>& c,
const std::vector<CoolPropDbl>& t) {
1174 this->c.insert(this->c.end(), c.begin(), c.end());
1175 this->t.insert(this->t.end(), t.begin(), t.end());
1183 void to_json(rapidjson::Value& el, rapidjson::Document& doc);
1186 virtual mcx::MultiComplex<double> one_mcx(
const mcx::MultiComplex<double>& tau,
const mcx::MultiComplex<double>& delta)
const override;
1195 std::vector<CoolPropDbl> n, theta;
1205 : n(n), theta(theta), Tc(Tc), _Tr(_HUGE), N(n.size()), enabled(true) {
1206 assert(n.size() == theta.size());
1209 void extend(
const std::vector<CoolPropDbl>& c,
const std::vector<CoolPropDbl>& t) {
1210 this->n.insert(this->n.end(), n.begin(), n.end());
1211 this->theta.insert(this->theta.end(), theta.begin(), theta.end());
1224 virtual mcx::MultiComplex<double> one_mcx(
const mcx::MultiComplex<double>& tau,
const mcx::MultiComplex<double>& delta)
const override;
1231 std::vector<CoolPropDbl> n, theta;
1241 : n(n), theta(theta), Tc(Tc), _Tr(_HUGE), N(n.size()), enabled(true) {
1242 assert(n.size() == theta.size());
1245 void extend(
const std::vector<CoolPropDbl>& n,
const std::vector<CoolPropDbl>& theta) {
1246 this->n.insert(this->n.end(), n.begin(), n.end());
1247 this->theta.insert(this->theta.end(), theta.begin(), theta.end());
1260 virtual mcx::MultiComplex<double> one_mcx(
const mcx::MultiComplex<double>& tau,
const mcx::MultiComplex<double>& delta)
const override;
1418 _prefactor = prefactor;
1453 cache[
i00] = derivs.alphar * _prefactor;
1454 cache[
i10] = derivs.dalphar_ddelta * _prefactor;
1455 cache[
i01] = derivs.dalphar_dtau * _prefactor;
1456 cache[
i20] = derivs.d2alphar_ddelta2 * _prefactor;
1457 cache[
i02] = derivs.d2alphar_dtau2 * _prefactor;
1458 cache[
i11] = derivs.d2alphar_ddelta_dtau * _prefactor;
1459 cache[
i30] = derivs.d3alphar_ddelta3 * _prefactor;
1460 cache[
i03] = derivs.d3alphar_dtau3 * _prefactor;
1461 cache[
i21] = derivs.d3alphar_ddelta2_dtau * _prefactor;
1462 cache[
i12] = derivs.d3alphar_ddelta_dtau2 * _prefactor;
1465 return derivs * _prefactor;