IPPL API Reference
Independent Parallel Particle Layer C++ API
Loading...
Searching...
No Matches
ippl::ParticleSpatialLayout< T, Dim, Mesh, PositionProperties > Class Template Reference

#include <ParticleSpatialLayout.h>

+ Inheritance diagram for ippl::ParticleSpatialLayout< T, Dim, Mesh, PositionProperties >:
+ Collaboration diagram for ippl::ParticleSpatialLayout< T, Dim, Mesh, PositionProperties >:

Public Types

using Base = detail::ParticleLayout< T, Dim, PositionProperties... >
 
using hash_type = detail::hash_type< position_memory_space >
 
using locate_type = typename detail::ViewType< int, 1, position_memory_space >::view_type
 
using bool_type = typename detail::ViewType< bool, 1, position_memory_space >::view_type
 
using vector_type = typename Base::vector_type
 
using RegionLayout_t = typename detail::RegionLayout< T, Dim, Mesh, position_memory_space >::uniform_type
 
using FieldLayout_t = typename ippl::FieldLayout< Dim >
 
using size_type = detail::size_type
 
- Public Types inherited from ippl::detail::ParticleLayout< T, Dim, PositionProperties... >
typedef T value_type
 
typedef std::int64_t index_type
 
typedef Vector< T, Dim > vector_type
 
using particle_position_type = ParticleAttrib< vector_type, PositionProperties... >
 
using position_memory_space = typename particle_position_type::memory_space
 
using position_execution_space = typename particle_position_type::execution_space
 
typedef std::array< BC, 2 *Dim > bc_container_type
 

Public Member Functions

 ParticleSpatialLayout (FieldLayout< Dim > &, Mesh &, bool fem=false)
 
void updateLayout (FieldLayout< Dim > &, Mesh &)
 
template<class ParticleContainer >
void update (ParticleContainer &pc)
 
const RegionLayout_t & getRegionLayout () const
 
template<typename ParticleContainer >
std::pair< size_type, size_type > locateParticles (const ParticleContainer &pc, locate_type &ranks, bool_type &invalid, locate_type &nSends_dview, locate_type &sends_dview) const
 
void fillHash (int rank, const locate_type &ranks, hash_type &hash)
 
size_t numberOfSends (int rank, const locate_type &ranks)
 
template<size_t... Idx>
KOKKOS_INLINE_FUNCTION constexpr bool positionInRegion (const std::index_sequence< Idx... > &, const vector_type &pos, const region_type &region)
 
template<typename ParticleContainer >
std::pair< detail::size_type, detail::size_type > locateParticles (const ParticleContainer &pc, locate_type &ranks, bool_type &invalid, locate_type &nSends_dview, locate_type &sends_dview) const
 This function determines to which rank particles need to be sent after the iteration step. It starts by first scanning direct rank neighbors, and only does a global scan if there are still unfound particles. It then calculates how many particles need to be sent to each rank and how many ranks are sent to in total.
 
- Public Member Functions inherited from ippl::detail::ParticleLayout< T, Dim, PositionProperties... >
void update (PBase &)
 
void setParticleBC (bc_container_type bcs)
 
void setParticleBC (BC bc)
 
const bc_container_type & getParticleBC () const
 
void applyBC (const particle_position_type &R, const NDRegion< T, Dim > &nr)
 

Protected Types

using region_view_type = typename RegionLayout_t::view_type
 Type of the Kokkos view containing the local regions.
 
using region_type = typename region_view_type::value_type
 Type of a single Region object.
 
using neighbor_list = typename FieldLayout_t::neighbor_list
 Array of N rank lists, where N = number of hypercubes for the dimension Dim.
 

Protected Member Functions

size_type getNeighborSize (const neighbor_list &neighbors) const
 

Static Protected Member Functions

template<size_t... Idx>
KOKKOS_INLINE_FUNCTION static constexpr bool positionInRegion (const std::index_sequence< Idx... > &, const vector_type &pos, const region_type &region)
 

Protected Attributes

RegionLayout_t rlayout_m
 The RegionLayout which determines where our particles go.
 
FieldLayout_t & flayout_m
 The FieldLayout containing information on nearest neighbors.
 
std::vector< size_type > nRecvs_m
 
mpi::rma::Window< mpi::rma::Active > window_m
 

Additional Inherited Members

- Static Public Attributes inherited from ippl::detail::ParticleLayout< T, Dim, PositionProperties... >
static constexpr unsigned dim
 

