diff --git a/dune.module b/dune.module index d2413eb1270fedd9f74b692ea38242ad60fabbf7..288aa7a9356b4baa0b40bc8383b69f47a3d2bc2b 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 feae2277b0bdaf2e4bd3163576351ab47a9d35f2..b93b5d52e894aa66d217f16d33d8a8573a4f1c77 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 68342ce56e749856cc5c80485230e7785fb4bde8..4998979bab342a823bbc64943b6736c046160d95 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 a1d6e576bfabda39c3eefc8d9628ef379cb44b70..59590cfef725a8013879781433ec82f519043351 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 0000000000000000000000000000000000000000..2364d71228d1062fad9ea92ef0f9b61823c49be6 --- /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); +}