21template <
unsigned int inner>
27 unsigned int dim[inner] = {0};
31 unsigned int stride[inner + 1] = {0};
33#ifdef MOOSE_KOKKOS_SCOPE
39 KOKKOS_FUNCTION
unsigned int operator[](
unsigned int i)
const {
return dim[i]; }
43#ifdef MOOSE_KOKKOS_SCOPE
51template <
typename T,
unsigned int inner, LayoutType layout>
69 KOKKOS_FUNCTION
unsigned int size()
const {
return _dim.stride[inner]; }
75 KOKKOS_FUNCTION
unsigned int n(
unsigned int dim)
const {
return _dim[
dim]; }
82 KOKKOS_ASSERT(i <
_dim.stride[inner]);
90 template <
typename... indices>
91 KOKKOS_FUNCTION T &
operator()(indices... i)
const;
104template <
typename T,
unsigned int inner, LayoutType layout>
105template <
typename... indices>
109 static_assert((std::is_convertible<indices, unsigned int>::value && ...),
110 "All arguments must be convertible to unsigned int");
111 static_assert(
sizeof...(i) == inner,
"Number of arguments should match array dimension");
115 unsigned int idx[inner] = {
static_cast<unsigned int>(i)...};
117 for (
unsigned int d = 0; d <
sizeof...(i); ++d)
118 KOKKOS_ASSERT(idx[d] < _dim[d]);
122 unsigned int idx = 0;
127 (d == 0 ?
static_cast<unsigned int>(i) :
static_cast<unsigned int>(i) * _dim.stride[d])),
131 (((idx += (d == inner - 1 ?
static_cast<unsigned int>(i)
132 :
static_cast<unsigned int>(i) * _dim.stride[d])),
162 typename index_type = MOOSE_KOKKOS_INDEX_TYPE,
172#ifdef MOOSE_KOKKOS_SCOPE
176 template <
typename... size_type>
186 void create(
const std::vector<index_type> &
n);
191 template <
typename... size_type>
198 void reserve(
const std::array<uint64_t, outer> & index,
199 const std::array<uint64_t, inner> & dimension);
209 mooseAssert(
_finalized,
"KokkosJaggedArray not finalized.");
211 _data.copyToDevice();
218 mooseAssert(
_finalized,
"KokkosJaggedArray not finalized.");
227 mooseAssert(
_finalized,
"KokkosJaggedArray not finalized.");
229 _dims.moveToDevice();
231 _data.moveToDevice();
238 mooseAssert(
_finalized,
"KokkosJaggedArray not finalized.");
269 KOKKOS_FUNCTION index_type
size()
const {
return _data.size(); }
274 KOKKOS_FUNCTION index_type
n()
const {
return _offsets.size(); }
286 KOKKOS_FUNCTION
auto operator[](index_type i)
const;
292 template <
typename... indices>
293 KOKKOS_FUNCTION
auto operator()(indices... i)
const;
315#ifdef MOOSE_KOKKOS_SCOPE
336template <
typename... size_type>
341 _offsets.create(n...);
354 const std::array<uint64_t, outer> & index,
const std::array<uint64_t, inner> & dimension)
356 mooseAssert(!_finalized,
"KokkosJaggedArray already finalized.");
359 index_type stride = 1;
361 for (
unsigned int o = 0; o < outer; ++o)
363 idx += index[o] * stride;
364 stride *= _offsets.n(o);
367 for (
unsigned int i = 0; i < inner; ++i)
368 _dims[idx].
dim[i] = dimension[i];
373 for (
unsigned int i = 0; i < inner; ++i)
375 _dims[idx].stride[i] = stride;
376 stride *= dimension[i];
379 for (
int i = inner - 1; i >= 0; --i)
381 _dims[idx].stride[i] = stride;
382 stride *= dimension[i];
385 _dims[idx].stride[inner] = stride;
396 mooseAssert(!_finalized,
"KokkosJaggedArray already finalized.");
398 index_type stride = 1;
400 for (index_type o = 0; o < _offsets.size(); ++o)
404 for (
unsigned int i = 0; i < inner; ++i)
405 stride *= _dims[o][i];
407 _offsets[o] = stride;
410 std::exclusive_scan(_offsets.begin(), _offsets.end(), _offsets.begin(), 0);
412 _dims.copyToDevice();
413 _offsets.copyToDevice();
417 _data.create(_offsets.last() + stride + 1);
430 auto data = &_data[_offsets[i]];
431 const auto &
dim = _dims[i];
441template <
typename... indices>
445 auto data = &_data[_offsets(i...)];
446 const auto &
dim = _dims(i...);
The inner array wrapper class.
JaggedArrayInnerDim< inner > _dim
Inner array dimension information.
KOKKOS_FUNCTION T & operator()(indices... i) const
Get an array entry.
T * _data
Pointer to the inner array data.
KOKKOS_FUNCTION T & operator[](unsigned int i) const
Get an array entry.
KOKKOS_FUNCTION unsigned int n(unsigned int dim) const
Get the size of a dimension of the inner array.
KOKKOS_FUNCTION JaggedArrayInnerData(T *data, JaggedArrayInnerDim< inner > dim)
Constructor.
KOKKOS_FUNCTION unsigned int size() const
Get the total inner array size.
The Kokkos jagged array class.
JaggedArray()=default
Default constructor.
KOKKOS_FUNCTION bool isHostAlloc() const
Get whether the array was allocated on host.
void moveToDevice()
Copy data from host to device and deallocate host.
JaggedArray(size_type... n)
Constructor.
bool _finalized
Whether the array was finalized.
KOKKOS_FUNCTION index_type size() const
Get the total data array size.
void moveToHost()
Copy data from device to host and deallocate device.
Array< index_type, outer, index_type > _offsets
Starting offset of each inner array into the sequential data array.
Array< JaggedArrayInnerDim< inner >, outer, index_type > _dims
Dimension information of each inner array.
KOKKOS_FUNCTION bool isFinalized() const
Get whether the array is finalized.
KOKKOS_FUNCTION auto operator()(indices... i) const
Get an inner array.
void copyToDevice()
Copy data from host to device.
void copyToHost()
Copy data from device to host.
void create(const std::vector< index_type > &n)
Allocate outer array.
KOKKOS_FUNCTION index_type n(unsigned int dim) const
Get the size of a dimension of the outer array.
KOKKOS_FUNCTION auto operator[](index_type i) const
Get an inner array.
Array1D< T, index_type > _data
Sequential data array.
KOKKOS_FUNCTION index_type n() const
Get the total outer array size.
void reserve(const std::array< uint64_t, outer > &index, const std::array< uint64_t, inner > &dimension)
Reserve inner array for an outer array entry.
KOKKOS_FUNCTION bool isDeviceAlloc() const
Get whether the array was allocated on device.
auto & array()
Get the underlying data array.
void finalize()
Setup array structure.
LayoutType
The enumerator that dictates the memory layout.
static constexpr std::size_t dim
This is the dimension of all vector and tensor datastructures used in MOOSE.
A simple object holding the dimension information of an inner array.
KOKKOS_FUNCTION unsigned int operator[](unsigned int i) const
Get the size of a dimension.
unsigned int stride[inner+1]
Stride of each dimension.
unsigned int dim[inner]
Size of each dimension.