From e39c0fa84fb6539d0feaea57bbfde57a7785aa0b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Carsten=20Gr=C3=A4ser?= <graeser@mi.fu-berlin.de>
Date: Fri, 27 Apr 2012 14:23:31 +0000
Subject: [PATCH] Syncronize with dune-fufem

[[Imported from SVN: r6115]]
---
 dune/solvers/common/staticmatrixtools.hh | 40 +++++++++++++++++++++---
 1 file changed, 36 insertions(+), 4 deletions(-)

diff --git a/dune/solvers/common/staticmatrixtools.hh b/dune/solvers/common/staticmatrixtools.hh
index 3abe108c..74c6ca37 100644
--- a/dune/solvers/common/staticmatrixtools.hh
+++ b/dune/solvers/common/staticmatrixtools.hh
@@ -129,15 +129,47 @@ class StaticMatrix
                 {
                     for (size_t k=0; k<B.N(); ++k)
                     {
-                        typename MatrixB::row_type::ConstIterator lIt=B[k].begin();
-                        typename MatrixB::row_type::ConstIterator lEnd=B[k].end();
-                        for(; lIt!=lEnd; ++lIt)
-                            A[i][jIt.index()] += T1[k][i] * B[k][lIt.index()] * T2[lIt.index()][jIt.index()];
+                        if (T1[k][i]!=0)
+                        {
+                            typename MatrixB::row_type::ConstIterator lIt=B[k].begin();
+                            typename MatrixB::row_type::ConstIterator lEnd=B[k].end();
+                            for(; lIt!=lEnd; ++lIt)
+                                A[i][jIt.index()] += T1[k][i] * B[k][lIt.index()] * T2[lIt.index()][jIt.index()];
+                        }
                     }
                 }
             }
         }
 
+        template<class K1, class K2, class K3, int n, int m>
+        static void addTransformedMatrix(
+            typename Dune::FieldMatrix<K1, m, m>& A,
+            const typename Dune::FieldMatrix<K2, n, m>& T1,
+            const typename Dune::FieldMatrix<K3, n, n>& B,
+            const typename Dune::FieldMatrix<K2, n, m>& T2)
+        {
+            typename Dune::FieldMatrix<K1, m, n> T2transposedB;
+            T2transposedB = 0;
+            for (size_t i=0; i<A.N(); ++i)
+            {
+                for (size_t k=0; k<B.N(); ++k)
+                {
+                    if (T1[k][i]!=0)
+                        for (size_t l=0; l<B.M(); ++l)
+                            T2transposedB[i][l] += T1[k][i] * B[k][l];
+                }
+            }
+            for (size_t k=0; k<T2.N(); ++k)
+            {
+                for (size_t l=0; l<T2.M(); ++l)
+                {
+                    if (T2[k][l]!=0)
+                        for (size_t i=0; i<A.N(); ++i)
+                            A[i][l] += T2transposedB[i][k] * T2[k][l];
+                }
+            }
+        }
+
         template<class MatrixA, class MatrixB>
         static void addTransformedMatrix(MatrixA& X, const double& A, const MatrixB& Y, const double& B)
         {
-- 
GitLab