00001
00002
00003
00004
00005
00006
00007
00008
00009
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