Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
matrixtraits.hh 1.38 KiB
#ifndef DUNE_MATRIX_VECTOR_MATRIXTRAITS_HH
#define DUNE_MATRIX_VECTOR_MATRIXTRAITS_HH

#include <dune/common/diagonalmatrix.hh>
#include <dune/common/fmatrix.hh>
#include <dune/istl/bcrsmatrix.hh>
#include <dune/istl/multitypeblockmatrix.hh>
#include <dune/istl/scaledidmatrix.hh>

namespace Dune {
  namespace MatrixVector {

    /** \brief Class to identify matrix types and extract information
     *
     * Specialize this class for all types that can be used like a matrix.
     */
    template<class T>
    struct MatrixTraits
    {
        enum { isMatrix=false };
        enum { rows=-1};
        enum { cols=-1};
    };

    template<class T, int n, int m>
    struct MatrixTraits<Dune::FieldMatrix<T,n,m> >
    {
        enum { isMatrix=true };
        enum { rows=n};
        enum { cols=m};
    };

    template<class T, int n>
    struct MatrixTraits<Dune::DiagonalMatrix<T,n> >
    {
        enum { isMatrix=true };
        enum { rows=n};
        enum { cols=n};
    };

    template<class T, int n>
    struct MatrixTraits<Dune::ScaledIdentityMatrix<T,n> >
    {
        enum { isMatrix=true };
        enum { rows=n};
        enum { cols=n};
    };

    template<class T>
    struct MatrixTraits<Dune::BCRSMatrix<T> >
    {
        enum { isMatrix=true };
    };

    template<class... T>
    struct MatrixTraits<MultiTypeBlockMatrix<T...> >
    {
        enum { isMatrix=true };
    };
  }
}
#endif