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
56namespace 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