3.3.0
DUNE for Multi-{Phase, Component, Scale, Physics, ...} flow and transport in porous media
components/brine.hh
Go to the documentation of this file.
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 * See the file COPYING for full copying permissions. *
5 * *
6 * This program is free software: you can redistribute it and/or modify *
7 * it under the terms of the GNU General Public License as published by *
8 * the Free Software Foundation, either version 3 of the License, or *
9 * (at your option) any later version. *
10 * *
11 * This program is distributed in the hope that it will be useful, *
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
14 * GNU General Public License for more details. *
15 * *
16 * You should have received a copy of the GNU General Public License *
17 * along with this program. If not, see <http://www.gnu.org/licenses/>. *
18 *****************************************************************************/
24#ifndef DUMUX_BRINE_HH
25#define DUMUX_BRINE_HH
26
27#include <cmath>
28
29#include <dune/common/math.hh>
30
38
39namespace Dumux::Components {
40
50template <class Scalar,
51 class H2O_Tabulated = Components::TabulatedComponent<Components::H2O<Scalar>>>
52class Brine
53: public Components::Base<Scalar, Brine<Scalar, H2O_Tabulated> >
54, public Components::Liquid<Scalar, Brine<Scalar, H2O_Tabulated> >
55, public Components::Gas<Scalar, Brine<Scalar, H2O_Tabulated> >
56{
58public:
60
62 static constexpr Scalar R = Constants<Scalar>::R;
63
67 static std::string name()
68 { return "Brine"; }
69
73 static Scalar salinity()
74 {
75 static const Scalar salinity = getParam<Scalar>("Brine.Salinity");
76 return salinity;
77 }
78
83 static Scalar molarMass()
84 {
85 const Scalar M1 = H2O::molarMass();
86 const Scalar M2 = Components::NaCl<Scalar>::molarMass(); // molar mass of NaCl [kg/mol]
87 return M1*M2/(M2 + ThisType::salinity()*(M1 - M2));
88 };
89
93 static Scalar criticalTemperature()
94 { return H2O::criticalTemperature(); }
95
99 static Scalar criticalPressure()
100 { return H2O::criticalPressure(); }
101
105 static Scalar tripleTemperature()
106 { return H2O::tripleTemperature(); }
107
111 static Scalar triplePressure()
112 { return H2O::triplePressure(); }
113
120 static Scalar vaporPressure(Scalar temperature)
121 {
122 Scalar ps = H2O::vaporPressure(temperature); //Saturation vapor pressure for pure water
123 Scalar pi = 0;
124 using std::log;
125 if (ThisType::salinity() < 0.26) // here we have hard coded the solubility limit for NaCl
126 pi = (R * temperature * log(1- ThisType::salinity())); // simplified version of Eq 2.29 in Vishal Jambhekar's dissertation (http://dx.doi.org/10.18419/opus-8979)
127 else
128 pi = (R * temperature * log(0.74));
129 using std::exp;
130 ps *= exp((pi)/(R*temperature));// Kelvin's law for reduction in saturation vapor pressure due to osmotic potential
131 return ps;
132 }
133
140 static const Scalar gasEnthalpy(Scalar temperature, Scalar pressure)
142
155 static const Scalar liquidEnthalpy(Scalar T, Scalar p)
156 {
157 /*Numerical coefficients from PALLISER*/
158 static const Scalar f[] = {
159 2.63500E-1, 7.48368E-6, 1.44611E-6, -3.80860E-10
160 };
161
162 /*Numerical coefficients from MICHAELIDES for the enthalpy of brine*/
163 static const Scalar a[4][3] = {
164 { +9633.6, -4080.0, +286.49 },
165 { +166.58, +68.577, -4.6856 },
166 { -0.90963, -0.36524, +0.249667E-1 },
167 { +0.17965E-2, +0.71924E-3, -0.4900E-4 }
168 };
169
170 const Scalar theta = T - 273.15;
171 const Scalar salSat = f[0] + f[1]*theta + f[2]*theta*theta + f[3]*theta*theta*theta;
172
173 /*Regularization*/
174 using std::min;
175 using std::max;
176 const Scalar salinity = min(max(ThisType::salinity(),0.0), salSat);
177
178 const Scalar hw = H2O::liquidEnthalpy(T, p)/1E3; /* kJ/kg */
179
180 /*DAUBERT and DANNER*/
181 /*U=*/const Scalar h_NaCl = (3.6710E4*T + 0.5*(6.2770E1)*T*T - ((6.6670E-2)/3)*T*T*T
182 +((2.8000E-5)/4)*(T*T*T*T))/(58.44E3)- 2.045698e+02; /* kJ/kg */
183
184 const Scalar m = (1E3/58.44)*(salinity/(1-salinity));
185
186 using Dune::power;
187 Scalar d_h = 0;
188 for (int i = 0; i<=3; i++) {
189 for (int j=0; j<=2; j++) {
190 d_h = d_h + a[i][j] * power(theta, i) * power(m, j);
191 }
192 }
193
194 /* heat of dissolution for halite according to Michaelides 1971 */
195 const Scalar delta_h = (4.184/(1E3 + (58.44 * m)))*d_h;
196
197 /* Enthalpy of brine without any dissolved gas */
198 const Scalar h_ls1 =(1-salinity)*hw + salinity*h_NaCl + salinity*delta_h; /* kJ/kg */
199 return h_ls1*1E3; /*J/kg*/
200 }
201
214 static const Scalar liquidHeatCapacity(Scalar temperature, Scalar pressure)
215 {
216 const Scalar eps = temperature*1e-8;
218 }
219
232 static const Scalar gasHeatCapacity(Scalar temperature,
233 Scalar pressure)
234 {
236 }
237
244 static const Scalar gasInternalEnergy(Scalar temperature,
245 Scalar pressure)
246 {
248 }
249
256 static const Scalar liquidInternalEnergy(Scalar temperature,
257 Scalar pressure)
258 {
260 }
261
268 static Scalar gasDensity(Scalar temperature, Scalar pressure)
270
279 static Scalar gasMolarDensity(Scalar temperature, Scalar pressure)
281
285 static constexpr bool gasIsIdeal()
286 { return H2O::gasIsIdeal(); }
287
291 static constexpr bool gasIsCompressible()
292 { return H2O::gasIsCompressible(); }
293
297 static constexpr bool liquidIsCompressible()
298 { return H2O::liquidIsCompressible(); }
299
310 static Scalar liquidDensity(Scalar temperature, Scalar pressure)
311 {
312 using std::max;
313 const Scalar TempC = temperature - 273.15;
314 const Scalar pMPa = pressure/1.0E6;
315 const Scalar salinity = max(0.0, ThisType::salinity());
316
317 const Scalar rhow = H2O::liquidDensity(temperature, pressure);
318
319 const Scalar density = rhow +
320 1000*salinity*(
321 0.668 +
322 0.44*salinity +
323 1.0E-6*(
324 300*pMPa -
325 2400*pMPa*salinity +
326 TempC*(
327 80.0 +
328 3*TempC -
329 3300*salinity -
330 13*pMPa +
331 47*pMPa*salinity)));
332 assert(density > 0.0);
333 return density;
334 }
335
343 static Scalar liquidMolarDensity(Scalar temperature, Scalar pressure)
345
352 static Scalar gasPressure(Scalar temperature, Scalar density)
354
362 static Scalar liquidPressure(Scalar temperature, Scalar density)
363 {
364 // We use the Newton method for this. For the initial value we
365 // assume the pressure to be 10% higher than the vapor
366 // pressure
367 Scalar pressure = 1.1*vaporPressure(temperature);
368 const Scalar eps = pressure*1e-7;
369
370 Scalar deltaP = pressure*2;
371
372 using std::abs;
373 for (int i = 0; i < 5 && abs(pressure*1e-9) < abs(deltaP); ++i) {
375
376 Scalar df_dp;
377 df_dp = liquidDensity(temperature, pressure + eps);
378 df_dp -= liquidDensity(temperature, pressure - eps);
379 df_dp /= 2*eps;
380
381 deltaP = - f/df_dp;
382
383 pressure += deltaP;
384 }
385 assert(pressure > 0.0);
386 return pressure;
387 }
388
395 static Scalar gasViscosity(Scalar temperature, Scalar pressure)
397
409 static Scalar liquidViscosity(Scalar temperature, Scalar pressure)
410 {
411 // regularisation
412 using std::max;
413 temperature = max(temperature, 275.0);
414 const Scalar salinity = max(0.0, ThisType::salinity());
415
416 using std::pow;
417 using Dune::power;
418 using std::exp;
419 const Scalar T_C = temperature - 273.15;
420 const Scalar A = (0.42*power((pow(salinity, 0.8)-0.17), 2) + 0.045)*pow(T_C, 0.8);
421 const Scalar mu_brine = 0.1 + 0.333*salinity + (1.65+91.9*salinity*salinity*salinity)*exp(-A);
422 assert(mu_brine > 0.0);
423 return mu_brine/1000.0;
424 }
425
435 static Scalar liquidThermalConductivity(Scalar temperature, Scalar pressure)
437};
438
439template <class Scalar, class H2O>
440struct IsAqueous<Brine<Scalar, H2O>> : public std::true_type {};
441
442} // end namespace Dumux::Components
443
444#endif
The infrastructure to retrieve run-time parameters from Dune::ParameterTrees.
Material properties of pure water .
Interface for components that have a liquid state.
Tabulates all thermodynamic properties of a given untabulated chemical species.
Material properties of pure salt .
Interface for components that have a gas state.
std::string temperature() noexcept
I/O name of temperature for equilibrium models.
Definition: name.hh:51
std::string pressure(int phaseIdx) noexcept
I/O name of pressure for multiphase systems.
Definition: name.hh:34
std::string density(int phaseIdx) noexcept
I/O name of density for multiphase systems.
Definition: name.hh:65
Definition: air.hh:35
IsAqueous struct.
Definition: components/base.hh:47
Base class for all components Components provide the thermodynamic relations for the liquid,...
Definition: components/base.hh:59
A class for the brine fluid properties.
Definition: components/brine.hh:56
static Scalar liquidViscosity(Scalar temperature, Scalar pressure)
The dynamic viscosity of pure brine.
Definition: components/brine.hh:409
static const Scalar liquidEnthalpy(Scalar T, Scalar p)
Specific enthalpy of liquid brine .
Definition: components/brine.hh:155
static Scalar molarMass()
The molar mass in of brine. This assumes that the salt is pure NaCl.
Definition: components/brine.hh:83
static Scalar gasMolarDensity(Scalar temperature, Scalar pressure)
The molar density of steam in at a given pressure and temperature. We take the value of the H2O gas ...
Definition: components/brine.hh:279
static Scalar tripleTemperature()
Returns the temperature at brine's triple point. Here, it is assumed to be equal to that of pure wat...
Definition: components/brine.hh:105
static Scalar gasPressure(Scalar temperature, Scalar density)
The pressure of steam in at a given density and temperature.
Definition: components/brine.hh:352
static const Scalar liquidInternalEnergy(Scalar temperature, Scalar pressure)
Specific internal energy of liquid brine .
Definition: components/brine.hh:256
static Scalar salinity()
Return the constant salinity.
Definition: components/brine.hh:73
static const Scalar gasHeatCapacity(Scalar temperature, Scalar pressure)
Specific isobaric heat capacity of water steam .
Definition: components/brine.hh:232
static Scalar criticalPressure()
Returns the critical pressure of brine. Here, it is assumed to be equal to that of pure water.
Definition: components/brine.hh:99
static const Scalar gasEnthalpy(Scalar temperature, Scalar pressure)
Specific enthalpy of gaseous brine . Only water volatile and salt is suppose to stay in the liquid ph...
Definition: components/brine.hh:140
static constexpr Scalar R
The ideal gas constant .
Definition: components/brine.hh:62
static Scalar gasDensity(Scalar temperature, Scalar pressure)
The density of steam at a given pressure and temperature .
Definition: components/brine.hh:268
static Scalar liquidPressure(Scalar temperature, Scalar density)
The pressure of brine in at a given density and temperature.
Definition: components/brine.hh:362
static Scalar liquidMolarDensity(Scalar temperature, Scalar pressure)
The molar density of brine in at a given pressure and temperature.
Definition: components/brine.hh:343
static Scalar vaporPressure(Scalar temperature)
The vapor pressure in of pure brine at a given temperature. Here, it is assumed to be equal to that ...
Definition: components/brine.hh:120
static Scalar triplePressure()
Returns the pressure at brine's triple point. Here, it is assumed to be equal to that of pure water.
Definition: components/brine.hh:111
static Scalar liquidThermalConductivity(Scalar temperature, Scalar pressure)
Thermal conductivity of a brine .
Definition: components/brine.hh:435
static const Scalar liquidHeatCapacity(Scalar temperature, Scalar pressure)
Specific isobaric heat capacity of brine .
Definition: components/brine.hh:214
static Scalar gasViscosity(Scalar temperature, Scalar pressure)
The dynamic viscosity of steam.
Definition: components/brine.hh:395
static constexpr bool liquidIsCompressible()
Returns true if the liquid phase is assumed to be compressible.
Definition: components/brine.hh:297
static std::string name()
A human readable name for the brine.
Definition: components/brine.hh:67
static Scalar criticalTemperature()
Returns the critical temperature of brine. Here, it is assumed to be equal to that of pure water.
Definition: components/brine.hh:93
static const Scalar gasInternalEnergy(Scalar temperature, Scalar pressure)
Specific internal energy of steam .
Definition: components/brine.hh:244
static constexpr bool gasIsCompressible()
Returns true if the gas phase is assumed to be compressible.
Definition: components/brine.hh:291
static constexpr bool gasIsIdeal()
Returns true if the gas phase is assumed to be ideal.
Definition: components/brine.hh:285
static Scalar liquidDensity(Scalar temperature, Scalar pressure)
The density of pure brine at a given pressure and temperature .
Definition: components/brine.hh:310
Interface for components that have a gas state.
Definition: gas.hh:41
Material properties of pure water .
Definition: h2o.hh:60
Interface for components that have a liquid state.
Definition: liquid.hh:41
static constexpr Scalar molarMass()
The molar mass of NaCl in .
Definition: nacl.hh:60
Tabulates all thermodynamic properties of a given untabulated chemical species.
Definition: tabulatedcomponent.hh:82
static const Scalar gasEnthalpy(Scalar temperature, Scalar pressure)
Specific enthalpy of the gas .
Definition: tabulatedcomponent.hh:238
static Scalar gasPressure(Scalar temperature, Scalar density)
The pressure of gas in at a given density and temperature.
Definition: tabulatedcomponent.hh:368
static Scalar criticalTemperature()
Returns the critical temperature in of the component.
Definition: tabulatedcomponent.hh:184
static const Scalar gasHeatCapacity(Scalar temperature, Scalar pressure)
Specific isobaric heat capacity of the gas .
Definition: tabulatedcomponent.hh:292
static Scalar liquidThermalConductivity(Scalar temperature, Scalar pressure)
The thermal conductivity of liquid water .
Definition: tabulatedcomponent.hh:619
static Scalar gasDensity(Scalar temperature, Scalar pressure)
The density of gas at a given pressure and temperature .
Definition: tabulatedcomponent.hh:456
static const Scalar liquidEnthalpy(Scalar temperature, Scalar pressure)
Specific enthalpy of the liquid .
Definition: tabulatedcomponent.hh:265
static Scalar triplePressure()
Returns the pressure in at the component's triple point.
Definition: tabulatedcomponent.hh:202
static Scalar criticalPressure()
Returns the critical pressure in of the component.
Definition: tabulatedcomponent.hh:190
static const Scalar gasInternalEnergy(Scalar temperature, Scalar pressure)
Specific internal energy of the gas .
Definition: tabulatedcomponent.hh:346
static constexpr Scalar molarMass()
The molar mass in of the component.
Definition: tabulatedcomponent.hh:178
static Scalar gasViscosity(Scalar temperature, Scalar pressure)
The dynamic viscosity of gas.
Definition: tabulatedcomponent.hh:538
static Scalar tripleTemperature()
Returns the temperature in at the component's triple point.
Definition: tabulatedcomponent.hh:196
static constexpr bool liquidIsCompressible()
Returns true if the liquid phase is assumed to be compressible.
Definition: tabulatedcomponent.hh:439
static Scalar liquidDensity(Scalar temperature, Scalar pressure)
The density of liquid at a given pressure and temperature .
Definition: tabulatedcomponent.hh:495
static Scalar gasMolarDensity(Scalar temperature, Scalar pressure)
The molar density of gas in at a given pressure and temperature.
Definition: tabulatedcomponent.hh:485
static Scalar vaporPressure(Scalar T)
The vapor pressure in of the component at a given temperature.
Definition: tabulatedcomponent.hh:211
static constexpr bool gasIsCompressible()
Returns true if the gas phase is assumed to be compressible.
Definition: tabulatedcomponent.hh:433
static constexpr bool gasIsIdeal()
Returns true if the gas phase is assumed to be ideal.
Definition: tabulatedcomponent.hh:445
A central place for various physical constants occuring in some equations.
Definition: constants.hh:39
Base class for all components Components provide the thermodynamic relations for the liquid,...