14#ifndef dealii_mesh_worker_dof_info_h
15#define dealii_mesh_worker_dof_info_h
36 template <
int dim,
class DOFINFO>
71 template <
int dim,
int spacedim = dim,
typename number =
double>
123 template <
class DHCellIterator>
125 reinit(
const DHCellIterator &c);
130 template <
class DHCellIterator,
class DHFaceIterator>
132 reinit(
const DHCellIterator &c,
133 const DHFaceIterator &f,
134 const unsigned int face_no);
139 template <
class DHCellIterator,
class DHFaceIterator>
141 reinit(
const DHCellIterator &c,
142 const DHFaceIterator &f,
143 const unsigned int face_no,
144 const unsigned int subface_no);
150 template <
class DHFaceIterator>
152 set_face(
const DHFaceIterator &f,
const unsigned int face_no);
158 template <
class DHFaceIterator>
160 set_subface(
const DHFaceIterator &f,
161 const unsigned int face_no,
162 const unsigned int subface_no);
165 local_indices()
const;
189 template <
class DHCellIterator>
191 get_indices(
const DHCellIterator &c);
217 template <
int dim,
class DOFINFO>
249 template <
class ASSEMBLER>
251 assemble(ASSEMBLER &ass)
const;
287 template <
int dim,
int spacedim,
typename number>
289 : face_number(
numbers::invalid_unsigned_int)
290 , sub_number(
numbers::invalid_unsigned_int)
296 template <
int dim,
int spacedim,
typename number>
299 : face_number(
numbers::invalid_unsigned_int)
300 , sub_number(
numbers::invalid_unsigned_int)
303 std::vector<types::global_dof_index> aux(1);
309 template <
int dim,
int spacedim,
typename number>
310 template <
class DHCellIterator>
314 indices.resize(c->get_fe().n_dofs_per_cell());
315 if (block_info ==
nullptr || block_info->local().size() == 0)
316 c->get_active_or_mg_dof_indices(indices);
319 indices_org.resize(c->get_fe().n_dofs_per_cell());
320 c->get_active_or_mg_dof_indices(indices_org);
326 template <
int dim,
int spacedim,
typename number>
327 template <
class DHCellIterator>
332 level_cell = c->is_level_cell();
344 template <
int dim,
int spacedim,
typename number>
345 template <
class DHFaceIterator>
348 const unsigned int face_no)
351 face_number = face_no;
356 template <
int dim,
int spacedim,
typename number>
357 template <
class DHCellIterator,
class DHFaceIterator>
360 const DHFaceIterator &f,
361 const unsigned int face_no)
366 level_cell = c->is_level_cell();
369 set_face(f, face_no);
378 template <
int dim,
int spacedim,
typename number>
379 template <
class DHFaceIterator>
382 const unsigned int face_no,
383 const unsigned int subface_no)
386 face_number = face_no;
387 sub_number = subface_no;
391 template <
int dim,
int spacedim,
typename number>
392 template <
class DHCellIterator,
class DHFaceIterator>
395 const DHFaceIterator &f,
396 const unsigned int face_no,
397 const unsigned int subface_no)
403 level_cell = c->is_level_cell();
406 set_subface(f, face_no, subface_no);
415 template <
int dim,
int spacedim,
typename number>
420 return block_info->local();
421 return aux_local_indices;
426 template <
int dim,
int spacedim,
typename number>
428 : face_number(
numbers::invalid_unsigned_int)
429 , sub_number(
numbers::invalid_unsigned_int)
430 , block_info(&info, typeid(*this).name())
440 template <
int dim,
int spacedim,
typename number>
444 for (
unsigned int i = 0; i < indices.size(); ++i)
446 const std::pair<unsigned int, unsigned int> bi =
447 block_info->local().global_to_local(this->block_info->renumber(i));
448 indices_by_block[bi.first][bi.second] = indices_org[i];
452 for (
unsigned int i = 0; i < indices.size(); ++i)
453 indices[this->block_info->renumber(i)] = indices_org[i];
458 template <
int dim,
class DOFINFO>
474 template <
int dim,
class DOFINFO>
478 , cell_valid(other.cell_valid)
491 template <
int dim,
class DOFINFO>
501 interior_face_available[i] =
false;
502 exterior_face_available[i] =
false;
509 template <
int dim,
class DOFINFO>
516 interior_face_available[i] =
false;
517 exterior_face_available[i] =
false;
523 template <
int dim,
class DOFINFO>
524 template <
class ASSEMBLER>
531 assembler.assemble(cell);
535 if (interior_face_available[i])
540 if (exterior_face_available[i])
541 assembler.assemble(interior[i], exterior[i]);
543 assembler.assemble(interior[i]);
void reinit(const unsigned int n_blocks, const size_type n_elements_per_block)
A small class collecting the different BlockIndices involved in global, multilevel and local computat...
virtual size_type size() const override
const FiniteElement< dim, spacedim > & get_fe(const types::fe_index index=0) const
unsigned int n_dofs_per_cell() const
DOFINFO interior[GeometryInfo< dim >::faces_per_cell]
void assemble(ASSEMBLER &ass) const
bool exterior_face_available[GeometryInfo< dim >::faces_per_cell]
bool interior_face_available[GeometryInfo< dim >::faces_per_cell]
DOFINFO exterior[GeometryInfo< dim >::faces_per_cell]
DoFInfoBox & operator=(const DoFInfoBox< dim, DOFINFO > &)
DoFInfoBox(const DOFINFO &seed)
void set_face(const DHFaceIterator &f, const unsigned int face_no)
std::vector< types::global_dof_index > indices_org
Auxiliary vector.
BlockIndices aux_local_indices
ObserverPointer< const BlockInfo, DoFInfo< dim, spacedim > > block_info
The block structure of the system.
std::vector< types::global_dof_index > indices
void set_subface(const DHFaceIterator &f, const unsigned int face_no, const unsigned int subface_no)
void set_block_indices()
Set up local block indices.
const BlockIndices & local_indices() const
void get_indices(const DHCellIterator &c)
Fill index vector with active indices.
Triangulation< dim, spacedim >::face_iterator face
The current face.
std::vector< std::vector< types::global_dof_index > > indices_by_block
void reinit(const DHCellIterator &c)
Triangulation< dim, spacedim >::cell_iterator cell
The current cell.
BlockVector< number > & vector(const unsigned int i)
void reinit(const BlockIndices &local_sizes)
#define DEAL_II_DEPRECATED
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
TriaIterator< CellAccessor< dim, spacedim > > cell_iterator
@ valid
Iterator points to a valid object.
constexpr unsigned int invalid_unsigned_int
static std_cxx20::ranges::iota_view< unsigned int, unsigned int > face_indices()