https://mooseframework.inl.gov
Loading...
Searching...
No Matches
Units.h
Go to the documentation of this file.
1//* This file is part of the MOOSE framework
2//* https://mooseframework.inl.gov
3//*
4//* All rights reserved, see COPYRIGHT for full restrictions
5//* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6//*
7//* Licensed under LGPL 2.1, please see LICENSE for details
8//* https://www.gnu.org/licenses/lgpl-2.1.html
9
10#pragma once
11
12#include "MooseTypes.h"
13#include "MooseError.h"
14#include <vector>
15#include <iostream>
16
18
19// power function injected into std
20namespace std
21{
23}
24
25// output stream operator
26std::ostream & operator<<(std::ostream & os, const MooseUnits & u);
27
33{
34 enum class BaseUnit
35 {
36 METER,
38 SECOND,
39 AMPERE,
40 KELVIN,
41 COUNT,
43 };
44
45public:
46 MooseUnits(const std::string & unit_string);
47 MooseUnits(Real f) : _factor(f), _shift(), _base() {}
48 MooseUnits(Real f, Real s, std::vector<std::pair<MooseUnits::BaseUnit, int>> b)
49 : _factor(f), _shift(s), _base(b)
50 {
51 }
52
54 bool conformsTo(const MooseUnits &) const;
55
57 Real convert(Real from_value, const MooseUnits & from_unit) const;
58
60 void parse(const std::string & unit_string);
61
63 void simplify();
64
66 static const std::map<std::string, Real> _si_prefix;
67 static const std::vector<std::pair<std::string, MooseUnits>> _unit_table;
69
71 bool isLength() const { return isBase(BaseUnit::METER); }
72 bool isTime() const { return isBase(BaseUnit::SECOND); }
73 bool isMass() const { return isBase(BaseUnit::KILOGRAM); }
74 bool isCurrent() const { return isBase(BaseUnit::AMPERE); }
75 bool isTemperature() const { return isBase(BaseUnit::KELVIN); }
77
79 MooseUnits operator*(const Real f) const;
80
85 MooseUnits operator*(const MooseUnits & rhs) const;
86 MooseUnits operator/(const MooseUnits & rhs) const;
88
89 bool operator==(const MooseUnits & rhs) const;
90 bool operator==(const Real rhs) const;
91
93 explicit operator Real() const;
94
95 friend std::ostream & operator<<(std::ostream & os, const MooseUnits & dt);
96 friend MooseUnits std::pow(const MooseUnits &, int);
97
99 static std::ostream & latex(std::ostream & os);
100 static std::ostream & text(std::ostream & os);
102
103protected:
105 template <typename... Args>
106 void parseError(const std::string & unit_string, std::string::const_iterator it, Args... args);
107
110
112 Real _shift;
113
115 bool isBase(const MooseUnits::BaseUnit) const;
116
118 std::vector<std::pair<BaseUnit, int>> _base;
119
121 static int geti();
122};
123
124template <typename... Args>
125void
126MooseUnits::parseError(const std::string & unit_string,
127 std::string::const_iterator it,
128 Args... args)
129{
130 auto d = std::distance(unit_string.begin(), it);
131 mooseError("At position ", d, " in ", unit_string, ": ", std::forward<Args>(args)...);
132}
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application.
Definition MooseError.h:311
std::ostream & operator<<(std::ostream &os, const MooseUnits &u)
Definition Units.C:569
Physical unit management class with runtime unit string parsing, unit checking, unit conversion,...
Definition Units.h:33
void parseError(const std::string &unit_string, std::string::const_iterator it, Args... args)
helper function to generate a pretty mooseError
Definition Units.h:126
bool isBase(const MooseUnits::BaseUnit) const
check if the unit has a pure base
Definition Units.C:520
MooseUnits(Real f, Real s, std::vector< std::pair< MooseUnits::BaseUnit, int > > b)
Definition Units.h:48
static int geti()
iosteam manipulator helper to toggle latex / text output
Definition Units.C:562
bool isCurrent() const
Definition Units.h:74
MooseUnits operator/(const MooseUnits &rhs) const
Definition Units.C:466
friend std::ostream & operator<<(std::ostream &os, const MooseUnits &dt)
Definition Units.C:569
bool isTemperature() const
Definition Units.h:75
bool isLength() const
query the nature of the unit
Definition Units.h:71
std::vector< std::pair< BaseUnit, int > > _base
base SI units and their exponents
Definition Units.h:118
Real convert(Real from_value, const MooseUnits &from_unit) const
Converts from_value in units of from_units to value this units.
Definition Units.C:226
bool isTime() const
Definition Units.h:72
Real _factor
conversion factor w.r.t. the base SI units
Definition Units.h:109
void parse(const std::string &unit_string)
parse a unit string into a MooseUnits object
Definition Units.C:234
bool conformsTo(const MooseUnits &) const
checks if the units are dimensionally conforming (i.e. the describe the same physical quanitity)
Definition Units.C:214
Real _shift
additive shift (for Celsius and Fahrenheit)
Definition Units.h:112
static const std::vector< std::pair< std::string, MooseUnits > > _unit_table
Definition Units.h:22
MooseUnits operator*(const Real f) const
Unit prefactor scaling.
Definition Units.C:446
bool operator==(const MooseUnits &rhs) const
Definition Units.C:479
static std::ostream & latex(std::ostream &os)
iostream manipulators
Definition Units.C:549
MooseUnits(Real f)
Definition Units.h:47
static const std::map< std::string, Real > _si_prefix
data tables with SI prefixes and known units
Definition Units.h:17
void simplify()
simplify into the canonical form that permits comparisons
Definition Units.C:500
bool isMass() const
Definition Units.h:73
static std::ostream & text(std::ostream &os)
Definition Units.C:555
MooseUnits pow(const MooseUnits &, int)
Definition Units.C:537