From 0424272874845111f62cf73bfa238b65be8996cd Mon Sep 17 00:00:00 2001
From: Thomas Fischer <thomas.fischer@ufz.de>
Date: Thu, 5 Aug 2021 09:41:46 +0200
Subject: [PATCH] [MeL] Make getNodeIDinElement a free function.

---
 MeshLib/Elements/Element.cpp         |  26 +++----
 MeshLib/Elements/Element.h           |   6 +-
 MeshLib/MeshEditing/MeshRevision.cpp | 104 ++++++++++++++-------------
 MeshLib/Node.cpp                     |   2 +-
 4 files changed, 71 insertions(+), 67 deletions(-)

diff --git a/MeshLib/Elements/Element.cpp b/MeshLib/Elements/Element.cpp
index 95490314afb..da7506ef581 100644
--- a/MeshLib/Elements/Element.cpp
+++ b/MeshLib/Elements/Element.cpp
@@ -96,19 +96,6 @@ const Element* Element::getNeighbor(unsigned i) const
 #endif
 }
 
-unsigned Element::getNodeIDinElement(const MeshLib::Node* node) const
-{
-    const unsigned nNodes(this->getNumberOfNodes());
-    for (unsigned i(0); i < nNodes; i++)
-    {
-        if (node == _nodes[i])
-        {
-            return i;
-        }
-    }
-    return std::numeric_limits<unsigned>::max();
-}
-
 const Node* Element::getNode(unsigned i) const
 {
 #ifndef NDEBUG
@@ -278,4 +265,17 @@ bool isPointInElementXY(MathLib::Point3d const& p, Element const& e)
          MeshLib::MeshElemType2String(e.getGeomType()));
     return false;
 }
+
+unsigned getNodeIDinElement(Element const& element, const MeshLib::Node* node)
+{
+    const unsigned nNodes(element.getNumberOfNodes());
+    for (unsigned i(0); i < nNodes; i++)
+    {
+        if (node == element.getNode(i))
+        {
+            return i;
+        }
+    }
+    return std::numeric_limits<unsigned>::max();
+}
 }  // namespace MeshLib
diff --git a/MeshLib/Elements/Element.h b/MeshLib/Elements/Element.h
index a9df40b120c..791a7fab9bf 100644
--- a/MeshLib/Elements/Element.h
+++ b/MeshLib/Elements/Element.h
@@ -102,9 +102,6 @@ public:
     /// Returns the number of all nodes including both linear and nonlinear nodes
     virtual unsigned getNumberOfNodes() const = 0;
 
