From: Denis Davydov <davydden@gmail.com>
Date: Tue, 19 May 2015 05:31:36 +0000 (+0200)
Subject: exploit symmetries in Local integrators of mass and laplace matrices
X-Git-Tag: v8.3.0-rc1~160^2
X-Git-Url: https://gitweb.dealii.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=873b93c8723ba85fc8a9d5d32bdcf9a22fb5c342;p=dealii.git

exploit symmetries in Local integrators of mass and laplace matrices
---

diff --git a/include/deal.II/integrators/l2.h b/include/deal.II/integrators/l2.h
index 1b54ef493b..24320a8004 100644
--- a/include/deal.II/integrators/l2.h
+++ b/include/deal.II/integrators/l2.h
@@ -63,12 +63,17 @@ namespace LocalIntegrators
           const double dx = fe.JxW(k) * factor;
 
           for (unsigned int i=0; i<n_dofs; ++i)
-            for (unsigned int j=0; j<n_dofs; ++j)
+            for (unsigned int j=i; j<n_dofs; ++j)
               for (unsigned int d=0; d<n_components; ++d)
                 M(i,j) += dx
                           * fe.shape_value_component(j,k,d)
                           * fe.shape_value_component(i,k,d);
         }
+
+      // exploit symmetry
+      for (unsigned int i=0; i<n_dofs; ++i)
+        for (unsigned int j=i+1; j<n_dofs; ++j)
+          M(j,i) = M(i,j);
     }
 
     /**
@@ -103,12 +108,17 @@ namespace LocalIntegrators
           const double dx = fe.JxW(k) * weights[k];
 
           for (unsigned int i=0; i<n_dofs; ++i)
-            for (unsigned int j=0; j<n_dofs; ++j)
+            for (unsigned int j=i; j<n_dofs; ++j)
               for (unsigned int d=0; d<n_components; ++d)
                 M(i,j) += dx
                           * fe.shape_value_component(j,k,d)
                           * fe.shape_value_component(i,k,d);
         }
+
+      //exploit symmetry
+      for (unsigned int i=0; i<n_dofs; ++i)
+        for (unsigned int j=i+1; j<n_dofs; ++j)
+          M(j,i) = M(i,j);
     }
 
     /**
diff --git a/include/deal.II/integrators/laplace.h b/include/deal.II/integrators/laplace.h
index ec2878d7d8..e84b384001 100644
--- a/include/deal.II/integrators/laplace.h
+++ b/include/deal.II/integrators/laplace.h
@@ -62,12 +62,18 @@ namespace LocalIntegrators
           const double dx = fe.JxW(k) * factor;
           for (unsigned int i=0; i<n_dofs; ++i)
             {
-              for (unsigned int j=0; j<n_dofs; ++j)
+              for (unsigned int j=i; j<n_dofs; ++j)
                 for (unsigned int d=0; d<n_components; ++d)
                   M(i,j) += dx *
                             (fe.shape_grad_component(j,k,d) * fe.shape_grad_component(i,k,d));
             }
         }
+
+      // exploit symmetry
+      for (unsigned int i=0; i<n_dofs; ++i)
+        for (unsigned int j=i+1; j<n_dofs; ++j)
+          M(j,i) = M(i,j);
+
     }
 
     /**