1#ifndef AMREX_PARTICLETILE_H_
2#define AMREX_PARTICLETILE_H_
3#include <AMReX_Config.H>
22template <
int NArrayReal,
int NArrayInt>
23struct ConstSoAParticle;
24template <
int NArrayReal,
int NArrayInt>
27template <
typename T_ParticleType,
int NArrayReal,
int NArrayInt>
28struct ConstParticleTileData;
31template <
typename T_ParticleType,
int NArrayReal,
int NArrayInt>
34 static constexpr int NAR = NArrayReal;
35 static constexpr int NAI = NArrayInt;
52 using AOS_PTR = std::conditional_t<T_ParticleType::is_soa_particle,
66 decltype(
auto)
pos (
const int dir,
const int index)
const &
68 if constexpr(!ParticleType::is_soa_particle) {
69 return this->m_aos[index].pos(dir);
71 return this->m_rdata[dir][index];
76 decltype(
auto)
id (
const int index)
const &
78 if constexpr(!ParticleType::is_soa_particle) {
79 return this->m_aos[index].id();
86 decltype(
auto)
cpu (
const int index)
const &
88 if constexpr(!ParticleType::is_soa_particle) {
89 return this->m_aos[index].cpu();
96 decltype(
auto)
idcpu (
const int index)
const &
98 if constexpr(ParticleType::is_soa_particle) {
99 return this->m_idcpu[index];
101 return this->m_aos[index].idcpu();
108 return this->m_rdata[attribute_index];
112 int *
idata (
const int attribute_index)
const
114 return this->m_idata[attribute_index];
118 decltype(
auto)
operator[] (
const int index)
const
120 if constexpr (!ParticleType::is_soa_particle) {
129 const int* comm_real,
const int * comm_int)
const noexcept
132 auto* dst = buffer + dst_offset;
133 if constexpr (!ParticleType::is_soa_particle) {
137 memcpy(dst,
m_idcpu + src_index,
sizeof(uint64_t));
138 dst +=
sizeof(uint64_t);
140 int array_start_index = 0;
141 if constexpr (!ParticleType::is_soa_particle) {
144 for (
int i = 0; i <
NAR; ++i)
146 if (comm_real[array_start_index + i])
152 int runtime_start_index = array_start_index +
NAR;
155 if (comm_real[runtime_start_index + i])
162 for (
int i = 0; i <
NAI; ++i)
164 if (comm_int[array_start_index + i])
166 memcpy(dst,
m_idata[i] + src_index,
sizeof(
int));
173 if (comm_int[runtime_start_index + i])
183 const int* comm_real,
const int* comm_int)
const noexcept
186 const auto* src = buffer + src_offset;
187 if constexpr (!ParticleType::is_soa_particle) {
191 memcpy(
m_idcpu + dst_index, src,
sizeof(uint64_t));
192 src +=
sizeof(uint64_t);
194 int array_start_index = 0;
195 if constexpr (!ParticleType::is_soa_particle) {
198 if constexpr (
NAR > 0) {
199 for (
int i = 0; i <
NAR; ++i)
201 if (comm_real[array_start_index + i])
208 int runtime_start_index = array_start_index +
NAR;
211 if (comm_real[runtime_start_index + i])
218 if constexpr (
NAI > 0) {
219 for (
int i = 0; i <
NAI; ++i)
221 if (comm_int[array_start_index + i])
223 memcpy(
m_idata[i] + dst_index, src,
sizeof(
int));
231 if (comm_int[runtime_start_index + i])
239 template <
typename T = ParticleType, std::enable_if_t<!T::is_soa_particle,
int> = 0>
245 for (
int i = 0; i < AMREX_SPACEDIM; ++i) {
251 if constexpr (
NAR >0) {
252 for (
int i = 0; i <
NAR; ++i) {
261 if constexpr (
NAI > 0) {
262 for (
int i = 0; i <
NAI; ++i) {
269 template <
typename T = ParticleType, std::enable_if_t<T::is_soa_particle,
int> = 0>
276 for (
int i = 0; i < AMREX_SPACEDIM; ++i) {sp.
pos(i) =
m_rdata[i][index];}
277 for (
int i = 0; i <
NAR; ++i) {
280 for (
int i = 0; i <
NAI; ++i) {
286 template <
typename T = ParticleType, std::enable_if_t<!T::is_soa_particle,
int> = 0>
290 for (
int i = 0; i < AMREX_SPACEDIM; ++i) {
291 m_aos[index].pos(i) = sp.pos(i);
294 m_aos[index].rdata(i) = sp.rdata(i);
296 for (
int i = 0; i <
NAR; ++i) {
299 m_aos[index].id() = sp.id();
300 m_aos[index].cpu() = sp.cpu();
302 m_aos[index].idata(i) = sp.idata(i);
304 for (
int i = 0; i <
NAI; ++i) {
309 template <
typename T = ParticleType, std::enable_if_t<T::is_soa_particle,
int> = 0>
314 for (
int i = 0; i <
NAR; ++i) {
315 m_rdata[i][index] = sp.rdata(i);
317 for (
int i = 0; i <
NAI; ++i) {
318 m_idata[i][index] = sp.idata(i);
324template <
int T_NArrayReal,
int T_NArrayInt>
339 m_constparticle_tile_data(ptd), m_index(
int(i))
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]));}
362 return this->m_constparticle_tile_data.
m_rdata[position_index][m_index];
381 static_assert(std::is_trivially_copyable<ConstPTD>(),
"ParticleTileData is not trivially copyable");
387template <
int T_NArrayReal,
int T_NArrayInt>
403 m_particle_tile_data(ptd), m_index(
int(i))
418 uint64_t&
idcpu () & {
return this->m_particle_tile_data.
m_idcpu[m_index]; }
427 const uint64_t&
idcpu () const & {
return this->m_particle_tile_data.
m_idcpu[m_index]; }
438 return this->m_particle_tile_data.
m_rdata[position_index][m_index];
445 return this->m_particle_tile_data.
m_rdata[position_index][m_index];
464 static_assert(std::is_trivially_copyable<PTD>(),
"ParticleTileData is not trivially copyable");
466 PTD m_particle_tile_data;
473template <
int NArrayReal,
int NArrayInt>
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
485 next = the_next_id++;
488 amrex::Abort(
"SoAParticle<NArrayReal, NArrayInt>::NextID() -- too many particles");
494template <
int NArrayReal,
int NArrayInt>
498 Long next = the_next_id++;
500 amrex::Abort(
"SoAParticle<NArrayReal, NArrayInt>::NextID() -- too many particles");
505template <
int NArrayReal,
int NArrayInt>
509 the_next_id = nextid;
512template <
typename T_ParticleType,
int NArrayReal,
int NArrayInt>
515 static constexpr int NAR = NArrayReal;
516 static constexpr int NAI = NArrayInt;
531 using AOS_PTR = std::conditional_t<T_ParticleType::is_soa_particle,
540 decltype(
auto)
pos (
const int dir,
const int index)
const &
542 if constexpr(!ParticleType::is_soa_particle) {
543 return this->m_aos[index].pos(dir);
545 return this->m_rdata[dir][index];
550 decltype(
auto)
id (
const int index)
const &
552 if constexpr(!ParticleType::is_soa_particle) {
553 return this->m_aos[index].id();
560 decltype(
auto)
cpu (
const int index)
const &
562 if constexpr(!ParticleType::is_soa_particle) {
563 return this->m_aos[index].cpu();
570 decltype(
auto)
idcpu (
const int index)
const &
572 if constexpr(ParticleType::is_soa_particle) {
573 return this->m_idcpu[index];
575 return this->m_aos[index].idcpu();
582 return this->m_rdata[attribute_index];
586 const int *
idata (
const int attribute_index)
const
588 return this->m_idata[attribute_index];
592 decltype(
auto)
operator[] (
const int index)
const
594 if constexpr (!ParticleType::is_soa_particle) {
608 const int* comm_real,
const int * comm_int)
const noexcept
611 auto* dst = buffer + dst_offset;
612 if constexpr (!ParticleType::is_soa_particle) {
616 memcpy(dst,
m_idcpu + src_index,
sizeof(uint64_t));
617 dst +=
sizeof(uint64_t);
619 int array_start_index = 0;
620 if constexpr (!ParticleType::is_soa_particle) {
623 if constexpr (NArrayReal > 0) {
624 for (
int i = 0; i < NArrayReal; ++i)
626 if (comm_real[array_start_index + i])
633 int runtime_start_index = array_start_index + NArrayReal;
636 if (comm_real[runtime_start_index + i])
643 if constexpr (NArrayInt > 0) {
644 for (
int i = 0; i < NArrayInt; ++i)
646 if (comm_int[array_start_index + i])
648 memcpy(dst,
m_idata[i] + src_index,
sizeof(
int));
653 runtime_start_index = 2 +
NStructInt + NArrayInt;
656 if (comm_int[runtime_start_index + i])
664 template <
typename T = ParticleType, std::enable_if_t<!T::is_soa_particle,
int> = 0>
670 for (
int i = 0; i < AMREX_SPACEDIM; ++i) {
676 if constexpr(NArrayReal > 0) {
677 for (
int i = 0; i < NArrayReal; ++i) {
686 if constexpr(NArrayInt > 0) {
687 for (
int i = 0; i < NArrayInt; ++i) {
694 template <
typename T = ParticleType, std::enable_if_t<T::is_soa_particle,
int> = 0>
700 for (
int i = 0; i < AMREX_SPACEDIM; ++i) {sp.
pos(i) =
m_rdata[i][index];}
702 for (
int i = 0; i <
NAR; ++i) {
705 for (
int i = 0; i <
NAI; ++i) {
718template <
typename T_ParticleType,
int NArrayReal,
int NArrayInt,
722 template <
typename T>
726 static constexpr int NAR = NArrayReal;
727 static constexpr int NAI = NArrayInt;
735 using AoS = std::conditional_t<
736 ParticleType::is_soa_particle,
741 using SoA = std::conditional_t<
742 ParticleType::is_soa_particle,
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
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);
784 if constexpr (ParticleType::is_soa_particle) {
787 "ParticleTile with PolymorphicArenaAllocator redefined with "
788 "different memory arena");
791 a_arena == m_aos_tile().arena(),
792 "ParticleTile with PolymorphicArenaAllocator redefined with "
793 "different memory arena");
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()");
802 if constexpr (ParticleType::is_soa_particle) {
805 m_aos_tile().setArena(a_arena);
819 decltype(
auto)
id (
int index) & {
820 if constexpr (!ParticleType::is_soa_particle) {
821 return m_aos_tile[index].id();
828 decltype(
auto)
id (
int index)
const & {
829 if constexpr (!ParticleType::is_soa_particle) {
830 return m_aos_tile[index].id();
837 decltype(
auto)
cpu (
int index) & {
838 if constexpr (!ParticleType::is_soa_particle) {
839 return m_aos_tile[index].cpu();
846 decltype(
auto)
cpu (
int index)
const & {
847 if constexpr (!ParticleType::is_soa_particle) {
848 return m_aos_tile[index].cpu();
856 if constexpr (!ParticleType::is_soa_particle) {
857 return m_aos_tile[index].pos(position_index);
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");
864 return m_soa_tile.GetRealData(position_index)[index];
871 if constexpr (!ParticleType::is_soa_particle) {
872 return m_aos_tile[index].pos(position_index);
874 return m_soa_tile.GetRealData(position_index)[index];
892 if constexpr (!ParticleType::is_soa_particle) {
893 return m_aos_tile.size();
895 return m_soa_tile.size();
905 if constexpr (!ParticleType::is_soa_particle) {
906 return m_aos_tile.numParticles();
908 return m_soa_tile.numParticles();
918 if constexpr (!ParticleType::is_soa_particle) {
919 return m_aos_tile.numRealParticles();
921 return m_soa_tile.numRealParticles();
931 if constexpr (!ParticleType::is_soa_particle) {
932 return m_aos_tile.numNeighborParticles();
934 return m_soa_tile.numNeighborParticles();
944 if constexpr (!ParticleType::is_soa_particle) {
945 return m_aos_tile.numTotalParticles();
947 return m_soa_tile.numTotalParticles();
953 if constexpr(!ParticleType::is_soa_particle) {
954 m_aos_tile.setNumNeighbors(num_neighbors);
956 m_soa_tile.setNumNeighbors(num_neighbors);
961 if constexpr (!ParticleType::is_soa_particle) {
962 AMREX_ASSERT( m_soa_tile.getNumNeighbors() == m_aos_tile.getNumNeighbors() );
963 return m_aos_tile.getNumNeighbors();
965 return m_soa_tile.getNumNeighbors();
971 if constexpr (!ParticleType::is_soa_particle) {
972 m_aos_tile.resize(count, strategy);
974 m_soa_tile.resize(count, strategy);
979 if constexpr (!ParticleType::is_soa_particle) {
980 m_aos_tile.reserve(
capacity, strategy);
982 m_soa_tile.reserve(
capacity, strategy);
988 template <
typename T = ParticleType, std::enable_if_t<!T::is_soa_particle,
int> = 0>
994 template <
int NR = NArrayReal,
int NI = NArrayInt,
995 std::enable_if_t<NR != 0 || NI != 0, int> foo = 0>
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);
1006 m_aos_tile[np].rdata(i) = sp.
rdata(i);
1008 m_aos_tile[np].id() = sp.
id();
1009 m_aos_tile[np].cpu() = sp.
cpu();
1011 m_aos_tile[np].idata(i) = sp.
idata(i);
1015 m_soa_tile.resize(np+1);
1016 if constexpr (ParticleType::is_soa_particle) {
1017 m_soa_tile.GetIdCPUData()[np] = sp.
m_idcpu;
1019 auto& arr_rdata = m_soa_tile.GetRealData();
1020 auto& arr_idata = m_soa_tile.GetIntData();
1021 for (
int i = 0; i < NArrayReal; ++i) {
1024 for (
int i = 0; i < NArrayInt; ++i) {
1034 m_soa_tile.GetRealData(comp).push_back(v);
1042 for (
int i = 0; i < NArrayReal; ++i) {
1043 m_soa_tile.GetRealData(i).push_back(v[i]);
1052 auto it = m_soa_tile.GetRealData(comp).end();
1053 m_soa_tile.GetRealData(comp).insert(it, beg,
end);
1077 auto new_size = m_soa_tile.GetRealData(comp).size() + npar;
1078 m_soa_tile.GetRealData(comp).resize(new_size, v);
1086 m_soa_tile.GetIntData(comp).push_back(v);
1094 for (
int i = 0; i < NArrayInt; ++i) {
1095 m_soa_tile.GetIntData(i).push_back(v[i]);
1104 auto it = m_soa_tile.GetIntData(comp).end();
1105 m_soa_tile.GetIntData(comp).insert(it, beg,
end);
1129 auto new_size = m_soa_tile.GetIntData(comp).size() + npar;
1130 m_soa_tile.GetIntData(comp).resize(new_size, v);
1135 int NumIntComps () const noexcept {
return m_soa_tile.NumIntComps(); }
1143 if constexpr (ParticleType::is_soa_particle) {
1146 m_aos_tile().shrink_to_fit();
1151 rdata.shrink_to_fit();
1157 idata.shrink_to_fit();
1164 if constexpr (ParticleType::is_soa_particle) {
1167 nbytes += m_aos_tile().capacity() *
sizeof(
ParticleType);
1178 nbytes += idata.capacity()*
sizeof(
int);
1185 if constexpr (ParticleType::is_soa_particle) {
1186 GetStructOfArrays().GetIdCPUData().swap(other.GetStructOfArrays().GetIdCPUData());
1188 m_aos_tile().swap(other.GetArrayOfStructs()());
1193 rdata.swap(other.GetStructOfArrays().GetRealData(j));
1199 idata.swap(other.GetStructOfArrays().GetIntData(j));
1205 m_runtime_r_ptrs.resize(m_soa_tile.NumRealComps() - NArrayReal);
1206 m_runtime_i_ptrs.resize(m_soa_tile.NumIntComps() - NArrayInt);
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();
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();
1231 m_h_runtime_i_ptrs.size()*
sizeof(
int*));
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();
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();
1244 if constexpr (!ParticleType::is_soa_particle) {
1245 ptd.
m_aos = m_aos_tile().dataPtr();
1247 ptd.
m_aos =
nullptr;
1249 if constexpr (ParticleType::is_soa_particle) {
1250 ptd.
m_idcpu = m_soa_tile.GetIdCPUData().dataPtr();
1254 if constexpr(NArrayReal > 0) {
1255 for (
int i = 0; i < NArrayReal; ++i) {
1256 ptd.
m_rdata[i] = m_soa_tile.GetRealData(i).dataPtr();
1259 if constexpr(NArrayInt > 0) {
1260 for (
int i = 0; i < NArrayInt; ++i) {
1261 ptd.
m_idata[i] = m_soa_tile.GetIntData(i).dataPtr();
1271 if (copy_real || copy_int) {
1281 m_runtime_r_cptrs.resize(m_soa_tile.NumRealComps() - NArrayReal);
1282 m_runtime_i_cptrs.resize(m_soa_tile.NumIntComps() - NArrayInt);
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();
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();
1307 m_h_runtime_i_cptrs.size()*
sizeof(
int*));
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();
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();
1320 if constexpr (!ParticleType::is_soa_particle) {
1321 ptd.
m_aos = m_aos_tile().dataPtr();
1323 ptd.
m_aos =
nullptr;
1325 if constexpr (ParticleType::is_soa_particle) {
1326 ptd.
m_idcpu = m_soa_tile.GetIdCPUData().dataPtr();
1330 if constexpr(NArrayReal > 0) {
1331 for (
int i = 0; i < NArrayReal; ++i) {
1332 ptd.
m_rdata[i] = m_soa_tile.GetRealData(i).dataPtr();
1335 if constexpr(NArrayInt > 0) {
1336 for (
int i = 0; i < NArrayInt; ++i) {
1337 ptd.
m_idata[i] = m_soa_tile.GetIntData(i).dataPtr();
1347 if (copy_real || copy_int) {
1359 if constexpr (!ParticleType::is_soa_particle) {
1360 m_aos_tile.collectVectors(pv);
1364 m_soa_tile.collectVectors(idcpuv, rv, iv);
1370 for (
auto [p,s] : addsizes) {
1371 p->reserve(p->size()+s);
1374 using PV = std::conditional_t<ParticleType::is_soa_particle,
1380 for (
auto [p,s] : addsizes) {
1386 p->collectVectors(pv, idcpuv, rv, iv);
1387 if constexpr (!ParticleType::is_soa_particle) {
1388 for (
auto* v : pv) {
1389 pvs.emplace_back(v, s);
1392 for (
auto* v : idcpuv) {
1393 ids.emplace_back(v, s);
1395 for (
auto* v : rv) {
1396 rvs.emplace_back(v, s);
1398 for (
auto* v : iv) {
1399 ivs.emplace_back(v, s);
1404 std::sort(pvs.begin(), pvs.end(), [] (
auto const& a,
auto const& b) {
1405 return (a.first->size() + a.second) >
1406 (b.first->size() + b.second);
1408 std::sort(ids.begin(), ids.end(), [] (
auto const& a,
auto const& b) {
1409 return (a.first->size() + a.second) >
1410 (b.first->size() + b.second);
1412 std::sort(rvs.begin(), rvs.end(), [] (
auto const& a,
auto const& b) {
1413 return (a.first->size() + a.second) >
1414 (b.first->size() + b.second);
1416 std::sort(ivs.begin(), ivs.end(), [] (
auto const& a,
auto const& b) {
1417 return (a.first->size() + a.second) >
1418 (b.first->size() + b.second);
1423 int i_pvs = 0, i_ids = 0, i_rvs = 0, i_ivs = 0;
1428 while ((i_pvs < n_pvs) || (i_ids < n_ids) || (i_rvs < n_rvs) ||
1430 std::size_t nbytes = 0;
1432 if (i_pvs < n_pvs) {
1433 std::size_t my_bytes = (pvs[i_pvs].first->
size()
1434 + pvs[i_pvs].second) *
sizeof(
typename PV::value_type);
1435 if (my_bytes > nbytes) {
1440 if (i_ids < n_ids) {
1441 std::size_t my_bytes = (ids[i_ids].first->
size()
1442 + ids[i_ids].second) *
sizeof(
typename SoA::IdCPU::value_type);
1443 if (my_bytes > nbytes) {
1448 if (i_rvs < n_rvs) {
1449 std::size_t my_bytes = (rvs[i_rvs].first->
size()
1450 + rvs[i_rvs].second) *
sizeof(
typename RealVector::value_type);
1451 if (my_bytes > nbytes) {
1456 if (i_ivs < n_ivs) {
1457 std::size_t my_bytes = (ivs[i_ivs].first->
size()
1458 + ivs[i_ivs].second) *
sizeof(
typename IntVector::value_type);
1459 if (my_bytes > nbytes) {
1465 auto [p,s] = pvs[i_pvs++];
1466 p->reserve(p->size() + s);
1467 }
else if (ii == 1) {
1468 auto [p,s] = ids[i_ids++];
1469 p->reserve(p->size() + s);
1470 }
else if (ii == 2) {
1471 auto [p,s] = rvs[i_rvs++];
1472 p->reserve(p->size() + s);
1474 auto [p,s] = ivs[i_ivs++];
1475 p->reserve(p->size() + s);
1487 bool m_defined =
false;
#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:115
A virtual base class for objects that manage their own dynamic memory allocation.
Definition AMReX_Arena.H:124
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
Long size() const noexcept
Definition AMReX_Vector.H:53
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
__host__ __device__ void ignore_unused(const Ts &...)
This shuts up the compiler about unused variables.
Definition AMReX.H:138
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
const int[]
Definition AMReX_BLProfiler.cpp:1664
__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
static void NextID(Long nextid)
Reset on restart.
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:41
Definition AMReX_GpuAllocators.H:167
Definition AMReX_GpuAllocators.H:178
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
int getNumNeighbors() const
Definition AMReX_ParticleTile.H:959
typename AoS::ParticleVector ParticleVector
Definition AMReX_ParticleTile.H:739
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
void setNumNeighbors(int num_neighbors)
Definition AMReX_ParticleTile.H:951
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
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
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
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
void collectVectors(Vector< ParticleVector * > &pv, Vector< typename SoA::IdCPU * > &idcpuv, Vector< RealVector * > &rv, Vector< IntVector * > &iv)
Definition AMReX_ParticleTile.H:1355
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 & GetStructOfArrays()
Definition AMReX_ParticleTile.H:881
void push_back_int(int comp, std::size_t npar, int v)
Definition AMReX_ParticleTile.H:1128
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
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
static void reserve(std::map< ParticleTile< T_ParticleType, NArrayReal, NArrayInt, Allocator > *, int > const &addsizes)
Definition AMReX_ParticleTile.H:1367
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
ParticleTileData< SoAParticleBase, NArrayReal, NArrayInt > PTD
Definition AMReX_ParticleTile.H:393
__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
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
__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