19void top_dimension_cofaces_tuples_vertex(
22 std::vector<Tuple>& collection)
24 assert(mesh.is_valid(t_in));
27 collection.emplace_back(t);
29 if (mesh.is_boundary_edge(t)) {
35 if (t == t_in && !mesh.is_boundary_edge(t)) {
39 t = mesh.switch_edge(t_in);
41 if (mesh.is_boundary_edge(t)) {
47 collection.emplace_back(t);
49 if (mesh.is_boundary_edge(t)) {
55void top_dimension_cofaces_tuples_edge(
58 std::vector<Tuple>& collection)
60 collection.emplace_back(t);
61 if (!mesh.is_boundary_edge(t)) {
62 collection.emplace_back(mesh.switch_face(t));
65void top_dimension_cofaces_tuples_face(
68 std::vector<Tuple>& collection)
70 collection.emplace_back(t);
73void top_dimension_cofaces_tuples_vertex(
76 std::vector<Tuple>& collection)
78 std::vector<int64_t> visited;
81 auto is_visited = [&visited](
const Tuple& t) ->
bool {
82 const int64_t c = t.global_cid();
83 for (
const int64_t v : visited) {
88 visited.emplace_back(c);
92 std::vector<Tuple> q(200);
97 while (q_front != q_back) {
98 const Tuple t = q[q_front++];
105 collection.emplace_back(t);
107 if (q_back + 4 >= q.size()) {
108 q.resize(q.size() * 1.5);
116 const Tuple t2 = mesh.switch_face(t);
119 if (!mesh.is_boundary_face(t1)) {
120 const Tuple ts = mesh.switch_tetrahedron(t1);
123 if (!mesh.is_boundary_face(t2)) {
124 const Tuple ts = mesh.switch_tetrahedron(t2);
127 if (!mesh.is_boundary_face(t3)) {
128 const Tuple ts = mesh.switch_tetrahedron(t3);
133void top_dimension_cofaces_tuples_edge(
136 std::vector<Tuple>& collection)
167 assert(mesh.is_valid(input));
170 collection.emplace_back(t);
172 if (mesh.is_boundary_face(t)) {
176 }
while (t != input);
178 if (t == input && !mesh.is_boundary_face(t)) {
184 if (mesh.is_boundary_face(mesh.switch_face(t))) {
191 collection.emplace_back(t);
193 if (mesh.is_boundary_face(mesh.switch_face(t))) {
216void top_dimension_cofaces_tuples_face(
219 std::vector<Tuple>& collection)
221 collection.emplace_back(input);
222 if (!mesh.is_boundary_face(input)) {
223 collection.emplace_back(mesh.switch_tetrahedron(input));
226void top_dimension_cofaces_tuples_tet(
229 std::vector<Tuple>& collection)
231 collection.emplace_back(t);
234std::vector<Tuple> top_dimension_cofaces_tuples_vertex(
const TriMesh& mesh,
const Tuple& t)
236 std::vector<Tuple> collection;
237 top_dimension_cofaces_tuples_vertex(mesh, t, collection);
240std::vector<Tuple> top_dimension_cofaces_tuples_edge(
const TriMesh& mesh,
const Tuple& t)
242 std::vector<Tuple> collection;
243 top_dimension_cofaces_tuples_edge(mesh, t, collection);
246std::vector<Tuple> top_dimension_cofaces_tuples_face(
const TriMesh& mesh,
const Tuple& t)
248 std::vector<Tuple> collection;
249 top_dimension_cofaces_tuples_face(mesh, t, collection);
253std::vector<Tuple> top_dimension_cofaces_tuples_vertex(
const TetMesh& mesh,
const Tuple& input)
255 std::vector<Tuple> collection;
256 top_dimension_cofaces_tuples_vertex(mesh, input, collection);
259std::vector<Tuple> top_dimension_cofaces_tuples_edge(
const TetMesh& mesh,
const Tuple& input)
261 std::vector<Tuple> collection;
262 top_dimension_cofaces_tuples_edge(mesh, input, collection);
265std::vector<Tuple> top_dimension_cofaces_tuples_face(
const TetMesh& mesh,
const Tuple& input)
267 std::vector<Tuple> collection;
268 top_dimension_cofaces_tuples_face(mesh, input, collection);
271std::vector<Tuple> top_dimension_cofaces_tuples_tet(
const TetMesh& mesh,
const Tuple& t)
273 std::vector<Tuple> collection;
274 top_dimension_cofaces_tuples_tet(mesh, t, collection);
284void top_dimension_cofaces_tuples_vertex(
287 SimplexCollection& collection)
289 assert(mesh.is_valid(t_in));
290 std::set<Tuple, wmtk::utils::TupleCellLessThan> touched_cells;
294 const Tuple t = q.front();
299 const auto [it, did_insert] = touched_cells.insert(t);
306 if (!mesh.is_boundary_edge(t)) {
307 q.push(mesh.switch_tuples(t, {PrimitiveType::Triangle, PrimitiveType::Edge}));
309 const Tuple t_other = mesh.switch_edge(t);
310 if (!mesh.is_boundary_edge(t_other)) {
311 q.push(mesh.switch_face(t_other));
315void top_dimension_cofaces_tuples_edge(
318 SimplexCollection& collection)
321 if (!mesh.is_boundary_edge(t)) {
325void top_dimension_cofaces_tuples_face(
328 SimplexCollection& collection)
333void top_dimension_cofaces_tuples_vertex(
336 SimplexCollection& collection)
338 std::set<Tuple, wmtk::utils::TupleCellLessThan> touched_cells;
342 const Tuple t = q.front();
347 const auto& [it, was_inserted] = touched_cells.insert(t);
356 const Tuple t2 = mesh.switch_face(t);
359 if (!mesh.is_boundary_face(t1)) {
360 q.push(mesh.switch_tetrahedron(t1));
362 if (!mesh.is_boundary_face(t2)) {
363 q.push(mesh.switch_tetrahedron(t2));
365 if (!mesh.is_boundary_face(t3)) {
366 q.push(mesh.switch_tetrahedron(t3));
370void top_dimension_cofaces_tuples_edge(
373 SimplexCollection& collection)
375 std::set<Tuple, wmtk::utils::TupleCellLessThan> touched_cells;
379 const Tuple t = q.front();
384 const auto& [it, was_inserted] = touched_cells.insert(t);
393 const Tuple t2 = mesh.switch_face(t);
395 if (!mesh.is_boundary_face(t1)) {
396 q.push(mesh.switch_tuples(t1, {PrimitiveType::Tetrahedron, PrimitiveType::Triangle}));
398 if (!mesh.is_boundary_face(t2)) {
399 q.push(mesh.switch_tetrahedron(t2));
404void top_dimension_cofaces_tuples_face(
407 SimplexCollection& collection)
410 if (!mesh.is_boundary_face(input)) {
414void top_dimension_cofaces_tuples_tet(
417 SimplexCollection& collection)
428 const bool sort_and_clean)
430 const auto& m = simplex_collection.
mesh();
432 if (sort_and_clean) {
444 collection.
add(simplex);
456 "top_dimension_cofaces_tuples not implemented for Tetrahedron in PointMesh");
457 default: assert(
false);
break;
468 collection.
add(simplex);
475 collection.
add(simplex);
482 default: assert(
false);
break;
493 top_dimension_cofaces_tuples_vertex(mesh, simplex.
tuple(), collection);
497 top_dimension_cofaces_tuples_edge(mesh, simplex.
tuple(), collection);
501 top_dimension_cofaces_tuples_face(mesh, simplex.
tuple(), collection);
505 default: assert(
false);
break;
516 top_dimension_cofaces_tuples_vertex(mesh, simplex.
tuple(), collection);
520 top_dimension_cofaces_tuples_edge(mesh, simplex.
tuple(), collection);
524 top_dimension_cofaces_tuples_face(mesh, simplex.
tuple(), collection);
528 top_dimension_cofaces_tuples_tet(mesh, simplex.
tuple(), collection);
531 default: assert(
false);
break;
561 std::vector<Tuple>& collection)
565 collection.emplace_back(simplex.
tuple());
577 "top_dimension_cofaces_tuples not implemented for Tetrahedron in PointMesh");
578 default: assert(
false);
break;
584 std::vector<Tuple>& collection)
588 collection.emplace_back(simplex.
tuple());
595 collection.emplace_back(simplex.
tuple());
599 throw std::runtime_error(
600 "top_dimension_cofaces_tuples not implemented for Face in EdgeMesh");
604 default: assert(
false);
break;
611 std::vector<Tuple>& collection)
615 collection = top_dimension_cofaces_tuples_vertex(mesh, simplex.
tuple());
619 collection = top_dimension_cofaces_tuples_edge(mesh, simplex.
tuple());
623 collection = top_dimension_cofaces_tuples_face(mesh, simplex.
tuple());
627 default: assert(
false);
break;
634 std::vector<Tuple>& collection)
638 collection = top_dimension_cofaces_tuples_vertex(mesh, simplex.
tuple());
642 collection = top_dimension_cofaces_tuples_edge(mesh, simplex.
tuple());
646 collection = top_dimension_cofaces_tuples_face(mesh, simplex.
tuple());
650 collection = top_dimension_cofaces_tuples_tet(mesh, simplex.
tuple());
653 default: assert(
false);
break;
660 std::vector<Tuple>& tuples)
675 default: assert(
false);
689 if (sort_and_clean) {
705 if (sort_and_clean) {
721 if (sort_and_clean) {
730 std::vector<Tuple> collection;
738 std::vector<Tuple> collection;
745 std::vector<Tuple> collection;
752 std::vector<Tuple> collection;
770 throw std::runtime_error(
"unknown mesh type in top_dimension_cofaces_tuples");
Tuple switch_edge(const Tuple &tuple) const
bool is_boundary_vertex(const Tuple &tuple) const
PrimitiveType top_simplex_type() const
const Mesh & mesh() const
void add(const Simplex &simplex)
Add simplex to the collection.
void sort_and_clean()
Sort simplex vector and remove duplicates.
const Tuple & tuple() const
PrimitiveType primitive_type() const
std::vector< Simplex > tuple_vector_to_homogeneous_simplex_vector(const Mesh &m, const std::vector< Tuple > &tups, PrimitiveType primitive)
void top_dimension_cofaces_tuples(const PointMesh &mesh, const Simplex &simplex, SimplexCollection &collection)
void top_dimension_cofaces(const Simplex &simplex, SimplexCollection &simplex_collection, const bool sort_and_clean)
Get all top dimension cofaces of the given simplex.
void log_and_throw_error(const std::string &msg)