From f61ec71a3f0a3069a8c3a1372ef5904a9750e5d7 Mon Sep 17 00:00:00 2001
From: Jan Bobot <bobotjan@fit.cvut.cz>
Date: Wed, 31 Mar 2021 15:58:08 +0200
Subject: [PATCH] Modified MeshReader to handle reading Polygonal meshes

---
 src/TNL/Meshes/MeshDetails/initializer/EntitySeed.h | 6 ++++++
 src/TNL/Meshes/Readers/MeshReader.h                 | 1 +
 src/TNL/Meshes/TypeResolver/MeshTypeResolver.hpp    | 2 ++
 src/TNL/Meshes/Writers/VTKWriter.hpp                | 8 ++++++++
 src/TNL/Meshes/Writers/VTUWriter.hpp                | 2 ++
 src/Tools/tnl-mesh-converter.cpp                    | 1 +
 6 files changed, 20 insertions(+)

diff --git a/src/TNL/Meshes/MeshDetails/initializer/EntitySeed.h b/src/TNL/Meshes/MeshDetails/initializer/EntitySeed.h
index 5970be03a2..74af00889b 100644
--- a/src/TNL/Meshes/MeshDetails/initializer/EntitySeed.h
+++ b/src/TNL/Meshes/MeshDetails/initializer/EntitySeed.h
@@ -41,6 +41,9 @@ class EntitySeed
       using HashType        = EntitySeedHash< EntitySeed >;
       using KeyEqual        = EntitySeedEq< EntitySeed >;
 
