From baf1f9fd2f758fa4266b493fa4434a3d952eace9 Mon Sep 17 00:00:00 2001
From: Oliver Sander <oliver.sander@tu-dresden.de>
Date: Fri, 20 Nov 2020 15:35:30 +0100
Subject: [PATCH] Implement GlobalP2Mapper for 1d grids

Otherwise the Cosserat rod code will not compile without dune-parmg.
---
 dune/gfe/parallel/globalp2mapper.hh | 108 +++++++++++++++++++---------
 1 file changed, 75 insertions(+), 33 deletions(-)

diff --git a/dune/gfe/parallel/globalp2mapper.hh b/dune/gfe/parallel/globalp2mapper.hh
index 437273b9..82c0ac34 100644
--- a/dune/gfe/parallel/globalp2mapper.hh
+++ b/dune/gfe/parallel/globalp2mapper.hh
@@ -26,54 +26,96 @@ namespace Dune {
       p2Mapper_(gridView)
     {
 #if !HAVE_DUNE_PARMG
-      static_assert(GridView::dimension==2, "Only implemented for two-dimensional grids");
+      static_assert(GridView::dimension<=2, "Only implemented for one- and two-dimensional grids");
 
       if (gridView.size(GeometryTypes::triangle)>1)
         DUNE_THROW(NotImplemented, "GlobalP2Mapper only works for quad grids!");
 
-      GlobalIndexSet<GridView> globalVertexIndex(gridView,2);
-      GlobalIndexSet<GridView> globalEdgeIndex(gridView,1);
+      GlobalIndexSet<GridView> globalVertexIndex(gridView,GridView::dimension);
       GlobalIndexSet<GridView> globalElementIndex(gridView,0);
 
-      // total number of degrees of freedom
-      this->size_ = globalVertexIndex.size(2) + globalEdgeIndex.size(1) + globalElementIndex.size(0);
-
       auto localView = p2Mapper_.localView();
 
-      // Determine
-      for (const auto& element : elements(gridView))
+      if (GridView::dimension==1)
       {
-        localView.bind(element);
+        // total number of degrees of freedom
+        this->size_ = globalVertexIndex.size(GridView::dimension) + globalElementIndex.size(0);
 
-        // Loop over all local degrees of freedom
-        for (size_t i=0; i<localView.size(); i++)
+        // Determine
+        for (const auto& element : elements(gridView))
         {
-          int codim = localView.tree().finiteElement().localCoefficients().localKey(i).codim();
-          int entity   = localView.tree().finiteElement().localCoefficients().localKey(i).subEntity();
+          localView.bind(element);
 
-          auto localIndex  = localView.index(i);
-          int globalIndex;
-          switch (codim)
+          // Loop over all local degrees of freedom
+          for (size_t i=0; i<localView.size(); i++)
           {
-            case 2:  // vertex dofs
-              globalIndex = globalVertexIndex.index(element.template subEntity<2>(entity));
-              break;
-
-            case 1:  // edge dofs
-              globalIndex = globalEdgeIndex.index(element.template subEntity<1>(entity)) + globalVertexIndex.size(2);
-              break;
-
-            case 0:  // element dofs
-              globalIndex = globalElementIndex.index(element.template subEntity<0>(entity))
-                            + globalEdgeIndex.size(1)
-                            + globalVertexIndex.size(2);
-              break;
-
-            default:
-              DUNE_THROW(Dune::Exception, "Impossible codimension!");
+            int codim = localView.tree().finiteElement().localCoefficients().localKey(i).codim();
+            int entity   = localView.tree().finiteElement().localCoefficients().localKey(i).subEntity();
+
+            auto localIndex  = localView.index(i);
+            int globalIndex;
+            switch (codim)
+            {
+              case 1:  // vertex dofs
+                globalIndex = globalVertexIndex.index(element.template subEntity<1>(entity));
+                break;
+
+              case 0:  // element dofs
+                globalIndex = globalElementIndex.index(element.template subEntity<0>(entity))
+                              + globalVertexIndex.size(2);
+                break;
+
+              default:
+                DUNE_THROW(Dune::Exception, "Impossible codimension!");
+            }
+
+            localGlobalMap_[localIndex]  = globalIndex;
           }
+        }
+
+      }
+      else
+      {
+        GlobalIndexSet<GridView> globalEdgeIndex(gridView,1);
 
-          localGlobalMap_[localIndex]  = globalIndex;
+        // total number of degrees of freedom
+        this->size_ = globalVertexIndex.size(2) + globalEdgeIndex.size(1) + globalElementIndex.size(0);
+
+        // Determine
+        for (const auto& element : elements(gridView))
+        {
+          localView.bind(element);
+
+          // Loop over all local degrees of freedom
+          for (size_t i=0; i<localView.size(); i++)
+          {
+            int codim = localView.tree().finiteElement().localCoefficients().localKey(i).codim();
+            int entity   = localView.tree().finiteElement().localCoefficients().localKey(i).subEntity();
+
+            auto localIndex  = localView.index(i);
+            int globalIndex;
+            switch (codim)
+            {
+              case 2:  // vertex dofs
+                globalIndex = globalVertexIndex.index(element.template subEntity<GridView::dimension>(entity));
+                break;
+
+              case 1:  // edge dofs
+                globalIndex = globalEdgeIndex.index(element.template subEntity<1>(entity)) + globalVertexIndex.size(2);
+                break;
+
+              case 0:  // element dofs
+                globalIndex = globalElementIndex.index(element.template subEntity<0>(entity))
+                              + globalEdgeIndex.size(1)
+                              + globalVertexIndex.size(2);
+                break;
+
+              default:
+                DUNE_THROW(Dune::Exception, "Impossible codimension!");
+            }
+
+            localGlobalMap_[localIndex]  = globalIndex;
+          }
         }
       }
 #endif
-- 
GitLab