Block-Structured AMR Software Framework
AMReX_ParticleTile.H
Go to the documentation of this file.
1 #ifndef AMREX_PARTICLETILE_H_
2 #define AMREX_PARTICLETILE_H_
3 #include <AMReX_Config.H>
4 
5 #include <AMReX_Extension.H>
6 #include <AMReX_Particle.H>
7 #include <AMReX_ArrayOfStructs.H>
8 #include <AMReX_StructOfArrays.H>
9 #include <AMReX_Vector.H>
10 #include <AMReX_REAL.H>
11 #include <AMReX_RealVect.H>
12 
13 #include <array>
14 #include <type_traits>
15 
16 namespace amrex {
17 
18 // Forward Declaration
19 template <int NArrayReal, int NArrayInt>
20 struct ConstSoAParticle;
21 template <int NArrayReal, int NArrayInt>
22 struct SoAParticle;
23 
24 template <typename T_ParticleType, int NArrayReal, int NArrayInt>
25 struct ConstParticleTileData;
26 
27 template <typename T_ParticleType, int NArrayReal, int NArrayInt>
29 {
30  static constexpr int NAR = NArrayReal;
31  static constexpr int NAI = NArrayInt;
32 
33  using ParticleType = T_ParticleType;
34  using ParticleRefType = T_ParticleType&;
36 
37  static constexpr int NStructReal = ParticleType::NReal;
38  static constexpr int NStructInt = ParticleType::NInt;
39 
41 
42  static constexpr bool is_particle_tile_data = true;
43 
44  Long m_size;
45 
46  using AOS_PTR = std::conditional_t<T_ParticleType::is_soa_particle,
49 
50  uint64_t* m_idcpu;
53 
58 
60  ParticleReal& pos (const int dir, const int index) const &
61  {
62  if constexpr(!ParticleType::is_soa_particle) {
63  return this->m_aos[index].pos(dir);
64  } else {
65  return this->m_rdata[dir][index];
66  }
67  }
68 
70  decltype(auto) id (const int index) const &
71  {
72  if constexpr(!ParticleType::is_soa_particle) {
73  return this->m_aos[index].id();
74  } else {
75  return ParticleIDWrapper(this->m_idcpu[index]);
76  }
77  }
78 
80  decltype(auto) cpu (const int index) const &
81  {
82  if constexpr(!ParticleType::is_soa_particle) {
83  return this->m_aos[index].cpu();
84  } else {
85  return ParticleCPUWrapper(this->m_idcpu[index]);
86  }
87  }
88 
90  decltype(auto) idcpu (const int index) const &
91  {
92  if constexpr(ParticleType::is_soa_particle) {
93  return this->m_idcpu[index];
94  } else {
95  amrex::Abort("not implemented");
96  }
97  }
98 
100  ParticleReal * rdata (const int attribute_index) const
101  {
102  return this->m_rdata[attribute_index];
103  }
104 
106  int * idata (const int attribute_index) const
107  {
108  return this->m_idata[attribute_index];
109  }
110 
112  decltype(auto) operator[] (const int index) const
113  {
114  if constexpr (!ParticleType::is_soa_particle) {
115  return m_aos[index];
116  } else {
117  return SoAParticle<NAR, NAI>(*this, index);
118  }
119  }
120 
122  void packParticleData (char* buffer, int src_index, std::size_t dst_offset,
123  const int* comm_real, const int * comm_int) const noexcept
124  {
125  AMREX_ASSERT(src_index < m_size);
126  auto* dst = buffer + dst_offset;
127  if constexpr (!ParticleType::is_soa_particle) {
128  memcpy(dst, m_aos + src_index, sizeof(ParticleType));
129  dst += sizeof(ParticleType);
130  } else {
131  memcpy(dst, m_idcpu + src_index, sizeof(uint64_t));
132  dst += sizeof(uint64_t);
133  }
134  int array_start_index = AMREX_SPACEDIM + NStructReal;
135  for (int i = 0; i < NAR; ++i)
136  {
137  if (comm_real[array_start_index + i])
138  {
139  memcpy(dst, m_rdata[i] + src_index, sizeof(ParticleReal));
140  dst += sizeof(ParticleReal);
141  }
142  }
143  int runtime_start_index = AMREX_SPACEDIM + NStructReal + NAR;
144  for (int i = 0; i < m_num_runtime_real; ++i)
145  {
146  if (comm_real[runtime_start_index + i])
147  {
148  memcpy(dst, m_runtime_rdata[i] + src_index, sizeof(ParticleReal));
149  dst += sizeof(ParticleReal);
150  }
151  }
152  array_start_index = 2 + NStructInt;
153  for (int i = 0; i < NAI; ++i)
154  {
155  if (comm_int[array_start_index + i])
156  {
157  memcpy(dst, m_idata[i] + src_index, sizeof(int));
158  dst += sizeof(int);
159  }
160  }
161  runtime_start_index = 2 + NStructInt + NAI;
162  for (int i = 0; i < m_num_runtime_int; ++i)
163  {
164  if (comm_int[runtime_start_index + i])
165  {
166  memcpy(dst, m_runtime_idata[i] + src_index, sizeof(int));
167  dst += sizeof(int);
168  }
169  }
170  }
171 
173  void unpackParticleData (const char* buffer, Long src_offset, int dst_index,
174  const int* comm_real, const int* comm_int) const noexcept
175  {
176  AMREX_ASSERT(dst_index < m_size);
177  const auto* src = buffer + src_offset;
178  if constexpr (!ParticleType::is_soa_particle) {
179  memcpy(m_aos + dst_index, src, sizeof(ParticleType));
180  src += sizeof(ParticleType);
181  } else {
182  memcpy(m_idcpu + dst_index, src, sizeof(uint64_t));
183  src += sizeof(uint64_t);
184  }
185  int array_start_index = AMREX_SPACEDIM + NStructReal;
186  for (int i = 0; i < NAR; ++i)
187  {
188  if (comm_real[array_start_index + i])
189  {
190  memcpy(m_rdata[i] + dst_index, src, sizeof(ParticleReal));
191  src += sizeof(ParticleReal);
192  }
193  }
194  int runtime_start_index = AMREX_SPACEDIM + NStructReal + NAR;
195  for (int i = 0; i < m_num_runtime_real; ++i)
196  {
197  if (comm_real[runtime_start_index + i])
198  {
199  memcpy(m_runtime_rdata[i] + dst_index, src, sizeof(ParticleReal));
200  src += sizeof(ParticleReal);
201  }
202  }
203  array_start_index = 2 + NStructInt;
204  for (int i = 0; i < NAI; ++i)
205  {
206  if (comm_int[array_start_index + i])
207  {
208  memcpy(m_idata[i] + dst_index, src, sizeof(int));
209  src += sizeof(int);
210  }
211  }
212  runtime_start_index = 2 + NStructInt + NAI;
213  for (int i = 0; i < m_num_runtime_int; ++i)
214  {
215  if (comm_int[runtime_start_index + i])
216  {
217  memcpy(m_runtime_idata[i] + dst_index, src, sizeof(int));
218  src += sizeof(int);
219  }
220  }
221  }
222 
223  template <typename T = ParticleType, std::enable_if_t<!T::is_soa_particle, int> = 0>
225  SuperParticleType getSuperParticle (int index) const noexcept
226  {
227  AMREX_ASSERT(index < m_size);
229  for (int i = 0; i < AMREX_SPACEDIM; ++i) {
230  sp.pos(i) = m_aos[index].pos(i);
231  }
232  for (int i = 0; i < NStructReal; ++i) {
233  sp.rdata(i) = m_aos[index].rdata(i);
234  }
235  for (int i = 0; i < NAR; ++i) {
236  sp.rdata(NStructReal+i) = m_rdata[i][index];
237  }
238  sp.id() = m_aos[index].id();
239  sp.cpu() = m_aos[index].cpu();
240  for (int i = 0; i < NStructInt; ++i) {
241  sp.idata(i) = m_aos[index].idata(i);
242  }
243  for (int i = 0; i < NAI; ++i) {
244  sp.idata(NStructInt+i) = m_idata[i][index];
245  }
246  return sp;
247  }
248 
249  template <typename T = ParticleType, std::enable_if_t<T::is_soa_particle, int> = 0>
251  SuperParticleType getSuperParticle (int index) const noexcept
252  {
253  AMREX_ASSERT(index < m_size);
255  sp.m_idcpu = m_idcpu[index];
256  for (int i = 0; i < AMREX_SPACEDIM; ++i) {sp.pos(i) = m_rdata[i][index];}
257  for (int i = 0; i < NAR; ++i) {
258  sp.rdata(i) = m_rdata[i][index];
259  }
260  for (int i = 0; i < NAI; ++i) {
261  sp.idata(i) = m_idata[i][index];
262  }
263  return sp;
264  }
265 
266  template <typename T = ParticleType, std::enable_if_t<!T::is_soa_particle, int> = 0>
268  void setSuperParticle (const SuperParticleType& sp, int index) const noexcept
269  {
270  for (int i = 0; i < AMREX_SPACEDIM; ++i) {
271  m_aos[index].pos(i) = sp.pos(i);
272  }
273  for (int i = 0; i < NStructReal; ++i) {
274  m_aos[index].rdata(i) = sp.rdata(i);
275  }
276  for (int i = 0; i < NAR; ++i) {
277  m_rdata[i][index] = sp.rdata(NStructReal+i);
278  }
279  m_aos[index].id() = sp.id();
280  m_aos[index].cpu() = sp.cpu();
281  for (int i = 0; i < NStructInt; ++i) {
282  m_aos[index].idata(i) = sp.idata(i);
283  }
284  for (int i = 0; i < NAI; ++i) {
285  m_idata[i][index] = sp.idata(NStructInt+i);
286  }
287  }
288 
289  template <typename T = ParticleType, std::enable_if_t<T::is_soa_particle, int> = 0>
291  void setSuperParticle (const SuperParticleType& sp, int index) const noexcept
292  {
293  m_idcpu[index] = sp.m_idcpu;
294  for (int i = 0; i < NAR; ++i) {
295  m_rdata[i][index] = sp.rdata(i);
296  }
297  for (int i = 0; i < NAI; ++i) {
298  m_idata[i][index] = sp.idata(i);
299  }
300  }
301 };
302 
303 // SOA Particle Structure
304 template <int T_NArrayReal, int T_NArrayInt>
306 {
307  static constexpr int NArrayReal = T_NArrayReal;
308  static constexpr int NArrayInt = T_NArrayInt;
311  static constexpr bool is_soa_particle = true;
312  static constexpr bool is_constsoa_particle = true;
313 
314  using RealType = ParticleReal;
315 
317  ConstSoAParticle (ConstPTD const& ptd, long i) : // Note: should this be int instead?
319  {
320  }
321 
322  //static Long the_next_id;
323 
324  //functions to get id and cpu in the SOA data
325 
328 
331 
332  //functions to get positions of the particle in the SOA data
333 
335  RealVect pos () const & {return RealVect(AMREX_D_DECL(this->m_constparticle_tile_data.m_rdata[0][m_index], this->m_constparticle_tile_data.m_rdata[1][m_index], this->m_constparticle_tile_data.m_rdata[2][m_index]));}
336 
338  const RealType& pos (int position_index) const &
339  {
340  AMREX_ASSERT(position_index < AMREX_SPACEDIM);
341  return this->m_constparticle_tile_data.m_rdata[position_index][m_index];
342  }
343 
344  static Long NextID ();
345 
349  static Long UnprotectedNextID ();
350 
356  static void NextID (Long nextid);
357 
358  private :
359 
360  static_assert(std::is_trivially_copyable<ParticleTileData<SoAParticleBase, NArrayReal, NArrayInt>>(), "ParticleTileData is not trivially copyable");
361 
363  int m_index;
364 };
365 
366 template <int T_NArrayReal, int T_NArrayInt>
368 {
369  static constexpr int NArrayReal = T_NArrayReal;
370  static constexpr int NArrayInt = T_NArrayInt;
373  static constexpr bool is_soa_particle = true;
374  static constexpr bool is_constsoa_particle = false;
375 
377  using RealType = ParticleReal;
378 
380  SoAParticle (PTD const& ptd, long i) : // Note: should this be int instead?
382  {
383  }
384 
385  static Long the_next_id;
386 
387  //functions to get id and cpu in the SOA data
388 
391 
394 
396  uint64_t& idcpu () & { return this->m_particle_tile_data.m_idcpu[m_index]; }
397 
400 
403 
405  const uint64_t& idcpu () const & { return this->m_particle_tile_data.m_idcpu[m_index]; }
406 
407  //functions to get positions of the particle in the SOA data
408 
410  RealVect pos () const & {return RealVect(AMREX_D_DECL(this->m_particle_tile_data.m_rdata[0][m_index], this->m_particle_tile_data.m_rdata[1][m_index], this->m_particle_tile_data.m_rdata[2][m_index]));}
411 
413  RealType& pos (int position_index) &
414  {
415  AMREX_ASSERT(position_index < AMREX_SPACEDIM);
416  return this->m_particle_tile_data.m_rdata[position_index][m_index];
417  }
418 
420  RealType pos (int position_index) const &
421  {
422  AMREX_ASSERT(position_index < AMREX_SPACEDIM);
423  return this->m_particle_tile_data.m_rdata[position_index][m_index];
424  }
425 
426  static Long NextID ();
427 
431  static Long UnprotectedNextID ();
432 
438  static void NextID (Long nextid);
439 
440 private :
441 
442  static_assert(std::is_trivially_copyable<ParticleTileData<SoAParticleBase, NArrayReal, NArrayInt>>(), "ParticleTileData is not trivially copyable");
443 
445  int m_index;
446 };
447 
448 //template <int NArrayReal, int NArrayInt> Long ConstSoAParticle<NArrayReal, NArrayInt>::the_next_id = 1;
449 template <int NArrayReal, int NArrayInt> Long SoAParticle<NArrayReal, NArrayInt>::the_next_id = 1;
450 
451 template <int NArrayReal, int NArrayInt>
452 Long
454 {
455  Long next;
456 // we should be able to test on _OPENMP < 201107 for capture (version 3.1)
457 // but we must work around a bug in gcc < 4.9
458 #if defined(AMREX_USE_OMP) && defined(_OPENMP) && _OPENMP < 201307
459 #pragma omp critical (amrex_particle_nextid)
460 #elif defined(AMREX_USE_OMP)
461 #pragma omp atomic capture
462 #endif
463  next = the_next_id++;
464 
465  if (next > LongParticleIds::LastParticleID) {
466  amrex::Abort("SoAParticle<NArrayReal, NArrayInt>::NextID() -- too many particles");
467  }
468 
469  return next;
470 }
471 
472 template <int NArrayReal, int NArrayInt>
473 Long
475 {
476  Long next = the_next_id++;
477  if (next > LongParticleIds::LastParticleID) {
478  amrex::Abort("SoAParticle<NArrayReal, NArrayInt>::NextID() -- too many particles");
479  }
480  return next;
481 }
482 
483 template <int NArrayReal, int NArrayInt>
484 void
486 {
487  the_next_id = nextid;
488 }
489 
490 template <typename T_ParticleType, int NArrayReal, int NArrayInt>
492 {
493  static constexpr int NAR = NArrayReal;
494  static constexpr int NAI = NArrayInt;
495  using ParticleType = T_ParticleType;
496  using ParticleRefType = T_ParticleType const&;
497 
498  static constexpr int NStructReal = ParticleType::NReal;
499  static constexpr int NStructInt = ParticleType::NInt;
500 
502 
503  static constexpr bool is_particle_tile_data = true;
504 
505  Long m_size;
506 
507  using AOS_PTR = std::conditional_t<T_ParticleType::is_soa_particle,
508  void const * AMREX_RESTRICT, ParticleType const * AMREX_RESTRICT>;
510 
511  const uint64_t* m_idcpu;
514 
516  const ParticleReal& pos (const int dir, const int index) const &
517  {
518  if constexpr(!ParticleType::is_soa_particle) {
519  return this->m_aos[index].pos(dir);
520  } else {
521  return this->m_rdata[dir][index];
522  }
523  }
524 
526  decltype(auto) id (const int index) const &
527  {
528  if constexpr(!ParticleType::is_soa_particle) {
529  return this->m_aos[index].id();
530  } else {
531  return ConstParticleIDWrapper(this->m_idcpu[index]);
532  }
533  }
534 
536  decltype(auto) cpu (const int index) const &
537  {
538  if constexpr(!ParticleType::is_soa_particle) {
539  return this->m_aos[index].cpu();
540  } else {
541  return ConstParticleCPUWrapper(this->m_idcpu[index]);
542  }
543  }
544 
546  decltype(auto) idcpu (const int index) const &
547  {
548  if constexpr(ParticleType::is_soa_particle) {
549  return this->m_idcpu[index];
550  } else {
551  amrex::Abort("not implemented");
552  }
553  }
554 
556  const ParticleReal * rdata (const int attribute_index) const
557  {
558  return this->m_rdata[attribute_index];
559  }
560 
562  const int * idata (const int attribute_index) const
563  {
564  return this->m_idata[attribute_index];
565  }
566 
568  decltype(auto) operator[] (const int index) const
569  {
570  if constexpr (!ParticleType::is_soa_particle) {
571  return m_aos[index];
572  } else {
573  return ConstSoAParticle<NAR, NAI>(*this, index);
574  }
575  }
576 
581 
583  void packParticleData(char* buffer, int src_index, Long dst_offset,
584  const int* comm_real, const int * comm_int) const noexcept
585  {
586  AMREX_ASSERT(src_index < m_size);
587  auto* dst = buffer + dst_offset;
588  if constexpr (!ParticleType::is_soa_particle) {
589  memcpy(dst, m_aos + src_index, sizeof(ParticleType));
590  dst += sizeof(ParticleType);
591  } else {
592  memcpy(dst, m_idcpu + src_index, sizeof(uint64_t));
593  dst += sizeof(uint64_t);
594  }
595  int array_start_index = AMREX_SPACEDIM + NStructReal;
596  for (int i = 0; i < NArrayReal; ++i)
597  {
598  if (comm_real[array_start_index + i])
599  {
600  memcpy(dst, m_rdata[i] + src_index, sizeof(ParticleReal));
601  dst += sizeof(ParticleReal);
602  }
603  }
604  int runtime_start_index = AMREX_SPACEDIM + NStructReal + NArrayReal;
605  for (int i = 0; i < m_num_runtime_real; ++i)
606  {
607  if (comm_real[runtime_start_index + i])
608  {
609  memcpy(dst, m_runtime_rdata[i] + src_index, sizeof(ParticleReal));
610  dst += sizeof(ParticleReal);
611  }
612  }
613  array_start_index = 2 + NStructInt;
614  for (int i = 0; i < NArrayInt; ++i)
615  {
616  if (comm_int[array_start_index + i])
617  {
618  memcpy(dst, m_idata[i] + src_index, sizeof(int));
619  dst += sizeof(int);
620  }
621  }
622  runtime_start_index = 2 + NStructInt + NArrayInt;
623  for (int i = 0; i < m_num_runtime_int; ++i)
624  {
625  if (comm_int[runtime_start_index + i])
626  {
627  memcpy(dst, m_runtime_idata[i] + src_index, sizeof(int));
628  dst += sizeof(int);
629  }
630  }
631  }
632 
633  template <typename T = ParticleType, std::enable_if_t<!T::is_soa_particle, int> = 0>
635  SuperParticleType getSuperParticle (int index) const noexcept
636  {
637  AMREX_ASSERT(index < m_size);
639  for (int i = 0; i < AMREX_SPACEDIM; ++i) {
640  sp.pos(i) = m_aos[index].pos(i);
641  }
642  for (int i = 0; i < NStructReal; ++i) {
643  sp.rdata(i) = m_aos[index].rdata(i);
644  }
645  if constexpr(NArrayReal > 0) {
646  for (int i = 0; i < NArrayReal; ++i) {
647  sp.rdata(NStructReal+i) = m_rdata[i][index];
648  }
649  }
650  sp.id() = m_aos[index].id();
651  sp.cpu() = m_aos[index].cpu();
652  for (int i = 0; i < NStructInt; ++i) {
653  sp.idata(i) = m_aos[index].idata(i);
654  }
655  if constexpr(NArrayInt > 0) {
656  for (int i = 0; i < NArrayInt; ++i) {
657  sp.idata(NStructInt+i) = m_idata[i][index];
658  }
659  }
660  return sp;
661  }
662 
663  template <typename T = ParticleType, std::enable_if_t<T::is_soa_particle, int> = 0>
665  SuperParticleType getSuperParticle (int index) const noexcept
666  {
667  AMREX_ASSERT(index < m_size);
669  for (int i = 0; i < AMREX_SPACEDIM; ++i) {sp.pos(i) = m_rdata[i][index];}
670  sp.m_idcpu = m_idcpu[index];
671  for (int i = 0; i < NAR; ++i) {
672  sp.rdata(i) = m_rdata[i][index];
673  }
674  for (int i = 0; i < NAI; ++i) {
675  sp.idata(i) = m_idata[i][index];
676  }
677  return sp;
678  }
679 };
680 
682 
685 };
686 
687 template <typename T_ParticleType, int NArrayReal, int NArrayInt,
688  template<class> class Allocator=DefaultAllocator>
690 {
691  template <typename T>
692  using AllocatorType = Allocator<T>;
693 
694  using ParticleType = T_ParticleType;
695  static constexpr int NAR = NArrayReal;
696  static constexpr int NAI = NArrayInt;
697  using RealType = typename ParticleType::RealType;
698 
699  static constexpr int NStructReal = ParticleType::NReal;
700  static constexpr int NStructInt = ParticleType::NInt;
701 
703 
704  using AoS = std::conditional_t<
705  ParticleType::is_soa_particle,
708  //using ParticleVector = typename AoS::ParticleVector;
709 
710  using SoA = std::conditional_t<
711  ParticleType::is_soa_particle,
714  using RealVector = typename SoA::RealVector;
715  using IntVector = typename SoA::IntVector;
716  using StorageParticleType = typename ParticleType::StorageParticleType;
717 
720 
721  ParticleTile () = default;
722 
723 #ifndef _WIN32 // workaround windows compiler bug
724  ~ParticleTile () = default;
725 
726  ParticleTile (ParticleTile const&) = delete;
727  ParticleTile (ParticleTile &&) noexcept = default;
728 
729  ParticleTile& operator= (ParticleTile const&) = delete;
730  ParticleTile& operator= (ParticleTile &&) noexcept = default;
731 #endif
732 
733  void define (int a_num_runtime_real, int a_num_runtime_int)
734  {
735  m_defined = true;
736  GetStructOfArrays().define(a_num_runtime_real, a_num_runtime_int);
737  m_runtime_r_ptrs.resize(a_num_runtime_real);
738  m_runtime_i_ptrs.resize(a_num_runtime_int);
739  m_runtime_r_cptrs.resize(a_num_runtime_real);
740  m_runtime_i_cptrs.resize(a_num_runtime_int);
741  }
742 
743  // Get id data
744  decltype(auto) id (int index) & {
745  if constexpr (!ParticleType::is_soa_particle) {
746  return m_aos_tile[index].id();
747  } else {
748  return ParticleIDWrapper(m_soa_tile.GetIdCPUData()[index]);
749  }
750  }
751 
752  // const
753  decltype(auto) id (int index) const & {
754  if constexpr (!ParticleType::is_soa_particle) {
755  return m_aos_tile[index].id();
756  } else {
757  return ConstParticleIDWrapper(m_soa_tile.GetIdCPUData()[index]);
758  }
759  }
760 
761  // Get cpu data
762  decltype(auto) cpu (int index) & {
763  if constexpr (!ParticleType::is_soa_particle) {
764  return m_aos_tile[index].cpu();
765  } else {
766  return ParticleCPUWrapper(m_soa_tile.GetIdCPUData()[index]);
767  }
768  }
769 
770  // const
771  decltype(auto) cpu (int index) const & {
772  if constexpr (!ParticleType::is_soa_particle) {
773  return m_aos_tile[index].cpu();
774  } else {
775  return ConstParticleCPUWrapper(m_soa_tile.GetIdCPUData()[index]);
776  }
777  }
778 
779  // Get positions data
780  RealType& pos (int index, int position_index) & {
781  if constexpr (!ParticleType::is_soa_particle) {
782  return m_aos_tile[index].pos(position_index);
783  } else {
784  static_assert(NArrayReal == ParticleType::PTD::NAR, "ParticleTile mismatch in R");
785  static_assert(NArrayInt == ParticleType::PTD::NAI, "ParticleTile mismatch in I");
786  static_assert(0 == ParticleType::StorageParticleType::NReal, "ParticleTile 2 mismatch in R");
787  static_assert(0 == ParticleType::StorageParticleType::NInt, "ParticleTile 2 mismatch in I");
788 
789  return m_soa_tile.GetRealData(position_index)[index];
790  }
791  }
792 
793  // const
794  RealType pos (int index, int position_index) const &
795  {
796  if constexpr (!ParticleType::is_soa_particle) {
797  return m_aos_tile[index].pos(position_index);
798  } else {
799  return m_soa_tile.GetRealData(position_index)[index];
800  }
801  }
802 
804  const AoS& GetArrayOfStructs () const { return m_aos_tile; }
805 
807  const SoA& GetStructOfArrays () const { return m_soa_tile; }
808 
809  bool empty () const { return size() == 0; }
810 
815  std::size_t size () const
816  {
817  if constexpr (!ParticleType::is_soa_particle) {
818  return m_aos_tile.size();
819  } else {
820  return m_soa_tile.size();
821  }
822  }
823 
828  int numParticles () const
829  {
830  if constexpr (!ParticleType::is_soa_particle) {
831  return m_aos_tile.numParticles();
832  } else {
833  return m_soa_tile.numParticles();
834  }
835  }
836 
841  int numRealParticles () const
842  {
843  if constexpr (!ParticleType::is_soa_particle) {
844  return m_aos_tile.numRealParticles();
845  } else {
846  return m_soa_tile.numRealParticles();
847  }
848  }
849 
854  int numNeighborParticles () const
855  {
856  if constexpr (!ParticleType::is_soa_particle) {
857  return m_aos_tile.numNeighborParticles();
858  } else {
859  return m_soa_tile.numNeighborParticles();
860  }
861  }
862 
867  int numTotalParticles () const
868  {
869  if constexpr (!ParticleType::is_soa_particle) {
870  return m_aos_tile.numTotalParticles();
871  } else {
872  return m_soa_tile.numTotalParticles();
873  }
874  }
875 
876  void setNumNeighbors (int num_neighbors)
877  {
878  if constexpr(!ParticleType::is_soa_particle) {
879  m_aos_tile.setNumNeighbors(num_neighbors);
880  }
881  m_soa_tile.setNumNeighbors(num_neighbors);
882  }
883 
884  int getNumNeighbors () const
885  {
886  if constexpr (!ParticleType::is_soa_particle) {
887  AMREX_ASSERT( m_soa_tile.getNumNeighbors() == m_aos_tile.getNumNeighbors() );
888  return m_aos_tile.getNumNeighbors();
889  } else {
890  return m_soa_tile.getNumNeighbors();
891  }
892  }
893 
894  void resize (std::size_t count)
895  {
896  if constexpr (!ParticleType::is_soa_particle) {
897  m_aos_tile.resize(count);
898  }
899  m_soa_tile.resize(count);
900  }
901 
905  template <typename T = ParticleType, std::enable_if_t<!T::is_soa_particle, int> = 0>
906  void push_back (const ParticleType& p) { m_aos_tile().push_back(p); }
907 
911  template < int NR = NArrayReal, int NI = NArrayInt,
912  std::enable_if_t<NR != 0 || NI != 0, int> foo = 0>
913  void push_back (const SuperParticleType& sp)
914  {
915  auto np = numParticles();
916 
917  if constexpr (!ParticleType::is_soa_particle) {
918  m_aos_tile.resize(np+1);
919  for (int i = 0; i < AMREX_SPACEDIM; ++i) {
920  m_aos_tile[np].pos(i) = sp.pos(i);
921  }
922  for (int i = 0; i < NStructReal; ++i) {
923  m_aos_tile[np].rdata(i) = sp.rdata(i);
924  }
925  m_aos_tile[np].id() = sp.id();
926  m_aos_tile[np].cpu() = sp.cpu();
927  for (int i = 0; i < NStructInt; ++i) {
928  m_aos_tile[np].idata(i) = sp.idata(i);
929  }
930  }
931 
932  m_soa_tile.resize(np+1);
933  if constexpr (ParticleType::is_soa_particle) {
934  m_soa_tile.GetIdCPUData()[np] = sp.m_idcpu;
935  }
936  auto& arr_rdata = m_soa_tile.GetRealData();
937  auto& arr_idata = m_soa_tile.GetIntData();
938  for (int i = 0; i < NArrayReal; ++i) {
939  arr_rdata[i][np] = sp.rdata(NStructReal+i);
940  }
941  for (int i = 0; i < NArrayInt; ++i) {
942  arr_idata[i][np] = sp.idata(NStructInt+i);
943  }
944  }
945 
950  void push_back_real (int comp, ParticleReal v) {
951  m_soa_tile.GetRealData(comp).push_back(v);
952  }
953 
958  void push_back_real (const std::array<ParticleReal, NArrayReal>& v) {
959  for (int i = 0; i < NArrayReal; ++i) {
960  m_soa_tile.GetRealData(i).push_back(v[i]);
961  }
962  }
963 
968  void push_back_real (int comp, const ParticleReal* beg, const ParticleReal* end) {
969  auto it = m_soa_tile.GetRealData(comp).end();
970  m_soa_tile.GetRealData(comp).insert(it, beg, end);
971  }
972 
978  push_back_real(comp, &(*beg), &(*end));
979  }
980 
985  void push_back_real (int comp, amrex::Vector<amrex::ParticleReal> const & vec) {
986  push_back_real(comp, vec.cbegin(), vec.cend());
987  }
988 
993  void push_back_real (int comp, std::size_t npar, ParticleReal v) {
994  auto new_size = m_soa_tile.GetRealData(comp).size() + npar;
995  m_soa_tile.GetRealData(comp).resize(new_size, v);
996  }
997 
1002  void push_back_int (int comp, int v) {
1003  m_soa_tile.GetIntData(comp).push_back(v);
1004  }
1005 
1010  void push_back_int (const std::array<int, NArrayInt>& v) {
1011  for (int i = 0; i < NArrayInt; ++i) {
1012  m_soa_tile.GetIntData(i).push_back(v[i]);
1013  }
1014  }
1015 
1020  void push_back_int (int comp, const int* beg, const int* end) {
1021  auto it = m_soa_tile.GetIntData(comp).end();
1022  m_soa_tile.GetIntData(comp).insert(it, beg, end);
1023  }
1024 
1030  push_back_int(comp, &(*beg), &(*end));
1031  }
1032 
1037  void push_back_int (int comp, amrex::Vector<int> const & vec) {
1038  push_back_int(comp, vec.cbegin(), vec.cend());
1039  }
1040 
1045  void push_back_int (int comp, std::size_t npar, int v) {
1046  auto new_size = m_soa_tile.GetIntData(comp).size() + npar;
1047  m_soa_tile.GetIntData(comp).resize(new_size, v);
1048  }
1049 
1050  int NumRealComps () const noexcept { return m_soa_tile.NumRealComps(); }
1051 
1052  int NumIntComps () const noexcept { return m_soa_tile.NumIntComps(); }
1053 
1054  int NumRuntimeRealComps () const noexcept { return m_runtime_r_ptrs.size(); }
1055 
1056  int NumRuntimeIntComps () const noexcept { return m_runtime_i_ptrs.size(); }
1057 
1059  {
1060  if constexpr (ParticleType::is_soa_particle) {
1061  GetStructOfArrays().GetIdCPUData().shrink_to_fit();
1062  } else {
1063  m_aos_tile().shrink_to_fit();
1064  }
1065  for (int j = 0; j < NumRealComps(); ++j)
1066  {
1067  auto& rdata = GetStructOfArrays().GetRealData(j);
1068  rdata.shrink_to_fit();
1069  }
1070 
1071  for (int j = 0; j < NumIntComps(); ++j)
1072  {
1073  auto& idata = GetStructOfArrays().GetIntData(j);
1074  idata.shrink_to_fit();
1075  }
1076  }
1077 
1078  Long capacity () const
1079  {
1080  Long nbytes = 0;
1081  if constexpr (ParticleType::is_soa_particle) {
1082  nbytes += GetStructOfArrays().GetIdCPUData().capacity() * sizeof(uint64_t);
1083  } else {
1084  nbytes += m_aos_tile().capacity() * sizeof(ParticleType);
1085  }
1086  for (int j = 0; j < NumRealComps(); ++j)
1087  {
1088  auto& rdata = GetStructOfArrays().GetRealData(j);
1089  nbytes += rdata.capacity() * sizeof(ParticleReal);
1090  }
1091 
1092  for (int j = 0; j < NumIntComps(); ++j)
1093  {
1094  auto& idata = GetStructOfArrays().GetIntData(j);
1095  nbytes += idata.capacity()*sizeof(int);
1096  }
1097  return nbytes;
1098  }
1099 
1101  {
1102  if constexpr (ParticleType::is_soa_particle) {
1103  GetStructOfArrays().GetIdCPUData().swap(other.GetStructOfArrays().GetIdCPUData());
1104  } else {
1105  m_aos_tile().swap(other.GetArrayOfStructs()());
1106  }
1107  for (int j = 0; j < NumRealComps(); ++j)
1108  {
1109  auto& rdata = GetStructOfArrays().GetRealData(j);
1110  rdata.swap(other.GetStructOfArrays().GetRealData(j));
1111  }
1112 
1113  for (int j = 0; j < NumIntComps(); ++j)
1114  {
1115  auto& idata = GetStructOfArrays().GetIntData(j);
1116  idata.swap(other.GetStructOfArrays().GetIntData(j));
1117  }
1118  }
1119 
1121  {
1122  m_runtime_r_ptrs.resize(m_soa_tile.NumRealComps() - NArrayReal);
1123  m_runtime_i_ptrs.resize(m_soa_tile.NumIntComps() - NArrayInt);
1124 #ifdef AMREX_USE_GPU
1125  bool copy_real = false;
1126  m_h_runtime_r_ptrs.resize(m_soa_tile.NumRealComps() - NArrayReal, nullptr);
1127  for (std::size_t i = 0; i < m_h_runtime_r_ptrs.size(); ++i) {
1128  if (m_h_runtime_r_ptrs[i] != m_soa_tile.GetRealData(i + NArrayReal).dataPtr()) {
1129  m_h_runtime_r_ptrs[i] = m_soa_tile.GetRealData(i + NArrayReal).dataPtr();
1130  copy_real = true;
1131  }
1132  }
1133  if (copy_real) {
1135  m_h_runtime_r_ptrs.size()*sizeof(ParticleReal*));
1136  }
1137 
1138  bool copy_int = false;
1139  m_h_runtime_i_ptrs.resize(m_soa_tile.NumIntComps() - NArrayInt, nullptr);
1140  for (std::size_t i = 0; i < m_h_runtime_i_ptrs.size(); ++i) {
1141  if (m_h_runtime_i_ptrs[i] != m_soa_tile.GetIntData(i + NArrayInt).dataPtr()) {
1142  m_h_runtime_i_ptrs[i] = m_soa_tile.GetIntData(i + NArrayInt).dataPtr();
1143  copy_int = true;
1144  }
1145  }
1146  if (copy_int) {
1148  m_h_runtime_i_ptrs.size()*sizeof(int*));
1149  }
1150 #else
1151  for (std::size_t i = 0; i < m_runtime_r_ptrs.size(); ++i) {
1152  m_runtime_r_ptrs[i] = m_soa_tile.GetRealData(i + NArrayReal).dataPtr();
1153  }
1154 
1155  for (std::size_t i = 0; i < m_runtime_i_ptrs.size(); ++i) {
1156  m_runtime_i_ptrs[i] = m_soa_tile.GetIntData(i + NArrayInt).dataPtr();
1157  }
1158 #endif
1159 
1161  if constexpr (!ParticleType::is_soa_particle) {
1162  ptd.m_aos = m_aos_tile().dataPtr();
1163  } else {
1164  ptd.m_aos = nullptr;
1165  }
1166  if constexpr (ParticleType::is_soa_particle) {
1167  ptd.m_idcpu = m_soa_tile.GetIdCPUData().dataPtr();
1168  } else {
1169  ptd.m_idcpu = nullptr;
1170  }
1171  if constexpr(NArrayReal > 0) {
1172  for (int i = 0; i < NArrayReal; ++i) {
1173  ptd.m_rdata[i] = m_soa_tile.GetRealData(i).dataPtr();
1174  }
1175  }
1176  if constexpr(NArrayInt > 0) {
1177  for (int i = 0; i < NArrayInt; ++i) {
1178  ptd.m_idata[i] = m_soa_tile.GetIntData(i).dataPtr();
1179  }
1180  }
1181  ptd.m_size = size();
1182  ptd.m_num_runtime_real = m_runtime_r_ptrs.size();
1183  ptd.m_num_runtime_int = m_runtime_i_ptrs.size();
1184  ptd.m_runtime_rdata = m_runtime_r_ptrs.dataPtr();
1185  ptd.m_runtime_idata = m_runtime_i_ptrs.dataPtr();
1186 
1187 #ifdef AMREX_USE_GPU
1188  if (copy_real || copy_int) {
1190  }
1191 #endif
1192 
1193  return ptd;
1194  }
1195 
1197  {
1198  m_runtime_r_cptrs.resize(m_soa_tile.NumRealComps() - NArrayReal);
1199  m_runtime_i_cptrs.resize(m_soa_tile.NumIntComps() - NArrayInt);
1200 #ifdef AMREX_USE_GPU
1201  bool copy_real = false;
1202  m_h_runtime_r_cptrs.resize(m_soa_tile.NumRealComps() - NArrayReal, nullptr);
1203  for (std::size_t i = 0; i < m_h_runtime_r_cptrs.size(); ++i) {
1204  if (m_h_runtime_r_cptrs[i] != m_soa_tile.GetRealData(i + NArrayReal).dataPtr()) {
1205  m_h_runtime_r_cptrs[i] = m_soa_tile.GetRealData(i + NArrayReal).dataPtr();
1206  copy_real = true;
1207  }
1208  }
1209  if (copy_real) {
1211  m_h_runtime_r_cptrs.size()*sizeof(ParticleReal*));
1212  }
1213 
1214  bool copy_int = false;
1215  m_h_runtime_i_cptrs.resize(m_soa_tile.NumIntComps() - NArrayInt, nullptr);
1216  for (std::size_t i = 0; i < m_h_runtime_i_cptrs.size(); ++i) {
1217  if (m_h_runtime_i_cptrs[i] != m_soa_tile.GetIntData(i + NArrayInt).dataPtr()) {
1218  m_h_runtime_i_cptrs[i] = m_soa_tile.GetIntData(i + NArrayInt).dataPtr();
1219  copy_int = true;
1220  }
1221  }
1222  if (copy_int) {
1224  m_h_runtime_i_cptrs.size()*sizeof(int*));
1225  }
1226 #else
1227  for (std::size_t i = 0; i < m_runtime_r_cptrs.size(); ++i) {
1228  m_runtime_r_cptrs[i] = m_soa_tile.GetRealData(i + NArrayReal).dataPtr();
1229  }
1230 
1231  for (std::size_t i = 0; i < m_runtime_i_cptrs.size(); ++i) {
1232  m_runtime_i_cptrs[i] = m_soa_tile.GetIntData(i + NArrayInt).dataPtr();
1233  }
1234 #endif
1235 
1237  if constexpr (!ParticleType::is_soa_particle) {
1238  ptd.m_aos = m_aos_tile().dataPtr();
1239  } else {
1240  ptd.m_aos = nullptr;
1241  }
1242  if constexpr (ParticleType::is_soa_particle) {
1243  ptd.m_idcpu = m_soa_tile.GetIdCPUData().dataPtr();
1244  } else {
1245  ptd.m_idcpu = nullptr;
1246  }
1247  if constexpr(NArrayReal > 0) {
1248  for (int i = 0; i < NArrayReal; ++i) {
1249  ptd.m_rdata[i] = m_soa_tile.GetRealData(i).dataPtr();
1250  }
1251  }
1252  if constexpr(NArrayInt > 0) {
1253  for (int i = 0; i < NArrayInt; ++i) {
1254  ptd.m_idata[i] = m_soa_tile.GetIntData(i).dataPtr();
1255  }
1256  }
1257  ptd.m_size = size();
1259  ptd.m_num_runtime_int = m_runtime_i_cptrs.size();
1260  ptd.m_runtime_rdata = m_runtime_r_cptrs.dataPtr();
1261  ptd.m_runtime_idata = m_runtime_i_cptrs.dataPtr();
1262 
1263 #ifdef AMREX_USE_GPU
1264  if (copy_real || copy_int) {
1266  }
1267 #endif
1268 
1269  return ptd;
1270  }
1271 
1272 private:
1273 
1276 
1277  bool m_defined = false;
1278 
1281 
1284 
1287 
1290 };
1291 
1292 } // namespace amrex
1293 
1294 #endif // AMREX_PARTICLETILE_H_
#define AMREX_ASSERT(EX)
Definition: AMReX_BLassert.H:38
#define AMREX_FORCE_INLINE
Definition: AMReX_Extension.H:119
#define AMREX_RESTRICT
Definition: AMReX_Extension.H:37
#define AMREX_GPU_HOST_DEVICE
Definition: AMReX_GpuQualifiers.H:20
#define AMREX_D_DECL(a, b, c)
Definition: AMReX_SPACE.H:104
Definition: AMReX_GpuAllocators.H:114
Definition: AMReX_ArrayOfStructs.H:13
Definition: AMReX_PODVector.H:246
A Real vector in SpaceDim-dimensional space.
Definition: AMReX_RealVect.H:32
This class is a thin wrapper around std::vector. Unlike vector, Vector::operator[] provides bound che...
Definition: AMReX_Vector.H:27
void streamSynchronize() noexcept
Definition: AMReX_GpuDevice.H:237
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void * memcpy(void *dest, const void *src, std::size_t count)
Definition: AMReX_GpuUtility.H:214
void htod_memcpy_async(void *p_d, const void *p_h, const std::size_t sz) noexcept
Definition: AMReX_GpuDevice.H:251
constexpr Long LastParticleID
Definition: AMReX_Particle.H:20
Definition: AMReX_Amr.cpp:49
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE Dim3 end(BoxND< dim > const &box) noexcept
Definition: AMReX_Box.H:1890
void Abort(const std::string &msg)
Print out message to cerr and exit via abort().
Definition: AMReX.cpp:221
const int[]
Definition: AMReX_BLProfiler.cpp:1664
Definition: AMReX_Particle.H:222
Definition: AMReX_Particle.H:188
static constexpr bool is_particle_tile_data
Definition: AMReX_ParticleTile.H:503
static constexpr int NAI
Definition: AMReX_ParticleTile.H:494
GpuArray< const int *, NArrayInt > m_idata
Definition: AMReX_ParticleTile.H:513
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE SuperParticleType getSuperParticle(int index) const noexcept
Definition: AMReX_ParticleTile.H:635
const ParticleReal *AMREX_RESTRICT *AMREX_RESTRICT m_runtime_rdata
Definition: AMReX_ParticleTile.H:579
AMREX_GPU_HOST_DEVICEdecltype(auto) AMREX_FORCE_INLINE id(const int index) const &
Definition: AMReX_ParticleTile.H:526
const int *AMREX_RESTRICT *AMREX_RESTRICT m_runtime_idata
Definition: AMReX_ParticleTile.H:580
Long m_size
Definition: AMReX_ParticleTile.H:505
T_ParticleType ParticleType
Definition: AMReX_ParticleTile.H:495
static constexpr int NStructReal
Definition: AMReX_ParticleTile.H:498
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE const ParticleReal * rdata(const int attribute_index) const
Definition: AMReX_ParticleTile.H:556
int m_num_runtime_real
Definition: AMReX_ParticleTile.H:577
static constexpr int NStructInt
Definition: AMReX_ParticleTile.H:499
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE const int * idata(const int attribute_index) const
Definition: AMReX_ParticleTile.H:562
int m_num_runtime_int
Definition: AMReX_ParticleTile.H:578
std::conditional_t< T_ParticleType::is_soa_particle, void const *AMREX_RESTRICT, ParticleType const *AMREX_RESTRICT > AOS_PTR
Definition: AMReX_ParticleTile.H:508
T_ParticleType const & ParticleRefType
Definition: AMReX_ParticleTile.H:496
static constexpr int NAR
Definition: AMReX_ParticleTile.H:493
AMREX_GPU_HOST_DEVICEdecltype(auto) AMREX_FORCE_INLINE idcpu(const int index) const &
Definition: AMReX_ParticleTile.H:546
AOS_PTR m_aos
Definition: AMReX_ParticleTile.H:509
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE const ParticleReal & pos(const int dir, const int index) const &
Definition: AMReX_ParticleTile.H:516
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void packParticleData(char *buffer, int src_index, Long dst_offset, const int *comm_real, const int *comm_int) const noexcept
Definition: AMReX_ParticleTile.H:583
const uint64_t * m_idcpu
Definition: AMReX_ParticleTile.H:511
AMREX_GPU_HOST_DEVICEdecltype(auto) AMREX_FORCE_INLINE cpu(const int index) const &
Definition: AMReX_ParticleTile.H:536
GpuArray< const ParticleReal *, NArrayReal > m_rdata
Definition: AMReX_ParticleTile.H:512
Definition: AMReX_ParticleTile.H:306
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE const RealType & pos(int position_index) const &
Definition: AMReX_ParticleTile.H:338
static constexpr int NArrayReal
Definition: AMReX_ParticleTile.H:307
ParticleReal RealType
Definition: AMReX_ParticleTile.H:314
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE ConstParticleCPUWrapper cpu() const
Definition: AMReX_ParticleTile.H:327
static constexpr int NArrayInt
Definition: AMReX_ParticleTile.H:308
ConstPTD m_constparticle_tile_data
Definition: AMReX_ParticleTile.H:360
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE RealVect pos() const &
Definition: AMReX_ParticleTile.H:335
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE ConstParticleIDWrapper id() const
Definition: AMReX_ParticleTile.H:330
static void NextID(Long nextid)
Reset on restart.
int m_index
Definition: AMReX_ParticleTile.H:363
static constexpr bool is_constsoa_particle
Definition: AMReX_ParticleTile.H:312
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE ConstSoAParticle(ConstPTD const &ptd, long i)
Definition: AMReX_ParticleTile.H:317
static Long UnprotectedNextID()
This version can only be used inside omp critical.
uint64_t m_idcpu
Definition: AMReX_Particle.H:252
Definition: AMReX_Particle.H:140
Definition: AMReX_Particle.H:37
Definition: AMReX_ParticleTile.H:29
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void unpackParticleData(const char *buffer, Long src_offset, int dst_index, const int *comm_real, const int *comm_int) const noexcept
Definition: AMReX_ParticleTile.H:173
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void setSuperParticle(const SuperParticleType &sp, int index) const noexcept
Definition: AMReX_ParticleTile.H:268
T_ParticleType & ParticleRefType
Definition: AMReX_ParticleTile.H:34
uint64_t * m_idcpu
Definition: AMReX_ParticleTile.H:50
GpuArray< ParticleReal *, NAR > m_rdata
Definition: AMReX_ParticleTile.H:51
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE SuperParticleType getSuperParticle(int index) const noexcept
Definition: AMReX_ParticleTile.H:225
AMREX_GPU_HOST_DEVICEdecltype(auto) AMREX_FORCE_INLINE idcpu(const int index) const &
Definition: AMReX_ParticleTile.H:90
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE ParticleReal & pos(const int dir, const int index) const &
Definition: AMReX_ParticleTile.H:60
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE ParticleReal * rdata(const int attribute_index) const
Definition: AMReX_ParticleTile.H:100
static constexpr int NStructInt
Definition: AMReX_ParticleTile.H:38
GpuArray< int *, NAI > m_idata
Definition: AMReX_ParticleTile.H:52
T_ParticleType ParticleType
Definition: AMReX_ParticleTile.H:33
std::conditional_t< T_ParticleType::is_soa_particle, void *AMREX_RESTRICT, ParticleType *AMREX_RESTRICT > AOS_PTR
Definition: AMReX_ParticleTile.H:47
int m_num_runtime_int
Definition: AMReX_ParticleTile.H:55
Long m_size
Definition: AMReX_ParticleTile.H:44
static constexpr int NAR
Definition: AMReX_ParticleTile.H:30
ParticleReal *AMREX_RESTRICT *AMREX_RESTRICT m_runtime_rdata
Definition: AMReX_ParticleTile.H:56
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void packParticleData(char *buffer, int src_index, std::size_t dst_offset, const int *comm_real, const int *comm_int) const noexcept
Definition: AMReX_ParticleTile.H:122
int m_num_runtime_real
Definition: AMReX_ParticleTile.H:54
static constexpr bool is_particle_tile_data
Definition: AMReX_ParticleTile.H:42
AMREX_GPU_HOST_DEVICEdecltype(auto) AMREX_FORCE_INLINE cpu(const int index) const &
Definition: AMReX_ParticleTile.H:80
AOS_PTR m_aos
Definition: AMReX_ParticleTile.H:48
int *AMREX_RESTRICT *AMREX_RESTRICT m_runtime_idata
Definition: AMReX_ParticleTile.H:57
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE int * idata(const int attribute_index) const
Definition: AMReX_ParticleTile.H:106
static constexpr int NAI
Definition: AMReX_ParticleTile.H:31
static constexpr int NStructReal
Definition: AMReX_ParticleTile.H:37
AMREX_GPU_HOST_DEVICEdecltype(auto) AMREX_FORCE_INLINE id(const int index) const &
Definition: AMReX_ParticleTile.H:70
Definition: AMReX_ParticleTile.H:690
typename ParticleType::StorageParticleType StorageParticleType
Definition: AMReX_ParticleTile.H:716
int NumRealComps() const noexcept
Definition: AMReX_ParticleTile.H:1050
const AoS & GetArrayOfStructs() const
Definition: AMReX_ParticleTile.H:804
void push_back_real(int comp, amrex::Vector< amrex::ParticleReal > const &vec)
Definition: AMReX_ParticleTile.H:985
int NumIntComps() const noexcept
Definition: AMReX_ParticleTile.H:1052
typename ParticleType::RealType RealType
Definition: AMReX_ParticleTile.H:697
ParticleTile()=default
int getNumNeighbors() const
Definition: AMReX_ParticleTile.H:884
AoS & GetArrayOfStructs()
Definition: AMReX_ParticleTile.H:803
amrex::PODVector< const int *, Allocator< const int * > > m_runtime_i_cptrs
Definition: AMReX_ParticleTile.H:1283
void push_back(const ParticleType &p)
Definition: AMReX_ParticleTile.H:906
ParticleTile(ParticleTile const &)=delete
std::conditional_t< ParticleType::is_soa_particle, StructOfArrays< NArrayReal, NArrayInt, Allocator, true >, StructOfArrays< NArrayReal, NArrayInt, Allocator, false > > SoA
Definition: AMReX_ParticleTile.H:713
static constexpr int NAI
Definition: AMReX_ParticleTile.H:696
ParticleTile(ParticleTile &&) noexcept=default
void push_back_real(int comp, const ParticleReal *beg, const ParticleReal *end)
Definition: AMReX_ParticleTile.H:968
static constexpr int NStructInt
Definition: AMReX_ParticleTile.H:700
amrex::Gpu::HostVector< const ParticleReal * > m_h_runtime_r_cptrs
Definition: AMReX_ParticleTile.H:1288
void setNumNeighbors(int num_neighbors)
Definition: AMReX_ParticleTile.H:876
amrex::Gpu::HostVector< int * > m_h_runtime_i_ptrs
Definition: AMReX_ParticleTile.H:1286
Long capacity() const
Definition: AMReX_ParticleTile.H:1078
int numTotalParticles() const
Returns the total number of particles, real and neighbor.
Definition: AMReX_ParticleTile.H:867
AoS m_aos_tile
Definition: AMReX_ParticleTile.H:1274
std::size_t size() const
Returns the total number of particles (real and neighbor)
Definition: AMReX_ParticleTile.H:815
ParticleTileDataType getParticleTileData()
Definition: AMReX_ParticleTile.H:1120
void push_back(const SuperParticleType &sp)
Definition: AMReX_ParticleTile.H:913
int numNeighborParticles() const
Returns the number of neighbor particles (excluding reals)
Definition: AMReX_ParticleTile.H:854
~ParticleTile()=default
amrex::PODVector< ParticleReal *, Allocator< ParticleReal * > > m_runtime_r_ptrs
Definition: AMReX_ParticleTile.H:1279
static constexpr int NAR
Definition: AMReX_ParticleTile.H:695
ConstParticleTileDataType getConstParticleTileData() const
Definition: AMReX_ParticleTile.H:1196
void shrink_to_fit()
Definition: AMReX_ParticleTile.H:1058
T_ParticleType ParticleType
Definition: AMReX_ParticleTile.H:694
int numParticles() const
Returns the number of real particles (excluding neighbors)
Definition: AMReX_ParticleTile.H:828
void push_back_int(int comp, amrex::Vector< int > const &vec)
Definition: AMReX_ParticleTile.H:1037
amrex::Gpu::HostVector< ParticleReal * > m_h_runtime_r_ptrs
Definition: AMReX_ParticleTile.H:1285
const SoA & GetStructOfArrays() const
Definition: AMReX_ParticleTile.H:807
void swap(ParticleTile< ParticleType, NArrayReal, NArrayInt, Allocator > &other) noexcept
Definition: AMReX_ParticleTile.H:1100
void push_back_int(int comp, amrex::Vector< int >::const_iterator beg, amrex::Vector< int >::const_iterator end)
Definition: AMReX_ParticleTile.H:1029
void push_back_real(const std::array< ParticleReal, NArrayReal > &v)
Definition: AMReX_ParticleTile.H:958
int NumRuntimeRealComps() const noexcept
Definition: AMReX_ParticleTile.H:1054
SoA & GetStructOfArrays()
Definition: AMReX_ParticleTile.H:806
amrex::Gpu::HostVector< const int * > m_h_runtime_i_cptrs
Definition: AMReX_ParticleTile.H:1289
amrex::PODVector< const ParticleReal *, Allocator< const ParticleReal * > > m_runtime_r_cptrs
Definition: AMReX_ParticleTile.H:1282
RealType & pos(int index, int position_index) &
Definition: AMReX_ParticleTile.H:780
void resize(std::size_t count)
Definition: AMReX_ParticleTile.H:894
typename SoA::IntVector IntVector
Definition: AMReX_ParticleTile.H:715
void push_back_int(const std::array< int, NArrayInt > &v)
Definition: AMReX_ParticleTile.H:1010
void push_back_real(int comp, amrex::Vector< amrex::ParticleReal >::const_iterator beg, amrex::Vector< amrex::ParticleReal >::const_iterator end)
Definition: AMReX_ParticleTile.H:977
Allocator< T > AllocatorType
Definition: AMReX_ParticleTile.H:692
int NumRuntimeIntComps() const noexcept
Definition: AMReX_ParticleTile.H:1056
void define(int a_num_runtime_real, int a_num_runtime_int)
Definition: AMReX_ParticleTile.H:733
bool empty() const
Definition: AMReX_ParticleTile.H:809
void push_back_int(int comp, int v)
Definition: AMReX_ParticleTile.H:1002
RealType pos(int index, int position_index) const &
Definition: AMReX_ParticleTile.H:794
decltype(auto) cpu(int index) &
Definition: AMReX_ParticleTile.H:762
SoA m_soa_tile
Definition: AMReX_ParticleTile.H:1275
void push_back_int(int comp, std::size_t npar, int v)
Definition: AMReX_ParticleTile.H:1045
bool m_defined
Definition: AMReX_ParticleTile.H:1277
void push_back_real(int comp, std::size_t npar, ParticleReal v)
Definition: AMReX_ParticleTile.H:993
void push_back_int(int comp, const int *beg, const int *end)
Definition: AMReX_ParticleTile.H:1020
typename SoA::RealVector RealVector
Definition: AMReX_ParticleTile.H:714
amrex::PODVector< int *, Allocator< int * > > m_runtime_i_ptrs
Definition: AMReX_ParticleTile.H:1280
int numRealParticles() const
Returns the number of real particles (excluding neighbors)
Definition: AMReX_ParticleTile.H:841
std::conditional_t< ParticleType::is_soa_particle, ThisParticleTileHasNoAoS, ArrayOfStructs< ParticleType, Allocator > > AoS
Definition: AMReX_ParticleTile.H:707
decltype(auto) id(int index) &
Definition: AMReX_ParticleTile.H:744
static constexpr int NStructReal
Definition: AMReX_ParticleTile.H:699
void push_back_real(int comp, ParticleReal v)
Definition: AMReX_ParticleTile.H:950
The struct used to store particles.
Definition: AMReX_Particle.H:295
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE ParticleIDWrapper id() &
Definition: AMReX_Particle.H:315
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE RealVect pos() const &
Definition: AMReX_Particle.H:338
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE RealType & rdata(int index) &
Definition: AMReX_Particle.H:356
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE int & idata(int index) &
Definition: AMReX_Particle.H:427
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE ParticleCPUWrapper cpu() &
Definition: AMReX_Particle.H:312
Definition: AMReX_Particle.H:281
Definition: AMReX_ParticleTile.H:368
static constexpr int NArrayReal
Definition: AMReX_ParticleTile.H:369
static Long UnprotectedNextID()
This version can only be used inside omp critical.
Definition: AMReX_ParticleTile.H:474
PTD m_particle_tile_data
Definition: AMReX_ParticleTile.H:442
static Long the_next_id
Definition: AMReX_ParticleTile.H:385
static constexpr int NArrayInt
Definition: AMReX_ParticleTile.H:370
int m_index
Definition: AMReX_ParticleTile.H:445
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE ParticleCPUWrapper cpu() &
Definition: AMReX_ParticleTile.H:390
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE const uint64_t & idcpu() const &
Definition: AMReX_ParticleTile.H:405
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE ConstParticleCPUWrapper cpu() const &
Definition: AMReX_ParticleTile.H:399
ParticleReal RealType
Definition: AMReX_ParticleTile.H:377
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE RealType pos(int position_index) const &
Definition: AMReX_ParticleTile.H:420
static constexpr bool is_constsoa_particle
Definition: AMReX_ParticleTile.H:374
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE ParticleIDWrapper id() &
Definition: AMReX_ParticleTile.H:393
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE SoAParticle(PTD const &ptd, long i)
Definition: AMReX_ParticleTile.H:380
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE RealVect pos() const &
Definition: AMReX_ParticleTile.H:410
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE RealType & pos(int position_index) &
Definition: AMReX_ParticleTile.H:413
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE ConstParticleIDWrapper id() const &
Definition: AMReX_ParticleTile.H:402
static Long NextID()
Definition: AMReX_ParticleTile.H:453
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE uint64_t & idcpu() &
Definition: AMReX_ParticleTile.H:396
Definition: AMReX_StructOfArrays.H:16
Definition: AMReX_ParticleTile.H:683
Definition: AMReX_ParticleTile.H:681
Definition: AMReX_MakeParticle.H:11