00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef __deal2__mg_transfer_block_h
00013 #define __deal2__mg_transfer_block_h
00014
00015 #include <deal.II/base/config.h>
00016
00017 #include <deal.II/lac/block_vector.h>
00018 #ifdef DEAL_PREFER_MATRIX_EZ
00019 # include <deal.II/lac/sparse_matrix_ez.h>
00020 # include <deal.II/lac/block_sparse_matrix_ez.h>
00021 #else
00022 # include <deal.II/lac/sparsity_pattern.h>
00023 # include <deal.II/lac/block_sparsity_pattern.h>
00024 #endif
00025 #include <deal.II/lac/vector_memory.h>
00026 #include <deal.II/lac/block_matrix_array.h>
00027
00028 #include <deal.II/multigrid/mg_base.h>
00029 #include <deal.II/multigrid/mg_constrained_dofs.h>
00030 #include <deal.II/base/mg_level_object.h>
00031
00032
00033
00034 #include <deal.II/dofs/dof_handler.h>
00035
00036 #include <deal.II/base/std_cxx1x/shared_ptr.h>
00037
00038
00039 DEAL_II_NAMESPACE_OPEN
00040
00041
00042 template <int dim, int spacedim> class MGDoFHandler;
00043
00044
00045
00046
00047
00050
00061 class MGTransferBlockBase
00062 {
00063 public:
00071 MGTransferBlockBase ();
00075 MGTransferBlockBase (const ConstraintMatrix& constraints,
00076 const MGConstrainedDoFs& mg_constrained_dofs);
00080 std::size_t memory_consumption () const;
00081
00082 protected:
00094 template <int dim, int spacedim>
00095 void build_matrices (const DoFHandler<dim,spacedim>& dof,
00096 const MGDoFHandler<dim,spacedim>& mg_dof);
00097
00105 std::vector<bool> selected;
00106
00111 unsigned int n_mg_blocks;
00112
00124 std::vector<unsigned int> mg_block;
00125
00129 mutable std::vector<std::vector<unsigned int> > sizes;
00130
00134 std::vector<unsigned int> block_start;
00135
00140 std::vector<std::vector<unsigned int> > mg_block_start;
00141
00146 DeclException0(ExcMatricesNotBuilt);
00147
00148 private:
00149 std::vector<std_cxx1x::shared_ptr<BlockSparsityPattern> > prolongation_sparsities;
00150
00151 protected:
00152
00161 std::vector<std_cxx1x::shared_ptr<BlockSparseMatrix<double> > > prolongation_matrices;
00162
00174 std::vector<std::vector<std::vector<std::pair<unsigned int, unsigned int> > > >
00175 copy_indices;
00180 SmartPointer<const ConstraintMatrix, MGTransferBlockBase> constraints;
00186 SmartPointer<const MGConstrainedDoFs, MGTransferBlockBase> mg_constrained_dofs;
00187 };
00188
00209 template <typename number>
00210 class MGTransferBlock : public MGTransferBase<BlockVector<number> >,
00211 private MGTransferBlockBase
00212 {
00213 public:
00217 MGTransferBlock();
00218
00222 virtual ~MGTransferBlock ();
00223
00230 void initialize (const std::vector<number>& factors,
00231 VectorMemory<Vector<number> >& memory);
00232
00241 template<int dim, int spacedim>
00242 void build_matrices (const DoFHandler<dim,spacedim> &dof,
00243 const MGDoFHandler<dim,spacedim> &mg_dof,
00244 const std::vector<bool>& selected);
00245
00246 virtual void prolongate (const unsigned int to_level,
00247 BlockVector<number> &dst,
00248 const BlockVector<number> &src) const;
00249
00250 virtual void restrict_and_add (const unsigned int from_level,
00251 BlockVector<number> &dst,
00252 const BlockVector<number> &src) const;
00253
00269 template <int dim, typename number2, int spacedim>
00270 void
00271 copy_to_mg (const MGDoFHandler<dim,spacedim>& mg_dof,
00272 MGLevelObject<BlockVector<number> >& dst,
00273 const BlockVector<number2>& src) const;
00274
00284 template <int dim, typename number2, int spacedim>
00285 void
00286 copy_from_mg (const MGDoFHandler<dim,spacedim>& mg_dof,
00287 BlockVector<number2>& dst,
00288 const MGLevelObject<BlockVector<number> > &src) const;
00289
00298 template <int dim, typename number2, int spacedim>
00299 void
00300 copy_from_mg_add (const MGDoFHandler<dim,spacedim>& mg_dof,
00301 BlockVector<number2>& dst,
00302 const MGLevelObject<BlockVector<number> > &src) const;
00303
00304 using MGTransferBlockBase::memory_consumption;
00305
00306 private:
00313 std::vector<number> factors;
00314
00320 SmartPointer<VectorMemory<Vector<number> >,MGTransferBlock<number> > memory;
00321 };
00322
00323
00324
00325
00338 template <typename number>
00339 class MGTransferBlockSelect : public MGTransferBase<Vector<number> >,
00340 private MGTransferBlockBase
00341 {
00342 public:
00350 MGTransferBlockSelect ();
00354 MGTransferBlockSelect (const ConstraintMatrix& constraints,
00355 const MGConstrainedDoFs& mg_constrained_dofs);
00359 virtual ~MGTransferBlockSelect ();
00360
00379 template<int dim, int spacedim>
00380 void build_matrices (const DoFHandler<dim,spacedim> &dof,
00381 const MGDoFHandler<dim,spacedim> &mg_dof,
00382 unsigned int selected);
00383
00388 void select (const unsigned int block);
00389
00390 virtual void prolongate (const unsigned int to_level,
00391 Vector<number> &dst,
00392 const Vector<number> &src) const;
00393
00394 virtual void restrict_and_add (const unsigned int from_level,
00395 Vector<number> &dst,
00396 const Vector<number> &src) const;
00397
00403 template <int dim, typename number2, int spacedim>
00404 void
00405 copy_to_mg (const MGDoFHandler<dim,spacedim> &mg_dof,
00406 MGLevelObject<Vector<number> > &dst,
00407 const Vector<number2> &src) const;
00408
00418 template <int dim, typename number2, int spacedim>
00419 void
00420 copy_from_mg (const MGDoFHandler<dim,spacedim> &mg_dof,
00421 Vector<number2> &dst,
00422 const MGLevelObject<Vector<number> > &src) const;
00423
00432 template <int dim, typename number2, int spacedim>
00433 void
00434 copy_from_mg_add (const MGDoFHandler<dim,spacedim> &mg_dof,
00435 Vector<number2> &dst,
00436 const MGLevelObject<Vector<number> > &src) const;
00437
00444 template <int dim, typename number2, int spacedim>
00445 void
00446 copy_to_mg (const MGDoFHandler<dim,spacedim> &mg_dof,
00447 MGLevelObject<Vector<number> > &dst,
00448 const BlockVector<number2> &src) const;
00449
00460 template <int dim, typename number2, int spacedim>
00461 void
00462 copy_from_mg (const MGDoFHandler<dim,spacedim> &mg_dof,
00463 BlockVector<number2> &dst,
00464 const MGLevelObject<Vector<number> > &src) const;
00465
00474 template <int dim, typename number2, int spacedim>
00475 void
00476 copy_from_mg_add (const MGDoFHandler<dim,spacedim> &mg_dof,
00477 BlockVector<number2> &dst,
00478 const MGLevelObject<Vector<number> > &src) const;
00479
00483 std::size_t memory_consumption () const;
00484
00485 private:
00490 template <int dim, class OutVector, int spacedim>
00491 void
00492 do_copy_from_mg (const MGDoFHandler<dim,spacedim> &mg_dof,
00493 OutVector &dst,
00494 const MGLevelObject<Vector<number> > &src,
00495 const unsigned int offset) const;
00496
00501 template <int dim, class OutVector, int spacedim>
00502 void
00503 do_copy_from_mg_add (const MGDoFHandler<dim,spacedim> &mg_dof,
00504 OutVector &dst,
00505 const MGLevelObject<Vector<number> > &src,
00506 const unsigned int offset) const;
00507
00512 template <int dim, class InVector, int spacedim>
00513 void
00514 do_copy_to_mg (const MGDoFHandler<dim,spacedim> &mg_dof,
00515 MGLevelObject<Vector<number> > &dst,
00516 const InVector &src,
00517 const unsigned int offset) const;
00521 unsigned int selected_block;
00522 };
00523
00526
00527 template <typename number>
00528 inline void
00529 MGTransferBlockSelect<number>::select(const unsigned int block)
00530 {
00531 selected_block = block;
00532 }
00533
00534 DEAL_II_NAMESPACE_CLOSE
00535
00536 #endif
00537