16#ifndef CABANA_DISTRIBUTOR_HPP
17#define CABANA_DISTRIBUTOR_HPP
21#include <Cabana_Core_Config.hpp>
24#include <Kokkos_Core.hpp>
25#include <Kokkos_Profiling_ScopedRegion.hpp>
62template <
class MemorySpace,
class CommSpaceType = Mpi>
103 template <
class ViewType>
105 const std::vector<int>& neighbor_ranks )
109 Export(), element_export_ranks, neighbor_ranks );
140 template <
class ViewType>
153struct is_distributor_impl :
public std::false_type
157template <
typename MemorySpace,
typename CommSpaceType>
158struct is_distributor_impl<
Distributor<MemorySpace, CommSpaceType>>
159 :
public std::true_type
167 :
public is_distributor_impl<typename std::remove_cv<T>::type>::type
174#ifdef Cabana_ENABLE_MPI
202template <
class ExecutionSpace,
class Distributor_t,
class AoSoA_t>
203void migrate( ExecutionSpace exec_space,
const Distributor_t& distributor,
204 const AoSoA_t& src, AoSoA_t& dst,
210 if ( src.size() != distributor.exportSize() )
211 throw std::runtime_error(
"Cabana::migrate: Source is "
212 "the wrong size for migration! (Label: " +
214 if ( dst.size() != distributor.totalNumImport() )
215 throw std::runtime_error(
"Cabana::migrate: Destination "
216 "is the wrong size for migration! (Label: " +
220 Impl::migrateData(
typename Distributor_t::commspace_type(), exec_space,
221 distributor, src, dst );
241template <
class Distributor_t,
class AoSoA_t>
242void migrate(
const Distributor_t& distributor,
const AoSoA_t& src,
248 migrate(
typename Distributor_t::execution_space{}, distributor, src, dst );
275template <
class ExecutionSpace,
class Distributor_t,
class AoSoA_t>
276void migrate( ExecutionSpace exec_space,
const Distributor_t& distributor,
283 if ( aosoa.size() != distributor.exportSize() )
284 throw std::runtime_error(
285 "Cabana::migrate (in-place): "
286 "AoSoA is the wrong size for migration! (Label: " +
287 aosoa.label() +
")" );
292 ( distributor.totalNumImport() > distributor.exportSize() );
297 aosoa.resize( distributor.totalNumImport() );
300 Impl::migrateData(
typename Distributor_t::commspace_type(), exec_space,
301 distributor, aosoa, aosoa );
305 if ( !dst_is_bigger )
306 aosoa.resize( distributor.totalNumImport() );
330template <
class Distributor_t,
class AoSoA_t>
331void migrate(
const Distributor_t& distributor, AoSoA_t& aosoa,
336 migrate(
typename Distributor_t::execution_space{}, distributor, aosoa );
360template <
class ExecutionSpace,
class Distributor_t,
class Slice_t>
361void migrate( ExecutionSpace exec_space,
const Distributor_t& distributor,
362 const Slice_t& src, Slice_t& dst,
368 if ( src.size() != distributor.exportSize() )
369 throw std::runtime_error(
"Cabana::migrate: Source Slice is the wrong "
370 "size for migration! (Label: " +
372 if ( dst.size() != distributor.totalNumImport() )
373 throw std::runtime_error(
"Cabana::migrate: Destination Slice is the "
374 "wrong size for migration! (Label: " +
378 Impl::migrateSlice(
typename Distributor_t::commspace_type(), exec_space,
379 distributor, src, dst );
401template <
class Distributor_t,
class Slice_t>
402void migrate(
const Distributor_t& distributor,
const Slice_t& src,
408 migrate(
typename Distributor_t::execution_space{}, distributor, src, dst );
Array-of-Struct-of-Arrays particle data structure.
Multi-node communication patterns. Base class.
Vanilla MPI implementation of Cabana::migrate variations.
Slice a single particle property from an AoSoA.
void createExportSteering(const PackViewType &neighbor_ids, const RankViewType &element_export_ranks)
Create the export steering vector.
Definition Cabana_CommunicationPlanBase.hpp:569
MPI_Comm comm() const
Get the MPI communicator.
Definition Cabana_CommunicationPlanBase.hpp:465
Kokkos::View< size_type *, memory_space > createWithTopology(ExecutionSpace exec_space, Export, const RankViewType &element_export_ranks, const std::vector< int > &neighbor_ranks)
Neighbor and export rank creator. Use this when you already know which ranks neighbor each other (i....
Definition Cabana_CommunicationPlan_Mpi.hpp:107
Kokkos::View< size_type *, memory_space > createWithoutTopology(ExecutionSpace exec_space, Export, const RankViewType &element_export_ranks)
Export rank creator. Use this when you don't know who you will receiving from - only who you are send...
Definition Cabana_CommunicationPlan_Mpi.hpp:272
CommunicationPlan(MPI_Comm comm)
Constructor.
Definition Cabana_CommunicationPlan_Mpi.hpp:59
A communication plan for migrating data from one uniquely-owned decomposition to another uniquely own...
Definition Cabana_Distributor.hpp:64
Distributor(MPI_Comm comm, const ViewType &element_export_ranks)
Export rank constructor. Use this when you don't know who you will be receiving from - only who you a...
Definition Cabana_Distributor.hpp:141
Distributor(MPI_Comm comm, const ViewType &element_export_ranks, const std::vector< int > &neighbor_ranks)
Topology and export rank constructor. Use this when you already know which ranks neighbor each other ...
Definition Cabana_Distributor.hpp:104
CommSpaceType commspace_type
Communication space.
Definition Cabana_Distributor.hpp:67
Core: particle data structures and algorithms.
Definition Cabana_AoSoA.hpp:36
void migrate(ExecutionSpace exec_space, const Distributor_t &distributor, const AoSoA_t &src, AoSoA_t &dst, typename std::enable_if<(is_distributor< Distributor_t >::value &&is_aosoa< AoSoA_t >::value), int >::type *=0)
Synchronously migrate data between two different decompositions using the distributor forward communi...
Definition Cabana_Distributor.hpp:203
Export-based tag - default.
Definition Cabana_Tags.hpp:38
AoSoA static type checker.
Definition Cabana_AoSoA.hpp:61
Distributor static type checker.
Definition Cabana_Distributor.hpp:168
Slice static type checker.
Definition Cabana_Slice.hpp:868