/usr/include/deal.II/lac/block_matrix.h is in libdeal.ii-dev 8.4.2-2+b1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 | // ---------------------------------------------------------------------
//
// Copyright (C) 2000 - 2015 by the deal.II authors
//
// This file is part of the deal.II library.
//
// The deal.II library is free software; you can use it, redistribute
// it, and/or modify it under the terms of the GNU Lesser General
// Public License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
// The full text of the license can be found in the file LICENSE at
// the top level of the deal.II distribution.
//
// ---------------------------------------------------------------------
#ifndef dealii__block_matrix_h
#define dealii__block_matrix_h
#include <deal.II/base/config.h>
#include <deal.II/base/exceptions.h>
#include <deal.II/base/smartpointer.h>
#include <deal.II/lac/block_vector.h>
DEAL_II_NAMESPACE_OPEN
/*! @addtogroup Matrix2
*@{
*/
/**
* A matrix with several copies of the same block on the diagonal.
*
* This matrix implements an @p m by @p m block matrix. Each diagonal block
* consists of the same (non-block) matrix, while off-diagonal blocks are
* void.
*
* One special application is a one by one block matrix, allowing to apply the
* @p vmult of the original matrix (or preconditioner) to a block vector.
*
* @deprecated If deal.II was configured with C++11 support, use the
* LinearOperator class instead, see the module on
* @ref LAOperators "linear operators"
* for further details.
*
* @see
* @ref GlossBlockLA "Block (linear algebra)"
* @author Guido Kanschat, 2000
*/
template <typename MatrixType>
class BlockDiagonalMatrix : public Subscriptor
{
public:
/**
* Constructor for an @p n_blocks by @p n_blocks matrix with diagonal blocks
* @p M.
*/
BlockDiagonalMatrix (const MatrixType &M,
const unsigned int n_blocks);
/**
* Matrix-vector-multiplication.
*/
template <typename number1, typename number2>
void vmult (BlockVector<number1> &dst,
const BlockVector<number2> &src) const;
/**
* Transposed matrix-vector-multiplication.
*/
template <typename number1, typename number2>
void Tvmult (BlockVector<number1> &dst,
const BlockVector<number2> &src) const;
private:
/**
* Number of blocks.
*/
unsigned int num_blocks;
/**
* Diagonal entry.
*/
SmartPointer<const MatrixType,BlockDiagonalMatrix<MatrixType> > matrix;
};
/*@}*/
//---------------------------------------------------------------------------
template <typename MatrixType>
BlockDiagonalMatrix<MatrixType>::BlockDiagonalMatrix (const MatrixType &M,
const unsigned int num_blocks)
:
num_blocks (num_blocks),
matrix(&M)
{}
template <typename MatrixType>
template <typename number1, typename number2>
void
BlockDiagonalMatrix<MatrixType>::vmult (BlockVector<number1> &dst,
const BlockVector<number2> &src) const
{
Assert (dst.n_blocks()==num_blocks,
ExcDimensionMismatch(dst.n_blocks(),num_blocks));
Assert (src.n_blocks()==num_blocks,
ExcDimensionMismatch(src.n_blocks(),num_blocks));
for (unsigned int i=0; i<num_blocks; ++i)
matrix->vmult (dst.block(i), src.block(i));
}
template <typename MatrixType>
template <typename number1, typename number2>
void
BlockDiagonalMatrix<MatrixType>::Tvmult (BlockVector<number1> &dst,
const BlockVector<number2> &src) const
{
Assert (dst.n_blocks()==num_blocks,
ExcDimensionMismatch(dst.n_blocks(),num_blocks));
Assert (src.n_blocks()==num_blocks,
ExcDimensionMismatch(src.n_blocks(),num_blocks));
for (unsigned int i=0; i<num_blocks; ++i)
matrix->Tvmult (dst.block(i), src.block(i));
}
DEAL_II_NAMESPACE_CLOSE
#endif
|