mbsim 4.0.0 MBSim Kernel

element.h
1 /* Copyright (C) 2004-2014 MBSim Development Team
2 *
3 * This library is free software; you can redistribute it and/or
4 * modify it under the terms of the GNU Lesser General Public
5 * License as published by the Free Software Foundation; either
6 * version 2.1 of the License, or (at your option) any later version.
7 *
8 * This library is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 * Lesser General Public License for more details.
12 *
13 * You should have received a copy of the GNU Lesser General Public
14 * License along with this library; if not, write to the Free Software
15 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16 *
17 * Contact: martin.o.foerg@googlemail.com
18 */
19
20 #ifndef _ELEMENT_H_
21 #define _ELEMENT_H_
22
23 #include "fmatvec/fmatvec.h"
24 #include "fmatvec/atom.h"
25 #include "mbsim/objectfactory.h"
26 #include "mbsim/utils/plotfeatureenum.h"
27 #include "mbsim/utils/initconfigenum.h"
28 #include "mbsim/namespace.h"
29 #include "mbsim/mbsim_event.h"
30 #include <hdf5serie/vectorserie.h>
31
32 namespace OpenMBV {
33 class Group;
34 }
35
36 namespace H5 {
37 class Group;
38 }
39
43 namespace MBSim {
44
45 extern const PlotFeatureEnum plotRecursive, openMBV, debug;
46
47 class DynamicSystemSolver;
48 class Frame;
49
56 class Element : virtual public fmatvec::Atom {
57 public:
62 enum InitStage {
63 resolveStringRef=0,
64 preInit,
65 plotting,
66 unknownStage,
67 LASTINITSTAGE
68 };
69
73 Element(const std::string &name);
74
78 ~Element() override = default;
79
80 #ifndef SWIG
81 [[noreturn]]
82 #endif
83 void throwError(const std::string &msg) const {
84 throw MBSimError(this, msg);
85 }
86
91 virtual void setDynamicSystemSolver(DynamicSystemSolver *sys) { ds = sys; }
92
98 virtual void plot();
99
105 virtual void plotAtSpecialEvent() { }
106
110 const std::string& getName() const { return name; }
111
115 void setName(const std::string &str) { name = str; }
116
117 // internal function do not use
118 void setPath(const std::string &str) { path=str; }
119
123 DynamicSystemSolver* getDynamicSystemSolver() { return ds; }
124
129 virtual void init(InitStage stage, const InitConfigSet &config);
130
134 virtual void createPlotGroup();
135
139 H5::GroupBase *getPlotGroup() { return plotGroup; }
140 virtual H5::GroupBase *getFramesPlotGroup() { return nullptr; }
141 virtual H5::GroupBase *getContoursPlotGroup() { return nullptr; }
142 virtual H5::GroupBase *getGroupsPlotGroup() { return nullptr; }
143 virtual H5::GroupBase *getObjectsPlotGroup() { return nullptr; }
144 virtual H5::GroupBase *getLinksPlotGroup() { return nullptr; }
145 virtual H5::GroupBase *getConstraintsPlotGroup() { return nullptr; }
146 virtual H5::GroupBase *getObserversPlotGroup() { return nullptr; }
147
150 bool getPlotFeature(const PlotFeatureEnum &pf) {
151 auto it=plotFeature.find(std::ref(pf));
152 if(it==plotFeature.end())
153 return false;
154 return it->second;
155 }
156
162 virtual void setPlotFeature(const PlotFeatureEnum &pf, bool value);
163
169 void setPlotFeatureForChildren(const PlotFeatureEnum &pf, bool value);
170
176 void setPlotFeatureRecursive(const PlotFeatureEnum &pf, bool value) { setPlotFeature(pf,value); setPlotFeatureForChildren(pf,value); }
177
181 template<class T>
182 void setPlotAttribute(const std::string &name, const T &value) {
183 plotAttribute[name] = value;
184 }
185 void setPlotAttribute(const std::string &name) {
186 plotAttribute[name] = std::monostate();
187 }
188
189 virtual void initializeUsingXML(xercesc::DOMElement *element);
190
195 template<class T> T* getByPath(const std::string &path, bool initialCaller=true) const;
196
202 std::string getPath(const Element *relTo=nullptr, std::string sep="/") const;
203
207 virtual Element* getChildByContainerAndName(const std::string &container, const std::string &name) const {
208 throwError("This element has no containers with childs.");
209 }
210
211 virtual std::shared_ptr<OpenMBV::Group> getOpenMBVGrp() { return std::shared_ptr<OpenMBV::Group>(); }
212 virtual std::shared_ptr<OpenMBV::Group> getFramesOpenMBVGrp() { return std::shared_ptr<OpenMBV::Group>(); }
213 virtual std::shared_ptr<OpenMBV::Group> getContoursOpenMBVGrp() { return std::shared_ptr<OpenMBV::Group>(); }
214 virtual std::shared_ptr<OpenMBV::Group> getGroupsOpenMBVGrp() { return std::shared_ptr<OpenMBV::Group>(); }
215 virtual std::shared_ptr<OpenMBV::Group> getObjectsOpenMBVGrp() { return std::shared_ptr<OpenMBV::Group>(); }
216 virtual std::shared_ptr<OpenMBV::Group> getLinksOpenMBVGrp() { return std::shared_ptr<OpenMBV::Group>(); }
217 virtual std::shared_ptr<OpenMBV::Group> getConstraintsOpenMBVGrp() { return std::shared_ptr<OpenMBV::Group>(); }
218 virtual std::shared_ptr<OpenMBV::Group> getObserversOpenMBVGrp() { return std::shared_ptr<OpenMBV::Group>(); }
219
220 virtual Element* getParent() {return parent;}
221 virtual const Element* getParent() const {return parent;}
222 virtual void setParent(Element* parent_) {parent = parent_;}
223
228 std::vector<Element*> getDependencies() const { return dependency; }
229
230 void addDependency(Element* ele) { if(ele) dependency.push_back(ele); }
231
237 int computeLevel();
238
239 virtual void updatePositions(Frame *frame) { }
240 virtual void updateVelocities(Frame *frame) { }
241 virtual void updateAccelerations(Frame *frame) { }
242 virtual void updateJacobians(Frame *frame, int j=0) { }
243 virtual void updateGyroscopicAccelerations(Frame *frame) { }
244
245 virtual void resetUpToDate() { }
246
247 const double& getTime() const;
248 double getStepSize() const;
249
250 #ifndef SWIG
251 const MBXMLUtils::DOMEvalException& getDOMEvalError() const { return domEvalError; };
252 #endif
253
254 protected:
255 Element *parent;
256
260 std::string name;
261
267 std::string path;
268
269 #ifndef SWIG
270 MBXMLUtils::DOMEvalException domEvalError;
272 #endif
273
277 DynamicSystemSolver *ds;
278
282 H5::VectorSerie<double> *plotVectorSerie;
283
287 std::vector<double> plotVector;
288
292 std::vector<std::string> plotColumns;
293
297 H5::GroupBase *plotGroup;
298
299 void updatePlotFeatures();
300
304 std::vector<Element*> dependency;
305
309 PlotFeatureMap plotFeature, plotFeatureForChildren;
310
311 std::map<std::string, std::variant<
312 std::monostate,
313 int,
314 double,
315 std::string,
316 std::vector<int>,
317 std::vector<double>,
318 std::vector<std::vector<double>>
319 >> plotAttribute;
320
321 void addToPlot(const std::string &name);
322 void addToPlot(const std::string &name, int size);
323 void addToPlot(const std::string &name, const std::vector<std::string> &iname);
324
325 template<class AT> void plot(const AT &x) {
326 plotVector.push_back(x);
327 }
328 template<class Type, class AT> void plot(const fmatvec::Vector<Type,AT> &x) {
329 for(int i=0; i<x.size(); i++)
330 plotVector.push_back(x(i));
331 }
332 private:
333 Element* getByPathElement(const std::string &path, bool initialCaller=true) const;
334 };
335
336 template<class T>
337 T* Element::getByPath(const std::string &path, bool initialCaller) const {
338 Element *e = getByPathElement(path, initialCaller);
339 auto *t=dynamic_cast<T*>(e);
340 if(t)
341 return t;
342 else
343 throwError(std::string("Cannot cast this element to type ")+typeid(T).name()+".");
344 }
345
346 }
347
348 #endif
MBSim::Element::createPlotGroup
virtual void createPlotGroup()
creates the plotGroup for H5-output
Definition: element.cc:147
MBSim::Element::getDependencies
std::vector< Element * > getDependencies() const
checks dependency on other elements.
Definition: element.h:228
MBSim::Element::plot
virtual void plot()
plots time dependent data
Definition: element.cc:80
MBSim::Element::setPlotFeature
virtual void setPlotFeature(const PlotFeatureEnum &pf, bool value)
Set a plot feature.
Definition: element.cc:243
MBSim::Element::getPlotFeature
bool getPlotFeature(const PlotFeatureEnum &pf)
Definition: element.h:150
MBSim::Element::init
virtual void init(InitStage stage, const InitConfigSet &config)
plots time series header
Definition: element.cc:91
MBSim::Element::getDynamicSystemSolver
DynamicSystemSolver * getDynamicSystemSolver()
Definition: element.h:123
MBSim::DynamicSystemSolver
solver interface for modelling and simulation of dynamic systems
Definition: dynamic_system_solver.h:61
MBSim::Element::resolveStringRef
Definition: element.h:63
MBSim::Element::setPlotAttribute
void setPlotAttribute(const std::string &name, const T &value)
Set a plot attribute: static data attached as key/value pairs to the plot datasets/groups.
Definition: element.h:182
MBSim::Element::dependency
std::vector< Element * > dependency
vector containing all dependencies.
Definition: element.h:304
MBSim::Element::plotAtSpecialEvent
virtual void plotAtSpecialEvent()
plots time dependent data at special events
Definition: element.h:105
MBSim::Element::plotFeature
PlotFeatureMap plotFeature
plot feature
Definition: element.h:309
MBSim::Element::plotVectorSerie
H5::VectorSerie< double > * plotVectorSerie
time series
Definition: element.h:282
MBSim::Element::setPlotFeatureRecursive
void setPlotFeatureRecursive(const PlotFeatureEnum &pf, bool value)
Set a plot feature for this object and the children of this object.
Definition: element.h:176
MBSim::Element
basic class of MBSim mainly for plotting
Definition: element.h:56
MBSim::Element::path
std::string path
The path of this object. Is set during the init stage reorganizeHierarchy. Before this the path is ca...
Definition: element.h:267
MBSim::Element::ds
DynamicSystemSolver * ds
dynamic system
Definition: element.h:277
MBSim::Element::getPlotGroup
H5::GroupBase * getPlotGroup()
Definition: element.h:139
H5::GroupBase
MBSim::Element::setPlotFeatureForChildren
void setPlotFeatureForChildren(const PlotFeatureEnum &pf, bool value)
Set a plot feature for the children of this object.
Definition: element.cc:247
MBSim::Element::plotColumns
std::vector< std::string > plotColumns
columns of time series
Definition: element.h:292
MBSim::PlotFeatureEnum
Definition: plotfeatureenum.h:29
MBSim::Element::getPath
std::string getPath(const Element *relTo=nullptr, std::string sep="/") const
Return the path of this object. If relativeTo is not NULL return a relative path to relativeTo....
Definition: element.cc:183
MBSim::Element::plotting
Definition: element.h:65
MBSim::Element::InitStage
InitStage
The stages of the initialization.
Definition: element.h:62
MBSim::Element::getChildByContainerAndName
virtual Element * getChildByContainerAndName(const std::string &container, const std::string &name) const
Get the Element named name in the container named container.
Definition: element.h:207
MBSim::Element::plotVector
std::vector< double > plotVector
one entry of time series
Definition: element.h:287
MBSim::Element::getName
const std::string & getName() const
Definition: element.h:110
MBXMLUtils::DOMEvalException
MBSim::Element::~Element
~Element() override=default
destructor
MBSim::Element::name
std::string name
name of element
Definition: element.h:260
MBSim::Element::domEvalError
MBXMLUtils::DOMEvalException domEvalError
Special XML helper variable.
Definition: element.h:271
MBSim::Element::preInit
Definition: element.h:64
H5::VectorSerie< double >
MBSim::Element::setDynamicSystemSolver
virtual void setDynamicSystemSolver(DynamicSystemSolver *sys)
sets the used dynamics system solver to the element
Definition: element.h:91
MBSim::Element::unknownStage
Definition: element.h:66
MBSim::Element::plotGroup
H5::GroupBase * plotGroup
associated plot group
Definition: element.h:297
MBSim::Element::setName
void setName(const std::string &str)
Definition: element.h:115
MBSim::MBSimError
basic error class for mbsim
Definition: mbsim_event.h:39
MBSim::Element::computeLevel
int computeLevel()
computes the length of the pathes in the graph that represents the dependencies between all elements.
Definition: element.cc:296
MBSim::Element::getByPath
T * getByPath(const std::string &path, bool initialCaller=true) const
Get the object of type T represented by the path path. Do not set any argurment other than path!
Definition: element.h:337
MBSim::Element::Element
Element(const std::string &name)
constructor
Definition: element.cc:77
MBSim
namespace MBSim
Definition: bilateral_constraint.cc:30