Block-Structured AMR Software Framework
 
Loading...
Searching...
No Matches
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>
9#include <AMReX_Vector.H>
10#include <AMReX_REAL.H>
11#include <AMReX_RealVect.H>
12
13#include <array>
14#include <string>
15#include <type_traits>
16#include <vector>
17
18
19namespace amrex {
20
21// Forward Declaration
22template <int NArrayReal, int NArrayInt>
23struct ConstSoAParticle;
24template <int NArrayReal, int NArrayInt>
25struct SoAParticle;
26
27template <typename T_ParticleType, int NArrayReal, int NArrayInt>
28struct ConstParticleTileData;
29
31template <typename T_ParticleType, int NArrayReal, int NArrayInt>
33{
34 static constexpr int NAR = NArrayReal;
35 static constexpr int NAI = NArrayInt;
36
37 using ParticleType = T_ParticleType;
38 using ParticleRefType = T_ParticleType&;
41 using IntType = int;
42
43 static constexpr int NStructReal = ParticleType::NReal;
44 static constexpr int NStructInt = ParticleType::NInt;
45
47
48 static constexpr bool is_particle_tile_data = true;
49
51
52 using AOS_PTR = std::conditional_t<T_ParticleType::is_soa_particle,
55
56 uint64_t* m_idcpu;
59
64
66 decltype(auto) pos (const int dir, const int index) const &
67 {
68 if constexpr(!ParticleType::is_soa_particle) {
69 return this->m_aos[index].pos(dir);
70 } else {
71 return this->m_rdata[dir][index];
72 }
73 }
74
76 decltype(auto) id (const int index) const &
77 {
78 if constexpr(!ParticleType::is_soa_particle) {
79 return this->m_aos[index].id();
80 } else {
81 return ParticleIDWrapper(this->m_idcpu[index]);
82 }
83 }
84
86 decltype(auto) cpu (const int index) const &
87 {
88 if constexpr(!ParticleType::is_soa_particle) {
89 return this->m_aos[index].cpu();
90 } else {
91 return ParticleCPUWrapper(this->m_idcpu[index]);
92 }
93 }
94
96 decltype(auto) idcpu (const int index) const &
97 {
98 if constexpr(ParticleType::is_soa_particle) {
99 return this->m_idcpu[index];
100 } else {
101 return this->m_aos[index].idcpu();
102 }
103 }
104
106 ParticleReal * rdata (const int attribute_index) const
107 {
108 return this->m_rdata[attribute_index];
109 }
110
112 int * idata (const int attribute_index) const
113 {
114 return this->m_idata[attribute_index];
115 }
116
118 decltype(auto) operator[] (const int index) const
119 {
120 if constexpr (!ParticleType::is_soa_particle) {
121 return m_aos[index];
122 } else {
123 return SoAParticle<NAR, NAI>(*this, index);
124 }
125 }
126
128 void packParticleData (char* buffer, int src_index, std::size_t dst_offset,
129 const int* comm_real, const int * comm_int) const noexcept
130 {
131 AMREX_ASSERT(src_index < m_size);
132 auto* dst = buffer + dst_offset;
133 if constexpr (!ParticleType::is_soa_particle) {
134 memcpy(dst, m_aos + src_index, sizeof(ParticleType));
135 dst += sizeof(ParticleType);
136 } else {
137 memcpy(dst, m_idcpu + src_index, sizeof(uint64_t));
138 dst += sizeof(uint64_t);
139 }
140 int array_start_index = 0;
141 if constexpr (!ParticleType::is_soa_particle) {
142 array_start_index = AMREX_SPACEDIM + NStructReal;
143 }
144 for (int i = 0; i < NAR; ++i)
145 {
146 if (comm_real[array_start_index + i])
147 {
148 memcpy(dst, m_rdata[i] + src_index, sizeof(ParticleReal));
149 dst += sizeof(ParticleReal);
150 }
151 }
152 int runtime_start_index = array_start_index + NAR;
153 for (int i = 0; i < m_num_runtime_real; ++i)
154 {
155 if (comm_real[runtime_start_index + i])
156 {
157 memcpy(dst, m_runtime_rdata[i] + src_index, sizeof(ParticleReal));
158 dst += sizeof(ParticleReal);
159 }
160 }
161 array_start_index = 2 + NStructInt;
162 for (int i = 0; i < NAI; ++i)
163 {
164 if (comm_int[array_start_index + i])
165 {
166 memcpy(dst, m_idata[i] + src_index, sizeof(int));
167 dst += sizeof(int);
168 }
169 }
170 runtime_start_index = 2 + NStructInt + NAI;
171 for (int i = 0; i < m_num_runtime_int; ++i)
172 {
173 if (comm_int[runtime_start_index + i])
174 {
175 memcpy(dst, m_runtime_idata[i] + src_index, sizeof(int));
176 dst += sizeof(int);
177 }
178 }
179 }
180
182 void unpackParticleData (const char* buffer, Long src_offset, int dst_index,
183 const int* comm_real, const int* comm_int) const noexcept
184 {
185 AMREX_ASSERT(dst_index < m_size);
186 const auto* src = buffer + src_offset;
187 if constexpr (!ParticleType::is_soa_particle) {
188 memcpy(m_aos + dst_index, src, sizeof(ParticleType));
189 src += sizeof(ParticleType);
190 } else {
191 memcpy(m_idcpu + dst_index, src, sizeof(uint64_t));
192 src += sizeof(uint64_t);
193 }
194 int array_start_index = 0;
195 if constexpr (!ParticleType::is_soa_particle) {
196 array_start_index = AMREX_SPACEDIM + NStructReal;
197 }
198 if constexpr (NAR > 0) {
199 for (int i = 0; i < NAR; ++i)
200 {
201 if (comm_real[array_start_index + i])
202 {
203 memcpy(m_rdata[i] + dst_index, src, sizeof(ParticleReal));
204 src += sizeof(ParticleReal);
205 }
206 }
207 }
208 int runtime_start_index = array_start_index + NAR;
209 for (int i = 0; i < m_num_runtime_real; ++i)
210 {
211 if (comm_real[runtime_start_index + i])
212 {
213 memcpy(m_runtime_rdata[i] + dst_index, src, sizeof(ParticleReal));
214 src += sizeof(ParticleReal);
215 }
216 }
217 array_start_index = 2 + NStructInt;
218 if constexpr (NAI > 0) {
219 for (int i = 0; i < NAI; ++i)
220 {
221 if (comm_int[array_start_index + i])
222 {
223 memcpy(m_idata[i] + dst_index, src, sizeof(int));
224 src += sizeof(int);
225 }
226 }
227 }
228 runtime_start_index = 2 + NStructInt + NAI;
229 for (int i = 0; i < m_num_runtime_int; ++i)
230 {
231 if (comm_int[runtime_start_index + i])
232 {
233 memcpy(m_runtime_idata[i] + dst_index, src, sizeof(int));
234 src += sizeof(int);
235 }
236 }
237 }
238
239 template <typename T = ParticleType, std::enable_if_t<!T::is_soa_particle, int> = 0>
241 SuperParticleType getSuperParticle (int index) const noexcept
242 {
243 AMREX_ASSERT(index < m_size);
245 for (int i = 0; i < AMREX_SPACEDIM; ++i) {
246 sp.pos(i) = m_aos[index].pos(i);
247 }
248 for (int i = 0; i < NStructReal; ++i) {
249 sp.rdata(i) = m_aos[index].rdata(i);
250 }
251 if constexpr (NAR >0) {
252 for (int i = 0; i < NAR; ++i) {
253 sp.rdata(NStructReal+i) = m_rdata[i][index];
254 }
255 }
256 sp.id() = m_aos[index].id();
257 sp.cpu() = m_aos[index].cpu();
258 for (int i = 0; i < NStructInt; ++i) {
259 sp.idata(i) = m_aos[index].idata(i);
260 }
261 if constexpr (NAI > 0) {
262 for (int i = 0; i < NAI; ++i) {
263 sp.idata(NStructInt+i) = m_idata[i][index];
264 }
265 }
266 return sp;
267 }
268
269 template <typename T = ParticleType, std::enable_if_t<T::is_soa_particle, int> = 0>
271 SuperParticleType getSuperParticle (int index) const noexcept
272 {
273 AMREX_ASSERT(index < m_size);
275 sp.m_idcpu = m_idcpu[index];
276 for (int i = 0; i < AMREX_SPACEDIM; ++i) {sp.pos(i) = m_rdata[i][index];}
277 for (int i = 0; i < NAR; ++i) {
278 sp.rdata(i) = m_rdata[i][index];
279 }
280 for (int i = 0; i < NAI; ++i) {
281 sp.idata(i) = m_idata[i][index];
282 }
283 return sp;
284 }
285
286 template <typename T = ParticleType, std::enable_if_t<!T::is_soa_particle, int> = 0>
288 void setSuperParticle (const SuperParticleType& sp, int index) const noexcept
289 {
290 for (int i = 0; i < AMREX_SPACEDIM; ++i) {
291 m_aos[index].pos(i) = sp.pos(i);
292 }
293 for (int i = 0; i < NStructReal; ++i) {
294 m_aos[index].rdata(i) = sp.rdata(i);
295 }
296 for (int i = 0; i < NAR; ++i) {
297 m_rdata[i][index] = sp.rdata(NStructReal+i);
298 }
299 m_aos[index].id() = sp.id();
300 m_aos[index].cpu() = sp.cpu();
301 for (int i = 0; i < NStructInt; ++i) {
302 m_aos[index].idata(i) = sp.idata(i);
303 }
304 for (int i = 0; i < NAI; ++i) {
305 m_idata[i][index] = sp.idata(NStructInt+i);
306 }
307 }
308
309 template <typename T = ParticleType, std::enable_if_t<T::is_soa_particle, int> = 0>
311 void setSuperParticle (const SuperParticleType& sp, int index) const noexcept
312 {
313 m_idcpu[index] = sp.m_idcpu;
314 for (int i = 0; i < NAR; ++i) {
315 m_rdata[i][index] = sp.rdata(i);
316 }
317 for (int i = 0; i < NAI; ++i) {
318 m_idata[i][index] = sp.idata(i);
319 }
320 }
321};
322
323// SOA Particle Structure
324template <int T_NArrayReal, int T_NArrayInt>
325struct alignas(sizeof(double)) ConstSoAParticle : SoAParticleBase
326{
327 static constexpr int NArrayReal = T_NArrayReal;
328 static constexpr int NArrayInt = T_NArrayInt;
331 static constexpr bool is_soa_particle = true;
332 static constexpr bool is_constsoa_particle = true;
333
335 using IntType = int;
336
338 ConstSoAParticle (ConstPTD const& ptd, long i) : // Note: should this be int instead?
340 {
341 }
342
343 //static Long the_next_id;
344
345 //functions to get id and cpu in the SOA data
346
349
352
353 //functions to get positions of the particle in the SOA data
354
356 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]));}
357
359 const RealType& pos (int position_index) const &
360 {
361 AMREX_ASSERT(position_index < AMREX_SPACEDIM);
362 return this->m_constparticle_tile_data.m_rdata[position_index][m_index];
363 }
364
365 static Long NextID ();
366
371
377 static void NextID (Long nextid);
378
379 private :
380
381 static_assert(std::is_trivially_copyable<ConstPTD>(), "ParticleTileData is not trivially copyable");
382
385};
386
387template <int T_NArrayReal, int T_NArrayInt>
388struct alignas(sizeof(double)) SoAParticle : SoAParticleBase
389{
390 static constexpr int NArrayReal = T_NArrayReal;
391 static constexpr int NArrayInt = T_NArrayInt;
394 static constexpr bool is_soa_particle = true;
395 static constexpr bool is_constsoa_particle = false;
396
399 using IntType = int;
400
402 SoAParticle (PTD const& ptd, long i) : // Note: should this be int instead?
403 m_particle_tile_data(ptd), m_index(int(i))
404 {
405 }
406
408
409 //functions to get id and cpu in the SOA data
410
413
416
418 uint64_t& idcpu () & { return this->m_particle_tile_data.m_idcpu[m_index]; }
419
422
425
427 const uint64_t& idcpu () const & { return this->m_particle_tile_data.m_idcpu[m_index]; }
428
429 //functions to get positions of the particle in the SOA data
430
432 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]));}
433
435 RealType& pos (int position_index) &
436 {
437 AMREX_ASSERT(position_index < AMREX_SPACEDIM);
438 return this->m_particle_tile_data.m_rdata[position_index][m_index];
439 }
440
442 RealType pos (int position_index) const &
443 {
444 AMREX_ASSERT(position_index < AMREX_SPACEDIM);
445 return this->m_particle_tile_data.m_rdata[position_index][m_index];
446 }
447
448 static Long NextID ();
449
453 static Long UnprotectedNextID ();
454
460 static void NextID (Long nextid);
461
462private :
463
464 static_assert(std::is_trivially_copyable<PTD>(), "ParticleTileData is not trivially copyable");
465
468};
469
470//template <int NArrayReal, int NArrayInt> Long ConstSoAParticle<NArrayReal, NArrayInt>::the_next_id = 1;
471template <int NArrayReal, int NArrayInt> Long SoAParticle<NArrayReal, NArrayInt>::the_next_id = 1;
472
473template <int NArrayReal, int NArrayInt>
474Long
476{
477 Long next;
478// we should be able to test on _OPENMP < 201107 for capture (version 3.1)
479// but we must work around a bug in gcc < 4.9
480#if defined(AMREX_USE_OMP) && defined(_OPENMP) && _OPENMP < 201307
481#pragma omp critical (amrex_particle_nextid)
482#elif defined(AMREX_USE_OMP)
483#pragma omp atomic capture
484#endif
485 next = the_next_id++;
486
488 amrex::Abort("SoAParticle<NArrayReal, NArrayInt>::NextID() -- too many particles");
489 }
490
491 return next;
492}
493
494template <int NArrayReal, int NArrayInt>
495Long
497{
498 Long next = the_next_id++;
500 amrex::Abort("SoAParticle<NArrayReal, NArrayInt>::NextID() -- too many particles");
501 }
502 return next;
503}
504
505template <int NArrayReal, int NArrayInt>
506void
508{
509 the_next_id = nextid;
510}
511
512template <typename T_ParticleType, int NArrayReal, int NArrayInt>
514{
515 static constexpr int NAR = NArrayReal;
516 static constexpr int NAI = NArrayInt;
517 using ParticleType = T_ParticleType;
518 using ParticleRefType = T_ParticleType const&;
520 using IntType = int;
521
522 static constexpr int NStructReal = ParticleType::NReal;
523 static constexpr int NStructInt = ParticleType::NInt;
524
526
527 static constexpr bool is_particle_tile_data = true;
528
530
531 using AOS_PTR = std::conditional_t<T_ParticleType::is_soa_particle,
532 void const * AMREX_RESTRICT, ParticleType const * AMREX_RESTRICT>;
534
535 const uint64_t* m_idcpu;
538
540 decltype(auto) pos (const int dir, const int index) const &
541 {
542 if constexpr(!ParticleType::is_soa_particle) {
543 return this->m_aos[index].pos(dir);
544 } else {
545 return this->m_rdata[dir][index];
546 }
547 }
548
550 decltype(auto) id (const int index) const &
551 {
552 if constexpr(!ParticleType::is_soa_particle) {
553 return this->m_aos[index].id();
554 } else {
555 return ConstParticleIDWrapper(this->m_idcpu[index]);
556 }
557 }
558
560 decltype(auto) cpu (const int index) const &
561 {
562 if constexpr(!ParticleType::is_soa_particle) {
563 return this->m_aos[index].cpu();
564 } else {
565 return ConstParticleCPUWrapper(this->m_idcpu[index]);
566 }
567 }
568
570 decltype(auto) idcpu (const int index) const &
571 {
572 if constexpr(ParticleType::is_soa_particle) {
573 return this->m_idcpu[index];
574 } else {
575 return this->m_aos[index].idcpu();
576 }
577 }
578
580 const ParticleReal * rdata (const int attribute_index) const
581 {
582 return this->m_rdata[attribute_index];
583 }
584
586 const int * idata (const int attribute_index) const
587 {
588 return this->m_idata[attribute_index];
589 }
590
592 decltype(auto) operator[] (const int index) const
593 {
594 if constexpr (!ParticleType::is_soa_particle) {
595 return m_aos[index];
596 } else {
597 return ConstSoAParticle<NAR, NAI>(*this, index);
598 }
599 }
600
605
607 void packParticleData(char* buffer, int src_index, Long dst_offset,
608 const int* comm_real, const int * comm_int) const noexcept
609 {
610 AMREX_ASSERT(src_index < m_size);
611 auto* dst = buffer + dst_offset;
612 if constexpr (!ParticleType::is_soa_particle) {
613 memcpy(dst, m_aos + src_index, sizeof(ParticleType));
614 dst += sizeof(ParticleType);
615 } else {
616 memcpy(dst, m_idcpu + src_index, sizeof(uint64_t));
617 dst += sizeof(uint64_t);
618 }
619 int array_start_index = 0;
620 if constexpr (!ParticleType::is_soa_particle) {
621 array_start_index = AMREX_SPACEDIM + NStructReal;
622 }
623 if constexpr (NArrayReal > 0) {
624 for (int i = 0; i < NArrayReal; ++i)
625 {
626 if (comm_real[array_start_index + i])
627 {
628 memcpy(dst, m_rdata[i] + src_index, sizeof(ParticleReal));
629 dst += sizeof(ParticleReal);
630 }
631 }
632 }
633 int runtime_start_index = array_start_index + NArrayReal;
634 for (int i = 0; i < m_num_runtime_real; ++i)
635 {
636 if (comm_real[runtime_start_index + i])
637 {
638 memcpy(dst, m_runtime_rdata[i] + src_index, sizeof(ParticleReal));
639 dst += sizeof(ParticleReal);
640 }
641 }
642 array_start_index = 2 + NStructInt;
643 if constexpr (NArrayInt > 0) {
644 for (int i = 0; i < NArrayInt; ++i)
645 {
646 if (comm_int[array_start_index + i])
647 {
648 memcpy(dst, m_idata[i] + src_index, sizeof(int));
649 dst += sizeof(int);
650 }
651 }
652 }
653 runtime_start_index = 2 + NStructInt + NArrayInt;
654 for (int i = 0; i < m_num_runtime_int; ++i)
655 {
656 if (comm_int[runtime_start_index + i])
657 {
658 memcpy(dst, m_runtime_idata[i] + src_index, sizeof(int));
659 dst += sizeof(int);
660 }
661 }
662 }
663
664 template <typename T = ParticleType, std::enable_if_t<!T::is_soa_particle, int> = 0>
666 SuperParticleType getSuperParticle (int index) const noexcept
667 {
668 AMREX_ASSERT(index < m_size);
670 for (int i = 0; i < AMREX_SPACEDIM; ++i) {
671 sp.pos(i) = m_aos[index].pos(i);
672 }
673 for (int i = 0; i < NStructReal; ++i) {
674 sp.rdata(i) = m_aos[index].rdata(i);
675 }
676 if constexpr(NArrayReal > 0) {
677 for (int i = 0; i < NArrayReal; ++i) {
678 sp.rdata(NStructReal+i) = m_rdata[i][index];
679 }
680 }
681 sp.id() = m_aos[index].id();
682 sp.cpu() = m_aos[index].cpu();
683 for (int i = 0; i < NStructInt; ++i) {
684 sp.idata(i) = m_aos[index].idata(i);
685 }
686 if constexpr(NArrayInt > 0) {
687 for (int i = 0; i < NArrayInt; ++i) {
688 sp.idata(NStructInt+i) = m_idata[i][index];
689 }
690 }
691 return sp;
692 }
693
694 template <typename T = ParticleType, std::enable_if_t<T::is_soa_particle, int> = 0>
696 SuperParticleType getSuperParticle (int index) const noexcept
697 {
698 AMREX_ASSERT(index < m_size);
700 for (int i = 0; i < AMREX_SPACEDIM; ++i) {sp.pos(i) = m_rdata[i][index];}
701 sp.m_idcpu = m_idcpu[index];
702 for (int i = 0; i < NAR; ++i) {
703 sp.rdata(i) = m_rdata[i][index];
704 }
705 for (int i = 0; i < NAI; ++i) {
706 sp.idata(i) = m_idata[i][index];
707 }
708 return sp;
709 }
710};
711
713
717
718template <typename T_ParticleType, int NArrayReal, int NArrayInt,
719 template<class> class Allocator=DefaultAllocator>
721{
722 template <typename T>
723 using AllocatorType = Allocator<T>;
724
725 using ParticleType = T_ParticleType;
726 static constexpr int NAR = NArrayReal;
727 static constexpr int NAI = NArrayInt;
728 using RealType = typename ParticleType::RealType;
729
730 static constexpr int NStructReal = ParticleType::NReal;
731 static constexpr int NStructInt = ParticleType::NInt;
732
734
735 using AoS = std::conditional_t<
736 ParticleType::is_soa_particle,
739 //using ParticleVector = typename AoS::ParticleVector;
740
741 using SoA = std::conditional_t<
742 ParticleType::is_soa_particle,
745 using RealVector = typename SoA::RealVector;
746 using IntVector = typename SoA::IntVector;
747 using StorageParticleType = typename ParticleType::StorageParticleType;
748
751
752 static constexpr bool has_polymorphic_allocator =
754
755 ParticleTile () = default;
756
757#ifndef _WIN32 // workaround windows compiler bug
758 ~ParticleTile () = default;
759
760 ParticleTile (ParticleTile const&) = delete;
761 ParticleTile (ParticleTile &&) noexcept = default;
762
763 ParticleTile& operator= (ParticleTile const&) = delete;
764 ParticleTile& operator= (ParticleTile &&) noexcept = default;
765#endif
766
767 void define (
768 int a_num_runtime_real,
769 int a_num_runtime_int,
770 std::vector<std::string>* soa_rdata_names=nullptr,
771 std::vector<std::string>* soa_idata_names=nullptr,
772 Arena* a_arena=nullptr
773 )
774 {
775 GetStructOfArrays().define(a_num_runtime_real, a_num_runtime_int, soa_rdata_names, soa_idata_names);
776 m_runtime_r_ptrs.resize(a_num_runtime_real);
777 m_runtime_i_ptrs.resize(a_num_runtime_int);
778 m_runtime_r_cptrs.resize(a_num_runtime_real);
779 m_runtime_i_cptrs.resize(a_num_runtime_int);
780
781 if constexpr (has_polymorphic_allocator) {
782 if (m_defined) {
783 // it is not allowed to change the arena after the tile has been defined
784 if constexpr (ParticleType::is_soa_particle) {
786 a_arena == GetStructOfArrays().GetIdCPUData().arena(),
787 "ParticleTile with PolymorphicArenaAllocator redefined with "
788 "different memory arena");
789 } else {
791 a_arena == m_aos_tile().arena(),
792 "ParticleTile with PolymorphicArenaAllocator redefined with "
793 "different memory arena");
794 }
795 }
796
797 AMREX_ALWAYS_ASSERT_WITH_MESSAGE(a_arena != nullptr,
798 "ParticleTile with PolymorphicArenaAllocator defined with no memory arena! "
799 "Make sure to call setArena() on the ParticleContainer before initialization or "
800 "to pass an Arena to ParticleTile::define()");
801
802 if constexpr (ParticleType::is_soa_particle) {
803 GetStructOfArrays().GetIdCPUData().setArena(a_arena);
804 } else {
805 m_aos_tile().setArena(a_arena);
806 }
807 for (int j = 0; j < NumRealComps(); ++j) {
808 GetStructOfArrays().GetRealData(j).setArena(a_arena);
809 }
810 for (int j = 0; j < NumIntComps(); ++j) {
811 GetStructOfArrays().GetIntData(j).setArena(a_arena);
812 }
813 }
814
815 m_defined = true;
816 }
817
818 // Get id data
819 decltype(auto) id (int index) & {
820 if constexpr (!ParticleType::is_soa_particle) {
821 return m_aos_tile[index].id();
822 } else {
823 return ParticleIDWrapper(m_soa_tile.GetIdCPUData()[index]);
824 }
825 }
826
827 // const
828 decltype(auto) id (int index) const & {
829 if constexpr (!ParticleType::is_soa_particle) {
830 return m_aos_tile[index].id();
831 } else {
832 return ConstParticleIDWrapper(m_soa_tile.GetIdCPUData()[index]);
833 }
834 }
835
836 // Get cpu data
837 decltype(auto) cpu (int index) & {
838 if constexpr (!ParticleType::is_soa_particle) {
839 return m_aos_tile[index].cpu();
840 } else {
841 return ParticleCPUWrapper(m_soa_tile.GetIdCPUData()[index]);
842 }
843 }
844
845 // const
846 decltype(auto) cpu (int index) const & {
847 if constexpr (!ParticleType::is_soa_particle) {
848 return m_aos_tile[index].cpu();
849 } else {
850 return ConstParticleCPUWrapper(m_soa_tile.GetIdCPUData()[index]);
851 }
852 }
853
854 // Get positions data
855 RealType& pos (int index, int position_index) & {
856 if constexpr (!ParticleType::is_soa_particle) {
857 return m_aos_tile[index].pos(position_index);
858 } else {
859 static_assert(NArrayReal == ParticleType::PTD::NAR, "ParticleTile mismatch in R");
860 static_assert(NArrayInt == ParticleType::PTD::NAI, "ParticleTile mismatch in I");
861 static_assert(0 == ParticleType::StorageParticleType::NReal, "ParticleTile 2 mismatch in R");
862 static_assert(0 == ParticleType::StorageParticleType::NInt, "ParticleTile 2 mismatch in I");
863
864 return m_soa_tile.GetRealData(position_index)[index];
865 }
866 }
867
868 // const
869 RealType pos (int index, int position_index) const &
870 {
871 if constexpr (!ParticleType::is_soa_particle) {
872 return m_aos_tile[index].pos(position_index);
873 } else {
874 return m_soa_tile.GetRealData(position_index)[index];
875 }
876 }
877
879 const AoS& GetArrayOfStructs () const { return m_aos_tile; }
880
882 const SoA& GetStructOfArrays () const { return m_soa_tile; }
883
884 bool empty () const { return size() == 0; }
885
890 std::size_t size () const
891 {
892 if constexpr (!ParticleType::is_soa_particle) {
893 return m_aos_tile.size();
894 } else {
895 return m_soa_tile.size();
896 }
897 }
898
903 int numParticles () const
904 {
905 if constexpr (!ParticleType::is_soa_particle) {
906 return m_aos_tile.numParticles();
907 } else {
908 return m_soa_tile.numParticles();
909 }
910 }
911
916 int numRealParticles () const
917 {
918 if constexpr (!ParticleType::is_soa_particle) {
919 return m_aos_tile.numRealParticles();
920 } else {
921 return m_soa_tile.numRealParticles();
922 }
923 }
924
930 {
931 if constexpr (!ParticleType::is_soa_particle) {
932 return m_aos_tile.numNeighborParticles();
933 } else {
934 return m_soa_tile.numNeighborParticles();
935 }
936 }
937
942 int numTotalParticles () const
943 {
944 if constexpr (!ParticleType::is_soa_particle) {
945 return m_aos_tile.numTotalParticles();
946 } else {
947 return m_soa_tile.numTotalParticles();
948 }
949 }
950
951 void setNumNeighbors (int num_neighbors)
952 {
953 if constexpr(!ParticleType::is_soa_particle) {
954 m_aos_tile.setNumNeighbors(num_neighbors);
955 }
956 m_soa_tile.setNumNeighbors(num_neighbors);
957 }
958
959 int getNumNeighbors () const
960 {
961 if constexpr (!ParticleType::is_soa_particle) {
962 AMREX_ASSERT( m_soa_tile.getNumNeighbors() == m_aos_tile.getNumNeighbors() );
963 return m_aos_tile.getNumNeighbors();
964 } else {
965 return m_soa_tile.getNumNeighbors();
966 }
967 }
968
969 void resize (std::size_t count, GrowthStrategy strategy = GrowthStrategy::Poisson)
970 {
971 if constexpr (!ParticleType::is_soa_particle) {
972 m_aos_tile.resize(count, strategy);
973 }
974 m_soa_tile.resize(count, strategy);
975 }
976
978 {
979 if constexpr (!ParticleType::is_soa_particle) {
980 m_aos_tile.reserve(capacity, strategy);
981 }
982 m_soa_tile.reserve(capacity, strategy);
983 }
984
988 template <typename T = ParticleType, std::enable_if_t<!T::is_soa_particle, int> = 0>
989 void push_back (const ParticleType& p) { m_aos_tile().push_back(p); }
990
994 template < int NR = NArrayReal, int NI = NArrayInt,
995 std::enable_if_t<NR != 0 || NI != 0, int> foo = 0>
997 {
998 auto np = numParticles();
999
1000 if constexpr (!ParticleType::is_soa_particle) {
1001 m_aos_tile.resize(np+1);
1002 for (int i = 0; i < AMREX_SPACEDIM; ++i) {
1003 m_aos_tile[np].pos(i) = sp.pos(i);
1004 }
1005 for (int i = 0; i < NStructReal; ++i) {
1006 m_aos_tile[np].rdata(i) = sp.rdata(i);
1007 }
1008 m_aos_tile[np].id() = sp.id();
1009 m_aos_tile[np].cpu() = sp.cpu();
1010 for (int i = 0; i < NStructInt; ++i) {
1011 m_aos_tile[np].idata(i) = sp.idata(i);
1012 }
1013 }
1014
1015 m_soa_tile.resize(np+1);
1016 if constexpr (ParticleType::is_soa_particle) {
1017 m_soa_tile.GetIdCPUData()[np] = sp.m_idcpu;
1018 }
1019 auto& arr_rdata = m_soa_tile.GetRealData();
1020 auto& arr_idata = m_soa_tile.GetIntData();
1021 for (int i = 0; i < NArrayReal; ++i) {
1022 arr_rdata[i][np] = sp.rdata(NStructReal+i);
1023 }
1024 for (int i = 0; i < NArrayInt; ++i) {
1025 arr_idata[i][np] = sp.idata(NStructInt+i);
1026 }
1027 }
1028
1033 void push_back_real (int comp, ParticleReal v) {
1034 m_soa_tile.GetRealData(comp).push_back(v);
1035 }
1036
1041 void push_back_real (const std::array<ParticleReal, NArrayReal>& v) {
1042 for (int i = 0; i < NArrayReal; ++i) {
1043 m_soa_tile.GetRealData(i).push_back(v[i]);
1044 }
1045 }
1046
1051 void push_back_real (int comp, const ParticleReal* beg, const ParticleReal* end) {
1052 auto it = m_soa_tile.GetRealData(comp).end();
1053 m_soa_tile.GetRealData(comp).insert(it, beg, end);
1054 }
1055
1063
1069 push_back_real(comp, vec.cbegin(), vec.cend());
1070 }
1071
1076 void push_back_real (int comp, std::size_t npar, ParticleReal v) {
1077 auto new_size = m_soa_tile.GetRealData(comp).size() + npar;
1078 m_soa_tile.GetRealData(comp).resize(new_size, v);
1079 }
1080
1085 void push_back_int (int comp, int v) {
1086 m_soa_tile.GetIntData(comp).push_back(v);
1087 }
1088
1093 void push_back_int (const std::array<int, NArrayInt>& v) {
1094 for (int i = 0; i < NArrayInt; ++i) {
1095 m_soa_tile.GetIntData(i).push_back(v[i]);
1096 }
1097 }
1098
1103 void push_back_int (int comp, const int* beg, const int* end) {
1104 auto it = m_soa_tile.GetIntData(comp).end();
1105 m_soa_tile.GetIntData(comp).insert(it, beg, end);
1106 }
1107
1115
1120 void push_back_int (int comp, amrex::Vector<int> const & vec) {
1121 push_back_int(comp, vec.cbegin(), vec.cend());
1122 }
1123
1128 void push_back_int (int comp, std::size_t npar, int v) {
1129 auto new_size = m_soa_tile.GetIntData(comp).size() + npar;
1130 m_soa_tile.GetIntData(comp).resize(new_size, v);
1131 }
1132
1133 int NumRealComps () const noexcept { return m_soa_tile.NumRealComps(); }
1134
1135 int NumIntComps () const noexcept { return m_soa_tile.NumIntComps(); }
1136
1137 int NumRuntimeRealComps () const noexcept { return m_runtime_r_ptrs.size(); }
1138
1139 int NumRuntimeIntComps () const noexcept { return m_runtime_i_ptrs.size(); }
1140
1142 {
1143 if constexpr (ParticleType::is_soa_particle) {
1144 GetStructOfArrays().GetIdCPUData().shrink_to_fit();
1145 } else {
1146 m_aos_tile().shrink_to_fit();
1147 }
1148 for (int j = 0; j < NumRealComps(); ++j)
1149 {
1150 auto& rdata = GetStructOfArrays().GetRealData(j);
1151 rdata.shrink_to_fit();
1152 }
1153
1154 for (int j = 0; j < NumIntComps(); ++j)
1155 {
1156 auto& idata = GetStructOfArrays().GetIntData(j);
1157 idata.shrink_to_fit();
1158 }
1159 }
1160
1162 {
1163 Long nbytes = 0;
1164 if constexpr (ParticleType::is_soa_particle) {
1165 nbytes += GetStructOfArrays().GetIdCPUData().capacity() * sizeof(uint64_t);
1166 } else {
1167 nbytes += m_aos_tile().capacity() * sizeof(ParticleType);
1168 }
1169 for (int j = 0; j < NumRealComps(); ++j)
1170 {
1171 auto& rdata = GetStructOfArrays().GetRealData(j);
1172 nbytes += rdata.capacity() * sizeof(ParticleReal);
1173 }
1174
1175 for (int j = 0; j < NumIntComps(); ++j)
1176 {
1177 auto& idata = GetStructOfArrays().GetIntData(j);
1178 nbytes += idata.capacity()*sizeof(int);
1179 }
1180 return nbytes;
1181 }
1182
1184 {
1185 if constexpr (ParticleType::is_soa_particle) {
1186 GetStructOfArrays().GetIdCPUData().swap(other.GetStructOfArrays().GetIdCPUData());
1187 } else {
1188 m_aos_tile().swap(other.GetArrayOfStructs()());
1189 }
1190 for (int j = 0; j < NumRealComps(); ++j)
1191 {
1192 auto& rdata = GetStructOfArrays().GetRealData(j);
1193 rdata.swap(other.GetStructOfArrays().GetRealData(j));
1194 }
1195
1196 for (int j = 0; j < NumIntComps(); ++j)
1197 {
1198 auto& idata = GetStructOfArrays().GetIntData(j);
1199 idata.swap(other.GetStructOfArrays().GetIntData(j));
1200 }
1201 }
1202
1204 {
1205 m_runtime_r_ptrs.resize(m_soa_tile.NumRealComps() - NArrayReal);
1206 m_runtime_i_ptrs.resize(m_soa_tile.NumIntComps() - NArrayInt);
1207#ifdef AMREX_USE_GPU
1208 bool copy_real = false;
1209 m_h_runtime_r_ptrs.resize(m_soa_tile.NumRealComps() - NArrayReal, nullptr);
1210 for (std::size_t i = 0; i < m_h_runtime_r_ptrs.size(); ++i) {
1211 if (m_h_runtime_r_ptrs[i] != m_soa_tile.GetRealData(i + NArrayReal).dataPtr()) {
1212 m_h_runtime_r_ptrs[i] = m_soa_tile.GetRealData(i + NArrayReal).dataPtr();
1213 copy_real = true;
1214 }
1215 }
1216 if (copy_real) {
1218 m_h_runtime_r_ptrs.size()*sizeof(ParticleReal*));
1219 }
1220
1221 bool copy_int = false;
1222 m_h_runtime_i_ptrs.resize(m_soa_tile.NumIntComps() - NArrayInt, nullptr);
1223 for (std::size_t i = 0; i < m_h_runtime_i_ptrs.size(); ++i) {
1224 if (m_h_runtime_i_ptrs[i] != m_soa_tile.GetIntData(i + NArrayInt).dataPtr()) {
1225 m_h_runtime_i_ptrs[i] = m_soa_tile.GetIntData(i + NArrayInt).dataPtr();
1226 copy_int = true;
1227 }
1228 }
1229 if (copy_int) {
1231 m_h_runtime_i_ptrs.size()*sizeof(int*));
1232 }
1233#else
1234 for (std::size_t i = 0; i < m_runtime_r_ptrs.size(); ++i) {
1235 m_runtime_r_ptrs[i] = m_soa_tile.GetRealData(i + NArrayReal).dataPtr();
1236 }
1237
1238 for (std::size_t i = 0; i < m_runtime_i_ptrs.size(); ++i) {
1239 m_runtime_i_ptrs[i] = m_soa_tile.GetIntData(i + NArrayInt).dataPtr();
1240 }
1241#endif
1242
1244 if constexpr (!ParticleType::is_soa_particle) {
1245 ptd.m_aos = m_aos_tile().dataPtr();
1246 } else {
1247 ptd.m_aos = nullptr;
1248 }
1249 if constexpr (ParticleType::is_soa_particle) {
1250 ptd.m_idcpu = m_soa_tile.GetIdCPUData().dataPtr();
1251 } else {
1252 ptd.m_idcpu = nullptr;
1253 }
1254 if constexpr(NArrayReal > 0) {
1255 for (int i = 0; i < NArrayReal; ++i) {
1256 ptd.m_rdata[i] = m_soa_tile.GetRealData(i).dataPtr();
1257 }
1258 }
1259 if constexpr(NArrayInt > 0) {
1260 for (int i = 0; i < NArrayInt; ++i) {
1261 ptd.m_idata[i] = m_soa_tile.GetIntData(i).dataPtr();
1262 }
1263 }
1264 ptd.m_size = size();
1267 ptd.m_runtime_rdata = m_runtime_r_ptrs.dataPtr();
1268 ptd.m_runtime_idata = m_runtime_i_ptrs.dataPtr();
1269
1270#ifdef AMREX_USE_GPU
1271 if (copy_real || copy_int) {
1273 }
1274#endif
1275
1276 return ptd;
1277 }
1278
1280 {
1281 m_runtime_r_cptrs.resize(m_soa_tile.NumRealComps() - NArrayReal);
1282 m_runtime_i_cptrs.resize(m_soa_tile.NumIntComps() - NArrayInt);
1283#ifdef AMREX_USE_GPU
1284 bool copy_real = false;
1285 m_h_runtime_r_cptrs.resize(m_soa_tile.NumRealComps() - NArrayReal, nullptr);
1286 for (std::size_t i = 0; i < m_h_runtime_r_cptrs.size(); ++i) {
1287 if (m_h_runtime_r_cptrs[i] != m_soa_tile.GetRealData(i + NArrayReal).dataPtr()) {
1288 m_h_runtime_r_cptrs[i] = m_soa_tile.GetRealData(i + NArrayReal).dataPtr();
1289 copy_real = true;
1290 }
1291 }
1292 if (copy_real) {
1294 m_h_runtime_r_cptrs.size()*sizeof(ParticleReal*));
1295 }
1296
1297 bool copy_int = false;
1298 m_h_runtime_i_cptrs.resize(m_soa_tile.NumIntComps() - NArrayInt, nullptr);
1299 for (std::size_t i = 0; i < m_h_runtime_i_cptrs.size(); ++i) {
1300 if (m_h_runtime_i_cptrs[i] != m_soa_tile.GetIntData(i + NArrayInt).dataPtr()) {
1301 m_h_runtime_i_cptrs[i] = m_soa_tile.GetIntData(i + NArrayInt).dataPtr();
1302 copy_int = true;
1303 }
1304 }
1305 if (copy_int) {
1307 m_h_runtime_i_cptrs.size()*sizeof(int*));
1308 }
1309#else
1310 for (std::size_t i = 0; i < m_runtime_r_cptrs.size(); ++i) {
1311 m_runtime_r_cptrs[i] = m_soa_tile.GetRealData(i + NArrayReal).dataPtr();
1312 }
1313
1314 for (std::size_t i = 0; i < m_runtime_i_cptrs.size(); ++i) {
1315 m_runtime_i_cptrs[i] = m_soa_tile.GetIntData(i + NArrayInt).dataPtr();
1316 }
1317#endif
1318
1320 if constexpr (!ParticleType::is_soa_particle) {
1321 ptd.m_aos = m_aos_tile().dataPtr();
1322 } else {
1323 ptd.m_aos = nullptr;
1324 }
1325 if constexpr (ParticleType::is_soa_particle) {
1326 ptd.m_idcpu = m_soa_tile.GetIdCPUData().dataPtr();
1327 } else {
1328 ptd.m_idcpu = nullptr;
1329 }
1330 if constexpr(NArrayReal > 0) {
1331 for (int i = 0; i < NArrayReal; ++i) {
1332 ptd.m_rdata[i] = m_soa_tile.GetRealData(i).dataPtr();
1333 }
1334 }
1335 if constexpr(NArrayInt > 0) {
1336 for (int i = 0; i < NArrayInt; ++i) {
1337 ptd.m_idata[i] = m_soa_tile.GetIntData(i).dataPtr();
1338 }
1339 }
1340 ptd.m_size = size();
1343 ptd.m_runtime_rdata = m_runtime_r_cptrs.dataPtr();
1344 ptd.m_runtime_idata = m_runtime_i_cptrs.dataPtr();
1345
1346#ifdef AMREX_USE_GPU
1347 if (copy_real || copy_int) {
1349 }
1350#endif
1351
1352 return ptd;
1353 }
1354
1355private:
1356
1359
1360 bool m_defined = false;
1361
1364
1367
1370
1373};
1374
1375} // namespace amrex
1376
1377#endif // AMREX_PARTICLETILE_H_
#define AMREX_ALWAYS_ASSERT_WITH_MESSAGE(EX, MSG)
Definition AMReX_BLassert.H:49
#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:32
#define AMREX_GPU_HOST_DEVICE
Definition AMReX_GpuQualifiers.H:20
#define AMREX_D_DECL(a, b, c)
Definition AMReX_SPACE.H:171
Definition AMReX_GpuAllocators.H:114
A virtual base class for objects that manage their own dynamic memory allocation.
Definition AMReX_Arena.H:105
Definition AMReX_ArrayOfStructs.H:13
Dynamically allocated vector for trivially copyable data.
Definition AMReX_PODVector.H:308
This class is a thin wrapper around std::vector. Unlike vector, Vector::operator[] provides bound che...
Definition AMReX_Vector.H:28
amrex_particle_real ParticleReal
Floating Point Type for Particles.
Definition AMReX_REAL.H:90
amrex_long Long
Definition AMReX_INT.H:30
void streamSynchronize() noexcept
Definition AMReX_GpuDevice.H:263
void htod_memcpy_async(void *p_d, const void *p_h, const std::size_t sz) noexcept
Definition AMReX_GpuDevice.H:301
constexpr Long LastParticleID
Definition AMReX_Particle.H:21
Definition AMReX_Amr.cpp:49
GrowthStrategy
Definition AMReX_PODVector.H:250
RealVectND< 3 > RealVect
Definition AMReX_ParmParse.H:35
void Abort(const std::string &msg)
Print out message to cerr and exit via abort().
Definition AMReX.cpp:230
__host__ __device__ Dim3 end(BoxND< dim > const &box) noexcept
Definition AMReX_Box.H:2015
Definition AMReX_Particle.H:327
Definition AMReX_Particle.H:301
static constexpr bool is_particle_tile_data
Definition AMReX_ParticleTile.H:527
static constexpr int NAI
Definition AMReX_ParticleTile.H:516
int IntType
Definition AMReX_ParticleTile.H:520
GpuArray< const int *, NArrayInt > m_idata
Definition AMReX_ParticleTile.H:537
__host__ __device__ decltype(auto) idcpu(const int index) const &
Definition AMReX_ParticleTile.H:570
__host__ __device__ const int * idata(const int attribute_index) const
Definition AMReX_ParticleTile.H:586
Long m_size
Definition AMReX_ParticleTile.H:529
T_ParticleType ParticleType
Definition AMReX_ParticleTile.H:517
static constexpr int NStructReal
Definition AMReX_ParticleTile.H:522
__host__ __device__ void packParticleData(char *buffer, int src_index, Long dst_offset, const int *comm_real, const int *comm_int) const noexcept
Definition AMReX_ParticleTile.H:607
int m_num_runtime_real
Definition AMReX_ParticleTile.H:601
static constexpr int NStructInt
Definition AMReX_ParticleTile.H:523
const int *__restrict__ *__restrict__ m_runtime_idata
Definition AMReX_ParticleTile.H:604
ParticleReal RealType
Definition AMReX_ParticleTile.H:519
__host__ __device__ decltype(auto) pos(const int dir, const int index) const &
Definition AMReX_ParticleTile.H:540
__host__ __device__ decltype(auto) cpu(const int index) const &
Definition AMReX_ParticleTile.H:560
int m_num_runtime_int
Definition AMReX_ParticleTile.H:602
std::conditional_t< T_ParticleType::is_soa_particle, void const *__restrict__, ParticleType const *__restrict__ > AOS_PTR
Definition AMReX_ParticleTile.H:532
T_ParticleType const & ParticleRefType
Definition AMReX_ParticleTile.H:518
static constexpr int NAR
Definition AMReX_ParticleTile.H:515
AOS_PTR m_aos
Definition AMReX_ParticleTile.H:533
const uint64_t * m_idcpu
Definition AMReX_ParticleTile.H:535
__host__ __device__ SuperParticleType getSuperParticle(int index) const noexcept
Definition AMReX_ParticleTile.H:666
__host__ __device__ const ParticleReal * rdata(const int attribute_index) const
Definition AMReX_ParticleTile.H:580
GpuArray< const ParticleReal *, NArrayReal > m_rdata
Definition AMReX_ParticleTile.H:536
const ParticleReal *__restrict__ *__restrict__ m_runtime_rdata
Definition AMReX_ParticleTile.H:603
Definition AMReX_ParticleTile.H:326
__host__ __device__ ConstParticleIDWrapper id() const
Definition AMReX_ParticleTile.H:351
static constexpr int NArrayReal
Definition AMReX_ParticleTile.H:327
ParticleReal RealType
Definition AMReX_ParticleTile.H:334
__host__ __device__ ConstSoAParticle(ConstPTD const &ptd, long i)
Definition AMReX_ParticleTile.H:338
static constexpr int NArrayInt
Definition AMReX_ParticleTile.H:328
ConstPTD m_constparticle_tile_data
Definition AMReX_ParticleTile.H:383
static void NextID(Long nextid)
Reset on restart.
int m_index
Definition AMReX_ParticleTile.H:384
static constexpr bool is_constsoa_particle
Definition AMReX_ParticleTile.H:332
static Long UnprotectedNextID()
This version can only be used inside omp critical.
__host__ __device__ const RealType & pos(int position_index) const &
Definition AMReX_ParticleTile.H:359
__host__ __device__ RealVect pos() const &
Definition AMReX_ParticleTile.H:356
__host__ __device__ ConstParticleCPUWrapper cpu() const
Definition AMReX_ParticleTile.H:348
int IntType
Definition AMReX_ParticleTile.H:335
Fixed-size array that can be used on GPU.
Definition AMReX_Array.H:40
Definition AMReX_GpuAllocators.H:172
uint64_t m_idcpu
Definition AMReX_Particle.H:359
Definition AMReX_Particle.H:259
Definition AMReX_Particle.H:154
Definition AMReX_ParticleTile.H:33
__host__ __device__ SuperParticleType getSuperParticle(int index) const noexcept
Definition AMReX_ParticleTile.H:241
T_ParticleType & ParticleRefType
Definition AMReX_ParticleTile.H:38
__host__ __device__ decltype(auto) cpu(const int index) const &
Definition AMReX_ParticleTile.H:86
uint64_t * m_idcpu
Definition AMReX_ParticleTile.H:56
GpuArray< ParticleReal *, NAR > m_rdata
Definition AMReX_ParticleTile.H:57
__host__ __device__ 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:182
__host__ __device__ decltype(auto) idcpu(const int index) const &
Definition AMReX_ParticleTile.H:96
__host__ __device__ ParticleReal * rdata(const int attribute_index) const
Definition AMReX_ParticleTile.H:106
__host__ __device__ 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:128
static constexpr int NStructInt
Definition AMReX_ParticleTile.H:44
GpuArray< int *, NAI > m_idata
Definition AMReX_ParticleTile.H:58
ParticleReal RealType
Definition AMReX_ParticleTile.H:40
__host__ __device__ decltype(auto) pos(const int dir, const int index) const &
Definition AMReX_ParticleTile.H:66
T_ParticleType ParticleType
Definition AMReX_ParticleTile.H:37
std::conditional_t< T_ParticleType::is_soa_particle, void *__restrict__, ParticleType *__restrict__ > AOS_PTR
Definition AMReX_ParticleTile.H:53
int m_num_runtime_int
Definition AMReX_ParticleTile.H:61
Long m_size
Definition AMReX_ParticleTile.H:50
static constexpr int NAR
Definition AMReX_ParticleTile.H:34
int IntType
Definition AMReX_ParticleTile.H:41
ParticleReal *__restrict__ *__restrict__ m_runtime_rdata
Definition AMReX_ParticleTile.H:62
int m_num_runtime_real
Definition AMReX_ParticleTile.H:60
static constexpr bool is_particle_tile_data
Definition AMReX_ParticleTile.H:48
__host__ __device__ int * idata(const int attribute_index) const
Definition AMReX_ParticleTile.H:112
AOS_PTR m_aos
Definition AMReX_ParticleTile.H:54
static constexpr int NAI
Definition AMReX_ParticleTile.H:35
int *__restrict__ *__restrict__ m_runtime_idata
Definition AMReX_ParticleTile.H:63
__host__ __device__ void setSuperParticle(const SuperParticleType &sp, int index) const noexcept
Definition AMReX_ParticleTile.H:288
static constexpr int NStructReal
Definition AMReX_ParticleTile.H:43
Definition AMReX_ParticleTile.H:721
typename ParticleType::StorageParticleType StorageParticleType
Definition AMReX_ParticleTile.H:747
int NumRealComps() const noexcept
Definition AMReX_ParticleTile.H:1133
void push_back_real(int comp, amrex::Vector< amrex::ParticleReal > const &vec)
Definition AMReX_ParticleTile.H:1068
int NumIntComps() const noexcept
Definition AMReX_ParticleTile.H:1135
typename ParticleType::RealType RealType
Definition AMReX_ParticleTile.H:728
ParticleTile()=default
int getNumNeighbors() const
Definition AMReX_ParticleTile.H:959
amrex::PODVector< const int *, Allocator< const int * > > m_runtime_i_cptrs
Definition AMReX_ParticleTile.H:1366
void push_back(const ParticleType &p)
Definition AMReX_ParticleTile.H:989
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:744
const SoA & GetStructOfArrays() const
Definition AMReX_ParticleTile.H:882
static constexpr int NAI
Definition AMReX_ParticleTile.H:727
ParticleTile(ParticleTile &&) noexcept=default
void push_back_real(int comp, const ParticleReal *beg, const ParticleReal *end)
Definition AMReX_ParticleTile.H:1051
static constexpr int NStructInt
Definition AMReX_ParticleTile.H:731
amrex::Gpu::HostVector< const ParticleReal * > m_h_runtime_r_cptrs
Definition AMReX_ParticleTile.H:1371
void setNumNeighbors(int num_neighbors)
Definition AMReX_ParticleTile.H:951
amrex::Gpu::HostVector< int * > m_h_runtime_i_ptrs
Definition AMReX_ParticleTile.H:1369
Long capacity() const
Definition AMReX_ParticleTile.H:1161
int numTotalParticles() const
Returns the total number of particles, real and neighbor.
Definition AMReX_ParticleTile.H:942
AoS m_aos_tile
Definition AMReX_ParticleTile.H:1357
std::size_t size() const
Returns the total number of particles (real and neighbor)
Definition AMReX_ParticleTile.H:890
static constexpr bool has_polymorphic_allocator
Definition AMReX_ParticleTile.H:752
ParticleTileDataType getParticleTileData()
Definition AMReX_ParticleTile.H:1203
void reserve(std::size_t capacity, GrowthStrategy strategy=GrowthStrategy::Poisson)
Definition AMReX_ParticleTile.H:977
void push_back(const SuperParticleType &sp)
Definition AMReX_ParticleTile.H:996
int numNeighborParticles() const
Returns the number of neighbor particles (excluding reals)
Definition AMReX_ParticleTile.H:929
~ParticleTile()=default
amrex::PODVector< ParticleReal *, Allocator< ParticleReal * > > m_runtime_r_ptrs
Definition AMReX_ParticleTile.H:1362
const AoS & GetArrayOfStructs() const
Definition AMReX_ParticleTile.H:879
static constexpr int NAR
Definition AMReX_ParticleTile.H:726
ConstParticleTileDataType getConstParticleTileData() const
Definition AMReX_ParticleTile.H:1279
void shrink_to_fit()
Definition AMReX_ParticleTile.H:1141
T_ParticleType ParticleType
Definition AMReX_ParticleTile.H:725
int numParticles() const
Returns the number of real particles (excluding neighbors)
Definition AMReX_ParticleTile.H:903
void push_back_int(int comp, amrex::Vector< int > const &vec)
Definition AMReX_ParticleTile.H:1120
amrex::Gpu::HostVector< ParticleReal * > m_h_runtime_r_ptrs
Definition AMReX_ParticleTile.H:1368
void resize(std::size_t count, GrowthStrategy strategy=GrowthStrategy::Poisson)
Definition AMReX_ParticleTile.H:969
void swap(ParticleTile< ParticleType, NArrayReal, NArrayInt, Allocator > &other) noexcept
Definition AMReX_ParticleTile.H:1183
void push_back_int(int comp, amrex::Vector< int >::const_iterator beg, amrex::Vector< int >::const_iterator end)
Definition AMReX_ParticleTile.H:1112
void push_back_real(const std::array< ParticleReal, NArrayReal > &v)
Definition AMReX_ParticleTile.H:1041
int NumRuntimeRealComps() const noexcept
Definition AMReX_ParticleTile.H:1137
amrex::Gpu::HostVector< const int * > m_h_runtime_i_cptrs
Definition AMReX_ParticleTile.H:1372
amrex::PODVector< const ParticleReal *, Allocator< const ParticleReal * > > m_runtime_r_cptrs
Definition AMReX_ParticleTile.H:1365
AoS & GetArrayOfStructs()
Definition AMReX_ParticleTile.H:878
RealType & pos(int index, int position_index) &
Definition AMReX_ParticleTile.H:855
typename SoA::IntVector IntVector
Definition AMReX_ParticleTile.H:746
void push_back_int(const std::array< int, NArrayInt > &v)
Definition AMReX_ParticleTile.H:1093
void push_back_real(int comp, amrex::Vector< amrex::ParticleReal >::const_iterator beg, amrex::Vector< amrex::ParticleReal >::const_iterator end)
Definition AMReX_ParticleTile.H:1060
Allocator< T > AllocatorType
Definition AMReX_ParticleTile.H:723
int NumRuntimeIntComps() const noexcept
Definition AMReX_ParticleTile.H:1139
bool empty() const
Definition AMReX_ParticleTile.H:884
void push_back_int(int comp, int v)
Definition AMReX_ParticleTile.H:1085
RealType pos(int index, int position_index) const &
Definition AMReX_ParticleTile.H:869
decltype(auto) cpu(int index) &
Definition AMReX_ParticleTile.H:837
void define(int a_num_runtime_real, int a_num_runtime_int, std::vector< std::string > *soa_rdata_names=nullptr, std::vector< std::string > *soa_idata_names=nullptr, Arena *a_arena=nullptr)
Definition AMReX_ParticleTile.H:767
SoA m_soa_tile
Definition AMReX_ParticleTile.H:1358
SoA & GetStructOfArrays()
Definition AMReX_ParticleTile.H:881
void push_back_int(int comp, std::size_t npar, int v)
Definition AMReX_ParticleTile.H:1128
bool m_defined
Definition AMReX_ParticleTile.H:1360
void push_back_real(int comp, std::size_t npar, ParticleReal v)
Definition AMReX_ParticleTile.H:1076
void push_back_int(int comp, const int *beg, const int *end)
Definition AMReX_ParticleTile.H:1103
typename SoA::RealVector RealVector
Definition AMReX_ParticleTile.H:745
amrex::PODVector< int *, Allocator< int * > > m_runtime_i_ptrs
Definition AMReX_ParticleTile.H:1363
int numRealParticles() const
Returns the number of real particles (excluding neighbors)
Definition AMReX_ParticleTile.H:916
std::conditional_t< ParticleType::is_soa_particle, ThisParticleTileHasNoAoS, ArrayOfStructs< ParticleType, Allocator > > AoS
Definition AMReX_ParticleTile.H:738
static constexpr int NStructReal
Definition AMReX_ParticleTile.H:730
void push_back_real(int comp, ParticleReal v)
Definition AMReX_ParticleTile.H:1033
The struct used to store particles.
Definition AMReX_Particle.H:404
__host__ __device__ RealVect pos() const &
Definition AMReX_Particle.H:454
__host__ __device__ int & idata(int index) &
Definition AMReX_Particle.H:543
__host__ __device__ ParticleCPUWrapper cpu() &
Definition AMReX_Particle.H:422
__host__ __device__ ParticleIDWrapper id() &
Definition AMReX_Particle.H:425
__host__ __device__ RealType & rdata(int index) &
Definition AMReX_Particle.H:472
Definition AMReX_Particle.H:388
Definition AMReX_ParticleTile.H:389
static constexpr int NArrayReal
Definition AMReX_ParticleTile.H:390
__host__ __device__ uint64_t & idcpu() &
Definition AMReX_ParticleTile.H:418
static Long UnprotectedNextID()
This version can only be used inside omp critical.
Definition AMReX_ParticleTile.H:496
__host__ __device__ ConstParticleCPUWrapper cpu() const &
Definition AMReX_ParticleTile.H:421
PTD m_particle_tile_data
Definition AMReX_ParticleTile.H:466
static Long the_next_id
Definition AMReX_ParticleTile.H:407
static constexpr int NArrayInt
Definition AMReX_ParticleTile.H:391
__host__ __device__ const uint64_t & idcpu() const &
Definition AMReX_ParticleTile.H:427
int m_index
Definition AMReX_ParticleTile.H:467
__host__ __device__ RealVect pos() const &
Definition AMReX_ParticleTile.H:432
ParticleReal RealType
Definition AMReX_ParticleTile.H:398
__host__ __device__ ParticleCPUWrapper cpu() &
Definition AMReX_ParticleTile.H:412
__host__ __device__ ParticleIDWrapper id() &
Definition AMReX_ParticleTile.H:415
static constexpr bool is_constsoa_particle
Definition AMReX_ParticleTile.H:395
__host__ __device__ RealType & pos(int position_index) &
Definition AMReX_ParticleTile.H:435
int IntType
Definition AMReX_ParticleTile.H:399
__host__ __device__ SoAParticle(PTD const &ptd, long i)
Definition AMReX_ParticleTile.H:402
__host__ __device__ ConstParticleIDWrapper id() const &
Definition AMReX_ParticleTile.H:424
static Long NextID()
Definition AMReX_ParticleTile.H:475
__host__ __device__ RealType pos(int position_index) const &
Definition AMReX_ParticleTile.H:442
Definition AMReX_StructOfArrays.H:20
Definition AMReX_ParticleTile.H:714
Definition AMReX_ParticleTile.H:712
Definition AMReX_MakeParticle.H:13