Skip to content
Snippets Groups Projects
vtkreader.hh 1.3 KiB
Newer Older
  • Learn to ignore specific revisions
  • // -*- 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