https://mooseframework.inl.gov
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 
17 class MooseUnits;
18 
19 // power function injected into std
20 namespace std
21 {
22 MooseUnits pow(const MooseUnits &, int);
23 }
24 
25 // output stream operator
26 std::ostream & operator<<(std::ostream & os, const MooseUnits & u);
27 
33 {
34  enum class BaseUnit
35  {
36  METER,
37  KILOGRAM,
38  SECOND,
39  AMPERE,
40  KELVIN,
41  COUNT,
42  CANDELA
43  };
44 
45 public:
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 
103 protected:
105  template <typename... Args>
106  void parseError(const std::string & unit_string, std::string::const_iterator it, Args... args);
107 
110 
113 
115  bool isBase(const MooseUnits::BaseUnit) const;
116 
118  std::vector<std::pair<BaseUnit, int>> _base;
119 
121  static int geti();
122 };
123 
124 template <typename... Args>
125 void
126 MooseUnits::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 }
bool isMass() const
Definition: Units.h:73
MooseUnits operator*(const Real f) const
Unit prefactor scaling.
Definition: Units.C:446
static const std::vector< std::pair< std::string, MooseUnits > > _unit_table
Definition: Units.h:67
friend std::ostream & operator<<(std::ostream &os, const MooseUnits &dt)
Definition: Units.C:569
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application...
Definition: MooseError.h:302
bool operator==(const MooseUnits &rhs) const
Definition: Units.C:479
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 isLength() const
query the nature of the unit
Definition: Units.h:71
std::basic_ostream< charT, traits > * os
Definition: InfixIterator.h:33
std::vector< std::pair< BaseUnit, int > > _base
base SI units and their exponents
Definition: Units.h:118
static const std::map< std::string, Real > _si_prefix
data tables with SI prefixes and known units
Definition: Units.h:66
bool isBase(const MooseUnits::BaseUnit) const
check if the unit has a pure base
Definition: Units.C:520
static int geti()
iosteam manipulator helper to toggle latex / text output
Definition: Units.C:562
MooseUnits(Real f, Real s, std::vector< std::pair< MooseUnits::BaseUnit, int >> b)
Definition: Units.h:48
MooseUnits operator/(const MooseUnits &rhs) const
Definition: Units.C:466
MooseUnits(Real f)
Definition: Units.h:47
bool isTemperature() const
Definition: Units.h:75
MooseUnits(const std::string &unit_string)
Definition: Units.C:207
bool isCurrent() const
Definition: Units.h:74
BaseUnit
Definition: Units.h:34
Physical unit management class with runtime unit string parsing, unit checking, unit conversion...
Definition: Units.h:32
bool conformsTo(const MooseUnits &) const
checks if the units are dimensionally conforming (i.e. the describe the same physical quanitity) ...
Definition: Units.C:214
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
Real _factor
conversion factor w.r.t. the base SI units
Definition: Units.h:109
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
std::ostream & operator<<(std::ostream &os, const MooseUnits &u)
Definition: Units.C:569
static std::ostream & text(std::ostream &os)
Definition: Units.C:555
Real _shift
additive shift (for Celsius and Fahrenheit)
Definition: Units.h:112
MooseUnits pow(const MooseUnits &, int)
Definition: Units.C:537
void parse(const std::string &unit_string)
parse a unit string into a MooseUnits object
Definition: Units.C:234
static std::ostream & latex(std::ostream &os)
iostream manipulators
Definition: Units.C:549
void simplify()
simplify into the canonical form that permits comparisons
Definition: Units.C:500