34#include <deal.II/multigrid/mg_transfer_block.templates.h>
52 template <
int dim,
typename number,
int spacedim>
57 const std::vector<bool> &
sel,
58 std::vector<std::vector<types::global_dof_index>> &
ndofs)
60 std::vector<bool> selected =
sel;
63 std::accumulate(selected.begin(), selected.end(), 0
u);
67 std::vector<std::vector<types::global_dof_index>>
new_dofs(
68 dof_handler.get_triangulation().n_levels(),
69 std::vector<types::global_dof_index>(selected.size()));
74 for (
unsigned int level = v.min_level();
level <= v.max_level(); ++
level)
78 for (
unsigned int i = 0;
79 i < selected.size() && (
k < v[
level].n_blocks());
86 v[
level].collect_sizes();
98 template <
int dim,
typename number,
int spacedim>
103 const unsigned int selected_block,
104 std::vector<std::vector<types::global_dof_index>> &
ndofs)
106 const unsigned int n_blocks = dof_handler.get_fe().n_blocks();
109 std::vector<bool> selected(n_blocks,
false);
110 selected[selected_block] =
true;
114 std::vector<std::vector<types::global_dof_index>>
new_dofs(
115 dof_handler.get_triangulation().n_levels(),
116 std::vector<types::global_dof_index>(selected.size()));
121 for (
unsigned int level = v.min_level();
level <= v.max_level(); ++
level)
129template <
typename number>
130template <
int dim,
typename number2,
int spacedim>
142 for (
unsigned int level = dof_handler.get_triangulation().n_levels();
146 for (
IT i = copy_indices[selected_block][
level].
begin();
147 i != copy_indices[selected_block][
level].
end();
149 dst[
level](i->second) = src.block(selected_block)(i->first);
155template <
typename number>
156template <
int dim,
typename number2,
int spacedim>
167 for (
unsigned int level = dof_handler.get_triangulation().n_levels();
171 for (
IT i = copy_indices[selected_block][
level].
begin();
172 i != copy_indices[selected_block][
level].
end();
174 dst[
level](i->second) = src(i->first);
180template <
typename number>
181template <
int dim,
typename number2,
int spacedim>
189 for (
unsigned int level = dof_handler.get_triangulation().n_levels();
193 for (
unsigned int block = 0; block < selected.size(); ++block)
196 i != copy_indices[block][
level].
end();
198 dst[
level].block(mg_block[block])(i->second) =
199 src.block(block)(i->first);
205template <
int dim,
int spacedim>
210 const unsigned int n_blocks = fe.n_blocks();
211 const unsigned int dofs_per_cell = fe.n_dofs_per_cell();
212 const unsigned int n_levels = dof_handler.get_triangulation().n_levels();
222 for (
unsigned int i = 0; i < n_blocks; ++i)
230 sizes.resize(n_levels, std::vector<types::global_dof_index>(fe.n_blocks()));
265 for (
unsigned int block = 0; block < n_blocks; ++block)
286 for (
unsigned int i = 0; i < n_levels - 1; ++i)
317 for (
unsigned int i = 0; i < n_blocks; ++i)
318 for (
unsigned int j = 0;
j < n_blocks; ++
j)
332 if (cell->has_children())
336 Assert(cell->n_children() ==
339 for (
unsigned int child = 0; child < cell->n_children(); ++child)
345 dof_handler.get_fe().get_prolongation_matrix(
346 child, cell->refinement_case());
353 for (
unsigned int i = 0; i < dofs_per_cell; ++i)
354 for (
unsigned int j = 0;
j < dofs_per_cell; ++
j)
355 if (prolongation(i,
j) != 0)
357 const unsigned int icomp =
358 fe.system_to_block_index(i).first;
359 const unsigned int jcomp =
360 fe.system_to_block_index(
j).first;
375 if (cell->has_children())
379 Assert(cell->n_children() ==
382 for (
unsigned int child = 0; child < cell->n_children(); ++child)
388 dof_handler.get_fe().get_prolongation_matrix(
389 child, cell->refinement_case());
395 for (
unsigned int i = 0; i < dofs_per_cell; ++i)
396 for (
unsigned int j = 0;
j < dofs_per_cell; ++
j)
397 if (prolongation(i,
j) != 0)
399 const unsigned int icomp =
400 fe.system_to_block_index(i).first;
401 const unsigned int jcomp =
402 fe.system_to_block_index(
j).first;
436 for (; dof !=
endd; ++dof)
439 unsigned int index = 0;
440 for (
unsigned int block = 0; block < n_blocks; ++block)
454 ->block(block, block)
469template <
typename number>
470template <
int dim,
int spacedim>
477 unsigned int n_blocks = dof_handler.get_fe().n_blocks();
479 selected_block = select;
480 selected.resize(n_blocks,
false);
481 selected[select] =
true;
487 std::vector<types::global_dof_index> level_dof_indices(fe.n_dofs_per_cell());
489 for (
int level = dof_handler.get_triangulation().n_levels() - 1;
level >= 0;
493 dof_handler.begin_active(
level);
495 dof_handler.end_active(
level);
503 for (; level_cell !=
level_end; ++level_cell)
510 level_cell->get_mg_dof_indices(level_dof_indices);
512 for (
unsigned int i = 0; i < fe.n_dofs_per_cell(); ++i)
514 const unsigned int block = fe.system_to_block_index(i).first;
517 if (mg_constrained_dofs !=
nullptr)
519 if (!mg_constrained_dofs->at_refinement_edge(
520 level, level_dof_indices[i]))
522 mg_block_start[
level][block]] =
527 mg_block_start[
level][block]] =
543 return index != numbers::invalid_dof_index;
549 copy_indices[selected_block][
level][counter++] =
550 std::pair<types::global_dof_index, unsigned int>(
557template <
typename number>
558template <
int dim,
int spacedim>
561 const std::vector<bool> &
sel)
564 unsigned int n_blocks = dof_handler.get_fe().n_blocks();
572 if (selected.size() == 0)
573 selected = std::vector<bool>(n_blocks,
true);
579 std::vector<types::global_dof_index> level_dof_indices(fe.n_dofs_per_cell());
580 for (
int level = dof_handler.get_triangulation().n_levels() - 1;
level >= 0;
584 dof_handler.begin_active(
level);
586 dof_handler.end_active(
level);
588 for (
unsigned int block = 0; block < n_blocks; ++block)
598 for (; level_cell !=
level_end; ++level_cell)
605 level_cell->get_mg_dof_indices(level_dof_indices);
607 for (
unsigned int i = 0; i < fe.n_dofs_per_cell(); ++i)
609 const unsigned int block = fe.system_to_block_index(i).first;
612 mg_block_start[
level][block]] =
617 for (
unsigned int block = 0; block < n_blocks; ++block)
632 copy_indices[block][
level][counter++] =
633 std::pair<types::global_dof_index, unsigned int>(
643#include "mg_transfer_block.inst"
void reinit(value_type *starting_element, const std::size_t n_elements)
std::vector< unsigned int > mg_block
std::vector< std::vector< types::global_dof_index > > sizes
void build(const DoFHandler< dim, spacedim > &dof_handler)
std::vector< bool > selected
std::vector< types::global_dof_index > block_start
std::vector< std::shared_ptr< BlockSparseMatrix< double > > > prolongation_matrices
std::vector< std::shared_ptr< BlockSparsityPattern > > prolongation_sparsities
SmartPointer< const MGConstrainedDoFs, MGTransferBlockBase > mg_constrained_dofs
std::vector< std::vector< types::global_dof_index > > mg_block_start
std::vector< std::vector< std::vector< std::pair< unsigned int, unsigned int > > > > copy_indices
void copy_to_mg(const DoFHandler< dim, spacedim > &dof_handler, MGLevelObject< Vector< number > > &dst, const Vector< number2 > &src) const
void build(const DoFHandler< dim, spacedim > &dof_handler, unsigned int selected)
void build(const DoFHandler< dim, spacedim > &dof_handler, const std::vector< bool > &selected)
void copy_to_mg(const DoFHandler< dim, spacedim > &dof_handler, MGLevelObject< BlockVector< number > > &dst, const BlockVector< number2 > &src) const
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
static ::ExceptionBase & ExcNotImplemented()
#define Assert(cond, exc)
#define AssertIndexRange(index, range)
static ::ExceptionBase & ExcInternalError()
static ::ExceptionBase & ExcDimensionMismatch(std::size_t arg1, std::size_t arg2)
typename ActiveSelector::cell_iterator cell_iterator
typename ActiveSelector::active_cell_iterator active_cell_iterator
std::enable_if_t< IsBlockVector< VectorType >::value, unsigned int > n_blocks(const VectorType &vector)
static const unsigned int invalid_unsigned_int
const types::global_dof_index invalid_dof_index