10#include "gtest/gtest.h"
14#include "libmesh/mesh_generation.h"
15#include "libmesh/replicated_mesh.h"
17std::unique_ptr<UnstructuredMesh>
20 Parallel::Communicator comm;
21 std::unique_ptr<UnstructuredMesh>
mesh = std::make_unique<ReplicatedMesh>(comm);
23 const unsigned int n = 2;
26 switch ((ElemType)type)
31 MeshTools::Generation::build_line(*
mesh, n, min, max, (ElemType)type);
39 MeshTools::Generation::build_square(*
mesh, n, n, min, max, min, max, (ElemType)type);
53 MeshTools::Generation::build_cube(
54 *
mesh, n, n, n, min, max, min, max, min, max, (ElemType)type);
61 mesh->prepare_for_use();
66TEST(TraceRayToolsTest, withinEdge)
75 if (
mesh->mesh_dimension() != 3)
78 for (
const auto elem :
mesh->element_ptr_range())
80 for (
const auto e : elem->edge_index_range())
85 EXPECT_TRUE(extrema.
atEdge(elem->nodes_on_edge(e)[0], elem->nodes_on_edge(e)[1]));
87 for (
const auto n : elem->node_index_range())
88 if (elem->is_vertex(n))
93 bool extrema_correct =
false;
94 for (
const auto e : elem->edge_index_range())
95 if (!extrema_correct && elem->is_node_on_edge(n, e))
97 extrema.
atEdge(elem->nodes_on_edge(e)[0], elem->nodes_on_edge(e)[1]);
98 EXPECT_TRUE(extrema_correct);
104TEST(TraceRayToolsTest, withinEdgeOnSide)
113 if (
mesh->mesh_dimension() != 3)
116 for (
const auto elem :
mesh->element_ptr_range())
118 for (
const auto s : elem->side_index_range())
122 elem, elem->build_side_ptr(s)->vertex_average(), s, extrema));
125 for (
const auto e : elem->edge_index_range())
126 if (elem->is_edge_on_side(e, s))
130 elem, elem->build_edge_ptr(e)->vertex_average(), s, extrema));
133 for (
const auto n : elem->node_index_range())
134 if (elem->is_vertex(n))
135 for (
const auto s : elem->side_index_range())
136 if (elem->is_node_on_side(n, s))
141 bool extrema_correct =
false;
142 for (
const auto e : elem->edge_index_range())
143 if (!extrema_correct && elem->is_node_on_edge(n, e))
145 extrema.
atEdge(elem->nodes_on_edge(e)[0], elem->nodes_on_edge(e)[1]);
146 EXPECT_TRUE(extrema_correct);
152TEST(TraceRayToolsTest, atVertex)
159 for (
const auto elem :
mesh->element_ptr_range())
163 for (
const auto n : elem->node_index_range())
164 if (elem->is_vertex(n))
172TEST(TraceRayToolsTest, atVertexOnSide)
179 for (
const auto elem :
mesh->element_ptr_range())
180 for (
const auto s : elem->side_index_range())
189 for (
const auto n : elem->nodes_on_side(s))
190 if (elem->is_vertex(n))
198TEST(TraceRayToolsTest, findPointNeighbors)
203 std::vector<const Elem *> active_neighbor_children;
204 std::vector<NeighborInfo> neighbor_info;
205 std::set<const Elem *> libmesh_neighbor_set;
212 for (
const auto elem :
mesh->element_ptr_range())
214 for (
const auto n : elem->node_index_range())
219 neighbor_untested_set,
220 neighbor_next_untested_set,
221 active_neighbor_children,
223 elem->find_point_neighbors(elem->point(n), libmesh_neighbor_set);
224 for (
const auto & info : neighbor_info)
226 for (
const auto s : info._sides)
227 EXPECT_TRUE(info._elem->build_side_ptr(s)->contains_point(elem->point(n)));
228 EXPECT_TRUE(libmesh_neighbor_set.count(info._elem));
232 for (
const auto s : elem->side_index_range())
234 const auto centroid = elem->build_side_ptr(s)->vertex_average();
238 neighbor_untested_set,
239 neighbor_next_untested_set,
240 active_neighbor_children,
242 elem->find_point_neighbors(centroid, libmesh_neighbor_set);
243 for (
const auto & info : neighbor_info)
245 for (
const auto other_s : info._sides)
246 EXPECT_TRUE(info._elem->build_side_ptr(other_s)->contains_point(centroid));
247 EXPECT_TRUE(libmesh_neighbor_set.count(info._elem));
251 if (elem->dim() == 3)
252 for (
const auto e : elem->edge_index_range())
254 const auto centroid = elem->build_edge_ptr(e)->vertex_average();
258 neighbor_untested_set,
259 neighbor_next_untested_set,
260 active_neighbor_children,
262 elem->find_point_neighbors(centroid, libmesh_neighbor_set);
263 for (
const auto & info : neighbor_info)
265 for (
const auto s : info._sides)
266 EXPECT_TRUE(info._elem->build_side_ptr(s)->contains_point(centroid));
267 EXPECT_TRUE(libmesh_neighbor_set.count(info._elem));
274TEST(TraceRayToolsTest, isWithinSegment)
static const unsigned short invalid_vertex
Identifier for an invalid vertex index.
Helper for defining if at an element's edge, vertex, or neither.
void invalidate()
Invalidates the current state.