From a76e76a624bc89859f64afd882880b51b4c96740 Mon Sep 17 00:00:00 2001
From: Stephane Del Pino <stephane.delpino44@gmail.com>
Date: Mon, 8 Apr 2019 12:38:06 +0200
Subject: [PATCH] Continue clean-up

RefFaceList's are now dispatched using generic coding
---
 src/main.cpp                        |  12 +--
 src/mesh/Connectivity.cpp           |   3 +-
 src/mesh/Connectivity.hpp           | 119 +++++++++++++++++++++-------
 src/mesh/ConnectivityDispatcher.cpp |  24 +++---
 src/mesh/GmshReader.cpp             |   8 +-
 5 files changed, 115 insertions(+), 51 deletions(-)

diff --git a/src/main.cpp b/src/main.cpp
index fe8b4eb48..951eddd43 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -74,9 +74,9 @@ int main(int argc, char *argv[])
               case BoundaryConditionDescriptor::Type::symmetry: {
                 const SymmetryBoundaryConditionDescriptor& sym_bc_descriptor
                     = dynamic_cast<const SymmetryBoundaryConditionDescriptor&>(*bc_descriptor);
-                for (size_t i_ref_node_list=0; i_ref_node_list<mesh.connectivity().numberOfRefNodeList();
+                for (size_t i_ref_node_list=0; i_ref_node_list<mesh.connectivity().numberOfRefItemList<ItemType::node>();
                      ++i_ref_node_list) {
-                  const RefNodeList& ref_node_list = mesh.connectivity().refNodeList(i_ref_node_list);
+                  const RefNodeList& ref_node_list = mesh.connectivity().refItemList<ItemType::node>(i_ref_node_list);
                   const RefId& ref = ref_node_list.refId();
                   if (ref == sym_bc_descriptor.boundaryDescriptor()) {
                     SymmetryBoundaryCondition<MeshType::Dimension>* sym_bc
@@ -191,9 +191,9 @@ int main(int argc, char *argv[])
               case BoundaryConditionDescriptor::Type::symmetry: {
                 const SymmetryBoundaryConditionDescriptor& sym_bc_descriptor
                     = dynamic_cast<const SymmetryBoundaryConditionDescriptor&>(*bc_descriptor);
-                for (size_t i_ref_face_list=0; i_ref_face_list<mesh.connectivity().numberOfRefFaceList();
+                for (size_t i_ref_face_list=0; i_ref_face_list<mesh.connectivity().numberOfRefItemList<ItemType::face>();
                      ++i_ref_face_list) {
-                  const RefFaceList& ref_face_list = mesh.connectivity().refFaceList(i_ref_face_list);
+                  const RefFaceList& ref_face_list = mesh.connectivity().refItemList<ItemType::face>(i_ref_face_list);
                   const RefId& ref = ref_face_list.refId();
                   if (ref == sym_bc_descriptor.boundaryDescriptor()) {
                     SymmetryBoundaryCondition<MeshType::Dimension>* sym_bc
@@ -295,9 +295,9 @@ int main(int argc, char *argv[])
               case BoundaryConditionDescriptor::Type::symmetry: {
                 const SymmetryBoundaryConditionDescriptor& sym_bc_descriptor
                     = dynamic_cast<const SymmetryBoundaryConditionDescriptor&>(*bc_descriptor);
-                for (size_t i_ref_face_list=0; i_ref_face_list<mesh.connectivity().numberOfRefFaceList();
+                for (size_t i_ref_face_list=0; i_ref_face_list<mesh.connectivity().numberOfRefItemList<ItemType::face>();
                      ++i_ref_face_list) {
-                  const RefFaceList& ref_face_list = mesh.connectivity().refFaceList(i_ref_face_list);
+                  const RefFaceList& ref_face_list = mesh.connectivity().refItemList<ItemType::face>(i_ref_face_list);
                   const RefId& ref = ref_face_list.refId();
                   if (ref == sym_bc_descriptor.boundaryDescriptor()) {
                     SymmetryBoundaryCondition<MeshType::Dimension>* sym_bc
diff --git a/src/mesh/Connectivity.cpp b/src/mesh/Connectivity.cpp
index 58543870f..28c6ef57b 100644
--- a/src/mesh/Connectivity.cpp
+++ b/src/mesh/Connectivity.cpp
@@ -134,8 +134,7 @@ _buildFrom(const ConnectivityDescriptor& descriptor)
       m_face_is_owned = face_is_owned;
     }
 
-
-    m_ref_face_list = descriptor.refFaceList();
+    m_ref_face_list_vector = descriptor.template refItemListVector<ItemType::face>();
   }
 }
 
diff --git a/src/mesh/Connectivity.hpp b/src/mesh/Connectivity.hpp
index 9c304864d..2a27cb380 100644
--- a/src/mesh/Connectivity.hpp
+++ b/src/mesh/Connectivity.hpp
@@ -41,7 +41,10 @@
 class ConnectivityDescriptor
 {
  private:
-  std::vector<RefFaceList> m_ref_face_list;
+  std::vector<RefCellList> m_ref_cell_list_vector;
+  std::vector<RefFaceList> m_ref_face_list_vector;
+  std::vector<RefEdgeList> m_ref_edge_list_vector;
+  std::vector<RefNodeList> m_ref_node_list_vector;
 
  public:
   std::vector<std::vector<unsigned int>> cell_to_node_vector;
@@ -76,18 +79,54 @@ class ConnectivityDescriptor
   std::vector<int> face_number_vector;
   std::vector<int> node_number_vector;
 
+  template <ItemType item_type>
+  const std::vector<int>& itemNumberVector() const
+  {
+    if constexpr (item_type == ItemType::cell) {
+      return cell_number_vector;
+    } else if constexpr (item_type == ItemType::face) {
+      return face_number_vector;
+    } else if constexpr (item_type == ItemType::node) {
+      return node_number_vector;
+    } else {
+      static_assert(is_false_item_type_v<item_type>, "Unexpected item type");
+    }
+  }
+
   std::vector<int> cell_owner_vector;
   std::vector<int> face_owner_vector;
   std::vector<int> node_owner_vector;
 
-  const std::vector<RefFaceList>& refFaceList() const
-  {
-    return m_ref_face_list;
+  template <ItemType item_type>
+  const std::vector<RefItemList<item_type>>& refItemListVector() const
+  {
+    if constexpr (item_type == ItemType::cell) {
+      return m_ref_cell_list_vector;
+    } else if constexpr (item_type == ItemType::face) {
+      return m_ref_face_list_vector;
+    } else if constexpr (item_type == ItemType::edge) {
+      return m_ref_edge_list_vector;
+    } else if constexpr (item_type == ItemType::node) {
+      return m_ref_node_list_vector;
+    } else {
+      static_assert(is_false_item_type_v<item_type>, "Unexpected item type");
+    }
   }
 
-  void addRefFaceList(const RefFaceList& ref_face_list)
-  {
-    m_ref_face_list.push_back(ref_face_list);
+  template <ItemType item_type>
+  void addRefItemList(const RefItemList<item_type>& ref_item_list)
+  {
+    if constexpr (item_type == ItemType::cell) {
+      m_ref_cell_list_vector.push_back(ref_item_list);
+    } else if constexpr (item_type == ItemType::face) {
+      m_ref_face_list_vector.push_back(ref_item_list);
+    } else if constexpr (item_type == ItemType::edge) {
+      m_ref_edge_list_vector.push_back(ref_item_list);
+    } else if constexpr (item_type == ItemType::node) {
+      m_ref_node_list_vector.push_back(ref_item_list);
+    } else {
+      static_assert(is_false_item_type_v<item_type>, "Unexpected item type");
+    }
   }
 
   ConnectivityDescriptor& operator=(const ConnectivityDescriptor&) = delete;
@@ -164,8 +203,10 @@ class Connectivity final
 
   ConnectivityComputer m_connectivity_computer;
 
-  std::vector<RefFaceList> m_ref_face_list;
-  std::vector<RefNodeList> m_ref_node_list;
+  std::vector<RefCellList> m_ref_cell_list_vector;
+  std::vector<RefFaceList> m_ref_face_list_vector;
+  std::vector<RefEdgeList> m_ref_edge_list_vector;
+  std::vector<RefNodeList> m_ref_node_list_vector;
 
   WeakCellValue<const double> m_inv_cell_nb_nodes;
 
@@ -527,29 +568,53 @@ class Connectivity final
     return _lazzyBuildItemNumberInTheirChild(m_node_local_numbers_in_their_faces);
   }
 
-  size_t numberOfRefFaceList() const
-  {
-    return m_ref_face_list.size();
-  }
-
-  const RefFaceList& refFaceList(const size_t& i) const
-  {
-    return m_ref_face_list[i];
-  }
+  template <ItemType item_type>
+  size_t numberOfRefItemList() const
+  {
+    if constexpr (item_type == ItemType::cell) {
+      return m_ref_cell_list_vector.size();
+    } else if constexpr (item_type == ItemType::face) {
+      return m_ref_face_list_vector.size();
+    } else if constexpr (item_type == ItemType::edge) {
+      return m_ref_edge_list_vector.size();
+    } else if constexpr (item_type == ItemType::node) {
+      return m_ref_node_list_vector.size();
+    } else {
+      static_assert(is_false_item_type_v<item_type>, "Unexpected item type");
+    }
 
-  void addRefNodeList(const RefNodeList& ref_node_list)
-  {
-    m_ref_node_list.push_back(ref_node_list);
   }
 
-  size_t numberOfRefNodeList() const
-  {
-    return m_ref_node_list.size();
+  template <ItemType item_type>
+  const RefItemList<item_type>& refItemList(const size_t& i) const
+  {
+    if constexpr (item_type == ItemType::cell) {
+      return m_ref_cell_list_vector[i];
+    } else if constexpr (item_type == ItemType::face) {
+      return m_ref_face_list_vector[i];
+    } else if constexpr (item_type == ItemType::edge) {
+      return m_ref_edge_list_vector[i];
+    } else if constexpr (item_type == ItemType::node) {
+      return m_ref_node_list_vector[i];
+    } else {
+      static_assert(is_false_item_type_v<item_type>, "Unexpected item type");
+    }
   }
 
-  const RefNodeList& refNodeList(const size_t& i) const
-  {
-    return m_ref_node_list[i];
+  template <ItemType item_type>
+  void addRefItemList(const RefItemList<item_type>& ref_item_list)
+  {
+    if constexpr (item_type == ItemType::cell) {
+      m_ref_cell_list_vector.push_back(ref_item_list);
+    } else if constexpr (item_type == ItemType::face) {
+      m_ref_face_list_vector.push_back(ref_item_list);
+    } else if constexpr (item_type == ItemType::edge) {
+      m_ref_edge_list_vector.push_back(ref_item_list);
+    } else if constexpr (item_type == ItemType::node) {
+      m_ref_node_list_vector.push_back(ref_item_list);
+    } else {
+      static_assert(is_false_item_type_v<item_type>, "Unexpected item type");
+    }
   }
 
   PASTIS_INLINE
diff --git a/src/mesh/ConnectivityDispatcher.cpp b/src/mesh/ConnectivityDispatcher.cpp
index 6dcf3177c..17e1839cc 100644
--- a/src/mesh/ConnectivityDispatcher.cpp
+++ b/src/mesh/ConnectivityDispatcher.cpp
@@ -419,7 +419,7 @@ ConnectivityDispatcher<Dimension>::_buildItemReferenceList()
 
   // Getting references
   Array<const size_t> number_of_item_ref_list_per_proc
-      = parallel::allGather(m_connectivity.numberOfRefFaceList());
+      = parallel::allGather(m_connectivity.template numberOfRefItemList<item_type>());
 
   const size_t number_of_item_list_sender
       = [&] () {
@@ -456,9 +456,9 @@ ConnectivityDispatcher<Dimension>::_buildItemReferenceList()
       // sending references tags
       Array<RefId::TagNumberType> ref_tag_list{number_of_item_ref_list_per_proc[sender_rank]};
       if (parallel::rank() == sender_rank){
-        for (size_t i_item_ref_list=0; i_item_ref_list<m_connectivity.numberOfRefFaceList();
+        for (size_t i_item_ref_list=0; i_item_ref_list<m_connectivity.template numberOfRefItemList<item_type>();
              ++i_item_ref_list) {
-          auto item_ref_list = m_connectivity.refFaceList(i_item_ref_list);
+          auto item_ref_list = m_connectivity.template refItemList<item_type>(i_item_ref_list);
           ref_tag_list[i_item_ref_list] = item_ref_list.refId().tagNumber();
         }
       }
@@ -467,9 +467,9 @@ ConnectivityDispatcher<Dimension>::_buildItemReferenceList()
       // sending references name size
       Array<size_t> ref_name_size_list{number_of_item_ref_list_per_proc[sender_rank]};
       if (parallel::rank() == sender_rank){
-        for (size_t i_item_ref_list=0; i_item_ref_list<m_connectivity.numberOfRefFaceList();
+        for (size_t i_item_ref_list=0; i_item_ref_list<m_connectivity.template numberOfRefItemList<item_type>();
              ++i_item_ref_list) {
-          auto item_ref_list = m_connectivity.refFaceList(i_item_ref_list);
+          auto item_ref_list = m_connectivity.template refItemList<item_type>(i_item_ref_list);
           ref_name_size_list[i_item_ref_list] = item_ref_list.refId().tagName().size();
         }
       }
@@ -479,9 +479,9 @@ ConnectivityDispatcher<Dimension>::_buildItemReferenceList()
       Array<RefId::TagNameType::value_type> ref_name_cat{sum(ref_name_size_list)};
       if (parallel::rank() == sender_rank){
         size_t i_char=0;
-        for (size_t i_item_ref_list=0; i_item_ref_list<m_connectivity.numberOfRefFaceList();
+        for (size_t i_item_ref_list=0; i_item_ref_list<m_connectivity.template numberOfRefItemList<item_type>();
              ++i_item_ref_list) {
-          auto item_ref_list = m_connectivity.refFaceList(i_item_ref_list);
+          auto item_ref_list = m_connectivity.template refItemList<item_type>(i_item_ref_list);
           for (auto c : item_ref_list.refId().tagName()) {
             ref_name_cat[i_char++] = c;
           }
@@ -507,14 +507,14 @@ ConnectivityDispatcher<Dimension>::_buildItemReferenceList()
       constexpr size_t block_size = sizeof(block_type);
       const size_t nb_block = ref_id_list.size()/block_size + (ref_id_list.size()%block_size != 0);
       for (size_t i_block=0; i_block<nb_block; ++i_block) {
-        FaceValue<block_type> item_references(m_connectivity);
+        ItemValue<block_type, item_type> item_references(m_connectivity);
         item_references.fill(0);
 
-        if (m_connectivity.numberOfRefFaceList() > 0) {
+        if (m_connectivity.template numberOfRefItemList<item_type>() > 0) {
           const size_t max_i_ref = std::min(ref_id_list.size(), block_size*(i_block+1));
           for (size_t i_ref=block_size*i_block, i=0; i_ref<max_i_ref; ++i_ref, ++i) {
             block_type ref_bit{1<<i};
-            auto item_ref_list = m_connectivity.refFaceList(i_ref);
+            auto item_ref_list = m_connectivity.template refItemList<item_type>(i_ref);
 
             const auto& item_list = item_ref_list.list();
             for (size_t i_item=0; i_item<item_list.size(); ++i_item) {
@@ -550,7 +550,7 @@ ConnectivityDispatcher<Dimension>::_buildItemReferenceList()
 
         const auto& recv_item_id_correspondance_by_proc =
             this->_dispatchedInfo<item_type>().m_recv_id_correspondance_by_proc;
-        std::vector<block_type> item_refs(m_new_descriptor.face_number_vector.size());
+        std::vector<block_type> item_refs(m_new_descriptor.template itemNumberVector<item_type>().size());
         for (size_t i_rank=0; i_rank<parallel::size(); ++i_rank) {
           for (size_t r=0; r<recv_item_refs_by_proc[i_rank].size(); ++r) {
             const ItemId& item_id = recv_item_id_correspondance_by_proc[i_rank][r];
@@ -573,7 +573,7 @@ ConnectivityDispatcher<Dimension>::_buildItemReferenceList()
 
           Array<const ItemId> item_id_array = convert_to_array(item_id_vector);
 
-          m_new_descriptor.addRefFaceList(RefFaceList(ref_id_list[i_ref], item_id_array));
+          m_new_descriptor.addRefItemList(RefItemList<item_type>(ref_id_list[i_ref], item_id_array));
         }
 
         pout() << __FILE__ << ':' << __LINE__ << ": remains to build lists\n";
diff --git a/src/mesh/GmshReader.cpp b/src/mesh/GmshReader.cpp
index 35743518c..8516b48f0 100644
--- a/src/mesh/GmshReader.cpp
+++ b/src/mesh/GmshReader.cpp
@@ -1402,7 +1402,7 @@ GmshReader::__proceedData()
         face_list[j]=ref_face_list.second[j];
       }
       const PhysicalRefId& physical_ref_id = m_physical_ref_map.at(ref_face_list.first);
-      descriptor.addRefFaceList(RefFaceList(physical_ref_id.refId(), face_list));
+      descriptor.addRefItemList(RefFaceList{physical_ref_id.refId(), face_list});
     }
 
     std::shared_ptr p_connectivity = Connectivity3D::build(descriptor);
@@ -1529,7 +1529,7 @@ GmshReader::__proceedData()
         face_list[j]=ref_face_list.second[j];
       }
       const PhysicalRefId& physical_ref_id = m_physical_ref_map.at(ref_face_list.first);
-      descriptor.addRefFaceList(RefFaceList(physical_ref_id.refId(), face_list));
+      descriptor.addRefItemList(RefFaceList{physical_ref_id.refId(), face_list});
     }
 
     std::shared_ptr p_connectivity = Connectivity2D::build(descriptor);
@@ -1548,7 +1548,7 @@ GmshReader::__proceedData()
         point_list[j]=ref_point_list.second[j];
       }
       const PhysicalRefId& physical_ref_id = m_physical_ref_map.at(ref_point_list.first);
-      connectivity.addRefNodeList(RefNodeList(physical_ref_id.refId(), point_list));
+      connectivity.addRefItemList(RefNodeList(physical_ref_id.refId(), point_list));
     }
 
     using MeshType = Mesh<Connectivity2D>;
@@ -1607,7 +1607,7 @@ GmshReader::__proceedData()
         point_list[j]=ref_point_list.second[j];
       }
       const PhysicalRefId& physical_ref_id = m_physical_ref_map.at(ref_point_list.first);
-      connectivity.addRefNodeList(RefNodeList(physical_ref_id.refId(), point_list));
+      connectivity.addRefItemList(RefNodeList(physical_ref_id.refId(), point_list));
     }
 
     using MeshType = Mesh<Connectivity1D>;
-- 
GitLab