11#include <vcSmartPointer.hpp>
12#include <vcVectorType.hpp>
16using namespace viennacore;
22template <
class T =
double>
class Mesh {
26 std::vector<std::array<unsigned, 2>>
lines;
28 std::vector<std::array<unsigned, 4>>
tetras;
29 std::vector<std::array<unsigned, 8>>
hexas;
39 static VectorIt find(VectorIt first, VectorIt last,
const Vec3D<T> &value) {
40 for (; first != last; ++first) {
41 if (*first == value) {
49 template <
class ElementType>
50 static void replaceNode(ElementType &elements,
51 std::pair<unsigned, unsigned> node) {
52 for (
unsigned i = 0; i < elements.size(); ++i) {
53 for (
unsigned j = 0; j < elements[i].size(); ++j) {
54 if (elements[i][j] == node.first) {
55 elements[i][j] = node.second;
63 static auto New() {
return SmartPointer<Mesh>::New(); }
69 template <
int D, std::enable_if_t<D == 1,
int> = 0>
74 template <
int D, std::enable_if_t<D == 2,
int> = 0>
79 template <
int D, std::enable_if_t<D == 3,
int> = 0>
84 template <
int D, std::enable_if_t<D == 4,
int> = 0>
89 template <
int D, std::enable_if_t<D == 8,
int> = 0>
103 nodes.push_back(node);
104 return nodes.size() - 1;
113 lines.push_back(line);
114 return lines.size() - 1;
128 hexas.push_back(hexa);
129 return hexas.size() - 1;
138 lines.push_back(line);
139 return lines.size() - 1;
153 hexas.push_back(hexa);
154 return hexas.size() - 1;
158 std::vector<Vec3D<T>> newNodes;
160 newNodes.push_back(
nodes[0]);
163 std::vector<std::pair<unsigned, unsigned>> duplicates;
164 bool adjusted =
false;
165 for (
unsigned i = 1; i <
nodes.size(); ++i) {
166 auto it = find(newNodes.begin(), newNodes.end(),
nodes[i]);
167 if (it != newNodes.end()) {
170 unsigned nodeId = std::distance(newNodes.begin(), it);
171 duplicates.emplace_back(i, nodeId);
174 duplicates.push_back(std::make_pair(i, newNodes.size()));
175 newNodes.push_back(
nodes[i]);
182 for (
auto &duplicate : duplicates) {
184 replaceNode(
lines, duplicate);
186 replaceNode(
tetras, duplicate);
187 replaceNode(
hexas, duplicate);
192 const unsigned numberOfOldNodes =
nodes.size();
198 const unsigned numberOfVertices =
vertices.size();
201 for (
unsigned i = numberOfVertices;
202 i < passedMesh.
vertices.size() + numberOfVertices; ++i) {
206 const unsigned numberOfLines =
lines.size();
208 for (
unsigned i = numberOfLines;
209 i < passedMesh.
lines.size() + numberOfLines; ++i) {
210 for (
unsigned d = 0; d < 2; ++d) {
211 lines[i][d] += numberOfOldNodes;
215 const unsigned numberOfTriangles =
triangles.size();
218 for (
unsigned i = numberOfTriangles;
219 i < passedMesh.
triangles.size() + numberOfTriangles; ++i) {
220 for (
unsigned d = 0; d < 3; ++d) {
225 const unsigned numberOfTetras =
tetras.size();
228 for (
unsigned i = numberOfTetras;
229 i < passedMesh.
tetras.size() + numberOfTetras; ++i) {
230 for (
unsigned d = 0; d < 4; ++d) {
231 tetras[i][d] += numberOfOldNodes;
235 const unsigned numberOfHexas =
hexas.size();
237 for (
unsigned i = numberOfHexas;
238 i < passedMesh.
hexas.size() + numberOfHexas; ++i) {
239 for (
unsigned d = 0; d < 8; ++d) {
240 hexas[i][d] += numberOfOldNodes;
251 for (
unsigned i = 0; i <
pointData.getScalarDataSize(); ++i) {
254 for (
unsigned i = 0; i <
pointData.getVectorDataSize(); ++i) {
258 for (
unsigned i = 0; i <
cellData.getScalarDataSize(); ++i) {
261 for (
unsigned i = 0; i <
cellData.getVectorDataSize(); ++i) {
278 std::cout <<
"Mesh:" << std::endl;
279 std::cout <<
"Number of Nodes: " <<
nodes.size() << std::endl;
281 std::cout <<
"Number of Vertices: " <<
vertices.size() << std::endl;
283 std::cout <<
"Number of Lines: " <<
lines.size() << std::endl;
285 std::cout <<
"Number of Triangles: " <<
triangles.size() << std::endl;
287 std::cout <<
"Number of Tetrahedrons: " <<
tetras.size() << std::endl;
289 std::cout <<
"Number of Hexas: " <<
hexas.size() << std::endl;
292 std::cout <<
"Scalar data:" << std::endl;
293 for (
unsigned i = 0; i <
pointData.getScalarDataSize(); ++i) {
294 std::cout <<
" \"" <<
pointData.getScalarDataLabel(i) <<
"\" of size "
295 <<
pointData.getScalarData(i)->size() << std::endl;
299 std::cout <<
"Vector data:" << std::endl;
300 for (
unsigned i = 0; i <
pointData.getVectorDataSize(); ++i) {
301 std::cout <<
" \"" <<
pointData.getVectorDataLabel(i) <<
"\" of size "
302 <<
pointData.getVectorData(i)->size() << std::endl;
307 if (
cellData.getScalarDataSize() > 0) {
308 std::cout <<
"Scalar data:" << std::endl;
309 for (
unsigned i = 0; i <
cellData.getScalarDataSize(); ++i) {
310 std::cout <<
" \"" <<
cellData.getScalarDataLabel(i) <<
"\" of size "
311 <<
cellData.getScalarData(i)->size() << std::endl;
314 if (
cellData.getVectorDataSize() > 0) {
315 std::cout <<
"Vector data:" << std::endl;
316 for (
unsigned i = 0; i <
cellData.getVectorDataSize(); ++i) {
317 std::cout <<
" \"" <<
cellData.getVectorDataLabel(i) <<
"\" of size "
318 <<
cellData.getVectorData(i)->size() << std::endl;
This class holds an explicit mesh, which is always given in 3 dimensions. If it describes a 2D mesh,...
Definition lsMesh.hpp:22
PointData< T > pointData
Definition lsMesh.hpp:30
unsigned insertNextElement(const std::array< unsigned, 3 > &triangle)
Definition lsMesh.hpp:142
unsigned insertNextElement(const std::array< unsigned, 4 > &tetra)
Definition lsMesh.hpp:147
const PointData< T > & getPointData() const
Definition lsMesh.hpp:96
std::vector< std::array< unsigned, 8 > > hexas
Definition lsMesh.hpp:29
unsigned insertNextNode(const Vec3D< T > &node)
Definition lsMesh.hpp:102
void removeDuplicateNodes()
Definition lsMesh.hpp:157
Vec3D< T > minimumExtent
Definition lsMesh.hpp:32
PointData< T > cellData
Definition lsMesh.hpp:31
std::vector< Vec3D< T > > & getNodes()
Definition lsMesh.hpp:67
std::vector< std::array< unsigned, 1 > > vertices
Definition lsMesh.hpp:25
static auto New()
Definition lsMesh.hpp:63
std::vector< std::array< unsigned, 2 > > lines
Definition lsMesh.hpp:26
unsigned insertNextTriangle(const std::array< unsigned, 3 > &triangle)
Definition lsMesh.hpp:117
unsigned insertNextHexa(const std::array< unsigned, 8 > &hexa)
Definition lsMesh.hpp:127
void print()
Definition lsMesh.hpp:277
Vec3D< T > maximumExtent
Definition lsMesh.hpp:33
std::vector< std::array< unsigned, 4 > > tetras
Definition lsMesh.hpp:28
std::vector< Vec3D< T > > nodes
Definition lsMesh.hpp:24
unsigned insertNextTetra(const std::array< unsigned, 4 > &tetra)
Definition lsMesh.hpp:122
void clear()
Definition lsMesh.hpp:266
const PointData< T > & getCellData() const
Definition lsMesh.hpp:100
unsigned insertNextElement(const std::array< unsigned, 1 > &vertex)
Definition lsMesh.hpp:132
PointData< T > & getPointData()
Definition lsMesh.hpp:94
void append(const Mesh< T > &passedMesh)
Definition lsMesh.hpp:191
PointData< T > & getCellData()
Definition lsMesh.hpp:98
const std::vector< Vec3D< T > > & getNodes() const
Definition lsMesh.hpp:65
unsigned insertNextElement(const std::array< unsigned, 2 > &line)
Definition lsMesh.hpp:137
std::vector< std::array< unsigned, 3 > > triangles
Definition lsMesh.hpp:27
unsigned insertNextVertex(const std::array< unsigned, 1 > &vertex)
Definition lsMesh.hpp:107
unsigned insertNextElement(const std::array< unsigned, 8 > &hexa)
Definition lsMesh.hpp:152
unsigned insertNextLine(const std::array< unsigned, 2 > &line)
Definition lsMesh.hpp:112
std::vector< std::array< unsigned, D > > & getElements()
Definition lsMesh.hpp:70
This class holds data associated with points in space.
Definition lsPointData.hpp:21
#define PRECOMPILE_PRECISION(className)
Definition lsPreCompileMacros.hpp:30
Definition lsAdvect.hpp:36