14 # include "MultiComplex/MultiComplex.hpp"
27 #define LIST_OF_DERIVATIVE_VARIABLES \
33 X(d2alphar_ddelta_dtau) \
35 X(d3alphar_ddelta_dtau2) \
36 X(d3alphar_ddelta2_dtau) \
39 X(d4alphar_ddelta3_dtau) \
40 X(d4alphar_ddelta2_dtau2) \
41 X(d4alphar_ddelta_dtau3) \
43 X(delta_x_dalphar_ddelta) \
44 X(tau_x_dalphar_dtau) \
45 X(delta2_x_d2alphar_ddelta2) \
46 X(deltatau_x_d2alphar_ddelta_dtau) \
47 X(tau2_x_d2alphar_dtau2)
51 #define X(name) CoolPropDbl name;
57 #define X(name) name = v;
63 #define X(name) _new.name = name + other.name;
70 #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) {
485 for (std::size_t i = 0; i <
elements.size(); ++i) {
514 void to_json(rapidjson::Value& el, rapidjson::Document& doc);
520 virtual mcx::MultiComplex<double> one_mcx(
const mcx::MultiComplex<double>& tau,
const mcx::MultiComplex<double>& delta)
const override;
533 std::vector<CoolPropDbl>
s;
534 std::vector<ResidualHelmholtzNonAnalyticElement>
elements;
543 const std::vector<CoolPropDbl>& beta,
const std::vector<CoolPropDbl>& A,
const std::vector<CoolPropDbl>& B,
544 const std::vector<CoolPropDbl>& C,
const std::vector<CoolPropDbl>& D) {
547 for (std::size_t i = 0; i < n.size(); ++i) {
560 void to_json(rapidjson::Value& el, rapidjson::Document& doc);
563 virtual mcx::MultiComplex<double> one_mcx(
const mcx::MultiComplex<double>& tau,
const mcx::MultiComplex<double>& delta)
const override;
571 std::vector<double>
z;
582 z = std::vector<double>(1, 1);
585 void to_json(rapidjson::Value& el, rapidjson::Document& doc);
604 const std::vector<CoolPropDbl>&
eta,
const std::vector<CoolPropDbl>&
beta,
const std::vector<CoolPropDbl>&
gamma,
605 const std::vector<CoolPropDbl>&
epsilon,
const std::vector<CoolPropDbl>&
b)
610 void to_json(rapidjson::Value& el, rapidjson::Document& doc);
614 virtual mcx::MultiComplex<double> one_mcx(
const mcx::MultiComplex<double>& tau,
const mcx::MultiComplex<double>& delta)
const override;
635 virtual mcx::MultiComplex<double> one_mcx(
const mcx::MultiComplex<double>& tau,
const mcx::MultiComplex<double>& delta)
const override;
693 void to_json(rapidjson::Value& el, rapidjson::Document& doc);
743 if (!
_base || dont_use_cache)
744 return all(tau, delta,
false).alphar;
749 if (!
_dDelta || dont_use_cache)
750 return all(tau, delta,
false).dalphar_ddelta;
755 if (!
_dTau || dont_use_cache)
756 return all(tau, delta,
false).dalphar_dtau;
762 return all(tau, delta,
false).d2alphar_ddelta2;
768 return all(tau, delta,
false).d2alphar_ddelta_dtau;
773 if (!
_dTau2 || dont_use_cache)
774 return all(tau, delta,
false).d2alphar_dtau2;
780 return all(tau, delta,
false).d3alphar_ddelta3;
786 return all(tau, delta,
false).d3alphar_ddelta2_dtau;
792 return all(tau, delta,
false).d3alphar_ddelta_dtau2;
797 if (!
_dTau3 || dont_use_cache)
798 return all(tau, delta,
false).d3alphar_dtau3;
803 return all(tau, delta,
false).d4alphar_ddelta4;
806 return all(tau, delta,
false).d4alphar_ddelta3_dtau;
809 return all(tau, delta,
false).d4alphar_ddelta2_dtau2;
812 return all(tau, delta,
false).d4alphar_ddelta_dtau3;
815 return all(tau, delta,
false).d4alphar_dtau4;
847 _base = derivs.alphar;
848 _dDelta = derivs.dalphar_ddelta;
849 _dTau = derivs.dalphar_dtau;
851 _dTau2 = derivs.d2alphar_dtau2;
854 _dTau3 = derivs.d3alphar_dtau3;
894 void to_json(rapidjson::Value& el, rapidjson::Document& doc) {
895 el.AddMember(
"type",
"IdealHelmholtzLead", doc.GetAllocator());
896 el.AddMember(
"a1",
static_cast<double>(a1), doc.GetAllocator());
897 el.AddMember(
"a2",
static_cast<double>(a2), doc.GetAllocator());
913 std::string reference;
925 if (enabled ==
false) {
929 }
else if (ref ==
"DEF") {
939 this->reference = ref;
946 void to_json(rapidjson::Value& el, rapidjson::Document& doc) {
947 el.AddMember(
"type",
"IdealHelmholtzEnthalpyEntropyOffset", doc.GetAllocator());
948 el.AddMember(
"a1",
static_cast<double>(a1), doc.GetAllocator());
949 el.AddMember(
"a2",
static_cast<double>(a2), doc.GetAllocator());
976 void to_json(rapidjson::Value& el, rapidjson::Document& doc) {
977 el.AddMember(
"type",
"IdealHelmholtzLogTau", doc.GetAllocator());
978 el.AddMember(
"a1",
static_cast<double>(a1), doc.GetAllocator());
992 std::vector<CoolPropDbl> n, t;
999 IdealHelmholtzPower(
const std::vector<CoolPropDbl>& n,
const std::vector<CoolPropDbl>& t) : n(n), t(t), N(n.size()), enabled(true){};
1005 void to_json(rapidjson::Value& el, rapidjson::Document& doc) {
1006 el.AddMember(
"type",
"IdealHelmholtzPower", doc.GetAllocator());
1063 std::vector<CoolPropDbl> n, theta, c, d;
1071 const std::vector<CoolPropDbl>& c,
const std::vector<CoolPropDbl>& d)
1072 : n(n), theta(theta), c(c), d(d), N(n.size()), enabled(true) {}
1075 void extend(
const std::vector<CoolPropDbl>& n,
const std::vector<CoolPropDbl>& theta,
const std::vector<CoolPropDbl>& c,
1076 const std::vector<CoolPropDbl>& d) {
1077 this->n.insert(this->n.end(), n.begin(), n.end());
1078 this->theta.insert(this->theta.end(), theta.begin(), theta.end());
1079 this->c.insert(this->c.end(), c.begin(), c.end());
1080 this->d.insert(this->d.end(), d.begin(), d.end());
1088 void to_json(rapidjson::Value& el, rapidjson::Document& doc) {
1089 el.AddMember(
"type",
"IdealHelmholtzPlanckEinsteinGeneralized", doc.GetAllocator());
1100 double cp_over_R, Tc, T0, tau0;
1122 void to_json(rapidjson::Value& el, rapidjson::Document& doc) {
1123 el.AddMember(
"type",
"IdealGasHelmholtzCP0Constant", doc.GetAllocator());
1124 el.AddMember(
"cp_over_R", cp_over_R, doc.GetAllocator());
1125 el.AddMember(
"Tc", Tc, doc.GetAllocator());
1126 el.AddMember(
"T0", T0, doc.GetAllocator());
1135 std::vector<CoolPropDbl> c, t;
1145 : c(c), t(t), Tc(Tc), T0(T0), tau0(Tc / T0), N(c.size()), enabled(true) {
1146 assert(c.size() == t.size());
1149 void extend(
const std::vector<CoolPropDbl>& c,
const std::vector<CoolPropDbl>& t) {
1150 this->c.insert(this->c.end(), c.begin(), c.end());
1151 this->t.insert(this->t.end(), t.begin(), t.end());
1159 void to_json(rapidjson::Value& el, rapidjson::Document& doc);
1162 virtual mcx::MultiComplex<double> one_mcx(
const mcx::MultiComplex<double>& tau,
const mcx::MultiComplex<double>& delta)
const override;
1171 std::vector<CoolPropDbl> n, theta;
1181 : n(n), theta(theta), Tc(Tc), _Tr(_HUGE), N(n.size()), enabled(true) {
1182 assert(n.size() == theta.size());
1185 void extend(
const std::vector<CoolPropDbl>& c,
const std::vector<CoolPropDbl>& t) {
1186 this->n.insert(this->n.end(), n.begin(), n.end());
1187 this->theta.insert(this->theta.end(), theta.begin(), theta.end());
1200 virtual mcx::MultiComplex<double> one_mcx(
const mcx::MultiComplex<double>& tau,
const mcx::MultiComplex<double>& delta)
const override;
1207 std::vector<CoolPropDbl> n, theta;
1217 : n(n), theta(theta), Tc(Tc), _Tr(_HUGE), N(n.size()), enabled(true) {
1218 assert(n.size() == theta.size());
1221 void extend(
const std::vector<CoolPropDbl>& n,
const std::vector<CoolPropDbl>& theta) {
1222 this->n.insert(this->n.end(), n.begin(), n.end());
1223 this->theta.insert(this->theta.end(), theta.begin(), theta.end());
1236 virtual mcx::MultiComplex<double> one_mcx(
const mcx::MultiComplex<double>& tau,
const mcx::MultiComplex<double>& delta)
const override;
1394 _prefactor = prefactor;
1429 _base = derivs.alphar * _prefactor;
1430 _dDelta = derivs.dalphar_ddelta * _prefactor;
1431 _dTau = derivs.dalphar_dtau * _prefactor;
1432 _dDelta2 = derivs.d2alphar_ddelta2 * _prefactor;
1433 _dTau2 = derivs.d2alphar_dtau2 * _prefactor;
1434 _dDelta_dTau = derivs.d2alphar_ddelta_dtau * _prefactor;
1435 _dDelta3 = derivs.d3alphar_ddelta3 * _prefactor;
1436 _dTau3 = derivs.d3alphar_dtau3 * _prefactor;
1440 return derivs * _prefactor;