From 701e174788859528841ab794a01af478c173ea55 Mon Sep 17 00:00:00 2001 From: AnastasiaDolotova Date: Wed, 28 Sep 2022 23:44:51 +0300 Subject: [PATCH] Method insertNodesIntoMiddles() was implemented --- DataTypes.h | 15 +++++++++++++- MeshLoader.cpp | 56 +++++++++++++++++++++++++++++++++++++++++++++++--- MeshLoader.h | 2 ++ 3 files changed, 69 insertions(+), 4 deletions(-) diff --git a/DataTypes.h b/DataTypes.h index 2ea1e9f..5a1f7f5 100644 --- a/DataTypes.h +++ b/DataTypes.h @@ -29,7 +29,7 @@ struct FiniteElement { FiniteElement(unsigned int p_ID, unsigned int p_areaID, std::vector &p_nodesID) : ID(p_ID), - areaID(p_areaID), nodesID(p_nodesID) {} + areaID(p_areaID), nodesID(p_nodesID) {} friend std::ostream &operator<<(std::ostream &ost, const FiniteElement &element) { ost << "ID: " << element.ID << ", area ID: " << element.areaID << ", nodes ID: {"; @@ -60,4 +60,17 @@ struct BoundaryElement { ost << "\b" << "}"; return ost; } +}; + +struct Edge { + unsigned int node1, node2, middleNode; + + Edge() = default; + + Edge(unsigned int p_node1, unsigned int p_node2, unsigned int mid) : node1(std::min(p_node1, p_node2)), + node2(std::max(p_node1, p_node2)), middleNode(mid) {} + + bool operator==(const Edge &edge) const { + return node1 == edge.node1 && node2 == edge.node2; + } }; \ No newline at end of file diff --git a/MeshLoader.cpp b/MeshLoader.cpp index fddba28..2cb7f58 100644 --- a/MeshLoader.cpp +++ b/MeshLoader.cpp @@ -72,7 +72,7 @@ std::unordered_set MeshLoader::getBoundaryNodesByBoundaryID(unsign std::vector MeshLoader::getFiniteElementsByAreaID(unsigned int ID) { std::vector elements; auto beg = finiteElements.begin(), end = finiteElements.end(); - while(beg != end){ + while (beg != end) { auto e = std::find_if(beg, end, [ID](const FiniteElement &elem) -> bool { return elem.areaID == ID; @@ -89,7 +89,7 @@ std::vector MeshLoader::getFiniteElementsByAreaID(unsigned int ID std::vector MeshLoader::getBoundaryElementsByBoundaryID(unsigned int ID) { std::vector elements; auto beg = boundaryElements.begin(), end = boundaryElements.end(); - while(beg != end){ + while (beg != end) { auto e = std::find_if(beg, end, [ID](const BoundaryElement &elem) -> bool { return elem.boundaryID == ID; @@ -104,7 +104,57 @@ std::vector MeshLoader::getBoundaryElementsByBoundaryID(unsigne } void MeshLoader::insertNodesIntoMiddles() { - //TODO + auto hash = [](const Edge &element) { + unsigned int hashcode = 23; + hashcode = (hashcode * 37) + element.node1; + hashcode = (hashcode * 37) + element.node2; + return hashcode; + }; + + std::unordered_set edges; + + for (auto &element: finiteElements) { + size_t size = element.nodesID.size(); + for (int i = 0; i < size; ++i) { + for (int j = i + 1; j < size; ++j) { + Edge edge(element.nodesID[i], element.nodesID[j], nodes.size() + 1); + auto[iter, res] = edges.insert(edge); + if (res) { + Node node = makeMiddleNode(edge.node1, edge.node2); + edge.middleNode = node.ID; + nodes.push_back(node); + element.nodesID.push_back(node.ID); + } else { + element.nodesID.push_back(iter->middleNode); + } + } + } + } + + for (auto &element: boundaryElements) { + size_t size = element.nodesID.size(); + for (int i = 0; i < size; ++i) { + for (int j = i + 1; j < size; ++j) { + unsigned int ID1 = element.nodesID[i]; + unsigned int ID2 = element.nodesID[j]; + Edge edge(ID1, ID2, 0); + auto iter = edges.find(edge); + element.nodesID.push_back(iter->middleNode); + } + } + } +} + +Node MeshLoader::makeMiddleNode(unsigned int ID1, unsigned int ID2) { + unsigned int ID = nodes.size() + 1; + ID1--; + ID2--; + double x = (nodes[ID1].x + nodes[ID2].x) / 2; + double y = (nodes[ID1].y + nodes[ID2].y) / 2; + double z = (nodes[ID1].z + nodes[ID2].z) / 2; + bool isVertex = nodes[ID1].isVertex && nodes[ID2].isVertex; + Node node{ID, x, y, z, isVertex}; + return node; } std::vector> MeshLoader::makeVectorOfNeighbours() { diff --git a/MeshLoader.h b/MeshLoader.h index 2c4bebe..bd743bd 100644 --- a/MeshLoader.h +++ b/MeshLoader.h @@ -38,6 +38,8 @@ public: void insertNodesIntoMiddles(); + Node makeMiddleNode(unsigned int, unsigned int); + std::vector> makeVectorOfNeighbours(); virtual ~MeshLoader() = default; -- GitLab