From f80d4a1b90a6f643ec6e9458e6f5b6b3a8293160 Mon Sep 17 00:00:00 2001
From: Oliver Sander <sander@igpm.rwth-aachen.de>
Date: Tue, 28 Jul 2015 08:22:37 +0200
Subject: [PATCH] [cleanup] Modernize the code with a bit of C++11

In particular:
- auto
- range-based for
---
 dune/solvers/test/common.hh | 117 +++++++++++++-----------------------
 1 file changed, 43 insertions(+), 74 deletions(-)

diff --git a/dune/solvers/test/common.hh b/dune/solvers/test/common.hh
index 66973e10..a5095717 100644
--- a/dune/solvers/test/common.hh
+++ b/dune/solvers/test/common.hh
@@ -35,33 +35,27 @@ void constructPQ1Pattern(const GridView& gridView, Matrix& matrix)
 {
     static const int dim = GridView::Grid::dimension;
 
-    typedef typename GridView::IndexSet IndexSet;
-    typedef typename GridView::template Codim<0>::Iterator ElementIterator;
-    typedef typename GridView::template Codim<0>::Entity Element;
     typedef typename Dune::PQkLocalFiniteElementCache<double, double, dim, 1> FiniteElementCache;
     typedef typename FiniteElementCache::FiniteElementType FiniteElement;
 
-    const IndexSet& indexSet = gridView.indexSet();
+    const auto& indexSet = gridView.indexSet();
     FiniteElementCache cache;
 
     int size = indexSet.size(dim);
 
     Dune::MatrixIndexSet indices(size, size);
 
-    ElementIterator it = gridView.template begin<0>();
-    ElementIterator end = gridView.template end<0>();
-    for (; it != end; ++it)
+    for (const auto& element : elements(gridView))
     {
-        const Element& e = *it;
-        const FiniteElement& fe = cache.get(e.type());
+        const FiniteElement& fe = cache.get(element.type());
 
-        int localSize = fe.localBasis().size();
+        int localSize = fe.size();
         for (int i = 0; i < localSize; ++i)
         {
-            int iGlobal = indexSet.subIndex(e, fe.localCoefficients().localKey(i).subEntity(), dim);
+            int iGlobal = indexSet.subIndex(element, fe.localCoefficients().localKey(i).subEntity(), dim);
             for (int j = 0; j < localSize; ++j)
             {
-                int jGlobal = indexSet.subIndex(e, fe.localCoefficients().localKey(j).subEntity(), dim);
+                int jGlobal = indexSet.subIndex(element, fe.localCoefficients().localKey(j).subEntity(), dim);
                 indices.add(iGlobal, jGlobal);
                 indices.add(jGlobal, iGlobal);
             }
@@ -77,39 +71,31 @@ void assemblePQ1Stiffness(const GridView& gridView, Matrix& matrix)
     static const int dim = GridView::Grid::dimension;
     static const int dimworld = GridView::Grid::dimensionworld;
 
-    typedef typename GridView::IndexSet IndexSet;
-    typedef typename GridView::template Codim<0>::Iterator ElementIterator;
     typedef typename GridView::template Codim<0>::Entity Element;
     typedef typename GridView::template Codim<0>::Entity::Geometry Geometry;
     typedef typename Dune::PQkLocalFiniteElementCache<double, double, dim, 1> FiniteElementCache;
     typedef typename FiniteElementCache::FiniteElementType FiniteElement;
 
-    typedef typename Dune::QuadratureRule<double,dim> QuadratureRule;
-    typedef typename Dune::template FieldVector<double,dim> LocalCoordinate;
-    typedef typename Dune::template FieldVector<double,dimworld> GlobalCoordinate;
+    typedef typename Dune::FieldVector<double,dim> LocalCoordinate;
+    typedef typename Dune::FieldVector<double,dimworld> GlobalCoordinate;
     typedef typename Element::Geometry::JacobianInverseTransposed JacobianInverseTransposed;
     typedef typename FiniteElement::Traits::LocalBasisType::Traits::JacobianType JacobianType;
 
-    const IndexSet& indexSet = gridView.indexSet();
+    const auto& indexSet = gridView.indexSet();
     FiniteElementCache cache;
 
-    ElementIterator it = gridView.template begin<0>();
-    ElementIterator end = gridView.template end<0>();
-    for (; it != end; ++it)
+    for (const auto& element : elements(gridView))
     {
-        const Element& e = *it;
-        const Geometry geometry = e.geometry();
-        const FiniteElement& fe = cache.get(e.type());
+        const Geometry geometry = element.geometry();
+        const FiniteElement& fe = cache.get(element.type());
 
-        int localSize = fe.localBasis().size();
+        int localSize = fe.size();
 
         // get quadrature rule of appropiate order (P1/Q1)
-        int order = 0;
-        if (e.type().isSimplex())
-            order = 2*(1-1);
-        else
-            order = 2*(dim-1);
-        const QuadratureRule& quad = Dune::template QuadratureRules<double, dim>::rule(e.type(), order);
+        int order = (element.type().isSimplex())
+                    ? 2*(1-1)
+                    : 2*(dim-1);
+        const auto& quad = Dune::QuadratureRules<double, dim>::rule(element.type(), order);
 
         // store gradients of shape functions and base functions
         std::vector<JacobianType> referenceGradients(localSize);
@@ -137,10 +123,10 @@ void assemblePQ1Stiffness(const GridView& gridView, Matrix& matrix)
             double z = quad[pt].weight() * integrationElement;
             for (int i = 0; i < localSize; ++i)
             {
-                int iGlobal = indexSet.subIndex(e, fe.localCoefficients().localKey(i).subEntity(), dim);
+                int iGlobal = indexSet.subIndex(element, fe.localCoefficients().localKey(i).subEntity(), dim);
                 for (int j = i+1; j < localSize; ++j)
                 {
-                    int jGlobal = indexSet.subIndex(e, fe.localCoefficients().localKey(j).subEntity(), dim);
+                    int jGlobal = indexSet.subIndex(element, fe.localCoefficients().localKey(j).subEntity(), dim);
 
                     double zij = (gradients[i] * gradients[j]) * z;
                     matrix[iGlobal][jGlobal] += zij;
@@ -159,37 +145,28 @@ void assemblePQ1Mass(const GridView& gridView, Matrix& matrix)
 {
     static const int dim = GridView::Grid::dimension;
 
-    typedef typename GridView::IndexSet IndexSet;
-    typedef typename GridView::template Codim<0>::Iterator ElementIterator;
-    typedef typename GridView::template Codim<0>::Entity Element;
     typedef typename GridView::template Codim<0>::Entity::Geometry Geometry;
     typedef typename Dune::PQkLocalFiniteElementCache<double, double, dim, 1> FiniteElementCache;
     typedef typename FiniteElementCache::FiniteElementType FiniteElement;
 
-    typedef typename Dune::QuadratureRule<double,dim> QuadratureRule;
-    typedef typename Dune::template FieldVector<double,dim> LocalCoordinate;
+    typedef typename Dune::FieldVector<double,dim> LocalCoordinate;
     typedef typename FiniteElement::Traits::LocalBasisType::Traits::RangeType RangeType;
 
-    const IndexSet& indexSet = gridView.indexSet();
+    const auto& indexSet = gridView.indexSet();
     FiniteElementCache cache;
 
-    ElementIterator it = gridView.template begin<0>();
-    ElementIterator end = gridView.template end<0>();
-    for (; it != end; ++it)
+    for (const auto& element : elements(gridView))
     {
-        const Element& e = *it;
-        const Geometry geometry = e.geometry();
-        const FiniteElement& fe = cache.get(e.type());
+        const Geometry geometry = element.geometry();
+        const FiniteElement& fe = cache.get(element.type());
 
-        int localSize = fe.localBasis().size();
+        int localSize = fe.size();
 
-        // get quadrature rule of appropiate order (P1/Q1)
-        int order = 0;
-        if (e.type().isSimplex())
-            order = 2*1;
-        else
-            order = 2*dim;
-        const QuadratureRule& quad = Dune::template QuadratureRules<double, dim>::rule(e.type(), order);
+        // get quadrature rule of appropriate order (P1/Q1)
+        int order = (element.type().isSimplex())
+                    ? 2*1
+                    : 2*dim;
+        const auto& quad = Dune::QuadratureRules<double, dim>::rule(element.type(), order);
 
         // store values of shape functions
         std::vector<RangeType> values(localSize);
@@ -209,11 +186,11 @@ void assemblePQ1Mass(const GridView& gridView, Matrix& matrix)
             double z = quad[pt].weight() * integrationElement;
             for (int i = 0; i < localSize; ++i)
             {
-                int iGlobal = indexSet.subIndex(e, fe.localCoefficients().localKey(i).subEntity(), dim);
+                int iGlobal = indexSet.subIndex(element, fe.localCoefficients().localKey(i).subEntity(), dim);
                 double zi = values[i]*z;
                 for (int j = i+1; j < localSize; ++j)
                 {
-                    int jGlobal = indexSet.subIndex(e, fe.localCoefficients().localKey(j).subEntity(), dim);
+                    int jGlobal = indexSet.subIndex(element, fe.localCoefficients().localKey(j).subEntity(), dim);
 
                     double zij = values[j] * zi;
                     matrix[iGlobal][jGlobal] += zij;
@@ -232,38 +209,30 @@ void assemblePQ1RHS(const GridView& gridView, Vector& r, const Function& f)
 {
     static const int dim = GridView::Grid::dimension;
 
-    typedef typename GridView::IndexSet IndexSet;
-    typedef typename GridView::template Codim<0>::Iterator ElementIterator;
-    typedef typename GridView::template Codim<0>::Entity Element;
     typedef typename GridView::template Codim<0>::Entity::Geometry Geometry;
     typedef typename Dune::PQkLocalFiniteElementCache<double, double, dim, 1> FiniteElementCache;
     typedef typename FiniteElementCache::FiniteElementType FiniteElement;
 
-    typedef typename Dune::QuadratureRule<double,dim> QuadratureRule;
     typedef typename Dune::template FieldVector<double,dim> LocalCoordinate;
     typedef typename FiniteElement::Traits::LocalBasisType::Traits::RangeType RangeType;
     typedef typename Function::RangeType FunctionRangeType;
 
-    const IndexSet& indexSet = gridView.indexSet();
+    const auto& indexSet = gridView.indexSet();
     FiniteElementCache cache;
 
-    ElementIterator it = gridView.template begin<0>();
-    ElementIterator end = gridView.template end<0>();
-    for (; it != end; ++it)
+    for (const auto& element : elements(gridView))
     {
-        const Element& e = *it;
-        const Geometry geometry = e.geometry();
-        const FiniteElement& fe = cache.get(e.type());
+        const Geometry geometry = element.geometry();
+        const FiniteElement& fe = cache.get(element.type());
 
-        int localSize = fe.localBasis().size();
+        int localSize = fe.size();
 
         // get quadrature rule of appropiate order (P1/Q1)
-        int order = 0;
-        if (e.type().isSimplex())
-            order = 2*1;
-        else
-            order = 2*dim;
-        const QuadratureRule& quad = Dune::template QuadratureRules<double, dim>::rule(e.type(), order);
+        int order = (element.type().isSimplex())
+                    ? 2*1
+                    : 2*dim;
+
+        const auto& quad = Dune::QuadratureRules<double, dim>::rule(element.type(), order);
 
         // store values of shape functions
         std::vector<RangeType> values(localSize);
@@ -287,7 +256,7 @@ void assemblePQ1RHS(const GridView& gridView, Vector& r, const Function& f)
             double z = quad[pt].weight() * integrationElement;
             for (int i = 0; i < localSize; ++i)
             {
-                int iGlobal = indexSet.subIndex(e, fe.localCoefficients().localKey(i).subEntity(), dim);
+                int iGlobal = indexSet.subIndex(element, fe.localCoefficients().localKey(i).subEntity(), dim);
 
                 r[iGlobal].axpy(values[i]*z, fAtPos);
             }
-- 
GitLab