16 #ifndef dealii_block_sparse_matrix_h
17 #define dealii_block_sparse_matrix_h
20 #include <deal.II/base/config.h>
22 #include <deal.II/lac/block_matrix_base.h>
23 #include <deal.II/lac/block_sparsity_pattern.h>
24 #include <deal.II/lac/block_vector.h>
25 #include <deal.II/lac/exceptions.h>
26 #include <deal.II/lac/sparse_matrix.h>
30 DEAL_II_NAMESPACE_OPEN
49 template <
typename number>
67 using pointer =
typename BaseClass::pointer;
68 using const_pointer =
typename BaseClass::const_pointer;
69 using reference =
typename BaseClass::reference;
70 using const_reference =
typename BaseClass::const_reference;
71 using size_type =
typename BaseClass::size_type;
220 template <
typename block_number>
229 template <
typename block_number,
typename nonblock_number>
232 const Vector<nonblock_number> &src)
const;
238 template <
typename block_number,
typename nonblock_number>
240 vmult(Vector<nonblock_number> & dst,
247 template <
typename nonblock_number>
249 vmult(Vector<nonblock_number> &dst,
const Vector<nonblock_number> &src)
const;
256 template <
typename block_number>
265 template <
typename block_number,
typename nonblock_number>
268 const Vector<nonblock_number> &src)
const;
274 template <
typename block_number,
typename nonblock_number>
276 Tvmult(Vector<nonblock_number> & dst,
283 template <
typename nonblock_number>
285 Tvmult(Vector<nonblock_number> & dst,
286 const Vector<nonblock_number> &src)
const;
300 template <
class BlockVectorType>
303 const BlockVectorType &src,
304 const number omega = 1.)
const;
311 template <
typename number2>
314 const Vector<number2> &src,
315 const number omega = 1.)
const;
344 const unsigned int precision = 3,
345 const bool scientific =
true,
346 const unsigned int width = 0,
347 const char * zero_string =
" ",
348 const double denominator = 1.)
const;
378 template <
typename number>
384 for (size_type r = 0; r < this->n_block_rows(); ++r)
385 for (size_type c = 0; c < this->n_block_cols(); ++c)
386 this->block(r, c) = d;
393 template <
typename number>
394 template <
typename block_number>
399 BaseClass::vmult_block_block(dst, src);
404 template <
typename number>
405 template <
typename block_number,
typename nonblock_number>
408 const Vector<nonblock_number> &src)
const
410 BaseClass::vmult_block_nonblock(dst, src);
415 template <
typename number>
416 template <
typename block_number,
typename nonblock_number>
421 BaseClass::vmult_nonblock_block(dst, src);
426 template <
typename number>
427 template <
typename nonblock_number>
430 const Vector<nonblock_number> &src)
const
432 BaseClass::vmult_nonblock_nonblock(dst, src);
437 template <
typename number>
438 template <
typename block_number>
443 BaseClass::Tvmult_block_block(dst, src);
448 template <
typename number>
449 template <
typename block_number,
typename nonblock_number>
452 const Vector<nonblock_number> &src)
const
454 BaseClass::Tvmult_block_nonblock(dst, src);
459 template <
typename number>
460 template <
typename block_number,
typename nonblock_number>
465 BaseClass::Tvmult_nonblock_block(dst, src);
470 template <
typename number>
471 template <
typename nonblock_number>
474 const Vector<nonblock_number> &src)
const
476 BaseClass::Tvmult_nonblock_nonblock(dst, src);
481 template <
typename number>
482 template <
class BlockVectorType>
485 const BlockVectorType &src,
486 const number omega)
const
489 Assert(dst.n_blocks() == this->n_block_rows(),
491 Assert(src.n_blocks() == this->n_block_cols(),
496 for (size_type i = 0; i < this->n_block_rows(); ++i)
497 this->block(i, i).precondition_Jacobi(dst.block(i), src.block(i), omega);
502 template <
typename number>
503 template <
typename number2>
506 const Vector<number2> &src,
507 const number omega)
const
512 Assert(this->n_block_cols() == 1,
513 ExcMessage(
"This function only works if the matrix has "
515 Assert(this->n_block_rows() == 1,
516 ExcMessage(
"This function only works if the matrix has "
521 this->block(0, 0).precondition_Jacobi(dst, src, omega);
525 DEAL_II_NAMESPACE_CLOSE
527 #endif // dealii_block_sparse_matrix_h