teqp 0.19.1
Loading...
Searching...
No Matches
multifluid_eosterms.hpp
Go to the documentation of this file.
1#pragma once
2
3#include "teqp/types.hpp"
4
5namespace teqp {
6
11public:
12 Eigen::ArrayXd n, t, d;
13
14 template<typename TauType, typename DeltaType>
15 auto alphar(const TauType& tau, const DeltaType& delta) const {
16 using result = std::common_type_t<TauType, DeltaType>;
17 result r = 0.0, lntau = log(tau);
18 double base_delta = getbaseval(delta);
19 if (base_delta == 0) {
20 for (auto i = 0; i < n.size(); ++i) {
21 r = r + n[i] * exp(t[i] * lntau)*powi(delta, static_cast<int>(d[i]));
22 }
23 }
24 else {
25 result lndelta = log(delta);
26 for (auto i = 0; i < n.size(); ++i) {
27 r = r + n[i] * exp(t[i] * lntau + d[i] * lndelta);
28 }
29 }
30 return forceeval(r);
31 }
32};
33
38public:
39 Eigen::ArrayXd n, t, d, c, l;
40 Eigen::ArrayXi l_i;
41
42 template<typename TauType, typename DeltaType>
43 auto alphar(const TauType& tau, const DeltaType& delta) const {
44 using result = std::common_type_t<TauType, DeltaType>;
45 result r = 0.0, lntau = log(tau);
46 if (l_i.size() == 0 && n.size() > 0) {
47 throw std::invalid_argument("l_i cannot be zero length if some terms are provided");
48 }
49 if (getbaseval(delta) == 0) {
50 for (auto i = 0; i < n.size(); ++i) {
51 r = r + n[i] * exp(t[i] * lntau - c[i] * powi(delta, l_i[i])) * powi(delta, static_cast<int>(d[i]));
52 }
53 }
54 else {
55 result lndelta = log(delta);
56 for (auto i = 0; i < n.size(); ++i) {
57 r = r + n[i] * exp(t[i] * lntau + d[i] * lndelta - c[i] * powi(delta, l_i[i]));
58 }
59 }
60 return forceeval(r);
61 }
62};
63
68public:
69 Eigen::ArrayXd n, t, d, g, l;
70 Eigen::ArrayXi l_i;
71
72 template<typename TauType, typename DeltaType>
73 auto alphar(const TauType& tau, const DeltaType& delta) const {
74 using result = std::common_type_t<TauType, DeltaType>;
75 result r = 0.0, lntau = log(tau);
76 if (getbaseval(delta) == 0) {
77 for (auto i = 0; i < n.size(); ++i) {
78 r = r + n[i] * exp(t[i] * lntau - g[i] * powi(delta, l_i[i]))*powi(delta,static_cast<int>(d[i]));
79 }
80 }
81 else {
82 result lndelta = log(delta);
83 for (auto i = 0; i < n.size(); ++i) {
84 r = r + n[i] * exp(t[i] * lntau + d[i] * lndelta - g[i] * powi(delta, l_i[i]));
85 }
86 }
87 return forceeval(r);
88 }
89};
90
95public:
96 Eigen::ArrayXd n, t, d, gd, ld, gt, lt;
97 Eigen::ArrayXi ld_i;
98
99 template<typename TauType, typename DeltaType>
100 auto alphar(const TauType& tau, const DeltaType& delta) const {
101 using result = std::common_type_t<TauType, DeltaType>;
102 result r = 0.0, lntau = log(tau);
103 if (ld_i.size() == 0 && n.size() > 0) {
104 throw std::invalid_argument("ld_i cannot be zero length if some terms are provided");
105 }
106 if (getbaseval(delta) == 0) {
107 for (auto i = 0; i < n.size(); ++i) {
108 r = r + n[i] * powi(delta, static_cast<int>(d[i])) * exp(t[i] * lntau - gd[i]*powi(delta, ld_i[i]) - gt[i]*pow(tau, lt[i]));
109 }
110 }
111 else {
112 result lndelta = log(delta);
113 for (auto i = 0; i < n.size(); ++i) {
114 r = r + n[i] * exp(t[i] * lntau + d[i] * lndelta - gd[i]*powi(delta, ld_i[i]) - gt[i]*pow(tau, lt[i]));
115 }
116 }
117 return forceeval(r);
118 }
119};
120
125public:
126 Eigen::ArrayXd n, t, d, eta, beta, gamma, epsilon;
127
128 template<typename TauType, typename DeltaType>
129 auto alphar(const TauType& tau, const DeltaType& delta) const {
130 using result = std::common_type_t<TauType, DeltaType>;
131 result r = 0.0, lntau = log(tau);
132 auto square = [](auto x) { return x * x; };
133 if (getbaseval(delta) == 0) {
134 for (auto i = 0; i < n.size(); ++i) {
135 r = r + n[i] * exp(t[i] * lntau - eta[i] * square(delta - epsilon[i]) - beta[i] * square(tau - gamma[i]))*powi(delta, static_cast<int>(d[i]));
136 }
137 }
138 else {
139 result lndelta = log(delta);
140 for (auto i = 0; i < n.size(); ++i) {
141 r = r + n[i] * exp(t[i] * lntau + d[i] * lndelta - eta[i] * square(delta - epsilon[i]) - beta[i] * square(tau - gamma[i]));
142 }
143 }
144 return forceeval(r);
145 }
146};
147
152public:
153 Eigen::ArrayXd n, t, d, eta, beta, gamma, epsilon;
154
155 template<typename TauType, typename DeltaType>
156 auto alphar(const TauType& tau, const DeltaType& delta) const {
157 using result = std::common_type_t<TauType, DeltaType>;
158 result r = 0.0, lntau = log(tau);
159 auto square = [](auto x) { return x * x; };
160 if (getbaseval(delta) == 0) {
161 for (auto i = 0; i < n.size(); ++i) {
162 r = r + n[i] * exp(t[i] * lntau - eta[i] * square(delta - epsilon[i]) - beta[i] * (delta - gamma[i]))*powi(delta, static_cast<int>(d[i]));
163 }
164 }
165 else {
166 result lndelta = log(delta);
167 for (auto i = 0; i < n.size(); ++i) {
168 r = r + n[i] * exp(t[i] * lntau + d[i] * lndelta - eta[i] * square(delta - epsilon[i]) - beta[i] * (delta - gamma[i]));
169 }
170 }
171 return forceeval(r);
172 }
173};
174
175
180public:
181 Eigen::ArrayXd n, t, d, l, m;
182 Eigen::ArrayXi l_i;
183
184 template<typename TauType, typename DeltaType>
185 auto alphar(const TauType& tau, const DeltaType& delta) const {
186 using result = std::common_type_t<TauType, DeltaType>;
187 result r = 0.0, lntau = log(tau);
188 if (getbaseval(delta) == 0) {
189 for (auto i = 0; i < n.size(); ++i) {
190 r = r + n[i] * exp(t[i] * lntau - powi(delta, l_i[i]) - pow(tau, m[i]))*powi(delta, static_cast<int>(d[i]));
191 }
192 }
193 else {
194 result lndelta = log(delta);
195 for (auto i = 0; i < n.size(); ++i) {
196 r = r + n[i] * exp(t[i] * lntau + d[i] * lndelta - powi(delta, l_i[i]) - pow(tau, m[i]));
197 }
198 }
199 return forceeval(r);
200 }
201};
202
207public:
208 Eigen::ArrayXd n, t, d, eta, beta, gamma, epsilon, b;
209
210 template<typename TauType, typename DeltaType>
211 auto alphar(const TauType& tau, const DeltaType& delta) const {
212
213 using result = std::common_type_t<TauType, DeltaType>;
214 result r = 0.0, lntau = log(tau);
215 auto square = [](auto x) { return x * x; };
216 if (getbaseval(delta) == 0) {
217 for (auto i = 0; i < n.size(); ++i) {
218 r = r + n[i] * exp(t[i] * lntau - eta[i] * square(delta - epsilon[i]) + 1.0 / (beta[i] * square(tau - gamma[i]) + b[i]))*powi(delta, static_cast<int>(d[i]));
219 }
220 }
221 else {
222 result lndelta = log(delta);
223 for (auto i = 0; i < n.size(); ++i) {
224 r = r + n[i] * exp(t[i] * lntau + d[i] * lndelta - eta[i] * square(delta - epsilon[i]) + 1.0 / (beta[i] * square(tau - gamma[i]) + b[i]));
225 }
226 }
227 return forceeval(r);
228 }
229};
230
235public:
236 Eigen::ArrayXXd a;
237 double taumin = -1, taumax = -1, deltamin = -1, deltamax = -1;
238
240 template<typename vectype, typename XType>
241 static auto Clenshaw1D(const vectype &c, const XType &ind){
242 int N = static_cast<int>(c.size()) - 1;
243 std::common_type_t<typename vectype::Scalar, XType> u_k = 0, u_kp1 = 0, u_kp2 = 0;
244 for (int k = N; k >= 0; --k){
245 // Do the recurrent calculation
246 u_k = 2.0*ind*u_kp1 - u_kp2 + c[k];
247 if (k > 0){
248 // Update the values
249 u_kp2 = u_kp1; u_kp1 = u_k;
250 }
251 }
252 return (u_k - u_kp2)/2.0;
253 }
254
256 template<typename MatType, typename XType>
257 static auto Clenshaw1DByRow(const MatType& c, const XType &ind) {
258 int N = static_cast<int>(c.rows()) - 1;
259 constexpr int Cols = MatType::ColsAtCompileTime;
260 using NumType = std::common_type_t<typename MatType::Scalar, XType>;
261 static Eigen::Array<NumType, 1, Cols> u_k, u_kp1, u_kp2;
262 // Not statically sized, need to resize
263 if constexpr (Cols == Eigen::Dynamic) {
264 int M = static_cast<int>(c.rows());
265 u_k.resize(M);
266 u_kp1.resize(M);
267 u_kp2.resize(M);
268 }
269 u_k.setZero(); u_kp1.setZero(); u_kp2.setZero();
270
271 for (int k = N; k >= 0; --k) {
272 // Do the recurrent calculation
273 u_k = 2.0 * ind * u_kp1 - u_kp2 + c.row(k);
274 if (k > 0) {
275 // Update the values
276 u_kp2 = u_kp1; u_kp1 = u_k;
277 }
278 }
279 return (u_k - u_kp2) / 2.0;
280 }
281
287 template<typename MatType, typename XType, typename YType>
288 static auto Clenshaw2DEigen(const MatType& a, const XType &x, const YType &y) {
289 auto b = Clenshaw1DByRow(a, y);
290 return Clenshaw1D(b.matrix(), x);
291 }
292
293 template<typename TauType, typename DeltaType>
294 auto alphar(const TauType& tau, const DeltaType& delta) const {
295 TauType x = (2.0*tau - (taumax + taumin)) / (taumax - taumin);
296 DeltaType y = (2.0*delta - (deltamax + deltamin)) / (deltamax - deltamin);
298 }
299};
300
305public:
306 template<typename TauType, typename DeltaType>
307 auto alphar(const TauType& /*tau*/, const DeltaType& /*delta*/) const {
308 return static_cast<std::common_type_t<TauType, DeltaType>>(0.0);
309 }
310};
311
313public:
314 Eigen::ArrayXd A, B, C, D, a, b, beta, n;
315
316 template<typename TauType, typename DeltaType>
317 auto alphar(const TauType& tau, const DeltaType& delta) const {
318 // The non-analytic term
319 auto square = [](auto x) { return x * x; };
320 auto delta_min1_sq = square(delta - 1.0);
321
322 using result = std::common_type_t<TauType, DeltaType>;
323 result r = 0.0;
324 for (auto i = 0; i < n.size(); ++i) {
325 auto Psi = exp(-C[i]*delta_min1_sq - D[i]*square(tau - 1.0));
326 auto k = 1.0 / (2.0 * beta[i]);
327 auto theta = (1.0 - tau) + A[i] * pow(delta_min1_sq, k);
328 auto Delta = square(theta) + B[i]*pow(delta_min1_sq, a[i]);
329 r = r + n[i]*pow(Delta, b[i])*delta*Psi;
330 }
331 result outval = forceeval(r);
332
333 // If we are really, really close to the critical point (tau=delta=1), then the term will become undefined, so let's just return 0 in that case
334 double dbl = static_cast<double>(getbaseval(outval));
335 if (std::isfinite(dbl)) {
336 return outval;
337 }
338 else {
339 return static_cast<decltype(outval)>(0.0);
340 }
341 }
342};
343
344
345template<typename... Args>
347private:
348 using varEOSTerms = std::variant<Args...>;
349 std::vector<varEOSTerms> coll;
350public:
351
352 auto size() const { return coll.size(); }
353
354 template<typename Instance>
355 auto add_term(Instance&& instance) {
356 coll.emplace_back(instance);
357 }
358
359 template <class Tau, class Delta>
360 auto alphar(const Tau& tau, const Delta& delta) const {
361 std::common_type_t <Tau, Delta> ar = 0.0;
362 for (const auto& term : coll) {
363 auto contrib = std::visit([&](auto& t) { return t.alphar(tau, delta); }, term);
364 ar = ar + contrib;
365 }
366 return ar;
367 }
368};
369
371
373
374}; // namespace teqp
static auto Clenshaw1DByRow(const MatType &c, const XType &ind)
Clenshaw evaluation of one dimensional flattening of the Chebyshev expansion.
static auto Clenshaw1D(const vectype &c, const XType &ind)
Clenshaw evaluation of a Chebyshev expansion in 1D.
auto alphar(const TauType &tau, const DeltaType &delta) const
static auto Clenshaw2DEigen(const MatType &a, const XType &x, const YType &y)
auto alphar(const TauType &tau, const DeltaType &delta) const
auto alphar(const Tau &tau, const Delta &delta) const
auto add_term(Instance &&instance)
auto alphar(const TauType &tau, const DeltaType &delta) const
auto alphar(const TauType &tau, const DeltaType &delta) const
auto alphar(const TauType &tau, const DeltaType &delta) const
auto alphar(const TauType &tau, const DeltaType &delta) const
auto alphar(const TauType &tau, const DeltaType &delta) const
auto alphar(const TauType &tau, const DeltaType &delta) const
auto alphar(const TauType &tau, const DeltaType &delta) const
auto alphar(const TauType &, const DeltaType &) const
auto alphar(const TauType &tau, const DeltaType &delta) const
auto getbaseval(const T &expr)
Definition types.hpp:84
T powi(const T &x, int n)
From Ulrich Deiters.
Definition types.hpp:133
auto pow(const double &x, const double &e)
Definition types.hpp:189
auto forceeval(T &&expr)
Definition types.hpp:46