From 3538348a3b691461c0dc9c205c2cb9ebfb5c116b Mon Sep 17 00:00:00 2001
From: Simon Praetorius <simon.praetorius@tu-dresden.de>
Date: Fri, 24 Aug 2018 10:22:25 +0200
Subject: [PATCH] support for polygonal elements

---
 dune.module          |  1 +
 dune/vtk/vtktypes.cc |  8 +++++
 dune/vtk/vtktypes.hh | 12 +++----
 src/CMakeLists.txt   |  8 ++++-
 src/polygongrid.cc   | 75 ++++++++++++++++++++++++++++++++++++++++++++
 5 files changed, 97 insertions(+), 7 deletions(-)
 create mode 100644 src/polygongrid.cc

diff --git a/dune.module b/dune.module
index d2413eb..288aa7a 100644
--- a/dune.module
+++ b/dune.module
@@ -8,3 +8,4 @@ Version: 0.1
 Maintainer: simon.praetorius@tu-dresden.de
 #depending on
 Depends: dune-grid dune-functions
+Suggests: dune-uggrid dune-polygongrid
diff --git a/dune/vtk/vtktypes.cc b/dune/vtk/vtktypes.cc
index feae227..b93b5d5 100644
--- a/dune/vtk/vtktypes.cc
+++ b/dune/vtk/vtktypes.cc
@@ -82,6 +82,14 @@ CellType::CellType (GeometryType const& t, CellParametrization parametrization)
       permutation_ = {0,1,3,2,4};
       noPermutation_ = false;
     }
+    else if (t.isNone() && t.dim() == 1) {
+      type_ = LINE;
+      permutation_ = {0,1};
+    }
+    else if (t.isNone() && t.dim() == 2) {
+      type_ = POLYGON;
+      permutation_ = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19};
+    }
     else {
       std::cerr << "Geometry Type not supported by VTK!\n";
       std::abort();
diff --git a/dune/vtk/vtktypes.hh b/dune/vtk/vtktypes.hh
index 68342ce..4998979 100644
--- a/dune/vtk/vtktypes.hh
+++ b/dune/vtk/vtktypes.hh
@@ -36,16 +36,16 @@ namespace Dune { namespace experimental
     enum CellTypes : std::uint8_t {
       // Linear VTK cell types
       VERTEX         = 1,
-      POLY_VERTEX    = 2, // not supported
+      /* POLY_VERTEX    = 2, // not supported */
       LINE           = 3,
-      POLY_LINE      = 4, // not supported
+      /* POLY_LINE      = 4, // not supported */
       TRIANGLE       = 5,
-      TRIANGLE_STRIP = 6, // not supported
-      POLYGON        = 7, // not supported
-      PIXEL          = 8, // not supported
+      /* TRIANGLE_STRIP = 6, // not supported */
+      POLYGON        = 7,
+      /* PIXEL          = 8, // not supported */
       QUAD           = 9,
       TETRA          = 10,
-      VOXEL          = 11, // not supported
+      /* VOXEL          = 11, // not supported */
       HEXAHEDRON     = 12,
       WEDGE          = 13,
       PYRAMID        = 14,
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index a1d6e57..59590cf 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -18,4 +18,10 @@ add_executable("quadratic" quadratic.cc)
 target_link_dune_default_libraries("quadratic")
 target_link_libraries("quadratic" dunevtk)
 
-add_subdirectory(test)
\ No newline at end of file
+if (dune-polygongrid_FOUND)
+  add_executable("polygongrid" polygongrid.cc)
+  target_link_dune_default_libraries("polygongrid")
+  target_link_libraries("polygongrid" dunevtk dunepolygongrid)
+endif ()
+
+add_subdirectory(test)
diff --git a/src/polygongrid.cc b/src/polygongrid.cc
new file mode 100644
index 0000000..2364d71
--- /dev/null
+++ b/src/polygongrid.cc
@@ -0,0 +1,75 @@
+// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+// vi: set et ts=4 sw=2 sts=2:
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <iostream>
+#include <vector>
+
+#include <dune/common/parallel/mpihelper.hh> // An initializer of MPI
+#include <dune/common/exceptions.hh> // We use exceptions
+#include <dune/common/filledarray.hh>
+
+#include <dune/functions/functionspacebases/defaultglobalbasis.hh>
+#include <dune/functions/functionspacebases/lagrangebasis.hh>
+#include <dune/functions/functionspacebases/interpolate.hh>
+#include <dune/functions/gridfunctions/analyticgridviewfunction.hh>
+#include <dune/functions/gridfunctions/discreteglobalbasisfunction.hh>
+
+#include <dune/polygongrid/grid.hh>
+#include <dune/polygongrid/gridfactory.hh>
+
+#include <dune/vtk/vtkwriter.hh>
+
+using namespace Dune;
+using namespace Dune::experimental;
+using namespace Dune::Functions;
+
+using GridType = Dune::PolygonGrid<double>;
+
+std::unique_ptr<GridType> createArbitraryGrid ()
+{
+  const std::vector< Dune::FieldVector< double, 2 > > vertices
+    = { { 0.0, 0.0 }, { 0.5, 0.0 }, { 1.0, 0.0 },
+        { 0.0, 0.4 }, { 0.5, 0.2 }, { 0.7, 0.4 }, { 1.0, 0.4 },
+        { 0.0, 0.7 }, { 0.7, 0.6 }, { 1.0, 0.6 },
+        { 0.0, 1.0 }, { 0.3, 1.0 }, { 1.0, 1.0 } };
+  const std::vector< std::vector< unsigned int > > polys
+    = { { 0, 1, 4, 3 }, { 1, 2, 6, 5, 4 }, { 3, 4, 5, 8, 11, 7 }, { 5, 6, 9, 8 }, { 7, 11, 10 }, { 8, 9, 12, 11 } };
+
+  Dune::GridFactory<GridType> factory;
+  for( const auto &vertex : vertices )
+    factory.insertVertex( vertex );
+  for( const auto &poly : polys )
+    factory.insertElement( Dune::GeometryTypes::none( 2 ), poly );
+  return std::unique_ptr<GridType>( factory.createGrid() );
+}
+
+
+int main(int argc, char** argv)
+{
+  Dune::MPIHelper::instance(argc, argv);
+
+  auto gridPtr = createArbitraryGrid();
+
+  using GridView = typename GridType::LeafGridView;
+  GridView gridView = gridPtr->leafGridView();
+
+  using Writer = VtkWriter<GridView>;
+  Writer vtkWriter(gridView);
+  auto p1Analytic = makeAnalyticGridViewFunction([](auto const& x) {
+    return std::sin(10*x[0])*std::cos(10*x[1])+std::sin(10*x[2]);
+  }, gridView);
+
+  vtkWriter.addPointData(p1Analytic, "p1");
+  vtkWriter.addCellData(p1Analytic, "p0");
+
+  vtkWriter.write("poly_ascii_float32.vtu", Vtk::ASCII);
+  vtkWriter.write("poly_binary_float32.vtu", Vtk::BINARY);
+  vtkWriter.write("poly_compressed_float32.vtu", Vtk::COMPRESSED);
+  vtkWriter.write("poly_ascii_float64.vtu", Vtk::ASCII, Vtk::FLOAT64);
+  vtkWriter.write("poly_binary_float64.vtu", Vtk::BINARY, Vtk::FLOAT64);
+  vtkWriter.write("poly_compressed_float64.vtu", Vtk::COMPRESSED, Vtk::FLOAT64);
+}
-- 
GitLab