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