FEDEM Solver  R8.0
Source code of the dynamics solver
FFaUnitCalculator.H
Go to the documentation of this file.
1 // SPDX-FileCopyrightText: 2023 SAP SE
2 //
3 // SPDX-License-Identifier: Apache-2.0
4 //
5 // This file is part of FEDEM - https://openfedem.org
7 
13 #ifndef FFA_UNIT_CALCULATOR_H
14 #define FFA_UNIT_CALCULATOR_H
15 
16 #include <string>
17 #include <vector>
18 #include <map>
19 
21 
22 
28 {
30  struct SingleUnit
31  {
32  double factor = 1.0;
33  std::string origUnit;
34  std::string convUnit;
35  };
36 
38  using SingleUnitMap = std::map<std::string,SingleUnit>;
40  using SingleUnitIter = SingleUnitMap::const_iterator;
41 
42 public:
44  explicit FFaUnitCalculator(const char* n = NULL)
45  : name(n ? n : ""), origGroup("SI"), convGroup("SI") {}
46 
48  bool isValid() const { return !name.empty(); }
49 
51  bool operator==(const FFaUnitCalculator& cal) const;
52 
54  const std::string& getName() const { return name; }
56  const std::string& getOrigUnits() const { return origGroup; }
58  const std::string& getConvUnits() const { return convGroup; }
59 
61  template <class T> bool convert(T& value, const std::string& aName) const
62  {
63  SingleUnitIter it = myConvFactors.find(aName);
64  if (it == myConvFactors.end()) return false;
65 
66  value *= it->second.factor;
67  return true;
68  }
69 
71  bool convert(double& value, const std::string& aName, int prec) const;
72 
74  template <class T> bool inverse(T& value, const std::string& aName) const
75  {
76  SingleUnitIter it = myConvFactors.find(aName);
77  if (it == myConvFactors.end()) return false;
78 
79  value /= it->second.factor;
80  return true;
81  }
82 
84  double convFactor(const std::string& aName) const
85  {
86  SingleUnitIter it = myConvFactors.find(aName);
87  return it == myConvFactors.end() ? 0.0 : it->second.factor;
88  }
89 
91  std::string origUnitName(const std::string& aName) const
92  {
93  SingleUnitIter it = myConvFactors.find(aName);
94  return it == myConvFactors.end() ? std::string("") : it->second.origUnit;
95  }
96 
98  std::string convUnitName(const std::string& aName) const
99  {
100  SingleUnitIter it = myConvFactors.find(aName);
101  return it == myConvFactors.end() ? std::string("") : it->second.convUnit;
102  }
103 
109  void addConversion(const std::string& propName, double sf,
110  const std::string& origUnit = "",
111  const std::string& convUnit = "");
112 
113 private:
114  std::string name;
115  std::string origGroup;
116  std::string convGroup;
118 
120  friend std::ostream& operator<< (std::ostream&, const FFaUnitCalculator&);
122  friend std::istream& operator>> (std::istream&, FFaUnitCalculator&);
123 };
124 
125 
130 class FFaUnitCalculatorProvider : public FFaSingelton<FFaUnitCalculatorProvider>
131 {
136 
139 
140 public:
142  const FFaUnitCalculator* getCalculator(const std::string& calcName) const;
144  std::vector<const FFaUnitCalculator*> getCalculators() const;
145 
147  void getCalculatorNames(std::vector<std::string>& definedCalcs) const;
148 
150  void addCalculator(const FFaUnitCalculator& c) { myCalcs[c.getName()] = c; }
151 
153  bool readCalculatorDefs(const std::string& filename);
155  bool printCalculatorDefs(const std::string& filename) const;
156 
157 private:
158  std::map<std::string,FFaUnitCalculator> myCalcs;
159 };
160 
161 #endif
Template for singleton classes.
Template for singleton classes.
Definition: FFaSingelton.H:26
Singelton class holding all unit calculators.
Definition: FFaUnitCalculator.H:131
FFaUnitCalculatorProvider()
The constructor is private to allow singelton construction only.
Definition: FFaUnitCalculator.H:133
virtual ~FFaUnitCalculatorProvider()
The destructor is private to allow singelton destruction only.
Definition: FFaUnitCalculator.H:135
void addCalculator(const FFaUnitCalculator &c)
Adds a new unit calculator to the container.
Definition: FFaUnitCalculator.H:150
std::map< std::string, FFaUnitCalculator > myCalcs
Calculator container.
Definition: FFaUnitCalculator.H:158
bool readCalculatorDefs(const std::string &filename)
Reads/writes calculator data from file.
Definition: FFaUnitCalculator.C:177
bool printCalculatorDefs(const std::string &filename) const
Writes calculator data to file.
Definition: FFaUnitCalculator.C:216
void getCalculatorNames(std::vector< std::string > &definedCalcs) const
Gets a list of names for all unit calculators.
Definition: FFaUnitCalculator.C:169
std::vector< const FFaUnitCalculator * > getCalculators() const
Returns a list of all unit calculators.
Definition: FFaUnitCalculator.C:158
const FFaUnitCalculator * getCalculator(const std::string &calcName) const
Returns a named unit calculator.
Definition: FFaUnitCalculator.C:142
Class holding a set of unit conversions for physical properties.
Definition: FFaUnitCalculator.H:28
bool inverse(T &value, const std::string &aName) const
Reversed conversion for a named physical property.
Definition: FFaUnitCalculator.H:74
std::string origGroup
Name of the original unit set.
Definition: FFaUnitCalculator.H:115
const std::string & getConvUnits() const
Returns the name of the converted-to unit set.
Definition: FFaUnitCalculator.H:58
bool operator==(const FFaUnitCalculator &cal) const
Equality operator.
Definition: FFaUnitCalculator.C:21
SingleUnitMap::const_iterator SingleUnitIter
Convenience type alias.
Definition: FFaUnitCalculator.H:40
std::string convUnitName(const std::string &aName) const
Returns the converted-to unit name for a named physical property.
Definition: FFaUnitCalculator.H:98
bool convert(T &value, const std::string &aName) const
Converts a named physical property.
Definition: FFaUnitCalculator.H:61
std::map< std::string, SingleUnit > SingleUnitMap
Convenience type alias.
Definition: FFaUnitCalculator.H:38
SingleUnitMap myConvFactors
Unit converter container.
Definition: FFaUnitCalculator.H:117
const std::string & getName() const
Returns the name of the unit calculator.
Definition: FFaUnitCalculator.H:54
std::string origUnitName(const std::string &aName) const
Returns the original unit name for a named physical property.
Definition: FFaUnitCalculator.H:91
std::string convGroup
Name of the converted-to unit set.
Definition: FFaUnitCalculator.H:116
bool isValid() const
Returns true if *this is valid, i.e., name is defined.
Definition: FFaUnitCalculator.H:48
FFaUnitCalculator(const char *n=NULL)
Default constructor.
Definition: FFaUnitCalculator.H:44
friend std::ostream & operator<<(std::ostream &, const FFaUnitCalculator &)
Global printing operator.
double convFactor(const std::string &aName) const
Returns the conversion factor for a named physical property.
Definition: FFaUnitCalculator.H:84
const std::string & getOrigUnits() const
Returns the name of the original unit set.
Definition: FFaUnitCalculator.H:56
void addConversion(const std::string &propName, double sf, const std::string &origUnit="", const std::string &convUnit="")
Adds a unit conversion to the set of conversion rules.
Definition: FFaUnitCalculator.C:62
std::string name
Name of the unit calculator.
Definition: FFaUnitCalculator.H:114
friend std::istream & operator>>(std::istream &, FFaUnitCalculator &)
Global reading operator.
character(lfnam_p) filename
Name of function data file.
Definition: initiateFunctionTypeModule.f90:34
real(dp), dimension(:,:), allocatable c
Definition: inverseModule.f90:39
Struct representing a single unit conversion.
Definition: FFaUnitCalculator.H:31
std::string origUnit
Original unit name.
Definition: FFaUnitCalculator.H:33
double factor
Unit conversion factor.
Definition: FFaUnitCalculator.H:32
std::string convUnit
Converted-to name.
Definition: FFaUnitCalculator.H:34