Line | Branch | Exec | Source |
---|---|---|---|
1 | // -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- | ||
2 | // vi: set et ts=4 sw=4 sts=4: | ||
3 | // | ||
4 | // SPDX-FileCopyrightInfo: Copyright © DuMux Project contributors, see AUTHORS.md in root folder | ||
5 | // SPDX-License-Identifier: GPL-3.0-or-later | ||
6 | // | ||
7 | /*! | ||
8 | * \file | ||
9 | * \ingroup Components | ||
10 | * \brief A class for the brine fluid properties,. | ||
11 | */ | ||
12 | #ifndef DUMUX_BRINE_HH | ||
13 | #define DUMUX_BRINE_HH | ||
14 | |||
15 | #include <cmath> | ||
16 | |||
17 | #include <dune/common/math.hh> | ||
18 | |||
19 | #include <dumux/common/parameters.hh> | ||
20 | #include <dumux/material/components/h2o.hh> | ||
21 | #include <dumux/material/components/nacl.hh> | ||
22 | #include <dumux/material/components/tabulatedcomponent.hh> | ||
23 | #include <dumux/material/components/base.hh> | ||
24 | #include <dumux/material/components/liquid.hh> | ||
25 | #include <dumux/material/components/gas.hh> | ||
26 | |||
27 | namespace Dumux::Components { | ||
28 | |||
29 | /*! | ||
30 | * \ingroup Components | ||
31 | * \brief A class for the brine fluid properties. | ||
32 | * | ||
33 | * \tparam Scalar The type used for scalar values | ||
34 | * \tparam H2O Static polymorphism: the Brine class can access all properties of the H2O class | ||
35 | * \note This is an implementation of brine as a pseudo-component with a constant salinity. | ||
36 | * \note the salinity is read from the input file and is a mandatory parameter | ||
37 | */ | ||
38 | template <class Scalar, | ||
39 | class H2O_Tabulated = Components::TabulatedComponent<Components::H2O<Scalar>>> | ||
40 | class Brine | ||
41 | : public Components::Base<Scalar, Brine<Scalar, H2O_Tabulated> > | ||
42 | , public Components::Liquid<Scalar, Brine<Scalar, H2O_Tabulated> > | ||
43 | , public Components::Gas<Scalar, Brine<Scalar, H2O_Tabulated> > | ||
44 | { | ||
45 | using ThisType = Brine<Scalar, H2O_Tabulated>; | ||
46 | public: | ||
47 | using H2O = Components::TabulatedComponent<Dumux::Components::H2O<Scalar>>; | ||
48 | |||
49 | //! The ideal gas constant \f$\mathrm{[J/mol/K]}\f$ | ||
50 | static constexpr Scalar R = Constants<Scalar>::R; | ||
51 | |||
52 | /*! | ||
53 | * \brief A human readable name for the brine. | ||
54 | */ | ||
55 | static std::string name() | ||
56 |
36/72✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 16 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 16 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 16 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 2 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 2 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 2 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 2 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 2 times.
✗ Branch 41 not taken.
✓ Branch 43 taken 2 times.
✗ Branch 44 not taken.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✓ Branch 49 taken 1 times.
✗ Branch 50 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 53 not taken.
✓ Branch 55 taken 1 times.
✗ Branch 56 not taken.
✓ Branch 58 taken 1 times.
✗ Branch 59 not taken.
✓ Branch 61 taken 1 times.
✗ Branch 62 not taken.
✓ Branch 64 taken 1 times.
✗ Branch 65 not taken.
✓ Branch 67 taken 1 times.
✗ Branch 68 not taken.
✓ Branch 70 taken 1 times.
✗ Branch 71 not taken.
✓ Branch 73 taken 1 times.
✗ Branch 74 not taken.
✓ Branch 76 taken 1 times.
✗ Branch 77 not taken.
✓ Branch 79 taken 1 times.
✗ Branch 80 not taken.
✓ Branch 82 taken 1 times.
✗ Branch 83 not taken.
✓ Branch 85 taken 1 times.
✗ Branch 86 not taken.
✓ Branch 88 taken 1 times.
✗ Branch 89 not taken.
✓ Branch 91 taken 1 times.
✗ Branch 92 not taken.
✓ Branch 94 taken 1 times.
✗ Branch 95 not taken.
✓ Branch 97 taken 1 times.
✗ Branch 98 not taken.
✓ Branch 100 taken 1 times.
✗ Branch 101 not taken.
✓ Branch 103 taken 1 times.
✗ Branch 104 not taken.
✓ Branch 106 taken 1 times.
✗ Branch 107 not taken.
|
54 | { return "Brine"; } |
57 | |||
58 | /*! | ||
59 | * \brief Return the constant salinity | ||
60 | */ | ||
61 | 484975431 | static Scalar salinity() | |
62 | { | ||
63 |
4/6✓ Branch 0 taken 20 times.
✓ Branch 1 taken 484975363 times.
✓ Branch 3 taken 20 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 20 times.
✗ Branch 7 not taken.
|
484975431 | static const Scalar salinity = getParam<Scalar>("Brine.Salinity"); |
64 | 484975431 | return salinity; | |
65 | } | ||
66 | |||
67 | /*! | ||
68 | * \brief The molar mass in \f$\mathrm{[kg/mol]}\f$ of brine. | ||
69 | * This assumes that the salt is pure NaCl. | ||
70 | */ | ||
71 | static Scalar molarMass() | ||
72 | { | ||
73 | 18 | const Scalar M1 = H2O::molarMass(); | |
74 | 18 | const Scalar M2 = Components::NaCl<Scalar>::molarMass(); // molar mass of NaCl [kg/mol] | |
75 |
4/8✓ Branch 1 taken 15 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
|
18 | return M1*M2/(M2 + ThisType::salinity()*(M1 - M2)); |
76 | }; | ||
77 | |||
78 | /*! | ||
79 | * \brief Returns the critical temperature \f$\mathrm{[K]}\f$ of brine. Here, it is assumed to be equal to that of pure water. | ||
80 | * The critical temperature of brine is dependent on the salt concentration. | ||
81 | * With increasing NaCl mass fraction the critical point shifts to higher temperatures, see Bakker, 2018 (DOI: 10.1016/j.cageo.2018.03.003). | ||
82 | */ | ||
83 | static Scalar criticalTemperature() | ||
84 | { return H2O::criticalTemperature(); } | ||
85 | |||
86 | /*! | ||
87 | * \brief Returns the critical pressure \f$\mathrm{[Pa]}\f$ of brine. Here, it is assumed to be equal to that of pure water. | ||
88 | * The critical pressure of brine is dependent on the salt concentration. | ||
89 | * With increasing NaCl mass fraction the critical point shifts to higher pressures, see Bakker, 2018 (DOI: 10.1016/j.cageo.2018.03.003). | ||
90 | */ | ||
91 | static Scalar criticalPressure() | ||
92 | { return H2O::criticalPressure(); } | ||
93 | |||
94 | /*! | ||
95 | * \brief Returns the temperature \f$\mathrm{[K]}\f$ at brine's triple point. Here, it is assumed to be equal to that of pure water. | ||
96 | * The triple temperature of brine is dependent on the salt concentration, see Bakker, 2018 (DOI: 10.1016/j.cageo.2018.03.003). | ||
97 | */ | ||
98 | static Scalar tripleTemperature() | ||
99 | { return H2O::tripleTemperature(); } | ||
100 | |||
101 | /*! | ||
102 | * \brief Returns the pressure \f$\mathrm{[Pa]}\f$ at brine's triple point. Here, it is assumed to be equal to that of pure water. | ||
103 | * The triple pressure of brine is dependent on the salt concentration, see Bakker, 2018 (DOI: 10.1016/j.cageo.2018.03.003). | ||
104 | */ | ||
105 | static Scalar triplePressure() | ||
106 | { return H2O::triplePressure(); } | ||
107 | |||
108 | /*! | ||
109 | * \brief The vapor pressure in \f$\mathrm{[Pa]}\f$ of pure brine | ||
110 | * at a given temperature. | ||
111 | * \note The vapor pressure of brine decreases with the mole fraction of water in the liquid phase. | ||
112 | * This is described by Raoult's law, see Thomas Fetzer's Dissertation Eq. 2.11. | ||
113 | * It is also the simplified version of the Kelvin equation, neglecting the influence of the capillary pressure here. | ||
114 | * | ||
115 | * \param temperature temperature of component in \f$\mathrm{[K]}\f$ | ||
116 | */ | ||
117 | static Scalar vaporPressure(Scalar temperature) | ||
118 | { | ||
119 | //calculate mole fraction | ||
120 | const Scalar M1 = H2O::molarMass(); | ||
121 | const Scalar M2 = Components::NaCl<Scalar>::molarMass(); // molar mass of NaCl [kg/mol] | ||
122 | const Scalar xNaClLiquid = - M1 * ThisType::salinity() / ((M2-M1) * ThisType::salinity() - M2); | ||
123 | |||
124 | // Raoult's law, see Thomas Fetzer's Dissertation Eq. 2.11. | ||
125 | return H2O::vaporPressure(temperature) * (1 - xNaClLiquid); | ||
126 | } | ||
127 | |||
128 | /*! | ||
129 | * \brief Specific enthalpy of gaseous brine \f$\mathrm{[J/kg]}\f$. | ||
130 | * Only water volatile and salt is suppose to stay in the liquid phase. | ||
131 | * \param temperature temperature of component in \f$\mathrm{[K]}\f$ | ||
132 | * \param pressure pressure of component in \f$\mathrm{[Pa]}\f$ | ||
133 | */ | ||
134 | static const Scalar gasEnthalpy(Scalar temperature, Scalar pressure) | ||
135 |
1/2✓ Branch 1 taken 101 times.
✗ Branch 2 not taken.
|
101 | { return H2O::gasEnthalpy(temperature, pressure); } |
136 | |||
137 | /*! | ||
138 | * \brief Specific enthalpy of liquid brine \f$\mathrm{[J/kg]}\f$. | ||
139 | * | ||
140 | * \param T temperature of component in \f$\mathrm{[K]}\f$ | ||
141 | * \param p pressure of component in \f$\mathrm{[Pa]}\f$ | ||
142 | * | ||
143 | * Equations given in: | ||
144 | * - Palliser & McKibbin (1998) \cite palliser1998 <BR> | ||
145 | * - Michaelides (1981) \cite michaelides1981 <BR> | ||
146 | * - Daubert & Danner (1989) \cite daubert1989 | ||
147 | * | ||
148 | */ | ||
149 | 46343841 | static const Scalar liquidEnthalpy(Scalar T, Scalar p) | |
150 | { | ||
151 | /*Numerical coefficients from PALLISER*/ | ||
152 | static const Scalar f[] = { | ||
153 | 2.63500E-1, 7.48368E-6, 1.44611E-6, -3.80860E-10 | ||
154 | }; | ||
155 | |||
156 | /*Numerical coefficients from MICHAELIDES for the enthalpy of brine*/ | ||
157 | static const Scalar a[4][3] = { | ||
158 | { +9633.6, -4080.0, +286.49 }, | ||
159 | { +166.58, +68.577, -4.6856 }, | ||
160 | { -0.90963, -0.36524, +0.249667E-1 }, | ||
161 | { +0.17965E-2, +0.71924E-3, -0.4900E-4 } | ||
162 | }; | ||
163 | |||
164 | 46343841 | const Scalar theta = T - 273.15; | |
165 | 46343841 | const Scalar salSat = f[0] + f[1]*theta + f[2]*theta*theta + f[3]*theta*theta*theta; | |
166 | |||
167 | /*Regularization*/ | ||
168 | using std::min; | ||
169 | using std::max; | ||
170 |
3/4✗ Branch 1 not taken.
✓ Branch 2 taken 46343829 times.
✓ Branch 3 taken 12 times.
✓ Branch 4 taken 46343817 times.
|
46343841 | const Scalar salinity = min(max(ThisType::salinity(),0.0), salSat); |
171 | |||
172 | 46343841 | const Scalar hw = H2O::liquidEnthalpy(T, p)/1E3; /* kJ/kg */ | |
173 | |||
174 | /*DAUBERT and DANNER*/ | ||
175 | 92687682 | /*U=*/const Scalar h_NaCl = (3.6710E4*T + 0.5*(6.2770E1)*T*T - ((6.6670E-2)/3)*T*T*T | |
176 | 46343841 | +((2.8000E-5)/4)*(T*T*T*T))/(58.44E3)- 2.045698e+02; /* kJ/kg */ | |
177 | |||
178 | 46343841 | const Scalar m = (1E3/58.44)*(salinity/(1-salinity)); | |
179 | |||
180 | using Dune::power; | ||
181 | 46343841 | Scalar d_h = 0; | |
182 |
2/2✓ Branch 0 taken 185375316 times.
✓ Branch 1 taken 46343829 times.
|
231719205 | for (int i = 0; i<=3; i++) { |
183 |
2/2✓ Branch 0 taken 556125948 times.
✓ Branch 1 taken 185375316 times.
|
741501456 | for (int j=0; j<=2; j++) { |
184 | 1668378276 | d_h = d_h + a[i][j] * power(theta, i) * power(m, j); | |
185 | } | ||
186 | } | ||
187 | |||
188 | /* heat of dissolution for halite according to Michaelides 1971 */ | ||
189 | 46343841 | const Scalar delta_h = (4.184/(1E3 + (58.44 * m)))*d_h; | |
190 | |||
191 | /* Enthalpy of brine without any dissolved gas */ | ||
192 | 46343841 | const Scalar h_ls1 =(1-salinity)*hw + salinity*h_NaCl + salinity*delta_h; /* kJ/kg */ | |
193 | 46343841 | return h_ls1*1E3; /*J/kg*/ | |
194 | } | ||
195 | |||
196 | /*! | ||
197 | * \brief Specific isobaric heat capacity of brine \f$\mathrm{[J/kg]}\f$. | ||
198 | * | ||
199 | * \param temperature temperature of component in \f$\mathrm{[K]}\f$ | ||
200 | * \param pressure pressure of component in \f$\mathrm{[Pa]}\f$ | ||
201 | * | ||
202 | * See: | ||
203 | * | ||
204 | * IAPWS: "Revised Release on the IAPWS Industrial Formulation | ||
205 | * 1997 for the Thermodynamic Properties of Water and Steam", | ||
206 | * http://www.iapws.org/relguide/IF97-Rev.pdf \cite IAPWS1997 | ||
207 | */ | ||
208 | 109 | static const Scalar liquidHeatCapacity(Scalar temperature, Scalar pressure) | |
209 | { | ||
210 | 109 | const Scalar eps = temperature*1e-8; | |
211 | 109 | return (liquidEnthalpy(temperature + eps, pressure)- liquidEnthalpy(temperature, pressure))/eps; | |
212 | } | ||
213 | |||
214 | /*! | ||
215 | * \brief Specific isobaric heat capacity of water steam \f$\mathrm{[J/kg]}\f$. | ||
216 | * | ||
217 | * \param temperature temperature of component in \f$\mathrm{[K]}\f$ | ||
218 | * \param pressure pressure of component in \f$\mathrm{[Pa]}\f$ | ||
219 | * | ||
220 | * See: | ||
221 | * | ||
222 | * IAPWS: "Revised Release on the IAPWS Industrial Formulation | ||
223 | * 1997 for the Thermodynamic Properties of Water and Steam", | ||
224 | * http://www.iapws.org/relguide/IF97-Rev.pdf \cite IAPWS1997 | ||
225 | */ | ||
226 | static const Scalar gasHeatCapacity(Scalar temperature, | ||
227 | Scalar pressure) | ||
228 | { | ||
229 |
1/2✓ Branch 1 taken 101 times.
✗ Branch 2 not taken.
|
101 | return H2O::gasHeatCapacity(temperature, pressure); |
230 | } | ||
231 | |||
232 | /*! | ||
233 | * \brief Specific internal energy of steam \f$\mathrm{[J/kg]}\f$. | ||
234 | * | ||
235 | * \param temperature temperature of component in \f$\mathrm{[K]}\f$ | ||
236 | * \param pressure pressure of component in \f$\mathrm{[Pa]}\f$ | ||
237 | */ | ||
238 | static const Scalar gasInternalEnergy(Scalar temperature, | ||
239 | Scalar pressure) | ||
240 | { | ||
241 | return H2O::gasInternalEnergy(temperature, pressure); | ||
242 | } | ||
243 | |||
244 | /*! | ||
245 | * \brief Specific internal energy of liquid brine \f$\mathrm{[J/kg]}\f$. | ||
246 | * | ||
247 | * \param temperature temperature of component in \f$\mathrm{[K]}\f$ | ||
248 | * \param pressure pressure of component in \f$\mathrm{[Pa]}\f$ | ||
249 | */ | ||
250 | static const Scalar liquidInternalEnergy(Scalar temperature, | ||
251 | Scalar pressure) | ||
252 | { | ||
253 | return liquidEnthalpy(temperature, pressure) - pressure/liquidDensity(temperature, pressure); | ||
254 | } | ||
255 | |||
256 | /*! | ||
257 | * \brief The density of steam at a given pressure and temperature \f$\mathrm{[kg/m^3]}\f$. | ||
258 | * | ||
259 | * \param temperature temperature of component in \f$\mathrm{[K]}\f$ | ||
260 | * \param pressure pressure of component in \f$\mathrm{[Pa]}\f$ | ||
261 | */ | ||
262 | static Scalar gasDensity(Scalar temperature, Scalar pressure) | ||
263 |
1/2✓ Branch 1 taken 101 times.
✗ Branch 2 not taken.
|
101 | { return H2O::gasDensity(temperature, pressure); } |
264 | |||
265 | /*! | ||
266 | * \brief The molar density of steam in \f$\mathrm{[mol/m^3]}\f$ at a given pressure and temperature. | ||
267 | * We take the value of the H2O gas molar density here because salt is not in the gas phase. | ||
268 | * | ||
269 | * \param temperature temperature of component in \f$\mathrm{[K]}\f$ | ||
270 | * \param pressure pressure of component in \f$\mathrm{[Pa]}\f$ | ||
271 | * | ||
272 | */ | ||
273 | static Scalar gasMolarDensity(Scalar temperature, Scalar pressure) | ||
274 | { return H2O::gasMolarDensity(temperature, pressure); } | ||
275 | |||
276 | /*! | ||
277 | * \brief Returns true if the gas phase is assumed to be ideal | ||
278 | */ | ||
279 | static constexpr bool gasIsIdeal() | ||
280 | { return H2O::gasIsIdeal(); } | ||
281 | |||
282 | /*! | ||
283 | * \brief Returns true if the gas phase is assumed to be compressible | ||
284 | */ | ||
285 | static constexpr bool gasIsCompressible() | ||
286 | { return H2O::gasIsCompressible(); } | ||
287 | |||
288 | /*! | ||
289 | * \brief Returns true if the liquid phase is assumed to be compressible | ||
290 | */ | ||
291 | static constexpr bool liquidIsCompressible() | ||
292 | { return H2O::liquidIsCompressible(); } | ||
293 | |||
294 | /*! | ||
295 | * \brief The density of pure brine at a given pressure and temperature \f$\mathrm{[kg/m^3]}\f$. | ||
296 | * | ||
297 | * \param temperature temperature of component in \f$\mathrm{[K]}\f$ | ||
298 | * \param pressure pressure of component in \f$\mathrm{[Pa]}\f$ | ||
299 | * | ||
300 | * \note The density is computed as a function of the salt mass fraction, pressure and temperature. | ||
301 | * The used function is an empirical relationship fitted to experimental data. | ||
302 | * It is presented by Batzle and Wang, 1992 (DOI: 10.1190/1.1443207) \cite batzle1992, | ||
303 | * better description and comparison with other approaches in Adams and Bachu, 2002 | ||
304 | * (DOI: 10.1046/j.1468-8123.2002.00041.x) \cite adams2002. | ||
305 | */ | ||
306 | 145296856 | static Scalar liquidDensity(Scalar temperature, Scalar pressure) | |
307 | { | ||
308 | using std::max; | ||
309 | 145296856 | const Scalar TempC = temperature - 273.15; | |
310 | 145296856 | const Scalar pMPa = pressure/1.0E6; | |
311 |
1/2✓ Branch 1 taken 145296848 times.
✗ Branch 2 not taken.
|
145296856 | const Scalar salinity = max(0.0, ThisType::salinity()); |
312 | |||
313 | 145296856 | const Scalar rhow = H2O::liquidDensity(temperature, pressure); | |
314 | |||
315 | 145296856 | const Scalar density = rhow + | |
316 | 290593712 | 1000*salinity*( | |
317 | 145296856 | 0.668 + | |
318 | 290593712 | 0.44*salinity + | |
319 | 145296856 | 1.0E-6*( | |
320 | 290593712 | 300*pMPa - | |
321 | 290593712 | 2400*pMPa*salinity + | |
322 | 145296856 | TempC*( | |
323 | 145296856 | 80.0 + | |
324 | 290593712 | 3*TempC - | |
325 | 290593712 | 3300*salinity - | |
326 | 290593712 | 13*pMPa + | |
327 | 145296856 | 47*pMPa*salinity))); | |
328 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 145296848 times.
|
145296856 | assert(density > 0.0); |
329 | 145296856 | return density; | |
330 | } | ||
331 | |||
332 | /*! | ||
333 | * \brief The molar density of brine in \f$\mathrm{[mol/m^3]}\f$ at a given pressure and temperature. | ||
334 | * | ||
335 | * \param temperature temperature of component in \f$\mathrm{[K]}\f$ | ||
336 | * \param pressure pressure of component in \f$\mathrm{[Pa]}\f$ | ||
337 | * | ||
338 | */ | ||
339 | static Scalar liquidMolarDensity(Scalar temperature, Scalar pressure) | ||
340 | { return liquidDensity(temperature, pressure)/molarMass(); } | ||
341 | |||
342 | /*! | ||
343 | * \brief The pressure of steam in \f$\mathrm{[Pa]}\f$ at a given density and temperature. | ||
344 | * | ||
345 | * \param temperature temperature of component in \f$\mathrm{[K]}\f$ | ||
346 | * \param density density of component in \f$\mathrm{[kg/m^3]}\f$ | ||
347 | */ | ||
348 | static Scalar gasPressure(Scalar temperature, Scalar density) | ||
349 | { return H2O::gasPressure(temperature, density); } | ||
350 | |||
351 | /*! | ||
352 | * \brief The pressure of brine in \f$\mathrm{[Pa]}\f$ at a given density and | ||
353 | * temperature. | ||
354 | * | ||
355 | * \param temperature temperature of component in \f$\mathrm{[K]}\f$ | ||
356 | * \param density density of component in \f$\mathrm{[kg/m^3]}\f$ | ||
357 | */ | ||
358 | static Scalar liquidPressure(Scalar temperature, Scalar density) | ||
359 | { | ||
360 | // We use the Newton method for this. For the initial value we | ||
361 | // assume the pressure to be 10% higher than the vapor | ||
362 | // pressure | ||
363 | Scalar pressure = 1.1*vaporPressure(temperature); | ||
364 | const Scalar eps = pressure*1e-7; | ||
365 | |||
366 | Scalar deltaP = pressure*2; | ||
367 | |||
368 | using std::abs; | ||
369 | for (int i = 0; i < 5 && abs(pressure*1e-9) < abs(deltaP); ++i) { | ||
370 | Scalar f = liquidDensity(temperature, pressure) - density; | ||
371 | |||
372 | Scalar df_dp; | ||
373 | df_dp = liquidDensity(temperature, pressure + eps); | ||
374 | df_dp -= liquidDensity(temperature, pressure - eps); | ||
375 | df_dp /= 2*eps; | ||
376 | |||
377 | deltaP = - f/df_dp; | ||
378 | |||
379 | pressure += deltaP; | ||
380 | } | ||
381 | assert(pressure > 0.0); | ||
382 | return pressure; | ||
383 | } | ||
384 | |||
385 | /*! | ||
386 | * \brief The dynamic viscosity \f$\mathrm{[Pa*s]}\f$ of steam. | ||
387 | * | ||
388 | * \param temperature temperature of component | ||
389 | * \param pressure pressure of component | ||
390 | */ | ||
391 | static Scalar gasViscosity(Scalar temperature, Scalar pressure) | ||
392 |
1/2✓ Branch 1 taken 101 times.
✗ Branch 2 not taken.
|
101 | { return H2O::gasViscosity(temperature, pressure); }; |
393 | |||
394 | /*! | ||
395 | * \brief The dynamic viscosity \f$\mathrm{[Pa*s]}\f$ of pure brine. | ||
396 | * | ||
397 | * \param temperature temperature of component in \f$\mathrm{[K]}\f$ | ||
398 | * \param pressure pressure of component in \f$\mathrm{[Pa]}\f$ | ||
399 | * | ||
400 | * \note The viscosity is computed as a function of the salt mass fraction and temperature. | ||
401 | * The used function is an empirical relationship fitted to experimental data. | ||
402 | * It is presented by Batzle and Wang, 1992 (DOI: 10.1190/1.1443207) \cite batzle1992, | ||
403 | * better description and comparison with other approaches in Adams and Bachu, 2002 (DOI: 10.1046/j.1468-8123.2002.00041.x) \cite adams2002. | ||
404 | * However, the equation given in Adams and Bachu, 2002(DOI: 10.1046/j.1468-8123.2002.00041.x) \cite adams2002 | ||
405 | * is obviously wrong when compared to the original by Batzle and Wang, 1992 (DOI: 10.1190/1.1443207) \cite batzle1992. | ||
406 | */ | ||
407 | 73847610 | static Scalar liquidViscosity(Scalar temperature, Scalar pressure) | |
408 | { | ||
409 | // regularisation | ||
410 | using std::max; | ||
411 |
2/2✓ Branch 0 taken 4 times.
✓ Branch 1 taken 73847602 times.
|
73847610 | temperature = max(temperature, 275.0); |
412 |
1/2✓ Branch 1 taken 73847606 times.
✗ Branch 2 not taken.
|
73847610 | const Scalar salinity = max(0.0, ThisType::salinity()); |
413 | |||
414 | using std::pow; | ||
415 | using Dune::power; | ||
416 | using std::exp; | ||
417 | 73847610 | const Scalar T_C = temperature - 273.15; | |
418 | 73847610 | const Scalar A = (0.42*power((pow(salinity, 0.8)-0.17), 2) + 0.045)*pow(T_C, 0.8); | |
419 | 73847610 | const Scalar mu_brine = 0.1 + 0.333*salinity + (1.65+91.9*salinity*salinity*salinity)*exp(-A); //[cP] | |
420 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 73847606 times.
|
73847610 | assert(mu_brine > 0.0); |
421 | 73847610 | return mu_brine/1000.0; //[Pa s] | |
422 | } | ||
423 | |||
424 | /*! | ||
425 | * \brief Thermal conductivity of a brine \f$\mathrm{[W/(m K)]}\f$. | ||
426 | * \param temperature temperature of component in \f$\mathrm{[K]}\f$ | ||
427 | * \param pressure pressure of component in \f$\mathrm{[Pa]}\f$ | ||
428 | * | ||
429 | * The thermal conductivity of brine is implemented based on the contribution of NaCl (\f$\lambda_{brine}\f$/\f$\lambda_{H_2O}\f$) of \cite Yusufova1975 https://link.springer.com/content/pdf/10.1007/BF00867119.pdf, also discussed in \cite Ozbek1980 https://docecity.com/thermal-conductivity-of-aqueous-sodium-chloride-acs-publicat-5f10766acba00.html | ||
430 | */ | ||
431 | 46343619 | static Scalar liquidThermalConductivity(Scalar temperature, Scalar pressure) | |
432 | { | ||
433 | 46343619 | Scalar tempC = temperature-273.15; | |
434 | 46343619 | Scalar xNaCl = ThisType::salinity() * H2O::molarMass() / (ThisType::salinity() * H2O::molarMass() + (1-ThisType::salinity() )*Components::NaCl<Scalar>::molarMass()); // mole fraction of NaCl | |
435 | 46343619 | Scalar m = xNaCl/(H2O::molarMass()*(1- xNaCl)); // molality of NaCl | |
436 | 46343619 | Scalar S = 5844.3 * m / (1000 + 58.443 *m); | |
437 | 46343619 | Scalar contribNaClFactor = 1.0 - (2.3434e-3 - 7.924e-6*tempC + 3.924e-8*tempC*tempC)*S + (1.06e-5 - 2.0e-8*tempC + 1.2e-10*tempC*tempC)*S*S; | |
438 | 46343619 | return contribNaClFactor * H2O::liquidThermalConductivity(temperature, pressure); | |
439 | } | ||
440 | }; | ||
441 | |||
442 | template <class Scalar, class H2O> | ||
443 | struct IsAqueous<Brine<Scalar, H2O>> : public std::true_type {}; | ||
444 | |||
445 | } // end namespace Dumux::Components | ||
446 | |||
447 | #endif | ||
448 |