<html>
  <head>
    <meta content="text/html; charset=ISO-8859-1"
      http-equiv="Content-Type">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    <div class="moz-cite-prefix">Hi Oliver,<br>
      <br>
      there is of course no real need for such a class: you can always
      use a FieldMatrix to represent an identity matrix. But isn't it
      tedious to initialize a dense matrix? With the new
      IdentityMatrix/DenseMatrixAssigner functionality you can now
      write:<br>
      <blockquote>FieldMatrix< double, 2, 2 > Id =
        IdentityMatrix< double, 2 >();</blockquote>
      Then, IdentityMatrix may be used as the return type of the methods
      jacobianTransposed() and jacobianInverseTransposed(); for some
      grids, the LocalGeometry's jacobians reduce to an identity matrix.
      On the developer meeting in Aachen we agreed that jacobians may be
      implemented as slim "const" dense matrices that only cast into a
      field matrix. The IdentityMatrix simply implements this interface.
      As long as you don't need access to the entries of an identity
      matrix (do you ever need that?) you should prefer IdentityMatrix
      over another dense matrix as it holds no data at all.<br>
      <br>
      Cheers,<br>
      Christoph<br>
      <br>
      <br>
      On 12/03/2013 11:32 AM, Oliver Sander wrote:<br>
    </div>
    <blockquote cite="mid:529DB33F.9060008@igpm.rwth-aachen.de"
      type="cite">
      <pre wrap="">Hi Christoph,
out of curiosity: what do you need such a matrix for?
Cheers,
Oliver


Am 03.12.2013 11:26, schrieb Christoph Gersbacher:
</pre>
      <blockquote type="cite">
        <pre wrap="">New commit, appeared at Tue Dec  3 11:26:03 2013 +0100
as part of the following ref changes:

    branch refs/heads/master    updated from 79e8fa8 -> d58db46

Browsable version: <a class="moz-txt-link-freetext" href="http://cgit.dune-project.org/repositories/dune-common/commit/?id=64df62745d93fbe6c380a039eebb5a3ac8f0da0c">http://cgit.dune-project.org/repositories/dune-common/commit/?id=64df62745d93fbe6c380a039eebb5a3ac8f0da0c</a>

======================================================================

commit 64df62745d93fbe6c380a039eebb5a3ac8f0da0c
Author: Christoph Gersbacher <a class="moz-txt-link-rfc2396E" href="mailto:christoph.gersbacher@mathematik.uni-freiburg.de"><christoph.gersbacher@mathematik.uni-freiburg.de></a>
Date:   Wed Oct 9 11:34:01 2013 +0200

    Implement read-only IdentityMatrix
    
    This implementation of an IdentityMatrix does not hold any data. It
    implements a reduced version of the DenseMatrix interface including a
    standard C++ cast operator to a Dune::FieldMatrix. This code illustrates
    the new forward capabilities of DenseMatrixAssigner.

 dune/common/CMakeLists.txt    |   1 +
 dune/common/Makefile.am       |   1 +
 dune/common/identitymatrix.hh | 160 ++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 162 insertions(+)
 create mode 100644 dune/common/identitymatrix.hh



diff --git a/dune/common/CMakeLists.txt b/dune/common/CMakeLists.txt
index 0075584..91ebd9e 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 189757a..4212515 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 0000000..646e398
--- /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

_______________________________________________
Dune-Commit mailing list
<a class="moz-txt-link-abbreviated" href="mailto:Dune-Commit@dune-project.org">Dune-Commit@dune-project.org</a>
<a class="moz-txt-link-freetext" href="http://lists.dune-project.org/mailman/listinfo/dune-commit">http://lists.dune-project.org/mailman/listinfo/dune-commit</a>

</pre>
      </blockquote>
      <pre wrap="">

</pre>
      <br>
      <fieldset class="mimeAttachmentHeader"></fieldset>
      <br>
      <pre wrap="">_______________________________________________
Dune-devel mailing list
<a class="moz-txt-link-abbreviated" href="mailto:Dune-devel@dune-project.org">Dune-devel@dune-project.org</a>
<a class="moz-txt-link-freetext" href="http://lists.dune-project.org/mailman/listinfo/dune-devel">http://lists.dune-project.org/mailman/listinfo/dune-devel</a>
</pre>
    </blockquote>
    <br>
    <br>
    <div class="moz-signature">-- <br>
      <title></title>
      <font color="#666666"><small>Christoph Gersbacher</small><small> 
          <a
            href="mailto:christoph.gersbacher@mathematik.uni-freiburg.de"><font
              color="#3333ff"><christoph.gersbacher@mathematik.uni-freiburg.de></font></a></small><br>
      </font>
      <div class="moz-signature">
        <div class="moz-signature"><font color="#666666"><small>Abteilung
für
              Angewandte Mathematik
            </small><br>
          </font><font color="#666666"><small>Albert-Ludwigs-Universität
              Freiburg
            </small><br>
          </font><font color="#666666"><small>Hermann-Herder-Str. 10
            </small><br>
          </font><font color="#666666"><small>D-79104 Freiburg im
              Breisgau
            </small><br>
          </font><font color="#666666"><small>Tel.: +49 (0)761 / 203
              5645
            </small><br>
          </font><font color="#666666"><small>Fax: +49 (0)761 / 203 5632</small></font>
        </div>
      </div>
    </div>
  </body>
</html>