13#ifndef dealii_tria_levels_h
14#define dealii_tria_levels_h
32 namespace TriangulationImplementation
51 template <
int dim,
int spacedim = dim>
71 const unsigned int max_faces_per_cell,
72 const unsigned int max_vertices_per_cell)
76 ,
cells(dim, max_children_per_cell, max_faces_per_cell)
109 const bool orientation_needed,
110 const bool has_tetrahedra);
138 const unsigned int face_no,
148 const unsigned int vertex_no,
149 const unsigned int vertex_index);
314 template <
class Archive>
363 template <
int dim,
int spacedim>
367 Assert(refine_flags.size() == coarsen_flags.size() &&
368 refine_flags.size() == active_cell_indices.size() &&
369 refine_flags.size() == global_active_cell_indices.size() &&
370 refine_flags.size() == global_level_cell_indices.size() &&
371 refine_flags.size() == subdomain_ids.size() &&
372 refine_flags.size() == level_subdomain_ids.size() &&
373 refine_flags.size() == cells.n_objects(),
375 if constexpr (dim > 1)
376 Assert(refine_flags.size() == reference_cell.size(),
379 return refine_flags.size();
384 template <
int dim,
int spacedim>
387 const unsigned int face_no)
const
391 const std::size_t i =
index * faces_per_object + face_no;
393 return neighbor_indices[i];
398 template <
int dim,
int spacedim>
401 const unsigned int face_no)
const
405 const std::size_t i =
index * faces_per_object + face_no;
407 return neighbor_levels[i];
412 template <
int dim,
int spacedim>
415 const unsigned int face_no,
416 const int neighbor_level,
417 const int neighbor_index)
421 Assert(neighbor_level >= -1,
422 ExcMessage(
"The neighbor level must be -1 (for a cell at the "
423 "boundary) or a nonnegative number."));
425 Assert(neighbor_index >= -1,
426 ExcMessage(
"The neighbor index must be -1 (for a cell at the "
427 "boundary) or a nonnegative number."));
428 const std::size_t i =
index * faces_per_object + face_no;
431 neighbor_levels[i] = neighbor_level;
432 neighbor_indices[i] = neighbor_index;
437 template <
int dim,
int spacedim>
441 const unsigned int vertex_no,
442 const unsigned int vertex_index)
446 const std::size_t i =
447 std::size_t(
index) * vertices_per_object + vertex_no;
449 cell_vertex_indices_cache[i] = vertex_index;
454 template <
int dim,
int spacedim>
458 const unsigned int vertex_no)
const
462 const std::size_t i =
463 std::size_t(
index) * vertices_per_object + vertex_no;
465 return cell_vertex_indices_cache[i];
470 template <
int dim,
int spacedim>
471 template <
class Archive>
475 ar &refine_flags &coarsen_flags;
477 ar &children_per_object;
478 ar &faces_per_object;
479 ar &vertices_per_object;
486 ar &neighbor_indices;
488 ar &level_subdomain_ids;
492 ar &face_orientations;
497 if (cell_vertex_indices_cache.size() !=
498 refine_flags.size() * vertices_per_object)
500 cell_vertex_indices_cache.assign(refine_flags.size() *
503 active_cell_indices.assign(refine_flags.size(),
505 global_active_cell_indices.assign(refine_flags.size(),
507 global_level_cell_indices.assign(refine_flags.size(),
void set_neighbor(const int index, const unsigned int face_no, const int neighbor_level, const int neighbor_index)
unsigned int cached_vertex_index(const int index, const unsigned int vertex_no) const
void allocate(const std::size_t n_cells, const bool orientation_needed)
void set_cached_vertex_index(const int index, const unsigned int vertex_no, const unsigned int vertex_index)
std::vector< types::subdomain_id > level_subdomain_ids
unsigned int faces_per_object
std::vector< std::int8_t > neighbor_levels
void serialize(Archive &ar, const unsigned int version)
std::vector< int > neighbor_indices
std::vector< ReferenceCell< dim > > reference_cell
void allocate_end(const std::size_t n_new_cells, const bool orientation_needed, const bool has_tetrahedra)
std::vector< bool > coarsen_flags
std::vector< unsigned int > cell_vertex_indices_cache
std::vector< std::uint8_t > refine_choice
int neighbor_level(const int index, const unsigned int face_no) const
TriaLevel(const unsigned int max_children_per_cell, const unsigned int max_faces_per_cell, const unsigned int max_vertices_per_cell)
std::vector< std::uint8_t > refine_flags
std::vector< types::global_cell_index > global_active_cell_indices
int neighbor_index(const int index, const unsigned int face_no) const
TriaObjectsOrientations face_orientations
std::vector< types::subdomain_id > subdomain_ids
unsigned int vertices_per_object
std::vector< types::global_cell_index > global_level_cell_indices
std::size_t memory_consumption() const
std::vector< int > parents
std::vector< unsigned int > active_cell_indices
std::vector< bool > direction_flags
unsigned int children_per_object
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
#define Assert(cond, exc)
#define AssertIndexRange(index, range)
static ::ExceptionBase & ExcInternalError()
static ::ExceptionBase & ExcMessage(std::string arg1)
unsigned int n_cells(const internal::TriangulationImplementation::NumberCache< 1 > &c)
constexpr std::uint8_t max_n_levels
constexpr unsigned int invalid_unsigned_int
constexpr types::coarse_cell_id invalid_coarse_cell_id