From a39f59a92594045f19f38b7693ceffd1bca3d8f5 Mon Sep 17 00:00:00 2001
From: Oliver Sander <sander@dune-project.org>
Date: Wed, 26 Sep 2012 06:31:31 +0000
Subject: [PATCH] Convert diagonalmatrix.hh into a backward-compatibility stub.

The actual code is now in dune-common

[[Imported from SVN: r1712]]
---
 dune/istl/diagonalmatrix.hh | 1070 +----------------------------------
 1 file changed, 4 insertions(+), 1066 deletions(-)

diff --git a/dune/istl/diagonalmatrix.hh b/dune/istl/diagonalmatrix.hh
index 128a0e391..533a69029 100644
--- a/dune/istl/diagonalmatrix.hh
+++ b/dune/istl/diagonalmatrix.hh
@@ -1,1072 +1,10 @@
 // -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
 // vi: set et ts=4 sw=2 sts=2:
-#ifndef DUNE_DIAGONAL_MATRIX_HH
-#define DUNE_DIAGONAL_MATRIX_HH
-
 /*! \file
    \brief  This file implements a quadratic diagonal matrix of fixed size.
+   \deprecated Use the corresponding file from dune-common instead!
  */
 
-#include <cmath>
-#include <cstddef>
-#include <complex>
-#include <iostream>
-#include <memory>
-#include <dune/common/exceptions.hh>
-#include <dune/common/fmatrix.hh>
-#include <dune/common/fvector.hh>
-#include <dune/common/typetraits.hh>
-#include <dune/common/genericiterator.hh>
-
-
-
-namespace Dune {
-
-  template< class K, int n > class DiagonalRowVectorConst;
-  template< class K, int n > class DiagonalRowVector;
-  template< class DiagonalMatrixType > class DiagonalMatrixWrapper;
-  template< class C, class T, class R> class ContainerWrapperIterator;
-
-  /**
-      @addtogroup DenseMatVec
-      @{
-   */
-
-  /**
-     *@brief A diagonal matrix of static size.
-   *
-   * This is meant to be a replacement of FieldMatrix for the case that
-   * it is a diagonal matrix.
-   *
-   * \tparam K Type used for scalars
-   * \tparam n Matrix size
-   */
-  template<class K, int n>
-  class DiagonalMatrix
-  {
-    typedef DiagonalMatrixWrapper< DiagonalMatrix<K,n> > WrapperType;
-
-  public:
-    //===== type definitions and constants
-
-    //! export the type representing the field
-    typedef K field_type;
-
-    //! export the type representing the components
-    typedef K block_type;
-
-    //! The type used for the index access and size operations.
-    typedef std::size_t size_type;
-
-    //! We are at the leaf of the block recursion
-    enum {
-      //! The number of block levels we contain. This is 1.
-      blocklevel = 1
-    };
-
-    //! Each row is implemented by a field vector
-    typedef DiagonalRowVector<K,n> row_type;
-    typedef row_type reference;
-    typedef DiagonalRowVectorConst<K,n> const_row_type;
-    typedef const_row_type const_reference;
-
-    //! export size
-    enum {
-      //! The number of rows
-      rows = n,
-      //! The number of columns
-      cols = n
-    };
-
-
-
-    //===== constructors
-
-    //! Default constructor
-    DiagonalMatrix () {}
-
-    //! Constructor initializing the whole matrix with a scalar
-    DiagonalMatrix (const K& k)
-      : diag_(k)
-    {}
-
-    //! Constructor initializing the diagonal with a vector
-    DiagonalMatrix (const FieldVector<K,n>& diag)
-      : diag_(diag)
-    {}
-
-
-    /** \brief Assignment from a scalar */
-    DiagonalMatrix& operator= (const K& k)
-    {
-      diag_ = k;
-      return *this;
-    }
-
-    /** \brief Check if matrix is the same object as the other matrix */
-    bool identical(const DiagonalMatrix<K,n>& other) const
-    {
-      return (this==&other);
-    }
-
-    //===== iterator interface to rows of the matrix
-    //! Iterator class for sequential access
-    typedef ContainerWrapperIterator<const WrapperType, reference, reference> Iterator;
-    //! typedef for stl compliant access
-    typedef Iterator iterator;
-    //! rename the iterators for easier access
-    typedef Iterator RowIterator;
-    //! rename the iterators for easier access
-    typedef typename row_type::Iterator ColIterator;
-
-    //! begin iterator
-    Iterator begin ()
-    {
-      return Iterator(WrapperType(this),0);
-    }
-
-    //! end iterator
-    Iterator end ()
-    {
-      return Iterator(WrapperType(this),n);
-    }
-
-    //! @returns an iterator that is positioned before
-    //! the end iterator of the rows, i.e. at the last row.
-    Iterator beforeEnd ()
-    {
-      return Iterator(WrapperType(this),n-1);
-    }
-
-    //! @returns an iterator that is positioned before
-    //! the first row of the matrix.
-    Iterator beforeBegin ()
-    {
-      return Iterator(WrapperType(this),-1);
-    }
-
-
-    //! Iterator class for sequential access
-    typedef ContainerWrapperIterator<const WrapperType, const_reference, const_reference> ConstIterator;
-    //! typedef for stl compliant access
-    typedef ConstIterator const_iterator;
-    //! rename the iterators for easier access
-    typedef ConstIterator ConstRowIterator;
-    //! rename the iterators for easier access
-    typedef typename const_row_type::ConstIterator ConstColIterator;
-
-    //! begin iterator
-    ConstIterator begin () const
-    {
-      return ConstIterator(WrapperType(this),0);
-    }
-
-    //! end iterator
-    ConstIterator end () const
-    {
-      return ConstIterator(WrapperType(this),n);
-    }
-
-    //! @returns an iterator that is positioned before
-    //! the end iterator of the rows. i.e. at the last row.
-    ConstIterator beforeEnd() const
-    {
-      return ConstIterator(WrapperType(this),n-1);
-    }
-
-    //! @returns an iterator that is positioned before
-    //! the first row of the matrix.
-    ConstIterator beforeBegin () const
-    {
-      return ConstIterator(WrapperType(this),-1);
-    }
-
-
-
-    //===== vector space arithmetic
-
-    //! vector space addition
-    DiagonalMatrix& operator+= (const DiagonalMatrix& y)
-    {
-      diag_ += y.diag_;
-      return *this;
-    }
-
-    //! vector space subtraction
-    DiagonalMatrix& operator-= (const DiagonalMatrix& y)
-    {
-      diag_ -= y.diag_;
-      return *this;
-    }
-
-    //! vector space multiplication with scalar
-    DiagonalMatrix& operator+= (const K& k)
-    {
-      diag_ += k;
-      return *this;
-    }
-
-    //! vector space division by scalar
-    DiagonalMatrix& operator-= (const K& k)
-    {
-      diag_ -= k;
-      return *this;
-    }
-
-    //! vector space multiplication with scalar
-    DiagonalMatrix& operator*= (const K& k)
-    {
-      diag_ *= k;
-      return *this;
-    }
-
-    //! vector space division by scalar
-    DiagonalMatrix& operator/= (const K& k)
-    {
-      diag_ /= k;
-      return *this;
-    }
-
-    //===== comparison ops
-
-    //! comparison operator
-    bool operator==(const DiagonalMatrix& other) const
-    {
-      return diag_==other.diagonal();
-    }
-
-    //! incomparison operator
-    bool operator!=(const DiagonalMatrix& other) const
-    {
-      return diag_!=other.diagonal();
-    }
-
-
-    //===== linear maps
-
-    //! y = A x
-    template<class X, class Y>
-    void mv (const X& x, Y& y) const
-    {
-#ifdef DUNE_FMatrix_WITH_CHECKING
-      if (x.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
-      if (y.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
-#endif
-      for (size_type i=0; i<n; ++i)
-        y[i] = diag_[i] * x[i];
-    }
-
-    //! y = A^T x
-    template<class X, class Y>
-    void mtv (const X& x, Y& y) const
-    {
-      mv(x, y);
-    }
-
-    //! y += A x
-    template<class X, class Y>
-    void umv (const X& x, Y& y) const
-    {
-#ifdef DUNE_FMatrix_WITH_CHECKING
-      if (x.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
-      if (y.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
-#endif
-      for (size_type i=0; i<n; ++i)
-        y[i] += diag_[i] * x[i];
-    }
-
-    //! y += A^T x
-    template<class X, class Y>
-    void umtv (const X& x, Y& y) const
-    {
-#ifdef DUNE_FMatrix_WITH_CHECKING
-      if (x.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
-      if (y.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
-#endif
-      for (size_type i=0; i<n; ++i)
-        y[i] += diag_[i] * x[i];
-    }
-
-    //! y += A^H x
-    template<class X, class Y>
-    void umhv (const X& x, Y& y) const
-    {
-#ifdef DUNE_FMatrix_WITH_CHECKING
-      if (x.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
-      if (y.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
-#endif
-      for (size_type i=0; i<n; i++)
-        y[i] += conjugateComplex(diag_[i])*x[i];
-    }
-
-    //! y -= A x
-    template<class X, class Y>
-    void mmv (const X& x, Y& y) const
-    {
-#ifdef DUNE_FMatrix_WITH_CHECKING
-      if (x.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
-      if (y.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
-#endif
-      for (size_type i=0; i<n; ++i)
-        y[i] -= diag_[i] * x[i];
-    }
-
-    //! y -= A^T x
-    template<class X, class Y>
-    void mmtv (const X& x, Y& y) const
-    {
-#ifdef DUNE_FMatrix_WITH_CHECKING
-      if (x.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
-      if (y.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
-#endif
-      for (size_type i=0; i<n; ++i)
-        y[i] -= diag_[i] * x[i];
-    }
-
-    //! y -= A^H x
-    template<class X, class Y>
-    void mmhv (const X& x, Y& y) const
-    {
-#ifdef DUNE_FMatrix_WITH_CHECKING
-      if (x.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
-      if (y.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
-#endif
-      for (size_type i=0; i<n; i++)
-        y[i] -= conjugateComplex(diag_[i])*x[i];
-    }
-
-    //! y += alpha A x
-    template<class X, class Y>
-    void usmv (const K& alpha, const X& x, Y& y) const
-    {
-#ifdef DUNE_FMatrix_WITH_CHECKING
-      if (x.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
-      if (y.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
-#endif
-      for (size_type i=0; i<n; i++)
-        y[i] += alpha * diag_[i] * x[i];
-    }
-
-    //! y += alpha A^T x
-    template<class X, class Y>
-    void usmtv (const K& alpha, const X& x, Y& y) const
-    {
-#ifdef DUNE_FMatrix_WITH_CHECKING
-      if (x.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
-      if (y.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
-#endif
-      for (size_type i=0; i<n; i++)
-        y[i] += alpha * diag_[i] * x[i];
-    }
-
-    //! y += alpha A^H x
-    template<class X, class Y>
-    void usmhv (const K& alpha, const X& x, Y& y) const
-    {
-#ifdef DUNE_FMatrix_WITH_CHECKING
-      if (x.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
-      if (y.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
-#endif
-      for (size_type i=0; i<n; i++)
-        y[i] += alpha * conjugateComplex(diag_[i]) * x[i];
-    }
-
-    //===== norms
-
-    //! frobenius norm: sqrt(sum over squared values of entries)
-    double frobenius_norm () const
-    {
-      return diag_.two_norm();
-    }
-
-    //! square of frobenius norm, need for block recursion
-    double frobenius_norm2 () const
-    {
-      return diag_.two_norm2();
-    }
-
-    //! infinity norm (row sum norm, how to generalize for blocks?)
-    double infinity_norm () const
-    {
-      return diag_.infinity_norm();
-    }
-
-    //! simplified infinity norm (uses Manhattan norm for complex values)
-    double infinity_norm_real () const
-    {
-      return diag_.infinity_norm_real();
-    }
-
-
-
-    //===== solve
-
-    //! Solve system A x = b
-    template<class V>
-    void solve (V& x, const V& b) const
-    {
-      for (int i=0; i<n; i++)
-        x[i] = b[i]/diag_[i];
-    }
-
-    //! Compute inverse
-    void invert()
-    {
-      for (int i=0; i<n; i++)
-        diag_[i] = 1/diag_[i];
-    }
-
-    //! calculates the determinant of this matrix
-    K determinant () const
-    {
-      K det = diag_[0];
-      for (int i=1; i<n; i++)
-        det *= diag_[i];
-      return det;
-    }
-
-
-
-    //===== sizes
-
-    //! number of blocks in row direction
-    size_type N () const
-    {
-      return n;
-    }
-
-    //! number of blocks in column direction
-    size_type M () const
-    {
-      return n;
-    }
-
-
-
-    //===== query
-
-    //! return true when (i,j) is in pattern
-    bool exists (size_type i, size_type j) const
-    {
-#ifdef DUNE_FMatrix_WITH_CHECKING
-      if (i<0 || i>=n) DUNE_THROW(FMatrixError,"row index out of range");
-      if (j<0 || j>=n) DUNE_THROW(FMatrixError,"column index out of range");
-#endif
-      return i==j;
-    }
-
-
-
-    //! Sends the matrix to an output stream
-    friend std::ostream& operator<< (std::ostream& s, const DiagonalMatrix<K,n>& a)
-    {
-      for (size_type i=0; i<n; i++) {
-        for (size_type j=0; j<n; j++)
-          s << ((i==j) ? a.diag_[i] : 0) << " ";
-        s << std::endl;
-      }
-      return s;
-    }
-
-    //! Return reference object as row replacement
-    reference operator[](size_type i)
-    {
-      return reference(const_cast<K*>(&diag_[i]), i);
-    }
-
-    //! Return const_reference object as row replacement
-    const_reference operator[](size_type i) const
-    {
-      return const_reference(const_cast<K*>(&diag_[i]), i);
-    }
-
-    //! Get const reference to diagonal entry
-    const K& diagonal(size_type i) const
-    {
-      return diag_[i];
-    }
-
-    //! Get reference to diagonal entry
-    K& diagonal(size_type i)
-    {
-      return diag_[i];
-    }
-
-    //! Get const reference to diagonal vector
-    const FieldVector<K,n>& diagonal() const
-    {
-      return diag_;
-    }
-
-    //! Get reference to diagonal vector
-    FieldVector<K,n>& diagonal()
-    {
-      return diag_;
-    }
-
-  private:
-
-    // the data, a FieldVector storing the diagonal
-    FieldVector<K,n> diag_;
-  };
-
-#ifndef DOXYGEN // hide specialization
-  /** \brief Special type for 1x1 matrices
-   */
-  template< class K >
-  class DiagonalMatrix<K, 1> : public FieldMatrix<K, 1, 1>
-  {
-    typedef FieldMatrix<K,1,1> Base;
-  public:
-    //! The type used for index access and size operations
-    typedef typename Base::size_type size_type;
-
-    //! We are at the leaf of the block recursion
-    enum {
-      //! The number of block levels we contain.
-      //! This is always one for this type.
-      blocklevel = 1
-    };
-
-    typedef typename Base::row_type row_type;
-
-    typedef typename Base::row_reference row_reference;
-    typedef typename Base::const_row_reference const_row_reference;
-
-    //! export size
-    enum {
-      //! \brief The number of rows.
-      //! This is always one for this type.
-      rows = 1,
-      //! \brief The number of columns.
-      //! This is always one for this type.
-      cols = 1
-    };
-
-
-    //! Default Constructor
-    DiagonalMatrix()
-    {}
-
-    //! Constructor initializing the whole matrix with a scalar
-    DiagonalMatrix(const K& scalar)
-    {
-      (*this)[0][0] = scalar;
-    }
-
-    //! Constructor initializing the whole matrix with a scalar from convertible type
-    template<typename T>
-    DiagonalMatrix(const T& t)
-    {
-      DenseMatrixAssigner<Conversion<T,K>::exists>::assign(*this, t);
-    }
-
-    //! Get const reference to diagonal entry
-    const K& diagonal(size_type) const
-    {
-      return (*this)[0][0];
-    }
-
-    //! Get reference to diagonal entry
-    K& diagonal(size_type)
-    {
-      return (*this)[0][0];
-    }
-
-    //! Get const reference to diagonal vector
-    const FieldVector<K,1>& diagonal() const
-    {
-      return (*this)[0];
-    }
-
-    //! Get reference to diagonal vector
-    FieldVector<K,1>& diagonal()
-    {
-      return (*this)[0];
-    }
-
-  };
-#endif
-
-
-  template<class DiagonalMatrixType>
-  class DiagonalMatrixWrapper
-  {
-    typedef typename DiagonalMatrixType::reference reference;
-    typedef typename DiagonalMatrixType::const_reference const_reference;
-    typedef typename DiagonalMatrixType::field_type K;
-    typedef DiagonalRowVector<K, DiagonalMatrixType::rows> row_type;
-    typedef std::size_t size_type;
-    typedef DiagonalMatrixWrapper< DiagonalMatrixType> MyType;
-
-    friend class ContainerWrapperIterator<const MyType, reference, reference>;
-    friend class ContainerWrapperIterator<const MyType, const_reference, const_reference>;
-
-  public:
-
-    DiagonalMatrixWrapper() :
-      mat_(0)
-    {}
-
-    DiagonalMatrixWrapper(const DiagonalMatrixType* mat) :
-      mat_(const_cast<DiagonalMatrixType*>(mat))
-    {}
-
-    size_type realIndex(int i) const
-    {
-      return i;
-    }
-
-    row_type* pointer(int i) const
-    {
-      row_ = row_type(&(mat_->diagonal(i)), i);
-      return &row_;
-    }
-
-    bool identical(const DiagonalMatrixWrapper& other) const
-    {
-      return mat_==other.mat_;
-    }
-
-  private:
-
-    mutable DiagonalMatrixType* mat_;
-    mutable row_type row_;
-  };
-
-  /** \brief
-   *
-   */
-  template< class K, int n >
-  class DiagonalRowVectorConst
-  {
-    template<class DiagonalMatrixType>
-    friend class DiagonalMatrixWrapper;
-    friend class ContainerWrapperIterator<DiagonalRowVectorConst<K,n>, const K, const K&>;
-
-  public:
-    // remember size of vector
-    enum { dimension = n };
-
-    // standard constructor and everything is sufficient ...
-
-    //===== type definitions and constants
-
-    //! export the type representing the field
-    typedef K field_type;
-
-    //! export the type representing the components
-    typedef K block_type;
-
-    //! The type used for the index access and size operation
-    typedef std::size_t size_type;
-
-    //! We are at the leaf of the block recursion
-    enum {
-      //! The number of block levels we contain
-      blocklevel = 1
-    };
-
-    //! export size
-    enum {
-      //! The size of this vector.
-      size = n
-    };
-
-    //! Constructor making uninitialized vector
-    DiagonalRowVectorConst() :
-      p_(0),
-      row_(0)
-    {}
-
-    //! Constructor making vector with identical coordinates
-    explicit DiagonalRowVectorConst (K* p, int col) :
-      p_(p),
-      row_(col)
-    {}
-
-    //===== access to components
-
-    //! same for read only access
-    const K& operator[] (size_type i) const
-    {
-#ifdef DUNE_FMatrix_WITH_CHECKING
-      if (i!=row_)
-        DUNE_THROW(FMatrixError,"index is not contained in pattern");
-#endif
-      return *p_;
-    }
-
-    // check if row is identical to other row (not only identical values)
-    // since this is a proxy class we need to check equality of the stored pointer
-    bool identical(const DiagonalRowVectorConst<K,n>& other) const
-    {
-      return ((p_ == other.p_)and (row_ == other.row_));
-    }
-
-    //! ConstIterator class for sequential access
-    typedef ContainerWrapperIterator<DiagonalRowVectorConst<K,n>, const K, const K&> ConstIterator;
-    //! typedef for stl compliant access
-    typedef ConstIterator const_iterator;
-
-    //! begin ConstIterator
-    ConstIterator begin () const
-    {
-      return ConstIterator(*this,0);
-    }
-
-    //! end ConstIterator
-    ConstIterator end () const
-    {
-      return ConstIterator(*this,1);
-    }
-
-    //! @returns an iterator that is positioned before
-    //! the end iterator of the rows. i.e. at the row.
-    ConstIterator beforeEnd() const
-    {
-      return ConstIterator(*this,0);
-    }
-
-    //! @returns an iterator that is positioned before
-    //! the first row of the matrix.
-    ConstIterator beforeBegin () const
-    {
-      return ConstIterator(*this,-1);
-    }
-
-    //! Binary vector comparison
-    bool operator== (const DiagonalRowVectorConst& y) const
-    {
-      return ((p_==y.p_)and (row_==y.row_));
-    }
-
-    //===== sizes
-
-    //! number of blocks in the vector (are of size 1 here)
-    size_type N () const
-    {
-      return n;
-    }
-
-    //! dimension of the vector space
-    size_type dim () const
-    {
-      return n;
-    }
-
-    //! index of this row in surrounding matrix
-    size_type rowIndex() const
-    {
-      return row_;
-    }
-
-    //! the diagonal value
-    const K& diagonal() const
-    {
-      return *p_;
-    }
-
-  protected:
-
-    size_type realIndex(int i) const
-    {
-      return rowIndex();
-    }
-
-    K* pointer(size_type i) const
-    {
-      return const_cast<K*>(p_);
-    }
-
-    DiagonalRowVectorConst* operator&()
-    {
-      return this;
-    }
-
-    // the data, very simply a pointer to the diagonal value and the row number
-    K* p_;
-    size_type row_;
-  };
-
-  template< class K, int n >
-  class DiagonalRowVector : public DiagonalRowVectorConst<K,n>
-  {
-    template<class DiagonalMatrixType>
-    friend class DiagonalMatrixWrapper;
-    friend class ContainerWrapperIterator<DiagonalRowVector<K,n>, K, K&>;
-
-  public:
-    // standard constructor and everything is sufficient ...
-
-    //===== type definitions and constants
-
-    //! export the type representing the field
-    typedef K field_type;
-
-    //! export the type representing the components
-    typedef K block_type;
-
-    //! The type used for the index access and size operation
-    typedef std::size_t size_type;
-
-    //! Constructor making uninitialized vector
-    DiagonalRowVector() : DiagonalRowVectorConst<K,n>()
-    {}
-
-    //! Constructor making vector with identical coordinates
-    explicit DiagonalRowVector (K* p, int col) : DiagonalRowVectorConst<K,n>(p, col)
-    {}
-
-    //===== assignment from scalar
-    //! Assignment operator for scalar
-    DiagonalRowVector& operator= (const K& k)
-    {
-      *p_ = k;
-      return *this;
-    }
-
-    //===== access to components
-
-    //! random access
-    K& operator[] (size_type i)
-    {
-#ifdef DUNE_FMatrix_WITH_CHECKING
-      if (i!=row_)
-        DUNE_THROW(FMatrixError,"index is contained in pattern");
-#endif
-      return *p_;
-    }
-
-    //! Iterator class for sequential access
-    typedef ContainerWrapperIterator<DiagonalRowVector<K,n>, K, K&> Iterator;
-    //! typedef for stl compliant access
-    typedef Iterator iterator;
-
-    //! begin iterator
-    Iterator begin ()
-    {
-      return Iterator(*this, 0);
-    }
-
-    //! end iterator
-    Iterator end ()
-    {
-      return Iterator(*this, 1);
-    }
-
-    //! @returns an iterator that is positioned before
-    //! the end iterator of the rows, i.e. at the last row.
-    Iterator beforeEnd ()
-    {
-      return Iterator(*this, 0);
-    }
-
-    //! @returns an iterator that is positioned before
-    //! the first row of the matrix.
-    Iterator beforeBegin ()
-    {
-      return Iterator(*this, -1);
-    }
-
-    //! ConstIterator class for sequential access
-    typedef ContainerWrapperIterator<DiagonalRowVectorConst<K,n>, const K, const K&> ConstIterator;
-    //! typedef for stl compliant access
-    typedef ConstIterator const_iterator;
-
-    using DiagonalRowVectorConst<K,n>::identical;
-    using DiagonalRowVectorConst<K,n>::operator[];
-    using DiagonalRowVectorConst<K,n>::operator==;
-    using DiagonalRowVectorConst<K,n>::begin;
-    using DiagonalRowVectorConst<K,n>::end;
-    using DiagonalRowVectorConst<K,n>::beforeEnd;
-    using DiagonalRowVectorConst<K,n>::beforeBegin;
-    using DiagonalRowVectorConst<K,n>::N;
-    using DiagonalRowVectorConst<K,n>::dim;
-    using DiagonalRowVectorConst<K,n>::rowIndex;
-    using DiagonalRowVectorConst<K,n>::diagonal;
-
-  protected:
-
-    DiagonalRowVector* operator&()
-    {
-      return this;
-    }
-
-  private:
-
-    using DiagonalRowVectorConst<K,n>::p_;
-    using DiagonalRowVectorConst<K,n>::row_;
-  };
-
-
-  // implement type traits
-  template<class K, int n>
-  struct const_reference< DiagonalRowVector<K,n> >
-  {
-    typedef DiagonalRowVectorConst<K,n> type;
-  };
-
-  template<class K, int n>
-  struct const_reference< DiagonalRowVectorConst<K,n> >
-  {
-    typedef DiagonalRowVectorConst<K,n> type;
-  };
-
-  template<class K, int n>
-  struct mutable_reference< DiagonalRowVector<K,n> >
-  {
-    typedef DiagonalRowVector<K,n> type;
-  };
-
-  template<class K, int n>
-  struct mutable_reference< DiagonalRowVectorConst<K,n> >
-  {
-    typedef DiagonalRowVector<K,n> type;
-  };
-
-
-
-  /** \brief Iterator class for sparse vector-like containers
-   *
-   * This class provides an iterator for sparse vector like containers.
-   * It contains a ContainerWrapper that must provide the translation
-   * from the position in the underlying container to the index
-   * in the sparse container.
-   *
-   * The ContainerWrapper must be default and copy-constructable.
-   * Furthermore it must provide the methods:
-   *
-   * bool identical(other)      - check if this is identical to other (same container, not only equal)
-   * T* pointer(position)       - get pointer to data at position in underlying container
-   * size_t realIndex(position) - get index in sparse container for position in underlying container
-   *
-   * Notice that the iterator stores a ContainerWrapper.
-   * This allows to use proxy classes as underlying container
-   * and as returned reference type.
-   *
-   * \tparam CW The container wrapper class
-   * \tparam T The contained type
-   * \tparam R The reference type returned by dereference
-   */
-  template<class CW, class T, class R>
-  class ContainerWrapperIterator : public BidirectionalIteratorFacade<ContainerWrapperIterator<CW,T,R>,T, R, int>
-  {
-    typedef typename remove_const<CW>::type NonConstCW;
-
-    friend class ContainerWrapperIterator<CW, typename mutable_reference<T>::type, typename mutable_reference<R>::type>;
-    friend class ContainerWrapperIterator<CW, typename const_reference<T>::type, typename const_reference<R>::type>;
-
-    typedef ContainerWrapperIterator<CW, typename mutable_reference<T>::type, typename mutable_reference<R>::type> MyType;
-    typedef ContainerWrapperIterator<CW, typename const_reference<T>::type, typename const_reference<R>::type> MyConstType;
-
-  public:
-
-    // Constructors needed by the facade iterators.
-    ContainerWrapperIterator() :
-      containerWrapper_(),
-      position_(0)
-    {}
-
-    ContainerWrapperIterator(CW containerWrapper, int position) :
-      containerWrapper_(containerWrapper),
-      position_(position)
-    {}
-
-    template<class OtherContainerWrapperIteratorType>
-    ContainerWrapperIterator(OtherContainerWrapperIteratorType& other) :
-      containerWrapper_(other.containerWrapper_),
-      position_(other.position_)
-    {}
-
-    ContainerWrapperIterator(const MyType& other) :
-      containerWrapper_(other.containerWrapper_),
-      position_(other.position_)
-    {}
-
-    ContainerWrapperIterator(const MyConstType& other) :
-      containerWrapper_(other.containerWrapper_),
-      position_(other.position_)
-    {}
-
-    template<class OtherContainerWrapperIteratorType>
-    ContainerWrapperIterator& operator=(OtherContainerWrapperIteratorType& other)
-    {
-      containerWrapper_ = other.containerWrapper_;
-      position_ = other.position_;
-    }
-
-    // This operator is needed since we can not get the address of the
-    // temporary object returned by dereference
-    T* operator->() const
-    {
-      return containerWrapper_.pointer(position_);
-    }
-
-    // Methods needed by the forward iterator
-    bool equals(const MyType& other) const
-    {
-      return position_ == other.position_ && containerWrapper_.identical(other.containerWrapper_);
-    }
-
-    bool equals(const MyConstType& other) const
-    {
-      return position_ == other.position_ && containerWrapper_.identical(other.containerWrapper_);
-    }
-
-    R dereference() const
-    {
-      return *containerWrapper_.pointer(position_);
-    }
-
-    void increment()
-    {
-      ++position_;
-    }
-
-    // Additional function needed by BidirectionalIterator
-    void decrement()
-    {
-      --position_;
-    }
-
-    // Additional function needed by RandomAccessIterator
-    R elementAt(int i) const
-    {
-      return *containerWrapper_.pointer(position_+i);
-    }
-
-    void advance(int n)
-    {
-      position_=position_+n;
-    }
-
-    template<class OtherContainerWrapperIteratorType>
-    std::ptrdiff_t distanceTo(OtherContainerWrapperIteratorType& other) const
-    {
-      assert(containerWrapper_.identical(other));
-      return other.position_ - position_;
-    }
-
-    std::ptrdiff_t index() const
-    {
-      return containerWrapper_.realIndex(position_);
-    }
-
-  private:
-    NonConstCW containerWrapper_;
-    size_t position_;
-  };
-
-
-
-  template<class M, class K, int n>
-  void istl_assign_to_fmatrix(DenseMatrix<M>& fm, const DiagonalMatrix<K,n>& s)
-  {
-    fm = K();
-    for(int i=0; i<n; ++i)
-      fm[i][i] = s.diagonal()[i];
-  }
-  /* @} */
-} // end namespace
-#endif
+#warning The file diagonalmatrix.hh has moved from dune-istl to dune-common,\
+  and will be removed from dune-istl after dune 2.3!
+#include <dune/common/diagonalmatrix.hh>
-- 
GitLab