opm-common
Units.hpp
1 //===========================================================================
2 //
3 // File: Units.hpp
4 //
5 // Created: Thu Jul 2 09:19:08 2009
6 //
7 // Author(s): Halvor M Nilsen <hnil@sintef.no>
8 //
9 // $Date$
10 //
11 // $Revision$
12 //
13 //===========================================================================
14 
15 /*
16  Copyright 2009, 2010, 2011, 2012 SINTEF ICT, Applied Mathematics.
17  Copyright 2009, 2010, 2011, 2012 Statoil ASA.
18 
19  This file is part of the Open Porous Media project (OPM).
20 
21  OPM is free software: you can redistribute it and/or modify
22  it under the terms of the GNU General Public License as published by
23  the Free Software Foundation, either version 3 of the License, or
24  (at your option) any later version.
25 
26  OPM is distributed in the hope that it will be useful,
27  but WITHOUT ANY WARRANTY; without even the implied warranty of
28  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
29  GNU General Public License for more details.
30 
31  You should have received a copy of the GNU General Public License
32  along with OPM. If not, see <http://www.gnu.org/licenses/>.
33 */
34 
35 #ifndef OPM_UNITS_HEADER
36 #define OPM_UNITS_HEADER
37 
56 namespace Opm {
57  namespace prefix
59  {
60  constexpr double micro = 1.0e-6;
61  constexpr double milli = 1.0e-3;
62  constexpr double centi = 1.0e-2;
63  constexpr double deci = 1.0e-1;
64  constexpr double kilo = 1.0e3;
65  constexpr double mega = 1.0e6;
66  constexpr double giga = 1.0e9;
67  } // namespace prefix
68 
69  namespace unit
84  {
87  constexpr double square(double v) { return v * v; }
88  constexpr double cubic (double v) { return v * v * v; }
90 
91  // --------------------------------------------------------------
92  // Basic (fundamental) units and conversions
93  // --------------------------------------------------------------
94 
97  constexpr double meter = 1;
98  constexpr double inch = 2.54 * prefix::centi*meter;
99  constexpr double feet = 12 * inch;
101 
104  constexpr double second = 1;
105  constexpr double minute = 60 * second;
106  constexpr double hour = 60 * minute;
107  constexpr double day = 24 * hour;
108  constexpr double year = 365 * day;
109  constexpr double ecl_year = 365.25 * day;
111 
114  constexpr double gallon = 231 * cubic(inch);
115  constexpr double stb = 42 * gallon;
116  constexpr double liter = 1 * cubic(prefix::deci*meter);
118 
121  constexpr double kilogram = 1;
122  constexpr double gram = 1.0e-3 * kilogram;
123  // http://en.wikipedia.org/wiki/Pound_(mass)#Avoirdupois_pound
124  constexpr double pound = 0.45359237 * kilogram;
126 
129  constexpr double joule = 1;
130  constexpr double btu = 1054.3503*joule; // "british thermal units"
132 
133  // --------------------------------------------------------------
134  // Standardised constants
135  // --------------------------------------------------------------
136 
139  constexpr double gravity = 9.80665 * meter/square(second);
141 
142  constexpr double mol = 1;
143  // --------------------------------------------------------------
144  // Derived units and conversions
145  // --------------------------------------------------------------
146 
149  constexpr double Newton = kilogram*meter / square(second); // == 1
150  constexpr double dyne = 1e-5*Newton;
151  constexpr double lbf = pound * gravity; // Pound-force
153 
156  constexpr double Pascal = Newton / square(meter); // == 1
157  constexpr double barsa = 100000 * Pascal;
158  constexpr double bars = 100000 * Pascal;
159  constexpr double atma = 101325 * Pascal;
160  constexpr double atm = 101325 * Pascal;
161  constexpr double psia = lbf / square(inch);
162  constexpr double psi = lbf / square(inch);
164 
171  constexpr double degCelsius = 1.0; // scaling factor °C -> K
172  constexpr double degCelsiusOffset = 273.15; // offset for the °C -> K conversion
173 
174  constexpr double degFahrenheit = 5.0/9.0; // factor to convert a difference in °F to a difference in K
175  constexpr double degFahrenheitOffset = 459.67*degFahrenheit; // °F -> K offset (i.e. how many K is 0 °F?)
177 
180  constexpr double Pas = Pascal * second; // == 1
181  constexpr double Poise = prefix::deci*Pas;
183 
184  constexpr double ppm = 1. / prefix::mega;
185 
186  namespace perm_details {
187  constexpr double p_grad = atm / (prefix::centi*meter);
188  constexpr double area = square(prefix::centi*meter);
189  constexpr double flux = cubic (prefix::centi*meter) / second;
190  constexpr double velocity = flux / area;
191  constexpr double visc = prefix::centi*Poise;
192  constexpr double darcy = (velocity * visc) / p_grad;
193  // == 1e-7 [m^2] / 101325
194  // == 9.869232667160130e-13 [m^2]
195  }
205  constexpr double darcy = perm_details::darcy;
207 
211  namespace convert {
230  constexpr double from(const double q, const double unit)
231  {
232  return q * unit;
233  }
234 
253  constexpr double to(const double q, const double unit)
254  {
255  return q / unit;
256  }
257  } // namespace convert
258  }
259 
260  namespace Metric {
261  using namespace prefix;
262  using namespace unit;
263  constexpr double Pressure = barsa;
264  constexpr double PressureDrop = bars;
265  constexpr double Temperature = degCelsius;
266  constexpr double TemperatureOffset = degCelsiusOffset;
267  constexpr double AbsoluteTemperature = degCelsius; // actually [K], but the these two are identical
268  constexpr double Length = meter;
269  constexpr double Time = day;
270  constexpr double RunTime = second;
271  constexpr double Mass = kilogram;
272  constexpr double Permeability = milli*darcy;
273  constexpr double Transmissibility = centi*Poise*cubic(meter)/(day*barsa);
274  constexpr double LiquidSurfaceVolume = cubic(meter);
275  constexpr double GasSurfaceVolume = cubic(meter);
276  constexpr double ReservoirVolume = cubic(meter);
277  constexpr double Area = square(meter);
278  constexpr double GeomVolume = cubic(meter);
279  constexpr double GasDissolutionFactor = GasSurfaceVolume/LiquidSurfaceVolume;
280  constexpr double OilDissolutionFactor = LiquidSurfaceVolume/GasSurfaceVolume;
281  constexpr double WaterVaporizationFactor = LiquidSurfaceVolume/GasSurfaceVolume;
282  constexpr double Density = kilogram/cubic(meter);
283  constexpr double Concentration = kilogram/cubic(meter);
284  constexpr double FoamDensity = kilogram/cubic(meter);
285  constexpr double Viscosity = centi*Poise;
286  constexpr double Timestep = day;
287  constexpr double SurfaceTension = dyne/(centi*meter);
288  constexpr double Energy = kilo*joule;
289  constexpr double Moles = kilo*mol;
290  constexpr double PPM = ppm;
291  constexpr double Ymodule = giga*Pascal;
292  constexpr double ThermalConductivity = kilo*joule/(meter*day*degCelsius);
293  }
294 
295 
296  namespace Field {
297  using namespace prefix;
298  using namespace unit;
299  constexpr double Pressure = psia;
300  constexpr double PressureDrop = psi;
301  constexpr double Temperature = degFahrenheit;
302  constexpr double TemperatureOffset = degFahrenheitOffset;
303  constexpr double AbsoluteTemperature = degFahrenheit; // actually [°R], but the these two are identical
304  constexpr double Length = feet;
305  constexpr double Time = day;
306  constexpr double RunTime = second;
307  constexpr double Mass = pound;
308  constexpr double Permeability = milli*darcy;
309  constexpr double Transmissibility = centi*Poise*stb/(day*psia);
310  constexpr double LiquidSurfaceVolume = stb;
311  constexpr double GasSurfaceVolume = 1000*cubic(feet);
312  constexpr double ReservoirVolume = stb;
313  constexpr double Area = square(feet);
314  constexpr double GeomVolume = cubic(feet);
315  constexpr double GasDissolutionFactor = GasSurfaceVolume/LiquidSurfaceVolume;
316  constexpr double OilDissolutionFactor = LiquidSurfaceVolume/GasSurfaceVolume;
317  constexpr double WaterVaporizationFactor = LiquidSurfaceVolume/GasSurfaceVolume;
318  constexpr double Density = pound/cubic(feet);
319  constexpr double Concentration = pound/stb;
320  constexpr double FoamDensity = pound/GasSurfaceVolume;
321  constexpr double Viscosity = centi*Poise;
322  constexpr double Timestep = day;
323  constexpr double SurfaceTension = dyne/(centi*meter);
324  constexpr double Energy = btu;
325  constexpr double Moles = kilo*pound*mol;
326  constexpr double PPM = ppm;
327  constexpr double Ymodule = giga*Pascal;
328  constexpr double ThermalConductivity = btu/(feet*day*degFahrenheit);
329  }
330 
331 
332  namespace Lab {
333  using namespace prefix;
334  using namespace unit;
335  constexpr double Pressure = atma;
336  constexpr double PressureDrop = atm;
337  constexpr double Temperature = degCelsius;
338  constexpr double TemperatureOffset = degCelsiusOffset;
339  constexpr double AbsoluteTemperature = degCelsius; // actually [K], but the these two are identical
340  constexpr double Length = centi*meter;
341  constexpr double Time = hour;
342  constexpr double RunTime = second;
343  constexpr double Mass = gram;
344  constexpr double Permeability = milli*darcy;
345  constexpr double Transmissibility = centi*Poise*cubic(centi*meter)/(hour*atm);
346  constexpr double LiquidSurfaceVolume = cubic(centi*meter);
347  constexpr double GasSurfaceVolume = cubic(centi*meter);
348  constexpr double ReservoirVolume = cubic(centi*meter);
349  constexpr double Area = square(centi*meter);
350  constexpr double GeomVolume = cubic(centi*meter);
351  constexpr double GasDissolutionFactor = GasSurfaceVolume/LiquidSurfaceVolume;
352  constexpr double OilDissolutionFactor = LiquidSurfaceVolume/GasSurfaceVolume;
353  constexpr double WaterVaporizationFactor = LiquidSurfaceVolume/GasSurfaceVolume;
354  constexpr double Density = gram/cubic(centi*meter);
355  constexpr double Concentration = gram/cubic(centi*meter);
356  constexpr double FoamDensity = gram/cubic(centi*meter);
357  constexpr double Viscosity = centi*Poise;
358  constexpr double Timestep = hour;
359  constexpr double SurfaceTension = dyne/(centi*meter);
360  constexpr double Energy = joule;
361  constexpr double Moles = mol;
362  constexpr double PPM = ppm;
363  constexpr double Ymodule = giga*Pascal;
364  constexpr double ThermalConductivity = joule/(centi*meter*hour*degCelsius);
365  }
366 
367 
368  namespace PVT_M {
369  using namespace prefix;
370  using namespace unit;
371  constexpr double Pressure = atma;
372  constexpr double PressureDrop = atm;
373  constexpr double Temperature = degCelsius;
374  constexpr double TemperatureOffset = degCelsiusOffset;
375  constexpr double AbsoluteTemperature = degCelsius; // actually [K], but the these two are identical
376  constexpr double Length = meter;
377  constexpr double Time = day;
378  constexpr double RunTime = second;
379  constexpr double Mass = kilogram;
380  constexpr double Permeability = milli*darcy;
381  constexpr double Transmissibility = centi*Poise*cubic(meter)/(day*atm);
382  constexpr double LiquidSurfaceVolume = cubic(meter);
383  constexpr double GasSurfaceVolume = cubic(meter);
384  constexpr double ReservoirVolume = cubic(meter);
385  constexpr double Area = square(meter);
386  constexpr double GeomVolume = cubic(meter);
387  constexpr double GasDissolutionFactor = GasSurfaceVolume/LiquidSurfaceVolume;
388  constexpr double OilDissolutionFactor = LiquidSurfaceVolume/GasSurfaceVolume;
389  constexpr double WaterVaporizationFactor = LiquidSurfaceVolume/GasSurfaceVolume;
390  constexpr double Density = kilogram/cubic(meter);
391  constexpr double Concentration = kilogram/cubic(meter);
392  constexpr double FoamDensity = kilogram/cubic(meter);
393  constexpr double Viscosity = centi*Poise;
394  constexpr double Timestep = day;
395  constexpr double SurfaceTension = dyne/(centi*meter);
396  constexpr double Energy = kilo*joule;
397  constexpr double Moles = kilo*mol;
398  constexpr double PPM = ppm;
399  constexpr double Ymodule = giga*Pascal;
400  constexpr double ThermalConductivity = kilo*joule/(meter*day*degCelsius);
401  }
402 }
403 
404 #endif // OPM_UNITS_HEADER
constexpr double milli
Unit prefix [m].
Definition: Units.hpp:61
constexpr double kilo
Unit prefix [k].
Definition: Units.hpp:64
This class implements a small container which holds the transmissibility mulitpliers for all the face...
Definition: Exceptions.hpp:30
constexpr double mega
Unit prefix [M].
Definition: Units.hpp:65
constexpr double giga
Unit prefix [G].
Definition: Units.hpp:66
constexpr double micro
Unit prefix [ ].
Definition: Units.hpp:60
constexpr double to(const double q, const double unit)
Convert from internal units of measurements to equivalent external units of measurements.
Definition: Units.hpp:253
constexpr double centi
Non-standard unit prefix [c].
Definition: Units.hpp:62
constexpr double deci
Non-standard unit prefix [d].
Definition: Units.hpp:63
constexpr double from(const double q, const double unit)
Convert from external units of measurements to equivalent internal units of measurements.
Definition: Units.hpp:230