teqp 0.19.1
Loading...
Searching...
No Matches
lennardjones.hpp
Go to the documentation of this file.
1#pragma once
2
4#include "teqp/types.hpp"
6
7namespace teqp {
8
13 std::string contents = R"(
14
15 {
16 "EOS": [
17 {
18 "BibTeX_CP0": "",
19 "BibTeX_EOS": "Thol-THESIS-2015",
20 "STATES": {
21 "reducing": {
22 "T": 1.32,
23 "T_units": "LJ units",
24 "rhomolar": 0.31,
25 "rhomolar_units": "LJ units"
26 }
27 },
28 "T_max": 1200,
29 "T_max_units": "LJ units",
30 "Ttriple": 0.661,
31 "Ttriple_units": "LJ units",
32 "alphar": [
33 {
34 "d": [4, 1, 1, 2, 2, 3, 1, 1, 3, 2, 2, 5],
35 "l": [0, 0, 0, 0, 0, 0, 1, 2, 2, 1, 2, 1],
36 "n": [0.52080730e-2, 0.21862520e+1, -0.21610160e+1, 0.14527000e+1, -0.20417920e+1, 0.18695286e+0, -0.62086250e+0, -0.56883900e+0, -0.80055922e+0, 0.10901431e+0, -0.49745610e+0, -0.90988445e-1],
37 "t": [1.000, 0.320, 0.505, 0.672, 0.843, 0.898, 1.205, 1.786, 2.770, 1.786, 2.590, 1.294],
38 "type": "ResidualHelmholtzPower"
39 },
40 {
41 "beta": [0.625, 0.638, 3.91, 0.156, 0.157, 0.153, 1.16, 1.73, 383, 0.112, 0.119],
42 "d": [1, 1, 2, 3, 3, 2, 1, 2, 3, 1, 1],
43 "epsilon": [ 0.2053, 0.409, 0.6, 1.203, 1.829, 1.397, 1.39, 0.539, 0.934, 2.369, 2.43],
44 "eta": [2.067, 1.522, 8.82, 1.722, 0.679, 1.883, 3.925, 2.461, 28.2, 0.753, 0.82],
45 "gamma": [0.71, 0.86, 1.94, 1.48, 1.49, 1.945, 3.02, 1.11, 1.17, 1.33, 0.24],
46 "n": [-0.14667177e+1, 0.18914690e+1, -0.13837010e+0, -0.38696450e+0, 0.12657020e+0, 0.60578100e+0, 0.11791890e+1, -0.47732679e+0, -0.99218575e+1, -0.57479320e+0, 0.37729230e-2],
47 "t": [2.830, 2.548, 4.650, 1.385, 1.460, 1.351, 0.660, 1.496, 1.830, 1.616, 4.970],
48 "type": "ResidualHelmholtzGaussian"
49 }
50 ],
51 "gas_constant": 1.0,
52 "gas_constant_units": "LJ units",
53 "molar_mass": 1.0,
54 "molar_mass_units": "LJ units",
55 "p_max": 100000,
56 "p_max_units": "LJ units",
57 "pseudo_pure": false
58 }
59 ],
60 "INFO":{
61 "NAME": "LennardJones",
62 "REFPROP_NAME": "LJF",
63 "CAS": "N/A"
64 }
65 }
66
67 )";
68
69 return teqp::build_multifluid_JSONstr({ contents }, "{}", "{}");
70 };
71
79 private:
80
81 const double MY_PI = EIGEN_PI;
82
83 const std::vector<std::tuple<int, double>> c_dhBH {
84 {-2, 0.011117524},
85 {-1, -0.076383859},
86 { 0, 1.080142248},
87 { 1, 0.000693129}
88 };
89 const double c_ln_dhBH = -0.063920968;
90
91 const std::vector<std::tuple<int, double>> c_Delta_B2_hBH {
92 {-7, -0.58544978},
93 {-6, 0.43102052},
94 {-5, 0.87361369},
95 {-4, -4.13749995},
96 {-3, 2.90616279},
97 {-2, -7.02181962},
98 { 0, 0.02459877}
99 };
100
101 const std::vector<std::tuple<int, int, double>> c_Cij = {
102 { 0, 2, 2.01546797},
103 { 0, 3, -28.17881636},
104 { 0, 4, 28.28313847},
105 { 0, 5, -10.42402873},
106 {-1, 2, -19.58371655},
107 {-1, 3, 75.62340289},
108 {-1, 4, -120.70586598},
109 {-1, 5, 93.92740328},
110 {-1, 6, -27.37737354},
111 {-2, 2, 29.34470520},
112 {-2, 3, -112.3535693},
113 {-2, 4, 170.64908980 },
114 {-2, 5, -123.06669187},
115 {-2, 6, 34.42288969 },
116 {-4, 2, -13.37031968},
117 {-4, 3, 65.38059570},
118 {-4, 4, -115.09233113},
119 {-4, 5, 88.91973082},
120 {-4, 6, -25.62099890}
121 };
122
123 const double gamma = 1.92907278;
124
125 // Form of Eq. 29
126 template<typename TTYPE>
127 auto get_dhBH(const TTYPE& Tstar) const {
128 TTYPE summer = c_ln_dhBH*log(Tstar);
129 for (auto [i, C_i] : c_dhBH){
130 summer += C_i*pow(Tstar, i/2.0);
131 }
132 return forceeval(summer);
133 }
134
135 template<typename TTYPE>
136 auto get_d_dhBH_d1T(const TTYPE& Tstar) const {
137 TTYPE summer = c_ln_dhBH;
138 for (auto [i, C_i] : c_dhBH){
139 summer += (i/2.0)*C_i*pow(Tstar, i/2.0);
140 }
141 return forceeval(-Tstar*summer);
142 }
143
144 // Form of Eq. 29
145 template<typename TTYPE>
146 auto get_DeltaB2hBH(const TTYPE& Tstar) const {
147 TTYPE summer = 0.0;
148 for (auto [i, C_i] : c_Delta_B2_hBH){
149 summer += C_i*pow(Tstar, i/2.0);
150 }
151 return forceeval(summer);
152 }
153
154 template<typename TTYPE>
155 auto get_d_DeltaB2hBH_d1T(const TTYPE& Tstar) const {
156 TTYPE summer = 0.0;
157 for (auto [i, C_i] : c_Delta_B2_hBH){
158 summer += (i/2.0)*C_i*pow(Tstar, i/2.0);
159 }
160 return forceeval(-Tstar*summer);
161 }
162
163 // Eq. 5 from K-N
164 template<typename TTYPE, typename RHOTYPE>
165 auto get_ahs(const TTYPE& Tstar, const RHOTYPE& rhostar) const {
166 auto zeta = MY_PI/6.0*rhostar*pow(get_dhBH(Tstar), 3);
167 return forceeval(Tstar*(5.0/3.0*log(1.0-zeta) + zeta*(34.0-33.0*zeta+4.0*POW2(zeta))/(6.0*POW2(1.0-zeta))));
168 }
169
170 // Eq. 4 from K-N
171 template<typename TTYPE, typename RHOTYPE>
172 auto get_zhs(const TTYPE& Tstar, const RHOTYPE& rhostar) const {
173 std::common_type_t<TTYPE, RHOTYPE> zeta = MY_PI/6.0*rhostar*POW3(get_dhBH(Tstar));
174 return forceeval((1.0+zeta+zeta**zeta-2.0/3.0*POW3(zeta)*(1+zeta))/POW3(1.0-zeta));
175 }
176
177 // Eq. 30 from K-N
178 template<typename TTYPE, typename RHOTYPE>
179 auto get_a(const TTYPE& Tstar, const RHOTYPE& rhostar) const{
180 std::common_type_t<TTYPE, RHOTYPE> summer = 0.0;
181 for (auto [i, j, Cij] : c_Cij){
182 summer += Cij*pow(Tstar, i/2.0)*pow(rhostar, j);
183 }
184 return forceeval(get_ahs(Tstar, rhostar) + exp(-gamma*POW2(rhostar))*rhostar*Tstar*get_DeltaB2hBH(Tstar)+summer);
185 }
186
187 public:
188 // We are in "simulation units", so R is 1.0, and T and rho that go into alphar are actually T^* and rho^*
189 template<typename MoleFracType>
190 double R(const MoleFracType &) const { return 1.0; }
191
192 template<typename TTYPE, typename RHOTYPE, typename MoleFracType>
193 auto alphar(const TTYPE& Tstar, const RHOTYPE& rhostar, const MoleFracType& /*molefrac*/) const {
194 return forceeval(get_a(Tstar, rhostar)/Tstar);
195 }
196 };
197
205
206 private:
207 template<typename T>
208 auto POW2(const T& x) const -> T{
209 return x*x;
210 }
211
212 template<typename T>
213 auto POW3(const T& x) const -> T{
214 return POW2(x)*x;
215 }
216
217 template<typename T>
218 auto POW4(const T& x) const -> T{
219 return POW2(x)*POW2(x);
220 }
221
222 const double gamma = 3.0;
223 const std::vector<double> x {
224 0.0, // placeholder for i=0 term since C++ uses 0-based indexing
225 0.8623085097507421,
226 2.976218765822098,
227 -8.402230115796038,
228 0.1054136629203555,
229 -0.8564583828174598,
230 1.582759470107601,
231 0.7639421948305453,
232 1.753173414312048,
233 2.798291772190376e03,
234 -4.8394220260857657e-2,
235 0.9963265197721935,
236 -3.698000291272493e01,
237 2.084012299434647e01,
238 8.305402124717285e01,
239 -9.574799715203068e02,
240 -1.477746229234994e02,
241
242 6.398607852471505e01,
243 1.603993673294834e01,
244 6.805916615864377e01,
245 -2.791293578795945e03,
246 -6.245128304568454,
247 -8.116836104958410e03,
248 1.488735559561229e01,
249 -1.059346754655084e04,
250 -1.131607632802822e02,
251 -8.867771540418822e03,
252 -3.986982844450543e01,
253 -4.689270299917261e03,
254 2.593535277438717e02,
255 -2.694523589434903e03,
256 -7.218487631550215e02,
257 1.721802063863269e02
258 };
259
260 // Table 5
261 template<typename TTYPE>
262 auto get_ai(const int i, const TTYPE& Tstar) const -> TTYPE{
263 switch(i){
264 case 1:
265 return x[1]*Tstar + x[2]*sqrt(Tstar) + x[3] + x[4]/Tstar + x[5]/POW2(Tstar);
266 case 2:
267 return x[6]*Tstar + x[7] + x[8]/Tstar + x[9]/POW2(Tstar);
268 case 3:
269 return x[10]*Tstar + x[11] + x[12]/Tstar;
270 case 4:
271 return x[13];
272 case 5:
273 return x[14]/Tstar + x[15]/POW2(Tstar);
274 case 6:
275 return x[16]/Tstar;
276 case 7:
277 return x[17]/Tstar + x[18]/POW2(Tstar);
278 case 8:
279 return x[19]/POW2(Tstar);
280 default:
281 throw teqp::InvalidArgument("i is not possible in get_ai");
282 }
283 }
284
285 // Table 6
286 template<typename TTYPE>
287 auto get_bi(const int i, const TTYPE& Tstar) const -> TTYPE{
288 switch(i){
289 case 1:
290 return x[20]/POW2(Tstar) + x[21]/POW3(Tstar);
291 case 2:
292 return x[22]/POW2(Tstar) + x[23]/POW4(Tstar);
293 case 3:
294 return x[24]/POW2(Tstar) + x[25]/POW3(Tstar);
295 case 4:
296 return x[26]/POW2(Tstar) + x[27]/POW4(Tstar);
297 case 5:
298 return x[28]/POW2(Tstar) + x[29]/POW3(Tstar);
299 case 6:
300 return x[30]/POW2(Tstar) + x[31]/POW3(Tstar) + x[32]/POW4(Tstar);
301 default:
302 throw teqp::InvalidArgument("i is not possible in get_bi");
303 }
304 }
305
306 // Table 7
307 template<typename FTYPE, typename RHOTYPE>
308 auto get_Gi(const int i, const FTYPE& F, const RHOTYPE& rhostar) const -> RHOTYPE{
309 if (i == 1){
310 return forceeval((1.0-F)/(2.0*gamma));
311 }
312 else{
313 // Recursive definition of the other terms;
314 return forceeval(-(F*powi(rhostar, 2*(i-1)) - 2.0*(i-1)*get_Gi(i-1, F, rhostar))/(2.0*gamma));
315 }
316 }
317
318 template<typename TTYPE, typename RHOTYPE>
319 auto get_alphar(const TTYPE& Tstar, const RHOTYPE& rhostar) const{
320 std::common_type_t<TTYPE, RHOTYPE> summer = 0.0;
321 auto F = exp(-gamma*POW2(rhostar));
322 for (int i = 1; i <= 8; ++i){
323 summer += get_ai(i, Tstar)*powi(rhostar, i)/static_cast<double>(i);
324 }
325 for (int i = 1; i <= 6; ++i){
326 summer += get_bi(i, Tstar)*get_Gi(i, F, rhostar);
327 }
328 return forceeval(summer);
329 }
330
331 public:
332 // We are in "simulation units", so R is 1.0, and T and rho that
333 // go into alphar are actually T^* and rho^*
334 template<typename MoleFracType>
335 double R(const MoleFracType &) const { return 1.0; }
336
337 template<typename TTYPE, typename RHOTYPE, typename MoleFracType>
338 auto alphar(const TTYPE& Tstar, const RHOTYPE& rhostar, const MoleFracType& /*molefrac*/) const {
339 return forceeval(get_alphar(Tstar, rhostar)/Tstar);
340 }
341
342 };
343
344};
double R(const MoleFracType &) const
auto alphar(const TTYPE &Tstar, const RHOTYPE &rhostar, const MoleFracType &) const
double R(const MoleFracType &) const
auto alphar(const TTYPE &Tstar, const RHOTYPE &rhostar, const MoleFracType &) const
auto POW2(const A &x)
auto POW3(const A &x)
auto build_multifluid_JSONstr(const std::vector< std::string > &componentJSON, const std::string &BIPJSON, const std::string &departureJSON, const nlohmann::json &flags={})
A builder function where the JSON-formatted strings are provided explicitly rather than file paths.
auto build_LJ126_TholJPCRD2016()
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