From 9e9b30357e305dbbbbe1fe4a8990d60b7ae13590 Mon Sep 17 00:00:00 2001
From: Stephane Del Pino <stephane.delpino44@gmail.com>
Date: Fri, 27 Apr 2018 19:14:17 +0200
Subject: [PATCH] Begining of quad mesh support

---
 src/mesh/Connectivity2D.hpp | 19 +++++++++++--------
 src/mesh/GmshReader.cpp     | 22 +++++++++++++++-------
 2 files changed, 26 insertions(+), 15 deletions(-)

diff --git a/src/mesh/Connectivity2D.hpp b/src/mesh/Connectivity2D.hpp
index 640115039..30610c9ce 100644
--- a/src/mesh/Connectivity2D.hpp
+++ b/src/mesh/Connectivity2D.hpp
@@ -131,24 +131,24 @@ public:
     // Computes inefficiently node->cells connectivity [Version 0]
     
     std::multimap<unsigned int, unsigned int> node_cells_map;
-
-#warning ONLY WORKS FOR TRIANGLES
-    // ------------------------------>>>>
-    m_max_nb_node_per_cell = 3;
+    using namespace Kokkos::Experimental;
+    Kokkos::parallel_reduce(m_number_of_cells, KOKKOS_LAMBDA(const int& j, size_t& nb_max) {
+	const size_t n = m_cell_nb_nodes[j];
+	if (n > nb_max) nb_max = n; 
+      }, Max<size_t>(m_max_nb_node_per_cell));
+    
     for (unsigned int j=0; j<m_number_of_cells; ++j) {
-      for (unsigned int r=0; r<3; ++r) {
+      for (unsigned int r=0; r<m_cell_nb_nodes[j]; ++r) {
 	node_cells_map.insert(std::make_pair(cell_nodes(j,r),j));
       }
     }
-    // <<<<------------------------------
 
     std::vector<unsigned int> node_ids;
     node_ids.reserve(node_cells_map.size());
     for (const auto& node_cell: node_cells_map) {
       node_ids.push_back(node_cell.first);
     }
-    std::vector<unsigned int>::iterator last_unique
-      = std::unique(node_ids.begin(), node_ids.end());
+    auto last_unique = std::unique(node_ids.begin(), node_ids.end());
     node_ids.resize(std::distance(node_ids.begin(), last_unique));
 
     m_number_of_nodes = node_ids.size();
@@ -156,6 +156,9 @@ public:
     std::cout << "node_ids.size()=" << node_ids.size() << '\n';
     if ((node_ids[0] != 0) or (node_ids[node_ids.size()-1] != node_ids.size()-1)) {
       std::cerr << "sparse node numerotation NIY\n";
+      for (int i=0; i<node_ids.size(); ++i) {
+	std::cout << "node_ids[" << i << "] = " << node_ids[i] << '\n';
+      }
       std::exit(0);
     }
 
diff --git a/src/mesh/GmshReader.cpp b/src/mesh/GmshReader.cpp
index 8090134e4..c9f240434 100644
--- a/src/mesh/GmshReader.cpp
+++ b/src/mesh/GmshReader.cpp
@@ -763,24 +763,32 @@ GmshReader::__proceedData()
     if ((dimension1_mask, elementNumber)>0) {
       // throw ErrorHandler(__FILE__,__LINE__,"edges are not treated", ErrorHandler::normal);
     }
-    if (__quadrangles.extent(0)>0) {
-      std::cerr << "quadrangles NYI\n";
-      std::exit(0);
-    }
-
     const size_t nb_cells = (dimension2_mask, elementNumber);
 
     std::cout << "nb_cells=" << nb_cells << '\n';
     const Kokkos::View<unsigned int**> cell_nodes("cell_nodes", nb_cells, 3);
-    for (int j=0; j<nb_cells; ++j) {
+    const size_t nb_triangles = __triangles.extent(0);
+    for (size_t j=0; j<nb_triangles; ++j) {
       cell_nodes(j,0) = __triangles[j][0];
       cell_nodes(j,1) = __triangles[j][1];
       cell_nodes(j,2) = __triangles[j][2];
     }
+    
+    const size_t nb_quadrangles = __quadrangles.extent(0);
+    for (size_t j=0; j<nb_quadrangles; ++j) {
+      const size_t jq = j+nb_triangles;
+      cell_nodes(jq,0) = __quadrangles[j][0];
+      cell_nodes(jq,1) = __quadrangles[j][1];
+      cell_nodes(jq,2) = __quadrangles[j][2];
+      cell_nodes(jq,3) = __quadrangles[j][3];
+    }
     const Kokkos::View<unsigned short*> cell_nb_nodes("cell_nb_nodes", nb_cells);
-    for (int j=0; j<nb_cells; ++j) {
+    for (int j=0; j<nb_triangles; ++j) {
       cell_nb_nodes[j] = 3;
     }
+    for (int j=nb_triangles; j<nb_triangles+nb_quadrangles; ++j) {
+      cell_nb_nodes[j] = 4;
+    }
     m_connectivity = new Connectivity2D(cell_nb_nodes, cell_nodes);
     Connectivity2D& connectivity = *m_connectivity;
     typedef Mesh<Connectivity2D> MeshType;
-- 
GitLab