From cda108fc4dbb64975ec2e072d0154aa400ed27a0 Mon Sep 17 00:00:00 2001
From: Stephane Del Pino <stephane.delpino44@gmail.com>
Date: Tue, 9 Oct 2018 18:44:49 +0200
Subject: [PATCH] Begin use of item ids to create dispatching messages

- need to read item ids from the mesh
- need to generate ids for non specified ones (e.g. Gmsh does not provide
  numbers for all boundary elements)
---
 src/mesh/GmshReader.cpp | 42 +++++++++++++++++++++++++++++++----------
 1 file changed, 32 insertions(+), 10 deletions(-)

diff --git a/src/mesh/GmshReader.cpp b/src/mesh/GmshReader.cpp
index c258855f3..6b071de30 100644
--- a/src/mesh/GmshReader.cpp
+++ b/src/mesh/GmshReader.cpp
@@ -177,14 +177,14 @@ void GmshReader::_dispatch()
   Partitioner P;
   Array<int> cell_new_owner = P.partition(mesh_graph);
 
-  const std::vector<Array<const int>> cell_to_send_by_proc
+  const std::vector<Array<const CellId>> cell_to_send_by_proc
       = [&] () {
-          std::vector<std::vector<int>> cell_vector_to_send_by_proc(commSize());
+          std::vector<std::vector<CellId>> cell_vector_to_send_by_proc(commSize());
           for (size_t i=0; i<cell_new_owner.size(); ++i) {
-            cell_vector_to_send_by_proc[cell_new_owner[i]].push_back(i);
+            cell_vector_to_send_by_proc[cell_new_owner[i]].push_back(CellId{i});
           }
 
-          std::vector<Array<const int>> cell_to_send_by_proc(commSize());
+          std::vector<Array<const CellId>> cell_to_send_by_proc(commSize());
           for (size_t i=0; i<commSize(); ++i) {
             cell_to_send_by_proc[i] = convert_to_array(cell_vector_to_send_by_proc[i]);
           }
@@ -192,6 +192,20 @@ void GmshReader::_dispatch()
           return std::move(cell_to_send_by_proc);
         } ();
 
+  const std::vector<Array<const int>> cell_number_to_send_by_proc
+      = [&] () {
+          std::vector<Array<const int>> cell_number_to_send_by_proc(commSize());
+          for (size_t i=0; i<commSize(); ++i) {
+            const Array<const CellId>& cell_list = cell_to_send_by_proc[i];
+            Array<int> cell_number_list(cell_list.size());
+            parallel_for (cell_list.size(), PASTIS_LAMBDA(const CellId& cell_id) {
+#warning must use table of cell numbers
+                cell_number_list[cell_id] = cell_list[cell_id];
+              });
+            cell_number_to_send_by_proc[i] = cell_number_list;
+          }
+          return std::move(cell_number_to_send_by_proc);
+        } ();
 
   Array<int> nb_cell_to_send_by_proc(commSize());
   for (size_t i=0; i<commSize(); ++i) {
@@ -206,22 +220,30 @@ void GmshReader::_dispatch()
       + Sum(nb_cell_to_recv_by_proc)
       - Sum(nb_cell_to_send_by_proc);
 
-  std::vector<Array<int>> recv_cell_by_proc(commSize());
+  std::vector<Array<int>> recv_cell_number_by_proc(commSize());
   for (size_t i=0; i<commSize(); ++i) {
-    recv_cell_by_proc[i] = Array<int>(nb_cell_to_recv_by_proc[i]);
+    recv_cell_number_by_proc[i] = Array<int>(nb_cell_to_recv_by_proc[i]);
   }
 
-  exchange(cell_to_send_by_proc, recv_cell_by_proc);
+  exchange(cell_number_to_send_by_proc, recv_cell_number_by_proc);
 
-  Array<int> new_cell_id(new_cell_number);
+  // std::vector<Array<CellType>> cell_type_to_send_by_proc
+  //     = [&] () {
+  //         CellValue<const CellType> cell_type = mesh.connectivity().cellType();
+  //         std::vector<std::vector<CellType>> cell_type_vector_to_send_by_proc(commSize());
+  //         for (CellId i=0; i<mesh.numberOfCells(); ++i) {
+  //           cell_type_vector_to_send_by_proc[cell_new_owner[i]].push_back(cell_type[i]);
+  //         }
+  //         return cell_type_vector_to_send_by_proc;
+  //       } ();
 
   for (int i_rank=0; i_rank < commSize(); ++i_rank) {
     if (commRank() == i_rank) {
       std::cout << "----- rank=" << i_rank << " -----\n";
       for (int j_rank=0; j_rank < commSize(); ++j_rank) {
         std::cout << "recv from " << j_rank << ':';
-        for (size_t i=0; i<recv_cell_by_proc[j_rank].size(); ++i) {
-          std::cout << ' ' << recv_cell_by_proc[j_rank][i];
+        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];
         }
         std::cout << '\n' << std::flush;
       }
-- 
GitLab