16#ifndef CABANA_GRID_INDEXSPACE_HPP
17#define CABANA_GRID_INDEXSPACE_HPP
21#include <Kokkos_Core.hpp>
40 static constexpr long Rank = N;
52 template <
typename Scalar>
62 template <
typename Scalar>
64 const std::initializer_list<Scalar>&
max )
66 std::copy(
min.begin(),
min.end(),
_min.data() );
67 std::copy(
max.begin(),
max.end(),
_max.data() );
84 std::copy(
min.begin(),
min.end(),
_min.data() );
85 std::copy(
max.begin(),
max.end(),
_max.data() );
89 KOKKOS_INLINE_FUNCTION
92 for (
long i = 0; i < N; ++i )
94 if (
min( i ) != rhs.
min( i ) ||
max( i ) != rhs.
max( i ) )
101 KOKKOS_INLINE_FUNCTION
108 KOKKOS_INLINE_FUNCTION
109 long min(
const long dim )
const {
return _min[dim]; }
112 KOKKOS_INLINE_FUNCTION
113 Kokkos::Array<long, Rank>
min()
const {
return _min; }
116 KOKKOS_INLINE_FUNCTION
117 long max(
const long dim )
const {
return _max[dim]; }
120 KOKKOS_INLINE_FUNCTION
121 Kokkos::Array<long, Rank>
max()
const {
return _max; }
124 KOKKOS_INLINE_FUNCTION
125 Kokkos::pair<long, long>
range(
const long dim )
const
127 return Kokkos::tie(
_min[dim],
_max[dim] );
131 KOKKOS_INLINE_FUNCTION
135 KOKKOS_INLINE_FUNCTION
139 KOKKOS_INLINE_FUNCTION
143 for (
long d = 0; d <
Rank; ++d )
149 KOKKOS_INLINE_FUNCTION
153 for (
long i = 0; i < N; ++i )
155 result && (
_min[i] <= index[i] ) && ( index[i] <
_max[i] );
161 Kokkos::Array<long, Rank>
_min;
164 Kokkos::Array<long, Rank>
_max;
173template <
class ExecutionSpace>
174Kokkos::RangePolicy<ExecutionSpace>
177 return Kokkos::RangePolicy<ExecutionSpace>( index_space.
min( 0 ),
178 index_space.
max( 0 ) );
188template <
class ExecutionSpace,
class WorkTag>
189Kokkos::RangePolicy<ExecutionSpace, WorkTag>
193 return Kokkos::RangePolicy<ExecutionSpace, WorkTag>( index_space.
min( 0 ),
194 index_space.
max( 0 ) );
202template <
class IndexSpace_t,
class ExecutionSpace>
203Kokkos::MDRangePolicy<ExecutionSpace, Kokkos::Rank<IndexSpace_t::Rank>>
206 return Kokkos::MDRangePolicy<ExecutionSpace,
207 Kokkos::Rank<IndexSpace_t::Rank>>(
208 index_space.min(), index_space.max() );
217template <
class IndexSpace_t,
class ExecutionSpace,
class WorkTag>
218Kokkos::MDRangePolicy<ExecutionSpace, WorkTag, Kokkos::Rank<IndexSpace_t::Rank>>
222 return Kokkos::MDRangePolicy<ExecutionSpace, WorkTag,
223 Kokkos::Rank<IndexSpace_t::Rank>>(
224 index_space.min(), index_space.max() );
234template <
class Scalar,
class... Params>
235Kokkos::View<Scalar*, Params...>
createView(
const std::string& label,
238 return Kokkos::View<Scalar*, Params...>(
239 Kokkos::ViewAllocateWithoutInitializing( label ),
240 index_space.
extent( 0 ) );
251template <
class Scalar,
class... Params>
252Kokkos::View<Scalar*, Params..., Kokkos::MemoryUnmanaged>
255 return Kokkos::View<Scalar*, Params..., Kokkos::MemoryUnmanaged>(
256 data, index_space.
extent( 0 ) );
267template <
class Scalar,
class... Params>
268Kokkos::View<Scalar**, Params...>
createView(
const std::string& label,
271 return Kokkos::View<Scalar**, Params...>(
272 Kokkos::ViewAllocateWithoutInitializing( label ),
284template <
class Scalar,
class... Params>
285Kokkos::View<Scalar**, Params..., Kokkos::MemoryUnmanaged>
288 return Kokkos::View<Scalar**, Params..., Kokkos::MemoryUnmanaged>(
289 data, index_space.
extent( 0 ), index_space.
extent( 1 ) );
300template <
class Scalar,
class... Params>
301Kokkos::View<Scalar***, Params...>
304 return Kokkos::View<Scalar***, Params...>(
305 Kokkos::ViewAllocateWithoutInitializing( label ),
307 index_space.
extent( 2 ) );
318template <
class Scalar,
class... Params>
319Kokkos::View<Scalar***, Params..., Kokkos::MemoryUnmanaged>
322 return Kokkos::View<Scalar***, Params..., Kokkos::MemoryUnmanaged>(
324 index_space.
extent( 2 ) );
334template <
class Scalar,
class... Params>
335Kokkos::View<Scalar****, Params...>
338 return Kokkos::View<Scalar****, Params...>(
339 Kokkos::ViewAllocateWithoutInitializing( label ),
352template <
class Scalar,
class... Params>
353Kokkos::View<Scalar****, Params..., Kokkos::MemoryUnmanaged>
356 return Kokkos::View<Scalar****, Params..., Kokkos::MemoryUnmanaged>(
368template <
class ViewType>
371 ->
decltype( Kokkos::subview( view, index_space.range( 0 ) ) )
373 static_assert( 1 == ViewType::rank,
"Incorrect view rank" );
374 return Kokkos::subview( view, index_space.range( 0 ) );
384template <
class ViewType>
387 ->
decltype( Kokkos::subview( view, index_space.range( 0 ),
388 index_space.range( 1 ) ) )
390 static_assert( 2 == ViewType::rank,
"Incorrect view rank" );
391 return Kokkos::subview( view, index_space.range( 0 ),
392 index_space.range( 1 ) );
402template <
class ViewType>
405 ->
decltype( Kokkos::subview( view, index_space.range( 0 ),
406 index_space.range( 1 ),
407 index_space.range( 2 ) ) )
409 static_assert( 3 == ViewType::rank,
"Incorrect view rank" );
410 return Kokkos::subview( view, index_space.range( 0 ),
411 index_space.range( 1 ), index_space.range( 2 ) );
421template <
class ViewType>
424 ->
decltype( Kokkos::subview( view, index_space.range( 0 ),
425 index_space.range( 1 ),
426 index_space.range( 2 ),
427 index_space.range( 3 ) ) )
429 static_assert( 4 == ViewType::rank,
"Incorrect view rank" );
430 return Kokkos::subview( view, index_space.range( 0 ),
431 index_space.range( 1 ), index_space.range( 2 ),
432 index_space.range( 3 ) );
445 std::array<long, N + 1> min;
446 for (
int d = 0; d < N; ++d )
447 min[d] = index_space.
min( d );
450 std::array<long, N + 1> max;
451 for (
int d = 0; d < N; ++d )
452 max[d] = index_space.
max( d );
466 const long min,
const long max )
468 std::array<long, N + 1> range_min;
469 for (
int d = 0; d < N; ++d )
470 range_min[d] = index_space.
min( d );
473 std::array<long, N + 1> range_max;
474 for (
int d = 0; d < N; ++d )
475 range_max[d] = index_space.
max( d );
KOKKOS_INLINE_FUNCTION auto createSubview(const ViewType &view, const IndexSpace< 1 > &index_space) -> decltype(Kokkos::subview(view, index_space.range(0)))
Given a view create a subview over the given index space.
Definition Cabana_Grid_IndexSpace.hpp:369
Kokkos::RangePolicy< ExecutionSpace > createExecutionPolicy(const IndexSpace< 1 > &index_space, const ExecutionSpace &)
Create a multi-dimensional execution policy over an index space.
Definition Cabana_Grid_IndexSpace.hpp:175
Kokkos::View< Scalar *, Params... > createView(const std::string &label, const IndexSpace< 1 > &index_space)
Given an index space create a view over the extent of that index space.
Definition Cabana_Grid_IndexSpace.hpp:235
IndexSpace< N+1 > appendDimension(const IndexSpace< N > &index_space, const long size)
Given an N-dimensional index space append an additional dimension with the given size.
Definition Cabana_Grid_IndexSpace.hpp:442
Structured index space.
Definition Cabana_Grid_IndexSpace.hpp:37
KOKKOS_INLINE_FUNCTION bool inRange(const long index[N]) const
Determine if a set of indices is within the range of the index space.
Definition Cabana_Grid_IndexSpace.hpp:150
KOKKOS_INLINE_FUNCTION Kokkos::Array< long, Rank > max() const
Get the maximum indices in all dimensions.
Definition Cabana_Grid_IndexSpace.hpp:121
KOKKOS_INLINE_FUNCTION Kokkos::Array< long, Rank > min() const
Get the minimum indices in all dimensions.
Definition Cabana_Grid_IndexSpace.hpp:113
Kokkos::Array< long, Rank > _max
Maximum index bounds.
Definition Cabana_Grid_IndexSpace.hpp:164
IndexSpace(const std::array< long, N > &min, const std::array< long, N > &max)
Vector range constructor.
Definition Cabana_Grid_IndexSpace.hpp:82
KOKKOS_INLINE_FUNCTION long max(const long dim) const
Get the maximum index in a given dimension.
Definition Cabana_Grid_IndexSpace.hpp:117
KOKKOS_INLINE_FUNCTION long min(const long dim) const
Get the minimum index in a given dimension.
Definition Cabana_Grid_IndexSpace.hpp:109
KOKKOS_INLINE_FUNCTION bool operator==(const IndexSpace< N > &rhs) const
Comparison operator.
Definition Cabana_Grid_IndexSpace.hpp:90
static constexpr long Rank
Number of dimensions.
Definition Cabana_Grid_IndexSpace.hpp:40
KOKKOS_INLINE_FUNCTION Kokkos::pair< long, long > range(const long dim) const
Get the range of a given dimension.
Definition Cabana_Grid_IndexSpace.hpp:125
Kokkos::Array< long, Rank > _min
Minimum index bounds.
Definition Cabana_Grid_IndexSpace.hpp:161
KOKKOS_INLINE_FUNCTION bool operator!=(const IndexSpace< N > &rhs) const
Comparison operator.
Definition Cabana_Grid_IndexSpace.hpp:102
KOKKOS_INLINE_FUNCTION long size() const
Get the total size of the index space.
Definition Cabana_Grid_IndexSpace.hpp:140
KOKKOS_INLINE_FUNCTION long rank() const
Get the number of dimensions.
Definition Cabana_Grid_IndexSpace.hpp:132
KOKKOS_INLINE_FUNCTION long extent(const long dim) const
Get the extent of a given dimension.
Definition Cabana_Grid_IndexSpace.hpp:136
IndexSpace(const std::initializer_list< Scalar > &min, const std::initializer_list< Scalar > &max)
Initializer list range constructor.
Definition Cabana_Grid_IndexSpace.hpp:63
IndexSpace()
Default constructor.
Definition Cabana_Grid_IndexSpace.hpp:43
IndexSpace(const std::initializer_list< Scalar > &size)
Initializer list size constructor.
Definition Cabana_Grid_IndexSpace.hpp:53
IndexSpace(const std::array< long, N > &size)
Vector size constructor.
Definition Cabana_Grid_IndexSpace.hpp:73
Core: particle data structures and algorithms.
Definition Cabana_AoSoA.hpp:36
auto size(SliceType slice, typename std::enable_if< is_slice< SliceType >::value, int >::type *=0)
Check slice size (differs from Kokkos View).
Definition Cabana_Slice.hpp:1012