30 #include <deal.II/multigrid/mg_transfer_block.templates.h>
32 #include <deal.II/multigrid/mg_transfer_component.templates.h>
33 #include <deal.II/multigrid/multigrid.templates.h>
46 , mg_constrained_dofs(&mg_c)
51 template <
typename number>
53 : memory(nullptr, typeid(*this).name())
57 template <
typename number>
60 if (memory !=
nullptr)
65 template <
typename number>
75 template <
typename number>
81 Assert((to_level >= 1) && (to_level <= prolongation_matrices.size()),
82 ExcIndexRange(to_level, 1, prolongation_matrices.size() + 1));
89 if (this->mg_constrained_dofs !=
nullptr)
90 Assert(this->mg_constrained_dofs->get_user_constraint_matrix(to_level - 1)
99 for (
unsigned int b = 0;
b < this->mg_block.size(); ++
b)
101 if (this->selected[
b])
102 prolongation_matrices[to_level - 1]->block(
b,
b).vmult(
103 dst.
block(this->mg_block[
b]), src.
block(this->mg_block[
b]));
108 template <
typename number>
114 Assert((from_level >= 1) && (from_level <= prolongation_matrices.size()),
115 ExcIndexRange(from_level, 1, prolongation_matrices.size() + 1));
121 for (
unsigned int b = 0;
b < this->mg_block.size(); ++
b)
123 if (this->selected[
b])
125 if (factors.size() != 0)
130 prolongation_matrices[from_level - 1]->block(
b,
b).Tvmult(
131 *aux, src.
block(this->mg_block[
b]));
133 dst.
block(this->mg_block[
b]).add(factors[
b], *aux);
138 prolongation_matrices[from_level - 1]->block(
b,
b).Tvmult_add(
139 dst.
block(this->mg_block[
b]), src.
block(this->mg_block[
b]));
150 std::size_t result =
sizeof(*this);
175 std::size_t result =
sizeof(*this);
176 result +=
sizeof(
unsigned int) *
sizes.size();
196 template <
typename number>
198 : selected_component(0)
199 , mg_selected_component(0)
203 template <
typename number>
205 : selected_component(0)
206 , mg_selected_component(0)
212 template <
typename number>
218 Assert((to_level >= 1) && (to_level <= prolongation_matrices.size()),
219 ExcIndexRange(to_level, 1, prolongation_matrices.size() + 1));
221 prolongation_matrices[to_level - 1]
222 ->block(mg_target_component[mg_selected_component],
223 mg_target_component[mg_selected_component])
229 template <
typename number>
235 Assert((from_level >= 1) && (from_level <= prolongation_matrices.size()),
236 ExcIndexRange(from_level, 1, prolongation_matrices.size() + 1));
238 prolongation_matrices[from_level - 1]
239 ->block(mg_target_component[mg_selected_component],
240 mg_target_component[mg_selected_component])
241 .Tvmult_add(dst, src);
247 template <
typename number>
254 template <
typename number>
263 template <
typename number>
269 Assert((to_level >= 1) && (to_level <= prolongation_matrices.size()),
270 ExcIndexRange(to_level, 1, prolongation_matrices.size() + 1));
273 if (this->mg_constrained_dofs !=
nullptr)
274 Assert(this->mg_constrained_dofs->get_user_constraint_matrix(to_level - 1)
280 prolongation_matrices[to_level - 1]
281 ->block(selected_block, selected_block)
286 template <
typename number>
292 Assert((from_level >= 1) && (from_level <= prolongation_matrices.size()),
293 ExcIndexRange(from_level, 1, prolongation_matrices.size() + 1));
295 prolongation_matrices[from_level - 1]
296 ->block(selected_block, selected_block)
297 .Tvmult_add(dst, src);
304 #include "multigrid.inst"
unsigned int n_blocks() const
BlockType & block(const unsigned int i)
std::vector< unsigned int > mg_block
std::vector< std::vector< types::global_dof_index > > sizes
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
std::vector< std::vector< types::global_dof_index > > mg_block_start
std::size_t memory_consumption() const
virtual void prolongate(const unsigned int to_level, Vector< number > &dst, const Vector< number > &src) const override
virtual void restrict_and_add(const unsigned int from_level, Vector< number > &dst, const Vector< number > &src) const override
virtual void prolongate(const unsigned int to_level, BlockVector< number > &dst, const BlockVector< number > &src) const override
virtual void restrict_and_add(const unsigned int from_level, BlockVector< number > &dst, const BlockVector< number > &src) const override
virtual ~MGTransferBlock() override
void initialize(const std::vector< number > &factors, VectorMemory< Vector< number >> &memory)
std::vector< unsigned int > mg_target_component
ComponentMask component_mask
std::vector< unsigned int > target_component
std::vector< types::global_dof_index > component_start
std::vector< std::shared_ptr< BlockSparseMatrix< double > > > prolongation_matrices
std::vector< std::vector< types::global_dof_index > > mg_component_start
std::vector< std::shared_ptr< BlockSparsityPattern > > prolongation_sparsities
std::vector< std::vector< types::global_dof_index > > sizes
std::size_t memory_consumption() const
virtual void prolongate(const unsigned int to_level, Vector< number > &dst, const Vector< number > &src) const override
virtual void restrict_and_add(const unsigned int from_level, Vector< number > &dst, const Vector< number > &src) const override
virtual void reinit(const size_type N, const bool omit_zeroing_entries=false)
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
static ::ExceptionBase & ExcNotInitialized()
static ::ExceptionBase & ExcDimensionMismatch(std::size_t arg1, std::size_t arg2)
#define Assert(cond, exc)
static ::ExceptionBase & ExcNotImplemented()
static ::ExceptionBase & ExcIndexRange(std::size_t arg1, std::size_t arg2, std::size_t arg3)
std::enable_if_t< std::is_fundamental_v< T >, std::size_t > memory_consumption(const T &t)
SymmetricTensor< 2, dim, Number > b(const Tensor< 2, dim, Number > &F)