SPHinXsys  alpha version
xml_engine.h
Go to the documentation of this file.
1 /* -------------------------------------------------------------------------*
2  * SPHinXsys *
3  * --------------------------------------------------------------------------*
4  * SPHinXsys (pronunciation: s'finksis) is an acronym from Smoothed Particle *
5  * Hydrodynamics for industrial compleX systems. It provides C++ APIs for *
6  * physical accurate simulation and aims to model coupled industrial dynamic *
7  * systems including fluid, solid, multi-body dynamics and beyond with SPH *
8  * (smoothed particle hydrodynamics), a meshless computational method using *
9  * particle discretization. *
10  * *
11  * SPHinXsys is partially funded by German Research Foundation *
12  * (Deutsche Forschungsgemeinschaft) DFG HU1527/6-1, HU1527/10-1 *
13  * and HU1527/12-1. *
14  * *
15  * Portions copyright (c) 2017-2020 Technical University of Munich and *
16  * the authors' affiliations. *
17  * *
18  * Licensed under the Apache License, Version 2.0 (the "License"); you may *
19  * not use this file except in compliance with the License. You may obtain a *
20  * copy of the License at http://www.apache.org/licenses/LICENSE-2.0. *
21  * *
22  * --------------------------------------------------------------------------*/
29 #ifndef XML_ENGINE_SIMBODY_H
30 #define XML_ENGINE_SIMBODY_H
31 
32 #define _SILENCE_EXPERIMENTAL_FILESYSTEM_DEPRECATION_WARNING
33 
34 #include "base_data_package.h"
35 #include "sph_data_containers.h"
36 
37 #include "SimTKcommon.h"
38 #include "SimTKcommon/internal/Xml.h"
39 #include "SimTKcommon/internal/String.h"
40 
41 #include <iostream>
42 #include <string>
43 #include <cstdio>
44 
45 #include <fstream>
46 #ifdef __APPLE__
47 #include <boost/filesystem.hpp>
48 namespace fs = boost::filesystem;
49 #else
50 #include <experimental/filesystem>
51 namespace fs = std::experimental::filesystem;
52 #endif
53 
54 namespace SPH
55 {
56  class XmlEngine
57  {
58  protected:
59  std::string xml_name_;
60  SimTK::Xml::Document xmldoc_;
62  public:
64  XmlEngine(const std::string &xml_name, const std::string &root_tag);
66  virtual ~XmlEngine(){};
67 
68  SimTK::Xml::Element root_element_;
71  void addElementToXmlDoc(const std::string &element_name);
72 
74  void addChildToElement(SimTK::Xml::Element &father_element, const std::string &child_name);
75 
77  template <class T>
78  void setAttributeToElement(const SimTK::Xml::element_iterator &ele_ite, const std::string &attrib_name, const T &value)
79  {
80  SimTK::Xml::Attribute attr_(attrib_name, SimTK::String(value));
81  ele_ite->setAttributeValue(attr_.getName(), attr_.getValue());
82  };
84  void setAttributeToElement(const SimTK::Xml::element_iterator &ele_ite, const std::string &attrib_name, const Matd &value);
85 
87  template <class T>
88  void getRequiredAttributeValue(SimTK::Xml::element_iterator &ele_ite_, const std::string &attrib_name, T &value)
89  {
90  std::string value_in_string = ele_ite_->getRequiredAttributeValue(attrib_name);
91  value = SimTK::convertStringTo<T>(value_in_string);
92  };
94  void getRequiredAttributeMatrixValue(SimTK::Xml::element_iterator &ele_ite_, const std::string &attrib_name, Matd &value);
95 
97  void writeToXmlFile(const std::string &filefullpath);
99  void loadXmlFile(const std::string &filefullpath);
101  std::string getRootElementTag();
103  std::string getElementTag(SimTK::Xml::Element &element);
105  void resizeXmlDocForParticles(size_t input_size);
107  size_t SizeOfXmlDoc();
109  SimTK::Xml::Element getChildElement(const std::string &tag);
110  };
111 
117  {
118  public:
119  XmlMemoryIO(){};
120  virtual ~XmlMemoryIO(){};
121 
122  template <typename T>
123  void writeDataToXmlMemory(XmlEngine &xml_engine, SimTK::Xml::Element &element, const DoubleVec<T> &quantity,
124  int snapshot_, int observation_, const std::string &quantity_name, StdVec<std::string> &element_tag)
125  {
126  for (int snapshot_index = 0; snapshot_index != snapshot_; ++snapshot_index)
127  {
128  std::string element_name = element_tag[snapshot_index];
129  xml_engine.addChildToElement(element, element_name);
130  for (int observation_index = 0; observation_index != observation_; ++observation_index)
131  {
132  SimTK::Xml::element_iterator ele_ite = element.element_begin(element_name);
133  std::string attribute_name_ = quantity_name + "_" + std::to_string(observation_index);
134  xml_engine.setAttributeToElement(ele_ite, attribute_name_, quantity[snapshot_index][observation_index]);
135  }
136  }
137  };
138 
139  template <typename T>
140  void writeDataToXmlMemory(XmlEngine &xml_engine, SimTK::Xml::Element &element,
141  std::string element_name, int observation_index, const T &quantity, const std::string &quantity_name)
142  {
143  SimTK::Xml::element_iterator ele_ite = element.element_begin(element_name);
144  std::string attribute_name_ = quantity_name + "_" + std::to_string(observation_index);
145  xml_engine.setAttributeToElement(ele_ite, attribute_name_, quantity);
146  };
147 
148  template <typename T>
149  void readDataFromXmlMemory(XmlEngine &xml_engine, SimTK::Xml::Element &element,
150  int observation_index, DoubleVec<T> &result_container, const std::string &quantity_name)
151  {
152  int snapshot_index = 0;
153  SimTK::Xml::element_iterator ele_ite = element.element_begin();
154  for (; ele_ite != element.element_end(); ++ele_ite)
155  {
156  std::string attribute_name_ = quantity_name + "_" + std::to_string(observation_index);
157  xml_engine.getRequiredAttributeValue<T>(ele_ite, attribute_name_, result_container[snapshot_index][observation_index]);
158  snapshot_index++;
159  }
160  };
161 
162  void readDataFromXmlMemory(XmlEngine &xml_engine, SimTK::Xml::Element &element,
163  size_t observation_index, DoubleVec<Matd> &result_container, const std::string &quantity_name);
164 
165  void readTagFromXmlMemory(SimTK::Xml::Element &element, StdVec<std::string> &element_tag);
166  };
167 }
168 
169 #endif // XML_ENGINE_SIMBODY_H
Definition: xml_engine.h:116
void loadXmlFile(const std::string &filefullpath)
Definition: xml_engine.cpp:72
void getRequiredAttributeValue(SimTK::Xml::element_iterator &ele_ite_, const std::string &attrib_name, T &value)
Definition: xml_engine.h:88
SimTK::Xml::Document xmldoc_
Definition: xml_engine.h:60
XmlEngine(const std::string &xml_name, const std::string &root_tag)
Definition: xml_engine.cpp:12
SimTK::Xml::Element root_element_
Definition: xml_engine.h:66
virtual ~XmlEngine()
Definition: xml_engine.h:66
std::string xml_name_
Definition: xml_engine.h:59
void addChildToElement(SimTK::Xml::Element &father_element, const std::string &child_name)
Definition: xml_engine.cpp:23
void addElementToXmlDoc(const std::string &element_name)
Definition: xml_engine.cpp:18
size_t SizeOfXmlDoc()
Definition: xml_engine.cpp:106
void setAttributeToElement(const SimTK::Xml::element_iterator &ele_ite, const std::string &attrib_name, const T &value)
Definition: xml_engine.h:78
Set up of basic data structure.
void resizeXmlDocForParticles(size_t input_size)
Definition: xml_engine.cpp:88
void getRequiredAttributeMatrixValue(SimTK::Xml::element_iterator &ele_ite_, const std::string &attrib_name, Matd &value)
Definition: xml_engine.cpp:41
void writeToXmlFile(const std::string &filefullpath)
Definition: xml_engine.cpp:67
std::string getRootElementTag()
Definition: xml_engine.cpp:78
Definition: xml_engine.h:56
SimTK::Xml::Element getChildElement(const std::string &tag)
Definition: xml_engine.cpp:111
std::string getElementTag(SimTK::Xml::Element &element)
Definition: xml_engine.cpp:83
Definition: solid_body_supplementary.cpp:9