13#ifndef dealii_arborx_distributed_tree_h
14#define dealii_arborx_distributed_tree_h
18#if defined(DEAL_II_ARBORX_WITH_MPI) && defined(DEAL_II_WITH_MPI)
23# include <ArborX_DistributedTree.hpp>
24# include <Kokkos_Core.hpp>
30#if defined(DEAL_II_ARBORX_WITH_MPI) && defined(DEAL_II_WITH_MPI)
37# if ARBORX_VERSION_MAJOR < 2
45 template <
int dim,
typename Number>
54 template <
int dim,
typename Number>
72 template <
typename QueryType>
73 std::pair<std::vector<std::pair<int, int>>, std::vector<int>>
74 query(
const QueryType &queries);
85 template <
int dim,
typename Number>
89 : distributed_tree(
comm,
90 Kokkos::DefaultHostExecutionSpace{},
96 template <
int dim,
typename Number>
100 : distributed_tree(
comm,
Kokkos::DefaultHostExecutionSpace{}, points)
105 template <
typename QueryType>
106 std::pair<std::vector<std::pair<int, int>>, std::vector<int>>
109 Kokkos::View<int *, Kokkos::HostSpace> offsets(
"offsets", 0);
110 Kokkos::View<Kokkos::pair<int, int> *, Kokkos::HostSpace> indices_ranks(
117 std::vector<std::pair<int, int>> indices_ranks_vector;
118 for (
unsigned int i = 0; i < indices_ranks.extent(0); ++i)
120 indices_ranks_vector.emplace_back(indices_ranks(i).
first,
124 std::vector<int> offsets_vector;
125 offsets_vector.insert(offsets_vector.begin(),
127 offsets.data() + offsets.extent(0));
129 return {indices_ranks_vector, offsets_vector};
132 template <
typename Value>
157 template <
typename QueryType>
158 std::pair<std::vector<std::pair<int, int>>, std::vector<int>>
159 query(
const QueryType &queries);
165 ArborX::DistributedTree<Kokkos::HostSpace,
166 ArborX::PairValueIndex<Value, unsigned int>,
167 internal::IndexableGetter>
173 internal::ExtractIndexRank callback;
178 template <
typename Value>
180 const std::vector<Value> &values)
181 : distributed_tree(
comm,
182 Kokkos::DefaultHostExecutionSpace{},
183 ArborX::Experimental::attach_indices(values),
188 template <
typename Value>
189 template <
typename QueryType>
190 std::pair<std::vector<std::pair<int, int>>, std::vector<int>>
193 Kokkos::View<int *, Kokkos::HostSpace> offsets(
"offsets", 0);
194 Kokkos::View<Kokkos::pair<unsigned int, unsigned int> *, Kokkos::HostSpace>
195 indices_ranks(
"indices_ranks", 0);
196 if constexpr (QueryType::is_nearest)
198 distributed_tree.query(
199 Kokkos::DefaultHostExecutionSpace{},
201 ArborX::Experimental::declare_callback_constrained(callback),
207 distributed_tree.query(Kokkos::DefaultHostExecutionSpace{},
214 std::vector<std::pair<int, int>> indices_ranks_vector;
215 for (
unsigned int i = 0; i < indices_ranks.extent(0); ++i)
217 indices_ranks_vector.emplace_back(indices_ranks(i).first,
218 indices_ranks(i).second);
221 std::vector<int> offsets_vector;
222 offsets_vector.insert(offsets_vector.begin(),
224 offsets.data() + offsets.extent(0));
226 return {indices_ranks_vector, offsets_vector};
ArborX::DistributedTree< Kokkos::HostSpace > distributed_tree
std::pair< std::vector< std::pair< int, int > >, std::vector< int > > query(const QueryType &queries)
DistributedTree(const MPI_Comm comm, const std::vector< BoundingBox< dim, Number > > &bounding_boxes)
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE