From d89ae2b8dc57b79069efb83b0eb6d58765dbab45 Mon Sep 17 00:00:00 2001
From: Dmitri Naumov <dmitri.naumov@ufz.de>
Date: Thu, 4 Jan 2018 15:36:49 +0100
Subject: [PATCH] [T/MeL] Add Hex20 boundary element searcher test.

---
 Tests/MeshLib/TestBoundaryElementSearch.cpp | 75 +++++++++++++++++++--
 1 file changed, 70 insertions(+), 5 deletions(-)

diff --git a/Tests/MeshLib/TestBoundaryElementSearch.cpp b/Tests/MeshLib/TestBoundaryElementSearch.cpp
index 91f74113486..679e2302a6f 100644
--- a/Tests/MeshLib/TestBoundaryElementSearch.cpp
+++ b/Tests/MeshLib/TestBoundaryElementSearch.cpp
@@ -14,14 +14,15 @@
 #include "GeoLib/Polyline.h"
 #include "GeoLib/Surface.h"
 
-#include "MeshLib/Mesh.h"
-#include "MeshLib/Node.h"
+#include "MeshGeoToolsLib/BoundaryElementsSearcher.h"
+#include "MeshGeoToolsLib/HeuristicSearchLength.h"
+#include "MeshGeoToolsLib/MeshNodeSearcher.h"
 #include "MeshLib/Elements/Element.h"
+#include "MeshLib/Mesh.h"
 #include "MeshLib/MeshGenerators/MeshGenerator.h"
+#include "MeshLib/MeshGenerators/QuadraticMeshGenerator.h"
 #include "MeshLib/MeshSearch/NodeSearch.h"
-#include "MeshGeoToolsLib/MeshNodeSearcher.h"
-#include "MeshGeoToolsLib/HeuristicSearchLength.h"
-#include "MeshGeoToolsLib/BoundaryElementsSearcher.h"
+#include "MeshLib/Node.h"
 
 using namespace MeshLib;
 
@@ -175,3 +176,67 @@ TEST_F(MeshLibBoundaryElementSearchInSimpleHexMesh, SurfaceSearch)
         delete p;
 }
 
+// This is identical to the above
+// MeshLibBoundaryElementSearchInSimpleHexMesh.SurfaceSearch test but creates a
+// quadratic mesh from the original hex mesh.
+TEST_F(MeshLibBoundaryElementSearchInSimpleHexMesh, QuadElementsSurfaceSearch)
+{
+    ASSERT_TRUE(_hex_mesh != nullptr);
+    auto mesh = MeshLib::createQuadraticOrderMesh(*_hex_mesh);
+
+    const std::size_t& s = _number_of_subdivisions_per_direction;
+    const std::size_t n_nodes_2d = (s + 1) * (3 * s + 1);
+    const std::size_t n_eles_2d = s * s;
+
+    // create bottom and front surfaces of a cubic
+    std::vector<GeoLib::Point*> pnts;
+    pnts.push_back(new GeoLib::Point(0.0, 0.0, 0.0));
+    pnts.push_back(new GeoLib::Point(_geometric_size, 0.0, 0.0));
+    pnts.push_back(new GeoLib::Point(_geometric_size, _geometric_size, 0.0));
+    pnts.push_back(new GeoLib::Point(0.0, _geometric_size, 0.0));
+    pnts.push_back(new GeoLib::Point(_geometric_size, 0.0, _geometric_size));
+    pnts.push_back(new GeoLib::Point(0.0, 0.0, _geometric_size));
+
+    GeoLib::Surface sfc_bottom(pnts);
+    sfc_bottom.addTriangle(0, 1, 2);
+    sfc_bottom.addTriangle(0, 2, 3);
+
+    GeoLib::Surface sfc_front(pnts);
+    sfc_front.addTriangle(0, 1, 4);
+    sfc_front.addTriangle(0, 4, 5);
+
+    // perform search on the bottom surface
+    MeshGeoToolsLib::MeshNodeSearcher mesh_node_searcher(
+        *mesh,
+        std::make_unique<MeshGeoToolsLib::SearchLength>(),
+        MeshGeoToolsLib::SearchAllNodes::Yes);
+    MeshGeoToolsLib::BoundaryElementsSearcher boundary_element_searcher(
+        *mesh, mesh_node_searcher);
+    std::vector<MeshLib::Element*> const& found_faces_sfc_b(
+        boundary_element_searcher.getBoundaryElements(sfc_bottom));
+    ASSERT_EQ(n_eles_2d, found_faces_sfc_b.size());
+    double sum_area_b = std::accumulate(
+        found_faces_sfc_b.begin(), found_faces_sfc_b.end(), 0.0,
+        [](double v, MeshLib::Element* e) { return v + e->getContent(); });
+    ASSERT_EQ(_geometric_size*_geometric_size, sum_area_b);
+    auto connected_nodes_b = MeshLib::getUniqueNodes(found_faces_sfc_b);
+    ASSERT_EQ(n_nodes_2d, connected_nodes_b.size());
+    for (auto node : connected_nodes_b)
+        ASSERT_EQ(0.0, (*node)[2]); // check z coordinates
+
+    // perform search on the front surface
+    std::vector<MeshLib::Element*> const& found_faces_sfc_f(
+        boundary_element_searcher.getBoundaryElements(sfc_front));
+    ASSERT_EQ(n_eles_2d, found_faces_sfc_f.size());
+    double sum_area_f = std::accumulate(
+        found_faces_sfc_f.begin(), found_faces_sfc_f.end(), 0.0,
+        [](double v, MeshLib::Element* e) { return v + e->getContent(); });
+    ASSERT_EQ(_geometric_size*_geometric_size, sum_area_f);
+    auto connected_nodes_f = MeshLib::getUniqueNodes(found_faces_sfc_f);
+    ASSERT_EQ(n_nodes_2d, connected_nodes_f.size());
+    for (auto node : connected_nodes_f)
+        ASSERT_EQ(0.0, (*node)[1]); // check y coordinates
+
+    for (auto p : pnts)
+        delete p;
+}
-- 
GitLab