KaliVeda
Toolkit for HIC analysis
KVUnits.h
1 #ifndef KVUNITS__H
2 #define KVUNITS__H
3 
4 #include <Rtypes.h>
5 
54 namespace kaliveda
55 {
56  namespace units
57  {
69  const long double cm = 1.0l;
70  const long double fm = 1.e-13l;
71  const long double um = 1.e-4l;
72  const long double mm = 1.e-1l;
73  const long double m = 1.e+2l;
75  const long double g = 1.0l;
76  const long double kg = 1.e+3l;
77  const long double mg = 1.e-3l;
78  const long double ug = 1.e-6l;
79  const long double MeVpc2 = 1.782662e-27l;
81  const long double torr = 1.0l;
82  const long double atm = 760.l;
83  const long double Pa = atm / 101325.l;
84  const long double mbar = 100.l * Pa;
86  const long double cc = 1.0l;
87  const long double litre = 1.e+3l;
88  const long double cl = 10.l * cc;
89  const long double ml = cc;
91  const long double MeV = 1.0l;
92  const long double GeV = 1.e+3l;
93  const long double keV = 1.e-3l;
94  const long double eV = 1.e-6l;
95  const long double Joule = 6.241509e+12l;
97  const long double fmpc = 1.0l;
98  const long double s = 2.997925e+23l;
100  const long double nucpfm3 = 1.0l;
101  const long double gpcm3 = 6.022141e-16; // 1./(KVNucleus::kAMU*KVUnits::MeVpc2/TMath::Power(KVUnits::fm,3.))
103  const long double MeVpkb = 1.0l;
104  const long double GK = 8.617331e-02;
105 
106  struct unit
107  {
108  std::string name;
109  long double multiplier=1.0l;// conversion factor compared to some reference unit
110 
111  operator long double() const { return multiplier; }
112  };
113  }
114 #define add_unit(name,base)\
115  struct name##_ : base\
116  {\
117  name##_() : base{#name,units::name} {}\
118  };\
119  const name##_ name = name##_()
120 
121  namespace energy_units
122  {
128  }
129  namespace length_units
130  {
137  }
138  namespace dimensioned_types
139  {
140  template<class Type, class BaseUnit, class DefaultUnit>
142  {
143  DefaultUnit default_units = DefaultUnit{};
145 
146  dimensioned_type(const Type& t) : default_units{}, val{t} {}
147  dimensioned_type(const Type& t, const BaseUnit& U)
148  : default_units{}, val{t*U.multiplier/default_units.multiplier}
149  {}
150  dimensioned_type() = default;
155  operator Type() const { return val; }
156  Type operator()() const { return val; }
157  template<class NewUnit>
158  Type in(const NewUnit& u) const { return val/u.multiplier; }
159  template<class NewUnit>
160  Type as(const NewUnit& u) const { return in(u); }
161  template<class NewUnit>
162  Type convert(const NewUnit& u) const { return in(u); }
163 
164  friend std::ostream& operator<< (std::ostream& os, const dimensioned_type& ar)
165  {
166  os << (Type)ar << " " << ar.default_units.name;
167  return os;
168  }
169  };
170  struct Energy : dimensioned_type<long double,
171  kaliveda::energy_units::energy_unit,
172  kaliveda::energy_units::MeV_>
173  {
175 
176  friend Energy operator+(const Energy& a, const Energy& b)
177  {
178  return a()+b();
179  }
180  friend Energy operator-(const Energy& a, const Energy& b)
181  {
182  return a()-b();
183  }
184  };
185 
186  Energy operator""_keV(long double);
187  Energy operator""_GeV(long double);
188  Energy operator""_eV(long double);
189  Energy operator""_MeV(long double);
190 
191  }
192 }
193 
194 namespace KVUnits = kaliveda::units;
195 
196 using namespace kaliveda::dimensioned_types;
197 
198 #endif
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t b
Type
add_unit(eV, energy_unit)
add_unit(cm, length_unit)
const long double MeVpkb
temperatures
Definition: KVUnits.h:103
const long double torr
pressures
Definition: KVUnits.h:81
const long double m
Definition: KVUnits.h:73
const long double atm
Definition: KVUnits.h:82
const long double MeVpc2
Definition: KVUnits.h:79
const long double litre
Definition: KVUnits.h:87
const long double eV
Definition: KVUnits.h:94
const long double keV
Definition: KVUnits.h:93
const long double mg
Definition: KVUnits.h:77
const long double cm
Definition: KVUnits.h:69
const long double GK
Definition: KVUnits.h:104
const long double fm
Definition: KVUnits.h:70
const long double cc
volumes
Definition: KVUnits.h:86
const long double GeV
Definition: KVUnits.h:92
const long double g
masses
Definition: KVUnits.h:75
const long double nucpfm3
densities
Definition: KVUnits.h:100
const long double mm
Definition: KVUnits.h:72
const long double Pa
Definition: KVUnits.h:83
const long double kg
Definition: KVUnits.h:76
const long double ml
Definition: KVUnits.h:89
const long double Joule
Definition: KVUnits.h:95
const long double cl
Definition: KVUnits.h:88
const long double MeV
energies
Definition: KVUnits.h:91
const long double fmpc
times
Definition: KVUnits.h:97
const long double s
Definition: KVUnits.h:98
const long double ug
Definition: KVUnits.h:78
const long double um
Definition: KVUnits.h:71
const long double mbar
Definition: KVUnits.h:84
const long double gpcm3
Definition: KVUnits.h:101
friend Energy operator-(const Energy &a, const Energy &b)
Definition: KVUnits.h:180
friend Energy operator+(const Energy &a, const Energy &b)
Definition: KVUnits.h:176
Type as(const NewUnit &u) const
Definition: KVUnits.h:160
dimensioned_type & operator=(const dimensioned_type &)=default
Type in(const NewUnit &u) const
Definition: KVUnits.h:158
dimensioned_type(dimensioned_type &&)=default
dimensioned_type(const Type &t, const BaseUnit &U)
Definition: KVUnits.h:147
dimensioned_type(const dimensioned_type &)=default
friend std::ostream & operator<<(std::ostream &os, const dimensioned_type &ar)
Definition: KVUnits.h:164
Type convert(const NewUnit &u) const
Definition: KVUnits.h:162
dimensioned_type & operator=(dimensioned_type &&)=default
long double multiplier
Definition: KVUnits.h:109
std::string name
Definition: KVUnits.h:108
TArc a