diff --git a/dune/common/CMakeLists.txt b/dune/common/CMakeLists.txt index 0075584a18fcac0a6ad17fc627bd7032bf1e0f56..91ebd9e37bd038bb825cd4943ef1da03c8245ab0 100644 --- a/dune/common/CMakeLists.txt +++ b/dune/common/CMakeLists.txt @@ -58,6 +58,7 @@ install(FILES genericiterator.hh gmpfield.hh hash.hh + identitymatrix.hh indent.hh interfaces.hh ios_state.hh diff --git a/dune/common/Makefile.am b/dune/common/Makefile.am index 189757a8299c6a372acaae52444c8ff95a815ea7..421251575264effe2ac832eca2d8def0b2906f26 100644 --- a/dune/common/Makefile.am +++ b/dune/common/Makefile.am @@ -54,6 +54,7 @@ commoninclude_HEADERS = \ genericiterator.hh \ gmpfield.hh \ hash.hh \ + identitymatrix.hh \ indent.hh \ interfaces.hh \ ios_state.hh \ diff --git a/dune/common/identitymatrix.hh b/dune/common/identitymatrix.hh new file mode 100644 index 0000000000000000000000000000000000000000..646e3983c2afcd0fcb13ad0ded0b5b7827b91a7e --- /dev/null +++ b/dune/common/identitymatrix.hh @@ -0,0 +1,160 @@ +#ifndef DUNE_COMMON_IDENTITYMATRIX_HH +#define DUNE_COMMON_IDENTITYMATRIX_HH + +#include <dune/common/fmatrix.hh> +#include <dune/common/ftraits.hh> +#include <dune/common/math.hh> +#include <dune/common/std/constexpr.hh> + +/** + * \file + * \ingroup DenseMatVec + * \brief Implementation of an identity matrix that does not store + * any data. + * \author Christoph Gersbacher + */ + +namespace Dune +{ + + // IdentityMatrix + // -------------- + + /** \class IdentityMatrix + * + * \ingroup DenseMatVec + * + * \brief Read-only identity matrix. + * + * Implementation of an identity matrix that does not store any data. + * + * \tparam K field type + * \tparam N dimension + */ + template< class K, int N > + struct IdentityMatrix + { + /** \brief field type */ + typedef K field_type; + /** \brief size type */ + typedef std::size_t size_type; + + /** \brief return number of rows */ + DUNE_CONSTEXPR size_type rows () const { return N; } + /** \brief return number of columns */ + DUNE_CONSTEXPR size_type cols () const { return N; } + + /** \copydoc Dune::DenseMatrix::mv */ + template< class X, class Y > + void mv ( const X &x, Y &y ) const + { + y = x; + } + + /** \copydoc Dune::DenseMatrix::mtv */ + template< class X, class Y > + void mtv ( const X &x, Y &y ) const + { + y = x; + } + + /** \copydoc Dune::DenseMatrix::umv */ + template< class X, class Y > + void umv ( const X &x, Y &y ) const + { + y += x; + } + + /** \copydoc Dune::DenseMatrix::umtv */ + template< class X, class Y > + void umtv ( const X &x, Y &y ) const + { + y += x; + } + + /** \copydoc Dune::DenseMatrix::umhv */ + template< class X, class Y > + void umhv ( const X &x, Y &y ) const + { + y += x; + } + + /** \copydoc Dune::DenseMatrix::mmv */ + template< class X, class Y > + void mmv ( const X &x, Y &y ) const + { + y -= x; + } + + /** \copydoc Dune::DenseMatrix::mmtv */ + template< class X, class Y > + void mmtv ( const X &x, Y &y ) const + { + y -= x; + } + + /** \copydoc Dune::DenseMatrix::mmhv */ + template< class X, class Y > + void mmhv ( const X &x, Y &y ) const + { + y -= x; + } + + /** \copydoc Dune::DenseMatrix::usmv */ + template< class X, class Y > + void usmv ( const field_type &alpha, const X &x, Y &y ) const + { + y.axpy( alpha, x ); + } + + /** \copydoc Dune::DenseMatrix::usmtv */ + template< class X, class Y > + void usmtv ( const field_type &alpha, const X &x, Y &y ) const + { + y.axpy( alpha, x ); + } + + /** \copydoc Dune::DenseMatrix::usmhv */ + template< class X, class Y > + void usmhv ( const field_type &alpha, const X &x, Y &y ) const + { + y.axpy( alpha, x ); + } + + /** \copydoc Dune::DenseMatrix::frobenius_norm */ + typename FieldTraits< field_type >::real_type frobenius_norm () const + { + return std::sqrt( frobenius_norm2() ); + } + + /** \copydoc Dune::DenseMatrix::frobenius_norm2 */ + typename FieldTraits< field_type >::real_type frobenius_norm2 () const + { + return FieldTraits< field_type >::real_type( N ); + } + + /** \copydoc Dune::DenseMatrix::infinity_norm */ + typename FieldTraits< field_type >::real_type infinity_norm () const + { + return FieldTraits< field_type >::real_type( 1 ); + } + + /** \copydoc Dune::DenseMatrix::infinity_norm_real */ + typename FieldTraits< field_type >::real_type infinity_norm_real () const + { + return FieldTraits< field_type >::real_type( 1 ); + } + + /** \brief cast to FieldMatrix */ + operator FieldMatrix< field_type, N, N > () const + { + FieldMatrix< field_type, N, N > fieldMatrix( 0 ); + for( int i = 0; i < N; ++i ) + fieldMatrix[ i ][ i ] = field_type( 1 ); + return fieldMatrix; + } + }; + +} // namespace Dune + +#endif // #ifndef DUNE_COMMON_IDENTITYMATRIX_HH