Block-Structured AMR Software Framework
Loading...
Searching...
No Matches
AMReX_ParticleBufferMap.H
Go to the documentation of this file.
1#ifndef AMREX_PARTICLEBUFFERMAP_H_
2#define AMREX_PARTICLEBUFFERMAP_H_
3#include <AMReX_Config.H>
4
5#include <AMReX_BoxArray.H>
7#include <AMReX_Gpu.H>
9#include <AMReX_ParGDB.H>
10
11namespace amrex {
12
13struct GetPID
14{
15 const int* m_bucket_to_pid;
17 const int* m_lev_offsets;
18 const int* m_gid_offsets;
19
20 GetPID (const Gpu::DeviceVector<int>& bucket_to_pid,
21 const Gpu::DeviceVector<int>& lev_gid_tid_to_bucket,
22 const Gpu::DeviceVector<int>& lev_offsets,
23 const Gpu::DeviceVector<int>& gid_offsets)
24 : m_bucket_to_pid(bucket_to_pid.dataPtr()),
25 m_lev_gid_tid_to_bucket(lev_gid_tid_to_bucket.dataPtr()),
26 m_lev_offsets(lev_offsets.dataPtr()),
27 m_gid_offsets(gid_offsets.dataPtr())
28 {}
29
31 int operator() (const int lev, const int gid, const int tid) const noexcept
32 {
34 }
35};
36
38{
40 const int* m_lev_offsets;
41 const int* m_gid_offsets;
42
43 GetBucket (const int* lev_gid_tid_to_bucket_ptr,
44 const int* lev_offsets_ptr,
45 const int* gid_offsets_ptr)
46 : m_lev_gid_tid_to_bucket(lev_gid_tid_to_bucket_ptr),
47 m_lev_offsets(lev_offsets_ptr),
48 m_gid_offsets(gid_offsets_ptr)
49 {}
50
52 int operator() (const int lev, const int gid, const int tid) const noexcept
53 {
55 }
56};
57
59{
60 bool m_defined{false};
63
64 Vector<int> m_bucket_to_gid;
65 Vector<int> m_bucket_to_tid;
66 Vector<int> m_bucket_to_lev;
67 Vector<int> m_bucket_to_pid;
68
69 Vector<int> m_lev_gid_tid_to_bucket;
70 Vector<int> m_lev_offsets;
71 Vector<int> m_gid_offsets;
72
73 Vector<int> m_proc_box_counts;
74 Vector<int> m_proc_box_offsets;
75
76 bool m_do_tiling{false};
77 IntVect m_tile_size{AMREX_D_DECL(1024000, 1024000, 1024000)};
78
79 Gpu::DeviceVector<int> d_bucket_to_pid;
80 Gpu::DeviceVector<int> d_lev_gid_tid_to_bucket;
81 Gpu::DeviceVector<int> d_lev_offsets;
82 Gpu::DeviceVector<int> d_gid_offsets;
83
84public:
85 ParticleBufferMap () = default;
86
87 ParticleBufferMap (const ParGDBBase* a_gdb);
88
89 ParticleBufferMap (const ParGDBBase* a_gdb, bool a_do_tiling, const IntVect& a_tile_size);
90
91 void define (const ParGDBBase* a_gdb);
92
93 void define (const ParGDBBase* a_gdb, bool a_do_tiling, const IntVect& a_tile_size);
94
95 bool isValid (const ParGDBBase* a_gdb) const;
96
97 bool isValid (const ParGDBBase* a_gdb, bool a_do_tiling, const IntVect& a_tile_size) const;
98
99 [[nodiscard]] AMREX_FORCE_INLINE
100 int numLevels () const
101 {
102 AMREX_ASSERT(m_defined);
103 return static_cast<int>(m_lev_offsets.size()-1);
104 }
105
106 [[nodiscard]] AMREX_FORCE_INLINE
107 int numBuckets () const
108 {
109 AMREX_ASSERT(m_defined);
110 return static_cast<int>(m_bucket_to_gid.size());
111 }
112
113 [[nodiscard]] AMREX_FORCE_INLINE
114 int bucketToGrid (int bid) const
115 {
116 AMREX_ASSERT(m_defined);
117 return m_bucket_to_gid[bid];
118 }
119
120 [[nodiscard]] AMREX_FORCE_INLINE
121 int bucketToTile (int bid) const
122 {
123 AMREX_ASSERT(m_defined);
124 return m_bucket_to_tid[bid];
125 }
126
127 [[nodiscard]] AMREX_FORCE_INLINE
128 int bucketToLevel (int bid) const
129 {
130 AMREX_ASSERT(m_defined);
131 return m_bucket_to_lev[bid];
132 }
133
134 [[nodiscard]] AMREX_FORCE_INLINE
135 int bucketToProc (int bid) const
136 {
137 AMREX_ASSERT(m_defined);
138 return m_bucket_to_pid[bid];
139 }
140
141 [[nodiscard]] AMREX_FORCE_INLINE
142 int gridAndLevToBucket (int gid, int lev) const
143 {
144 AMREX_ASSERT(!m_do_tiling);
145 return gridAndTileAndLevToBucket(gid, 0, lev);
146 }
147
148 [[nodiscard]] AMREX_FORCE_INLINE
149 int gridAndTileAndLevToBucket (int gid, int tid, int lev) const
150 {
151 AMREX_ASSERT(m_defined);
152 return m_lev_gid_tid_to_bucket[m_gid_offsets[m_lev_offsets[lev] + gid] + tid];
153 }
154
155 [[nodiscard]] AMREX_FORCE_INLINE
156 int firstBucketOnProc (int pid) const
157 {
158 AMREX_ASSERT(m_defined);
159 return m_proc_box_offsets[pid];
160 }
161
162 [[nodiscard]] AMREX_FORCE_INLINE
163 int numBoxesOnProc (int pid) const
164 {
165 AMREX_ASSERT(m_defined);
166 return m_proc_box_counts[pid];
167 }
168
169 [[nodiscard]] AMREX_FORCE_INLINE
171 {
172 AMREX_ASSERT(m_defined);
173 Vector<int> buckets;
174 for (int i = 0; i < numBoxesOnProc(pid); ++i)
175 {
176 buckets.push_back(i+firstBucketOnProc(pid));
177 }
178 return buckets;
179 }
180
181 [[nodiscard]] AMREX_FORCE_INLINE
182 int procID (int gid, int lev) const
183 {
184 AMREX_ASSERT(!m_do_tiling);
185 return procID(gid, 0, lev);
186 }
187
188 [[nodiscard]] AMREX_FORCE_INLINE
189 int procID (int gid, int tid, int lev) const
190 {
191 AMREX_ASSERT(m_defined);
192 return m_bucket_to_pid[gridAndTileAndLevToBucket(gid, tid, lev)];
193 }
194
195 [[nodiscard]] GetPID getPIDFunctor () const noexcept { return GetPID(d_bucket_to_pid, d_lev_gid_tid_to_bucket, d_lev_offsets, d_gid_offsets);}
196 [[nodiscard]] GetBucket getBucketFunctor () const noexcept { return GetBucket(d_lev_gid_tid_to_bucket.data(), d_lev_offsets.data(), d_gid_offsets.data());}
197 [[nodiscard]] GetBucket getHostBucketFunctor () const noexcept { return GetBucket(m_lev_gid_tid_to_bucket.data(), m_lev_offsets.data(), m_gid_offsets.data());}
198
199};
200
201} // namespace amrex
202
203#endif // AMREX_PARTICLEBUFFERMAP_H_
#define AMREX_ASSERT(EX)
Definition AMReX_BLassert.H:38
#define AMREX_FORCE_INLINE
Definition AMReX_Extension.H:119
#define AMREX_GPU_HOST_DEVICE
Definition AMReX_GpuQualifiers.H:20
#define AMREX_D_DECL(a, b, c)
Definition AMReX_SPACE.H:171
Dynamically allocated vector for trivially copyable data.
Definition AMReX_PODVector.H:308
T * data() noexcept
Definition AMReX_PODVector.H:666
Definition AMReX_ParGDB.H:13
Definition AMReX_ParticleBufferMap.H:59
bool isValid(const ParGDBBase *a_gdb) const
Definition AMReX_ParticleBufferMap.cpp:154
int bucketToProc(int bid) const
Definition AMReX_ParticleBufferMap.H:135
int procID(int gid, int tid, int lev) const
Definition AMReX_ParticleBufferMap.H:189
GetPID getPIDFunctor() const noexcept
Definition AMReX_ParticleBufferMap.H:195
int firstBucketOnProc(int pid) const
Definition AMReX_ParticleBufferMap.H:156
void define(const ParGDBBase *a_gdb)
Definition AMReX_ParticleBufferMap.cpp:17
int bucketToLevel(int bid) const
Definition AMReX_ParticleBufferMap.H:128
int bucketToGrid(int bid) const
Definition AMReX_ParticleBufferMap.H:114
Vector< int > allBucketsOnProc(int pid) const
Definition AMReX_ParticleBufferMap.H:170
int numBuckets() const
Definition AMReX_ParticleBufferMap.H:107
int bucketToTile(int bid) const
Definition AMReX_ParticleBufferMap.H:121
int numBoxesOnProc(int pid) const
Definition AMReX_ParticleBufferMap.H:163
int procID(int gid, int lev) const
Definition AMReX_ParticleBufferMap.H:182
int numLevels() const
Definition AMReX_ParticleBufferMap.H:100
GetBucket getBucketFunctor() const noexcept
Definition AMReX_ParticleBufferMap.H:196
int gridAndTileAndLevToBucket(int gid, int tid, int lev) const
Definition AMReX_ParticleBufferMap.H:149
GetBucket getHostBucketFunctor() const noexcept
Definition AMReX_ParticleBufferMap.H:197
int gridAndLevToBucket(int gid, int lev) const
Definition AMReX_ParticleBufferMap.H:142
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
Definition AMReX_Amr.cpp:49
Definition AMReX_ParticleBufferMap.H:38
GetBucket(const int *lev_gid_tid_to_bucket_ptr, const int *lev_offsets_ptr, const int *gid_offsets_ptr)
Definition AMReX_ParticleBufferMap.H:43
const int * m_lev_offsets
Definition AMReX_ParticleBufferMap.H:40
__host__ __device__ int operator()(const int lev, const int gid, const int tid) const noexcept
Definition AMReX_ParticleBufferMap.H:52
const int * m_gid_offsets
Definition AMReX_ParticleBufferMap.H:41
const int * m_lev_gid_tid_to_bucket
Definition AMReX_ParticleBufferMap.H:39
Definition AMReX_ParticleBufferMap.H:14
const int * m_bucket_to_pid
Definition AMReX_ParticleBufferMap.H:15
__host__ __device__ int operator()(const int lev, const int gid, const int tid) const noexcept
Definition AMReX_ParticleBufferMap.H:31
const int * m_lev_gid_tid_to_bucket
Definition AMReX_ParticleBufferMap.H:16
const int * m_lev_offsets
Definition AMReX_ParticleBufferMap.H:17
const int * m_gid_offsets
Definition AMReX_ParticleBufferMap.H:18
GetPID(const Gpu::DeviceVector< int > &bucket_to_pid, const Gpu::DeviceVector< int > &lev_gid_tid_to_bucket, const Gpu::DeviceVector< int > &lev_offsets, const Gpu::DeviceVector< int > &gid_offsets)
Definition AMReX_ParticleBufferMap.H:20