diff --git a/src/mesh/Connectivity.cpp b/src/mesh/Connectivity.cpp index 9c9684c23b59e5296b22b6552399a06ed530cade..5a8dac7953a51b8a307f4a226005d88c72286242 100644 --- a/src/mesh/Connectivity.cpp +++ b/src/mesh/Connectivity.cpp @@ -212,82 +212,6 @@ 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<int>& cell_number_vector, - const std::vector<int>& node_number_vector, - const std::vector<int>& cell_owner_vector, - const std::vector<int>& node_owner_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; - - { - CellValue<CellType> cell_type(*this); - parallel_for(this->numberOfCells(), PASTIS_LAMBDA(const CellId& j){ - cell_type[j] = cell_type_vector[j]; - }); - m_cell_type = cell_type; - } - - { - CellValue<int> cell_number(*this); - cell_number = convert_to_array(cell_number_vector); - m_cell_number = cell_number; - } - - { - NodeValue<int> node_number(*this); - node_number = convert_to_array(node_number_vector); - m_node_number = node_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) { - const auto& cell_nodes = cell_to_node_matrix.rowConst(j); - inv_cell_nb_nodes[j] = 1./cell_nodes.length; - }); - m_inv_cell_nb_nodes = inv_cell_nb_nodes; - } - - { - CellValue<int> cell_owner(*this); - cell_owner = convert_to_array(cell_owner_vector); - m_cell_owner = cell_owner; - } - - { - NodeValue<int> node_owner(*this); - node_owner = convert_to_array(node_owner_vector); - m_node_owner = node_owner; - } - - if constexpr (Dimension>1) { - this->_computeCellFaceAndFaceNodeConnectivities(); - } -} - - template<size_t Dimension> Connectivity<Dimension>:: Connectivity(const ConnectivityDescriptor& descriptor) @@ -366,29 +290,3 @@ Connectivity(const ConnectivityDescriptor& descriptor); template Connectivity3D:: Connectivity(const ConnectivityDescriptor& descriptor); - - - -template Connectivity1D:: -Connectivity(const std::vector<std::vector<unsigned int>>& cell_by_node_vector, - const std::vector<CellType>& cell_type_vector, - const std::vector<int>& cell_number_vector, - const std::vector<int>& node_number_vector, - const std::vector<int>& cell_owner_vector, - const std::vector<int>& node_owner_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<int>& cell_number_vector, - const std::vector<int>& node_number_vector, - const std::vector<int>& cell_owner_vector, - const std::vector<int>& node_owner_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<int>& cell_number_vector, - const std::vector<int>& node_number_vector, - const std::vector<int>& cell_owner_vector, - const std::vector<int>& node_owner_vector); diff --git a/src/mesh/Connectivity.hpp b/src/mesh/Connectivity.hpp index 71044616c22611e8a0d73d3edb406f528d15868d..8c1abac16fb6ba8d6e96cb965a9e9997c3a731c3 100644 --- a/src/mesh/Connectivity.hpp +++ b/src/mesh/Connectivity.hpp @@ -41,12 +41,12 @@ class ConnectivityDescriptor private: public: - std::vector<std::vector<unsigned int>>& cell_by_node_vector; - std::vector<CellType>& cell_type_vector; - std::vector<int>& cell_number_vector; - std::vector<int>& node_number_vector; - std::vector<int>& cell_owner_vector; - std::vector<int>& node_owner_vector; + std::vector<std::vector<unsigned int>> cell_by_node_vector; + std::vector<CellType> cell_type_vector; + std::vector<int> cell_number_vector; + std::vector<int> node_number_vector; + std::vector<int> cell_owner_vector; + std::vector<int> node_owner_vector; ConnectivityDescriptor& operator=(const ConnectivityDescriptor&) = delete; ConnectivityDescriptor& operator=(ConnectivityDescriptor&&) = delete; @@ -711,13 +711,6 @@ class Connectivity final Connectivity(const ConnectivityDescriptor& descriptor); - Connectivity(const std::vector<std::vector<unsigned int>>& cell_by_node_vector, - const std::vector<CellType>& cell_type_vector, - const std::vector<int>& cell_number_vector, - const std::vector<int>& node_number_vector, - const std::vector<int>& cell_owner_vector, - const std::vector<int>& node_owner_vector); - ~Connectivity() { ; diff --git a/src/mesh/GmshReader.cpp b/src/mesh/GmshReader.cpp index 40bb1da8dd40ea1d60a0e9ae575e346d8612c0a8..b218aa71a1dfe55e5151bf6c6a52884826c1c509 100644 --- a/src/mesh/GmshReader.cpp +++ b/src/mesh/GmshReader.cpp @@ -295,9 +295,10 @@ void GmshReader::_dispatch() using MeshType = Mesh<ConnectivityType>; if (not m_mesh) { - std::shared_ptr<ConnectivityType> connectivity(new ConnectivityType({},{},{},{}, {}, {})); + ConnectivityDescriptor descriptor; + std::shared_ptr connectivity = std::make_shared<ConnectivityType>(descriptor); NodeValue<Rd> xr; - m_mesh = std::shared_ptr<IMesh>(new MeshType(connectivity, xr)); + m_mesh = std::make_shared<MeshType>(connectivity, xr); } const MeshType& mesh = static_cast<const MeshType&>(*m_mesh); @@ -362,12 +363,14 @@ void GmshReader::_dispatch() return node_number_id_map; } (); - std::vector<int> new_node_number(node_number_id_map.size()); + + ConnectivityDescriptor new_descriptor; + + new_descriptor.node_number_vector.resize(node_number_id_map.size()); for (const auto& [number, id] : node_number_id_map) { - new_node_number[id] = number; + new_descriptor.node_number_vector[id] = number; } - std::vector<std::vector<unsigned int>> cell_by_node_vector; for (size_t i_rank=0; i_rank < parallel::size(); ++i_rank) { int l=0; for (size_t i=0; i<recv_cell_number_by_proc[i_rank].size(); ++i) { @@ -377,7 +380,7 @@ void GmshReader::_dispatch() Assert(searched_node_id != node_number_id_map.end()); node_vector.push_back(searched_node_id->second); } - cell_by_node_vector.emplace_back(node_vector); + new_descriptor.cell_by_node_vector.emplace_back(node_vector); } } @@ -395,18 +398,18 @@ void GmshReader::_dispatch() return cell_number_id_map; } (); - std::vector<int> new_cell_number(cell_number_id_map.size()); + new_descriptor.cell_number_vector.resize(cell_number_id_map.size()); for (const auto& [number, id] : cell_number_id_map) { - new_cell_number[id] = number; + new_descriptor.cell_number_vector[id] = number; } - std::vector<CellType> new_cell_type(cell_number_id_map.size()); + new_descriptor.cell_type_vector.resize(cell_number_id_map.size()); for (size_t i_rank=0; i_rank<parallel::size(); ++i_rank) { for (size_t i=0; i<recv_cell_number_by_proc[i_rank].size(); ++i) { int cell_number = recv_cell_number_by_proc[i_rank][i]; const auto& searched_cell_id = cell_number_id_map.find(cell_number); Assert(searched_cell_id != cell_number_id_map.end()); - new_cell_type[searched_cell_id->second] = recv_cell_type_by_proc[i_rank][i]; + new_descriptor.cell_type_vector[searched_cell_id->second] = recv_cell_type_by_proc[i_rank][i]; } } @@ -466,13 +469,13 @@ void GmshReader::_dispatch() using ConnectivityType = Connectivity<Dimension>; - std::vector<int> cell_new_owner_vector(cell_number_id_map.size()); + new_descriptor.cell_owner_vector.resize(cell_number_id_map.size()); for (size_t i_rank=0; i_rank<parallel::size(); ++i_rank) { for (size_t i=0; i<recv_cell_number_by_proc[i_rank].size(); ++i) { int cell_number = recv_cell_number_by_proc[i_rank][i]; const auto& searched_cell_id = cell_number_id_map.find(cell_number); Assert(searched_cell_id != cell_number_id_map.end()); - cell_new_owner_vector[searched_cell_id->second] = recv_cell_new_owner_by_proc[i_rank][i]; + new_descriptor.cell_owner_vector[searched_cell_id->second] = recv_cell_new_owner_by_proc[i_rank][i]; } } @@ -495,21 +498,16 @@ void GmshReader::_dispatch() } parallel::exchange(send_node_owner_by_proc, recv_node_owner_by_proc); - std::vector<int> node_new_owner_vector(new_node_number.size()); + new_descriptor.node_owner_vector.resize(new_descriptor.node_number_vector.size()); for (size_t i_rank=0; i_rank<parallel::size(); ++i_rank) { for (size_t r=0; r<recv_node_owner_by_proc[i_rank].size(); ++r) { const NodeId& node_id = recv_node_id_correspondance_by_proc[i_rank][r]; - node_new_owner_vector[node_id] = recv_node_owner_by_proc[i_rank][r]; + new_descriptor.node_owner_vector[node_id] = recv_node_owner_by_proc[i_rank][r]; } } - std::shared_ptr<ConnectivityType> p_connectivity - = std::make_shared<ConnectivityType>(cell_by_node_vector, - new_cell_type, - new_cell_number, - new_node_number, - cell_new_owner_vector, - node_new_owner_vector); + std::shared_ptr p_connectivity + = std::make_shared<ConnectivityType>(new_descriptor); const NodeValue<const Rd>& xr = mesh.xr(); std::vector<Array<const Rd>> send_node_coord_by_proc(parallel::size()); @@ -537,7 +535,7 @@ void GmshReader::_dispatch() } } - m_mesh = std::shared_ptr<IMesh>(new MeshType(p_connectivity, new_xr)); + m_mesh = std::make_shared<MeshType>(p_connectivity, new_xr); } @@ -1228,8 +1226,6 @@ GmshReader::__proceedData() } } - const std::vector<int>& node_number_vector = __verticesNumbers; - TinyVector<15,int> dimension0_mask = zero; dimension0_mask[14]=1; TinyVector<15,int> dimension1_mask = zero; @@ -1257,42 +1253,44 @@ GmshReader::__proceedData() if ((dimension3_mask, elementNumber)>0) { const size_t nb_cells = (dimension3_mask, elementNumber); - std::vector<CellType> cell_type_vector(nb_cells); - std::vector<int> cell_number_vector(nb_cells); + ConnectivityDescriptor descriptor; + + descriptor.node_number_vector = __verticesNumbers; + descriptor.cell_type_vector.resize(nb_cells); + descriptor.cell_number_vector.resize(nb_cells); + descriptor.cell_by_node_vector.resize(nb_cells); - std::vector<std::vector<unsigned int>> cell_by_node_vector(nb_cells); const size_t nb_tetrahedra = __tetrahedra.size(); for (size_t j=0; j<nb_tetrahedra; ++j) { - cell_by_node_vector[j].resize(4); + descriptor.cell_by_node_vector[j].resize(4); for (int r=0; r<4; ++r) { - cell_by_node_vector[j][r] = __tetrahedra[j][r]; + descriptor.cell_by_node_vector[j][r] = __tetrahedra[j][r]; } - cell_type_vector[j] = CellType::Tetrahedron; - cell_number_vector[j] = __tetrahedra_number[j]; + descriptor.cell_type_vector[j] = CellType::Tetrahedron; + descriptor.cell_number_vector[j] = __tetrahedra_number[j]; } const size_t nb_hexahedra = __hexahedra.size(); for (size_t j=0; j<nb_hexahedra; ++j) { const size_t jh = nb_tetrahedra+j; - cell_by_node_vector[jh].resize(8); + descriptor.cell_by_node_vector[jh].resize(8); for (int r=0; r<8; ++r) { - cell_by_node_vector[jh][r] = __hexahedra[j][r]; + descriptor.cell_by_node_vector[jh][r] = __hexahedra[j][r]; } - cell_type_vector[jh] = CellType::Hexahedron; - cell_number_vector[jh] = __hexahedra_number[j]; + descriptor.cell_type_vector[jh] = CellType::Hexahedron; + descriptor.cell_number_vector[jh] = __hexahedra_number[j]; } - std::vector<int> cell_owner_vector(nb_cells); - std::fill(cell_owner_vector.begin(), cell_owner_vector.end(), parallel::rank()); - std::vector<int> node_owner_vector(node_number_vector.size()); - std::fill(node_owner_vector.begin(), node_owner_vector.end(), parallel::rank()); + descriptor.cell_owner_vector.resize(nb_cells); + std::fill(descriptor.cell_owner_vector.begin(), + descriptor.cell_owner_vector.end(), + parallel::rank()); + descriptor.node_owner_vector.resize(descriptor.node_number_vector.size()); + std::fill(descriptor.node_owner_vector.begin(), + descriptor.node_owner_vector.end(), + parallel::rank()); - std::shared_ptr<Connectivity3D> p_connectivity(new Connectivity3D(cell_by_node_vector, - cell_type_vector, - cell_number_vector, - node_number_vector, - cell_owner_vector, - node_owner_vector)); + std::shared_ptr p_connectivity = std::make_shared<Connectivity3D>(descriptor); Connectivity3D& connectivity = *p_connectivity; std::map<unsigned int, std::vector<unsigned int>> ref_faces_map; @@ -1327,47 +1325,50 @@ GmshReader::__proceedData() xr[i][1] = __vertices[i][1]; xr[i][2] = __vertices[i][2]; } - m_mesh = std::shared_ptr<IMesh>(new MeshType(p_connectivity, xr)); + m_mesh = std::make_shared<MeshType>(p_connectivity, xr); } else if ((dimension2_mask, elementNumber)>0) { const size_t nb_cells = (dimension2_mask, elementNumber); - std::vector<CellType> cell_type_vector(nb_cells); - std::vector<int> cell_number_vector(nb_cells); + ConnectivityDescriptor descriptor; + + descriptor.node_number_vector = __verticesNumbers; + descriptor.cell_type_vector.resize(nb_cells); + descriptor.cell_number_vector.resize(nb_cells); + descriptor.cell_by_node_vector.resize(nb_cells); - std::vector<std::vector<unsigned int>> cell_by_node_vector(nb_cells); const size_t nb_triangles = __triangles.size(); for (size_t j=0; j<nb_triangles; ++j) { - cell_by_node_vector[j].resize(3); + descriptor.cell_by_node_vector[j].resize(3); for (int r=0; r<3; ++r) { - cell_by_node_vector[j][r] = __triangles[j][r]; + descriptor.cell_by_node_vector[j][r] = __triangles[j][r]; } - cell_type_vector[j] = CellType::Triangle; - cell_number_vector[j] = __triangles_number[j]; + descriptor.cell_type_vector[j] = CellType::Triangle; + descriptor.cell_number_vector[j] = __triangles_number[j]; } const size_t nb_quadrangles = __quadrangles.size(); for (size_t j=0; j<nb_quadrangles; ++j) { const size_t jq = j+nb_triangles; - cell_by_node_vector[jq].resize(4); + descriptor.cell_by_node_vector[jq].resize(4); for (int r=0; r<4; ++r) { - cell_by_node_vector[jq][r] = __quadrangles[j][r]; + descriptor.cell_by_node_vector[jq][r] = __quadrangles[j][r]; } - cell_type_vector[jq] = CellType::Quadrangle; - cell_number_vector[jq] = __quadrangles_number[j]; + descriptor.cell_type_vector[jq] = CellType::Quadrangle; + descriptor.cell_number_vector[jq] = __quadrangles_number[j]; } - std::vector<int> cell_owner_vector(nb_cells); - std::fill(cell_owner_vector.begin(), cell_owner_vector.end(), parallel::rank()); - std::vector<int> node_owner_vector(node_number_vector.size()); - std::fill(node_owner_vector.begin(), node_owner_vector.end(), parallel::rank()); - - std::shared_ptr<Connectivity2D> p_connectivity(new Connectivity2D(cell_by_node_vector, - cell_type_vector, - cell_number_vector, - node_number_vector, - cell_owner_vector, - node_owner_vector)); + descriptor.cell_owner_vector.resize(nb_cells); + std::fill(descriptor.cell_owner_vector.begin(), + descriptor.cell_owner_vector.end(), + parallel::rank()); + + descriptor.node_owner_vector.resize(descriptor.node_number_vector.size()); + std::fill(descriptor.node_owner_vector.begin(), + descriptor.node_owner_vector.end(), + parallel::rank()); + + std::shared_ptr p_connectivity = std::make_shared<Connectivity2D>(descriptor); Connectivity2D& connectivity = *p_connectivity; std::map<unsigned int, std::vector<unsigned int>> ref_faces_map; @@ -1410,35 +1411,39 @@ GmshReader::__proceedData() xr[i][0] = __vertices[i][0]; xr[i][1] = __vertices[i][1]; } - m_mesh = std::shared_ptr<IMesh>(new MeshType(p_connectivity, xr)); + m_mesh = std::make_shared<MeshType>(p_connectivity, xr); } else if ((dimension1_mask, elementNumber)>0) { const size_t nb_cells = (dimension1_mask, elementNumber); - std::vector<CellType> cell_type_vector(nb_cells); - std::vector<int> cell_number_vector(nb_cells); + ConnectivityDescriptor descriptor; + + descriptor.node_number_vector = __verticesNumbers; + descriptor.cell_type_vector.resize(nb_cells); + descriptor.cell_number_vector.resize(nb_cells); + descriptor.cell_by_node_vector.resize(nb_cells); - std::vector<std::vector<unsigned int>> cell_by_node_vector(nb_cells); for (size_t j=0; j<nb_cells; ++j) { - cell_by_node_vector[j].resize(2); + descriptor.cell_by_node_vector[j].resize(2); for (int r=0; r<2; ++r) { - cell_by_node_vector[j][r] = __edges[j][r]; + descriptor.cell_by_node_vector[j][r] = __edges[j][r]; } - cell_type_vector[j] = CellType::Line; - cell_number_vector[j] = __edges_number[j]; + descriptor.cell_type_vector[j] = CellType::Line; + descriptor.cell_number_vector[j] = __edges_number[j]; } - std::vector<int> cell_owner_vector(nb_cells); - std::fill(cell_owner_vector.begin(), cell_owner_vector.end(), parallel::rank()); - std::vector<int> node_owner_vector(node_number_vector.size()); - std::fill(node_owner_vector.begin(), node_owner_vector.end(), parallel::rank()); - - std::shared_ptr<Connectivity1D> p_connectivity(new Connectivity1D(cell_by_node_vector, - cell_type_vector, - cell_number_vector, - node_number_vector, - cell_owner_vector, - node_owner_vector)); + descriptor.cell_owner_vector.resize(nb_cells); + std::fill(descriptor.cell_owner_vector.begin(), + descriptor.cell_owner_vector.end(), + parallel::rank()); + + descriptor.node_owner_vector.resize(descriptor.node_number_vector.size()); + std::fill(descriptor.node_owner_vector.begin(), + descriptor.node_owner_vector.end(), + parallel::rank()); + + + std::shared_ptr p_connectivity = std::make_shared<Connectivity1D>(descriptor); Connectivity1D& connectivity = *p_connectivity; std::map<unsigned int, std::vector<unsigned int>> ref_points_map; @@ -1465,7 +1470,7 @@ GmshReader::__proceedData() xr[i][0] = __vertices[i][0]; } - m_mesh = std::shared_ptr<IMesh>(new MeshType(p_connectivity, xr)); + m_mesh = std::make_shared<MeshType>(p_connectivity, xr); } else { perr() << "*** using a dimension 0 mesh is forbidden!\n";