1#ifndef AMREX_PARTICLE_LOCATOR_H_
2#define AMREX_PARTICLE_LOCATOR_H_
3#include <AMReX_Config.H>
15template <
class BinIteratorFactory>
37 bool a_do_tiling,
const IntVect& a_tile_size)
41 m_plo(a_geom.ProbLoArray()),
m_dxi(a_geom.InvCellSizeArray()),
62 template <
typename P,
typename Assignor = DefaultAssignor>
64 std::pair<int, int>
operator() (
const P& p,
int nGrow, Assignor
const& assignor = Assignor{})
const noexcept
69 template <
typename P,
typename Assignor = DefaultAssignor>
89 const auto lo = iv.dim3();
90 const auto ng = nGrow.dim3(0);
100 for (
int kk = iz_lo; kk <= iz_hi; ++kk) {
101 for (
int jj = iy_lo; jj <= iy_hi; ++jj) {
102 for (
int ii = ix_lo; ii <= ix_hi; ++ii) {
104 for (
const auto& nbor :
m_bif.getBinIterator(index)) {
105 Box bx = nbor.second;
107 return {nbor.first,
getTile(iv, bx)};
114 loc_gid = nbor.first;
118 for (
int dir = 0; dir < AMREX_SPACEDIM; ++dir) {
120 gdbx.
grow(dir, nGrow[dir]);
122 loc_gid = nbor.first;
131 return {loc_gid, loc_tid};
145 bool a_do_tiling =
false,
153 int num_boxes =
static_cast<int>(ba.
size());
155 for (
int i = 0; i < num_boxes; ++i) {
m_host_boxes.push_back(ba[i]); }
160 if (num_boxes == 0) {
175 using ReduceTuple =
typename decltype(reduce_data)::Type;
178 reduce_op.
eval(num_boxes, reduce_data,
181 const Box& box = boxes_ptr[i];
190 ReduceTuple hv = reduce_data.
value(reduce_op);
196 amrex::get< AMREX_SPACEDIM+1>(hv),
197 amrex::get< AMREX_SPACEDIM+2>(hv)));
199 amrex::get<2*AMREX_SPACEDIM+1>(hv),
200 amrex::get<2*AMREX_SPACEDIM+2>(hv)));
207 m_bins.build(num_boxes, boxes_ptr, bins_box,
210 return (box.
smallEnd() - bins_lo) / bin_size;
229 bool a_do_tiling =
false,
260template <
class BinIteratorFactory>
270 template <
typename P,
typename Assignor = DefaultAssignor>
273 Assignor
const& assignor = {})
const noexcept
278 template <
typename P,
typename Assignor = DefaultAssignor>
281 Assignor
const& assignor = {})
const noexcept
283 lev_min = (lev_min == -1) ? 0 : lev_min;
284 lev_max = (lev_max == -1) ?
m_size - 1 : lev_max;
286 for (
int lev = lev_max; lev >= lev_min; --lev)
288 auto grid_tile =
m_funcs[lev](p, 0, assignor);
289 if (grid_tile.first >= 0) {
return makeTuple(grid_tile.first, grid_tile.second, lev); }
294 auto grid_tile =
m_funcs[lev](p, nGrow, assignor);
295 if (grid_tile.first >= 0) {
return makeTuple(grid_tile.first, grid_tile.second, lev); }
311 bool m_defined =
false;
319 bool a_do_tiling =
false,
322 build(a_ba, a_geom, a_do_tiling, a_tile_size);
326 bool a_do_tiling =
false,
329 build(a_gdb, a_do_tiling, a_tile_size);
334 bool a_do_tiling =
false,
338 int num_levels =
static_cast<int>(a_ba.
size());
339 m_locators.resize(num_levels);
340 m_grid_assignors.
resize(num_levels);
343 for (
int lev = 0; lev < num_levels; ++lev)
345 m_locators[lev].build(a_ba[lev], a_geom[lev], a_do_tiling, a_tile_size);
346 h_grid_assignors[lev] = m_locators[lev].getGridAssignor();
352 for (
int lev = 0; lev < num_levels; ++lev)
354 m_locators[lev].build(a_ba[lev], a_geom[lev], a_do_tiling, a_tile_size);
355 m_grid_assignors[lev] = m_locators[lev].getGridAssignor();
361 bool a_do_tiling =
false,
367 for (
int lev = 0; lev < num_levels; ++lev)
370 geom.push_back(a_gdb->
Geom(lev));
372 build(ba, geom, a_do_tiling, a_tile_size);
376 bool a_do_tiling =
false,
379 if ( !m_defined || (m_locators.empty()) ||
380 (m_locators.
size() != a_ba.
size()) ) {
return false; }
381 bool all_valid =
true;
382 int num_levels = m_locators.
size();
383 for (
int lev = 0; lev < num_levels; ++lev) {
384 all_valid = all_valid && m_locators[lev].isValid(a_ba[lev], a_do_tiling, a_tile_size);
390 bool a_do_tiling =
false,
395 for (
int lev = 0; lev < num_levels; ++lev) {
398 return this->
isValid(ba, a_do_tiling, a_tile_size);
406 for (
int lev = 0; lev < num_levels; ++lev)
408 m_locators[lev].setGeometry(a_gdb->
Geom(lev));
409 h_grid_assignors[lev] = m_locators[lev].getGridAssignor();
415 for (
int lev = 0; lev < num_levels; ++lev)
417 m_locators[lev].setGeometry(a_gdb->
Geom(lev));
418 m_grid_assignors[lev] = m_locators[lev].getGridAssignor();
#define AMREX_ASSERT(EX)
Definition AMReX_BLassert.H:38
#define AMREX_FORCE_INLINE
Definition AMReX_Extension.H:124
#define AMREX_GPU_DEVICE
Definition AMReX_GpuQualifiers.H:18
#define AMREX_GPU_HOST_DEVICE
Definition AMReX_GpuQualifiers.H:20
#define AMREX_D_TERM(a, b, c)
Definition AMReX_SPACE.H:172
#define AMREX_D_DECL(a, b, c)
Definition AMReX_SPACE.H:171
Definition AMReX_ParticleLocator.H:304
void build(const ParGDBBase *a_gdb, bool a_do_tiling=false, const IntVect &a_tile_size=IntVect(1024000, 1024000, 1024000))
Definition AMReX_ParticleLocator.H:360
AmrParticleLocator(const ParGDBBase *a_gdb, bool a_do_tiling=false, const IntVect &a_tile_size=IntVect(1024000, 1024000, 1024000))
Definition AMReX_ParticleLocator.H:325
AmrAssignGrid< BinIteratorFactory > getGridAssignor() const noexcept
Definition AMReX_ParticleLocator.H:423
typename Bins::BinIteratorFactory BinIteratorFactory
Definition AMReX_ParticleLocator.H:306
bool isValid(const ParGDBBase *a_gdb, bool a_do_tiling=false, const IntVect &a_tile_size=IntVect(1024000, 1024000, 1024000)) const
Definition AMReX_ParticleLocator.H:389
void build(const Vector< BoxArray > &a_ba, const Vector< Geometry > &a_geom, bool a_do_tiling=false, const IntVect &a_tile_size=IntVect(1024000, 1024000, 1024000))
Definition AMReX_ParticleLocator.H:332
AmrParticleLocator(const Vector< BoxArray > &a_ba, const Vector< Geometry > &a_geom, bool a_do_tiling=false, const IntVect &a_tile_size=IntVect(1024000, 1024000, 1024000))
Definition AMReX_ParticleLocator.H:317
bool isValid(const Vector< BoxArray > &a_ba, bool a_do_tiling=false, const IntVect &a_tile_size=IntVect(1024000, 1024000, 1024000)) const
Definition AMReX_ParticleLocator.H:375
void setGeometry(const ParGDBBase *a_gdb)
Definition AMReX_ParticleLocator.H:401
AmrParticleLocator()=default
Reference-counted collection of Boxes.
Definition AMReX_BoxArray.H:676
static bool SameRefs(const BoxArray &lhs, const BoxArray &rhs)
whether two BoxArrays share the same data
Definition AMReX_BoxArray.H:1235
Long size() const noexcept
Return the number of boxes in the BoxArray.
Definition AMReX_BoxArray.H:753
__host__ __device__ BoxND & grow(int i) noexcept
Grow in all directions by i cells (negative shrinks).
Definition AMReX_Box.H:668
__host__ __device__ const IntVectND< dim > & bigEnd() const &noexcept
Return the inclusive upper bound of the box.
Definition AMReX_Box.H:136
__host__ __device__ IntVectND< dim > length() const noexcept
Return the length of the BoxND.
Definition AMReX_Box.H:167
__host__ __device__ bool contains(const IntVectND< dim > &p) const noexcept
Return true if argument is contained within BoxND.
Definition AMReX_Box.H:233
__host__ __device__ const IntVectND< dim > & smallEnd() const &noexcept
Return the inclusive lower bound of the box.
Definition AMReX_Box.H:124
Rectangular problem domain geometry.
Definition AMReX_Geometry.H:75
GPU-compatible tuple.
Definition AMReX_Tuple.H:98
__host__ static __device__ constexpr IntVectND< dim > TheUnitVector() noexcept
This static member function returns a reference to a constant IntVectND object, all of whose dim argu...
Definition AMReX_IntVect.H:781
__host__ static __device__ constexpr IntVectND< dim > TheZeroVector() noexcept
This static member function returns a reference to a constant IntVectND object, all of whose dim argu...
Definition AMReX_IntVect.H:771
Dynamically allocated vector for trivially copyable data.
Definition AMReX_PODVector.H:308
void resize(size_type a_new_size, GrowthStrategy strategy=GrowthStrategy::Poisson)
Definition AMReX_PODVector.H:728
T * dataPtr() noexcept
Definition AMReX_PODVector.H:670
T * data() noexcept
Definition AMReX_PODVector.H:666
Definition AMReX_ParGDB.H:13
virtual const BoxArray & ParticleBoxArray(int level) const =0
virtual const Geometry & Geom(int level) const =0
virtual int finestLevel() const =0
Definition AMReX_ParticleLocator.H:137
ParticleLocator()=default
IntVect m_bin_size
Definition AMReX_ParticleLocator.H:251
IntVect m_bins_hi
Definition AMReX_ParticleLocator.H:250
bool isValid(const BoxArray &ba, bool a_do_tiling=false, const IntVect &a_tile_size=IntVect(1024000, 1024000, 1024000)) const noexcept
Definition AMReX_ParticleLocator.H:228
BoxArray m_ba
Definition AMReX_ParticleLocator.H:245
bool m_do_tiling
Definition AMReX_ParticleLocator.H:243
void build(const BoxArray &ba, const Geometry &geom, bool a_do_tiling=false, const IntVect &a_tile_size=IntVect(1024000, 1024000, 1024000))
Definition AMReX_ParticleLocator.H:144
Geometry m_geom
Definition AMReX_ParticleLocator.H:246
Gpu::HostVector< Box > m_host_boxes
Definition AMReX_ParticleLocator.H:256
IntVect m_bins_lo
Definition AMReX_ParticleLocator.H:249
IntVect m_tile_size
Definition AMReX_ParticleLocator.H:247
Bins m_bins
Definition AMReX_ParticleLocator.H:254
IntVect m_num_bins
Definition AMReX_ParticleLocator.H:252
AssignGrid< BinIteratorFactory > getGridAssignor() const noexcept
Definition AMReX_ParticleLocator.H:220
typename Bins::BinIteratorFactory BinIteratorFactory
Definition AMReX_ParticleLocator.H:140
Gpu::DeviceVector< Box > m_device_boxes
Definition AMReX_ParticleLocator.H:257
void setGeometry(const Geometry &a_geom) noexcept
Definition AMReX_ParticleLocator.H:214
bool m_defined
Definition AMReX_ParticleLocator.H:242
Definition AMReX_Reduce.H:438
Type value()
Definition AMReX_Reduce.H:473
Definition AMReX_Reduce.H:597
void eval(MF const &mf, IntVect const &nghost, D &reduce_data, F &&f)
Definition AMReX_Reduce.H:731
This class is a thin wrapper around std::vector. Unlike vector, Vector::operator[] provides bound che...
Definition AMReX_Vector.H:29
Long size() const noexcept
Definition AMReX_Vector.H:54
__host__ __device__ constexpr const T & min(const T &a, const T &b) noexcept
Definition AMReX_Algorithm.H:31
__host__ __device__ constexpr const T & max(const T &a, const T &b) noexcept
Definition AMReX_Algorithm.H:53
void copyAsync(HostToDevice, InIter begin, InIter end, OutIter result) noexcept
A host-to-device copy routine. Note this is just a wrapper around memcpy, so it assumes contiguous st...
Definition AMReX_GpuContainers.H:228
static constexpr HostToDevice hostToDevice
Definition AMReX_GpuContainers.H:105
void streamSynchronize() noexcept
Definition AMReX_GpuDevice.H:310
void htod_memcpy_async(void *p_d, const void *p_h, const std::size_t sz) noexcept
Definition AMReX_GpuDevice.H:421
Definition AMReX_Amr.cpp:50
__host__ __device__ int getTileIndex(const IntVect &iv, const Box &box, const bool a_do_tiling, const IntVect &a_tile_size, Box &tbx)
Definition AMReX_ParticleUtil.H:191
__host__ __device__ constexpr GpuTuple< detail::tuple_decay_t< Ts >... > makeTuple(Ts &&... args)
Definition AMReX_Tuple.H:269
IntVectND< 3 > IntVect
IntVect is an alias for amrex::IntVectND instantiated with AMREX_SPACEDIM.
Definition AMReX_BaseFwd.H:38
Definition AMReX_ParticleLocator.H:262
std::size_t m_size
Definition AMReX_ParticleLocator.H:264
AmrAssignGrid(const AssignGrid< BinIteratorFactory > *a_funcs, std::size_t a_size)
Definition AMReX_ParticleLocator.H:266
__host__ __device__ GpuTuple< int, int, int > operator()(const P &p, int lev_min=-1, int lev_max=-1, int nGrow=0, Assignor const &assignor={}) const noexcept
Definition AMReX_ParticleLocator.H:272
const AssignGrid< BinIteratorFactory > * m_funcs
Definition AMReX_ParticleLocator.H:263
Definition AMReX_ParticleLocator.H:17
Dim3 m_hi
Definition AMReX_ParticleLocator.H:21
__host__ __device__ int getTile(const IntVect &iv, const Box &bx) const noexcept
Definition AMReX_ParticleLocator.H:55
Dim3 m_bin_size
Definition AMReX_ParticleLocator.H:22
bool m_do_tiling
Definition AMReX_ParticleLocator.H:29
Dim3 m_tile_size
Definition AMReX_ParticleLocator.H:28
__host__ __device__ std::pair< int, int > operator()(const P &p, int nGrow, Assignor const &assignor=Assignor{}) const noexcept
Definition AMReX_ParticleLocator.H:64
Box m_domain
Definition AMReX_ParticleLocator.H:25
Dim3 m_num_bins
Definition AMReX_ParticleLocator.H:23
BinIteratorFactory m_bif
Definition AMReX_ParticleLocator.H:18
GpuArray< Real, 3 > m_dxi
Definition AMReX_ParticleLocator.H:27
__host__ __device__ AssignGrid()=default
Dim3 m_lo
Definition AMReX_ParticleLocator.H:20
GpuArray< Real, 3 > m_plo
Definition AMReX_ParticleLocator.H:26
AssignGrid(BinIteratorFactory a_bif, const IntVect &a_bins_lo, const IntVect &a_bins_hi, const IntVect &a_bin_size, const IntVect &a_num_bins, const Geometry &a_geom, bool a_do_tiling, const IntVect &a_tile_size)
Definition AMReX_ParticleLocator.H:34
A simple struct holding 3 int values for a 3D index.
Definition AMReX_Dim3.H:24
int x
Definition AMReX_Dim3.H:24
int z
Definition AMReX_Dim3.H:24
int y
Definition AMReX_Dim3.H:24
Fixed-size array that can be used on GPU.
Definition AMReX_Array.H:52
Definition AMReX_Reduce.H:341
Definition AMReX_Reduce.H:307