From 11c957a6cd0a5df44e46df7dd9f70d10a5548e16 Mon Sep 17 00:00:00 2001
From: Stephane Del Pino <stephane.delpino44@gmail.com>
Date: Mon, 29 Oct 2018 17:49:32 +0100
Subject: [PATCH] Improve connectivity dispatching tests

Connectivity is now spread (and rebuild) on processors

To ensure validity, it remains to
- share vertices coordinates

Following steps will require to
- share item tags/references info
- share eventually faces and edges numbering
- build one level of ghost cells (quite easy if anything else is done correctly)
---
 src/mesh/GmshReader.cpp | 121 +++++++++++++++++++++++++++++++++++++++-
 1 file changed, 120 insertions(+), 1 deletion(-)

diff --git a/src/mesh/GmshReader.cpp b/src/mesh/GmshReader.cpp
index c411552b7..0eced16f3 100644
--- a/src/mesh/GmshReader.cpp
+++ b/src/mesh/GmshReader.cpp
@@ -297,15 +297,34 @@ void GmshReader::_dispatch()
 
   parallel::exchange(cell_node_number_to_send_by_proc, recv_cell_node_number_by_proc);
 
+  for (size_t i_rank=0; i_rank < parallel::size(); ++i_rank) {
+    if (parallel::rank() == i_rank) {
+      std::cout << "----- rank=" << i_rank << " -----\n";
+      for (size_t j_rank=0; j_rank < parallel::size(); ++j_rank) {
+        std::cout << j_rank << ": ->";
+        for (size_t j=0; j<recv_cell_node_number_by_proc[j_rank].size(); ++j) {
+          std::cout << ' ' << recv_cell_node_number_by_proc[j_rank][j];
+        }
+        std::cout << '\n' << std::flush;
+      }
+    }
+    parallel::barrier();
+  }
+
   for (size_t i_rank=0; i_rank < parallel::size(); ++i_rank) {
     if (parallel::rank() == i_rank) {
       std::cout << "----- rank=" << i_rank << " -----\n";
       for (size_t j_rank=0; j_rank < parallel::size(); ++j_rank) {
         std::cout << "recv from " << j_rank << ':';
+        size_t l =0;
         for (size_t i=0; i<recv_cell_number_by_proc[j_rank].size(); ++i) {
           std::cout << ' ' << recv_cell_number_by_proc[j_rank][i]
                     << '[' << name(recv_cell_type_by_proc[j_rank][i])
-                    << ':' << recv_number_of_node_per_cell_by_proc[j_rank][i] << "] ";
+                    << ":(" << recv_number_of_node_per_cell_by_proc[j_rank][i] << ')';
+          for (int k=0; k<recv_number_of_node_per_cell_by_proc[j_rank][i]; ++k) {
+            std::cout << ' ' << recv_cell_node_number_by_proc[j_rank][l++];
+          }
+          std::cout << "] ";
         }
         std::cout << '\n' << std::flush;
       }
@@ -313,6 +332,106 @@ void GmshReader::_dispatch()
     parallel::barrier();
   }
 
+  const std::unordered_map<int, int> node_number_id_map
+      = [&] () {
+          std::unordered_map<int, int> node_number_id_map;
+          for (size_t i_rank=0; i_rank<parallel::size(); ++i_rank) {
+            int cpt=0;
+            for (size_t i=0; i<recv_cell_node_number_by_proc[i_rank].size(); ++i) {
+              int node_number = recv_cell_node_number_by_proc[i_rank][i];
+              auto [iterator, inserted] = node_number_id_map.insert(std::make_pair(node_number, cpt));
+              if (inserted) cpt++;
+            }
+          }
+          return node_number_id_map;
+        } ();
+
+  std::vector<int> new_node_number(node_number_id_map.size());
+  for (const auto& [number, id] : node_number_id_map) {
+    new_node_number[id] = number;
+  }
+
+  for (size_t i_rank=0; i_rank < parallel::size(); ++i_rank) {
+    if (parallel::rank() == i_rank) {
+      std::cout << "----- rank=" << i_rank << " -----\n";
+      for (size_t i=0; i<new_node_number.size(); ++i) {
+        std::cout << i << " -> " << new_node_number[i] << '\n';
+      }
+      std::cout << std::flush;
+    }
+    parallel::barrier();
+  }
+
+  std::vector<std::vector<unsigned int>> cell_by_node_vector;
+  for (size_t i_rank=0; i_rank < parallel::size(); ++i_rank) {
+    int l=0;
+    for (size_t i=0; i<recv_cell_number_by_proc[i_rank].size(); ++i) {
+      std::vector<unsigned int> node_vector;
+      for (int k=0; k<recv_number_of_node_per_cell_by_proc[i_rank][i]; ++k) {
+        const auto& searched_node_id = node_number_id_map.find(recv_cell_node_number_by_proc[i_rank][l++]);
+        Assert(searched_node_id != node_number_id_map.end());
+        node_vector.push_back(searched_node_id->second);
+      }
+      cell_by_node_vector.emplace_back(node_vector);
+    }
+  }
+  for (size_t i_rank=0; i_rank < parallel::size(); ++i_rank) {
+    if (parallel::rank() == i_rank) {
+      std::cout << "----- rank=" << i_rank << " -----\n";
+      for (const auto& node_vector : cell_by_node_vector) {
+        for (const auto& node_id : node_vector) {
+          std::cout << node_id << ' ';
+        }
+        std::cout << "(";
+        for (const auto& node_id : node_vector) {
+          std::cout << ' ' << new_node_number[node_id];
+        }
+        std::cout << " )\n";
+      }
+    }
+    parallel::barrier();
+  }
+
+  // std::vector<Array<int>> recv_cell_number_by_proc
+  //     = dispatcher.exchange(mesh.connectivity().cellNumber());
+
+  const std::unordered_map<int, int> cell_number_id_map
+      = [&] () {
+          std::unordered_map<int, int> cell_number_id_map;
+          for (size_t i_rank=0; i_rank<parallel::size(); ++i_rank) {
+            int cpt=0;
+            for (size_t i=0; i<recv_cell_number_by_proc[i_rank].size(); ++i) {
+              int cell_number = recv_cell_number_by_proc[i_rank][i];
+              auto [iterator, inserted] = cell_number_id_map.insert(std::make_pair(cell_number, cpt));
+              if (inserted) cpt++;
+            }
+          }
+          return cell_number_id_map;
+        } ();
+
+  std::vector<int> new_cell_number(cell_number_id_map.size());
+  for (const auto& [number, id] : cell_number_id_map) {
+    new_cell_number[id] = number;
+  }
+
+  std::vector<CellType> new_cell_type(cell_number_id_map.size());
+  for (size_t i_rank=0; i_rank<parallel::size(); ++i_rank) {
+    for (size_t i=0; i<recv_cell_number_by_proc[i_rank].size(); ++i) {
+      int cell_number = recv_cell_number_by_proc[i_rank][i];
+      const auto& searched_node_id = cell_number_id_map.find(cell_number);
+      Assert(searched_node_id != node_number_id_map.end());
+      new_cell_type[searched_node_id->second] = recv_cell_type_by_proc[i_rank][i];
+    }
+  }
+
+  using ConnectivityType = Connectivity<Dimension>;
+
+  std::shared_ptr<ConnectivityType> p_connectivity
+      = std::make_shared<ConnectivityType>(cell_by_node_vector,
+                                           new_cell_type,
+                                           new_cell_number,
+                                           new_node_number);
+
   parallel::Messenger::destroy();
   std::exit(0);
 }
-- 
GitLab