deal.II version 9.8.0
\(\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
mg_transfer_block.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) 2001 - 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#ifndef dealii_mg_transfer_block_h
14#define dealii_mg_transfer_block_h
15
16#include <deal.II/base/config.h>
17
19
21
25
28
29#include <memory>
30
31
33
34
35// Forward declaration
36#ifndef DOXYGEN
37template <int dim, int spacedim>
39class DoFHandler;
40#endif
41
42/*
43 * MGTransferBase is defined in mg_base.h
44 */
45
50
60{
61public:
67
72
76 std::size_t
77 memory_consumption() const;
78
79protected:
87 template <int dim, int spacedim>
88 void
89 build(const DoFHandler<dim, spacedim> &dof_handler);
90
97 // TODO: rename this to block_mask, in the same way as has already been done
98 // in MGTransferComponent, and give it type BlockMask
99 std::vector<bool> selected;
100
104 unsigned int n_mg_blocks;
105
112 // TODO: rename this to mg_block_mask, in the same way as has already been
113 // done in MGTransferComponent, and give it type BlockMask
114 std::vector<unsigned int> mg_block;
115
119 mutable std::vector<std::vector<types::global_dof_index>> sizes;
120
124 std::vector<types::global_dof_index> block_start;
125
129 std::vector<std::vector<types::global_dof_index>> mg_block_start;
130
135
136private:
137 std::vector<std::shared_ptr<BlockSparsityPattern>> prolongation_sparsities;
138
139protected:
145 std::vector<std::shared_ptr<BlockSparseMatrix<double>>> prolongation_matrices;
146
153 std::vector<std::vector<std::vector<std::pair<unsigned int, unsigned int>>>>
155
159
162};
163
181template <typename number>
182class MGTransferBlock : public MGTransferBase<BlockVector<number>>,
183 private MGTransferBlockBase
184{
185public:
190
194 virtual ~MGTransferBlock() override;
195
200 void
201 initialize(const std::vector<number> &factors,
203
210 template <int dim, int spacedim>
211 void
212 build(const DoFHandler<dim, spacedim> &dof_handler,
213 const std::vector<bool> &selected);
214
215 virtual void
216 prolongate(const unsigned int to_level,
218 const BlockVector<number> &src) const override;
219
220 virtual void
221 restrict_and_add(const unsigned int from_level,
223 const BlockVector<number> &src) const override;
224
236 template <int dim, typename number2, int spacedim>
237 void
238 copy_to_mg(const DoFHandler<dim, spacedim> &dof_handler,
240 const BlockVector<number2> &src) const;
241
248 template <int dim, typename number2, int spacedim>
249 void
252 const MGLevelObject<BlockVector<number>> &src) const;
253
259 template <int dim, typename number2, int spacedim>
260 void
263 const MGLevelObject<BlockVector<number>> &src) const;
264
266
267private:
272 std::vector<number> factors;
273
279};
280
281
282// TODO:[GK] Update documentation for copy_* functions
283
294template <typename number>
295class MGTransferBlockSelect : public MGTransferBase<Vector<number>>,
296 private MGTransferBlockBase
297{
298public:
304
309
313 virtual ~MGTransferBlockSelect() override = default;
314
325 template <int dim, int spacedim>
326 void
327 build(const DoFHandler<dim, spacedim> &dof_handler, unsigned int selected);
328
332 void
333 select(const unsigned int block);
334
335 virtual void
336 prolongate(const unsigned int to_level,
337 Vector<number> &dst,
338 const Vector<number> &src) const override;
339
340 virtual void
341 restrict_and_add(const unsigned int from_level,
342 Vector<number> &dst,
343 const Vector<number> &src) const override;
344
351 template <int dim, typename number2, int spacedim>
352 void
353 copy_to_mg(const DoFHandler<dim, spacedim> &dof_handler,
355 const Vector<number2> &src) const;
356
363 template <int dim, typename number2, int spacedim>
364 void
366 Vector<number2> &dst,
367 const MGLevelObject<Vector<number>> &src) const;
368
374 template <int dim, typename number2, int spacedim>
375 void
377 Vector<number2> &dst,
378 const MGLevelObject<Vector<number>> &src) const;
379
387 template <int dim, typename number2, int spacedim>
388 void
389 copy_to_mg(const DoFHandler<dim, spacedim> &dof_handler,
391 const BlockVector<number2> &src) const;
392
399 template <int dim, typename number2, int spacedim>
400 void
403 const MGLevelObject<Vector<number>> &src) const;
404
410 template <int dim, typename number2, int spacedim>
411 void
414 const MGLevelObject<Vector<number>> &src) const;
415
419 std::size_t
421
422private:
426 template <int dim, class OutVector, int spacedim>
427 void
429 OutVector &dst,
430 const MGLevelObject<Vector<number>> &src,
431 const unsigned int offset) const;
432
436 template <int dim, class OutVector, int spacedim>
437 void
439 OutVector &dst,
440 const MGLevelObject<Vector<number>> &src,
441 const unsigned int offset) const;
442
446 template <int dim, class InVector, int spacedim>
447 void
450 const InVector &src,
451 const unsigned int offset) const;
455 unsigned int selected_block;
456};
457
459
460//------------------------- inline function definition ------------------------
461template <typename number>
462inline void
464{
465 selected_block = block;
466}
467
469
470#endif
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
ObserverPointer< const MGConstrainedDoFs, MGTransferBlockBase > mg_constrained_dofs
std::vector< std::vector< types::global_dof_index > > mg_block_start
std::size_t memory_consumption() const
Definition multigrid.cc:172
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 do_copy_to_mg(const DoFHandler< dim, spacedim > &dof_handler, MGLevelObject< Vector< number > > &dst, const InVector &src, const unsigned int offset) const
void copy_from_mg(const DoFHandler< dim, spacedim > &dof_handler, BlockVector< number2 > &dst, const MGLevelObject< Vector< number > > &src) const
virtual ~MGTransferBlockSelect() override=default
virtual void prolongate(const unsigned int to_level, Vector< number > &dst, const Vector< number > &src) const override
Definition multigrid.cc:264
void build(const DoFHandler< dim, spacedim > &dof_handler, unsigned int selected)
virtual void restrict_and_add(const unsigned int from_level, Vector< number > &dst, const Vector< number > &src) const override
Definition multigrid.cc:289
void copy_from_mg_add(const DoFHandler< dim, spacedim > &dof_handler, BlockVector< number2 > &dst, const MGLevelObject< Vector< number > > &src) const
void copy_from_mg_add(const DoFHandler< dim, spacedim > &dof_handler, Vector< number2 > &dst, const MGLevelObject< Vector< number > > &src) const
std::size_t memory_consumption() const
void do_copy_from_mg(const DoFHandler< dim, spacedim > &dof_handler, OutVector &dst, const MGLevelObject< Vector< number > > &src, const unsigned int offset) const
void do_copy_from_mg_add(const DoFHandler< dim, spacedim > &dof_handler, OutVector &dst, const MGLevelObject< Vector< number > > &src, const unsigned int offset) const
void select(const unsigned int block)
void copy_from_mg(const DoFHandler< dim, spacedim > &dof_handler, Vector< number2 > &dst, const MGLevelObject< Vector< number > > &src) const
std::vector< number > factors
void copy_from_mg(const DoFHandler< dim, spacedim > &dof_handler, BlockVector< number2 > &dst, const MGLevelObject< BlockVector< number > > &src) const
virtual void prolongate(const unsigned int to_level, BlockVector< number > &dst, const BlockVector< number > &src) const override
Definition multigrid.cc:74
void build(const DoFHandler< dim, spacedim > &dof_handler, const std::vector< bool > &selected)
virtual void restrict_and_add(const unsigned int from_level, BlockVector< number > &dst, const BlockVector< number > &src) const override
Definition multigrid.cc:109
void copy_from_mg_add(const DoFHandler< dim, spacedim > &dof_handler, BlockVector< number2 > &dst, const MGLevelObject< BlockVector< number > > &src) const
virtual ~MGTransferBlock() override
Definition multigrid.cc:55
ObserverPointer< VectorMemory< Vector< number > >, MGTransferBlock< number > > memory
void copy_to_mg(const DoFHandler< dim, spacedim > &dof_handler, MGLevelObject< BlockVector< number > > &dst, const BlockVector< number2 > &src) const
void initialize(const std::vector< number > &factors, VectorMemory< Vector< number > > &memory)
Definition multigrid.cc:64
#define DEAL_II_NAMESPACE_OPEN
Definition config.h:38
#define DEAL_II_CXX20_REQUIRES(condition)
Definition config.h:246
#define DEAL_II_NAMESPACE_CLOSE
Definition config.h:39
#define DeclException0(Exception0)
static ::ExceptionBase & ExcMatricesNotBuilt()