17 #ifndef __deal2__block_sparse_matrix_h
18 #define __deal2__block_sparse_matrix_h
21 #include <deal.II/base/config.h>
22 #include <deal.II/base/table.h>
23 #include <deal.II/lac/block_matrix_base.h>
24 #include <deal.II/lac/block_vector.h>
25 #include <deal.II/lac/sparse_matrix.h>
26 #include <deal.II/lac/block_sparsity_pattern.h>
27 #include <deal.II/lac/exceptions.h>
49 template <
typename number>
70 typedef typename BaseClass::pointer pointer;
71 typedef typename BaseClass::const_pointer const_pointer;
72 typedef typename BaseClass::reference reference;
73 typedef typename BaseClass::const_reference const_reference;
74 typedef typename BaseClass::size_type size_type;
269 template <
typename block_number>
280 template <
typename block_number,
281 typename nonblock_number>
292 template <
typename block_number,
293 typename nonblock_number>
304 template <
typename nonblock_number>
316 template <
typename block_number>
327 template <
typename block_number,
328 typename nonblock_number>
339 template <
typename block_number,
340 typename nonblock_number>
351 template <
typename nonblock_number>
375 template <
class BlockVectorType>
377 const BlockVectorType &src,
378 const number omega = 1.)
const;
387 template <
typename number2>
390 const number omega = 1.)
const;
439 const unsigned int precision = 3,
440 const bool scientific =
true,
441 const unsigned int width = 0,
442 const char *zero_string =
" ",
443 const double denominator = 1.)
const;
474 template <
typename number>
481 for (size_type r=0; r<this->n_block_rows(); ++r)
482 for (size_type c=0; c<this->n_block_cols(); ++c)
483 this->block(r,c) = d;
490 template <
typename number>
491 template <
typename block_number>
497 BaseClass::vmult_block_block (dst, src);
502 template <
typename number>
503 template <
typename block_number,
504 typename nonblock_number>
510 BaseClass::vmult_block_nonblock (dst, src);
515 template <
typename number>
516 template <
typename block_number,
517 typename nonblock_number>
523 BaseClass::vmult_nonblock_block (dst, src);
528 template <
typename number>
529 template <
typename nonblock_number>
535 BaseClass::vmult_nonblock_nonblock (dst, src);
540 template <
typename number>
541 template <
typename block_number>
547 BaseClass::Tvmult_block_block (dst, src);
552 template <
typename number>
553 template <
typename block_number,
554 typename nonblock_number>
560 BaseClass::Tvmult_block_nonblock (dst, src);
565 template <
typename number>
566 template <
typename block_number,
567 typename nonblock_number>
573 BaseClass::Tvmult_nonblock_block (dst, src);
578 template <
typename number>
579 template <
typename nonblock_number>
585 BaseClass::Tvmult_nonblock_nonblock (dst, src);
590 template <
typename number>
591 template <
class BlockVectorType>
596 const BlockVectorType &src,
597 const number omega)
const
599 Assert (this->n_block_rows() == this->n_block_cols(), ExcNotQuadratic());
600 Assert (dst.n_blocks() == this->n_block_rows(),
602 Assert (src.n_blocks() == this->n_block_cols(),
607 for (size_type i=0; i<this->n_block_rows(); ++i)
608 this->block(i,i).precondition_Jacobi (dst.block(i),
615 template <
typename number>
616 template <
typename number2>
622 const number omega)
const
627 Assert (this->n_block_cols() == 1,
628 ExcMessage (
"This function only works if the matrix has "
630 Assert (this->n_block_rows() == 1,
631 ExcMessage (
"This function only works if the matrix has "
636 this->block(0,0).precondition_Jacobi (dst, src, omega);
640 DEAL_II_NAMESPACE_CLOSE
642 #endif // __deal2__block_sparse_matrix_h
virtual void reinit(const BlockSparsityPattern &sparsity)
SmartPointer< const BlockSparsityPattern, BlockSparseMatrix< number > > sparsity_pattern
BlockMatrixBase< SparseMatrix< number > > BaseClass
size_type n_nonzero_elements() const
BlockSparseMatrix & operator=(const BlockSparseMatrix &)
::ExceptionBase & ExcMessage(std::string arg1)
std::size_t memory_consumption() const
DeclException0(ExcBlockDimensionMismatch)
size_type get_row_length(const size_type row) const
#define Assert(cond, exc)
BaseClass::BlockType BlockType
BlockType::value_type value_type
void print_formatted(std::ostream &out, const unsigned int precision=3, const bool scientific=true, const unsigned int width=0, const char *zero_string=" ", const double denominator=1.) const
const BlockSparsityPattern & get_sparsity_pattern() const
void Tvmult(BlockVector< block_number > &dst, const BlockVector< block_number > &src) const
BaseClass::value_type value_type
void precondition_Jacobi(BlockVectorType &dst, const BlockVectorType &src, const number omega=1.) const
virtual ~BlockSparseMatrix()
::ExceptionBase & ExcDimensionMismatch(std::size_t arg1, std::size_t arg2)
::ExceptionBase & ExcScalarAssignmentOnlyForZeroValue()
size_type n_actually_nonzero_elements(const double threshold=0.0) const
void vmult(BlockVector< block_number > &dst, const BlockVector< block_number > &src) const