00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00028 #ifndef OPM_BRINE_HPP
00029 #define OPM_BRINE_HPP
00030
00031 #include <opm/material/components/Component.hpp>
00032 #include <opm/material/common/MathToolbox.hpp>
00033
00034 namespace Opm {
00035
00044 template <class Scalar, class H2O>
00045 class Brine : public Component<Scalar, Brine<Scalar, H2O> >
00046 {
00047 public:
00049 static Scalar salinity;
00050
00054 static const char* name()
00055 { return "Brine"; }
00056
00060 static bool gasIsIdeal()
00061 { return H2O::gasIsIdeal(); }
00062
00066 static bool gasIsCompressible()
00067 { return H2O::gasIsCompressible(); }
00068
00072 static bool liquidIsCompressible()
00073 { return H2O::liquidIsCompressible(); }
00074
00080 static Scalar molarMass()
00081 {
00082 const Scalar M1 = H2O::molarMass();
00083 const Scalar M2 = 58e-3;
00084 const Scalar X2 = salinity;
00085 return M1*M2/(M2 + X2*(M1 - M2));
00086 }
00087
00091 static Scalar criticalTemperature()
00092 { return H2O::criticalTemperature(); }
00093
00097 static Scalar criticalPressure()
00098 { return H2O::criticalPressure(); }
00099
00103 static Scalar tripleTemperature()
00104 { return H2O::tripleTemperature(); }
00105
00109 static Scalar triplePressure()
00110 { return H2O::triplePressure(); }
00111
00115 template <class Evaluation>
00116 static Evaluation vaporPressure(const Evaluation& T)
00117 { return H2O::vaporPressure(T); }
00118
00122 template <class Evaluation>
00123 static Evaluation gasEnthalpy(const Evaluation& temperature,
00124 const Evaluation& pressure)
00125 { return H2O::gasEnthalpy(temperature, pressure); }
00126
00135 template <class Evaluation>
00136 static Evaluation liquidEnthalpy(const Evaluation& temperature,
00137 const Evaluation& pressure)
00138 {
00139
00140 static const Scalar f[] = {
00141 2.63500e-1, 7.48368e-6, 1.44611e-6, -3.80860e-10
00142 };
00143
00144
00145 static const Scalar a[4][3] = {
00146 { -9633.6, -4080.0, +286.49 },
00147 { +166.58, +68.577, -4.6856 },
00148 { -0.90963, -0.36524, +0.249667e-1 },
00149 { +0.17965e-2, +0.71924e-3, -0.4900e-4 }
00150 };
00151
00152 const Evaluation& theta = temperature - 273.15;
00153
00154 Evaluation S = salinity;
00155 const Evaluation& S_lSAT =
00156 f[0]
00157 + f[1]*theta
00158 + f[2]*Opm::pow(theta, 2)
00159 + f[3]*Opm::pow(theta, 3);
00160
00161
00162 if (S > S_lSAT)
00163 S = S_lSAT;
00164
00165 const Evaluation& hw = H2O::liquidEnthalpy(temperature, pressure)/1e3;
00166
00167
00168 const Evaluation& h_NaCl =
00169 (3.6710e4*temperature
00170 + (6.2770e1/2)*temperature*temperature
00171 - (6.6670e-2/3)*temperature*temperature*temperature
00172 + (2.8000e-5/4)*Opm::pow(temperature, 4.0))/58.44e3
00173 - 2.045698e+02;
00174
00175 const Evaluation& m = S/(1-S)/58.44e-3;
00176
00177 Evaluation d_h = 0;
00178 for (int i = 0; i<=3; ++i) {
00179 for (int j = 0; j <= 2; ++j) {
00180 d_h += a[i][j] * Opm::pow(theta, i) * Opm::pow(m, j);
00181 }
00182 }
00183
00184 const Evaluation& delta_h = 4.184/(1e3 + (58.44 * m))*d_h;
00185
00186
00187 const Evaluation& h_ls = (1-S)*hw + S*h_NaCl + S*delta_h;
00188 return h_ls*1e3;
00189 }
00190
00191
00195 template <class Evaluation>
00196 static Evaluation liquidHeatCapacity(const Evaluation& temperature,
00197 const Evaluation& pressure)
00198 {
00199 Scalar eps = Opm::scalarValue(temperature)*1e-8;
00200 return (liquidEnthalpy(temperature + eps, pressure) - liquidEnthalpy(temperature, pressure))/eps;
00201 }
00202
00206 template <class Evaluation>
00207 static Evaluation gasHeatCapacity(const Evaluation& temperature,
00208 const Evaluation& pressure)
00209 { return H2O::gasHeatCapacity(temperature, pressure); }
00210
00214 template <class Evaluation>
00215 static Evaluation gasInternalEnergy(const Evaluation& temperature,
00216 const Evaluation& pressure)
00217 {
00218 return
00219 gasEnthalpy(temperature, pressure) -
00220 pressure/gasDensity(temperature, pressure);
00221 }
00222
00226 template <class Evaluation>
00227 static Evaluation liquidInternalEnergy(const Evaluation& temperature,
00228 const Evaluation& pressure)
00229 {
00230 return
00231 liquidEnthalpy(temperature, pressure) -
00232 pressure/liquidDensity(temperature, pressure);
00233 }
00234
00238 template <class Evaluation>
00239 static Evaluation gasDensity(const Evaluation& temperature, const Evaluation& pressure)
00240 { return H2O::gasDensity(temperature, pressure); }
00241
00249 template <class Evaluation>
00250 static Evaluation liquidDensity(const Evaluation& temperature, const Evaluation& pressure)
00251 {
00252 Evaluation tempC = temperature - 273.15;
00253 Evaluation pMPa = pressure/1.0E6;
00254
00255 const Evaluation rhow = H2O::liquidDensity(temperature, pressure);
00256 return
00257 rhow +
00258 1000*salinity*(
00259 0.668 +
00260 0.44*salinity +
00261 1.0E-6*(
00262 300*pMPa -
00263 2400*pMPa*salinity +
00264 tempC*(
00265 80.0 -
00266 3*tempC -
00267 3300*salinity -
00268 13*pMPa +
00269 47*pMPa*salinity)));
00270 }
00271
00275 template <class Evaluation>
00276 static Evaluation gasPressure(const Evaluation& temperature, const Evaluation& density)
00277 { return H2O::gasPressure(temperature, density); }
00278
00282 template <class Evaluation>
00283 static Evaluation liquidPressure(const Evaluation& temperature, const Evaluation& density)
00284 {
00285
00286
00287
00288 Evaluation pressure = 1.1*vaporPressure(temperature);
00289 Scalar eps = Opm::scalarValue(pressure)*1e-7;
00290
00291 Evaluation deltaP = pressure*2;
00292 for (int i = 0;
00293 i < 5
00294 && std::abs(Opm::scalarValue(pressure)*1e-9) < std::abs(Opm::scalarValue(deltaP));
00295 ++i)
00296 {
00297 const Evaluation& f = liquidDensity(temperature, pressure) - density;
00298
00299 Evaluation df_dp = liquidDensity(temperature, pressure + eps);
00300 df_dp -= liquidDensity(temperature, pressure - eps);
00301 df_dp /= 2*eps;
00302
00303 deltaP = - f/df_dp;
00304
00305 pressure += deltaP;
00306 }
00307
00308 return pressure;
00309 }
00310
00314 template <class Evaluation>
00315 static Evaluation gasViscosity(const Evaluation& temperature, const Evaluation& pressure)
00316 { return H2O::gasViscosity(temperature, pressure); }
00317
00326 template <class Evaluation>
00327 static Evaluation liquidViscosity(const Evaluation& temperature, const Evaluation& )
00328 {
00329 Evaluation T_C = temperature - 273.15;
00330 if(temperature <= 275.)
00331 T_C = 275.0;
00332
00333 Evaluation A = (0.42*std::pow((std::pow(salinity, 0.8)-0.17), 2) + 0.045)*Opm::pow(T_C, 0.8);
00334 Evaluation mu_brine = 0.1 + 0.333*salinity + (1.65+91.9*salinity*salinity*salinity)*Opm::exp(-A);
00335
00336 return mu_brine/1000.0;
00337 }
00338 };
00339
00343 template <class Scalar, class H2O>
00344 Scalar Brine<Scalar, H2O>::salinity = 0.1;
00345
00346 }
00347
00348 #endif