diff --git a/src/mesh/GmshReader.cpp b/src/mesh/GmshReader.cpp index 3f1af1a6c76c5b104f7e9ddf280c1790e2717bc7..483e98c8e4d584c5cfa4aa738e43a7e599b371ea 100644 --- a/src/mesh/GmshReader.cpp +++ b/src/mesh/GmshReader.cpp @@ -15,6 +15,8 @@ #include <Messenger.hpp> #include <Partitioner.hpp> +#include <ArrayUtils.hpp> + #include <map> #include <regex> #include <iomanip> @@ -175,7 +177,52 @@ void GmshReader::_dispatch() pout() << "Mesh read by process " << rang::style::bold << reader_rank << rang::style::reset << '\n'; Partitioner P; - Array<int> cell_new_owner = broadcast(P.partition(mesh_graph), reader_rank); + Array<int> cell_new_owner = P.partition(mesh_graph); + + Array<int> nb_cell_to_send_by_proc(commSize()); + for (size_t i=0; i<cell_new_owner.size(); ++i) { + nb_cell_to_send_by_proc[cell_new_owner[i]]++; + } + + // for (int i_rank=0; i_rank<commSize(); ++i_rank) { + // if (commRank() == i_rank) { + // for (size_t i_recv=0; i_recv<commSize(); ++i_recv) { + // std::cout << commRank() + // << " gives " << nb_cell_to_send_by_proc[i_recv] + // << " cells to " << i_recv << '\n' << std::flush; + // } + // } + // barrier(); + // } + Array<int> nb_cell_to_recv_by_proc = allToAll(nb_cell_to_send_by_proc); + + // for (int i_rank=0; i_rank<commSize(); ++i_rank) { + // if (commRank() == i_rank) { + // for (size_t i_send=0; i_send<commSize(); ++i_send) { + // std::cout << commRank() + // << " recv " << nb_cell_to_recv_by_proc[i_send] + // << " cells of " << i_send << '\n'; + // } + // } + // barrier(); + // } + const size_t cell_number = mesh.numberOfCells(); + const size_t new_cell_number + = cell_number + + Sum(nb_cell_to_recv_by_proc) + - Sum(nb_cell_to_send_by_proc); + + std::cout << commRank() << ": " << cell_number << " -> " << new_cell_number << " cells\n"; + + // now share owner table + cell_new_owner = broadcast(cell_new_owner, reader_rank); + + Array<int> cell_new_owner_nb_cell(commSize()); + cell_new_owner_nb_cell.fill(0); + for (size_t i=0; i<cell_new_owner.size(); ++i) { + cell_new_owner_nb_cell[cell_new_owner[i]]++; + } + Array<int> node_new_owner(mesh.numberOfNodes()); if (commRank() == reader_rank) { @@ -197,17 +244,15 @@ void GmshReader::_dispatch() for (int i_rank=0; i_rank<commSize(); ++i_rank) { if (commRank() == i_rank) { - size_t cpt=0; std::cout << i_rank << " cells -> "; for (size_t i=0; i<cell_new_owner.size(); ++i) { if (commRank() == cell_new_owner[i]) { std::cout << i << ' '; - cpt++; } } - std::cout << " [" << cpt << "]\n" << std::flush; + std::cout << " [" << cell_new_owner_nb_cell[i_rank] << "]\n" << std::flush; } - barrier(); + // barrier(); } for (int i_rank=0; i_rank<commSize(); ++i_rank) { @@ -222,7 +267,20 @@ void GmshReader::_dispatch() } std::cout << " [" << cpt << "]\n" << std::flush; } - barrier(); + // barrier(); + } + + for (int i_rank=0; i_rank<commSize(); ++i_rank) { + if (commRank() == i_rank) { + const auto cell_type + = mesh.connectivity().cellType(); + std::cout << i_rank << " cell_type -> "; + for (CellId j=0; j<cell_type.size(); ++j) { + std::cout << static_cast<int>(cell_type[j]) << ' '; + } + std::cout << '\n'; + } + // barrier(); } Messenger::destroy();