Detailed Description

template<typename T, unsigned Dim, class Mesh = UniformCartesian<T, Dim>, typename... PositionProperties>
class ippl::ParticleSpatialLayout< T, Dim, Mesh, PositionProperties >

ParticleSpatialLayout class definition.

Template Parameters
Tvalue type
Dimdimension
Meshtype

Member Function Documentation

◆ fillHash()

template<typename T , unsigned Dim, class Mesh , typename... Properties>
void ippl::ParticleSpatialLayout< T, Dim, Mesh, Properties >::fillHash ( int  rank,
const locate_type &  ranks,
hash_type &  hash 
)
Parameters
rankwe sent to
ranksa container specifying where a particle at the i-th index should go.
hasha mapping to fill the send buffer contiguously

◆ getNeighborSize()

template<typename T , unsigned Dim, class Mesh , typename... Properties>
detail::size_type ippl::ParticleSpatialLayout< T, Dim, Mesh, Properties >::getNeighborSize ( const neighbor_list neighbors) const
protected

Evaluates the total number of MPI ranks sharing the spatial nearest neighbors.

Parameters
neighborsstructure containing, for every spatial direction, a list of MPI ranks IDs corresponding to the nearest neighbors of the current local domain section.
Returns
The total number of the ranks.

◆ locateParticles() [1/2]

template<typename T , unsigned Dim, class Mesh = UniformCartesian<T, Dim>, typename... PositionProperties>
template<typename ParticleContainer >
std::pair< size_type, size_type > ippl::ParticleSpatialLayout< T, Dim, Mesh, PositionProperties >::locateParticles ( const ParticleContainer &  pc,
locate_type &  ranks,
bool_type &  invalid,
locate_type &  nSends_dview,
locate_type &  sends_dview 
) const

For each particle in the bunch, determine the rank on which it should be stored based on its location

Template Parameters
ParticleContainerthe particle container type
Parameters
pcthe particle container
ranksthe integer view in which to store the destination ranks
invalidthe boolean view in which to store whether each particle is invalidated, i.e. needs to be sent to another rank
nSends_dviewthe view storing per-rank send counts
sends_dviewthe view storing per-rank send offsets
Returns
The total number of invalidated particles

◆ locateParticles() [2/2]

template<typename T , unsigned Dim, class Mesh = UniformCartesian<T, Dim>, typename... PositionProperties>
template<typename ParticleContainer >
std::pair< detail::size_type, detail::size_type > ippl::ParticleSpatialLayout< T, Dim, Mesh, PositionProperties >::locateParticles ( const ParticleContainer &  pc,
locate_type &  ranks,
bool_type &  invalid,
locate_type &  nSends_dview,
locate_type &  sends_dview 
) const

This function determines to which rank particles need to be sent after the iteration step. It starts by first scanning direct rank neighbors, and only does a global scan if there are still unfound particles. It then calculates how many particles need to be sent to each rank and how many ranks are sent to in total.

Parameters
pcParticle Container
ranksA vector the length of the number of particles on the current rank, where each value refers to the new rank of the particle
invalidA vector marking the particles that need to be sent away, and thus locally deleted
nSends_dviewDevice view the length of number of ranks, where each value determines the number of particles sent to that rank from the current rank
sends_dviewDevice view for the number of ranks that are sent to from current rank
Returns
tuple with the number of particles sent away and the number of ranks sent to

outsideIds: Container of particle IDs that travelled outside of the neighborhood.

outsideCount: Tracks the number of particles that travelled outside of the neighborhood.

invalidCount: Tracks the number of particles that need to be sent to other ranks.

neighborSize: Size of a neighborhood in D dimentions.

neighbors_view: Kokkos view with the IDs of the neighboring MPI ranks.

Begin Kokkos loop: Step 1: search in current rank Step 2: search in neighbors Step 3: save information on whether the particle was located Step 4: run additional loop on non-located particles

Step 2

Step 3

Step 4

pID: (local) ID of the particle that is currently being searched.

inRegion: Checks whether particle pID is inside region j.

◆ numberOfSends()

template<typename T , unsigned Dim, class Mesh , typename... Properties>
size_t ippl::ParticleSpatialLayout< T, Dim, Mesh, Properties >::numberOfSends ( int  rank,
const locate_type &  ranks 
)
Parameters
rankwe sent to
ranksa container specifying where a particle at the i-th index should go.

The documentation for this class was generated from the following files: