opm-common
Loading...
Searching...
No Matches
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 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
Conversion prefix for units.
Definition Units.hpp:59
constexpr double centi
Non-standard unit prefix [c].
Definition Units.hpp:62
constexpr double giga
Unit prefix [G].
Definition Units.hpp:66
constexpr double milli
Unit prefix [m].
Definition Units.hpp:61
constexpr double kilo
Unit prefix [k].
Definition Units.hpp:64
constexpr double deci
Non-standard unit prefix [d].
Definition Units.hpp:63
constexpr double mega
Unit prefix [M].
Definition Units.hpp:65
constexpr double micro
Unit prefix [ ].
Definition Units.hpp:60
Unit conversion routines.
Definition Units.hpp:211
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 from(const double q, const double unit)
Convert from external units of measurements to equivalent internal units of measurements.
Definition Units.hpp:230
Definition of various units.
Definition Units.hpp:84
This class implements a small container which holds the transmissibility mulitpliers for all the face...
Definition Exceptions.hpp:30