From 34590cc72f68a62289f715ea004adee27a52d643 Mon Sep 17 00:00:00 2001 From: Thomas Fischer <thomas.fischer@ufz.de> Date: Fri, 17 Apr 2020 11:58:12 +0200 Subject: [PATCH] [T/MeL] Add test for mesh generator for pyramid elements. --- Tests/MeshLib/TestMeshGenerator.cpp | 59 +++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/Tests/MeshLib/TestMeshGenerator.cpp b/Tests/MeshLib/TestMeshGenerator.cpp index 8c83dce7f86..5c8001450cf 100644 --- a/Tests/MeshLib/TestMeshGenerator.cpp +++ b/Tests/MeshLib/TestMeshGenerator.cpp @@ -141,3 +141,62 @@ TEST(MeshLib, MeshGeneratorRegularPrism) } } } + +TEST(MeshLib, MeshGeneratorRegularPyramid) +{ + const double L = 10.0; + const std::size_t n_subdivisions = 9; + const double dL = L / static_cast<double>(n_subdivisions); + std::vector<std::unique_ptr<BaseLib::ISubdivision>> vec_div; + vec_div.reserve(3); + for (unsigned i=0; i<3; i++) + { + vec_div.emplace_back( + new BaseLib::UniformSubdivision(L, n_subdivisions)); + } + std::unique_ptr<Mesh> msh(MeshGenerator::generateRegularPyramidMesh( + *vec_div[0], *vec_div[1], *vec_div[2])); + + // check number of generates nodes and elements + ASSERT_EQ(6 * std::pow(n_subdivisions, 3), msh->getNumberOfElements()); + ASSERT_EQ(std::pow(n_subdivisions + 1, 3) + std::pow(n_subdivisions, 3), + msh->getNumberOfNodes()); + + // check the positions of the diagonal edge nodes (lower left front and upper right back) + const Node& node0 = *msh->getNode(0); + const Node& node1 = *msh->getNode(1); + const Node& node_n = *msh->getNode(L*L*L-2); + const Node& node_n1 = *msh->getNode(L*L*L-1); + ASSERT_DOUBLE_EQ(.0, node0[0]); + ASSERT_DOUBLE_EQ(.0, node0[1]); + ASSERT_DOUBLE_EQ(.0, node0[2]); + ASSERT_DOUBLE_EQ(dL, node1[0]); + ASSERT_DOUBLE_EQ(.0, node1[1]); + ASSERT_DOUBLE_EQ(.0, node1[2]); + ASSERT_DOUBLE_EQ(L-dL, node_n[0]); + ASSERT_DOUBLE_EQ(L, node_n[1]); + ASSERT_DOUBLE_EQ(L, node_n[2]); + ASSERT_DOUBLE_EQ(L, node_n1[0]); + ASSERT_DOUBLE_EQ(L, node_n1[1]); + ASSERT_DOUBLE_EQ(L, node_n1[2]); + + // check if the domain volume equals the volume of the elements + long double element_volumes = 0.0; + for (auto const element : msh->getElements()) + { + element_volumes += element->computeVolume(); + } + EXPECT_NEAR(L*L*L, element_volumes, 1e-10); + + // test node order of the elements + for (auto const element : msh->getElements()) + { + ASSERT_TRUE(element->testElementNodeOrder()); + } + + // validate the elements + for (auto const element : msh->getElements()) + { + ASSERT_TRUE(element->validate().none()); + } +} -- GitLab