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 Density = kilogram/cubic(meter);
282  constexpr double Concentration = kilogram/cubic(meter);
283  constexpr double FoamDensity = kilogram/cubic(meter);
284  constexpr double Viscosity = centi*Poise;
285  constexpr double Timestep = day;
286  constexpr double SurfaceTension = dyne/(centi*meter);
287  constexpr double Energy = kilo*joule;
288  constexpr double Moles = kilo*mol;
289  constexpr double PPM = ppm;
290  constexpr double Ymodule = giga*Pascal;
291  constexpr double ThermalConductivity = kilo*joule/(meter*day*degCelsius);
292  }
293 
294 
295  namespace Field {
296  using namespace prefix;
297  using namespace unit;
298  constexpr double Pressure = psia;
299  constexpr double PressureDrop = psi;
300  constexpr double Temperature = degFahrenheit;
301  constexpr double TemperatureOffset = degFahrenheitOffset;
302  constexpr double AbsoluteTemperature = degFahrenheit; // actually [°R], but the these two are identical
303  constexpr double Length = feet;
304  constexpr double Time = day;
305  constexpr double RunTime = second;
306  constexpr double Mass = pound;
307  constexpr double Permeability = milli*darcy;
308  constexpr double Transmissibility = centi*Poise*stb/(day*psia);
309  constexpr double LiquidSurfaceVolume = stb;
310  constexpr double GasSurfaceVolume = 1000*cubic(feet);
311  constexpr double ReservoirVolume = stb;
312  constexpr double Area = square(feet);
313  constexpr double GeomVolume = cubic(feet);
314  constexpr double GasDissolutionFactor = GasSurfaceVolume/LiquidSurfaceVolume;
315  constexpr double OilDissolutionFactor = LiquidSurfaceVolume/GasSurfaceVolume;
316  constexpr double Density = pound/cubic(feet);
317  constexpr double Concentration = pound/stb;
318  constexpr double FoamDensity = pound/GasSurfaceVolume;
319  constexpr double Viscosity = centi*Poise;
320  constexpr double Timestep = day;
321  constexpr double SurfaceTension = dyne/(centi*meter);
322  constexpr double Energy = btu;
323  constexpr double Moles = kilo*pound*mol;
324  constexpr double PPM = ppm;
325  constexpr double Ymodule = giga*Pascal;
326  constexpr double ThermalConductivity = btu/(feet*day*degFahrenheit);
327  }
328 
329 
330  namespace Lab {
331  using namespace prefix;
332  using namespace unit;
333  constexpr double Pressure = atma;
334  constexpr double PressureDrop = atm;
335  constexpr double Temperature = degCelsius;
336  constexpr double TemperatureOffset = degCelsiusOffset;
337  constexpr double AbsoluteTemperature = degCelsius; // actually [K], but the these two are identical
338  constexpr double Length = centi*meter;
339  constexpr double Time = hour;
340  constexpr double RunTime = second;
341  constexpr double Mass = gram;
342  constexpr double Permeability = milli*darcy;
343  constexpr double Transmissibility = centi*Poise*cubic(centi*meter)/(hour*atm);
344  constexpr double LiquidSurfaceVolume = cubic(centi*meter);
345  constexpr double GasSurfaceVolume = cubic(centi*meter);
346  constexpr double ReservoirVolume = cubic(centi*meter);
347  constexpr double Area = square(centi*meter);
348  constexpr double GeomVolume = cubic(centi*meter);
349  constexpr double GasDissolutionFactor = GasSurfaceVolume/LiquidSurfaceVolume;
350  constexpr double OilDissolutionFactor = LiquidSurfaceVolume/GasSurfaceVolume;
351  constexpr double Density = gram/cubic(centi*meter);
352  constexpr double Concentration = gram/cubic(centi*meter);
353  constexpr double FoamDensity = gram/cubic(centi*meter);
354  constexpr double Viscosity = centi*Poise;
355  constexpr double Timestep = hour;
356  constexpr double SurfaceTension = dyne/(centi*meter);
357  constexpr double Energy = joule;
358  constexpr double Moles = mol;
359  constexpr double PPM = ppm;
360  constexpr double Ymodule = giga*Pascal;
361  constexpr double ThermalConductivity = joule/(centi*meter*hour*degCelsius);
362  }
363 
364 
365  namespace PVT_M {
366  using namespace prefix;
367  using namespace unit;
368  constexpr double Pressure = atma;
369  constexpr double PressureDrop = atm;
370  constexpr double Temperature = degCelsius;
371  constexpr double TemperatureOffset = degCelsiusOffset;
372  constexpr double AbsoluteTemperature = degCelsius; // actually [K], but the these two are identical
373  constexpr double Length = meter;
374  constexpr double Time = day;
375  constexpr double RunTime = second;
376  constexpr double Mass = kilogram;
377  constexpr double Permeability = milli*darcy;
378  constexpr double Transmissibility = centi*Poise*cubic(meter)/(day*atm);
379  constexpr double LiquidSurfaceVolume = cubic(meter);
380  constexpr double GasSurfaceVolume = cubic(meter);
381  constexpr double ReservoirVolume = cubic(meter);
382  constexpr double Area = square(meter);
383  constexpr double GeomVolume = cubic(meter);
384  constexpr double GasDissolutionFactor = GasSurfaceVolume/LiquidSurfaceVolume;
385  constexpr double OilDissolutionFactor = LiquidSurfaceVolume/GasSurfaceVolume;
386  constexpr double Density = kilogram/cubic(meter);
387  constexpr double Concentration = kilogram/cubic(meter);
388  constexpr double FoamDensity = kilogram/cubic(meter);
389  constexpr double Viscosity = centi*Poise;
390  constexpr double Timestep = day;
391  constexpr double SurfaceTension = dyne/(centi*meter);
392  constexpr double Energy = kilo*joule;
393  constexpr double Moles = kilo*mol;
394  constexpr double PPM = ppm;
395  constexpr double Ymodule = giga*Pascal;
396  constexpr double ThermalConductivity = kilo*joule/(meter*day*degCelsius);
397  }
398 }
399 
400 #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