Reference documentation for deal.II version 8.4.2
mg_transfer_block.h
1 // ---------------------------------------------------------------------
2 //
3 // Copyright (C) 2001 - 2015 by the deal.II authors
4 //
5 // This file is part of the deal.II library.
6 //
7 // The deal.II library is free software; you can use it, redistribute
8 // it, and/or modify it under the terms of the GNU Lesser General
9 // Public License as published by the Free Software Foundation; either
10 // version 2.1 of the License, or (at your option) any later version.
11 // The full text of the license can be found in the file LICENSE at
12 // the top level of the deal.II distribution.
13 //
14 // ---------------------------------------------------------------------
15 
16 #ifndef dealii__mg_transfer_block_h
17 #define dealii__mg_transfer_block_h
18 
19 #include <deal.II/base/config.h>
20 
21 #include <deal.II/lac/block_vector.h>
22 #include <deal.II/lac/sparsity_pattern.h>
23 #include <deal.II/lac/block_sparsity_pattern.h>
24 #include <deal.II/lac/vector_memory.h>
25 #include <deal.II/lac/block_matrix_array.h>
26 
27 #include <deal.II/multigrid/mg_base.h>
28 #include <deal.II/multigrid/mg_constrained_dofs.h>
29 #include <deal.II/base/mg_level_object.h>
30 
31 
32 
33 #include <deal.II/dofs/dof_handler.h>
34 
35 #include <deal.II/base/std_cxx11/shared_ptr.h>
36 
37 
38 DEAL_II_NAMESPACE_OPEN
39 
40 
41 template <int dim, int spacedim> class DoFHandler;
42 
43 /*
44  * MGTransferBase is defined in mg_base.h
45  */
46 
49 
61 {
62 public:
76  std::size_t memory_consumption () const;
77 
78 protected:
86  template <int dim, int spacedim>
88  const DoFHandler<dim,spacedim> &mg_dof);
89 
96 //TODO: rename this to block_mask, in the same way as has already been done in MGTransferComponent, and give it type BlockMask
97  std::vector<bool> selected;
98 
102  unsigned int n_mg_blocks;
103 
110 //TODO: rename this to mg_block_mask, in the same way as has already been done in MGTransferComponent, and give it type BlockMask
111  std::vector<unsigned int> mg_block;
112 
116  mutable std::vector<std::vector<types::global_dof_index> > sizes;
117 
121  std::vector<types::global_dof_index> block_start;
122 
126  std::vector<std::vector<types::global_dof_index> > mg_block_start;
127 
131  DeclException0(ExcMatricesNotBuilt);
132 
133 private:
134  std::vector<std_cxx11::shared_ptr<BlockSparsityPattern> > prolongation_sparsities;
135 
136 protected:
137 
143  std::vector<std_cxx11::shared_ptr<BlockSparseMatrix<double> > > prolongation_matrices;
144 
151  std::vector<std::vector<std::vector<std::pair<unsigned int, unsigned int> > > >
162 };
163 
183 template <typename number>
184 class MGTransferBlock : public MGTransferBase<BlockVector<number> >,
185  private MGTransferBlockBase
186 {
187 public:
191  MGTransferBlock();
192 
196  virtual ~MGTransferBlock ();
197 
202  void initialize (const std::vector<number> &factors,
203  VectorMemory<Vector<number> > &memory);
204 
211  template<int dim, int spacedim>
212  void build_matrices (const DoFHandler<dim,spacedim> &dof,
213  const DoFHandler<dim,spacedim> &mg_dof,
214  const std::vector<bool> &selected);
215 
216  virtual void prolongate (const unsigned int to_level,
217  BlockVector<number> &dst,
218  const BlockVector<number> &src) const;
219 
220  virtual void restrict_and_add (const unsigned int from_level,
221  BlockVector<number> &dst,
222  const BlockVector<number> &src) const;
223 
232  template <int dim, typename number2, int spacedim>
233  void
234  copy_to_mg (const DoFHandler<dim,spacedim> &mg_dof,
236  const BlockVector<number2> &src) const;
237 
244  template <int dim, typename number2, int spacedim>
245  void
246  copy_from_mg (const DoFHandler<dim,spacedim> &mg_dof,
248  const MGLevelObject<BlockVector<number> > &src) const;
249 
255  template <int dim, typename number2, int spacedim>
256  void
257  copy_from_mg_add (const DoFHandler<dim,spacedim> &mg_dof,
259  const MGLevelObject<BlockVector<number> > &src) const;
260 
262 
263 private:
268  std::vector<number> factors;
269 
275 };
276 
277 
278 //TODO:[GK] Update documentation for copy_* functions
279 
292 template <typename number>
293 class MGTransferBlockSelect : public MGTransferBase<Vector<number> >,
294  private MGTransferBlockBase
295 {
296 public:
310  virtual ~MGTransferBlockSelect ();
311 
324  template<int dim, int spacedim>
325  void build_matrices (const DoFHandler<dim,spacedim> &dof,
326  const DoFHandler<dim,spacedim> &mg_dof,
327  unsigned int selected);
328 
332  void select (const unsigned int block);
333 
334  virtual void prolongate (const unsigned int to_level,
335  Vector<number> &dst,
336  const Vector<number> &src) const;
337 
338  virtual void restrict_and_add (const unsigned int from_level,
339  Vector<number> &dst,
340  const Vector<number> &src) const;
341 
346  template <int dim, typename number2, int spacedim>
347  void
348  copy_to_mg (const DoFHandler<dim,spacedim> &mg_dof,
350  const Vector<number2> &src) const;
351 
358  template <int dim, typename number2, int spacedim>
359  void
360  copy_from_mg (const DoFHandler<dim,spacedim> &mg_dof,
361  Vector<number2> &dst,
362  const MGLevelObject<Vector<number> > &src) const;
363 
369  template <int dim, typename number2, int spacedim>
370  void
371  copy_from_mg_add (const DoFHandler<dim,spacedim> &mg_dof,
372  Vector<number2> &dst,
373  const MGLevelObject<Vector<number> > &src) const;
374 
379  template <int dim, typename number2, int spacedim>
380  void
381  copy_to_mg (const DoFHandler<dim,spacedim> &mg_dof,
383  const BlockVector<number2> &src) const;
384 
391  template <int dim, typename number2, int spacedim>
392  void
393  copy_from_mg (const DoFHandler<dim,spacedim> &mg_dof,
395  const MGLevelObject<Vector<number> > &src) const;
396 
402  template <int dim, typename number2, int spacedim>
403  void
404  copy_from_mg_add (const DoFHandler<dim,spacedim> &mg_dof,
406  const MGLevelObject<Vector<number> > &src) const;
407 
411  std::size_t memory_consumption () const;
412 
413 private:
417  template <int dim, class OutVector, int spacedim>
418  void
419  do_copy_from_mg (const DoFHandler<dim,spacedim> &mg_dof,
420  OutVector &dst,
421  const MGLevelObject<Vector<number> > &src,
422  const unsigned int offset) const;
423 
427  template <int dim, class OutVector, int spacedim>
428  void
429  do_copy_from_mg_add (const DoFHandler<dim,spacedim> &mg_dof,
430  OutVector &dst,
431  const MGLevelObject<Vector<number> > &src,
432  const unsigned int offset) const;
433 
437  template <int dim, class InVector, int spacedim>
438  void
439  do_copy_to_mg (const DoFHandler<dim,spacedim> &mg_dof,
441  const InVector &src,
442  const unsigned int offset) const;
446  unsigned int selected_block;
447 };
448 
451 //----------inline function definition--------------------------------------------------
452 template <typename number>
453 inline void
454 MGTransferBlockSelect<number>::select(const unsigned int block)
455 {
456  selected_block = block;
457 }
458 
459 DEAL_II_NAMESPACE_CLOSE
460 
461 #endif
void build_matrices(const DoFHandler< dim, spacedim > &dof, const DoFHandler< dim, spacedim > &mg_dof)
std::size_t memory_consumption() const
Definition: multigrid.cc:164
std::vector< types::global_dof_index > block_start
SmartPointer< const MGConstrainedDoFs, MGTransferBlockBase > mg_constrained_dofs
std::vector< std::vector< types::global_dof_index > > sizes
std::vector< std_cxx11::shared_ptr< BlockSparseMatrix< double > > > prolongation_matrices
void select(const unsigned int block)
std::vector< std::vector< std::vector< std::pair< unsigned int, unsigned int > > > > copy_indices
std::vector< unsigned int > mg_block
std::vector< std::vector< types::global_dof_index > > mg_block_start
SmartPointer< VectorMemory< Vector< number > >, MGTransferBlock< number > > memory
std::vector< number > factors
SmartPointer< const ConstraintMatrix, MGTransferBlockBase > constraints
DeclException0(ExcMatricesNotBuilt)
std::vector< bool > selected