23{
24 Parallel::Communicator comm(MPI_COMM_SELF);
25 auto mesh = std::make_unique<libMesh::SerialMesh>(comm);
26
27 Node * n0 =
mesh->add_point(Point(0.0, 0.0, 0.0), 0);
28 Node * n1 =
mesh->add_point(Point(1.0, 0.0, 0.0), 1);
29 Node * n2 =
mesh->add_point(Point(1.0, 1.0, 0.0), 2);
30 Node * n3 =
mesh->add_point(Point(0.0, 1.0, 0.0), 3);
31
32 auto quad = new Quad4();
33 quad->set_node(0, n0);
34 quad->set_node(1, n1);
35 quad->set_node(2, n2);
36 quad->set_node(3, n3);
37 const Elem * elem =
mesh->add_elem(quad);
38
39 mesh->prepare_for_use();
40
41 const auto all_active = [](const Point &) { return true; };
42 const auto none_active = [](const Point &) { return false; };
43 const auto left_half = [](
const Point &
p) {
return p(0) < 0.5; };
44
45
49
51 EXPECT_TRUE(fully_occupied.all_nodes_in_domain);
52 EXPECT_FALSE(fully_occupied.all_nodes_outside_domain);
53 EXPECT_NEAR(fully_occupied.fraction_of_element_in_domain, 1.0, 1e-12);
54
56 EXPECT_FALSE(unoccupied.all_nodes_in_domain);
57 EXPECT_TRUE(unoccupied.all_nodes_outside_domain);
58 EXPECT_NEAR(unoccupied.fraction_of_element_in_domain, 0.0, 1e-12);
59
61 EXPECT_FALSE(partially_occupied.all_nodes_in_domain);
62 EXPECT_FALSE(partially_occupied.all_nodes_outside_domain);
63 EXPECT_NEAR(partially_occupied.fraction_of_element_in_domain, 0.5, 1e-12);
64}
ElementDomainOccupancy elementDomainOccupancy(const Elem &elem, Order qrule_order, const std::function< bool(const libMesh::Point &)> &is_in_domain)
Test an element against the domain defined by is_in_domain.
Real activeElementFraction(const Elem &elem, Order qrule_order, const std::function< bool(const libMesh::Point &)> &is_active)
Compute the fraction of an element's quadrature-weighted measure satisfying a predicate.