Block-Structured AMR Software Framework
Loading...
Searching...
No Matches
AMReX_NeighborParticles.H
Go to the documentation of this file.
1#ifndef AMREX_NEIGHBORPARTICLES_H_
2#define AMREX_NEIGHBORPARTICLES_H_
3#include <AMReX_Config.H>
4
5#include <AMReX_MultiFab.H>
7#include <AMReX_Particles.H>
10#include <AMReX_OpenMP.H>
11#include <AMReX_ParticleTile.H>
13
14namespace amrex {
15
22
34template <int NStructReal, int NStructInt, int NArrayReal=0, int NArrayInt=0>
35class NeighborParticleContainer // NOLINT(cppcoreguidelines-virtual-class-destructor) // clang-tidy seems wrong.
36 : public ParticleContainer<NStructReal, NStructInt, NArrayReal, NArrayInt>
37{
38public:
43private:
44 struct MaskComps
45 {
46 enum {
47 grid = 0,
48 tile,
49 level
50 };
51 };
52
53 struct NeighborIndexMap {
54 int dst_level;
55 int dst_grid;
56 int dst_tile;
57 int dst_index;
58 int src_level;
59 int src_grid;
60 int src_tile;
61 int src_index;
62 int thread_num;
63
64 NeighborIndexMap(int dlevel, int dgrid, int dtile, int dindex,
65 int slevel, int sgrid, int stile, int sindex, int tnum)
66 : dst_level(dlevel), dst_grid(dgrid), dst_tile(dtile), dst_index(dindex),
67 src_level(slevel), src_grid(sgrid), src_tile(stile), src_index(sindex),
68 thread_num(tnum)
69 {}
70
71 friend std::ostream& operator<< (std::ostream& os, const NeighborIndexMap& nim)
72 {
73 os << nim.dst_level << " " << nim.dst_grid << " " << nim.dst_tile << " " << nim.dst_index
74 << nim.src_level << " " << nim.src_grid << " " << nim.src_tile << " " << nim.src_index
75 << nim.thread_num;
76 if (!os.good()) {
77 amrex::Error("operator<<(ostream&, const NeighborIndexMap& nim) failed");
78 }
79 return os;
80 }
81
82 };
83
84 struct NeighborCopyTag {
85 int level = -1;
86 int grid = -1;
87 int tile = -1;
88 int src_index = 0;
89 int dst_index = 0;
90 IntVect periodic_shift = IntVect(0);
91
92 NeighborCopyTag () = default;
93
94 NeighborCopyTag (int a_level, int a_grid, int a_tile) :
95 level(a_level), grid(a_grid), tile(a_tile)
96 {}
97
98 bool operator< (const NeighborCopyTag& other) const {
99 if (level != other.level) { return level < other.level; }
100 if (grid != other.grid) { return grid < other.grid; }
101 if (tile != other.tile) { return tile < other.tile; }
103 if (periodic_shift[0] != other.periodic_shift[0])
104 return periodic_shift[0] < other.periodic_shift[0];,
105 if (periodic_shift[1] != other.periodic_shift[1])
106 return periodic_shift[1] < other.periodic_shift[1];,
107 if (periodic_shift[2] != other.periodic_shift[2])
108 return periodic_shift[2] < other.periodic_shift[2];
109 )
110 return false;
111 }
112
113 bool operator== (const NeighborCopyTag& other) const {
114 return (level == other.level) && (grid == other.grid) && (tile == other.tile)
116 && (periodic_shift[0] == other.periodic_shift[0]),
117 && (periodic_shift[1] == other.periodic_shift[1]),
118 && (periodic_shift[2] == other.periodic_shift[2])
119 );
120 }
121
122 bool operator!= (const NeighborCopyTag& other) const
123 {
124 return !operator==(other);
125 }
126
127 friend std::ostream& operator<< (std::ostream& os, const NeighborCopyTag& tag)
128 {
129 os << tag.level << " " << tag.grid << " " << tag.tile << " " << tag.periodic_shift;
130 if (!os.good()) {
131 amrex::Error("operator<<(ostream&, const NeighborCopyTag&) failed");
132 }
133 return os;
134 }
135 };
136
137 struct InverseCopyTag
138 {
139 int src_grid;
140 int src_tile;
141 int src_index;
142 int src_level;
143 };
144
145 friend std::ostream& operator<< (std::ostream& os, const InverseCopyTag& tag)
146 {
147 os << tag.src_level << " " << tag.src_grid << " " << tag.src_tile << " " << tag.src_index;
148 if (!os.good()) {
149 amrex::Error("operator<<(ostream&, const InverseCopyTag&) failed");
150 }
151 return os;
152 }
153
154 struct NeighborCommTag {
155
156 NeighborCommTag (int pid, int lid, int gid, int tid)
157 : proc_id(pid), level_id(lid), grid_id(gid), tile_id(tid)
158 {}
159
160 int proc_id;
161 int level_id;
162 int grid_id;
163 int tile_id;
164
165 bool operator< (const NeighborCommTag& other) const {
166 return (proc_id < other.proc_id ||
167 (proc_id == other.proc_id &&
168 grid_id < other.grid_id) ||
169 (proc_id == other.proc_id &&
170 grid_id == other.grid_id &&
171 tile_id < other.tile_id) ||
172 (proc_id == other.proc_id &&
173 grid_id == other.grid_id &&
174 tile_id == other.tile_id &&
175 level_id < other.level_id));
176 }
177
178 bool operator== (const NeighborCommTag& other) const {
179 return ( (proc_id == other.proc_id) &&
180 (grid_id == other.grid_id) &&
181 (tile_id == other.tile_id) &&
182 (level_id == other.level_id));
183 }
184
185 friend std::ostream& operator<< (std::ostream& os, const NeighborCommTag& tag)
186 {
187 os << tag.proc_id << " " << tag.level_id << " " << tag.grid_id << " " << tag.tile_id;
188 if (!os.good()) {
189 amrex::Error("operator<<(ostream&, const NeighborCommTag&) failed");
190 }
191 return os;
192 }
193 };
194
195public:
196
198 using PairIndex = std::pair<int, int>;
199 using NeighborCommMap = std::map<NeighborCommTag, Vector<char> >;
204
205 NeighborParticleContainer (ParGDBBase* gdb, int ncells);
206
208 const DistributionMapping & dmap,
209 const BoxArray & ba,
210 int nneighbor);
211
213 const Vector<DistributionMapping> & dmap,
214 const Vector<BoxArray> & ba,
215 const Vector<int> & rr,
216 int nneighbor);
217
218 ~NeighborParticleContainer () override = default;
219
222
223 NeighborParticleContainer ( NeighborParticleContainer && ) = default; // NOLINT(performance-noexcept-move-constructor)
224 NeighborParticleContainer& operator= ( NeighborParticleContainer && ) = default; // NOLINT(performance-noexcept-move-constructor)
225
229 void Regrid (const DistributionMapping& dmap, const BoxArray& ba);
230 void Regrid (const DistributionMapping& dmap, const BoxArray& ba, int lev);
231 void Regrid (const Vector<DistributionMapping>& dmap, const Vector<BoxArray>& ba);
232
236 void fillNeighbors ();
237
242 void sumNeighbors (int real_start_comp, int real_num_comp,
243 int int_start_comp, int int_num_comp);
244
248 void updateNeighbors (bool boundary_neighbors_only=false);
249
253 void clearNeighbors ();
254
258 template <class CheckPair>
259 void buildNeighborList (CheckPair const& check_pair, bool sort=false);
260
264 template <class CheckPair, class OtherPCType>
265 void buildNeighborList (CheckPair const& check_pair, OtherPCType& other,
266 Vector<std::map<std::pair<int, int>, amrex::NeighborList<typename OtherPCType::ParticleType> > >& neighbor_lists,
267 bool sort=false);
268
272 template <class CheckPair>
273 void buildNeighborList (CheckPair const& check_pair, int type_ind, int* ref_ratio,
274 int num_bin_types=1, bool sort=false);
275
276 template <class CheckPair>
277 void selectActualNeighbors (CheckPair const& check_pair, int num_cells=1);
278
279 void printNeighborList ();
280
281 void setRealCommComp (int i, bool value);
282 void setIntCommComp (int i, bool value);
283
284 ParticleTile& GetNeighbors (int lev, int grid, int tile)
285 {
286 return neighbors[lev][std::make_pair(grid,tile)];
287 }
288
289 const ParticleTile& GetNeighbors (int lev, int grid, int tile) const
290 {
291 return neighbors[lev][std::make_pair(grid,tile)];
292 }
293
294 template <typename T,
295 std::enable_if_t<std::is_same_v<T,bool>,int> = 0>
296 void AddRealComp (T communicate=true)
297 {
299 AddRealComp(communicate);
300 ghost_real_comp.push_back(communicate);
301 calcCommSize();
302 }
303
304 template <typename T,
305 std::enable_if_t<std::is_same_v<T,bool>,int> = 0>
306 void AddIntComp (T communicate=true)
307 {
309 AddIntComp(communicate);
310 ghost_int_comp.push_back(communicate);
311 calcCommSize();
312 }
313
314 void Redistribute (int lev_min=0, int lev_max=-1, int nGrow=0, int local=0,
315 bool remove_negative=true)
316 {
319 ::Redistribute(lev_min, lev_max, nGrow, local, remove_negative);
320 }
321
322 void RedistributeLocal (bool remove_negative=true)
323 {
324 const int lev_min = 0;
325 const int lev_max = 0;
326 const int nGrow = 0;
327 const int local = 1;
329 this->Redistribute(lev_min, lev_max, nGrow, local, remove_negative);
330 }
331
332#ifdef AMREX_USE_GPU
333 void fillNeighborsGPU ();
334 void updateNeighborsGPU (bool boundary_neighbors_only=false);
335 void clearNeighborsGPU ();
336#else
337 void fillNeighborsCPU ();
338 void sumNeighborsCPU (int real_start_comp, int real_num_comp,
339 int int_start_comp, int int_num_comp);
340 void updateNeighborsCPU (bool reuse_rcv_counts=true);
341 void clearNeighborsCPU ();
342#endif
343
344 void setEnableInverse (bool flag)
345 {
346 enable_inverse = flag;
347 calcCommSize();
348 }
349
350 bool enableInverse () { return enable_inverse; }
351
352 void buildNeighborMask ();
353
354 void buildNeighborCopyOp (bool use_boundary_neighbor=false);
355
356protected:
357
358 void cacheNeighborInfo ();
359
363 void BuildMasks ();
364
368 bool areMasksValid ();
369
370 void GetNeighborCommTags ();
371
372 void GetCommTagsBox (Vector<NeighborCommTag>& tags, int lev, const Box& in_box);
373
374 void resizeContainers (int num_levels);
375
376 void initializeCommComps ();
377
378 void calcCommSize ();
379
383 void fillNeighborsMPI (bool reuse_rcv_counts);
384
385 void sumNeighborsMPI (std::map<int, Vector<char> >& not_ours,
386 int real_start_comp, int real_num_comp,
387 int int_start_comp, int int_num_comp);
388
393
395 const ParticleType& p,
396 int nGrow, const NeighborCopyTag& src_tag, const MyParIter& pti);
397
399 const ParticleType& p,
400 const IntVect& nGrow, const NeighborCopyTag& src_tag, const MyParIter& pti);
401
402 IntVect computeRefFac (int src_lev, int lev);
403
407 static constexpr size_t pdata_size = sizeof(ParticleType);
408
409 static constexpr int num_mask_comps = 3;
414
417
423 std::map<int, Vector<char> > send_data;
424
427
428 static bool use_mask;
429
430 static bool enable_inverse;
431
432#ifdef AMREX_USE_GPU
433
438
439 NeighborTask(int a_grid_id, const Box& a_box, const IntVect& a_periodic_shift)
440 : grid_id(a_grid_id), box(a_box), periodic_shift(a_periodic_shift) {}
441
442 bool operator<(const NeighborTask& other) const {
443 if (grid_id != other.grid_id) { return grid_id < other.grid_id; }
444 if (box != other.box ) { return box < other.box; }
446 if (periodic_shift[0] != other.periodic_shift[0])
447 { return periodic_shift[0] < other.periodic_shift[0]; },
448 if (periodic_shift[1] != other.periodic_shift[1])
449 { return periodic_shift[1] < other.periodic_shift[1]; },
450 if (periodic_shift[2] != other.periodic_shift[2])
451 { return periodic_shift[2] < other.periodic_shift[2]; }
452 )
453 return false;
454 }
455 };
456
457 // These are used to keep track of which particles need to be ghosted to which grids
461
462 // {pboxid: [[neighbor codes] size= #intersected nbrs] size= #boundary boxes}
463 std::map<int, std::vector<std::vector<NeighborCode> > > m_grid_map;
464
465 // {pboxid: [ith intersected pbox: nbr codes]}
466 std::map<int, amrex::Gpu::DeviceVector<NeighborCode> > m_code_array;
467 // {pboxid: [ith intersected pbox: intersection]}
468 std::map<int, amrex::Gpu::DeviceVector<Box> > m_isec_boxes;
469 std::map<int, amrex::Gpu::DeviceVector<int> > m_code_offsets; // to be removed
470
473
476
479#endif
480
482
484
485 [[nodiscard]] bool hasNeighbors() const { return m_has_neighbors; }
486
487 bool m_has_neighbors = false;
488};
489
490}
491
493
494#ifdef AMREX_USE_GPU
496#else
498#endif
499
500#endif // _NEIGHBORPARTICLES_H_
#define AMREX_D_TERM(a, b, c)
Definition AMReX_SPACE.H:172
A collection of Boxes stored in an Array.
Definition AMReX_BoxArray.H:568
Calculates the distribution of FABs to MPI processes.
Definition AMReX_DistributionMapping.H:43
Rectangular problem domain geometry.
Definition AMReX_Geometry.H:74
Definition AMReX_NeighborList.H:249
Definition AMReX_NeighborParticles.H:37
bool m_has_neighbors
Definition AMReX_NeighborParticles.H:487
void setRealCommComp(int i, bool value)
Definition AMReX_NeighborParticlesI.H:60
size_t cdata_size
Definition AMReX_NeighborParticles.H:410
std::pair< int, int > PairIndex
Definition AMReX_NeighborParticles.H:198
const ParticleTile & GetNeighbors(int lev, int grid, int tile) const
Definition AMReX_NeighborParticles.H:289
bool enableInverse()
Definition AMReX_NeighborParticles.H:350
void selectActualNeighbors(CheckPair const &check_pair, int num_cells=1)
Definition AMReX_NeighborParticlesI.H:978
IntVect computeRefFac(int src_lev, int lev)
Definition AMReX_NeighborParticlesI.H:248
void getNeighborTags(Vector< NeighborCopyTag > &tags, const ParticleType &p, int nGrow, const NeighborCopyTag &src_tag, const MyParIter &pti)
Definition AMReX_NeighborParticlesI.H:538
typename ParticleContainerType::SuperParticleType SuperParticleType
Definition AMReX_NeighborParticles.H:41
void GetNeighborCommTags()
Definition AMReX_NeighborParticlesI.H:192
Gpu::PinnedVector< char > pinned_snd_buffer
Definition AMReX_NeighborParticles.H:477
Vector< std::map< PairIndex, ParticleTile > > neighbors
Definition AMReX_NeighborParticles.H:405
void printNeighborList()
Definition AMReX_NeighborParticlesI.H:1092
ParticleTile & GetNeighbors(int lev, int grid, int tile)
Definition AMReX_NeighborParticles.H:284
void calcCommSize()
Definition AMReX_NeighborParticlesI.H:76
Vector< NeighborCommTag > local_neighbors
Definition AMReX_NeighborParticles.H:412
void AddRealComp(T communicate=true)
Definition AMReX_NeighborParticles.H:296
void sumNeighborsMPI(std::map< int, Vector< char > > &not_ours, int real_start_comp, int real_num_comp, int int_start_comp, int int_num_comp)
bool areMasksValid()
Definition AMReX_NeighborParticlesI.H:129
ParticleCopyPlan neighbor_copy_plan
Definition AMReX_NeighborParticles.H:472
typename ParticleContainer< NStructReal, NStructInt, NArrayReal, NArrayInt >::AoS AoS
Definition AMReX_NeighborParticles.H:200
ParticleCopyOp neighbor_copy_op
Definition AMReX_NeighborParticles.H:471
static bool enable_inverse
Definition AMReX_NeighborParticles.H:430
friend std::ostream & operator<<(std::ostream &os, const InverseCopyTag &tag)
Definition AMReX_NeighborParticles.H:145
void AddIntComp(T communicate=true)
Definition AMReX_NeighborParticles.H:306
~NeighborParticleContainer() override=default
Gpu::PinnedVector< char > pinned_rcv_buffer
Definition AMReX_NeighborParticles.H:478
amrex::DistributionMapping m_cached_neighbor_dm
Definition AMReX_NeighborParticles.H:460
std::map< int, Vector< char > > send_data
Definition AMReX_NeighborParticles.H:423
bool hasNeighbors() const
Definition AMReX_NeighborParticles.H:485
void initializeCommComps()
Definition AMReX_NeighborParticlesI.H:47
typename ParticleContainer< NStructReal, NStructInt, NArrayReal, NArrayInt >::IntVector IntVector
Definition AMReX_NeighborParticles.H:203
Vector< int > ghost_int_comp
Definition AMReX_NeighborParticles.H:426
void resizeContainers(int num_levels)
Definition AMReX_NeighborParticlesI.H:1111
Vector< std::map< PairIndex, IntVector > > neighbor_list
Definition AMReX_NeighborParticles.H:406
void GetCommTagsBox(Vector< NeighborCommTag > &tags, int lev, const Box &in_box)
Definition AMReX_NeighborParticlesI.H:267
bool m_neighbor_mask_initialized
Definition AMReX_NeighborParticles.H:458
std::map< int, std::vector< std::vector< NeighborCode > > > m_grid_map
Definition AMReX_NeighborParticles.H:463
Vector< Long > rcvs
Definition AMReX_NeighborParticles.H:421
static bool use_mask
Definition AMReX_NeighborParticles.H:428
void buildNeighborList(CheckPair const &check_pair, bool sort=false)
Definition AMReX_NeighborParticlesI.H:696
Vector< int > neighbor_procs
Definition AMReX_NeighborParticles.H:420
Vector< std::map< std::pair< int, int >, amrex::Gpu::DeviceVector< int > > > m_boundary_particle_ids
Definition AMReX_NeighborParticles.H:483
NeighborListContainerType m_neighbor_list
Definition AMReX_NeighborParticles.H:481
void Regrid(const DistributionMapping &dmap, const BoxArray &ba)
Definition AMReX_NeighborParticlesI.H:95
Vector< std::map< PairIndex, Vector< Vector< NeighborCopyTag > > > > buffer_tag_cache
Definition AMReX_NeighborParticles.H:415
void fillNeighborsMPI(bool reuse_rcv_counts)
void RedistributeLocal(bool remove_negative=true)
Definition AMReX_NeighborParticles.H:322
typename ParticleContainer< NStructReal, NStructInt, NArrayReal, NArrayInt >::ParticleTileType ParticleTile
Definition AMReX_NeighborParticles.H:202
void updateNeighbors(bool boundary_neighbors_only=false)
Definition AMReX_NeighborParticlesI.H:665
std::map< int, amrex::Gpu::DeviceVector< Box > > m_isec_boxes
Definition AMReX_NeighborParticles.H:468
NeighborParticleContainer(NeighborParticleContainer &&)=default
amrex::PODVector< char, PolymorphicArenaAllocator< char > > snd_buffer
Definition AMReX_NeighborParticles.H:474
void sumNeighbors(int real_start_comp, int real_num_comp, int int_start_comp, int int_num_comp)
Definition AMReX_NeighborParticlesI.H:652
void BuildMasks()
Definition AMReX_NeighborParticlesI.H:153
static constexpr size_t pdata_size
Definition AMReX_NeighborParticles.H:407
Long num_snds
Definition AMReX_NeighborParticles.H:422
int m_num_neighbor_cells
Definition AMReX_NeighborParticles.H:411
void setEnableInverse(bool flag)
Definition AMReX_NeighborParticles.H:344
void clearNeighborsGPU()
Definition AMReX_NeighborParticlesGPUImpl.H:398
void cacheNeighborInfo()
Definition AMReX_NeighborParticlesI.H:314
Vector< std::map< PairIndex, Vector< InverseCopyTag > > > inverse_tags
Definition AMReX_NeighborParticles.H:404
typename ParticleContainerType::ParticleType ParticleType
Definition AMReX_NeighborParticles.H:40
void clearNeighbors()
Definition AMReX_NeighborParticlesI.H:682
void buildNeighborCopyOp(bool use_boundary_neighbor=false)
Definition AMReX_NeighborParticlesGPUImpl.H:186
Vector< int > ghost_real_comp
Definition AMReX_NeighborParticles.H:425
Vector< std::map< PairIndex, int > > local_neighbor_sizes
Definition AMReX_NeighborParticles.H:416
void updateNeighborsGPU(bool boundary_neighbors_only=false)
Definition AMReX_NeighborParticlesGPUImpl.H:342
void fillNeighbors()
Definition AMReX_NeighborParticlesI.H:640
NeighborParticleContainer & operator=(const NeighborParticleContainer &)=delete
void Redistribute(int lev_min=0, int lev_max=-1, int nGrow=0, int local=0, bool remove_negative=true)
Definition AMReX_NeighborParticles.H:314
Vector< std::unique_ptr< iMultiFab > > mask_ptr
Definition AMReX_NeighborParticles.H:413
void setIntCommComp(int i, bool value)
Definition AMReX_NeighborParticlesI.H:68
std::map< int, amrex::Gpu::DeviceVector< int > > m_code_offsets
Definition AMReX_NeighborParticles.H:469
std::map< int, amrex::Gpu::DeviceVector< NeighborCode > > m_code_array
Definition AMReX_NeighborParticles.H:466
typename ParticleContainer< NStructReal, NStructInt, NArrayReal, NArrayInt >::ParticleVector ParticleVector
Definition AMReX_NeighborParticles.H:201
NeighborParticleContainer(const NeighborParticleContainer &)=delete
void buildNeighborMask()
Definition AMReX_NeighborParticlesGPUImpl.H:114
std::map< NeighborCommTag, Vector< char > > NeighborCommMap
Definition AMReX_NeighborParticles.H:199
static constexpr int num_mask_comps
grid, tile, level
Definition AMReX_NeighborParticles.H:409
amrex::PODVector< char, PolymorphicArenaAllocator< char > > rcv_buffer
Definition AMReX_NeighborParticles.H:475
amrex::BoxArray m_cached_neighbor_ba
Definition AMReX_NeighborParticles.H:459
void fillNeighborsGPU()
Definition AMReX_NeighborParticlesGPUImpl.H:322
Dynamically allocated vector for trivially copyable data.
Definition AMReX_PODVector.H:308
Definition AMReX_ParGDB.H:13
Definition AMReX_ParIter.H:118
A distributed container for Particles sorted onto the levels, grids, and tiles of a block-structured ...
Definition AMReX_ParticleContainer.H:149
void AddIntComp(std::string const &name, int communicate=1)
Definition AMReX_ParticleContainer.H:1326
Particle< NStructReal+NArrayReal, NStructInt+NArrayInt > SuperParticleType
The type of the "SuperParticle" which stored all components in AoS form.
Definition AMReX_ParticleContainer.H:174
typename ParticleTileType::AoS AoS
Definition AMReX_ParticleContainer.H:199
typename AoS::ParticleVector ParticleVector
Definition AMReX_ParticleContainer.H:204
typename SoA::IntVector IntVector
Definition AMReX_ParticleContainer.H:203
std::conditional_t< is_rtsoa_pc, ParticleTileRT< typename ParticleType::RealType, typename ParticleType::IntType >, ParticleTile< ParticleType, NArrayReal, NArrayInt, Allocator > > ParticleTileType
Definition AMReX_ParticleContainer.H:191
void AddRealComp(std::string const &name, int communicate=1)
Definition AMReX_ParticleContainer.H:1293
T_ParticleType ParticleType
Definition AMReX_ParticleContainer.H:151
amrex_long Long
Definition AMReX_INT.H:30
Definition AMReX_Amr.cpp:49
IntVectND< 3 > IntVect
IntVect is an alias for amrex::IntVectND instantiated with AMREX_SPACEDIM.
Definition AMReX_BaseFwd.H:33
bool operator==(A1 const &a1, A2 const &a2)
Definition AMReX_GpuAllocators.H:214
void Error(const std::string &msg)
Print out message to cerr and exit via amrex::Abort().
Definition AMReX.cpp:234
Definition AMReX_NeighborParticles.H:17
Box grid_box
Definition AMReX_NeighborParticles.H:19
IntVect periodic_shift
Definition AMReX_NeighborParticles.H:20
int grid_id
Definition AMReX_NeighborParticles.H:18
Definition AMReX_NeighborParticles.H:434
bool operator<(const NeighborTask &other) const
Definition AMReX_NeighborParticles.H:442
IntVect periodic_shift
Definition AMReX_NeighborParticles.H:437
Box box
Definition AMReX_NeighborParticles.H:436
int grid_id
Definition AMReX_NeighborParticles.H:435
NeighborTask(int a_grid_id, const Box &a_box, const IntVect &a_periodic_shift)
Definition AMReX_NeighborParticles.H:439
Definition AMReX_ParticleCommunication.H:65
Definition AMReX_ParticleCommunication.H:91