My Project
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 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 bars = 100000 * Pascal;
159 constexpr const double atma = 101325 * Pascal;
160 constexpr const double atm = 101325 * Pascal;
161 constexpr const double psia = lbf / square(inch);
162 constexpr const double psi = lbf / square(inch);
164
171 constexpr const double degCelsius = 1.0; // scaling factor °C -> K
172 constexpr const double degCelsiusOffset = 273.15; // offset for the °C -> K conversion
173
174 constexpr const double degFahrenheit = 5.0/9.0; // factor to convert a difference in °F to a difference in K
175 constexpr const double degFahrenheitOffset = 459.67*degFahrenheit; // °F -> K offset (i.e. how many K is 0 °F?)
177
180 constexpr const double Pas = Pascal * second; // == 1
181 constexpr const double Poise = prefix::deci*Pas;
183
184 constexpr const double ppm = 1. / prefix::mega;
185
186 namespace perm_details {
187 constexpr const double p_grad = atm / (prefix::centi*meter);
188 constexpr const double area = square(prefix::centi*meter);
189 constexpr const double flux = cubic (prefix::centi*meter) / second;
190 constexpr const double velocity = flux / area;
191 constexpr const double visc = prefix::centi*Poise;
192 constexpr const double darcy = (velocity * visc) / p_grad;
193 // == 1e-7 [m^2] / 101325
194 // == 9.869232667160130e-13 [m^2]
195 }
205 constexpr const 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 const double Pressure = barsa;
264 constexpr const double PressureDrop = bars;
265 constexpr const double Temperature = degCelsius;
266 constexpr const double TemperatureOffset = degCelsiusOffset;
267 constexpr const double AbsoluteTemperature = degCelsius; // actually [K], but the these two are identical
268 constexpr const double Length = meter;
269 constexpr const double Time = day;
270 constexpr const double RunTime = second;
271 constexpr const double Mass = kilogram;
272 constexpr const double Permeability = milli*darcy;
273 constexpr const double Transmissibility = centi*Poise*cubic(meter)/(day*barsa);
274 constexpr const double LiquidSurfaceVolume = cubic(meter);
275 constexpr const double GasSurfaceVolume = cubic(meter);
276 constexpr const double ReservoirVolume = cubic(meter);
277 constexpr const double Area = square(meter);
278 constexpr const double GeomVolume = cubic(meter);
279 constexpr const double GasDissolutionFactor = GasSurfaceVolume/LiquidSurfaceVolume;
280 constexpr const double OilDissolutionFactor = LiquidSurfaceVolume/GasSurfaceVolume;
281 constexpr const double Density = kilogram/cubic(meter);
282 constexpr const double PolymerDensity = kilogram/cubic(meter);
283 constexpr const double FoamDensity = kilogram/cubic(meter);
284 constexpr const double FoamSurfactantConcentration = kilogram/cubic(meter);
285 constexpr const double Salinity = kilogram/cubic(meter);
286 constexpr const double Viscosity = centi*Poise;
287 constexpr const double Timestep = day;
288 constexpr const double SurfaceTension = dyne/(centi*meter);
289 constexpr const double Energy = kilo*joule;
290 constexpr const double Moles = kilo*mol;
291 constexpr const double PPM = ppm;
292 constexpr const double Ymodule = giga*Pascal;
293 constexpr const double ThermalConductivity = kilo*joule/(meter*day*degCelsius);
294 }
295
296
297 namespace Field {
298 using namespace prefix;
299 using namespace unit;
300 constexpr const double Pressure = psia;
301 constexpr const double PressureDrop = psi;
302 constexpr const double Temperature = degFahrenheit;
303 constexpr const double TemperatureOffset = degFahrenheitOffset;
304 constexpr const double AbsoluteTemperature = degFahrenheit; // actually [°R], but the these two are identical
305 constexpr const double Length = feet;
306 constexpr const double Time = day;
307 constexpr const double RunTime = second;
308 constexpr const double Mass = pound;
309 constexpr const double Permeability = milli*darcy;
310 constexpr const double Transmissibility = centi*Poise*stb/(day*psia);
311 constexpr const double LiquidSurfaceVolume = stb;
312 constexpr const double GasSurfaceVolume = 1000*cubic(feet);
313 constexpr const double ReservoirVolume = stb;
314 constexpr const double Area = square(feet);
315 constexpr const double GeomVolume = cubic(feet);
316 constexpr const double GasDissolutionFactor = GasSurfaceVolume/LiquidSurfaceVolume;
317 constexpr const double OilDissolutionFactor = LiquidSurfaceVolume/GasSurfaceVolume;
318 constexpr const double Density = pound/cubic(feet);
319 constexpr const double PolymerDensity = pound/stb;
320 constexpr const double FoamDensity = pound/GasSurfaceVolume;
321 constexpr const double FoamSurfactantConcentration = pound/stb;
322 constexpr const double Salinity = pound/stb;
323 constexpr const double Viscosity = centi*Poise;
324 constexpr const double Timestep = day;
325 constexpr const double SurfaceTension = dyne/(centi*meter);
326 constexpr const double Energy = btu;
327 constexpr const double Moles = kilo*pound*mol;
328 constexpr const double PPM = ppm;
329 constexpr const double Ymodule = giga*Pascal;
330 constexpr const double ThermalConductivity = btu/(feet*day*degFahrenheit);
331 }
332
333
334 namespace Lab {
335 using namespace prefix;
336 using namespace unit;
337 constexpr const double Pressure = atma;
338 constexpr const double PressureDrop = atm;
339 constexpr const double Temperature = degCelsius;
340 constexpr const double TemperatureOffset = degCelsiusOffset;
341 constexpr const double AbsoluteTemperature = degCelsius; // actually [K], but the these two are identical
342 constexpr const double Length = centi*meter;
343 constexpr const double Time = hour;
344 constexpr const double RunTime = second;
345 constexpr const double Mass = gram;
346 constexpr const double Permeability = milli*darcy;
347 constexpr const double Transmissibility = centi*Poise*cubic(centi*meter)/(hour*atm);
348 constexpr const double LiquidSurfaceVolume = cubic(centi*meter);
349 constexpr const double GasSurfaceVolume = cubic(centi*meter);
350 constexpr const double ReservoirVolume = cubic(centi*meter);
351 constexpr const double Area = square(centi*meter);
352 constexpr const double GeomVolume = cubic(centi*meter);
353 constexpr const double GasDissolutionFactor = GasSurfaceVolume/LiquidSurfaceVolume;
354 constexpr const double OilDissolutionFactor = LiquidSurfaceVolume/GasSurfaceVolume;
355 constexpr const double Density = gram/cubic(centi*meter);
356 constexpr const double PolymerDensity = gram/cubic(centi*meter);
357 constexpr const double FoamDensity = gram/cubic(centi*meter);
358 constexpr const double FoamSurfactantConcentration = gram/cubic(centi*meter);
359 constexpr const double Salinity = gram/cubic(centi*meter);
360 constexpr const double Viscosity = centi*Poise;
361 constexpr const double Timestep = hour;
362 constexpr const double SurfaceTension = dyne/(centi*meter);
363 constexpr const double Energy = joule;
364 constexpr const double Moles = mol;
365 constexpr const double PPM = ppm;
366 constexpr const double Ymodule = giga*Pascal;
367 constexpr const double ThermalConductivity = joule/(centi*meter*hour*degCelsius);
368 }
369
370
371 namespace PVT_M {
372 using namespace prefix;
373 using namespace unit;
374 constexpr const double Pressure = atma;
375 constexpr const double PressureDrop = atm;
376 constexpr const double Temperature = degCelsius;
377 constexpr const double TemperatureOffset = degCelsiusOffset;
378 constexpr const double AbsoluteTemperature = degCelsius; // actually [K], but the these two are identical
379 constexpr const double Length = meter;
380 constexpr const double Time = day;
381 constexpr const double RunTime = second;
382 constexpr const double Mass = kilogram;
383 constexpr const double Permeability = milli*darcy;
384 constexpr const double Transmissibility = centi*Poise*cubic(meter)/(day*atm);
385 constexpr const double LiquidSurfaceVolume = cubic(meter);
386 constexpr const double GasSurfaceVolume = cubic(meter);
387 constexpr const double ReservoirVolume = cubic(meter);
388 constexpr const double Area = square(meter);
389 constexpr const double GeomVolume = cubic(meter);
390 constexpr const double GasDissolutionFactor = GasSurfaceVolume/LiquidSurfaceVolume;
391 constexpr const double OilDissolutionFactor = LiquidSurfaceVolume/GasSurfaceVolume;
392 constexpr const double Density = kilogram/cubic(meter);
393 constexpr const double PolymerDensity = kilogram/cubic(meter);
394 constexpr const double FoamDensity = kilogram/cubic(meter);
395 constexpr const double FoamSurfactantConcentration = kilogram/cubic(meter);
396 constexpr const double Salinity = kilogram/cubic(meter);
397 constexpr const double Viscosity = centi*Poise;
398 constexpr const double Timestep = day;
399 constexpr const double SurfaceTension = dyne/(centi*meter);
400 constexpr const double Energy = kilo*joule;
401 constexpr const double Moles = kilo*mol;
402 constexpr const double PPM = ppm;
403 constexpr const double Ymodule = giga*Pascal;
404 constexpr const double ThermalConductivity = kilo*joule/(meter*day*degCelsius);
405 }
406}
407
408#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: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
This class implements a small container which holds the transmissibility mulitpliers for all the face...
Definition Exceptions.hpp:30