16#ifndef CABANA_GRID_GLOBALPARTICLECOMM_HPP
17#define CABANA_GRID_GLOBALPARTICLECOMM_HPP
38template <
class MemorySpace,
class LocalGr
idType,
class CommSpaceType = Mpi>
43 static constexpr std::size_t
num_space_dim = LocalGridType::num_space_dim;
45 using mesh_type =
typename LocalGridType::mesh_type;
55 Kokkos::View<double* [num_space_dim][2], memory_space>;
60 Kokkos::View<int***, Kokkos::LayoutRight, memory_space>;
63 Kokkos::View<int***, Kokkos::LayoutRight, Kokkos::HostSpace>;
68 auto global_grid = local_grid.globalGrid();
70 Kokkos::ViewAllocateWithoutInitializing(
"global_destination" ),
73 int max_ranks_per_dim = -1;
89 _rank[d] = global_grid.dimBlockId( d );
95 auto comm = global_grid.comm();
104 template <
class LocalMeshType>
109 auto store_corners = KOKKOS_LAMBDA(
const std::size_t d )
111 local_corners( rank[d], d, 0 ) =
113 local_corners( rank[d], d, 1 ) =
116 using exec_space =
typename memory_space::execution_space;
118 Kokkos::parallel_for(
"Cabana::Grid::GlobalParticleComm::storeCorners",
119 policy, store_corners );
130 auto scale_corners = KOKKOS_LAMBDA(
const std::size_t d )
132 for (
int r = 0; r < ranks_per_dim[d]; ++r )
134 local_corners( r, d, 0 ) /= scale[d];
135 local_corners( r, d, 1 ) /= scale[d];
138 using exec_space =
typename memory_space::execution_space;
140 Kokkos::parallel_for(
"Cabana::Grid::GlobalParticleComm::scaleCorners",
141 policy, scale_corners );
146 template <std::
size_t NSD = num_space_dim>
147 std::enable_if_t<3 == NSD, Kokkos::Array<int, num_space_dim>>
getScaling()
149 Kokkos::Array<int, num_space_dim> scale;
157 template <std::
size_t NSD = num_space_dim>
158 std::enable_if_t<2 == NSD, Kokkos::Array<int, num_space_dim>>
getScaling()
160 Kokkos::Array<int, num_space_dim> scale;
167 template <
class GlobalGr
idType, std::
size_t NSD = num_space_dim>
168 std::enable_if_t<3 == NSD, void>
copyRanks( GlobalGridType global_grid )
171 Kokkos::ViewAllocateWithoutInitializing(
"ranks_host" ),
177 global_ranks_host( i, j, k ) =
178 global_grid.blockRank( i, j, k );
185 template <
class GlobalGr
idType, std::
size_t NSD = num_space_dim>
186 std::enable_if_t<2 == NSD, void>
copyRanks( GlobalGridType global_grid )
190 Kokkos::ViewAllocateWithoutInitializing(
"ranks_host" ),
195 global_ranks_host( i, j, 0 ) = global_grid.blockRank( i, j );
208 template <
class ExecutionSpace,
class PositionType>
209 void build( ExecutionSpace exec_space, PositionType positions,
210 const std::size_t begin,
const std::size_t end )
212 Kokkos::Profiling::ScopedRegion region(
213 "Cabana::Grid::GlobalParticleComm::build" );
216 assert( end >= begin );
217 assert( end <= positions.size() );
230 auto build_migrate = KOKKOS_LAMBDA(
const std::size_t p )
234 int ijk[3] = { 0, 0, 0 };
240 int max = ranks_per_dim[d];
243 if ( ( positions( p, d ) < local_corners( min, d, 0 ) ) ||
244 ( positions( p, d ) > local_corners( max - 1, d, 1 ) ) )
245 destinations( p ) = -1;
248 while ( max - min > 1 )
250 int center = Kokkos::floor( ( max + min ) / 2.0 );
251 if ( positions( p, d ) < local_corners( center, d, 0 ) )
259 destinations( p ) = global_ranks( ijk[0], ijk[1], ijk[2] );
262 Kokkos::RangePolicy<ExecutionSpace> policy( exec_space, begin, end );
263 Kokkos::parallel_for(
"Cabana::Grid::GlobalParticleComm::build", policy,
269 template <
class ExecutionSpace,
class PositionType>
270 void build( ExecutionSpace exec_space, PositionType positions )
272 build( exec_space, positions, 0, positions.size() );
276 template <
class PositionType>
277 void build( PositionType positions )
279 using execution_space =
typename memory_space::execution_space;
281 build( execution_space{}, positions, 0, positions.size() );
285 template <
class AoSoAType>
286 void migrate( MPI_Comm comm, AoSoAType& aosoa )
297 Kokkos::Array<int, num_space_dim>
_rank;
312template <
class MemorySpace,
class LocalGr
idType,
class CommSpaceType = Mpi>
315 return std::make_shared<
Multi-node particle redistribution.
auto createGlobalParticleComm(const LocalGridType &local_grid)
Create global linked cell binning.
Definition Cabana_Grid_GlobalParticleComm.hpp:313
LocalMesh< MemorySpace, MeshType > createLocalMesh(const LocalGrid< MeshType > &local_grid)
Creation function for local mesh.
Definition Cabana_Grid_LocalMesh.hpp:779
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:64
Global logical grid.
Definition Cabana_Grid_GlobalGrid.hpp:39
Global particle communication based on the background grid.
Definition Cabana_Grid_GlobalParticleComm.hpp:40
Kokkos::View< double *[num_space_dim][2], memory_space > corner_view_type
Local boundary View type.
Definition Cabana_Grid_GlobalParticleComm.hpp:54
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:158
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:209
int _rank_1d
Current rank.
Definition Cabana_Grid_GlobalParticleComm.hpp:295
corner_view_type _local_corners
Local boundaries.
Definition Cabana_Grid_GlobalParticleComm.hpp:301
Cabana::Grid::GlobalGrid< mesh_type > global_grid_type
Global grid.
Definition Cabana_Grid_GlobalParticleComm.hpp:47
void migrate(MPI_Comm comm, AoSoAType &aosoa)
Migrate particles to the correct rank.
Definition Cabana_Grid_GlobalParticleComm.hpp:286
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:147
std::enable_if_t< 2==NSD, void > copyRanks(GlobalGridType global_grid)
Store all cartesian MPI ranks.
Definition Cabana_Grid_GlobalParticleComm.hpp:186
std::enable_if_t< 3==NSD, void > copyRanks(GlobalGridType global_grid)
Store all cartesian MPI ranks.
Definition Cabana_Grid_GlobalParticleComm.hpp:168
destination_view_type _destinations
Particle destination ranks.
Definition Cabana_Grid_GlobalParticleComm.hpp:305
void storeRanks(LocalMeshType local_mesh)
Store local rank boundaries from the local mesh.
Definition Cabana_Grid_GlobalParticleComm.hpp:105
static constexpr std::size_t num_space_dim
Spatial dimension.
Definition Cabana_Grid_GlobalParticleComm.hpp:43
Kokkos::Array< int, num_space_dim > _ranks_per_dim
Total ranks per dimension.
Definition Cabana_Grid_GlobalParticleComm.hpp:299
CommSpaceType commspace_type
Communication backend.
Definition Cabana_Grid_GlobalParticleComm.hpp:51
void scaleRanks()
Scale local rank boundaries based on double counting from MPI reduction.
Definition Cabana_Grid_GlobalParticleComm.hpp:124
Kokkos::Array< int, num_space_dim > _rank
Current cartesian rank.
Definition Cabana_Grid_GlobalParticleComm.hpp:297
Kokkos::View< int ***, Kokkos::LayoutRight, Kokkos::HostSpace > host_rank_view_type
Cartesian rank View type (host).
Definition Cabana_Grid_GlobalParticleComm.hpp:62
void build(ExecutionSpace exec_space, PositionType positions)
Bin particles across the global grid.
Definition Cabana_Grid_GlobalParticleComm.hpp:270
Kokkos::View< int *, memory_space > destination_view_type
Particle destination ranks View type.
Definition Cabana_Grid_GlobalParticleComm.hpp:57
Kokkos::View< int ***, Kokkos::LayoutRight, memory_space > rank_view_type
Cartesian rank View type.
Definition Cabana_Grid_GlobalParticleComm.hpp:59
rank_view_type _global_ranks
All cartesian ranks.
Definition Cabana_Grid_GlobalParticleComm.hpp:303
void build(PositionType positions)
Bin particles across the global grid.
Definition Cabana_Grid_GlobalParticleComm.hpp:277
typename LocalGridType::mesh_type mesh_type
Mesh type.
Definition Cabana_Grid_GlobalParticleComm.hpp:45
MemorySpace memory_space
Kokkos memory space.
Definition Cabana_Grid_GlobalParticleComm.hpp:49
GlobalParticleComm(const LocalGridType local_grid)
Constructor.
Definition Cabana_Grid_GlobalParticleComm.hpp:66
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
Owned decomposition tag.
Definition Cabana_Grid_Types.hpp:190
Definition Cabana_Types.hpp:88