22#ifndef OPERATOR_BASE_CATEGORIZATION_H
23#define OPERATOR_BASE_CATEGORIZATION_H
26#include <deal.II/grid/tria.h>
30namespace Categorization
39template<
int dim,
typename AdditionalData>
41do_cell_based_loops(dealii::Triangulation<dim>
const & tria,
42 AdditionalData & data,
43 unsigned int const level = dealii::numbers::invalid_unsigned_int)
45 bool is_mg = (level != dealii::numbers::invalid_unsigned_int);
49 data.cell_vectorization_category.resize(std::distance(tria.begin(level), tria.end(level)));
51 data.cell_vectorization_category.resize(tria.n_active_cells());
53 AssertThrow(tria.get_reference_cells().size() == 1,
54 dealii::ExcMessage(
"No mixed meshes allowed."));
56 AssertThrow(not tria.has_hanging_nodes(),
57 dealii::ExcMessage(
"Cell based face loops do not support locally refined meshes."));
59 unsigned int const n_faces_per_cell = tria.get_reference_cells()[0].n_faces();
62 std::vector<unsigned int> factors(n_faces_per_cell);
64 std::map<unsigned int, unsigned int> bid_map;
65 for(
unsigned int i = 0; i < tria.get_boundary_ids().size(); i++)
66 bid_map[tria.get_boundary_ids()[i]] = i + 1;
69 unsigned int bids = tria.get_boundary_ids().size() + 1;
71 for(
unsigned int i = 0; i < n_faces_per_cell; i++, offset = offset * bids)
75 auto to_category = [&](
auto & cell) {
76 unsigned int c_num = 0;
77 for(
unsigned int i = 0; i < n_faces_per_cell; i++)
79 const auto face = *cell->face(i);
80 if(face.at_boundary())
81 c_num += factors[i] * bid_map[face.boundary_id()];
88 for(
auto cell = tria.begin_active(); cell != tria.end(); ++cell)
90 if(cell->is_locally_owned())
91 data.cell_vectorization_category[cell->active_cell_index()] = to_category(cell);
96 for(
auto cell = tria.begin(level); cell != tria.end(level); ++cell)
98 if(cell->is_locally_owned_on_level())
99 data.cell_vectorization_category[cell->index()] = to_category(cell);
104 data.hold_all_faces_to_owned_cells =
true;
105 data.cell_vectorization_categories_strict =
true;
106 data.mapping_update_flags_faces_by_cells =
107 data.mapping_update_flags_inner_faces | data.mapping_update_flags_boundary_faces;