-    /// Returns the position of the given node in the node array of this element.
-    virtual unsigned getNodeIDinElement(const MeshLib::Node* node) const;
-
     /**
      * Get the global index for the Node with local index i.
      * The index i should be at most the number of nodes of the element.
@@ -232,4 +229,7 @@ std::pair<double, double> computeSqrEdgeLengthRange(Element const& element);
 /// @return true if the \f$p' \in e'\f$ and false if \f$p' \notin e'\f$
 bool isPointInElementXY(MathLib::Point3d const& p, Element const& e);
 
+/// Returns the position of the given node in the node array of this element.
+unsigned getNodeIDinElement(Element const& element, const Node* node);
+
 }  // namespace MeshLib
diff --git a/MeshLib/MeshEditing/MeshRevision.cpp b/MeshLib/MeshEditing/MeshRevision.cpp
index f4c73f85bd4..4b1ae1b9b7e 100644
--- a/MeshLib/MeshEditing/MeshRevision.cpp
+++ b/MeshLib/MeshEditing/MeshRevision.cpp
@@ -556,36 +556,38 @@ unsigned MeshRevision::reduceHex(MeshLib::Element const* const org_elem,
                 face->getNode(2)->getID() == face->getNode(3)->getID())
             {
                 auto** prism_nodes = new MeshLib::Node*[6];
-                prism_nodes[0] = nodes[org_elem
-                                           ->getNode(this->lutHexDiametralNode(
-                                               org_elem->getNodeIDinElement(
-                                                   face->getNode(0))))
-                                           ->getID()];
-                prism_nodes[1] = nodes[org_elem
-                                           ->getNode(this->lutHexDiametralNode(
-                                               org_elem->getNodeIDinElement(
-                                                   face->getNode(1))))
-                                           ->getID()];
-                prism_nodes[2] =
+                prism_nodes[0] =
                     nodes[org_elem
-                              ->getNode(org_elem->getNodeIDinElement(
-                                  face->getNode(2)))
+                              ->getNode(
+                                  this->lutHexDiametralNode(getNodeIDinElement(
+                                      *org_elem, face->getNode(0))))
                               ->getID()];
-                prism_nodes[3] = nodes[org_elem
-                                           ->getNode(this->lutHexDiametralNode(
-                                               org_elem->getNodeIDinElement(
-                                                   face->getNode(2))))
-                                           ->getID()];
-                prism_nodes[4] = nodes[org_elem
-                                           ->getNode(this->lutHexDiametralNode(
-                                               org_elem->getNodeIDinElement(
-                                                   face->getNode(3))))
+                prism_nodes[1] =
+                    nodes[org_elem
+                              ->getNode(
+                                  this->lutHexDiametralNode(getNodeIDinElement(
+                                      *org_elem, face->getNode(1))))
+                              ->getID()];
+                prism_nodes[2] = nodes[org_elem
+                                           ->getNode(getNodeIDinElement(
+                                               *org_elem, face->getNode(2)))
                                            ->getID()];
-                prism_nodes[5] =
+                prism_nodes[3] =
+                    nodes[org_elem
+                              ->getNode(
+                                  this->lutHexDiametralNode(getNodeIDinElement(
+                                      *org_elem, face->getNode(2))))
+                              ->getID()];
+                prism_nodes[4] =
                     nodes[org_elem
-                              ->getNode(org_elem->getNodeIDinElement(
-                                  face->getNode(0)))
+                              ->getNode(
+                                  this->lutHexDiametralNode(getNodeIDinElement(
+                                      *org_elem, face->getNode(3))))
                               ->getID()];
+                prism_nodes[5] = nodes[org_elem
+                                           ->getNode(getNodeIDinElement(
+                                               *org_elem, face->getNode(0)))
+                                           ->getID()];
                 new_elements.push_back(new MeshLib::Prism(prism_nodes));
                 delete face;
                 return 1;
@@ -594,36 +596,38 @@ unsigned MeshRevision::reduceHex(MeshLib::Element const* const org_elem,
                 face->getNode(1)->getID() == face->getNode(2)->getID())
             {
                 auto** prism_nodes = new MeshLib::Node*[6];
-                prism_nodes[0] = nodes[org_elem
-                                           ->getNode(this->lutHexDiametralNode(
-                                               org_elem->getNodeIDinElement(
-                                                   face->getNode(0))))
-                                           ->getID()];
-                prism_nodes[1] = nodes[org_elem
-                                           ->getNode(this->lutHexDiametralNode(
-                                               org_elem->getNodeIDinElement(
-                                                   face->getNode(3))))
-                                           ->getID()];
-                prism_nodes[2] =
+                prism_nodes[0] =
                     nodes[org_elem
-                              ->getNode(org_elem->getNodeIDinElement(
-                                  face->getNode(2)))
+                              ->getNode(
+                                  this->lutHexDiametralNode(getNodeIDinElement(
+                                      *org_elem, face->getNode(0))))
                               ->getID()];
-                prism_nodes[3] = nodes[org_elem
-                                           ->getNode(this->lutHexDiametralNode(
-                                               org_elem->getNodeIDinElement(
-                                                   face->getNode(1))))
-                                           ->getID()];
-                prism_nodes[4] = nodes[org_elem
-                                           ->getNode(this->lutHexDiametralNode(
-                                               org_elem->getNodeIDinElement(
-                                                   face->getNode(2))))
+                prism_nodes[1] =
+                    nodes[org_elem
+                              ->getNode(
+                                  this->lutHexDiametralNode(getNodeIDinElement(
+                                      *org_elem, face->getNode(3))))
+                              ->getID()];
+                prism_nodes[2] = nodes[org_elem
+                                           ->getNode(getNodeIDinElement(
+                                               *org_elem, face->getNode(2)))
                                            ->getID()];
-                prism_nodes[5] =
+                prism_nodes[3] =
+                    nodes[org_elem
+                              ->getNode(
+                                  this->lutHexDiametralNode(getNodeIDinElement(
+                                      *org_elem, face->getNode(1))))
+                              ->getID()];
+                prism_nodes[4] =
                     nodes[org_elem
-                              ->getNode(org_elem->getNodeIDinElement(
-                                  face->getNode(0)))
+                              ->getNode(
+                                  this->lutHexDiametralNode(getNodeIDinElement(
+                                      *org_elem, face->getNode(2))))
                               ->getID()];
+                prism_nodes[5] = nodes[org_elem
+                                           ->getNode(getNodeIDinElement(
+                                               *org_elem, face->getNode(0)))
+                                           ->getID()];
                 new_elements.push_back(new MeshLib::Prism(prism_nodes));
                 delete face;
                 return 1;
diff --git a/MeshLib/Node.cpp b/MeshLib/Node.cpp
index 1795cff0315..54d11e09de0 100644
--- a/MeshLib/Node.cpp
+++ b/MeshLib/Node.cpp
@@ -61,7 +61,7 @@ bool isBaseNode(Node const& node)
     auto const e = node.getElement(0);
 
     auto const n_base_nodes = e->getNumberOfBaseNodes();
-    auto const local_index = e->getNodeIDinElement(&node);
+    auto const local_index = getNodeIDinElement(*e, &node);
     return local_index < n_base_nodes;
 }
 }  // namespace MeshLib
-- 
GitLab