Reference documentation for deal.II version 8.1.0
mg_transfer_block.h
1 // ---------------------------------------------------------------------
2 // @f$Id: mg_transfer_block.h 30036 2013-07-18 16:55:32Z maier @f$
3 //
4 // Copyright (C) 2001 - 2013 by the deal.II authors
5 //
6 // This file is part of the deal.II library.
7 //
8 // The deal.II library is free software; you can use it, redistribute
9 // it, and/or modify it under the terms of the GNU Lesser General
10 // Public License as published by the Free Software Foundation; either
11 // version 2.1 of the License, or (at your option) any later version.
12 // The full text of the license can be found in the file LICENSE at
13 // the top level of the deal.II distribution.
14 //
15 // ---------------------------------------------------------------------
16 
17 #ifndef __deal2__mg_transfer_block_h
18 #define __deal2__mg_transfer_block_h
19 
20 #include <deal.II/base/config.h>
21 
22 #include <deal.II/lac/block_vector.h>
23 #include <deal.II/lac/sparsity_pattern.h>
24 #include <deal.II/lac/block_sparsity_pattern.h>
25 #include <deal.II/lac/vector_memory.h>
26 #include <deal.II/lac/block_matrix_array.h>
27 
28 #include <deal.II/multigrid/mg_base.h>
29 #include <deal.II/multigrid/mg_constrained_dofs.h>
30 #include <deal.II/base/mg_level_object.h>
31 
32 
33 
34 #include <deal.II/dofs/dof_handler.h>
35 
36 #include <deal.II/base/std_cxx1x/shared_ptr.h>
37 
38 
40 
41 
42 template <int dim, int spacedim> class DoFHandler;
43 
44 /*
45  * MGTransferBase is defined in mg_base.h
46  */
47 
50 
62 {
63 public:
80  std::size_t memory_consumption () const;
81 
82 protected:
94  template <int dim, int spacedim>
96  const DoFHandler<dim,spacedim> &mg_dof);
97 
105 //TODO: rename this to block_mask, in the same way as has already been done in MGTransferComponent, and give it type BlockMask
106  std::vector<bool> selected;
107 
112  unsigned int n_mg_blocks;
113 
125 //TODO: rename this to mg_block_mask, in the same way as has already been done in MGTransferComponent, and give it type BlockMask
126  std::vector<unsigned int> mg_block;
127 
131  mutable std::vector<std::vector<types::global_dof_index> > sizes;
132 
136  std::vector<types::global_dof_index> block_start;
137 
142  std::vector<std::vector<types::global_dof_index> > mg_block_start;
143 
148  DeclException0(ExcMatricesNotBuilt);
149 
150 private:
151  std::vector<std_cxx1x::shared_ptr<BlockSparsityPattern> > prolongation_sparsities;
152 
153 protected:
154 
163  std::vector<std_cxx1x::shared_ptr<BlockSparseMatrix<double> > > prolongation_matrices;
164 
176  std::vector<std::vector<std::vector<std::pair<unsigned int, unsigned int> > > >
189 };
190 
211 template <typename number>
212 class MGTransferBlock : public MGTransferBase<BlockVector<number> >,
213  private MGTransferBlockBase
214 {
215 public:
219  MGTransferBlock();
220 
224  virtual ~MGTransferBlock ();
225 
232  void initialize (const std::vector<number> &factors,
233  VectorMemory<Vector<number> > &memory);
234 
243  template<int dim, int spacedim>
244  void build_matrices (const DoFHandler<dim,spacedim> &dof,
245  const DoFHandler<dim,spacedim> &mg_dof,
246  const std::vector<bool> &selected);
247 
248  virtual void prolongate (const unsigned int to_level,
249  BlockVector<number> &dst,
250  const BlockVector<number> &src) const;
251 
252  virtual void restrict_and_add (const unsigned int from_level,
253  BlockVector<number> &dst,
254  const BlockVector<number> &src) const;
255 
271  template <int dim, typename number2, int spacedim>
272  void
273  copy_to_mg (const DoFHandler<dim,spacedim> &mg_dof,
275  const BlockVector<number2> &src) const;
276 
286  template <int dim, typename number2, int spacedim>
287  void
288  copy_from_mg (const DoFHandler<dim,spacedim> &mg_dof,
290  const MGLevelObject<BlockVector<number> > &src) const;
291 
300  template <int dim, typename number2, int spacedim>
301  void
302  copy_from_mg_add (const DoFHandler<dim,spacedim> &mg_dof,
304  const MGLevelObject<BlockVector<number> > &src) const;
305 
307 
308 private:
315  std::vector<number> factors;
316 
323 };
324 
325 
326 //TODO:[GK] Update documentation for copy_* functions
327 
340 template <typename number>
341 class MGTransferBlockSelect : public MGTransferBase<Vector<number> >,
342  private MGTransferBlockBase
343 {
344 public:
361  virtual ~MGTransferBlockSelect ();
362 
381  template<int dim, int spacedim>
382  void build_matrices (const DoFHandler<dim,spacedim> &dof,
383  const DoFHandler<dim,spacedim> &mg_dof,
384  unsigned int selected);
385 
390  void select (const unsigned int block);
391 
392  virtual void prolongate (const unsigned int to_level,
393  Vector<number> &dst,
394  const Vector<number> &src) const;
395 
396  virtual void restrict_and_add (const unsigned int from_level,
397  Vector<number> &dst,
398  const Vector<number> &src) const;
399 
405  template <int dim, typename number2, int spacedim>
406  void
407  copy_to_mg (const DoFHandler<dim,spacedim> &mg_dof,
409  const Vector<number2> &src) const;
410 
420  template <int dim, typename number2, int spacedim>
421  void
422  copy_from_mg (const DoFHandler<dim,spacedim> &mg_dof,
423  Vector<number2> &dst,
424  const MGLevelObject<Vector<number> > &src) const;
425 
434  template <int dim, typename number2, int spacedim>
435  void
436  copy_from_mg_add (const DoFHandler<dim,spacedim> &mg_dof,
437  Vector<number2> &dst,
438  const MGLevelObject<Vector<number> > &src) const;
439 
446  template <int dim, typename number2, int spacedim>
447  void
448  copy_to_mg (const DoFHandler<dim,spacedim> &mg_dof,
450  const BlockVector<number2> &src) const;
451 
462  template <int dim, typename number2, int spacedim>
463  void
464  copy_from_mg (const DoFHandler<dim,spacedim> &mg_dof,
466  const MGLevelObject<Vector<number> > &src) const;
467 
476  template <int dim, typename number2, int spacedim>
477  void
478  copy_from_mg_add (const DoFHandler<dim,spacedim> &mg_dof,
480  const MGLevelObject<Vector<number> > &src) const;
481 
485  std::size_t memory_consumption () const;
486 
487 private:
492  template <int dim, class OutVector, int spacedim>
493  void
494  do_copy_from_mg (const DoFHandler<dim,spacedim> &mg_dof,
495  OutVector &dst,
496  const MGLevelObject<Vector<number> > &src,
497  const unsigned int offset) const;
498 
503  template <int dim, class OutVector, int spacedim>
504  void
505  do_copy_from_mg_add (const DoFHandler<dim,spacedim> &mg_dof,
506  OutVector &dst,
507  const MGLevelObject<Vector<number> > &src,
508  const unsigned int offset) const;
509 
514  template <int dim, class InVector, int spacedim>
515  void
516  do_copy_to_mg (const DoFHandler<dim,spacedim> &mg_dof,
518  const InVector &src,
519  const unsigned int offset) const;
523  unsigned int selected_block;
524 };
525 
528 //----------inline function definition--------------------------------------------------
529 template <typename number>
530 inline void
531 MGTransferBlockSelect<number>::select(const unsigned int block)
532 {
533  selected_block = block;
534 }
535 
536 DEAL_II_NAMESPACE_CLOSE
537 
538 #endif
void build_matrices(const DoFHandler< dim, spacedim > &dof, const DoFHandler< dim, spacedim > &mg_dof)
std::vector< types::global_dof_index > block_start
SmartPointer< const MGConstrainedDoFs, MGTransferBlockBase > mg_constrained_dofs
std::vector< std_cxx1x::shared_ptr< BlockSparseMatrix< double > > > prolongation_matrices
std::vector< std::vector< types::global_dof_index > > sizes
std::size_t memory_consumption() const
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