diff --git a/src/mesh/Connectivity.cpp b/src/mesh/Connectivity.cpp index 28c6ef57b27ffb534f3f4e322699bc306f9ca293..5c9d598367f05330deef627f62af1f519c0d8794 100644 --- a/src/mesh/Connectivity.cpp +++ b/src/mesh/Connectivity.cpp @@ -134,7 +134,10 @@ _buildFrom(const ConnectivityDescriptor& descriptor) m_face_is_owned = face_is_owned; } + m_ref_node_list_vector = descriptor.template refItemListVector<ItemType::node>(); + m_ref_edge_list_vector = descriptor.template refItemListVector<ItemType::edge>(); m_ref_face_list_vector = descriptor.template refItemListVector<ItemType::face>(); + m_ref_cell_list_vector = descriptor.template refItemListVector<ItemType::cell>(); } } diff --git a/src/mesh/ConnectivityDispatcher.cpp b/src/mesh/ConnectivityDispatcher.cpp index 17e1839cc6a78ba3f56a43533c8bade1ac69a6de..5b9fcdd4e580af0039f35e5add0e229cf6e31e49 100644 --- a/src/mesh/ConnectivityDispatcher.cpp +++ b/src/mesh/ConnectivityDispatcher.cpp @@ -639,8 +639,12 @@ ConnectivityDispatcher<Dimension>::ConnectivityDispatcher(const ConnectivityType this->_buildItemToSubItemDescriptor<NodeOfCell>(); + this->_buildItemReferenceList<ItemType::cell>(); + this->_dispatchFaces(); + this->_buildItemReferenceList<ItemType::node>(); + m_dispatched_connectivity = ConnectivityType::build(m_new_descriptor); } diff --git a/src/mesh/GmshReader.cpp b/src/mesh/GmshReader.cpp index 8516b48f04b5839ad8ea8a52376000cb62b013a9..d1e4e54122105c26b4f86661b169a57ba743b727 100644 --- a/src/mesh/GmshReader.cpp +++ b/src/mesh/GmshReader.cpp @@ -1285,6 +1285,29 @@ GmshReader::__proceedData() descriptor.cell_number_vector[jh] = __hexahedra_number[j]; } + std::map<unsigned int, std::vector<unsigned int>> ref_cells_map; + for (unsigned int r=0; r<__tetrahedra_ref.size(); ++r) { + const unsigned int elem_number = __tetrahedra_ref[r]; + const unsigned int& ref = __tetrahedra_ref[r]; + ref_cells_map[ref].push_back(elem_number); + } + + for (unsigned int j=0; j<__hexahedra_ref.size(); ++j) { + const size_t elem_number = nb_tetrahedra+j; + const unsigned int& ref = __hexahedra_ref[j]; + ref_cells_map[ref].push_back(elem_number); + } + + + for (const auto& ref_cell_list : ref_cells_map) { + Array<CellId> cell_list(ref_cell_list.second.size()); + for (size_t j=0; j<ref_cell_list.second.size(); ++j) { + cell_list[j]=ref_cell_list.second[j]; + } + const PhysicalRefId& physical_ref_id = m_physical_ref_map.at(ref_cell_list.first); + descriptor.addRefItemList(RefCellList(physical_ref_id.refId(), cell_list)); + } + __computeCellFaceAndFaceNodeConnectivities<3>(descriptor); descriptor.cell_owner_vector.resize(nb_cells); @@ -1450,6 +1473,28 @@ GmshReader::__proceedData() descriptor.cell_number_vector[jq] = __quadrangles_number[j]; } + std::map<unsigned int, std::vector<unsigned int>> ref_cells_map; + for (unsigned int r=0; r<__triangles_ref.size(); ++r) { + const unsigned int elem_number = __triangles_ref[r]; + const unsigned int& ref = __triangles_ref[r]; + ref_cells_map[ref].push_back(elem_number); + } + + for (unsigned int j=0; j<__quadrangles_ref.size(); ++j) { + const size_t elem_number = nb_triangles+j; + const unsigned int& ref = __quadrangles_ref[j]; + ref_cells_map[ref].push_back(elem_number); + } + + for (const auto& ref_cell_list : ref_cells_map) { + Array<CellId> cell_list(ref_cell_list.second.size()); + for (size_t j=0; j<ref_cell_list.second.size(); ++j) { + cell_list[j]=ref_cell_list.second[j]; + } + const PhysicalRefId& physical_ref_id = m_physical_ref_map.at(ref_cell_list.first); + descriptor.addRefItemList(RefCellList(physical_ref_id.refId(), cell_list)); + } + this->__computeCellFaceAndFaceNodeConnectivities<2>(descriptor); descriptor.cell_owner_vector.resize(nb_cells); @@ -1532,9 +1577,6 @@ GmshReader::__proceedData() descriptor.addRefItemList(RefFaceList{physical_ref_id.refId(), face_list}); } - std::shared_ptr p_connectivity = Connectivity2D::build(descriptor); - Connectivity2D& connectivity = *p_connectivity; - std::map<unsigned int, std::vector<unsigned int>> ref_points_map; for (unsigned int r=0; r<__points.size(); ++r) { const unsigned int point_number = __points[r]; @@ -1548,9 +1590,13 @@ 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.addRefItemList(RefNodeList(physical_ref_id.refId(), point_list)); + descriptor.addRefItemList(RefNodeList(physical_ref_id.refId(), point_list)); } + + std::shared_ptr p_connectivity = Connectivity2D::build(descriptor); + Connectivity2D& connectivity = *p_connectivity; + using MeshType = Mesh<Connectivity2D>; using Rd = TinyVector<2, double>; @@ -1590,10 +1636,6 @@ GmshReader::__proceedData() descriptor.node_owner_vector.end(), parallel::rank()); - - std::shared_ptr p_connectivity = Connectivity1D::build(descriptor); - Connectivity1D& connectivity = *p_connectivity; - std::map<unsigned int, std::vector<unsigned int>> ref_points_map; for (unsigned int r=0; r<__points.size(); ++r) { const unsigned int point_number = __points[r]; @@ -1607,9 +1649,12 @@ 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.addRefItemList(RefNodeList(physical_ref_id.refId(), point_list)); + descriptor.addRefItemList(RefNodeList(physical_ref_id.refId(), point_list)); } + std::shared_ptr p_connectivity = Connectivity1D::build(descriptor); + Connectivity1D& connectivity = *p_connectivity; + using MeshType = Mesh<Connectivity1D>; using Rd = TinyVector<1, double>;