From 487d2b2757b81b6dce9ac13426df528014982216 Mon Sep 17 00:00:00 2001
From: Karsten Rink <karsten.rink@ufz.de>
Date: Wed, 24 Sep 2014 17:26:15 +0200
Subject: [PATCH] added method to test if element is located on boundary

---
 MeshLib/Elements/Element.cpp   | 5 +++++
 MeshLib/Elements/Element.h     | 2 ++
 Tests/MeshLib/TestQuadMesh.cpp | 3 +++
 3 files changed, 10 insertions(+)

diff --git a/MeshLib/Elements/Element.cpp b/MeshLib/Elements/Element.cpp
index 8356657fd48..b24473e05a7 100644
--- a/MeshLib/Elements/Element.cpp
+++ b/MeshLib/Elements/Element.cpp
@@ -163,6 +163,11 @@ bool Element::hasNeighbor(Element* elem) const
 	return false;
 }
 
+bool Element::isBoundaryElement() const
+{
+    return std::any_of(_neighbors, _neighbors + this->getNNeighbors(), 
+        [](MeshLib::Element* e){ return e == nullptr; });
+}
 
 }
 
diff --git a/MeshLib/Elements/Element.h b/MeshLib/Elements/Element.h
index 7e10f07e404..6e2dd800376 100644
--- a/MeshLib/Elements/Element.h
+++ b/MeshLib/Elements/Element.h
@@ -148,6 +148,8 @@ public:
 	 */
 	bool hasZeroVolume() const { return this->getContent() < std::numeric_limits<double>::epsilon(); }
 
+	/// Returns true if the element is located at a boundary (i.e. has at least one face without neighbour)
+	virtual bool isBoundaryElement() const;
 
 	/// Returns true if these two indeces form an edge and false otherwise
 	virtual bool isEdge(unsigned i, unsigned j) const = 0;
diff --git a/Tests/MeshLib/TestQuadMesh.cpp b/Tests/MeshLib/TestQuadMesh.cpp
index 1d7ed02eac0..20cfc94c82f 100644
--- a/Tests/MeshLib/TestQuadMesh.cpp
+++ b/Tests/MeshLib/TestQuadMesh.cpp
@@ -209,6 +209,7 @@ TEST_F(MeshLibQuadMesh, ElementNeighbors)
             // Test the test
             EXPECT_EQ(1u, ij_neighbors.first.size());
             EXPECT_EQ(1u, ij_neighbors.second.size());
+            ASSERT_TRUE(e->isBoundaryElement());
 
             testNeighbors(e, i, j, ij_neighbors);
         });
@@ -222,6 +223,7 @@ TEST_F(MeshLibQuadMesh, ElementNeighbors)
             std::pair<Indices, Indices> const ij_neighbors = getNeighborIndices(i, j);
             // Test the test
             EXPECT_EQ(3u, ij_neighbors.first.size() + ij_neighbors.second.size());
+            ASSERT_TRUE(e->isBoundaryElement());
 
             testNeighbors(e, i, j, ij_neighbors);
         });
@@ -236,6 +238,7 @@ TEST_F(MeshLibQuadMesh, ElementNeighbors)
             // Test the test
             EXPECT_EQ(2u, ij_neighbors.first.size());
             EXPECT_EQ(2u, ij_neighbors.second.size());
+            ASSERT_FALSE(e->isBoundaryElement());
 
             testNeighbors(e, i, j, ij_neighbors);
         });
-- 
GitLab