+      //this function is here only for compatibility with MeshReader
+      void setCornersCount( const LocalIndexType& cornersCount ) {}
+
       static constexpr LocalIndexType getCornersCount()
       {
          return SubvertexTraits::count;
@@ -81,6 +84,9 @@ class EntitySeed< MeshConfig, Topologies::Vertex >
       using HashType        = EntitySeedHash< EntitySeed >;
       using KeyEqual        = EntitySeedEq< EntitySeed >;
 
+      //this function is here only for compatibility with MeshReader
+      void setCornersCount( const LocalIndexType& cornersCount ) {}
+
       static constexpr LocalIndexType getCornersCount()
       {
          return 1;
diff --git a/src/TNL/Meshes/Readers/MeshReader.h b/src/TNL/Meshes/Readers/MeshReader.h
index 6d7398c287..5595fac62c 100644
--- a/src/TNL/Meshes/Readers/MeshReader.h
+++ b/src/TNL/Meshes/Readers/MeshReader.h
@@ -199,6 +199,7 @@ public:
                for( std::size_t i = 0; i < NumberOfCells; i++ ) {
                   CellSeedType& seed = meshBuilder.getCellSeed( i );
                   const std::size_t offsetEnd = offsets[ i ];
+                  seed.setCornersCount( offsetEnd - offsetStart );
                   for( std::size_t o = offsetStart; o < offsetEnd; o++ )
                      seed.setCornerId( o - offsetStart, connectivity[ o ] );
                   offsetStart = offsetEnd;
diff --git a/src/TNL/Meshes/TypeResolver/MeshTypeResolver.hpp b/src/TNL/Meshes/TypeResolver/MeshTypeResolver.hpp
index 72d3c8ef71..58383c3001 100644
--- a/src/TNL/Meshes/TypeResolver/MeshTypeResolver.hpp
+++ b/src/TNL/Meshes/TypeResolver/MeshTypeResolver.hpp
@@ -51,6 +51,8 @@ resolveCellTopology( Reader& reader, Functor&& functor )
          return resolveSpaceDimension< Topologies::Tetrahedron >( reader, std::forward<Functor>(functor) );
       case VTK::EntityShape::Hexahedron:
          return resolveSpaceDimension< Topologies::Hexahedron >( reader, std::forward<Functor>(functor) );
+      case VTK::EntityShape::Polygon:
+         return resolveSpaceDimension< Topologies::Polygon >( reader, std::forward<Functor>(functor) );
       default:
          std::cerr << "unsupported cell topology: " << VTK::getShapeName( reader.getCellShape() ) << std::endl;
          return false;
diff --git a/src/TNL/Meshes/Writers/VTKWriter.hpp b/src/TNL/Meshes/Writers/VTKWriter.hpp
index 87b7950813..0a5b44f0bb 100644
--- a/src/TNL/Meshes/Writers/VTKWriter.hpp
+++ b/src/TNL/Meshes/Writers/VTKWriter.hpp
@@ -65,6 +65,8 @@ struct MeshEntitiesVTKWriter
       const int verticesPerEntity = VerticesPerEntity< EntityType >::count;;
       for( Index i = 0; i < entitiesCount; i++ ) {
          const auto& entity = mesh.template getEntity< EntityType >( i );
+         //TODO: polygons require verticesPerEntity to be aquired like below
+         //const Index verticesPerEntity = entity.template getSubentitiesCount< 0 >();
          writeInt( format, str, verticesPerEntity );
          for( int j = 0; j < verticesPerEntity; j++ )
             writeInt( format, str, entity.template getSubentityIndex< 0 >( j ) );
@@ -445,6 +447,12 @@ VTKWriter< Mesh >::writeEntities( const Mesh& mesh )
    const int verticesPerEntity = VerticesPerEntity< EntityType >::count;
    const std::uint64_t cellsListSize = cellsCount * ( verticesPerEntity + 1 );
 
+   //TODO: polygons need cellsListSize computed like this, but code doesnt compile, 
+   //      because function writeEntities is also used for grids, that don't contain function getSubentitiesCount
+   /*IndexType cellsListSize = cellsCount;
+   for(IndexType index = 0; index < cellsCount; index++)
+      cellsListSize += mesh.template getSubentitiesCount< EntityDimension, 0 >( index );*/
+
    str << std::endl << "CELLS " << cellsCount << " " << cellsListSize << std::endl;
    EntitiesWriter< EntityDimension >::exec( mesh, str, format );
 
diff --git a/src/TNL/Meshes/Writers/VTUWriter.hpp b/src/TNL/Meshes/Writers/VTUWriter.hpp
index e26b2942ae..295357bcac 100644
--- a/src/TNL/Meshes/Writers/VTUWriter.hpp
+++ b/src/TNL/Meshes/Writers/VTUWriter.hpp
@@ -46,6 +46,8 @@ struct MeshEntitiesVTUCollector
       const Index verticesPerEntity = VerticesPerEntity< EntityType >::count;;
       for( Index i = 0; i < entitiesCount; i++ ) {
          const auto& entity = mesh.template getEntity< EntityType >( i );
+         //TODO: polygons require verticesPerEntity to be aquired like below
+         //const Index verticesPerEntity = entity.template getSubentitiesCount< 0 >();
          for( Index j = 0; j < verticesPerEntity; j++ )
             connectivity.push_back( entity.template getSubentityIndex< 0 >( j ) );
          offsets.push_back( connectivity.size() );
diff --git a/src/Tools/tnl-mesh-converter.cpp b/src/Tools/tnl-mesh-converter.cpp
index bbaf821757..e125c66e3d 100644
--- a/src/Tools/tnl-mesh-converter.cpp
+++ b/src/Tools/tnl-mesh-converter.cpp
@@ -43,6 +43,7 @@ template<> struct MeshCellTopologyTag< MeshConverterConfigTag, Topologies::Trian
 template<> struct MeshCellTopologyTag< MeshConverterConfigTag, Topologies::Quadrangle > { enum { enabled = true }; };
 template<> struct MeshCellTopologyTag< MeshConverterConfigTag, Topologies::Tetrahedron > { enum { enabled = true }; };
 template<> struct MeshCellTopologyTag< MeshConverterConfigTag, Topologies::Hexahedron > { enum { enabled = true }; };
+//template<> struct MeshCellTopologyTag< MeshConverterConfigTag, Topologies::Polygon > { enum { enabled = true }; };
 
 // Meshes are enabled only for the space dimension equal to the cell dimension.
 template< typename CellTopology, int SpaceDimension >
-- 
GitLab