45template <
typename VectorType>
54template <
typename VectorType>
64template <
typename VectorType>
76template <
typename VectorType>
80 const VectorType &src)
const
90 VectorType copy_src(src);
92 .distribute(copy_src);
103template <
typename VectorType>
107 const VectorType &src)
const
124 const unsigned int level,
125 std::vector<types::global_dof_index> &dof_indices)
127 if (mg_constrained_dofs !=
nullptr &&
129 for (
auto &ind : dof_indices)
145template <
typename VectorType>
146template <
int dim,
int spacedim>
153 "The underlying DoFHandler object has not had its "
154 "distribute_mg_dofs() function called, but this is a prerequisite "
155 "for multigrid transfers. You will need to call this function, "
156 "probably close to where you already call distribute_dofs()."));
158 const unsigned int n_levels =
162 this->
sizes.resize(n_levels);
163 for (
unsigned int l = 0; l < n_levels; ++l)
181 for (
unsigned int i = 0; i < n_levels - 1; ++i)
192 std::vector<types::global_dof_index> dof_indices_parent(
dofs_per_cell);
193 std::vector<types::global_dof_index> dof_indices_child(
dofs_per_cell);
201 for (
unsigned int level = 0; level < n_levels - 1; ++level)
210 const IndexSet level_p1_relevant_dofs =
214 level_p1_relevant_dofs);
216 if (cell->has_children() && cell->is_locally_owned_on_level())
218 cell->get_mg_dof_indices(dof_indices_parent);
220 replace(this->mg_constrained_dofs, level, dof_indices_parent);
222 Assert(cell->n_children() ==
225 for (
unsigned int child = 0; child < cell->n_children(); ++child)
230 child, cell->refinement_case());
234 cell->child(child)->get_mg_dof_indices(dof_indices_child);
236 replace(this->mg_constrained_dofs,
247 if (prolongation(i, j) != 0)
248 entries.push_back(dof_indices_parent[j]);
256#ifdef DEAL_II_WITH_MPI
258 VectorType>::requires_distributed_sparsity_pattern)
293 if (cell->has_children() && cell->is_locally_owned_on_level())
295 cell->get_mg_dof_indices(dof_indices_parent);
297 replace(this->mg_constrained_dofs, level, dof_indices_parent);
299 Assert(cell->n_children() ==
302 for (
unsigned int child = 0; child < cell->n_children(); ++child)
306 child, cell->refinement_case());
308 if (this->mg_constrained_dofs !=
nullptr &&
312 level, dof_indices_parent[j]))
314 prolongation(i, j) = 0.;
316 cell->child(child)->get_mg_dof_indices(dof_indices_child);
318 replace(this->mg_constrained_dofs,
326 dof_indices_parent.data(),
339template <
typename VectorType>
345 os <<
"Level " << level << std::endl;
353template <
typename VectorType>
367#include "multigrid/mg_transfer_prebuilt.inst"
* x_component_mask set(0, true)
const std::vector< std::pair< size_type, number > > * get_constraint_entries(const size_type line_n) const
bool is_identity_constrained(const size_type line_n) const
size_type n_constraints() const
const FiniteElement< dim, spacedim > & get_fe(const types::fe_index index=0) const
const IndexSet & locally_owned_mg_dofs(const unsigned int level) const
const Triangulation< dim, spacedim > & get_triangulation() const
types::global_dof_index n_dofs() const
MPI_Comm get_mpi_communicator() const
bool has_level_dofs() const
void add_entries(const size_type row, ForwardIterator begin, ForwardIterator end, const bool indices_are_unique_and_sorted=false)
const IndexSet & row_index_set() const
void reinit(const size_type m, const size_type n, const IndexSet &rowset=IndexSet())
unsigned int n_dofs_per_cell() const
virtual const FullMatrix< double > & get_prolongation_matrix(const unsigned int child, const RefinementCase< dim > &refinement_case=RefinementCase< dim >::isotropic_refinement) const
bool is_boundary_index(const unsigned int level, const types::global_dof_index index) const
bool have_boundary_indices() const
const AffineConstraints< double > & get_level_constraints(const unsigned int level) const
std::size_t memory_consumption() const
ObserverPointer< const MGConstrainedDoFs > mg_constrained_dofs
void fill_and_communicate_copy_indices(const DoFHandler< dim, spacedim > &dof_handler)
std::vector< types::global_dof_index > sizes
std::vector< std::vector< bool > > interface_dofs
virtual void restrict_and_add(const unsigned int from_level, VectorType &dst, const VectorType &src) const override
void build(const DoFHandler< dim, spacedim > &dof_handler)
std::vector< std::shared_ptr< typename internal::MatrixSelector< VectorType >::Sparsity > > prolongation_sparsities
std::size_t memory_consumption() const
MGTransferPrebuilt()=default
virtual void prolongate(const unsigned int to_level, VectorType &dst, const VectorType &src) const override
std::vector< std::shared_ptr< typename internal::MatrixSelector< VectorType >::Matrix > > prolongation_matrices
void print_matrices(std::ostream &os) const
void initialize_constraints(const MGConstrainedDoFs &mg_constrained_dofs)
virtual unsigned int n_global_levels() const
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
IteratorRange< cell_iterator > cell_iterators_on_level(const unsigned int level) const
static ::ExceptionBase & ExcNoProlongation()
static ::ExceptionBase & ExcNotImplemented()
#define Assert(cond, exc)
static ::ExceptionBase & ExcInternalError()
static ::ExceptionBase & ExcIndexRange(std::size_t arg1, std::size_t arg2, std::size_t arg3)
static ::ExceptionBase & ExcMessage(std::string arg1)
* const unsigned int dofs_per_cell
static constexpr unsigned int max_children_per_cell
static void reinit(Matrix &matrix, Sparsity &sparsity, int level, const SparsityPatternType &sp, const DoFHandler< dim, spacedim > &)
::SparseMatrix< typename VectorType::value_type > Matrix
::SparsityPattern Sparsity