From: Timo Heister Date: Sun, 4 Oct 2015 19:40:55 +0000 (-0400) Subject: use level_ghost_owners X-Git-Tag: v8.4.0-rc2~277^2~21 X-Git-Url: https://gitweb.dealii.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8a20d6709dcf256391b30af65aaea324dd8f5b92;p=dealii.git use level_ghost_owners --- diff --git a/source/multigrid/mg_transfer_prebuilt.cc b/source/multigrid/mg_transfer_prebuilt.cc index 3e05337ae7..e2d5a8dc96 100644 --- a/source/multigrid/mg_transfer_prebuilt.cc +++ b/source/multigrid/mg_transfer_prebuilt.cc @@ -382,28 +382,15 @@ void MGTransferPrebuilt::build_matrices ( if (tria) { - // TODO: This is a gigantic hack. We don't have a list of all our ghost - // neighbors, so we communicate with every other process. Searching the - // owner for every single DoF becomes quite inefficient. Please fix - // this, Timo. - - std::vector neighbors; + // TODO: Searching the owner for every single DoF becomes quite + // inefficient. Please fix this, Timo. + std::set neighbors = tria->level_ghost_owners(); std::map > send_data; - { - // TODO: replace this with the minimum ghost neighbor list that should - // come from Triangulation - int n_proc = Utilities::MPI::n_mpi_processes(tria->get_communicator()); - int myid = tria->locally_owned_subdomain(); - for (unsigned int i=0; i::iterator dofpair=send_data_temp.begin(); dofpair != send_data_temp.end(); ++dofpair) { - for (std::vector::iterator it = neighbors.begin(); it != neighbors.end(); ++it) + for (std::set::iterator it = neighbors.begin(); it != neighbors.end(); ++it) { if (mg_dof.locally_owned_mg_dofs_per_processor(dofpair->level)[*it].is_element(dofpair->level_dof_index)) { @@ -416,7 +403,7 @@ void MGTransferPrebuilt::build_matrices ( // * send std::vector requests; { - for (std::vector::iterator it = neighbors.begin(); it != neighbors.end(); ++it) + for (std::set::iterator it = neighbors.begin(); it != neighbors.end(); ++it) { requests.push_back(MPI_Request()); unsigned int dest = *it; @@ -431,7 +418,7 @@ void MGTransferPrebuilt::build_matrices ( // * receive { typename std::vector receive; - for (std::vector::iterator it = neighbors.begin(); it != neighbors.end(); ++it) + for (std::set::iterator it = neighbors.begin(); it != neighbors.end(); ++it) { MPI_Status status; int len;