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