35#ifndef OPM_SPARSETABLE_HEADER
36#define OPM_SPARSETABLE_HEADER
43#include <opm/common/ErrorMacros.hpp>
46#include <opm/common/utility/gpuistl_if_available.hpp>
71 static_assert(always_false_v<T>,
"PoisonIterator: operator*() is not allowed.");
76 static_assert(always_false_v<T>,
"PoisonIterator: operator->() is not allowed.");
82 static_assert(always_false_v<T>,
"PoisonIterator: operator++() is not allowed.");
88 static_assert(always_false_v<T>,
"PoisonIterator: operator++(int) is not allowed.");
94 static_assert(always_false_v<T>,
"PoisonIterator: operator== is not allowed.");
99 static_assert(always_false_v<T>,
"PoisonIterator: operator!= is not allowed.");
111 template <
typename T,
template <
typename,
typename...>
class Storage = std::vector>
126 template <
typename DataIter,
typename IntegerIter>
128 IntegerIter rowsize_beg, IntegerIter rowsize_end)
129 : data_(data_beg, data_end)
131 setRowStartsFromSizes(rowsize_beg, rowsize_end);
136 , row_start_(
std::move(row_starts))
140 if constexpr (std::is_same_v<Storage<T>, std::vector<T>>) {
141 OPM_ERROR_IF(row_start_.size() == 0 || row_start_[0] != 0,
142 "Invalid row_start array");
153 template <
typename DataIter,
typename IntegerIter>
154 void assign(DataIter data_beg, DataIter data_end,
155 IntegerIter rowsize_beg, IntegerIter rowsize_end)
157 data_.assign(data_beg, data_end);
158 setRowStartsFromSizes(rowsize_beg, rowsize_end);
165 template <
typename IntegerIter>
166 void allocate(IntegerIter rowsize_beg, IntegerIter rowsize_end)
168 typedef typename Storage<T>::size_type sz_t;
170 sz_t ndata = std::accumulate(rowsize_beg, rowsize_end, sz_t(0));
172 setRowStartsFromSizes(rowsize_beg, rowsize_end);
177 template <
typename DataIter>
180 data_.insert(data_.end(), row_beg, row_end);
181 row_start_.push_back(data_.size());
187 return row_start_.size()==1;
191 OPM_HOST_DEVICE
int size()
const
193 return row_start_.size() - 1;
197 void reserve(
int exptd_nrows,
int exptd_ndata)
199 row_start_.reserve(exptd_nrows + 1);
200 data_.reserve(exptd_ndata);
206 row_start_.swap(other.row_start_);
207 data_.swap(other.data_);
220 OPM_ERROR_IF(row < 0 || row >=
size(),
221 "Row index " + std::to_string(row) +
" is out of range");
223 return row_start_[row + 1] - row_start_[row];
230 row_start_.resize(1);
235 template<
class U,
class =
void>
250 template<
typename TT>
257 template<
typename TT>
258 struct row_type_helper<gpuistl::GpuBuffer<TT>> {
270 assert(row >= 0 && row <
size());
271 return row_type{data_.begin()+ row_start_[row],
272 data_.begin() + row_start_[row + 1]};
278 assert(row >= 0 && row <
size());
280 data_.begin() + row_start_[row + 1]};
290 , row_index_(begin_row_index)
300 return table_[row_index_];
304 assert(&table_ == &other.table_);
305 return row_index_ == other.row_index_;
309 return !(*
this == other);
329 return data_ == other.data_ && row_start_ == other.row_start_;
332 template<
class charT,
class traits>
333 void print(std::basic_ostream<charT, traits>& os)
const
335 os <<
"Number of rows: " <<
size() <<
'\n';
337 os <<
"Row starts = [";
338 std::copy(row_start_.begin(), row_start_.end(),
339 std::ostream_iterator<int>(os,
" "));
342 os <<
"Data values = [";
343 std::copy(data_.begin(), data_.end(),
344 std::ostream_iterator<T>(os,
" "));
373 Storage<int> row_start_;
375 template <
class IntegerIter>
376 void setRowStartsFromSizes(IntegerIter rowsize_beg, IntegerIter rowsize_end)
380 for (
auto it = rowsize_beg; it != rowsize_end; ++it) {
382 OPM_THROW(std::runtime_error,
"Negative row size given.");
388 int num_rows = rowsize_end - rowsize_beg;
389 row_start_.resize(num_rows + 1);
391 std::partial_sum(rowsize_beg, rowsize_end, row_start_.begin() + 1);
393 if (
int(data_.size()) != row_start_.back()) {
394 OPM_THROW(std::runtime_error,
"End of row start indices different from data size.");
403namespace Opm::gpuistl {
406auto copy_to_gpu(
const SparseTable<T>& cpu_table)
408 return SparseTable<T, GpuBuffer>(
409 GpuBuffer<T>(cpu_table.dataStorage()),
410 GpuBuffer<int>(cpu_table.rowStarts())
415auto make_view(SparseTable<T, GpuBuffer>& buffer_table)
417 return SparseTable<T, GpuView>(
418 GpuView<T>(
const_cast<T*
>(buffer_table.dataStorage().data()),
419 buffer_table.dataStorage().size()),
420 GpuView<int>(
const_cast<int*
>(buffer_table.rowStarts().data()),
421 buffer_table.rowStarts().size())
Definition: SparseTable.hpp:286
OPM_HOST_DEVICE Iterator & operator++()
Definition: SparseTable.hpp:293
OPM_HOST_DEVICE Iterator(const SparseTable &table, const int begin_row_index)
Definition: SparseTable.hpp:288
OPM_HOST_DEVICE row_type operator*() const
Definition: SparseTable.hpp:298
OPM_HOST_DEVICE bool operator!=(const Iterator &other)
Definition: SparseTable.hpp:307
OPM_HOST_DEVICE bool operator==(const Iterator &other)
Definition: SparseTable.hpp:302
Definition: SparseTable.hpp:113
OPM_HOST_DEVICE bool operator==(const SparseTable &other) const
Equality.
Definition: SparseTable.hpp:327
void swap(SparseTable< T > &other)
Swap contents for other SparseTable<T>
Definition: SparseTable.hpp:204
const T data(int i) const
Definition: SparseTable.hpp:347
typename row_type_helper< Storage< T > >::const_type row_type
Definition: SparseTable.hpp:264
void reserve(int exptd_nrows, int exptd_ndata)
Allocate storage for table of expected size.
Definition: SparseTable.hpp:197
typename row_type_helper< Storage< T > >::mutable_type mutable_row_type
Definition: SparseTable.hpp:265
const Storage< T > & dataStorage() const
Definition: SparseTable.hpp:359
void allocate(IntegerIter rowsize_beg, IntegerIter rowsize_end)
Definition: SparseTable.hpp:166
OPM_HOST_DEVICE int dataSize() const
Returns the number of data elements.
Definition: SparseTable.hpp:211
void clear()
Makes the table empty().
Definition: SparseTable.hpp:227
SparseTable(Storage< T > &&data, Storage< int > &&row_starts)
Definition: SparseTable.hpp:134
void appendRow(DataIter row_beg, DataIter row_end)
Appends a row to the table.
Definition: SparseTable.hpp:178
OPM_HOST_DEVICE bool empty() const
True if the table contains no rows.
Definition: SparseTable.hpp:185
const T * dataPtr() const
Definition: SparseTable.hpp:353
OPM_HOST_DEVICE int size() const
Returns the number of rows in the table.
Definition: SparseTable.hpp:191
const Storage< int > & rowStarts() const
Definition: SparseTable.hpp:365
SparseTable()
Default constructor. Yields an empty SparseTable.
Definition: SparseTable.hpp:116
void print(std::basic_ostream< charT, traits > &os) const
Definition: SparseTable.hpp:333
OPM_HOST_DEVICE row_type operator[](int row) const
Returns a row of the table.
Definition: SparseTable.hpp:268
void assign(DataIter data_beg, DataIter data_end, IntegerIter rowsize_beg, IntegerIter rowsize_end)
Definition: SparseTable.hpp:154
SparseTable(DataIter data_beg, DataIter data_end, IntegerIter rowsize_beg, IntegerIter rowsize_end)
Definition: SparseTable.hpp:127
OPM_HOST_DEVICE Iterator begin() const
Iterator access.
Definition: SparseTable.hpp:317
OPM_HOST_DEVICE int rowSize(int row) const
Returns the size of a table row.
Definition: SparseTable.hpp:217
OPM_HOST_DEVICE mutable_row_type operator[](int row)
Returns a mutable row of the table.
Definition: SparseTable.hpp:276
OPM_HOST_DEVICE Iterator end() const
Definition: SparseTable.hpp:321
Holds the implementation of the CpGrid as a pimple.
Definition: CellQuadrature.hpp:26
constexpr bool always_false_v
Definition: SparseTable.hpp:53
Definition: SparseTable.hpp:59
T & reference
Definition: SparseTable.hpp:65
reference operator*() const
Definition: SparseTable.hpp:70
friend bool operator==(const PoisonIterator &, const PoisonIterator &)
Definition: SparseTable.hpp:93
T value_type
Definition: SparseTable.hpp:62
pointer operator->() const
Definition: SparseTable.hpp:75
T * pointer
Definition: SparseTable.hpp:64
friend bool operator!=(const PoisonIterator &, const PoisonIterator &)
Definition: SparseTable.hpp:98
std::input_iterator_tag iterator_category
Definition: SparseTable.hpp:61
PoisonIterator operator++(int)
Definition: SparseTable.hpp:87
PoisonIterator & operator++()
Definition: SparseTable.hpp:81
std::ptrdiff_t difference_type
Definition: SparseTable.hpp:63
Definition: SparseTable.hpp:236
iterator_range< PoisonIterator< T > > const_type
Definition: SparseTable.hpp:237
mutable_iterator_range< PoisonIterator< T > > mutable_type
Definition: SparseTable.hpp:238
Definition: IteratorRange.hpp:52
Definition: IteratorRange.hpp:72