From 37c947195a639d2143586c4b0a9b13b078bf5454 Mon Sep 17 00:00:00 2001
From: Norihiro Watanabe <norihiro.watanabe@ufz.de>
Date: Wed, 2 Nov 2016 16:05:23 +0100
Subject: [PATCH] [Mesh] fix incorrect use of getNumberOfBaseNodes()

---
 MeshLib/ElementStatus.cpp                     |  2 +-
 MeshLib/Elements/Element.cpp                  |  2 +-
 MeshLib/Mesh.cpp                              | 45 +++++++++++++++----
 .../MeshEditing/DuplicateMeshComponents.cpp   |  4 +-
 MeshLib/MeshSearch/NodeSearch.cpp             |  2 +-
 5 files changed, 41 insertions(+), 14 deletions(-)

diff --git a/MeshLib/ElementStatus.cpp b/MeshLib/ElementStatus.cpp
index 099374ef90d..924f9808bcd 100644
--- a/MeshLib/ElementStatus.cpp
+++ b/MeshLib/ElementStatus.cpp
@@ -113,7 +113,7 @@ void ElementStatus::setElementStatus(std::size_t i, bool status)
     {
         const int change = (status) ? 1 : -1;
         _element_status[i] = status;
-        const unsigned nElemNodes (_mesh->getElement(i)->getNumberOfBaseNodes());
+        const unsigned nElemNodes (_mesh->getElement(i)->getNumberOfNodes());
         MeshLib::Node const*const*const nodes = _mesh->getElement(i)->getNodes();
         for (unsigned j=0; j<nElemNodes; ++j)
         {
diff --git a/MeshLib/Elements/Element.cpp b/MeshLib/Elements/Element.cpp
index 9bdb669fd51..28269387913 100644
--- a/MeshLib/Elements/Element.cpp
+++ b/MeshLib/Elements/Element.cpp
@@ -134,7 +134,7 @@ const Element* Element::getNeighbor(unsigned i) const
 
 unsigned Element::getNodeIDinElement(const MeshLib::Node* node) const
 {
-    const unsigned nNodes (this->getNumberOfBaseNodes());
+    const unsigned nNodes (this->getNumberOfNodes());
     for (unsigned i(0); i<nNodes; i++)
         if (node == _nodes[i])
             return i;
diff --git a/MeshLib/Mesh.cpp b/MeshLib/Mesh.cpp
index d87dcd9f6e7..81e2c9aa306 100644
--- a/MeshLib/Mesh.cpp
+++ b/MeshLib/Mesh.cpp
@@ -70,7 +70,7 @@ Mesh::Mesh(const Mesh &mesh)
     const std::size_t nElements (elements.size());
     for (unsigned i=0; i<nElements; ++i)
     {
-        const std::size_t nElemNodes = elements[i]->getNumberOfBaseNodes();
+        const std::size_t nElemNodes = elements[i]->getNumberOfNodes();
         _elements[i] = elements[i]->clone();
         for (unsigned j=0; j<nElemNodes; ++j)
             _elements[i]->_nodes[j] = _nodes[elements[i]->getNode(j)->getID()];
@@ -104,7 +104,7 @@ void Mesh::addElement(Element* elem)
     _elements.push_back(elem);
 
     // add element information to nodes
-    unsigned nNodes (elem->getNumberOfBaseNodes());
+    unsigned nNodes (elem->getNumberOfNodes());
     for (unsigned i=0; i<nNodes; ++i)
         elem->_nodes[i]->addElement(elem);
 }
@@ -144,7 +144,7 @@ void Mesh::setElementsConnectedToNodes()
 {
     for (auto e = _elements.begin(); e != _elements.end(); ++e)
     {
-        const unsigned nNodes ((*e)->getNumberOfBaseNodes());
+        const unsigned nNodes ((*e)->getNumberOfNodes());
         for (unsigned j=0; j<nNodes; ++j)
             (*e)->_nodes[j]->addElement(*e);
     }
@@ -215,18 +215,45 @@ void Mesh::setNodesConnectedByEdges()
         const std::size_t nConnElems (conn_elems.size());
         for (unsigned j=0; j<nConnElems; ++j)
         {
-            const unsigned idx (conn_elems[j]->getNodeIDinElement(node));
-            const unsigned nElemNodes (conn_elems[j]->getNumberOfBaseNodes());
+            MeshLib::Element* conn_ele = conn_elems[j];
+            const unsigned idx (conn_ele->getNodeIDinElement(node));
+            const unsigned nElemNodes (conn_ele->getNumberOfBaseNodes());
             for (unsigned k(0); k<nElemNodes; ++k)
             {
+                MeshLib::Node const* node_k = conn_ele->getNode(k);
                 bool is_in_vector (false);
                 const std::size_t nConnNodes (conn_set.size());
                 for (unsigned l(0); l<nConnNodes; ++l)
-                    if (conn_elems[j]->getNode(k) == conn_set[l])
+                    if (node_k == conn_set[l])
                         is_in_vector = true;
                 if (is_in_vector) continue;
-                if (conn_elems[j]->isEdge(idx, k)) //TODO doesn't work with higher order nodes
-                    conn_set.push_back(_nodes[conn_elems[j]->getNode(k)->getID()]);
+
+                if (conn_ele->getNumberOfBaseNodes() == conn_ele->getNumberOfNodes())
+                {
+                    if (conn_ele->isEdge(idx, k))
+                        conn_set.push_back(const_cast<MeshLib::Node*>(node_k));
+                }
+                else
+                {
+                    for (unsigned l=0; l<conn_ele->getNumberOfEdges(); l++)
+                    {
+                        std::unique_ptr<Element const> edge(conn_ele->getEdge(l));
+                        unsigned match = 0;
+                        for (unsigned m=0; m<edge->getNumberOfBaseNodes(); m++)
+                        {
+                            auto edge_node = edge->getNode(m);
+                            if (edge_node == node || edge_node == node_k)
+                                match++;
+                        }
+                        if (match != 2)
+                            continue;
+                        conn_set.push_back(const_cast<MeshLib::Node*>(node_k));
+                        for (unsigned m=edge->getNumberOfBaseNodes(); m<edge->getNumberOfNodes(); m++)
+                            conn_set.push_back(const_cast<MeshLib::Node*>(edge->getNode(m)));
+                        break;
+                    }
+                }
+
             }
         }
         node->setConnectedNodes(conn_set);
@@ -248,7 +275,7 @@ void Mesh::setNodesConnectedByElements()
         for (Element const* const element : conn_elems)
         {
             Node* const* const single_elem_nodes = element->getNodes();
-            std::size_t const nnodes = element->getNumberOfBaseNodes();
+            std::size_t const nnodes = element->getNumberOfNodes();
             for (std::size_t n = 0; n < nnodes; n++)
                 adjacent_nodes.push_back(single_elem_nodes[n]);
         }
diff --git a/MeshLib/MeshEditing/DuplicateMeshComponents.cpp b/MeshLib/MeshEditing/DuplicateMeshComponents.cpp
index 73503468cff..fa3352d5fe8 100644
--- a/MeshLib/MeshEditing/DuplicateMeshComponents.cpp
+++ b/MeshLib/MeshEditing/DuplicateMeshComponents.cpp
@@ -64,8 +64,8 @@ MeshLib::Element* copyElement(MeshLib::Element const*const element, const std::v
 template <typename E>
 MeshLib::Element* copyElement(MeshLib::Element const*const element, const std::vector<MeshLib::Node*> &nodes)
 {
-    MeshLib::Node** new_nodes = new MeshLib::Node*[element->getNumberOfBaseNodes()];
-    for (unsigned i=0; i<element->getNumberOfBaseNodes(); ++i)
+    MeshLib::Node** new_nodes = new MeshLib::Node*[element->getNumberOfNodes()];
+    for (unsigned i=0; i<element->getNumberOfNodes(); ++i)
         new_nodes[i] = nodes[element->getNode(i)->getID()];
     return new E(new_nodes);
 }
diff --git a/MeshLib/MeshSearch/NodeSearch.cpp b/MeshLib/MeshSearch/NodeSearch.cpp
index 5bffe4d8cbb..716c2537611 100644
--- a/MeshLib/MeshSearch/NodeSearch.cpp
+++ b/MeshLib/MeshSearch/NodeSearch.cpp
@@ -36,7 +36,7 @@ std::size_t NodeSearch::searchNodesConnectedToOnlyGivenElements(
     for(std::size_t eid : elements)
     {
         auto* e = _mesh.getElement(eid);
-        for (unsigned i=0; i<e->getNumberOfBaseNodes(); i++) {
+        for (unsigned i=0; i<e->getNumberOfNodes(); i++) {
             node_marked_counts[e->getNodeIndex(i)]++;
         }
     }
-- 
GitLab