From ca389bdeb1296a4c61b2889512b9a4e5dcc415c0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Del=20Pino?= <stephane.delpino44@gmail.com>
Date: Tue, 14 Dec 2021 18:10:07 +0100
Subject: [PATCH] Add support for polygonal cells

---
 src/mesh/CellType.hpp                | 3 +++
 src/mesh/ConnectivityBuilderBase.cpp | 8 ++++++++
 src/output/VTKWriter.cpp             | 4 ++++
 3 files changed, 15 insertions(+)

diff --git a/src/mesh/CellType.hpp b/src/mesh/CellType.hpp
index 3a0f01520..335cfc647 100644
--- a/src/mesh/CellType.hpp
+++ b/src/mesh/CellType.hpp
@@ -11,6 +11,7 @@ enum class CellType : unsigned short
 
   Triangle,
   Quadrangle,
+  Polygon,
 
   Diamond,
   Hexahedron,
@@ -28,6 +29,8 @@ name(CellType cell_type)
     return "line";
   case CellType::Triangle:
     return "triangle";
+  case CellType::Polygon:
+    return "polygon";
   case CellType::Quadrangle:
     return "quadrangle";
   case CellType::Diamond:
diff --git a/src/mesh/ConnectivityBuilderBase.cpp b/src/mesh/ConnectivityBuilderBase.cpp
index 3da4837ee..55c56b3a4 100644
--- a/src/mesh/ConnectivityBuilderBase.cpp
+++ b/src/mesh/ConnectivityBuilderBase.cpp
@@ -61,6 +61,14 @@ ConnectivityBuilderBase::_computeCellFaceAndFaceNodeConnectivities(ConnectivityD
         face_cells_map[f3].emplace_back(std::make_tuple(j, 3, f3.reversed()));
         break;
       }
+      case CellType::Polygon: {
+        cell_nb_faces[j] = cell_nodes.size();
+        for (size_t i = 0; i < cell_nodes.size(); ++i) {
+          Face f({cell_nodes[i], cell_nodes[(i + 1) % cell_nodes.size()]}, node_number_vector);
+          face_cells_map[f].emplace_back(std::make_tuple(j, i, f.reversed()));
+        }
+        break;
+      }
       default: {
         std::ostringstream error_msg;
         error_msg << name(descriptor.cell_type_vector[j]) << ": unexpected cell type in dimension 2";
diff --git a/src/output/VTKWriter.cpp b/src/output/VTKWriter.cpp
index 4f40e9af3..7b407256a 100644
--- a/src/output/VTKWriter.cpp
+++ b/src/output/VTKWriter.cpp
@@ -491,6 +491,10 @@ VTKWriter::_write(const std::shared_ptr<const MeshType>& mesh,
             types[j] = 9;
             break;
           }
+          case CellType::Polygon: {
+            types[j] = 7;
+            break;
+          }
           case CellType::Tetrahedron: {
             types[j] = 10;
             break;
-- 
GitLab