diff --git a/dune/gfe/vtkreader.hh b/dune/gfe/vtkreader.hh new file mode 100644 index 0000000000000000000000000000000000000000..37954a9744a45b9867f331eb52feb933cd053374 --- /dev/null +++ b/dune/gfe/vtkreader.hh @@ -0,0 +1,54 @@ +// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- +// vi: set et ts=4 sw=2 sts=2: +#ifndef DUNE_GFE_VTKREADER_HH +#define DUNE_GFE_VTKREADER_HH + +#include <memory> + +#include <dune/gfe/vtkfile.hh> + +/** \brief Read a grid from a VTK file + */ +template <class GridType> +class VTKReader +{ +public: + + /** \brief Read a grid from a VTK file */ + static std::unique_ptr<GridType> read(std::string filename) + { + constexpr auto dimworld = GridType::dimensionworld; + + Dune::GFE::VTKFile vtkFile; + + // Read test file from disk + vtkFile.read(filename); + + Dune::GridFactory<GridType> factory; + + for (const auto& v : vtkFile.points_) + { + // use the first dimworld components as vertex coordinate; discard the rest + Dune::FieldVector<typename GridType::ctype, dimworld> pos; + for (int i=0; i<dimworld; i++) + pos[i] = v[i]; + factory.insertVertex(pos); + } + + Dune::GeometryType triangle; + triangle.makeTriangle(); + + for (int i=0; i<vtkFile.cellConnectivity_.size(); i+=3) + { + factory.insertElement(triangle, {vtkFile.cellConnectivity_[i], + vtkFile.cellConnectivity_[i+1], + vtkFile.cellConnectivity_[i+2]}); + + } + + return std::unique_ptr<GridType>(factory.createGrid()); + } + +}; + +#endif \ No newline at end of file