include/deal.II/lac/block_matrix.h

00001 //---------------------------------------------------------------------------
00002 //    @f$Id: block_matrix.h 25345 2012-03-31 08:37:04Z bangerth @f$
00003 //
00004 //    Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009, 2010, 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__block_matrix_h
00013 #define __deal2__block_matrix_h
00014 
00015 
00016 #include <deal.II/base/config.h>
00017 #include <deal.II/base/exceptions.h>
00018 #include <deal.II/base/smartpointer.h>
00019 #include <deal.II/lac/block_vector.h>
00020 
00021 DEAL_II_NAMESPACE_OPEN
00022 
00041 template <class MATRIX>
00042 class BlockDiagonalMatrix : public Subscriptor
00043 {
00044   public:
00050     BlockDiagonalMatrix (const MATRIX       &M,
00051                          const unsigned int  n_blocks);
00052 
00056     template <typename number1, typename number2>
00057     void vmult (BlockVector<number1>& dst,
00058                 const BlockVector<number2>& src) const;
00059 
00063     template <typename number1, typename number2>
00064     void Tvmult (BlockVector<number1>& dst,
00065                  const BlockVector<number2>& src) const;
00066   private:
00070     unsigned int num_blocks;
00071 
00075     SmartPointer<const MATRIX,BlockDiagonalMatrix<MATRIX> > matrix;
00076 };
00077 
00079 //---------------------------------------------------------------------------
00080 
00081 template <class MATRIX>
00082 BlockDiagonalMatrix<MATRIX>::BlockDiagonalMatrix (const MATRIX& M,
00083                                                   const unsigned int num_blocks)
00084                 :
00085                 num_blocks (num_blocks),
00086                 matrix(&M)
00087 {}
00088 
00089 
00090 template <class MATRIX>
00091 template <typename number1, typename number2>
00092 void
00093 BlockDiagonalMatrix<MATRIX>::vmult (BlockVector<number1>& dst,
00094                                     const BlockVector<number2>& src) const
00095 {
00096   Assert (dst.n_blocks()==num_blocks,
00097           ExcDimensionMismatch(dst.n_blocks(),num_blocks));
00098   Assert (src.n_blocks()==num_blocks,
00099           ExcDimensionMismatch(src.n_blocks(),num_blocks));
00100 
00101   for (unsigned int i=0;i<num_blocks;++i)
00102     matrix->vmult (dst.block(i), src.block(i));
00103 }
00104 
00105 
00106 template <class MATRIX>
00107 template <typename number1, typename number2>
00108 void
00109 BlockDiagonalMatrix<MATRIX>::Tvmult (BlockVector<number1>& dst,
00110                                      const BlockVector<number2>& src) const
00111 {
00112   Assert (dst.n_blocks()==num_blocks,
00113           ExcDimensionMismatch(dst.n_blocks(),num_blocks));
00114   Assert (src.n_blocks()==num_blocks,
00115           ExcDimensionMismatch(src.n_blocks(),num_blocks));
00116 
00117   for (unsigned int i=0;i<num_blocks;++i)
00118     matrix->Tvmult (dst.block(i), src.block(i));
00119 }
00120 
00121 
00122 DEAL_II_NAMESPACE_CLOSE
00123 
00124 #endif
00125 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines

deal.II documentation generated on Thu May 17 2012 20:04:39 by doxygen 1.7.3