9#include <vcPointData.hpp>
10#include <vcSmartPointer.hpp>
11#include <vcVectorType.hpp>
15using namespace viennacore;
21template <
class T =
double>
class Mesh {
25 std::vector<std::array<unsigned, 2>>
lines;
27 std::vector<std::array<unsigned, 4>>
tetras;
28 std::vector<std::array<unsigned, 8>>
hexas;
39 using VectorIt =
typename PointData<T>::VectorDataType::iterator;
41 static VectorIt find(VectorIt first, VectorIt last,
const Vec3D<T> &value) {
42 for (; first != last; ++first) {
43 if (*first == value) {
51 template <
class ElementType>
52 static void replaceNode(ElementType &elements,
53 std::pair<unsigned, unsigned> node) {
54 for (
unsigned i = 0; i < elements.size(); ++i) {
55 for (
unsigned j = 0; j < elements[i].size(); ++j) {
56 if (elements[i][j] == node.first) {
57 elements[i][j] = node.second;
65 static auto New() {
return SmartPointer<Mesh>::New(); }
71 template <
int D, std::enable_if_t<D == 1,
int> = 0>
76 template <
int D, std::enable_if_t<D == 2,
int> = 0>
81 template <
int D, std::enable_if_t<D == 3,
int> = 0>
86 template <
int D, std::enable_if_t<D == 4,
int> = 0>
91 template <
int D, std::enable_if_t<D == 8,
int> = 0>
106 return cellData.getVectorData(label);
111 return cellData.getScalarData(label);
115 nodes.push_back(node);
116 return nodes.size() - 1;
125 lines.push_back(line);
126 return lines.size() - 1;
140 hexas.push_back(hexa);
141 return hexas.size() - 1;
150 lines.push_back(line);
151 return lines.size() - 1;
165 hexas.push_back(hexa);
166 return hexas.size() - 1;
170 std::vector<Vec3D<T>> newNodes;
172 newNodes.push_back(
nodes[0]);
175 std::vector<std::pair<unsigned, unsigned>> duplicates;
176 bool adjusted =
false;
177 for (
unsigned i = 1; i <
nodes.size(); ++i) {
178 auto it = find(newNodes.begin(), newNodes.end(),
nodes[i]);
179 if (it != newNodes.end()) {
182 unsigned nodeId = std::distance(newNodes.begin(), it);
183 duplicates.emplace_back(i, nodeId);
186 duplicates.push_back(std::make_pair(i, newNodes.size()));
187 newNodes.push_back(
nodes[i]);
194 for (
auto &duplicate : duplicates) {
196 replaceNode(
lines, duplicate);
198 replaceNode(
tetras, duplicate);
199 replaceNode(
hexas, duplicate);
204 const unsigned numberOfOldNodes =
nodes.size();
210 const unsigned numberOfVertices =
vertices.size();
213 for (
unsigned i = numberOfVertices;
214 i < passedMesh.
vertices.size() + numberOfVertices; ++i) {
218 const unsigned numberOfLines =
lines.size();
220 for (
unsigned i = numberOfLines;
221 i < passedMesh.
lines.size() + numberOfLines; ++i) {
222 for (
unsigned d = 0; d < 2; ++d) {
223 lines[i][d] += numberOfOldNodes;
227 const unsigned numberOfTriangles =
triangles.size();
230 for (
unsigned i = numberOfTriangles;
231 i < passedMesh.
triangles.size() + numberOfTriangles; ++i) {
232 for (
unsigned d = 0; d < 3; ++d) {
237 const unsigned numberOfTetras =
tetras.size();
240 for (
unsigned i = numberOfTetras;
241 i < passedMesh.
tetras.size() + numberOfTetras; ++i) {
242 for (
unsigned d = 0; d < 4; ++d) {
243 tetras[i][d] += numberOfOldNodes;
247 const unsigned numberOfHexas =
hexas.size();
249 for (
unsigned i = numberOfHexas;
250 i < passedMesh.
hexas.size() + numberOfHexas; ++i) {
251 for (
unsigned d = 0; d < 8; ++d) {
252 hexas[i][d] += numberOfOldNodes;
263 for (
unsigned i = 0; i <
pointData.getScalarDataSize(); ++i) {
266 for (
unsigned i = 0; i <
pointData.getVectorDataSize(); ++i) {
270 for (
unsigned i = 0; i <
cellData.getScalarDataSize(); ++i) {
273 for (
unsigned i = 0; i <
cellData.getVectorDataSize(); ++i) {
292 std::cout <<
"Mesh:" << std::endl;
293 std::cout <<
"Number of Nodes: " <<
nodes.size() << std::endl;
295 std::cout <<
"Number of Vertices: " <<
vertices.size() << std::endl;
297 std::cout <<
"Number of Lines: " <<
lines.size() << std::endl;
299 std::cout <<
"Number of Triangles: " <<
triangles.size() << std::endl;
301 std::cout <<
"Number of Tetrahedrons: " <<
tetras.size() << std::endl;
303 std::cout <<
"Number of Hexas: " <<
hexas.size() << std::endl;
306 std::cout <<
"Scalar data:" << std::endl;
307 for (
unsigned i = 0; i <
pointData.getScalarDataSize(); ++i) {
308 std::cout <<
" \"" <<
pointData.getScalarDataLabel(i) <<
"\" of size "
309 <<
pointData.getScalarData(i)->size() << std::endl;
313 std::cout <<
"Vector data:" << std::endl;
314 for (
unsigned i = 0; i <
pointData.getVectorDataSize(); ++i) {
315 std::cout <<
" \"" <<
pointData.getVectorDataLabel(i) <<
"\" of size "
316 <<
pointData.getVectorData(i)->size() << std::endl;
321 if (
cellData.getScalarDataSize() > 0) {
322 std::cout <<
"Scalar data:" << std::endl;
323 for (
unsigned i = 0; i <
cellData.getScalarDataSize(); ++i) {
324 std::cout <<
" \"" <<
cellData.getScalarDataLabel(i) <<
"\" of size "
325 <<
cellData.getScalarData(i)->size() << std::endl;
328 if (
cellData.getVectorDataSize() > 0) {
329 std::cout <<
"Vector data:" << std::endl;
330 for (
unsigned i = 0; i <
cellData.getVectorDataSize(); ++i) {
331 std::cout <<
" \"" <<
cellData.getVectorDataLabel(i) <<
"\" of size "
332 <<
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:21
PointData< T > pointData
Definition lsMesh.hpp:29
unsigned insertNextElement(const std::array< unsigned, 3 > &triangle)
Definition lsMesh.hpp:154
unsigned insertNextElement(const std::array< unsigned, 4 > &tetra)
Definition lsMesh.hpp:159
const PointData< T > & getPointData() const
Definition lsMesh.hpp:98
static constexpr const char * normalsLabel
Definition lsMesh.hpp:35
std::vector< std::array< unsigned, 8 > > hexas
Definition lsMesh.hpp:28
unsigned insertNextNode(const Vec3D< T > &node)
Definition lsMesh.hpp:114
void removeDuplicateNodes()
Definition lsMesh.hpp:169
Vec3D< T > minimumExtent
Definition lsMesh.hpp:31
PointData< T > cellData
Definition lsMesh.hpp:30
std::vector< Vec3D< T > > & getNodes()
Definition lsMesh.hpp:69
std::vector< std::array< unsigned, 1 > > vertices
Definition lsMesh.hpp:24
static auto New()
Definition lsMesh.hpp:65
std::vector< std::array< unsigned, 2 > > lines
Definition lsMesh.hpp:25
unsigned insertNextTriangle(const std::array< unsigned, 3 > &triangle)
Definition lsMesh.hpp:129
std::vector< T > * getMaterialIds(const char *label=materialIdsLabel)
Definition lsMesh.hpp:110
unsigned insertNextHexa(const std::array< unsigned, 8 > &hexa)
Definition lsMesh.hpp:139
void print()
Definition lsMesh.hpp:291
Vec3D< T > maximumExtent
Definition lsMesh.hpp:32
std::vector< std::array< unsigned, 4 > > tetras
Definition lsMesh.hpp:27
std::vector< Vec3D< T > > nodes
Definition lsMesh.hpp:23
unsigned insertNextTetra(const std::array< unsigned, 4 > &tetra)
Definition lsMesh.hpp:134
void clear()
Definition lsMesh.hpp:278
const PointData< T > & getCellData() const
Definition lsMesh.hpp:102
std::vector< Vec3D< T > > * getNormals(const char *label=normalsLabel)
Definition lsMesh.hpp:105
unsigned insertNextElement(const std::array< unsigned, 1 > &vertex)
Definition lsMesh.hpp:144
static constexpr const char * materialIdsLabel
Definition lsMesh.hpp:34
PointData< T > & getPointData()
Definition lsMesh.hpp:96
void append(const Mesh< T > &passedMesh)
Definition lsMesh.hpp:203
PointData< T > & getCellData()
Definition lsMesh.hpp:100
const std::vector< Vec3D< T > > & getNodes() const
Definition lsMesh.hpp:67
unsigned insertNextElement(const std::array< unsigned, 2 > &line)
Definition lsMesh.hpp:149
std::vector< std::array< unsigned, 3 > > triangles
Definition lsMesh.hpp:26
unsigned insertNextVertex(const std::array< unsigned, 1 > &vertex)
Definition lsMesh.hpp:119
unsigned insertNextElement(const std::array< unsigned, 8 > &hexa)
Definition lsMesh.hpp:164
unsigned insertNextLine(const std::array< unsigned, 2 > &line)
Definition lsMesh.hpp:124
std::vector< std::array< unsigned, D > > & getElements()
Definition lsMesh.hpp:72
#define PRECOMPILE_PRECISION(className)
Definition lsPreCompileMacros.hpp:30
Definition lsAdvect.hpp:41