ls1-MarDyn
ls1-MarDyn molecular dynamics code
xmlfileUnits.h
Go to the documentation of this file.
1
8#ifndef XMLFILEUNIT_H
9#define XMLFILEUNIT_H
10
11#include "xmlfile.h"
12
13#include <string>
14#include <map>
15#include <iostream>
16
17//+XMLfileUnits=================================================================
24class XMLfileUnits : public XMLfile
25{
26public:
27 static const char *const roottag;
28 static const char *const refunitstag;
29 static const char *const unitattributetag;
30
31 enum UnitType { Unknown_Unit=-1, No_Unit=0,
32 Length_Unit=1,
33 Mass_Unit=2,
34 Time_Unit=3,
35 ElectricCurrent_Unit=4,
36 ThermodynamicTemperature_Unit=5,
37 SubstanceAmount_Unit=6,
38 LuminousIntensity_Unit=7,
39 numUnitTypes
40 };
41 // definitions corresponding to enum UnitType in xmlfileUnits.cpp
42 static const short int unittypequantifiers[numUnitTypes][8]; // Q
43 static const char *const unittypesymbols[numUnitTypes]; // corresponding symbols
44 static const char *const unittypequalifiers[numUnitTypes]; // XML qualifiers
45
46 static const int numPrefixes=21;
47 static const char *const prefixsymbols[numPrefixes]; // corresponding symbols
48 static const short int prefixquantifiers[numPrefixes]; // corresponds to Q[0]
49
50//+XMLfileUnits::ValueUnit======================================================
52 {
53 public:
54 static std::size_t string_endswith(std::string str, const char* suffix); // util/helper function
55
58 ValueUnit(double value=0.)
59 { initialize(value); }
63 ValueUnit(double value, const std::string& symbol)
64 { initialize(value,symbol); }
65
70 : m_value(vu.m_value)
71 { for(int i=0;i<numUnitTypes;++i) m_Q[i]=vu.m_Q[i];}
72
78 { m_value=vu.m_value; for(int i=0;i<numUnitTypes;++i) m_Q[i]=vu.m_Q[i]; return *this; }
79
84 ValueUnit& operator =(const double d)
85 { m_value=d; for(int i=0;i<numUnitTypes;++i) m_Q[i]=0; return *this; }
86
90 ValueUnit operator /(const ValueUnit& vu) const;
91
92 double value() const
93 { return m_value; }
94
95 UnitType unittype() const;
96 std::string unittypesymbol() const;
97
98 bool iscompatible(const ValueUnit& vu) const
99 { return m_Q[1]==vu.m_Q[1]&&m_Q[2]==vu.m_Q[2]&&m_Q[3]==vu.m_Q[3]&&m_Q[4]==vu.m_Q[4]
100 &&m_Q[5]==vu.m_Q[5]&&m_Q[6]==vu.m_Q[6]&&m_Q[7]==vu.m_Q[7]; }
101 bool iscompatible(UnitType ut) const
102 { return ut==unittype(); }
103
104 ValueUnit normalized() const;
105
109 void print(std::ostream& ostrm=std::cout, bool simplify=true) const;
110
111 private:
112
113 void initialize(double value=0.);
114 void initialize(double value,const std::string& symbol);
115
116 double m_value; // value
117 short int m_Q[numUnitTypes]; // quantity exponents: 10^Q[0]*m^Q[1]*g^Q[2]*s^Q[3]*A^Q[4]*K^Q[5]*mol^Q[6]*cd^Q[7]
118 /* In contrast to the SI base units, gram ("g") instead of kilogram ("kg")
119 is used as base mass unit here!
120 This seems to be more consistent related to the handling of prefixes */
121 };
122//-XMLfileUnits::ValueUnit======================================================
123
124 XMLfileUnits(const std::string& filepath);
125
126 unsigned long getNodeValueUnit(const char* nodepath, ValueUnit& value) const;
127 unsigned long getNodeValueUnit(const std::string& nodepath, ValueUnit& value) const
128 { return getNodeValueUnit(nodepath.c_str(),value); }
129 unsigned long getNodeValueReduced(const char* nodepath, double& value, UnitType ut=Unknown_Unit) const;
130 unsigned long getNodeValueReduced(const std::string& nodepath, double& value, UnitType ut=Unknown_Unit) const
131 { return getNodeValueReduced(nodepath.c_str(),value,ut); }
132
133private:
134 ValueUnit m_refunits[numUnitTypes];
135};
136//-XMLfileUnits=================================================================
137
143inline std::ostream& operator << (std::ostream& ostrm, const XMLfileUnits::ValueUnit& vu)
144{
145 vu.print(ostrm,true);
146 return ostrm;
147}
148
149#endif
Definition: xmlfileUnits.h:52
ValueUnit(const ValueUnit &vu)
XMLfileUnits::ValueUnit copy constructor duplicate a ValueNode.
Definition: xmlfileUnits.h:69
ValueUnit operator/(const ValueUnit &vu) const
divide operator divide other ValueUnit
Definition: xmlfileUnits.cpp:106
void print(std::ostream &ostrm=std::cout, bool simplify=true) const
print data to stream print the node data
Definition: xmlfileUnits.cpp:164
ValueUnit & operator=(const ValueUnit &vu)
assignment operator copy/duplicate other ValueUnit content to ValueUnit
Definition: xmlfileUnits.h:77
ValueUnit(double value=0.)
XMLfileUnits::ValueUnit constructor.
Definition: xmlfileUnits.h:58
ValueUnit(double value, const std::string &symbol)
XMLfileUnits::ValueUnit constructor.
Definition: xmlfileUnits.h:63
XML file with unit attributes abstraction.
Definition: xmlfileUnits.h:25
XML file abstraction.
Definition: xmlfile.h:47
::xsd::cxx::tree::string< char, simple_type > string
C++ type corresponding to the string XML Schema built-in type.
Definition: vtk-punstructured.h:270
std::ostream & operator<<(std::ostream &ostrm, const XMLfileUnits::ValueUnit &vu)
write a ValueUnit to a stream write XML query data to an output stream
Definition: xmlfileUnits.h:143
XML input file.