OGS
TESOGS5MaterialModels.h
Go to the documentation of this file.
1 
10 #pragma once
11 
13 #include "TESAssemblyParams.h"
14 
15 namespace ProcessLib
16 {
17 namespace TES
18 {
19 inline double fluid_density(const double p, const double T, const double x)
20 {
21  // OGS-5 density model 26
22 
25 
26  const double xn = M0 * x / (M0 * x + M1 * (1.0 - x));
27 
29  (M1 * xn + M0 * (1.0 - xn));
30  ;
31 }
32 
33 template <int i>
34 double mypow(const double x)
35 {
36  if (i < 0)
37  {
38  return 1.0 / mypow<-i>(x);
39  }
40 
41  const double p = mypow<(i >> 1)>(x);
42  return (i & 1) ? p * p * x : p * p;
43 }
44 
45 template <>
46 inline double mypow<0>(const double /*x*/)
47 {
48  return 1.0;
49 }
50 
52 {
53  static double get(double rho, double T)
54  {
55  const double rho_c = 314; // [kg/m3]
56  const double CVF = 14.058; // [1e-3 Pa-s]
57 
58  const double sigma = 0.36502496e-09;
59  const double k = 1.38062e-23;
60  const double eps = 138.08483e-23;
61  const double c1 = 0.3125;
62  const double c2 = 2.0442e-49;
63 
64  const double T_star = T * k / eps;
65  rho = rho / rho_c;
66 
67  double Omega = loop1_term<0>(T_star);
68  Omega += loop1_term<1>(T_star);
69  Omega += loop1_term<2>(T_star);
70  Omega += loop1_term<3>(T_star);
71  Omega += loop1_term<4>(T_star);
72 
73  Omega = std::exp(Omega);
74 
75  // eta in [Pa*s]
76  const double eta_0 = c1 * std::sqrt(c2 * T) / (sigma * sigma * Omega);
77 
78  double sum = loop2_term<2>(rho);
79  sum += loop2_term<3>(rho);
80  sum += loop2_term<4>(rho);
81 
82  //
83  const double eta_r =
84  CVF * 1e-6 * (C[0] / (rho - C[1]) + C[0] / C[1] + sum);
85 
86  return eta_0 + eta_r; // [Pa*s]
87  }
88 
89 private:
90  template <unsigned i>
91  static double loop1_term(double T_star)
92  {
93  return A[i] * mypow<i>(log(T_star));
94  }
95 
96  template <unsigned i>
97  static double loop2_term(double rho)
98  {
99  return C[i] * mypow<i - 1>(rho);
100  }
101 
102  static const double A[5];
103  static const double C[5];
104 };
105 
107 {
108  static double get(double rho, double T)
109  {
110  double my, my_0, my_1;
111  double H[4];
112 
113  T = T / 647.096;
114  rho = rho / 322.0;
115 
116  H[0] = 1.67752;
117  H[1] = 2.20462;
118  H[2] = 0.6366564;
119  H[3] = -0.241605;
120 
121  double h[6][7] = {{0.0}};
122  h[0][0] = 0.520094000;
123  h[1][0] = 0.085089500;
124  h[2][0] = -1.083740000;
125  h[3][0] = -0.289555000;
126  h[0][1] = 0.222531000;
127  h[1][1] = 0.999115000;
128  h[2][1] = 1.887970000;
129  h[3][1] = 1.266130000;
130  h[5][1] = 0.120573000;
131  h[0][2] = -0.281378000;
132  h[1][2] = -0.906851000;
133  h[2][2] = -0.772479000;
134  h[3][2] = -0.489837000;
135  h[4][2] = -0.257040000;
136  h[0][3] = 0.161913000;
137  h[1][3] = 0.257399000;
138  h[0][4] = -0.032537200;
139  h[3][4] = 0.069845200;
140  h[4][5] = 0.008721020;
141  h[3][6] = -0.004356730;
142  h[5][6] = -0.000593264;
143 
144  double sum1 = H[0] / mypow<0>(T);
145  sum1 += H[1] / mypow<1>(T);
146  sum1 += H[2] / mypow<2>(T);
147  sum1 += H[3] / mypow<3>(T);
148 
149  my_0 = 100 * std::sqrt(T) / sum1;
150 
151  double sum2 = inner_loop<0>(rho, T, h);
152  sum2 += inner_loop<1>(rho, T, h);
153  sum2 += inner_loop<2>(rho, T, h);
154  sum2 += inner_loop<3>(rho, T, h);
155  sum2 += inner_loop<4>(rho, T, h);
156  sum2 += inner_loop<5>(rho, T, h);
157 
158  my_1 = std::exp(rho * sum2);
159 
160  my = (my_0 * my_1) / 1e6;
161  return my;
162  }
163 
164 private:
165  template <int i>
166  static double inner_loop(const double rho,
167  const double T,
168  const double (&h)[6][7])
169  {
170  const double base = rho - 1.0;
171 
172  double sum3 = h[i][0] * mypow<0>(base);
173  sum3 += h[i][1] * mypow<1>(base);
174  sum3 += h[i][2] * mypow<2>(base);
175  sum3 += h[i][3] * mypow<3>(base);
176  sum3 += h[i][4] * mypow<4>(base);
177  sum3 += h[i][5] * mypow<5>(base);
178  sum3 += h[i][6] * mypow<6>(base);
179 
180  return mypow<i>(1 / T - 1) * sum3;
181  }
182 };
183 
184 inline double fluid_viscosity(const double p, const double T, const double x)
185 {
186  // OGS 5 viscosity model 26
187 
191 
192  // reactive component
193  const double x0 =
194  M0 * x / (M0 * x + M1 * (1.0 - x)); // mass in mole fraction
195  const double V0 = FluidViscosityH2O::get(M1 * p / (R * T), T);
196  // inert component
197  const double x1 = 1.0 - x0;
198  const double V1 = FluidViscosityN2::get(M0 * p / (R * T), T);
199 
200  const double M0_over_M1(M1 / M0); // reactive over inert
201  const double V0_over_V1(V0 / V1);
202 
203  const double phi_12 =
204  mypow<2>(1.0 +
205  std::sqrt(V0_over_V1) * std::pow(1.0 / M0_over_M1, 0.25)) /
206  std::sqrt(8.0 * (1.0 + M0_over_M1));
207 
208  const double phi_21 = phi_12 * M0_over_M1 / V0_over_V1;
209 
210  return V0 * x0 / (x0 + x1 * phi_12) + V1 * x1 / (x1 + x0 * phi_21);
211 }
212 
214 {
215  static double get(double rho, double T)
216  {
217  const double X1 = 0.95185202;
218  const double X2 = 1.0205422;
219 
220  const double rho_c = 314; // [kg/m3]
221  const double M = 28.013;
222  const double k = 1.38062e-23;
223  const double eps = 138.08483e-23;
224  const double N_A = 6.02213E26;
225  const double R = 8.31434;
226  // const double R = MaterialLib::PhysicalConstant::IdealGasConstant;
227  const double CCF = 4.173; // mW/m/K
228 
229  const double c1 = 0.3125;
230  const double c2 = 2.0442e-49;
231  const double sigma = 0.36502496e-09;
232 
233  rho /= rho_c;
234 
235  // dilute heat conductivity
236  const double sum1 = loop1_term<0>(T) + loop1_term<1>(T) +
237  loop1_term<2>(T) + loop1_term<3>(T) +
238  loop1_term<4>(T) + loop1_term<5>(T) +
239  loop1_term<6>(T);
240  const double temp(std::exp((f[8] / T)) - 1);
241  const double c_v0 =
242  R *
243  (sum1 + ((f[7] * (f[8] / T) * (f[8] / T) * (std::exp((f[8] / T)))) /
244  (temp * temp) -
245  1));
246 
247  double cvint;
248  cvint = c_v0 * 1000 / N_A;
249 
250  // dilute gas viscosity
251  const double log_T_star = std::log(T * k / eps);
252 
253  const double Omega =
254  std::exp(loop2_term<0>(log_T_star) + loop2_term<1>(log_T_star) +
255  loop2_term<2>(log_T_star) + loop2_term<3>(log_T_star) +
256  loop2_term<4>(log_T_star));
257 
258  // eta in [Pa*s]
259  const double eta_0 =
260  1e6 * (c1 * std::sqrt(c2 * T) / (sigma * sigma * Omega));
261 
262  const double F = eta_0 * k * N_A / (M * 1000);
263 
264  const double lambda_tr = 2.5 * (1.5 - X1);
265  const double lambda_in = X2 * (cvint / k + X1);
266 
267  const double lambda_0 = F * (lambda_tr + lambda_in);
268 
269  const double sum2 = loop3_term<0>(rho) + loop3_term<1>(rho) +
270  loop3_term<2>(rho) + loop3_term<3>(rho);
271  const double lambda_r = sum2 * CCF;
272 
273  return (lambda_0 + lambda_r) / 1000; // lambda in [W/m/K]
274  }
275 
276 private:
277  template <int i>
278  static double loop1_term(const double T)
279  {
280  return f[i] * mypow<i - 3>(T);
281  }
282 
283  template <int i>
284  static double loop2_term(const double log_T_star)
285  {
286  return A[i] * mypow<i>(log_T_star);
287  }
288 
289  template <int i>
290  static double loop3_term(const double rho)
291  {
292  return C[i] * mypow<i + 1>(rho);
293  }
294 
295  const static double A[5];
296  const static double f[9];
297  const static double C[4];
298 };
299 
301 {
302  static double get(double rho, double T)
303  {
304  double S, Q;
305  double b[3], B[2], d[4], C[6];
306 
307  T /= 647.096;
308  rho /= 317.11;
309 
310  b[0] = -0.397070;
311  b[1] = 0.400302;
312  b[2] = 1.060000;
313 
314  B[0] = -0.171587;
315  B[1] = 2.392190;
316 
317  d[0] = 0.0701309;
318  d[1] = 0.0118520;
319  d[2] = 0.00169937;
320  d[3] = -1.0200;
321 
322  C[0] = 0.642857;
323  C[1] = -4.11717;
324  C[2] = -6.17937;
325  C[3] = 0.00308976;
326  C[4] = 0.0822994;
327  C[5] = 10.0932;
328 
329  const double sum1 = loop_term<0>(T) + loop_term<1>(T) +
330  loop_term<2>(T) + loop_term<3>(T);
331 
332  const double lambda_0 = std::sqrt(T) * sum1;
333  const double lambda_1 =
334  b[0] + b[1] * rho +
335  b[2] * std::exp(B[0] * (rho + B[1]) * (rho + B[1]));
336 
337  const double dT = fabs(T - 1) + C[3];
338  const double dT_pow_3_5 = std::pow(dT, 3. / 5.);
339  Q = 2 + (C[4] / dT_pow_3_5);
340 
341  if (T >= 1)
342  {
343  S = 1 / dT;
344  }
345  else
346  {
347  S = C[5] / dT_pow_3_5;
348  }
349 
350  const double rho_pow_9_5 = std::pow(rho, 9. / 5.);
351  const double rho_pow_Q = std::pow(rho, Q);
352  const double T_pow_3_2 = T * std::sqrt(T);
353  const double lambda_2 =
354  (d[0] / mypow<10>(T) + d[1]) * rho_pow_9_5 *
355  std::exp(C[0] * (1 - rho * rho_pow_9_5)) +
356  d[2] * S * rho_pow_Q *
357  std::exp((Q / (1. + Q)) * (1 - rho * rho_pow_Q)) +
358  d[3] * std::exp(C[1] * T_pow_3_2 + C[2] / mypow<5>(rho));
359 
360  return lambda_0 + lambda_1 + lambda_2; // lambda in [W/m/K]
361  }
362 
363 private:
364  template <unsigned i>
365  static double loop_term(const double T)
366  {
367  return a[i] * mypow<i>(T);
368  }
369 
370  static const double a[4];
371 };
372 
373 inline double fluid_heat_conductivity(const double p,
374  const double T,
375  const double x)
376 {
377  // OGS 5 fluid heat conductivity model 11
378 
382 
383  // TODO [CL] max() is redundant if the fraction is guaranteed to be between
384  // 0 and 1.
385  // reactive component
386  const double x0 = std::max(M0 * x / (M0 * x + M1 * (1.0 - x)),
387  0.); // convert mass to mole fraction
388  const double k0 = FluidHeatConductivityH2O::get(M1 * p / (R * T), T);
389  // inert component
390  const double x1 = 1.0 - x0;
391  const double k1 = FluidHeatConductivityN2::get(M0 * p / (R * T), T);
392 
393  const double M1_over_M2 = M1 / M0; // reactive over inert
394  const double V1_over_V2 = FluidViscosityH2O::get(M1 * p / (R * T), T) /
395  FluidViscosityN2::get(M0 * p / (R * T), T);
396  const double L1_over_L2 = V1_over_V2 / M1_over_M2;
397 
398  const double M12_pow_mquarter = std::pow(M1_over_M2, -0.25);
399  const double phi_12 = (1.0 + std::sqrt(L1_over_L2) * M12_pow_mquarter) *
400  (1.0 + std::sqrt(V1_over_V2) * M12_pow_mquarter) /
401  std::sqrt(8.0 * (1.0 + M1_over_M2));
402  const double phi_21 = phi_12 * M1_over_M2 / V1_over_V2;
403 
404  return k0 * x0 / (x0 + x1 * phi_12) + k1 * x1 / (x1 + x0 * phi_21);
405 }
406 
407 } // namespace TES
408 } // namespace ProcessLib
double mypow(const double x)
double fluid_heat_conductivity(const double p, const double T, const double x)
double mypow< 0 >(const double)
double fluid_viscosity(const double p, const double T, const double x)
double fluid_density(const double p, const double T, const double x)
static double get(double rho, double T)
static double loop2_term(const double log_T_star)
static double get(double rho, double T)
static double loop3_term(const double rho)
static double inner_loop(const double rho, const double T, const double(&h)[6][7])
static double get(double rho, double T)
static double loop2_term(double rho)
static double loop1_term(double T_star)
static double get(double rho, double T)