From: Marco Feder Date: Mon, 10 Jul 2023 14:50:00 +0000 (+0200) Subject: Use ArborX only when global_bboxes.size()==1 X-Git-Tag: relicensing~677^2~4 X-Git-Url: https://gitweb.dealii.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7e3e3187f92a5309d3d11a86844e8dc7c00e69ab;p=dealii.git Use ArborX only when global_bboxes.size()==1 --- diff --git a/source/grid/grid_tools.cc b/source/grid/grid_tools.cc index 2b5dea22fa..247fd05431 100644 --- a/source/grid/grid_tools.cc +++ b/source/grid/grid_tools.cc @@ -5888,100 +5888,100 @@ namespace GridTools std::vector> ranks_and_indices; ranks_and_indices.reserve(entities.size()); -#if !defined(DEAL_II_WITH_ARBORX) - std::vector>> global_bboxes_temp; - auto *global_bboxes_to_be_used = &global_bboxes; - if (global_bboxes.size() == 1) - { - global_bboxes_temp = - Utilities::MPI::all_gather(comm, global_bboxes[0]); - global_bboxes_to_be_used = &global_bboxes_temp; - } +#if defined(DEAL_II_WITH_ARBORX) +# define USE_ARBORX true +#else +# define USE_ARBORX false +#endif + // Lambda to process bboxes if global_bboxes.size()>1 or ArborX not + // available + const auto process_bboxes = [&]() -> void { + std::vector>> global_bboxes_temp; + auto *global_bboxes_to_be_used = &global_bboxes; + if (global_bboxes.size() == 1 && USE_ARBORX == false) + { + global_bboxes_temp = + Utilities::MPI::all_gather(comm, global_bboxes[0]); + global_bboxes_to_be_used = &global_bboxes_temp; + } - // helper function to determine if a bounding box is valid - const auto is_valid = [](const auto &bb) { - for (unsigned int i = 0; i < spacedim; ++i) - if (bb.get_boundary_points().first[i] > - bb.get_boundary_points().second[i]) - return false; + // helper function to determine if a bounding box is valid + const auto is_valid = [](const auto &bb) { + for (unsigned int i = 0; i < spacedim; ++i) + if (bb.get_boundary_points().first[i] > + bb.get_boundary_points().second[i]) + return false; - return true; - }; + return true; + }; - // linearize vector of vectors - std::vector, unsigned int>> - boxes_and_ranks; + // linearize vector of vectors + std::vector, unsigned int>> + boxes_and_ranks; - for (unsigned rank = 0; rank < global_bboxes_to_be_used->size(); ++rank) - for (const auto &box : (*global_bboxes_to_be_used)[rank]) - if (is_valid(box)) - boxes_and_ranks.emplace_back(box, rank); + for (unsigned rank = 0; rank < global_bboxes_to_be_used->size(); ++rank) + for (const auto &box : (*global_bboxes_to_be_used)[rank]) + if (is_valid(box)) + boxes_and_ranks.emplace_back(box, rank); - // pack boxes into r-tree - const auto tree = pack_rtree(boxes_and_ranks); + // pack boxes into r-tree + const auto tree = pack_rtree(boxes_and_ranks); - // loop over all entities - for (unsigned int i = 0; i < entities.size(); ++i) - { - // create a bounding box with tolerance - const auto bb = - BoundingBox(entities[i]).create_extended(tolerance); + // loop over all entities + for (unsigned int i = 0; i < entities.size(); ++i) + { + // create a bounding box with tolerance + const auto bb = + BoundingBox(entities[i]).create_extended(tolerance); - // determine ranks potentially owning point/bounding box - std::set my_ranks; + // determine ranks potentially owning point/bounding box + std::set my_ranks; - for (const auto &box_and_rank : - tree | boost::geometry::index::adaptors::queried( - boost::geometry::index::intersects(bb))) - my_ranks.insert(box_and_rank.second); + for (const auto &box_and_rank : + tree | boost::geometry::index::adaptors::queried( + boost::geometry::index::intersects(bb))) + my_ranks.insert(box_and_rank.second); - for (const auto rank : my_ranks) - ranks_and_indices.emplace_back(rank, i); - } - -#else - (void)tolerance; - auto fill_ranks_and_indices = - [&ranks_and_indices]( - const std::vector & offsets, - const std::vector> &indices_ranks) { - for (unsigned int i = 0; i < offsets.size() - 1; ++i) - for (int j = offsets[i]; j < offsets[i + 1]; ++j) - ranks_and_indices.emplace_back(indices_ranks[j].second, i); - }; + for (const auto rank : my_ranks) + ranks_and_indices.emplace_back(rank, i); + } + }; - unsigned int idx = (global_bboxes.size() == 1) ? - 0 : - Utilities::MPI::this_mpi_process(comm); - if constexpr (spacedim != 1) +#if defined(DEAL_II_WITH_ARBORX) + if (global_bboxes.size() == 1) { - ArborXWrappers::DistributedTree distributed_tree(comm, - global_bboxes[idx]); - - if constexpr (std::is_same>::value) + if constexpr (spacedim != 1) { - ArborXWrappers::PointIntersectPredicate bb_intersect(entities); + ArborXWrappers::DistributedTree distributed_tree( + comm, global_bboxes[0]); + std::vector> query_bounding_boxes; + for (const auto &entity : entities) + query_bounding_boxes.emplace_back( + BoundingBox(entity).create_extended(tolerance)); + ArborXWrappers::BoundingBoxIntersectPredicate bb_intersect( + query_bounding_boxes); const auto &[indices_ranks, offsets] = distributed_tree.query(bb_intersect); - fill_ranks_and_indices(offsets, indices_ranks); + for (unsigned long int i = 0; i < offsets.size() - 1; ++i) + for (int j = offsets[i]; j < offsets[i + 1]; ++j) + ranks_and_indices.emplace_back(indices_ranks[j].second, i); } - else if constexpr (std::is_same>::value) + else { - ArborXWrappers::BoundingBoxIntersectPredicate bb_intersect( - entities); - - const auto &[indices_ranks, offsets] = - distributed_tree.query(bb_intersect); - fill_ranks_and_indices(offsets, indices_ranks); + AssertThrow(false, ExcInternalError()); + return {}; } } else { - AssertThrow(false, ExcInternalError()); - return {}; + // global_bboxes.size()>1 + process_bboxes(); } +#else + // No ArborX + process_bboxes(); #endif // convert to CRS