16#ifndef CABANA_GRID_GLOBALPARTICLECOMM_HPP
17#define CABANA_GRID_GLOBALPARTICLECOMM_HPP
37template <
class MemorySpace,
class LocalGr
idType>
42 static constexpr std::size_t
num_space_dim = LocalGridType::num_space_dim;
44 using mesh_type =
typename LocalGridType::mesh_type;
52 Kokkos::View<double* [num_space_dim][2], memory_space>;
57 Kokkos::View<int***, Kokkos::LayoutRight, memory_space>;
60 Kokkos::View<int***, Kokkos::LayoutRight, Kokkos::HostSpace>;
65 auto global_grid = local_grid.globalGrid();
67 Kokkos::ViewAllocateWithoutInitializing(
"global_destination" ),
70 int max_ranks_per_dim = -1;
86 _rank[d] = global_grid.dimBlockId( d );
92 auto comm = global_grid.comm();
101 template <
class LocalMeshType>
106 auto store_corners = KOKKOS_LAMBDA(
const std::size_t d )
108 local_corners( rank[d], d, 0 ) =
110 local_corners( rank[d], d, 1 ) =
113 using exec_space =
typename memory_space::execution_space;
115 Kokkos::parallel_for(
"Cabana::Grid::GlobalParticleComm::storeCorners",
116 policy, store_corners );
127 auto scale_corners = KOKKOS_LAMBDA(
const std::size_t d )
129 for (
int r = 0; r < ranks_per_dim[d]; ++r )
131 local_corners( r, d, 0 ) /= scale[d];
132 local_corners( r, d, 1 ) /= scale[d];
135 using exec_space =
typename memory_space::execution_space;
137 Kokkos::parallel_for(
"Cabana::Grid::GlobalParticleComm::scaleCorners",
138 policy, scale_corners );
143 template <std::
size_t NSD = num_space_dim>
144 std::enable_if_t<3 == NSD, Kokkos::Array<int, num_space_dim>>
getScaling()
146 Kokkos::Array<int, num_space_dim> scale;
154 template <std::
size_t NSD = num_space_dim>
155 std::enable_if_t<2 == NSD, Kokkos::Array<int, num_space_dim>>
getScaling()
157 Kokkos::Array<int, num_space_dim> scale;
164 template <
class GlobalGr
idType, std::
size_t NSD = num_space_dim>
165 std::enable_if_t<3 == NSD, void>
copyRanks( GlobalGridType global_grid )
168 Kokkos::ViewAllocateWithoutInitializing(
"ranks_host" ),
174 global_ranks_host( i, j, k ) =
175 global_grid.blockRank( i, j, k );
182 template <
class GlobalGr
idType, std::
size_t NSD = num_space_dim>
183 std::enable_if_t<2 == NSD, void>
copyRanks( GlobalGridType global_grid )
187 Kokkos::ViewAllocateWithoutInitializing(
"ranks_host" ),
192 global_ranks_host( i, j, 0 ) = global_grid.blockRank( i, j );
205 template <
class ExecutionSpace,
class PositionType>
206 void build( ExecutionSpace exec_space, PositionType positions,
207 const std::size_t begin,
const std::size_t end )
209 Kokkos::Profiling::ScopedRegion region(
210 "Cabana::Grid::GlobalParticleComm::build" );
213 assert( end >= begin );
214 assert( end <= positions.size() );
227 auto build_migrate = KOKKOS_LAMBDA(
const std::size_t p )
231 int ijk[3] = { 0, 0, 0 };
237 int max = ranks_per_dim[d];
240 if ( ( positions( p, d ) < local_corners( min, d, 0 ) ) ||
241 ( positions( p, d ) > local_corners( max - 1, d, 1 ) ) )
242 destinations( p ) = -1;
245 while ( max - min > 1 )
247 int center = Kokkos::floor( ( max + min ) / 2.0 );
248 if ( positions( p, d ) < local_corners( center, d, 0 ) )
256 destinations( p ) = global_ranks( ijk[0], ijk[1], ijk[2] );
259 Kokkos::RangePolicy<ExecutionSpace> policy( exec_space, begin, end );
260 Kokkos::parallel_for(
"Cabana::Grid::GlobalParticleComm::build", policy,
266 template <
class ExecutionSpace,
class PositionType>
267 void build( ExecutionSpace exec_space, PositionType positions )
269 build( exec_space, positions, 0, positions.size() );
273 template <
class PositionType>
274 void build( PositionType positions )
276 using execution_space =
typename memory_space::execution_space;
278 build( execution_space{}, positions, 0, positions.size() );
282 template <
class AoSoAType>
283 void migrate( MPI_Comm comm, AoSoAType& aosoa )
293 Kokkos::Array<int, num_space_dim>
_rank;
308template <
class MemorySpace,
class LocalGr
idType>
311 return std::make_shared<GlobalParticleComm<MemorySpace, LocalGridType>>(
Multi-node particle redistribution.
auto createGlobalParticleComm(const LocalGridType &local_grid)
Create global linked cell binning.
Definition Cabana_Grid_GlobalParticleComm.hpp:309
LocalMesh< MemorySpace, MeshType > createLocalMesh(const LocalGrid< MeshType > &local_grid)
Creation function for local mesh.
Definition Cabana_Grid_LocalMesh.hpp:791
Slice a single particle property from an AoSoA.
A communication plan for migrating data from one uniquely-owned decomposition to another uniquely own...
Definition Cabana_Distributor.hpp:63
Global logical grid.
Definition Cabana_Grid_GlobalGrid.hpp:39
void build(ExecutionSpace exec_space, PositionType positions)
Bin particles across the global grid.
Definition Cabana_Grid_GlobalParticleComm.hpp:267
Cabana::Grid::GlobalGrid< mesh_type > global_grid_type
Global grid.
Definition Cabana_Grid_GlobalParticleComm.hpp:46
Kokkos::View< int ***, Kokkos::LayoutRight, memory_space > rank_view_type
Cartesian rank View type.
Definition Cabana_Grid_GlobalParticleComm.hpp:56
Kokkos::View< int ***, Kokkos::LayoutRight, Kokkos::HostSpace > host_rank_view_type
Cartesian rank View type (host).
Definition Cabana_Grid_GlobalParticleComm.hpp:59
Kokkos::Array< int, num_space_dim > _rank
Current cartesian rank.
Definition Cabana_Grid_GlobalParticleComm.hpp:293
static constexpr std::size_t num_space_dim
Spatial dimension.
Definition Cabana_Grid_GlobalParticleComm.hpp:42
void storeRanks(LocalMeshType local_mesh)
Store local rank boundaries from the local mesh.
Definition Cabana_Grid_GlobalParticleComm.hpp:102
void build(ExecutionSpace exec_space, PositionType positions, const std::size_t begin, const std::size_t end)
Bin particles across the global grid.
Definition Cabana_Grid_GlobalParticleComm.hpp:206
std::enable_if_t< 2==NSD, void > copyRanks(GlobalGridType global_grid)
Store all cartesian MPI ranks.
Definition Cabana_Grid_GlobalParticleComm.hpp:183
destination_view_type _destinations
Particle destination ranks.
Definition Cabana_Grid_GlobalParticleComm.hpp:301
typename LocalGridType::mesh_type mesh_type
Mesh type.
Definition Cabana_Grid_GlobalParticleComm.hpp:44
MemorySpace memory_space
Kokkos memory space.
Definition Cabana_Grid_GlobalParticleComm.hpp:48
std::enable_if_t< 2==NSD, Kokkos::Array< int, num_space_dim > > getScaling()
Scaling factors due to double counting from MPI reduction.
Definition Cabana_Grid_GlobalParticleComm.hpp:155
Kokkos::View< double *[num_space_dim][2], memory_space > corner_view_type
Local boundary View type.
Definition Cabana_Grid_GlobalParticleComm.hpp:51
int _rank_1d
Current rank.
Definition Cabana_Grid_GlobalParticleComm.hpp:291
corner_view_type _local_corners
Local boundaries.
Definition Cabana_Grid_GlobalParticleComm.hpp:297
GlobalParticleComm(const LocalGridType local_grid)
Constructor.
Definition Cabana_Grid_GlobalParticleComm.hpp:63
Kokkos::Array< int, num_space_dim > _ranks_per_dim
Total ranks per dimension.
Definition Cabana_Grid_GlobalParticleComm.hpp:295
rank_view_type _global_ranks
All cartesian ranks.
Definition Cabana_Grid_GlobalParticleComm.hpp:299
void migrate(MPI_Comm comm, AoSoAType &aosoa)
Migrate particles to the correct rank.
Definition Cabana_Grid_GlobalParticleComm.hpp:283
void build(PositionType positions)
Bin particles across the global grid.
Definition Cabana_Grid_GlobalParticleComm.hpp:274
Kokkos::View< int *, memory_space > destination_view_type
Particle destination ranks View type.
Definition Cabana_Grid_GlobalParticleComm.hpp:54
void scaleRanks()
Scale local rank boundaries based on double counting from MPI reduction.
Definition Cabana_Grid_GlobalParticleComm.hpp:121
std::enable_if_t< 3==NSD, void > copyRanks(GlobalGridType global_grid)
Store all cartesian MPI ranks.
Definition Cabana_Grid_GlobalParticleComm.hpp:165
std::enable_if_t< 3==NSD, Kokkos::Array< int, num_space_dim > > getScaling()
Scaling factors due to double counting from MPI reduction.
Definition Cabana_Grid_GlobalParticleComm.hpp:144
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:335
Owned decomposition tag.
Definition Cabana_Grid_Types.hpp:190
Definition Cabana_Types.hpp:88