OGS
Mesh.h
Go to the documentation of this file.
1 
15 #pragma once
16 
17 #include <cstdlib>
18 #include <memory>
19 #include <string>
20 #include <vector>
21 
22 #include "BaseLib/Error.h"
23 
24 #include "MeshEnums.h"
25 #include "Properties.h"
26 
27 namespace ApplicationUtils
28 {
29  class NodeWiseMeshPartitioner;
30 }
31 
32 namespace MeshLib
33 {
34  class Node;
35  class Element;
36 
40 class Mesh
41 {
42  /* friend functions: */
43  friend void removeMeshNodes(Mesh& mesh,
44  const std::vector<std::size_t>& nodes);
45 
47 
48 public:
54  Mesh(std::string name,
55  std::vector<Node*>
56  nodes,
57  std::vector<Element*>
58  elements,
59  Properties const& properties = Properties());
60 
62  Mesh(const Mesh &mesh);
63 
65  virtual ~Mesh();
66 
68  void addElement(Element* elem);
69 
71  unsigned getDimension() const { return _mesh_dimension; }
72 
74  const Node* getNode(std::size_t idx) const { return _nodes[idx]; }
75 
77  const Element* getElement(std::size_t idx) const { return _elements[idx]; }
78 
80  double getMinEdgeLength() const { return _edge_length.first; }
81 
83  double getMaxEdgeLength() const { return _edge_length.second; }
84 
86  std::size_t getNumberOfElements() const { return _elements.size(); }
87 
89  std::size_t getNumberOfNodes() const { return _nodes.size(); }
90 
92  const std::string getName() const { return _name; }
93 
95  std::vector<Node*> const& getNodes() const { return _nodes; }
96 
98  std::vector<Element*> const& getElements() const { return _elements; }
99 
101  void resetElementIDs();
102 
104  void resetNodeIDs();
105 
107  void setName(const std::string &name) { this->_name = name; }
108 
110  std::size_t getID() const {return _id; }
111 
113  std::size_t getNumberOfBaseNodes() const;
114 
116  bool hasNonlinearElement() const;
117 
118  std::vector<Element const*> const& getElementsConnectedToNode(
119  std::size_t node_id) const;
120  std::vector<Element const*> const& getElementsConnectedToNode(
121  Node const& node) const;
122 
124  Properties const& getProperties() const { return _properties; }
125 
126  bool isAxiallySymmetric() const { return _is_axially_symmetric; }
127  void setAxiallySymmetric(bool is_axial_symmetric) {
128  _is_axially_symmetric = is_axial_symmetric;
129  }
130 
131 protected:
133  void calcEdgeLengthRange();
134 
136  void setDimension();
137 
140  void setElementNeighbors();
141 
142  std::size_t const _id;
143  unsigned _mesh_dimension;
145  std::pair<double, double> _edge_length = {
146  std::numeric_limits<double>::quiet_NaN(),
147  std::numeric_limits<double>::quiet_NaN()};
149  std::pair<double, double> _node_distance;
150  std::string _name;
151  std::vector<Node*> _nodes;
152  std::vector<Element*> _elements;
154 
155  std::vector<std::vector<Element const*>> _elements_connected_to_nodes;
156 
157  bool _is_axially_symmetric = false;
158 }; /* class */
159 
162 std::vector<std::vector<Node*>> calculateNodesConnectedByElements(
163  Mesh const& mesh);
164 
166 inline bool operator==(Mesh const& a, Mesh const& b)
167 {
168  return a.getID() == b.getID();
169 }
170 
171 inline bool operator!=(Mesh const& a, Mesh const& b)
172 {
173  return !(a == b);
174 }
175 
178 void scaleMeshPropertyVector(Mesh& mesh,
179  std::string const& property_name,
180  double factor);
181 
192 template <typename T>
193 void addPropertyToMesh(Mesh& mesh, std::string const& name,
194  MeshItemType item_type, std::size_t number_of_components,
195  std::vector<T> const& values)
196 {
197  if (item_type == MeshItemType::Node)
198  {
199  if (mesh.getNumberOfNodes() != values.size() / number_of_components)
200  {
201  OGS_FATAL(
202  "Error number of nodes ({:d}) does not match the number of "
203  "tuples ({:d}).",
204  mesh.getNumberOfNodes(), values.size() / number_of_components);
205  }
206  }
207  if (item_type == MeshItemType::Cell)
208  {
209  if (mesh.getNumberOfElements() != values.size() / number_of_components)
210  {
211  OGS_FATAL(
212  "Error number of elements ({:d}) does not match the number of "
213  "tuples ({:d}).",
215  values.size() / number_of_components);
216  }
217  }
218 
219  auto* const property = mesh.getProperties().createNewPropertyVector<T>(
220  name, item_type, number_of_components);
221  if (!property)
222  {
223  OGS_FATAL("Error while creating PropertyVector '{:s}'.", name);
224  }
225  property->reserve(values.size());
226  std::copy(values.cbegin(), values.cend(), std::back_inserter(*property));
227 }
228 
233 template <typename T>
235  std::string const& property_name,
236  MeshItemType const item_type,
237  int const number_of_components)
238 {
239  if (property_name.empty())
240  {
241  OGS_FATAL(
242  "Trying to get or to create a mesh property with empty name.");
243  }
244 
245  auto numberOfMeshItems = [&mesh, &item_type]() -> std::size_t {
246  switch (item_type)
247  {
248  case MeshItemType::Cell:
249  return mesh.getNumberOfElements();
250  case MeshItemType::Node:
251  return mesh.getNumberOfNodes();
253  return 0; // For the integration point data the size is
254  // variable
255  default:
256  OGS_FATAL(
257  "getOrCreateMeshProperty cannot handle other "
258  "types than Node, Cell, or IntegrationPoint.");
259  }
260  return 0;
261  };
262 
263  if (mesh.getProperties().existsPropertyVector<T>(property_name))
264  {
265  auto result =
266  mesh.getProperties().template getPropertyVector<T>(property_name);
267  assert(result);
268  if (item_type != MeshItemType::IntegrationPoint)
269  {
270  // Test the size if number of mesh items is known, which is not the
271  // case for the integration point data.
272  assert(result->size() ==
273  numberOfMeshItems() * number_of_components);
274  }
275  return result;
276  }
277 
278  auto result = mesh.getProperties().template createNewPropertyVector<T>(
279  property_name, item_type, number_of_components);
280  assert(result);
281  result->resize(numberOfMeshItems() * number_of_components);
282  return result;
283 }
284 
290 PropertyVector<int> const* materialIDs(Mesh const& mesh);
291 
296 std::unique_ptr<Mesh> createMeshFromElementSelection(
297  std::string mesh_name, std::vector<Element*> const& elements);
298 
301 bool isBaseNode(Node const& node,
302  std::vector<Element const*> const& elements_connected_to_node);
303 } // namespace MeshLib
#define OGS_FATAL(...)
Definition: Error.h:26
Definition of mesh-related Enumerations.
Definition of the class Properties that implements a container of properties.
double getMaxEdgeLength() const
Get the maximum edge length over all elements of the mesh.
Definition: Mesh.h:83
bool isAxiallySymmetric() const
Definition: Mesh.h:126
Properties _properties
Definition: Mesh.h:153
std::size_t getNumberOfBaseNodes() const
Get the number of base nodes.
Definition: Mesh.cpp:214
void calcEdgeLengthRange()
Set the minimum and maximum length over the edges of the mesh.
Definition: Mesh.cpp:166
std::size_t const _id
Definition: Mesh.h:142
std::vector< std::vector< Element const * > > _elements_connected_to_nodes
Definition: Mesh.h:155
void setName(const std::string &name)
Changes the name of the mesh.
Definition: Mesh.h:107
Mesh(std::string name, std::vector< Node * > nodes, std::vector< Element * > elements, Properties const &properties=Properties())
Definition: Mesh.cpp:54
std::vector< Node * > const & getNodes() const
Get the nodes-vector for the mesh.
Definition: Mesh.h:95
void addElement(Element *elem)
Add an element to the mesh.
Definition: Mesh.cpp:131
std::pair< double, double > _edge_length
The minimal and maximal edge length over all elements in the mesh.
Definition: Mesh.h:145
unsigned _mesh_dimension
Definition: Mesh.h:143
friend void removeMeshNodes(Mesh &mesh, const std::vector< std::size_t > &nodes)
std::string _name
Definition: Mesh.h:150
unsigned getDimension() const
Returns the dimension of the mesh (determined by the maximum dimension over all elements).
Definition: Mesh.h:71
double getMinEdgeLength() const
Get the minimum edge length over all elements of the mesh.
Definition: Mesh.h:80
std::size_t getID() const
Get id of the mesh.
Definition: Mesh.h:110
void resetNodeIDs()
Resets the IDs of all mesh-nodes to their position in the node vector.
Definition: Mesh.cpp:136
std::vector< Element * > _elements
Definition: Mesh.h:152
void setDimension()
Sets the dimension of the mesh.
Definition: Mesh.cpp:154
std::vector< Element * > const & getElements() const
Get the element-vector for the mesh.
Definition: Mesh.h:98
const std::string getName() const
Get name of the mesh.
Definition: Mesh.h:92
void resetElementIDs()
Resets the IDs of all mesh-elements to their position in the element vector.
Definition: Mesh.cpp:145
void setElementNeighbors()
Definition: Mesh.cpp:180
virtual ~Mesh()
Destructor.
Definition: Mesh.cpp:116
Properties & getProperties()
Definition: Mesh.h:123
std::size_t getNumberOfNodes() const
Get the number of nodes.
Definition: Mesh.h:89
std::vector< Element const * > const & getElementsConnectedToNode(std::size_t node_id) const
Definition: Mesh.cpp:232
const Element * getElement(std::size_t idx) const
Get the element with the given index.
Definition: Mesh.h:77
void setAxiallySymmetric(bool is_axial_symmetric)
Definition: Mesh.h:127
std::pair< double, double > _node_distance
The minimal and maximal distance of nodes within an element over all elements in the mesh.
Definition: Mesh.h:149
Properties const & getProperties() const
Definition: Mesh.h:124
bool hasNonlinearElement() const
Check if the mesh contains any nonlinear element.
Definition: Mesh.cpp:224
const Node * getNode(std::size_t idx) const
Get the node with the given index.
Definition: Mesh.h:74
std::size_t getNumberOfElements() const
Get the number of elements.
Definition: Mesh.h:86
std::vector< Node * > _nodes
Definition: Mesh.h:151
bool _is_axially_symmetric
Definition: Mesh.h:157
Property manager on mesh items. Class Properties manages scalar, vector or matrix properties....
Definition: Properties.h:36
bool existsPropertyVector(std::string const &name) const
PropertyVector< T > * createNewPropertyVector(std::string const &name, MeshItemType mesh_item_type, std::size_t n_components=1)
void copy(PETScVector const &x, PETScVector &y)
Definition: LinAlg.cpp:37
std::vector< std::vector< Node * > > calculateNodesConnectedByElements(Mesh const &mesh)
Definition: Mesh.cpp:331
PropertyVector< int > const * materialIDs(Mesh const &mesh)
Definition: Mesh.cpp:258
MeshItemType
Definition: Location.h:21
bool operator==(Mesh const &a, Mesh const &b)
Meshes are equal if their id's are equal.
Definition: Mesh.h:166
std::unique_ptr< MeshLib::Mesh > createMeshFromElementSelection(std::string mesh_name, std::vector< MeshLib::Element * > const &elements)
Definition: Mesh.cpp:268
bool operator!=(Mesh const &a, Mesh const &b)
Definition: Mesh.h:171
void addPropertyToMesh(Mesh &mesh, std::string const &name, MeshItemType item_type, std::size_t number_of_components, std::vector< T > const &values)
Definition: Mesh.h:193
bool isBaseNode(Node const &node, std::vector< Element const * > const &elements_connected_to_node)
Definition: Mesh.cpp:370
PropertyVector< T > * getOrCreateMeshProperty(Mesh &mesh, std::string const &property_name, MeshItemType const item_type, int const number_of_components)
Definition: Mesh.h:234
void scaleMeshPropertyVector(MeshLib::Mesh &mesh, std::string const &property_name, double factor)
Definition: Mesh.cpp:244