diff --git a/Tests/MeshLib/TestQuadraticMesh.cpp b/Tests/MeshLib/TestQuadraticMesh.cpp index 33c13a64c11f046830e5e0da81f3f92680885010..96cc2f7061da833abfe0c33c0f997ee62fac666f 100644 --- a/Tests/MeshLib/TestQuadraticMesh.cpp +++ b/Tests/MeshLib/TestQuadraticMesh.cpp @@ -9,12 +9,14 @@ #include <gtest/gtest.h> +#include <limits> #include <memory> #include "GeoLib/Polyline.h" #include "GeoLib/PolylineVec.h" #include "MeshGeoToolsLib/AppendLinesAlongPolyline.h" #include "MeshLib/Elements/Element.h" +#include "MeshLib/Elements/Pyramid.h" #include "MeshLib/Mesh.h" #include "MeshLib/MeshGenerators/MeshGenerator.h" #include "MeshLib/MeshGenerators/QuadraticMeshGenerator.h" @@ -330,3 +332,56 @@ TEST(MeshLib, QuadraticOrderMesh_LineQuad) (connections[n->getID()].size() == 13); })); } + +TEST(MeshLib, QuadraticOrderMesh_Pyramid) +{ + // Note the memory allocated for nodes and elements are released in the + // destructor of Mesh. + std::vector<MeshLib::Node*> nodes{ + // nodes on base + new MeshLib::Node(0.0, 0.0, 0.5), new MeshLib::Node(0.0, 0.0, 0.0), + new MeshLib::Node(0.0, 0.5, 0.0), new MeshLib::Node(0.0, 0.5, 0.5), + // node at the top + new MeshLib::Node(0.25, 0.25, 0.25)}; + + // Element(Node* nodes, ...) deletes nodes. Copy nodes entries to + // std::array<MeshLib::Node*> to call Element(std::array<MeshLib::Node*>, + // ...). + std::array<MeshLib::Node*, 5> pyramid_element_nodes; + std::copy_n(nodes.begin(), 5, pyramid_element_nodes.begin()); + + std::vector<MeshLib::Element*> elements{ + new MeshLib::Pyramid(pyramid_element_nodes)}; + MeshLib::Mesh mesh("test_mesh", nodes, elements); + + auto const quadratic_mesh = + MeshLib::createQuadraticOrderMesh(mesh, false /* add centre node*/); + + auto const quadratic_element = quadratic_mesh->getElement(0); + + double const tol = std::numeric_limits<double>::epsilon(); + // Compare vertex nodes + for (std::size_t i = 0; i < nodes.size(); i++) + { + auto const x = nodes[i]->data(); + auto const x_q = quadratic_element->getNode(i)->data(); + for (int j = 0; j < 3; j++) + { + ASSERT_NEAR(x[j], x_q[j], tol); + } + } + + // Compare edge nodes: + auto const nodes_q = quadratic_element->getNodes(); + for (int i = 0; i < 8; i++) + { + auto const edge_node_ids = MeshLib::PyramidRule13::edge_nodes[i]; + auto const x_vertex_a = nodes[edge_node_ids[0]]->data(); + auto const x_vertex_b = nodes[edge_node_ids[1]]->data(); + auto const x_edge = nodes_q[edge_node_ids[2]]->data(); + for (int j = 0; j < 3; j++) + { + ASSERT_NEAR(0.5 * (x_vertex_a[j] + x_vertex_b[j]), x_edge[j], tol); + } + } +}