From de194e5db07bd726a02776ddad7e1d1257d34d75 Mon Sep 17 00:00:00 2001 From: Stephane Del Pino <stephane.delpino44@gmail.com> Date: Wed, 10 Oct 2018 14:49:58 +0200 Subject: [PATCH] Read elements number in Gmsh file This number is just an identifier and should not be used for anything else Also prepared global index item structure. This has to be a contiguous numbering starting from 0. This will have to take into account ghost cells. --- src/mesh/Connectivity.cpp | 36 +++++++++++++++++++++++++------- src/mesh/Connectivity.hpp | 19 ++++++++++++----- src/mesh/GmshReader.cpp | 44 +++++++++++++++++++++++++++++---------- src/mesh/GmshReader.hpp | 11 ++++++++++ 4 files changed, 87 insertions(+), 23 deletions(-) diff --git a/src/mesh/Connectivity.cpp b/src/mesh/Connectivity.cpp index 58649ddc9..cec70576f 100644 --- a/src/mesh/Connectivity.cpp +++ b/src/mesh/Connectivity.cpp @@ -216,16 +216,16 @@ void Connectivity<2>::_computeCellFaceAndFaceNodeConnectivities() template<size_t Dimension> Connectivity<Dimension>:: Connectivity(const std::vector<std::vector<unsigned int>>& cell_by_node_vector, - const std::vector<CellType>& cell_type_vector) + const std::vector<CellType>& cell_type_vector, + const std::vector<int>& cell_number_vector) { Assert(cell_by_node_vector.size() == cell_type_vector.size()); + Assert(cell_number_vector.size() == cell_type_vector.size()); auto& cell_to_node_matrix = m_item_to_item_matrix[itemTId(ItemType::cell)][itemTId(ItemType::node)]; cell_to_node_matrix = cell_by_node_vector; - Assert(this->numberOfCells()>0); - { CellValue<CellType> cell_type(*this); parallel_for(this->numberOfCells(), PASTIS_LAMBDA(const CellId& j){ @@ -233,9 +233,28 @@ Connectivity(const std::vector<std::vector<unsigned int>>& cell_by_node_vector, }); m_cell_type = cell_type; } + + { + CellValue<int> cell_number(*this); + cell_number = convert_to_array(cell_number_vector); + m_cell_number = cell_number; + } + + { + CellValue<int> cell_global_index(*this); +#warning index must start accounting number of global indices of other procs +#warning must take care of ghost cells + int first_index = 0; + parallel_for(this->numberOfCells(), PASTIS_LAMBDA(const CellId& j) { + cell_global_index[j] = first_index+j; + }); + m_cell_global_index = cell_global_index; + } + + { CellValue<double> inv_cell_nb_nodes(*this); - parallel_for(this->numberOfCells(), PASTIS_LAMBDA(const CellId& j){ + parallel_for(this->numberOfCells(), PASTIS_LAMBDA(const CellId& j) { const auto& cell_nodes = cell_to_node_matrix.rowConst(j); inv_cell_nb_nodes[j] = 1./cell_nodes.length; }); @@ -250,12 +269,15 @@ Connectivity(const std::vector<std::vector<unsigned int>>& cell_by_node_vector, template Connectivity1D:: Connectivity(const std::vector<std::vector<unsigned int>>& cell_by_node_vector, - const std::vector<CellType>& cell_type_vector); + const std::vector<CellType>& cell_type_vector, + const std::vector<int>& cell_number_vector); template Connectivity2D:: Connectivity(const std::vector<std::vector<unsigned int>>& cell_by_node_vector, - const std::vector<CellType>& cell_type_vector); + const std::vector<CellType>& cell_type_vector, + const std::vector<int>& cell_number_vector); template Connectivity3D:: Connectivity(const std::vector<std::vector<unsigned int>>& cell_by_node_vector, - const std::vector<CellType>& cell_type_vector); + const std::vector<CellType>& cell_type_vector, + const std::vector<int>& cell_number_vector); diff --git a/src/mesh/Connectivity.hpp b/src/mesh/Connectivity.hpp index 1a445be0d..7c990dc5c 100644 --- a/src/mesh/Connectivity.hpp +++ b/src/mesh/Connectivity.hpp @@ -246,6 +246,8 @@ class Connectivity final private: ConnectivityMatrix m_item_to_item_matrix[Dimension+1][Dimension+1]; CellValue<const CellType> m_cell_type; + CellValue<const int> m_cell_global_index; + CellValue<const int> m_cell_number; FaceValuePerCell<const bool> m_cell_face_is_reversed; @@ -316,6 +318,12 @@ class Connectivity final return m_cell_type; }; + PASTIS_INLINE + const CellValue<const int>& cellNumber() const + { + return m_cell_number; + }; + PASTIS_INLINE const bool& isConnectivityMatrixBuilt(const ItemType& item_type_0, const ItemType& item_type_1) const @@ -548,8 +556,8 @@ class Connectivity final for (FaceId l=0; l<this->numberOfFaces(); ++l) { const auto& face_to_cell = face_to_cell_matrix[l]; if (face_to_cell.size() == 2) { - const int cell_0 = face_to_cell[0]; - const int cell_1 = face_to_cell[1]; + const CellId cell_0 = face_to_cell[0]; + const CellId cell_1 = face_to_cell[1]; cell_cells[cell_0].insert(cell_1); cell_cells[cell_1].insert(cell_0); @@ -565,8 +573,8 @@ class Connectivity final { size_t k=0; for (size_t j=0; j<this->numberOfCells(); ++j) { - for (auto cell_id : cell_cells[j]) { - neighbors[k] = cell_id; + for (CellId cell_id : cell_cells[j]) { + neighbors[k] = m_cell_global_index[cell_id]; ++k; } } @@ -627,7 +635,8 @@ class Connectivity final Connectivity(const Connectivity&) = delete; Connectivity(const std::vector<std::vector<unsigned int>>& cell_by_node_vector, - const std::vector<CellType>& cell_type_vector); + const std::vector<CellType>& cell_type_vector, + const std::vector<int>& cell_number_vector); ~Connectivity() { diff --git a/src/mesh/GmshReader.cpp b/src/mesh/GmshReader.cpp index 6b071de30..84aae75e8 100644 --- a/src/mesh/GmshReader.cpp +++ b/src/mesh/GmshReader.cpp @@ -150,7 +150,7 @@ void GmshReader::_dispatch() using MeshType = Mesh<ConnectivityType>; if (not m_mesh) { - std::shared_ptr<ConnectivityType> connectivity(new ConnectivityType({},{})); + std::shared_ptr<ConnectivityType> connectivity(new ConnectivityType({},{},{})); NodeValue<Rd> xr; m_mesh = std::shared_ptr<IMesh>(new MeshType(connectivity, xr)); } @@ -192,6 +192,7 @@ void GmshReader::_dispatch() return std::move(cell_to_send_by_proc); } (); + const auto& cell_number = mesh.connectivity().cellNumber(); const std::vector<Array<const int>> cell_number_to_send_by_proc = [&] () { std::vector<Array<const int>> cell_number_to_send_by_proc(commSize()); @@ -199,8 +200,7 @@ void GmshReader::_dispatch() 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_list[cell_id] = cell_number[cell_list[cell_id]]; }); cell_number_to_send_by_proc[i] = cell_number_list; } @@ -214,9 +214,8 @@ void GmshReader::_dispatch() Array<int> nb_cell_to_recv_by_proc = allToAll(nb_cell_to_send_by_proc); - const size_t cell_number = mesh.numberOfCells(); const size_t new_cell_number - = cell_number + = mesh.numberOfCells() + Sum(nb_cell_to_recv_by_proc) - Sum(nb_cell_to_send_by_proc); @@ -248,7 +247,7 @@ void GmshReader::_dispatch() std::cout << '\n' << std::flush; } } - barrier(); + // barrier(); } Messenger::destroy(); @@ -573,13 +572,14 @@ GmshReader::__readElements2_2() ErrorHandler::normal); } + __elementNumber.resize(numberOfElements); __elementType.resize(numberOfElements); __references.resize(numberOfElements); __elementVertices.resize(numberOfElements); if (not __binary) { for (int i=0; i<numberOfElements; ++i) { - this->_getInteger(); // drops element number + __elementNumber[i] = this->_getInteger(); const int elementType = this->_getInteger()-1; if ((elementType < 0) or (elementType > 14)) { @@ -722,31 +722,36 @@ GmshReader::__proceedData() case 0: { // edges __edges = Array<Edge>(elementNumber[i]); __edges_ref.resize(elementNumber[i]); + __edges_number.resize(elementNumber[i]); break; } case 1: { // triangles __triangles = Array<Triangle>(elementNumber[i]); __triangles_ref.resize(elementNumber[i]); + __triangles_number.resize(elementNumber[i]); break; } case 2: { // quadrangles __quadrangles = Array<Quadrangle>(elementNumber[i]); __quadrangles_ref.resize(elementNumber[i]); + __quadrangles_number.resize(elementNumber[i]); break; } case 3: { // tetrahedra __tetrahedra = Array<Tetrahedron>(elementNumber[i]); __tetrahedra_ref.resize(elementNumber[i]); + __tetrahedra_number.resize(elementNumber[i]); break; } case 4: {// hexahedra __hexahedra = Array<Hexahedron>(elementNumber[i]); __hexahedra_ref.resize(elementNumber[i]); + __hexahedra_number.resize(elementNumber[i]); } - // Ignored entities case 14: {// point __points = Array<Point>(elementNumber[i]); __points_ref.resize(elementNumber[i]); + __points_number.resize(elementNumber[i]); break; } // Unsupported entities @@ -787,6 +792,7 @@ GmshReader::__proceedData() ErrorHandler::normal); } +#warning should use an unordered_map // A value of -1 means that the vertex is unknown __verticesCorrepondance.resize(maxNumber+1,-1); @@ -836,6 +842,7 @@ GmshReader::__proceedData() __triangles[triangleNumber] = Triangle(a, b, c); __triangles_ref[triangleNumber] = __references[i]; + __triangles_number[triangleNumber] = __elementNumber[i]; triangleNumber++; // one more triangle break; } @@ -855,6 +862,7 @@ GmshReader::__proceedData() } __quadrangles[quadrilateralNumber] = Quadrangle(a,b,c,d); __quadrangles_ref[quadrilateralNumber] = __references[i]; + __quadrangles_number[quadrilateralNumber] = __elementNumber[i]; quadrilateralNumber++; // one more quadrangle break; } @@ -874,6 +882,7 @@ GmshReader::__proceedData() } __tetrahedra[tetrahedronNumber] = Tetrahedron(a, b, c, d); __tetrahedra_ref[tetrahedronNumber] = __references[i]; + __tetrahedra_number[tetrahedronNumber] = __elementNumber[i]; tetrahedronNumber++; // one more tetrahedron break; } @@ -899,6 +908,7 @@ GmshReader::__proceedData() = Hexahedron(a, b, c, d, e, f, g, h); __hexahedra_ref[hexahedronNumber] = __references[i]; + __hexahedra_number[hexahedronNumber] = __elementNumber[i]; hexahedronNumber++; // one more hexahedron break; } @@ -908,6 +918,7 @@ GmshReader::__proceedData() const int a = __verticesCorrepondance[elementVertices[0]]; __points[point_number] = a; __points_ref[point_number] = __references[i]; + __points_number[point_number] = __elementNumber[i]; point_number++; break; } @@ -958,6 +969,7 @@ GmshReader::__proceedData() const size_t nb_cells = (dimension3_mask, elementNumber); std::vector<CellType> cell_type_vector(nb_cells); + std::vector<int> cell_number_vector(nb_cells); std::vector<std::vector<unsigned int>> cell_by_node_vector(nb_cells); const size_t nb_tetrahedra = __tetrahedra.size(); @@ -967,6 +979,7 @@ GmshReader::__proceedData() cell_by_node_vector[j][r] = __tetrahedra[j][r]; } cell_type_vector[j] = CellType::Tetrahedron; + cell_number_vector[j] = __tetrahedra_number[j]; } const size_t nb_hexahedra = __hexahedra.size(); for (size_t j=0; j<nb_hexahedra; ++j) { @@ -976,10 +989,12 @@ GmshReader::__proceedData() cell_by_node_vector[jh][r] = __hexahedra[j][r]; } cell_type_vector[jh] = CellType::Hexahedron; + cell_number_vector[jh] = __hexahedra_number[j]; } std::shared_ptr<Connectivity3D> p_connectivity(new Connectivity3D(cell_by_node_vector, - cell_type_vector)); + cell_type_vector, + cell_number_vector)); Connectivity3D& connectivity = *p_connectivity; std::map<unsigned int, std::vector<unsigned int>> ref_faces_map; @@ -1020,6 +1035,7 @@ GmshReader::__proceedData() const size_t nb_cells = (dimension2_mask, elementNumber); std::vector<CellType> cell_type_vector(nb_cells); + std::vector<int> cell_number_vector(nb_cells); std::vector<std::vector<unsigned int>> cell_by_node_vector(nb_cells); const size_t nb_triangles = __triangles.size(); @@ -1029,6 +1045,7 @@ GmshReader::__proceedData() cell_by_node_vector[j][r] = __triangles[j][r]; } cell_type_vector[j] = CellType::Triangle; + cell_number_vector[j] = __triangles_number[j]; } const size_t nb_quadrangles = __quadrangles.size(); @@ -1039,10 +1056,12 @@ GmshReader::__proceedData() cell_by_node_vector[jq][r] = __quadrangles[j][r]; } cell_type_vector[jq] = CellType::Quadrangle; + cell_number_vector[jq] = __quadrangles_number[j]; } std::shared_ptr<Connectivity2D> p_connectivity(new Connectivity2D(cell_by_node_vector, - cell_type_vector)); + cell_type_vector, + cell_number_vector)); Connectivity2D& connectivity = *p_connectivity; std::map<unsigned int, std::vector<unsigned int>> ref_faces_map; @@ -1091,6 +1110,7 @@ GmshReader::__proceedData() const size_t nb_cells = (dimension1_mask, elementNumber); std::vector<CellType> cell_type_vector(nb_cells); + std::vector<int> cell_number_vector(nb_cells); std::vector<std::vector<unsigned int>> cell_by_node_vector(nb_cells); for (size_t j=0; j<nb_cells; ++j) { @@ -1099,10 +1119,12 @@ GmshReader::__proceedData() cell_by_node_vector[j][r] = __edges[j][r]; } cell_type_vector[j] = CellType::Line; + cell_number_vector[j] = __edges_number[j]; } std::shared_ptr<Connectivity1D> p_connectivity(new Connectivity1D(cell_by_node_vector, - cell_type_vector)); + cell_type_vector, + cell_number_vector)); Connectivity1D& connectivity = *p_connectivity; std::map<unsigned int, std::vector<unsigned int>> ref_points_map; diff --git a/src/mesh/GmshReader.hpp b/src/mesh/GmshReader.hpp index 7364878a1..20db0d321 100644 --- a/src/mesh/GmshReader.hpp +++ b/src/mesh/GmshReader.hpp @@ -83,26 +83,32 @@ private: using Point = unsigned int; Array<Point> __points; std::vector<int> __points_ref; + std::vector<int> __points_number; using Edge = TinyVector<2,unsigned int>; Array<Edge> __edges; std::vector<int> __edges_ref; + std::vector<int> __edges_number; using Triangle = TinyVector<3,unsigned int>; Array<Triangle> __triangles; std::vector<int> __triangles_ref; + std::vector<int> __triangles_number; using Quadrangle = TinyVector<4,unsigned int>; Array<Quadrangle> __quadrangles; std::vector<int> __quadrangles_ref; + std::vector<int> __quadrangles_number; using Tetrahedron = TinyVector<4,unsigned int>; Array<Tetrahedron> __tetrahedra; std::vector<int> __tetrahedra_ref; + std::vector<int> __tetrahedra_number; using Hexahedron = TinyVector<8,unsigned int>; Array<Hexahedron> __hexahedra; std::vector<int> __hexahedra_ref; + std::vector<int> __hexahedra_number; /** * Gmsh format provides a numbered, none ordrered and none dense @@ -110,6 +116,11 @@ private: */ std::vector<int> __verticesCorrepondance; + /** + * elements types + */ + std::vector<int> __elementNumber; + /** * elements types */ -- GitLab