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()) {
183 static_cast<unsigned>(std::distance(newNodes.begin(), it));
184 duplicates.emplace_back(i, nodeId);
187 duplicates.emplace_back(i,
static_cast<unsigned>(newNodes.size()));
188 newNodes.push_back(
nodes[i]);
195 for (
auto &duplicate : duplicates) {
197 replaceNode(
lines, duplicate);
199 replaceNode(
tetras, duplicate);
200 replaceNode(
hexas, duplicate);
205 const unsigned numberOfOldNodes =
nodes.size();
211 const unsigned numberOfVertices =
vertices.size();
214 for (
unsigned i = numberOfVertices;
215 i < passedMesh.
vertices.size() + numberOfVertices; ++i) {
219 const unsigned numberOfLines =
lines.size();
221 for (
unsigned i = numberOfLines;
222 i < passedMesh.
lines.size() + numberOfLines; ++i) {
223 for (
unsigned d = 0; d < 2; ++d) {
224 lines[i][d] += numberOfOldNodes;
228 const unsigned numberOfTriangles =
triangles.size();
231 for (
unsigned i = numberOfTriangles;
232 i < passedMesh.
triangles.size() + numberOfTriangles; ++i) {
233 for (
unsigned d = 0; d < 3; ++d) {
238 const unsigned numberOfTetras =
tetras.size();
241 for (
unsigned i = numberOfTetras;
242 i < passedMesh.
tetras.size() + numberOfTetras; ++i) {
243 for (
unsigned d = 0; d < 4; ++d) {
244 tetras[i][d] += numberOfOldNodes;
248 const unsigned numberOfHexas =
hexas.size();
250 for (
unsigned i = numberOfHexas;
251 i < passedMesh.
hexas.size() + numberOfHexas; ++i) {
252 for (
unsigned d = 0; d < 8; ++d) {
253 hexas[i][d] += numberOfOldNodes;
264 for (
unsigned i = 0; i <
pointData.getScalarDataSize(); ++i) {
267 for (
unsigned i = 0; i <
pointData.getVectorDataSize(); ++i) {
271 for (
unsigned i = 0; i <
cellData.getScalarDataSize(); ++i) {
274 for (
unsigned i = 0; i <
cellData.getVectorDataSize(); ++i) {
293 std::cout <<
"Mesh:" << std::endl;
294 std::cout <<
"Number of Nodes: " <<
nodes.size() << std::endl;
296 std::cout <<
"Number of Vertices: " <<
vertices.size() << std::endl;
298 std::cout <<
"Number of Lines: " <<
lines.size() << std::endl;
300 std::cout <<
"Number of Triangles: " <<
triangles.size() << std::endl;
302 std::cout <<
"Number of Tetrahedrons: " <<
tetras.size() << std::endl;
304 std::cout <<
"Number of Hexas: " <<
hexas.size() << std::endl;
307 std::cout <<
"Scalar data:" << std::endl;
308 for (
unsigned i = 0; i <
pointData.getScalarDataSize(); ++i) {
309 std::cout <<
" \"" <<
pointData.getScalarDataLabel(i) <<
"\" of size "
310 <<
pointData.getScalarData(i)->size() << std::endl;
314 std::cout <<
"Vector data:" << std::endl;
315 for (
unsigned i = 0; i <
pointData.getVectorDataSize(); ++i) {
316 std::cout <<
" \"" <<
pointData.getVectorDataLabel(i) <<
"\" of size "
317 <<
pointData.getVectorData(i)->size() << std::endl;
322 if (
cellData.getScalarDataSize() > 0) {
323 std::cout <<
"Scalar data:" << std::endl;
324 for (
unsigned i = 0; i <
cellData.getScalarDataSize(); ++i) {
325 std::cout <<
" \"" <<
cellData.getScalarDataLabel(i) <<
"\" of size "
326 <<
cellData.getScalarData(i)->size() << std::endl;
329 if (
cellData.getVectorDataSize() > 0) {
330 std::cout <<
"Vector data:" << std::endl;
331 for (
unsigned i = 0; i <
cellData.getVectorDataSize(); ++i) {
332 std::cout <<
" \"" <<
cellData.getVectorDataLabel(i) <<
"\" of size "
333 <<
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:292
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:279
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:204
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