deal.II version GIT relicensing-6846-gd1ccc50c04 2026-10-05 21:50:01+00:00
\(\newcommand{\dealvcentcolon}{\mathrel{\mathop{:}}}\) \(\newcommand{\dealcoloneq}{\dealvcentcolon\mathrel{\mkern-1.2mu}=}\) \(\newcommand{\jump}[1]{\left[\!\left[ #1 \right]\!\right]}\) \(\newcommand{\average}[1]{\left\{\!\left\{ #1 \right\}\!\right\}}\)
Loading...
Searching...
No Matches
dof_info.h
Go to the documentation of this file.
1// -----------------------------------------------------------------------------
2//
3// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception OR LGPL-2.1-or-later
4// Copyright (C) 2009 - 2024 by the deal.II authors
5//
6// This file is part of the deal.II library.
7//
8// Detailed license information governing the source code and contributions
9// can be found in LICENSE.md and CONTRIBUTING.md at the top level directory.
10//
11// -----------------------------------------------------------------------------
12
13
14#ifndef dealii_mesh_worker_dof_info_h
15#define dealii_mesh_worker_dof_info_h
16
17#include <deal.II/base/config.h>
18
20
22
24
27
28#include <memory>
29
31
32namespace MeshWorker
33{
34 // Forward declaration
35#ifndef DOXYGEN
36 template <int dim, class DOFINFO>
37 class DoFInfoBox;
38#endif
39
71 template <int dim, int spacedim = dim, typename number = double>
73 {
74 public:
77
80
87 unsigned int face_number;
88
95 unsigned int sub_number;
96
101 std::vector<types::global_dof_index> indices;
102
107 std::vector<std::vector<types::global_dof_index>> indices_by_block;
108
112 DoFInfo(const BlockInfo &block_info);
113
118 DoFInfo(const DoFHandler<dim, spacedim> &dof_handler);
119
123 template <class DHCellIterator>
124 void
125 reinit(const DHCellIterator &c);
126
130 template <class DHCellIterator, class DHFaceIterator>
131 void
132 reinit(const DHCellIterator &c,
133 const DHFaceIterator &f,
134 const unsigned int face_no);
135
139 template <class DHCellIterator, class DHFaceIterator>
140 void
141 reinit(const DHCellIterator &c,
142 const DHFaceIterator &f,
143 const unsigned int face_no,
144 const unsigned int subface_no);
145
150 template <class DHFaceIterator>
151 void
152 set_face(const DHFaceIterator &f, const unsigned int face_no);
153
158 template <class DHFaceIterator>
159 void
160 set_subface(const DHFaceIterator &f,
161 const unsigned int face_no,
162 const unsigned int subface_no);
163
164 const BlockIndices &
165 local_indices() const;
166
167
170
175
176 private:
182 DoFInfo();
183
185 void
186 set_block_indices();
187
189 template <class DHCellIterator>
190 void
191 get_indices(const DHCellIterator &c);
192
194 std::vector<types::global_dof_index> indices_org;
195
202
203 friend class DoFInfoBox<dim, DoFInfo<dim, spacedim, number>>;
204 };
205
206
217 template <int dim, class DOFINFO>
219 {
220 public:
224 DoFInfoBox(const DOFINFO &seed);
225
231
235 DoFInfoBox &
236 operator=(const DoFInfoBox<dim, DOFINFO> &);
237
241 void
242 reset();
243
249 template <class ASSEMBLER>
250 void
251 assemble(ASSEMBLER &ass) const;
252
253
257 DOFINFO cell;
266
271 bool interior_face_available[GeometryInfo<dim>::faces_per_cell];
272
277 bool exterior_face_available[GeometryInfo<dim>::faces_per_cell];
278
283 };
284
285 //----------------------------------------------------------------------//
286
287 template <int dim, int spacedim, typename number>
289 : face_number(numbers::invalid_unsigned_int)
290 , sub_number(numbers::invalid_unsigned_int)
291 , level_cell(false)
292 {}
293
294
295
296 template <int dim, int spacedim, typename number>
298 const DoFHandler<dim, spacedim> &dof_handler)
299 : face_number(numbers::invalid_unsigned_int)
300 , sub_number(numbers::invalid_unsigned_int)
301 , level_cell(false)
302 {
303 std::vector<types::global_dof_index> aux(1);
304 aux[0] = dof_handler.get_fe().n_dofs_per_cell();
306 }
307
308
309 template <int dim, int spacedim, typename number>
310 template <class DHCellIterator>
311 inline void
313 {
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);
317 else
318 {
319 indices_org.resize(c->get_fe().n_dofs_per_cell());
320 c->get_active_or_mg_dof_indices(indices_org);
321 set_block_indices();
322 }
323 }
324
325
326 template <int dim, int spacedim, typename number>
327 template <class DHCellIterator>
328 inline void
330 {
331 get_indices(c);
332 level_cell = c->is_level_cell();
333
335 face_number = numbers::invalid_unsigned_int;
337 if (block_info)
338 LocalResults<number>::reinit(block_info->local());
339 else
340 LocalResults<number>::reinit(aux_local_indices);
341 }
342
343
344 template <int dim, int spacedim, typename number>
345 template <class DHFaceIterator>
346 inline void
348 const unsigned int face_no)
349 {
350 face = static_cast<typename Triangulation<dim, spacedim>::face_iterator>(f);
351 face_number = face_no;
353 }
354
355
356 template <int dim, int spacedim, typename number>
357 template <class DHCellIterator, class DHFaceIterator>
358 inline void
360 const DHFaceIterator &f,
361 const unsigned int face_no)
362 {
363 if ((cell.state() != IteratorState::valid) ||
365 get_indices(c);
366 level_cell = c->is_level_cell();
367
369 set_face(f, face_no);
370
371 if (block_info)
372 LocalResults<number>::reinit(block_info->local());
373 else
374 LocalResults<number>::reinit(aux_local_indices);
375 }
376
377
378 template <int dim, int spacedim, typename number>
379 template <class DHFaceIterator>
380 inline void
382 const unsigned int face_no,
383 const unsigned int subface_no)
384 {
385 face = static_cast<typename Triangulation<dim, spacedim>::face_iterator>(f);
386 face_number = face_no;
387 sub_number = subface_no;
388 }
389
390
391 template <int dim, int spacedim, typename number>
392 template <class DHCellIterator, class DHFaceIterator>
393 inline void
395 const DHFaceIterator &f,
396 const unsigned int face_no,
397 const unsigned int subface_no)
398 {
399 if (cell.state() != IteratorState::valid ||
400 cell !=
401 static_cast<typename Triangulation<dim, spacedim>::cell_iterator>(c))
402 get_indices(c);
403 level_cell = c->is_level_cell();
404
405 cell = static_cast<typename Triangulation<dim, spacedim>::cell_iterator>(c);
406 set_subface(f, face_no, subface_no);
407
408 if (block_info)
409 LocalResults<number>::reinit(block_info->local());
410 else
411 LocalResults<number>::reinit(aux_local_indices);
412 }
413
414
415 template <int dim, int spacedim, typename number>
416 inline const BlockIndices &
418 {
419 if (block_info)
420 return block_info->local();
421 return aux_local_indices;
422 }
423
424 //----------------------------------------------------------------------//
425
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())
431 , level_cell(false)
432 {
433 indices_by_block.resize(info.local().size());
434 for (unsigned int i = 0; i < indices_by_block.size(); ++i)
435 indices_by_block[i].resize(info.local().block_size(i));
436 }
437
438
439
440 template <int dim, int spacedim, typename number>
441 inline void
443 {
444 for (unsigned int i = 0; i < indices.size(); ++i)
445 {
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];
449 }
450 // Remove this after
451 // changing block codes
452 for (unsigned int i = 0; i < indices.size(); ++i)
453 indices[this->block_info->renumber(i)] = indices_org[i];
454 }
455
456
457
458 template <int dim, class DOFINFO>
459 inline DoFInfoBox<dim, DOFINFO>::DoFInfoBox(const DOFINFO &seed)
460 : cell(seed)
461 , cell_valid(true)
462 {
463 for (const unsigned int i : GeometryInfo<dim>::face_indices())
464 {
465 exterior[i] = seed;
466 interior[i] = seed;
467 interior_face_available[i] = false;
468 exterior_face_available[i] = false;
469 }
470 }
471
472
473
474 template <int dim, class DOFINFO>
476 const DoFInfoBox<dim, DOFINFO> &other)
477 : cell(other.cell)
478 , cell_valid(other.cell_valid)
479 {
480 for (const unsigned int i : GeometryInfo<dim>::face_indices())
481 {
482 exterior[i] = other.exterior[i];
483 interior[i] = other.interior[i];
484 interior_face_available[i] = false;
485 exterior_face_available[i] = false;
486 }
487 }
488
489
490
491 template <int dim, class DOFINFO>
494 {
495 cell = other.cell;
496 cell_valid = other.cell_valid;
497 for (const unsigned int i : GeometryInfo<dim>::face_indices())
498 {
499 exterior[i] = other.exterior[i];
500 interior[i] = other.interior[i];
501 interior_face_available[i] = false;
502 exterior_face_available[i] = false;
503 }
504 return *this;
505 }
506
507
508
509 template <int dim, class DOFINFO>
510 inline void
512 {
513 cell_valid = false;
514 for (const unsigned int i : GeometryInfo<dim>::face_indices())
515 {
516 interior_face_available[i] = false;
517 exterior_face_available[i] = false;
518 }
519 }
520
521
522
523 template <int dim, class DOFINFO>
524 template <class ASSEMBLER>
525 inline void
526 DoFInfoBox<dim, DOFINFO>::assemble(ASSEMBLER &assembler) const
527 {
528 if (!cell_valid)
529 return;
530
531 assembler.assemble(cell);
532 for (const unsigned int i : GeometryInfo<dim>::face_indices())
533 {
534 // Only do something if data available
535 if (interior_face_available[i])
536 {
537 // If both data
538 // available, it is an
539 // interior face
540 if (exterior_face_available[i])
541 assembler.assemble(interior[i], exterior[i]);
542 else
543 assembler.assemble(interior[i]);
544 }
545 }
546 }
547} // namespace MeshWorker
548
550
551#endif
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...
Definition block_info.h:94
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]
Definition dof_info.h:261
void assemble(ASSEMBLER &ass) const
Definition dof_info.h:526
bool exterior_face_available[GeometryInfo< dim >::faces_per_cell]
Definition dof_info.h:277
bool interior_face_available[GeometryInfo< dim >::faces_per_cell]
Definition dof_info.h:271
DOFINFO exterior[GeometryInfo< dim >::faces_per_cell]
Definition dof_info.h:265
DoFInfoBox & operator=(const DoFInfoBox< dim, DOFINFO > &)
Definition dof_info.h:493
DoFInfoBox(const DOFINFO &seed)
Definition dof_info.h:459
unsigned int sub_number
Definition dof_info.h:95
void set_face(const DHFaceIterator &f, const unsigned int face_no)
Definition dof_info.h:347
std::vector< types::global_dof_index > indices_org
Auxiliary vector.
Definition dof_info.h:194
BlockIndices aux_local_indices
Definition dof_info.h:201
ObserverPointer< const BlockInfo, DoFInfo< dim, spacedim > > block_info
The block structure of the system.
Definition dof_info.h:169
std::vector< types::global_dof_index > indices
Definition dof_info.h:101
void set_subface(const DHFaceIterator &f, const unsigned int face_no, const unsigned int subface_no)
Definition dof_info.h:381
void set_block_indices()
Set up local block indices.
Definition dof_info.h:442
const BlockIndices & local_indices() const
Definition dof_info.h:417
void get_indices(const DHCellIterator &c)
Fill index vector with active indices.
Definition dof_info.h:312
Triangulation< dim, spacedim >::face_iterator face
The current face.
Definition dof_info.h:79
std::vector< std::vector< types::global_dof_index > > indices_by_block
Definition dof_info.h:107
unsigned int face_number
Definition dof_info.h:87
void reinit(const DHCellIterator &c)
Definition dof_info.h:329
Triangulation< dim, spacedim >::cell_iterator cell
The current cell.
Definition dof_info.h:76
BlockVector< number > & vector(const unsigned int i)
void reinit(const BlockIndices &local_sizes)
#define DEAL_II_DEPRECATED
Definition config.h:294
#define DEAL_II_NAMESPACE_OPEN
Definition config.h:38
#define DEAL_II_NAMESPACE_CLOSE
Definition config.h:39
TriaIterator< CellAccessor< dim, spacedim > > cell_iterator
Definition tria.h:1621
@ valid
Iterator points to a valid object.
constexpr unsigned int invalid_unsigned_int
Definition types.h:228
static std_cxx20::ranges::iota_view< unsigned int, unsigned int > face_indices()