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