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 constexpr const double mol = 1;
143 // --------------------------------------------------------------
144 // Derived units and conversions
145 // --------------------------------------------------------------
146
149 constexpr const double Newton = kilogram*meter / square(second); // == 1
150 constexpr const double dyne = 1e-5*Newton;
151 constexpr const double lbf = pound * gravity; // Pound-force
153
156 constexpr const double Pascal = Newton / square(meter); // == 1
157 constexpr const double barsa = 100000 * Pascal;
158 constexpr const double atm = 101325 * Pascal;
159 constexpr const double psia = lbf / square(inch);
161
168 constexpr const double degCelsius = 1.0; // scaling factor °C -> K
169 constexpr const double degCelsiusOffset = 273.15; // offset for the °C -> K conversion
170
171 constexpr const double degFahrenheit = 5.0/9.0; // factor to convert a difference in °F to a difference in K
172 constexpr const double degFahrenheitOffset = 459.67*degFahrenheit; // °F -> K offset (i.e. how many K is 0 °F?)
174
177 constexpr const double Pas = Pascal * second; // == 1
178 constexpr const double Poise = prefix::deci*Pas;
180
181 namespace perm_details {
182 constexpr const double p_grad = atm / (prefix::centi*meter);
183 constexpr const double area = square(prefix::centi*meter);
184 constexpr const double flux = cubic (prefix::centi*meter) / second;
185 constexpr const double velocity = flux / area;
186 constexpr const double visc = prefix::centi*Poise;
187 constexpr const double darcy = (velocity * visc) / p_grad;
188 // == 1e-7 [m^2] / 101325
189 // == 9.869232667160130e-13 [m^2]
190 }
200 constexpr const double darcy = perm_details::darcy;
202
206 namespace convert {
225 constexpr double from(const double q, const double unit)
226 {
227 return q * unit;
228 }
229
248 constexpr double to(const double q, const double unit)
249 {
250 return q / unit;
251 }
252 } // namespace convert
253 }
254
255 namespace Metric {
256 using namespace prefix;
257 using namespace unit;
258 constexpr const double Pressure = barsa;
259 constexpr const double Temperature = degCelsius;
260 constexpr const double TemperatureOffset = degCelsiusOffset;
261 constexpr const double AbsoluteTemperature = degCelsius; // actually [K], but the these two are identical
262 constexpr const double Length = meter;
263 constexpr const double Time = day;
264 constexpr const double RunTime = second;
265 constexpr const double Mass = kilogram;
266 constexpr const double Permeability = milli*darcy;
267 constexpr const double Transmissibility = centi*Poise*cubic(meter)/(day*barsa);
268 constexpr const double LiquidSurfaceVolume = cubic(meter);
269 constexpr const double GasSurfaceVolume = cubic(meter);
270 constexpr const double ReservoirVolume = cubic(meter);
271 constexpr const double GeomVolume = cubic(meter);
272 constexpr const double GasDissolutionFactor = GasSurfaceVolume/LiquidSurfaceVolume;
273 constexpr const double OilDissolutionFactor = LiquidSurfaceVolume/GasSurfaceVolume;
274 constexpr const double Density = kilogram/cubic(meter);
275 constexpr const double PolymerDensity = kilogram/cubic(meter);
276 constexpr const double FoamDensity = kilogram/cubic(meter);
277 constexpr const double FoamSurfactantConcentration = kilogram/cubic(meter);
278 constexpr const double Salinity = kilogram/cubic(meter);
279 constexpr const double Viscosity = centi*Poise;
280 constexpr const double Timestep = day;
281 constexpr const double SurfaceTension = dyne/(centi*meter);
282 constexpr const double Energy = kilo*joule;
283 constexpr const double Moles = kilo*mol;
284 }
285
286
287 namespace Field {
288 using namespace prefix;
289 using namespace unit;
290 constexpr const double Pressure = psia;
291 constexpr const double Temperature = degFahrenheit;
292 constexpr const double TemperatureOffset = degFahrenheitOffset;
293 constexpr const double AbsoluteTemperature = degFahrenheit; // actually [°R], but the these two are identical
294 constexpr const double Length = feet;
295 constexpr const double Time = day;
296 constexpr const double RunTime = second;
297 constexpr const double Mass = pound;
298 constexpr const double Permeability = milli*darcy;
299 constexpr const double Transmissibility = centi*Poise*stb/(day*psia);
300 constexpr const double LiquidSurfaceVolume = stb;
301 constexpr const double GasSurfaceVolume = 1000*cubic(feet);
302 constexpr const double ReservoirVolume = stb;
303 constexpr const double GeomVolume = cubic(feet);
304 constexpr const double GasDissolutionFactor = GasSurfaceVolume/LiquidSurfaceVolume;
305 constexpr const double OilDissolutionFactor = LiquidSurfaceVolume/GasSurfaceVolume;
306 constexpr const double Density = pound/cubic(feet);
307 constexpr const double PolymerDensity = pound/stb;
308 constexpr const double FoamDensity = pound/GasSurfaceVolume;
309 constexpr const double FoamSurfactantConcentration = pound/stb;
310 constexpr const double Salinity = pound/stb;
311 constexpr const double Viscosity = centi*Poise;
312 constexpr const double Timestep = day;
313 constexpr const double SurfaceTension = dyne/(centi*meter);
314 constexpr const double Energy = btu;
315 constexpr const double Moles = kilo*pound*mol;
316
317 }
318
319
320 namespace Lab {
321 using namespace prefix;
322 using namespace unit;
323 constexpr const double Pressure = atm;
324 constexpr const double Temperature = degCelsius;
325 constexpr const double TemperatureOffset = degCelsiusOffset;
326 constexpr const double AbsoluteTemperature = degCelsius; // actually [K], but the these two are identical
327 constexpr const double Length = centi*meter;
328 constexpr const double Time = hour;
329 constexpr const double RunTime = second;
330 constexpr const double Mass = gram;
331 constexpr const double Permeability = milli*darcy;
332 constexpr const double Transmissibility = centi*Poise*cubic(centi*meter)/(hour*atm);
333 constexpr const double LiquidSurfaceVolume = cubic(centi*meter);
334 constexpr const double GasSurfaceVolume = cubic(centi*meter);
335 constexpr const double ReservoirVolume = cubic(centi*meter);
336 constexpr const double GeomVolume = cubic(centi*meter);
337 constexpr const double GasDissolutionFactor = GasSurfaceVolume/LiquidSurfaceVolume;
338 constexpr const double OilDissolutionFactor = LiquidSurfaceVolume/GasSurfaceVolume;
339 constexpr const double Density = gram/cubic(centi*meter);
340 constexpr const double PolymerDensity = gram/cubic(centi*meter);
341 constexpr const double FoamDensity = gram/cubic(centi*meter);
342 constexpr const double FoamSurfactantConcentration = gram/cubic(centi*meter);
343 constexpr const double Salinity = gram/cubic(centi*meter);
344 constexpr const double Viscosity = centi*Poise;
345 constexpr const double Timestep = hour;
346 constexpr const double SurfaceTension = dyne/(centi*meter);
347 constexpr const double Energy = joule;
348 constexpr const double Moles = mol;
349
350 }
351
352
353 namespace PVT_M {
354 using namespace prefix;
355 using namespace unit;
356 constexpr const double Pressure = atm;
357 constexpr const double Temperature = degCelsius;
358 constexpr const double TemperatureOffset = degCelsiusOffset;
359 constexpr const double AbsoluteTemperature = degCelsius; // actually [K], but the these two are identical
360 constexpr const double Length = meter;
361 constexpr const double Time = day;
362 constexpr const double RunTime = second;
363 constexpr const double Mass = kilogram;
364 constexpr const double Permeability = milli*darcy;
365 constexpr const double Transmissibility = centi*Poise*cubic(meter)/(day*atm);
366 constexpr const double LiquidSurfaceVolume = cubic(meter);
367 constexpr const double GasSurfaceVolume = cubic(meter);
368 constexpr const double ReservoirVolume = cubic(meter);
369 constexpr const double GeomVolume = cubic(meter);
370 constexpr const double GasDissolutionFactor = GasSurfaceVolume/LiquidSurfaceVolume;
371 constexpr const double OilDissolutionFactor = LiquidSurfaceVolume/GasSurfaceVolume;
372 constexpr const double Density = kilogram/cubic(meter);
373 constexpr const double PolymerDensity = kilogram/cubic(meter);
374 constexpr const double FoamDensity = kilogram/cubic(meter);
375 constexpr const double FoamSurfactantConcentration = kilogram/cubic(meter);
376 constexpr const double Salinity = kilogram/cubic(meter);
377 constexpr const double Viscosity = centi*Poise;
378 constexpr const double Timestep = day;
379 constexpr const double SurfaceTension = dyne/(centi*meter);
380 constexpr const double Energy = kilo*joule;
381 constexpr const double Moles = kilo*mol;
382 }
383}
384
385#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:248
constexpr double from(const double q, const double unit)
Convert from external units of measurements to equivalent internal units of measurements.
Definition: Units.hpp:225
This class implements a small container which holds the transmissibility mulitpliers for all the face...
Definition: Exceptions.hpp:30