OGS
Mesh.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (c) OpenGeoSys Community (opengeosys.org)
2// SPDX-License-Identifier: BSD-3-Clause
3
4#pragma once
5
6#include <cstdlib>
7#include <memory>
8#include <range/v3/view/iota.hpp>
9#include <range/v3/view/transform.hpp>
10#include <string>
11#include <vector>
12
13#include "BaseLib/Algorithm.h"
14#include "BaseLib/Error.h"
15#include "Location.h"
16#include "MathLib/Point3d.h"
17#include "MeshEnums.h"
18#include "Properties.h"
19
20namespace ApplicationUtils
21{
23}
24
25namespace MeshLib
26{
27 class Node;
28 class Element;
29
33class Mesh
34{
35 /* friend functions: */
36 friend void removeMeshNodes(Mesh& mesh,
37 const std::vector<std::size_t>& nodes);
38
40
41public:
49 Mesh(std::string name,
50 std::vector<Node*>
51 nodes,
52 std::vector<Element*>
53 elements,
54 bool const compute_element_neighbors = false,
55 Properties const& properties = Properties());
56
58 Mesh(const Mesh &mesh);
59
60 Mesh(Mesh&& mesh);
61
62 Mesh& operator=(const Mesh& mesh) = delete;
63 Mesh& operator=(Mesh&& mesh) = delete;
64
66 virtual ~Mesh();
67
73 void shallowClean();
74
76 void addElement(Element* elem);
77
79 unsigned getDimension() const { return _mesh_dimension; }
80
82 const Node* getNode(std::size_t idx) const { return _nodes[idx]; }
83
85 const Element* getElement(std::size_t idx) const { return _elements[idx]; }
86
88 std::size_t getNumberOfElements() const { return _elements.size(); }
89
91 std::size_t getNumberOfNodes() const { return _nodes.size(); }
92
94 const std::string getName() const { return _name; }
95
97 std::vector<Node*> const& getNodes() const { return _nodes; }
98
100 std::vector<Element*> const& getElements() const { return _elements; }
101
103 void resetElementIDs();
104
106 void resetNodeIDs();
107
109 void setName(const std::string &name) { this->_name = name; }
110
112 std::size_t getID() const {return _id; }
113
115 std::size_t computeNumberOfBaseNodes() const;
116
118 bool hasNonlinearElement() const;
119
120 std::vector<Element const*> const& getElementsConnectedToNode(
121 std::size_t node_id) const;
122 std::vector<Element const*> const& getElementsConnectedToNode(
123 Node const& node) const;
124
126 Properties const& getProperties() const { return _properties; }
127
129 void setAxiallySymmetric(bool is_axial_symmetric) {
130 _is_axially_symmetric = is_axial_symmetric;
131 }
132
133protected:
136
138 void setDimension();
139
142 void setElementNeighbors();
143
144 std::size_t const _id;
147 std::pair<double, double> _node_distance;
148 std::string _name;
149 std::vector<Node*> _nodes;
150 std::vector<Element*> _elements;
152
153 std::vector<std::vector<Element const*>> _elements_connected_to_nodes;
154
157}; /* class */
158
161std::vector<std::vector<Node*>> calculateNodesConnectedByElements(
162 Mesh const& mesh);
163
165inline bool operator==(Mesh const& a, Mesh const& b)
166{
167 return a.getID() == b.getID();
168}
169
170inline bool operator!=(Mesh const& a, Mesh const& b)
171{
172 return !(a == b);
173}
174
180PropertyVector<int> const* materialIDs(Mesh const& mesh);
181PropertyVector<int>* materialIDs(Mesh& mesh);
182PropertyVector<std::size_t> const* bulkNodeIDs(Mesh const& mesh);
183PropertyVector<std::size_t> const* bulkElementIDs(Mesh const& mesh);
184
187bool isBaseNode(Node const& node,
188 std::vector<Element const*> const& elements_connected_to_node);
189
191std::pair<double, double> minMaxEdgeLength(
192 std::vector<Element*> const& elements);
193
196template <typename T>
197bool idsComparator(T const a, T const b)
198{
199 if constexpr (std::is_pointer_v<T>)
200 {
201 return a->getID() < b->getID();
202 }
203 else
204 {
205 return a.getID() < b.getID();
206 }
207}
208
209Mesh& findMeshByName(std::vector<std::unique_ptr<Mesh>> const& meshes,
210 std::string_view const name);
211
213namespace views
214{
216inline constexpr ranges::views::view_closure ids =
217 ranges::views::transform([](auto const& a) { return a->getID(); });
218
220inline constexpr ranges::views::view_closure names =
221 ranges::views::transform([](auto const& a) { return a->getName(); });
222
223inline constexpr ranges::views::view_closure coords =
224 ranges::views::transform([](MathLib::Point3d const* n)
225 { return std::span(n->data(), n->data() + 3); });
226
227inline auto meshLocations(Mesh const& mesh, MeshItemType const item_type)
228{
229 return ranges::views::iota(std::size_t{0}, mesh.getNumberOfNodes()) |
230 ranges::views::transform(
231 [mesh_id = mesh.getID(), item_type](std::size_t const n)
232 { return Location{mesh_id, item_type, n}; });
233}
234} // namespace views
235} // namespace MeshLib
const double * data() const
Definition Point3d.h:51
bool isAxiallySymmetric() const
Definition Mesh.h:128
Properties _properties
Definition Mesh.h:151
std::vector< Node * > const & getNodes() const
Get the nodes-vector for the mesh.
Definition Mesh.h:97
void calcEdgeLengthRange()
Set the minimum and maximum length over the edges of the mesh.
std::size_t const _id
Definition Mesh.h:144
bool const _compute_element_neighbors
Definition Mesh.h:156
Mesh(Mesh &&mesh)
std::vector< std::vector< Element const * > > _elements_connected_to_nodes
Definition Mesh.h:153
void setName(const std::string &name)
Changes the name of the mesh.
Definition Mesh.h:109
void addElement(Element *elem)
Add an element to the mesh.
Definition Mesh.cpp:144
std::vector< Element * > const & getElements() const
Get the element-vector for the mesh.
Definition Mesh.h:100
unsigned _mesh_dimension
Definition Mesh.h:145
std::size_t computeNumberOfBaseNodes() const
Get the number of base nodes.
Definition Mesh.cpp:228
friend void removeMeshNodes(Mesh &mesh, const std::vector< std::size_t > &nodes)
std::string _name
Definition Mesh.h:148
Mesh & operator=(Mesh &&mesh)=delete
unsigned getDimension() const
Returns the dimension of the mesh (determined by the maximum dimension over all elements).
Definition Mesh.h:79
std::size_t getID() const
Get id of the mesh.
Definition Mesh.h:112
void resetNodeIDs()
Resets the IDs of all mesh-nodes to their position in the node vector.
Definition Mesh.cpp:149
const Node * getNode(std::size_t idx) const
Get the node with the given index.
Definition Mesh.h:82
Properties & getProperties()
Definition Mesh.h:125
const Element * getElement(std::size_t idx) const
Get the element with the given index.
Definition Mesh.h:85
std::vector< Element * > _elements
Definition Mesh.h:150
void setDimension()
Sets the dimension of the mesh.
Definition Mesh.cpp:167
const std::string getName() const
Get name of the mesh.
Definition Mesh.h:94
void resetElementIDs()
Resets the IDs of all mesh-elements to their position in the element vector.
Definition Mesh.cpp:158
void setElementNeighbors()
Definition Mesh.cpp:194
virtual ~Mesh()
Destructor.
Definition Mesh.cpp:129
Mesh(std::string name, std::vector< Node * > nodes, std::vector< Element * > elements, bool const compute_element_neighbors=false, Properties const &properties=Properties())
Definition Mesh.cpp:52
std::size_t getNumberOfNodes() const
Get the number of nodes.
Definition Mesh.h:91
std::vector< Element const * > const & getElementsConnectedToNode(std::size_t node_id) const
Definition Mesh.cpp:246
void setAxiallySymmetric(bool is_axial_symmetric)
Definition Mesh.h:129
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:147
Mesh & operator=(const Mesh &mesh)=delete
void shallowClean()
Definition Mesh.cpp:123
Properties const & getProperties() const
Definition Mesh.h:126
bool hasNonlinearElement() const
Check if the mesh contains any nonlinear element.
Definition Mesh.cpp:238
std::size_t getNumberOfElements() const
Get the number of elements.
Definition Mesh.h:88
std::vector< Node * > _nodes
Definition Mesh.h:149
bool _is_axially_symmetric
Definition Mesh.h:155
Property manager on mesh items. Class Properties manages scalar, vector or matrix properties....
MeshLib specific, lazy, non-owning, non-mutating, composable range views.
Definition Mesh.h:214
constexpr ranges::views::view_closure ids
For an element of a range view return its id.
Definition Mesh.h:216
auto meshLocations(Mesh const &mesh, MeshItemType const item_type)
Definition Mesh.h:227
constexpr ranges::views::view_closure coords
Definition Mesh.h:223
constexpr ranges::views::view_closure names
For an element of a range view return its name.
Definition Mesh.h:220
std::vector< std::vector< Node * > > calculateNodesConnectedByElements(Mesh const &mesh)
Definition Mesh.cpp:298
Mesh & findMeshByName(std::vector< std::unique_ptr< Mesh > > const &meshes, std::string_view const name)
Definition Mesh.cpp:354
bool idsComparator(T const a, T const b)
Definition Mesh.h:197
PropertyVector< int > const * materialIDs(Mesh const &mesh)
Definition Mesh.cpp:258
PropertyVector< std::size_t > const * bulkElementIDs(Mesh const &mesh)
Definition Mesh.cpp:290
std::pair< double, double > minMaxEdgeLength(std::vector< Element * > const &elements)
Returns the minimum and maximum edge length for given elements.
Definition Mesh.cpp:179
bool operator==(Mesh const &a, Mesh const &b)
Meshes are equal if their id's are equal.
Definition Mesh.h:165
bool operator!=(Mesh const &a, Mesh const &b)
Definition Mesh.h:170
bool isBaseNode(Node const &node, std::vector< Element const * > const &elements_connected_to_node)
Definition Mesh.cpp:336
PropertyVector< std::size_t > const * bulkNodeIDs(Mesh const &mesh)
Definition Mesh.cpp:282