From 11c957a6cd0a5df44e46df7dd9f70d10a5548e16 Mon Sep 17 00:00:00 2001 From: Stephane Del Pino <stephane.delpino44@gmail.com> Date: Mon, 29 Oct 2018 17:49:32 +0100 Subject: [PATCH] Improve connectivity dispatching tests Connectivity is now spread (and rebuild) on processors To ensure validity, it remains to - share vertices coordinates Following steps will require to - share item tags/references info - share eventually faces and edges numbering - build one level of ghost cells (quite easy if anything else is done correctly) --- src/mesh/GmshReader.cpp | 121 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 120 insertions(+), 1 deletion(-) diff --git a/src/mesh/GmshReader.cpp b/src/mesh/GmshReader.cpp index c411552b7..0eced16f3 100644 --- a/src/mesh/GmshReader.cpp +++ b/src/mesh/GmshReader.cpp @@ -297,15 +297,34 @@ void GmshReader::_dispatch() parallel::exchange(cell_node_number_to_send_by_proc, recv_cell_node_number_by_proc); + for (size_t i_rank=0; i_rank < parallel::size(); ++i_rank) { + if (parallel::rank() == i_rank) { + std::cout << "----- rank=" << i_rank << " -----\n"; + for (size_t j_rank=0; j_rank < parallel::size(); ++j_rank) { + std::cout << j_rank << ": ->"; + for (size_t j=0; j<recv_cell_node_number_by_proc[j_rank].size(); ++j) { + std::cout << ' ' << recv_cell_node_number_by_proc[j_rank][j]; + } + std::cout << '\n' << std::flush; + } + } + parallel::barrier(); + } + for (size_t i_rank=0; i_rank < parallel::size(); ++i_rank) { if (parallel::rank() == i_rank) { std::cout << "----- rank=" << i_rank << " -----\n"; for (size_t j_rank=0; j_rank < parallel::size(); ++j_rank) { std::cout << "recv from " << j_rank << ':'; + size_t l =0; for (size_t i=0; i<recv_cell_number_by_proc[j_rank].size(); ++i) { std::cout << ' ' << recv_cell_number_by_proc[j_rank][i] << '[' << name(recv_cell_type_by_proc[j_rank][i]) - << ':' << recv_number_of_node_per_cell_by_proc[j_rank][i] << "] "; + << ":(" << recv_number_of_node_per_cell_by_proc[j_rank][i] << ')'; + for (int k=0; k<recv_number_of_node_per_cell_by_proc[j_rank][i]; ++k) { + std::cout << ' ' << recv_cell_node_number_by_proc[j_rank][l++]; + } + std::cout << "] "; } std::cout << '\n' << std::flush; } @@ -313,6 +332,106 @@ void GmshReader::_dispatch() parallel::barrier(); } + const std::unordered_map<int, int> node_number_id_map + = [&] () { + std::unordered_map<int, int> node_number_id_map; + for (size_t i_rank=0; i_rank<parallel::size(); ++i_rank) { + int cpt=0; + for (size_t i=0; i<recv_cell_node_number_by_proc[i_rank].size(); ++i) { + int node_number = recv_cell_node_number_by_proc[i_rank][i]; + auto [iterator, inserted] = node_number_id_map.insert(std::make_pair(node_number, cpt)); + if (inserted) cpt++; + } + } + return node_number_id_map; + } (); + + std::vector<int> new_node_number(node_number_id_map.size()); + for (const auto& [number, id] : node_number_id_map) { + new_node_number[id] = number; + } + + for (size_t i_rank=0; i_rank < parallel::size(); ++i_rank) { + if (parallel::rank() == i_rank) { + std::cout << "----- rank=" << i_rank << " -----\n"; + for (size_t i=0; i<new_node_number.size(); ++i) { + std::cout << i << " -> " << new_node_number[i] << '\n'; + } + std::cout << std::flush; + } + parallel::barrier(); + } + + 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) { + std::vector<unsigned int> node_vector; + for (int k=0; k<recv_number_of_node_per_cell_by_proc[i_rank][i]; ++k) { + const auto& searched_node_id = node_number_id_map.find(recv_cell_node_number_by_proc[i_rank][l++]); + 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); + } + } + for (size_t i_rank=0; i_rank < parallel::size(); ++i_rank) { + if (parallel::rank() == i_rank) { + std::cout << "----- rank=" << i_rank << " -----\n"; + for (const auto& node_vector : cell_by_node_vector) { + for (const auto& node_id : node_vector) { + std::cout << node_id << ' '; + } + std::cout << "("; + for (const auto& node_id : node_vector) { + std::cout << ' ' << new_node_number[node_id]; + } + std::cout << " )\n"; + } + } + parallel::barrier(); + } + + // std::vector<Array<int>> recv_cell_number_by_proc + // = dispatcher.exchange(mesh.connectivity().cellNumber()); + + const std::unordered_map<int, int> cell_number_id_map + = [&] () { + std::unordered_map<int, int> cell_number_id_map; + for (size_t i_rank=0; i_rank<parallel::size(); ++i_rank) { + int cpt=0; + 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]; + auto [iterator, inserted] = cell_number_id_map.insert(std::make_pair(cell_number, cpt)); + if (inserted) cpt++; + } + } + return cell_number_id_map; + } (); + + std::vector<int> new_cell_number(cell_number_id_map.size()); + for (const auto& [number, id] : cell_number_id_map) { + new_cell_number[id] = number; + } + + std::vector<CellType> new_cell_type(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_node_id = cell_number_id_map.find(cell_number); + Assert(searched_node_id != node_number_id_map.end()); + new_cell_type[searched_node_id->second] = recv_cell_type_by_proc[i_rank][i]; + } + } + + using ConnectivityType = Connectivity<Dimension>; + + std::shared_ptr<ConnectivityType> p_connectivity + = std::make_shared<ConnectivityType>(cell_by_node_vector, + new_cell_type, + new_cell_number, + new_node_number); + parallel::Messenger::destroy(); std::exit(0); } -- GitLab