include/deal.II/multigrid/mg_transfer_block.h

00001 //---------------------------------------------------------------------------
00002 //    @f$Id: mg_transfer_block.h 25345 2012-03-31 08:37:04Z bangerth @f$
00003 //
00004 //    Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2009, 2010, 2011, 2012 by the deal.II authors
00005 //
00006 //    This file is subject to QPL and may not be  distributed
00007 //    without copyright and license information. Please refer
00008 //    to the file deal.II/doc/license.html for the  text  and
00009 //    further information on this license.
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  * MGTransferBase is defined in mg_base.h
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 //TODO:[GK] Update documentation for copy_* functions
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 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines

deal.II documentation generated on Tue May 22 2012 12:06:17 by doxygen 1.7.3