My Project
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 const double micro = 1.0e-6;
61  constexpr const double milli = 1.0e-3;
62  constexpr const double centi = 1.0e-2;
63  constexpr const double deci = 1.0e-1;
64  constexpr const double kilo = 1.0e3;
65  constexpr const double mega = 1.0e6;
66  constexpr const 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 const double meter = 1;
98  constexpr const double inch = 2.54 * prefix::centi*meter;
99  constexpr const double feet = 12 * inch;
101 
104  constexpr const double second = 1;
105  constexpr const double minute = 60 * second;
106  constexpr const double hour = 60 * minute;
107  constexpr const double day = 24 * hour;
108  constexpr const double year = 365 * day;
109  constexpr const double ecl_year = 365.25 * day;
111 
114  constexpr const double gallon = 231 * cubic(inch);
115  constexpr const double stb = 42 * gallon;
116  constexpr const double liter = 1 * cubic(prefix::deci*meter);
118 
121  constexpr const double kilogram = 1;
122  constexpr const double gram = 1.0e-3 * kilogram;
123  // http://en.wikipedia.org/wiki/Pound_(mass)#Avoirdupois_pound
124  constexpr const double pound = 0.45359237 * kilogram;
126 
129  constexpr const double joule = 1;
130  constexpr const double btu = 1054.3503*joule; // "british thermal units"
132 
133  // --------------------------------------------------------------
134  // Standardised constants
135  // --------------------------------------------------------------
136 
139  constexpr const double gravity = 9.80665 * meter/square(second);
141 
142  // --------------------------------------------------------------
143  // Derived units and conversions
144  // --------------------------------------------------------------
145 
148  constexpr const double Newton = kilogram*meter / square(second); // == 1
149  constexpr const double dyne = 1e-5*Newton;
150  constexpr const double lbf = pound * gravity; // Pound-force
152 
155  constexpr const double Pascal = Newton / square(meter); // == 1
156  constexpr const double barsa = 100000 * Pascal;
157  constexpr const double atm = 101325 * Pascal;
158  constexpr const double psia = lbf / square(inch);
160 
167  constexpr const double degCelsius = 1.0; // scaling factor °C -> K
168  constexpr const double degCelsiusOffset = 273.15; // offset for the °C -> K conversion
169 
170  constexpr const double degFahrenheit = 5.0/9.0; // factor to convert a difference in °F to a difference in K
171  constexpr const double degFahrenheitOffset = 459.67*degFahrenheit; // °F -> K offset (i.e. how many K is 0 °F?)
173 
176  constexpr const double Pas = Pascal * second; // == 1
177  constexpr const double Poise = prefix::deci*Pas;
179 
180  namespace perm_details {
181  constexpr const double p_grad = atm / (prefix::centi*meter);
182  constexpr const double area = square(prefix::centi*meter);
183  constexpr const double flux = cubic (prefix::centi*meter) / second;
184  constexpr const double velocity = flux / area;
185  constexpr const double visc = prefix::centi*Poise;
186  constexpr const double darcy = (velocity * visc) / p_grad;
187  // == 1e-7 [m^2] / 101325
188  // == 9.869232667160130e-13 [m^2]
189  }
199  constexpr const double darcy = perm_details::darcy;
201 
205  namespace convert {
224  constexpr double from(const double q, const double unit)
225  {
226  return q * unit;
227  }
228 
247  constexpr double to(const double q, const double unit)
248  {
249  return q / unit;
250  }
251  } // namespace convert
252  }
253 
254  namespace Metric {
255  using namespace prefix;
256  using namespace unit;
257  constexpr const double Pressure = barsa;
258  constexpr const double Temperature = degCelsius;
259  constexpr const double TemperatureOffset = degCelsiusOffset;
260  constexpr const double AbsoluteTemperature = degCelsius; // actually [K], but the these two are identical
261  constexpr const double Length = meter;
262  constexpr const double Time = day;
263  constexpr const double RunTime = second;
264  constexpr const double Mass = kilogram;
265  constexpr const double Permeability = milli*darcy;
266  constexpr const double Transmissibility = centi*Poise*cubic(meter)/(day*barsa);
267  constexpr const double LiquidSurfaceVolume = cubic(meter);
268  constexpr const double GasSurfaceVolume = cubic(meter);
269  constexpr const double ReservoirVolume = cubic(meter);
270  constexpr const double GeomVolume = cubic(meter);
271  constexpr const double GasDissolutionFactor = GasSurfaceVolume/LiquidSurfaceVolume;
272  constexpr const double OilDissolutionFactor = LiquidSurfaceVolume/GasSurfaceVolume;
273  constexpr const double Density = kilogram/cubic(meter);
274  constexpr const double PolymerDensity = kilogram/cubic(meter);
275  constexpr const double FoamDensity = kilogram/cubic(meter);
276  constexpr const double FoamSurfactantConcentration = kilogram/cubic(meter);
277  constexpr const double Salinity = kilogram/cubic(meter);
278  constexpr const double Viscosity = centi*Poise;
279  constexpr const double Timestep = day;
280  constexpr const double SurfaceTension = dyne/(centi*meter);
281  constexpr const double Energy = kilo*joule;
282  }
283 
284 
285  namespace Field {
286  using namespace prefix;
287  using namespace unit;
288  constexpr const double Pressure = psia;
289  constexpr const double Temperature = degFahrenheit;
290  constexpr const double TemperatureOffset = degFahrenheitOffset;
291  constexpr const double AbsoluteTemperature = degFahrenheit; // actually [°R], but the these two are identical
292  constexpr const double Length = feet;
293  constexpr const double Time = day;
294  constexpr const double RunTime = second;
295  constexpr const double Mass = pound;
296  constexpr const double Permeability = milli*darcy;
297  constexpr const double Transmissibility = centi*Poise*stb/(day*psia);
298  constexpr const double LiquidSurfaceVolume = stb;
299  constexpr const double GasSurfaceVolume = 1000*cubic(feet);
300  constexpr const double ReservoirVolume = stb;
301  constexpr const double GeomVolume = cubic(feet);
302  constexpr const double GasDissolutionFactor = GasSurfaceVolume/LiquidSurfaceVolume;
303  constexpr const double OilDissolutionFactor = LiquidSurfaceVolume/GasSurfaceVolume;
304  constexpr const double Density = pound/cubic(feet);
305  constexpr const double PolymerDensity = pound/stb;
306  constexpr const double FoamDensity = pound/GasSurfaceVolume;
307  constexpr const double FoamSurfactantConcentration = pound/stb;
308  constexpr const double Salinity = pound/stb;
309  constexpr const double Viscosity = centi*Poise;
310  constexpr const double Timestep = day;
311  constexpr const double SurfaceTension = dyne/(centi*meter);
312  constexpr const double Energy = btu;
313  }
314 
315 
316  namespace Lab {
317  using namespace prefix;
318  using namespace unit;
319  constexpr const double Pressure = atm;
320  constexpr const double Temperature = degCelsius;
321  constexpr const double TemperatureOffset = degCelsiusOffset;
322  constexpr const double AbsoluteTemperature = degCelsius; // actually [K], but the these two are identical
323  constexpr const double Length = centi*meter;
324  constexpr const double Time = hour;
325  constexpr const double RunTime = second;
326  constexpr const double Mass = gram;
327  constexpr const double Permeability = milli*darcy;
328  constexpr const double Transmissibility = centi*Poise*cubic(centi*meter)/(hour*atm);
329  constexpr const double LiquidSurfaceVolume = cubic(centi*meter);
330  constexpr const double GasSurfaceVolume = cubic(centi*meter);
331  constexpr const double ReservoirVolume = cubic(centi*meter);
332  constexpr const double GeomVolume = cubic(centi*meter);
333  constexpr const double GasDissolutionFactor = GasSurfaceVolume/LiquidSurfaceVolume;
334  constexpr const double OilDissolutionFactor = LiquidSurfaceVolume/GasSurfaceVolume;
335  constexpr const double Density = gram/cubic(centi*meter);
336  constexpr const double PolymerDensity = gram/cubic(centi*meter);
337  constexpr const double FoamDensity = gram/cubic(centi*meter);
338  constexpr const double FoamSurfactantConcentration = gram/cubic(centi*meter);
339  constexpr const double Salinity = gram/cubic(centi*meter);
340  constexpr const double Viscosity = centi*Poise;
341  constexpr const double Timestep = hour;
342  constexpr const double SurfaceTension = dyne/(centi*meter);
343  constexpr const double Energy = joule;
344  }
345 
346 
347  namespace PVT_M {
348  using namespace prefix;
349  using namespace unit;
350  constexpr const double Pressure = atm;
351  constexpr const double Temperature = degCelsius;
352  constexpr const double TemperatureOffset = degCelsiusOffset;
353  constexpr const double AbsoluteTemperature = degCelsius; // actually [K], but the these two are identical
354  constexpr const double Length = meter;
355  constexpr const double Time = day;
356  constexpr const double RunTime = second;
357  constexpr const double Mass = kilogram;
358  constexpr const double Permeability = milli*darcy;
359  constexpr const double Transmissibility = centi*Poise*cubic(meter)/(day*atm);
360  constexpr const double LiquidSurfaceVolume = cubic(meter);
361  constexpr const double GasSurfaceVolume = cubic(meter);
362  constexpr const double ReservoirVolume = cubic(meter);
363  constexpr const double GeomVolume = cubic(meter);
364  constexpr const double GasDissolutionFactor = GasSurfaceVolume/LiquidSurfaceVolume;
365  constexpr const double OilDissolutionFactor = LiquidSurfaceVolume/GasSurfaceVolume;
366  constexpr const double Density = kilogram/cubic(meter);
367  constexpr const double PolymerDensity = kilogram/cubic(meter);
368  constexpr const double FoamDensity = kilogram/cubic(meter);
369  constexpr const double FoamSurfactantConcentration = kilogram/cubic(meter);
370  constexpr const double Salinity = kilogram/cubic(meter);
371  constexpr const double Viscosity = centi*Poise;
372  constexpr const double Timestep = day;
373  constexpr const double SurfaceTension = dyne/(centi*meter);
374  constexpr const double Energy = kilo*joule;
375  }
376 }
377 
378 #endif // OPM_UNITS_HEADER
constexpr const double deci
Non-standard unit prefix [d].
Definition: Units.hpp:63
constexpr const double giga
Unit prefix [G].
Definition: Units.hpp:66
constexpr const double micro
Unit prefix [ ].
Definition: Units.hpp:60
constexpr const double kilo
Unit prefix [k].
Definition: Units.hpp:64
constexpr const double milli
Unit prefix [m].
Definition: Units.hpp:61
constexpr const double mega
Unit prefix [M].
Definition: Units.hpp:65
constexpr const double centi
Non-standard unit prefix [c].
Definition: Units.hpp:62
constexpr double to(const double q, const double unit)
Convert from internal units of measurements to equivalent external units of measurements.
Definition: Units.hpp:247
constexpr double from(const double q, const double unit)
Convert from external units of measurements to equivalent internal units of measurements.
Definition: Units.hpp:224
This class implements a small container which holds the transmissibility mulitpliers for all the face...
Definition: Exceptions.hpp:29