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