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