/usr/include/dune/istl/matrixindexset.hh is in libdune-istl-dev 2.4.1-1.
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 | // -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
// vi: set et ts=4 sw=2 sts=2:
#ifndef DUNE_ISTL_MATRIXINDEXSET_HH
#define DUNE_ISTL_MATRIXINDEXSET_HH
#include <vector>
#include <set>
namespace Dune {
/** \brief Stores the nonzero entries in a sparse matrix */
class MatrixIndexSet
{
public:
typedef std::size_t size_type;
/** \brief Default constructor */
MatrixIndexSet() : rows_(0), cols_(0)
{}
/** \brief Constructor setting the matrix size */
MatrixIndexSet(size_type rows, size_type cols) : rows_(rows), cols_(cols) {
indices_.resize(rows_);
}
/** \brief Reset the size of an index set */
void resize(size_type rows, size_type cols) {
rows_ = rows;
cols_ = cols;
indices_.resize(rows_);
}
/** \brief Add an index to the index set */
void add(size_type i, size_type j) {
indices_[i].insert(j);
}
/** \brief Return the number of entries */
size_type size() const {
size_type entries = 0;
for (size_type i=0; i<rows_; i++)
entries += indices_[i].size();
return entries;
}
/** \brief Return the number of rows */
size_type rows() const {return rows_;}
/** \brief Return the number of entries in a given row */
size_type rowsize(size_type row) const {return indices_[row].size();}
/** \brief Import all nonzero entries of a sparse matrix into the index set
\tparam MatrixType Needs to be BCRSMatrix<...>
\param m reference to the MatrixType object
\param rowOffset don't write to rows<rowOffset
\param colOffset don't write to cols<colOffset
*/
template <class MatrixType>
void import(const MatrixType& m, size_type rowOffset=0, size_type colOffset=0) {
typedef typename MatrixType::row_type RowType;
typedef typename RowType::ConstIterator ColumnIterator;
for (size_type rowIdx=0; rowIdx<m.N(); rowIdx++) {
const RowType& row = m[rowIdx];
ColumnIterator cIt = row.begin();
ColumnIterator cEndIt = row.end();
for(; cIt!=cEndIt; ++cIt)
add(rowIdx+rowOffset, cIt.index()+colOffset);
}
}
/** \brief Initializes a BCRSMatrix with the indices contained
in this MatrixIndexSet
\tparam MatrixType Needs to be BCRSMatrix<...>
\param matrix reference to the MatrixType object
*/
template <class MatrixType>
void exportIdx(MatrixType& matrix) const {
matrix.setSize(rows_, cols_);
matrix.setBuildMode(MatrixType::random);
for (size_type i=0; i<rows_; i++)
matrix.setrowsize(i, indices_[i].size());
matrix.endrowsizes();
for (size_type i=0; i<rows_; i++) {
typename std::set<size_type>::iterator it = indices_[i].begin();
for (; it!=indices_[i].end(); ++it)
matrix.addindex(i, *it);
}
matrix.endindices();
}
private:
std::vector<std::set<size_type> > indices_;
size_type rows_, cols_;
};
} // end namespace Dune
#endif
|