From fcd1f23f58950e8f56796817bed1d2b46c3d60d5 Mon Sep 17 00:00:00 2001
From: Oliver Sander <oliver.sander@tu-dresden.de>
Date: Sat, 8 Dec 2018 06:26:48 +0100
Subject: [PATCH] Modernize the 'makehalfcircle' code

---
 dune/fufem/makehalfcircle.hh | 272 ++++++++---------------------------
 1 file changed, 63 insertions(+), 209 deletions(-)

diff --git a/dune/fufem/makehalfcircle.hh b/dune/fufem/makehalfcircle.hh
index 7062abca..38882712 100644
--- a/dune/fufem/makehalfcircle.hh
+++ b/dune/fufem/makehalfcircle.hh
@@ -17,27 +17,17 @@ std::unique_ptr<GridType> createCircle(const Dune::FieldVector<double,2>& center
 {
     static_assert(GridType::dimension==2, "createCircle can only be instantiated for 2d grids");
     
-    using namespace Dune;
-
     Dune::GridFactory<GridType> factory;
 
     // ///////////////////////
     //   Insert vertices
     // ///////////////////////
     double x = std::sqrt((r*r)/2.0);
-    FieldVector<double,2> pos;
-
-    pos[0] = center[0]-x;  pos[1] = center[1]-x;
-    factory.insertVertex(pos);
-
-    pos[0] = center[0]+x;  pos[1] = center[1]-x;
-    factory.insertVertex(pos);
-
-    pos[0] = center[0]-x;  pos[1] = center[1]+x;
-    factory.insertVertex(pos);
 
-    pos[0] = center[0]+x;  pos[1] = center[1]+x;
-    factory.insertVertex(pos);
+    factory.insertVertex({center[0]-x, center[1]-x});
+    factory.insertVertex({center[0]+x, center[1]-x});
+    factory.insertVertex({center[0]-x, center[1]+x});
+    factory.insertVertex({center[0]+x, center[1]+x});
 
     factory.insertVertex(center);
 
@@ -45,53 +35,29 @@ std::unique_ptr<GridType> createCircle(const Dune::FieldVector<double,2>& center
     // /////////////////
     // Insert elements
     // /////////////////
-    std::vector<unsigned int> cornerIDs(3);
-
-    cornerIDs[0] = 4;
-    cornerIDs[1] = 0;
-    cornerIDs[2] = 1;
-    factory.insertElement(Dune::GeometryTypes::simplex(2), cornerIDs);
-
-    cornerIDs[0] = 4;
-    cornerIDs[1] = 1;
-    cornerIDs[2] = 3;
-    factory.insertElement(Dune::GeometryTypes::simplex(2), cornerIDs);
-
-    cornerIDs[0] = 4;
-    cornerIDs[1] = 3;
-    cornerIDs[2] = 2;
-    factory.insertElement(Dune::GeometryTypes::simplex(2), cornerIDs);
 
-    cornerIDs[0] = 4;
-    cornerIDs[1] = 2;
-    cornerIDs[2] = 0;
-    factory.insertElement(Dune::GeometryTypes::simplex(2), cornerIDs);
+    factory.insertElement(Dune::GeometryTypes::simplex(2), {4, 0, 1});
+    factory.insertElement(Dune::GeometryTypes::simplex(2), {4, 1, 3});
+    factory.insertElement(Dune::GeometryTypes::simplex(2), {4, 3, 2});
+    factory.insertElement(Dune::GeometryTypes::simplex(2), {4, 2, 0});
 
 
     // /////////////////////////////
     //   Create boundary segments
     // /////////////////////////////
-    std::vector<unsigned int> vertices(2);
 
     typedef typename std::shared_ptr<Dune::BoundarySegment<2> > SegmentPointer;
 
-    vertices[0] = 0;  vertices[1] = 1;
-    factory.insertBoundarySegment(vertices, SegmentPointer(new ArcOfCircle(center, r, M_PI*5/4, M_PI*7/4)));
-
-    vertices[0] = 1;  vertices[1] = 3;
-    factory.insertBoundarySegment(vertices, SegmentPointer(new ArcOfCircle(center, r, M_PI*7/4, M_PI*9/4)));
-
-    vertices[0] = 3;  vertices[1] = 2;
-    factory.insertBoundarySegment(vertices, SegmentPointer(new ArcOfCircle(center, r, M_PI*1/4, M_PI*3/4)));
-
-    vertices[0] = 2;  vertices[1] = 0;
-    factory.insertBoundarySegment(vertices, SegmentPointer(new ArcOfCircle(center, r, M_PI*3/4, M_PI*5/4)));
+    factory.insertBoundarySegment({0, 1}, SegmentPointer(new ArcOfCircle(center, r, M_PI*5/4, M_PI*7/4)));
+    factory.insertBoundarySegment({1, 3}, SegmentPointer(new ArcOfCircle(center, r, M_PI*7/4, M_PI*9/4)));
+    factory.insertBoundarySegment({3, 2}, SegmentPointer(new ArcOfCircle(center, r, M_PI*1/4, M_PI*3/4)));
+    factory.insertBoundarySegment({2, 0}, SegmentPointer(new ArcOfCircle(center, r, M_PI*3/4, M_PI*5/4)));
 
 
     // //////////////////////////////////////
     //   Finish initialization
     // //////////////////////////////////////
-    return std::unique_ptr<GridType>(factory.createGrid());
+    return factory.createGrid();
 }
 
 
@@ -101,70 +67,41 @@ void makeHalfCircle(GridType& grid)
 {
     static_assert(GridType::dimension==2, "makeHalfCircle can only be instantiated for 2d grids");
     
-    using namespace Dune;
-
     Dune::GridFactory<GridType> factory(&grid);
 
     // /////////////////////////////
     //   Create boundary segments
     // /////////////////////////////
 
-    FieldVector<double,2> center(0);
-    center[1] = 15;
-
-    std::vector<unsigned int> vertices(2);
+    Dune::FieldVector<double,2> center = {0,15};
 
     typedef typename std::shared_ptr<Dune::BoundarySegment<2> > SegmentPointer;
 
-    vertices[0] = 1;  vertices[1] = 2;
-    factory.insertBoundarySegment(vertices, SegmentPointer(new ArcOfCircle(center, 15, M_PI, M_PI*4/3)));
-
-    vertices[0] = 2;  vertices[1] = 3;
-    factory.insertBoundarySegment(vertices, SegmentPointer(new ArcOfCircle(center, 15, M_PI*4/3, M_PI*5/3)));
-
-    vertices[0] = 3;  vertices[1] = 0;
-    factory.insertBoundarySegment(vertices, SegmentPointer(new ArcOfCircle(center, 15, M_PI*5/3, M_PI*2)));
+    factory.insertBoundarySegment({1, 2}, SegmentPointer(new ArcOfCircle(center, 15, M_PI, M_PI*4/3)));
+    factory.insertBoundarySegment({2, 3}, SegmentPointer(new ArcOfCircle(center, 15, M_PI*4/3, M_PI*5/3)));
+    factory.insertBoundarySegment({3, 0}, SegmentPointer(new ArcOfCircle(center, 15, M_PI*5/3, M_PI*2)));
 
 
     // ////////////////////////
     //   Insert vertices
     // ////////////////////////
-    Dune::FieldVector<double,2> pos;
-
-    pos[0] = 15;   pos[1] = 15;
-    factory.insertVertex(pos);
-
-    pos[0] = -15;  pos[1] = 15;
-    factory.insertVertex(pos);
-
-    pos[0] = -7.5; pos[1] = 2.00962;
-    factory.insertVertex(pos);
 
-    pos[0] = 7.5;  pos[1] = 2.00962;
-    factory.insertVertex(pos);
+    factory.insertVertex({15,15});
+    factory.insertVertex({-15,15});
+    factory.insertVertex({-7.5,2.00962});
+    factory.insertVertex({7.5,2.00962});
 
     // /////////////////
     // Insert elements
     // /////////////////
 
-    std::vector<unsigned int> cornerIDs(3);
-    cornerIDs[0] = 0;
-    cornerIDs[1] = 1;
-    cornerIDs[2] = 2;
-
-    factory.insertElement(Dune::GeometryTypes::simplex(2), cornerIDs);
-
-    cornerIDs[0] = 2;
-    cornerIDs[1] = 3;
-    cornerIDs[2] = 0;
-
-    factory.insertElement(Dune::GeometryTypes::simplex(2), cornerIDs);
+    factory.insertElement(Dune::GeometryTypes::simplex(2), {0,1,2});
+    factory.insertElement(Dune::GeometryTypes::simplex(2), {2,3,0});
 
     // //////////////////////////////////////
     //   Finish initialization
     // //////////////////////////////////////
     factory.createGrid();
-
 }
 
 template <class GridType>
@@ -172,42 +109,26 @@ void makeHalfCircleQuadTri(GridType& grid)
 {
     static_assert(GridType::dimension==2, "makeHalfCircleQuadTri can only be instantiated for 2d grids");
     
-    using namespace Dune;
-
     Dune::GridFactory<GridType> factory(&grid);
 
     // ////////////////////
     //   Create the domain
     // //////////////////////
-    FieldVector<double,2> center(0);
-    center[1] = 0.4;
-
-    std::vector<unsigned int> vertices(2);
+    Dune::FieldVector<double,2> center = {0,0.4};
 
     typedef typename std::shared_ptr<Dune::BoundarySegment<2> > SegmentPointer;
 
-    vertices[0] = 1;  vertices[1] = 8;
-    factory.insertBoundarySegment(vertices, SegmentPointer(new ArcOfCircle(center, 0.4, M_PI, M_PI*9/8)));
-
-    vertices[0] = 8;  vertices[1] = 2;
-    factory.insertBoundarySegment(vertices, SegmentPointer(new ArcOfCircle(center, 0.4, M_PI*9/8, M_PI*10/8)));
-
-    vertices[0] = 2;  vertices[1] = 4;
-    factory.insertBoundarySegment(vertices, SegmentPointer(new ArcOfCircle(center, 0.4, M_PI*10/8, M_PI*12/8)));
-
-    vertices[0] = 4;  vertices[1] = 3;
-    factory.insertBoundarySegment(vertices, SegmentPointer(new ArcOfCircle(center, 0.4, M_PI*12/8, M_PI*14/8)));
-
-    vertices[0] = 3;  vertices[1] = 9;
-    factory.insertBoundarySegment(vertices, SegmentPointer(new ArcOfCircle(center, 0.4, M_PI*14/8, M_PI*15/8)));
-
-    vertices[0] = 9;  vertices[1] = 0;
-    factory.insertBoundarySegment(vertices, SegmentPointer(new ArcOfCircle(center, 0.4, M_PI*15/8, M_PI*2)));
+    factory.insertBoundarySegment({1,8}, SegmentPointer(new ArcOfCircle(center, 0.4, M_PI, M_PI*9/8)));
+    factory.insertBoundarySegment({8,2}, SegmentPointer(new ArcOfCircle(center, 0.4, M_PI*9/8, M_PI*10/8)));
+    factory.insertBoundarySegment({2,4}, SegmentPointer(new ArcOfCircle(center, 0.4, M_PI*10/8, M_PI*12/8)));
+    factory.insertBoundarySegment({4,3}, SegmentPointer(new ArcOfCircle(center, 0.4, M_PI*12/8, M_PI*14/8)));
+    factory.insertBoundarySegment({3,9}, SegmentPointer(new ArcOfCircle(center, 0.4, M_PI*14/8, M_PI*15/8)));
+    factory.insertBoundarySegment({9,0}, SegmentPointer(new ArcOfCircle(center, 0.4, M_PI*15/8, M_PI*2)));
 
     // ////////////////////
     //  Insert inner nodes
     // ////////////////////
-    double nodePos[15][2] = {{0.4, 0.4},
+    std::vector<Dune::FieldVector<double,2> > nodePos = {{0.4, 0.4},
                              {-0.4, 0.4},
                              {-0.282843, 0.117157},
                              {0.282843, 0.117157},
@@ -224,18 +145,18 @@ void makeHalfCircleQuadTri(GridType& grid)
                              {1.25898e-10, 0.235214}};
     
     for (int i=0; i<15; i++)
-        factory.insertVertex(*((FieldVector<double,2>*)nodePos[i]));
+        factory.insertVertex(nodePos[i]);
 
     // /////////////////
     // Insert elements
     // /////////////////
 
-    int cornerIDs[12][4] = {{5, 11, 6, -1},
-                            {5, 10, 11, -1},
-                            {5, 14, 10, -1},
-                            {14, 5, 13, -1},
-                            {13, 5, 12, -1},
-                            {5, 7, 12, -1},
+    std::vector<std::vector<unsigned int> > vertices = {{5, 11, 6},
+                            {5, 10, 11},
+                            {5, 14, 10},
+                            {14, 5, 13},
+                            {13, 5, 12},
+                            {5, 7, 12},
                             {7, 1, 12, 8},
                             {12, 8, 13, 2},
                             {13, 2, 14, 4},
@@ -243,31 +164,16 @@ void makeHalfCircleQuadTri(GridType& grid)
                             {10, 3, 11, 9},
                             {11, 9, 6, 0}};
 
-    for (int i=0; i<6; i++) {
-        std::vector<unsigned int> vertices(3);
-        vertices[0] = cornerIDs[i][0];
-        vertices[1] = cornerIDs[i][1];
-        vertices[2] = cornerIDs[i][2];
-        factory.insertElement(Dune::GeometryTypes::simplex(2), vertices);
-    }
-
-
-
-    for (int i=0; i<6; i++) {
-        std::vector<unsigned int> vertices(4);
-        vertices[0] = cornerIDs[i+6][0];
-        vertices[1] = cornerIDs[i+6][1];
-        vertices[2] = cornerIDs[i+6][2];
-        vertices[3] = cornerIDs[i+6][3];
-        factory.insertElement(Dune::GeometryTypes::cube(2), vertices);
-    }
+    for (int i=0; i<6; i++)
+        factory.insertElement(Dune::GeometryTypes::simplex(2), vertices[i]);
 
+    for (int i=6; i<12; i++)
+        factory.insertElement(Dune::GeometryTypes::cube(2), vertices[i]);
     
     // //////////////////////////////////////
     //   Finish initialization
     // //////////////////////////////////////
     factory.createGrid();
-
 }
 
 
@@ -276,62 +182,38 @@ void makeHalfCircleQuad(GridType& grid)
 {
     static_assert(GridType::dimension==2, "makeHalfCircleQuad can only be instantiated for 2d grids");
     
-    using namespace Dune;
-
     Dune::GridFactory<GridType> factory(&grid);
 
     // /////////////////////////////
     //   Create boundary segments
     // /////////////////////////////
-    FieldVector<double,2> center(0);
-    center[1] = 15;
-
-    std::vector<unsigned int> vertices(2);
+    Dune::FieldVector<double,2> center = {0,15};
 
     typedef typename std::shared_ptr<Dune::BoundarySegment<2> > SegmentPointer;
 
-    vertices[0] = 1;  vertices[1] = 2;
-    factory.insertBoundarySegment(vertices, SegmentPointer(new ArcOfCircle(center, 15, M_PI, M_PI*4/3)));
-
-    vertices[0] = 2;  vertices[1] = 3;
-    factory.insertBoundarySegment(vertices, SegmentPointer(new ArcOfCircle(center, 15, M_PI*4/3, M_PI*5/3)));
-
-    vertices[0] = 3;  vertices[1] = 0;
-    factory.insertBoundarySegment(vertices, SegmentPointer(new ArcOfCircle(center, 15, M_PI*5/3, M_PI*2)));
+    factory.insertBoundarySegment({1,2}, SegmentPointer(new ArcOfCircle(center, 15, M_PI, M_PI*4/3)));
+    factory.insertBoundarySegment({2,3}, SegmentPointer(new ArcOfCircle(center, 15, M_PI*4/3, M_PI*5/3)));
+    factory.insertBoundarySegment({3,0}, SegmentPointer(new ArcOfCircle(center, 15, M_PI*5/3, M_PI*2)));
 
     // ///////////////////////
     //   Insert vertices
     // ///////////////////////
-    FieldVector<double,2> pos;
 
-    pos[0] = 15;  pos[1] = 15;
-    factory.insertVertex(pos);
-  
-    pos[0] = -15; pos[1] = 15;
-    factory.insertVertex(pos);
+    factory.insertVertex({15,15});
+    factory.insertVertex({-15,15});
+    factory.insertVertex({-7.5,2.00962});
+    factory.insertVertex({7.5,2.00962});
 
-    pos[0] = -7.5; pos[1] = 2.00962;
-    factory.insertVertex(pos);
-
-    pos[0] = 7.5; pos[1] = 2.00962;
-    factory.insertVertex(pos);
     // /////////////////
     // Insert elements
     // /////////////////
 
-    std::vector<unsigned int> cornerIDs(4);
-    cornerIDs[0] = 0;
-    cornerIDs[1] = 1;
-    cornerIDs[2] = 3;
-    cornerIDs[3] = 2;
-
-    factory.insertElement(Dune::GeometryTypes::cube(2), cornerIDs);
+    factory.insertElement(Dune::GeometryTypes::cube(2), {0,1,3,2});
 
     // //////////////////////////////////////
     //   Finish initialization
     // //////////////////////////////////////
     factory.createGrid();
-
 }
 
 
@@ -339,70 +221,42 @@ template <class GridType>
 void makeHalfCircleThreeTris(GridType& grid)
 {
     static_assert(GridType::dimension==2, "makeHalfCircleThreeTris can only be instantiated for 2d grids");
-    
-    using namespace Dune;
 
     Dune::GridFactory<GridType> factory(&grid);
 
     // /////////////////////////////
     //   Create boundary segments
     // /////////////////////////////
-    FieldVector<double,2> center(0);
-    center[1] = 15;
-
-    std::vector<unsigned int> vertices(2);
+    Dune::FieldVector<double,2> center = {0,15};
 
     typedef typename std::shared_ptr<Dune::BoundarySegment<2> > SegmentPointer;
 
-    vertices[0] = 1;  vertices[1] = 2;
-    factory.insertBoundarySegment(vertices, SegmentPointer(new ArcOfCircle(center, 15, M_PI, M_PI*4/3)));
-
-    vertices[0] = 2;  vertices[1] = 3;
-    factory.insertBoundarySegment(vertices, SegmentPointer(new ArcOfCircle(center, 15, M_PI*4/3, M_PI*5/3)));
-
-    vertices[0] = 3;  vertices[1] = 0;
-    factory.insertBoundarySegment(vertices, SegmentPointer(new ArcOfCircle(center, 15, M_PI*5/3, M_PI*2)));
+    factory.insertBoundarySegment({1,2}, SegmentPointer(new ArcOfCircle(center, 15, M_PI, M_PI*4/3)));
+    factory.insertBoundarySegment({2,3}, SegmentPointer(new ArcOfCircle(center, 15, M_PI*4/3, M_PI*5/3)));
+    factory.insertBoundarySegment({3,0}, SegmentPointer(new ArcOfCircle(center, 15, M_PI*5/3, M_PI*2)));
 
     // ///////////////////////
     //   Insert vertices
     // ///////////////////////
-    FieldVector<double,2> pos;
-
-    pos[0] = 15;  pos[1] = 15;
-    factory.insertVertex(pos);
-  
-    pos[0] = -15; pos[1] = 15;
-    factory.insertVertex(pos);
-
-    pos[0] = -7.5; pos[1] = 2.00962;
-    factory.insertVertex(pos);
 
-    pos[0] = 7.5; pos[1] = 2.00962;
-    factory.insertVertex(pos);
-
-    pos[0] = 0;   pos[1] = 15;
-    factory.insertVertex(pos);
+    factory.insertVertex({15,15});
+    factory.insertVertex({-15,15});
+    factory.insertVertex({-7.5,2.00962});
+    factory.insertVertex({7.5,2.00962});
+    factory.insertVertex(center);
 
     // /////////////////
     // Insert elements
     // /////////////////
 
-    std::vector<unsigned int> cornerIDs(3);
-
-    cornerIDs[0] = 1;    cornerIDs[1] = 2;    cornerIDs[2] = 4;
-    factory.insertElement(Dune::GeometryTypes::simplex(2), cornerIDs);
-
-    cornerIDs[0] = 2;    cornerIDs[1] = 3;    cornerIDs[2] = 4;
-    factory.insertElement(Dune::GeometryTypes::simplex(2), cornerIDs);
-
-    cornerIDs[0] = 3;    cornerIDs[1] = 0;    cornerIDs[2] = 4;
-    factory.insertElement(Dune::GeometryTypes::simplex(2), cornerIDs);
+    factory.insertElement(Dune::GeometryTypes::simplex(2), {1,2,4});
+    factory.insertElement(Dune::GeometryTypes::simplex(2), {2,3,4});
+    factory.insertElement(Dune::GeometryTypes::simplex(2), {3,0,4});
 
     // //////////////////////////////////////
     //   Finish initialization
     // //////////////////////////////////////
     factory.createGrid();
-
 }
 
 #endif
-- 
GitLab