35#ifndef OPM_SPARSETABLE_HEADER
36#define OPM_SPARSETABLE_HEADER
42#include <opm/common/utility/gpuistl_if_available.hpp>
47#include <initializer_list>
76 static_assert(always_false_v<T>,
"PoisonIterator: operator*() is not allowed.");
81 static_assert(always_false_v<T>,
"PoisonIterator: operator->() is not allowed.");
87 static_assert(always_false_v<T>,
"PoisonIterator: operator++() is not allowed.");
93 static_assert(always_false_v<T>,
"PoisonIterator: operator++(int) is not allowed.");
99 static_assert(always_false_v<T>,
"PoisonIterator: operator== is not allowed.");
104 static_assert(always_false_v<T>,
"PoisonIterator: operator!= is not allowed.");
116 template <
typename T,
template <
typename,
typename...>
class Storage = std::vector>
131 template <
typename DataIter,
typename IntegerIter>
133 IntegerIter rowsize_beg, IntegerIter rowsize_end)
134 : data_(data_beg, data_end)
136 setRowStartsFromSizes(rowsize_beg, rowsize_end);
141 , row_start_(
std::move(row_starts))
145 if constexpr (std::is_same_v<Storage<T>, std::vector<T>>) {
146 OPM_ERROR_IF(row_start_.size() == 0 || row_start_[0] != 0,
147 "Invalid row_start array");
153 SparseTable(std::initializer_list<std::initializer_list<T>> initlist)
requires (std::is_same_v<Storage<T>, std::vector<T>>)
155 row_start_.push_back(0);
156 for (
const auto& row : initlist) {
157 data_.insert(data_.end(), row);
158 row_start_.push_back(data_.size());
168 template <
typename DataIter,
typename IntegerIter>
169 void assign(DataIter data_beg, DataIter data_end,
170 IntegerIter rowsize_beg, IntegerIter rowsize_end)
172 data_.assign(data_beg, data_end);
173 setRowStartsFromSizes(rowsize_beg, rowsize_end);
180 template <
typename IntegerIter>
181 void allocate(IntegerIter rowsize_beg, IntegerIter rowsize_end)
183 typedef typename Storage<T>::size_type sz_t;
185 sz_t ndata = std::accumulate(rowsize_beg, rowsize_end, sz_t(0));
187 setRowStartsFromSizes(rowsize_beg, rowsize_end);
192 template <
typename DataIter>
195 data_.insert(data_.end(), row_beg, row_end);
196 row_start_.push_back(data_.size());
202 return row_start_.size()==1;
208 return row_start_.size() - 1;
212 void reserve(
int exptd_nrows,
int exptd_ndata)
214 row_start_.reserve(exptd_nrows + 1);
215 data_.reserve(exptd_ndata);
221 row_start_.swap(other.row_start_);
222 data_.swap(other.data_);
236 "Row index " + std::to_string(row) +
" is out of range");
238 return row_start_[row + 1] - row_start_[row];
245 row_start_.resize(1);
250 template<
class U,
class =
void>
265 template<
typename TT>
272 template<
typename TT>
273 struct row_type_helper<gpuistl::GpuBuffer<TT>> {
285 assert(row >= 0 && row <
size());
286 return row_type{data_.begin()+ row_start_[row],
287 data_.begin() + row_start_[row + 1]};
293 assert(row >= 0 && row <
size());
295 data_.begin() + row_start_[row + 1]};
305 , row_index_(begin_row_index)
315 return table_[row_index_];
319 assert(&table_ == &other.table_);
320 return row_index_ == other.row_index_;
324 return !(*
this == other);
344 return data_ == other.data_ && row_start_ == other.row_start_;
347 template<
class charT,
class traits>
348 void print(std::basic_ostream<charT, traits>& os)
const
350 os <<
"Number of rows: " <<
size() <<
'\n';
352 os <<
"Row starts = [";
353 std::ranges::copy(row_start_, std::ostream_iterator<int>(os,
" "));
356 os <<
"Data values = [";
357 std::ranges::copy(data_, std::ostream_iterator<T>(os,
" "));
386 Storage<int> row_start_;
388 template <
class IntegerIter>
389 void setRowStartsFromSizes(IntegerIter rowsize_beg, IntegerIter rowsize_end)
393 for (
auto it = rowsize_beg; it != rowsize_end; ++it) {
395 OPM_THROW(std::runtime_error,
"Negative row size given.");
401 int num_rows = rowsize_end - rowsize_beg;
402 row_start_.resize(num_rows + 1);
404 std::partial_sum(rowsize_beg, rowsize_end, row_start_.begin() + 1);
406 if (
int(data_.size()) != row_start_.back()) {
407 OPM_THROW(std::runtime_error,
"End of row start indices different from data size.");
416namespace Opm::gpuistl {
419auto copy_to_gpu(
const SparseTable<T>& cpu_table)
421 return SparseTable<T, GpuBuffer>(
422 GpuBuffer<T>(cpu_table.dataStorage()),
423 GpuBuffer<int>(cpu_table.rowStarts())
428auto make_view(SparseTable<T, GpuBuffer>& buffer_table)
430 return SparseTable<T, GpuView>(
431 GpuView<T>(
const_cast<T*
>(buffer_table.dataStorage().data()),
432 buffer_table.dataStorage().size()),
433 GpuView<int>(
const_cast<int*
>(buffer_table.rowStarts().data()),
434 buffer_table.rowStarts().size())
#define OPM_THROW(Exception, message)
Definition: ErrorMacros.hpp:29
#define OPM_ERROR_IF(condition, message)
Definition: ErrorMacros.hpp:40
#define OPM_HOST_DEVICE
Definition: IteratorRange.hpp:29
Definition: SparseTable.hpp:301
OPM_HOST_DEVICE Iterator & operator++()
Definition: SparseTable.hpp:308
OPM_HOST_DEVICE Iterator(const SparseTable &table, const int begin_row_index)
Definition: SparseTable.hpp:303
OPM_HOST_DEVICE row_type operator*() const
Definition: SparseTable.hpp:313
OPM_HOST_DEVICE bool operator!=(const Iterator &other)
Definition: SparseTable.hpp:322
OPM_HOST_DEVICE bool operator==(const Iterator &other)
Definition: SparseTable.hpp:317
Definition: SparseTable.hpp:118
OPM_HOST_DEVICE bool operator==(const SparseTable &other) const
Equality.
Definition: SparseTable.hpp:342
void swap(SparseTable< T > &other)
Swap contents for other SparseTable<T>
Definition: SparseTable.hpp:219
const T data(int i) const
Definition: SparseTable.hpp:360
typename row_type_helper< Storage< T > >::const_type row_type
Definition: SparseTable.hpp:279
void reserve(int exptd_nrows, int exptd_ndata)
Allocate storage for table of expected size.
Definition: SparseTable.hpp:212
typename row_type_helper< Storage< T > >::mutable_type mutable_row_type
Definition: SparseTable.hpp:280
const Storage< T > & dataStorage() const
Definition: SparseTable.hpp:372
void allocate(IntegerIter rowsize_beg, IntegerIter rowsize_end)
Definition: SparseTable.hpp:181
OPM_HOST_DEVICE int dataSize() const
Returns the number of data elements.
Definition: SparseTable.hpp:226
void clear()
Makes the table empty().
Definition: SparseTable.hpp:242
SparseTable(Storage< T > &&data, Storage< int > &&row_starts)
Definition: SparseTable.hpp:139
void appendRow(DataIter row_beg, DataIter row_end)
Appends a row to the table.
Definition: SparseTable.hpp:193
OPM_HOST_DEVICE bool empty() const
True if the table contains no rows.
Definition: SparseTable.hpp:200
const T * dataPtr() const
Definition: SparseTable.hpp:366
SparseTable(std::initializer_list< std::initializer_list< T > > initlist)
Initializer list constructor for easy construction of small SparseTables.
Definition: SparseTable.hpp:153
OPM_HOST_DEVICE int size() const
Returns the number of rows in the table.
Definition: SparseTable.hpp:206
const Storage< int > & rowStarts() const
Definition: SparseTable.hpp:378
SparseTable()
Default constructor. Yields an empty SparseTable.
Definition: SparseTable.hpp:121
void print(std::basic_ostream< charT, traits > &os) const
Definition: SparseTable.hpp:348
OPM_HOST_DEVICE row_type operator[](int row) const
Returns a row of the table.
Definition: SparseTable.hpp:283
void assign(DataIter data_beg, DataIter data_end, IntegerIter rowsize_beg, IntegerIter rowsize_end)
Definition: SparseTable.hpp:169
SparseTable(DataIter data_beg, DataIter data_end, IntegerIter rowsize_beg, IntegerIter rowsize_end)
Definition: SparseTable.hpp:132
OPM_HOST_DEVICE Iterator begin() const
Iterator access.
Definition: SparseTable.hpp:332
OPM_HOST_DEVICE int rowSize(int row) const
Returns the size of a table row.
Definition: SparseTable.hpp:232
OPM_HOST_DEVICE mutable_row_type operator[](int row)
Returns a mutable row of the table.
Definition: SparseTable.hpp:291
OPM_HOST_DEVICE Iterator end() const
Definition: SparseTable.hpp:336
Holds the implementation of the CpGrid as a pimple.
Definition: CellQuadrature.hpp:26
constexpr bool always_false_v
Definition: SparseTable.hpp:58
Definition: SparseTable.hpp:64
T & reference
Definition: SparseTable.hpp:70
reference operator*() const
Definition: SparseTable.hpp:75
friend bool operator==(const PoisonIterator &, const PoisonIterator &)
Definition: SparseTable.hpp:98
T value_type
Definition: SparseTable.hpp:67
pointer operator->() const
Definition: SparseTable.hpp:80
T * pointer
Definition: SparseTable.hpp:69
friend bool operator!=(const PoisonIterator &, const PoisonIterator &)
Definition: SparseTable.hpp:103
std::input_iterator_tag iterator_category
Definition: SparseTable.hpp:66
PoisonIterator operator++(int)
Definition: SparseTable.hpp:92
PoisonIterator & operator++()
Definition: SparseTable.hpp:86
std::ptrdiff_t difference_type
Definition: SparseTable.hpp:68
Definition: SparseTable.hpp:251
iterator_range< PoisonIterator< T > > const_type
Definition: SparseTable.hpp:252
mutable_iterator_range< PoisonIterator< T > > mutable_type
Definition: SparseTable.hpp:253
Definition: IteratorRange.hpp:56
Definition: IteratorRange.hpp:76