35 #ifndef OPM_SPARSETABLE_HEADER 36 #define OPM_SPARSETABLE_HEADER 38 #include <opm/grid/utility/ErrorMacros.hpp> 39 #include <opm/grid/utility/IteratorRange.hpp> 42 #include <opm/common/utility/gpuistl_if_available.hpp> 47 #include <initializer_list> 50 #include <type_traits> 58 inline constexpr
bool always_false_v =
false;
66 using iterator_category = std::input_iterator_tag;
68 using difference_type = std::ptrdiff_t;
75 reference operator*()
const {
76 static_assert(always_false_v<T>,
"PoisonIterator: operator*() is not allowed.");
80 pointer operator->()
const {
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);
139 SparseTable(Storage<T>&& data, Storage<int>&& row_starts)
140 : data_(
std::move(data))
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;
206 OPM_HOST_DEVICE
int size()
const 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_);
235 OPM_ERROR_IF(row < 0 || row >=
size(),
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>> {
279 using row_type =
typename row_type_helper<Storage<T>>::const_type;
280 using mutable_row_type =
typename row_type_helper<Storage<T>>::mutable_type;
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());
294 return mutable_row_type{data_.begin() + row_start_[row],
295 data_.begin() + row_start_[row + 1]};
305 , row_index_(begin_row_index)
308 OPM_HOST_DEVICE
Iterator& operator++()
313 OPM_HOST_DEVICE row_type operator*()
const 315 return table_[row_index_];
317 OPM_HOST_DEVICE
bool operator==(
const Iterator& other)
319 assert(&table_ == &other.table_);
320 return row_index_ == other.row_index_;
322 OPM_HOST_DEVICE
bool operator!=(
const Iterator& other)
324 return !(*
this == other);
332 OPM_HOST_DEVICE Iterator
begin()
const 334 return Iterator(*
this, 0);
336 OPM_HOST_DEVICE Iterator end()
const 338 return Iterator(*
this,
size());
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,
" "));
360 const T data(
int i)
const {
366 const T* dataPtr()
const 372 const Storage<T>& dataStorage()
const 378 const Storage<int>& rowStarts()
const 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.");
416 namespace Opm::gpuistl {
419 auto 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())
428 auto 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())
441 #endif // OPM_SPARSETABLE_HEADER OPM_HOST_DEVICE bool empty() const
True if the table contains no rows.
Definition: SparseTable.hpp:200
Definition: IteratorRange.hpp:76
A SparseTable stores a table with rows of varying size as efficiently as possible.
Definition: SparseTable.hpp:117
OPM_HOST_DEVICE int size() const
Returns the number of rows in the table.
Definition: SparseTable.hpp:206
void swap(SparseTable< T > &other)
Swap contents for other SparseTable<T>
Definition: SparseTable.hpp:219
OPM_HOST_DEVICE int dataSize() const
Returns the number of data elements.
Definition: SparseTable.hpp:226
Definition: Intersection.hpp:329
void reserve(int exptd_nrows, int exptd_ndata)
Allocate storage for table of expected size.
Definition: SparseTable.hpp:212
OPM_HOST_DEVICE bool operator==(const SparseTable &other) const
Equality.
Definition: SparseTable.hpp:342
Holds the implementation of the CpGrid as a pimple.
Definition: CellQuadrature.cpp:71
OPM_HOST_DEVICE Iterator begin() const
Iterator access.
Definition: SparseTable.hpp:332
void clear()
Makes the table empty().
Definition: SparseTable.hpp:242
OPM_HOST_DEVICE row_type operator[](int row) const
Returns a row of the table.
Definition: SparseTable.hpp:283
SparseTable(DataIter data_beg, DataIter data_end, IntegerIter rowsize_beg, IntegerIter rowsize_end)
A constructor taking all the data for the table and row sizes.
Definition: SparseTable.hpp:132
OPM_HOST_DEVICE int rowSize(int row) const
Returns the size of a table row.
Definition: SparseTable.hpp:232
void allocate(IntegerIter rowsize_beg, IntegerIter rowsize_end)
Request storage for table of given size.
Definition: SparseTable.hpp:181
Iterator for iterating over the container as a whole, i.e.
Definition: SparseTable.hpp:300
OPM_HOST_DEVICE mutable_row_type operator[](int row)
Returns a mutable row of the table.
Definition: SparseTable.hpp:291
Definition: IteratorRange.hpp:56
SparseTable()
Default constructor. Yields an empty SparseTable.
Definition: SparseTable.hpp:121
Definition: SparseTable.hpp:251
void appendRow(DataIter row_beg, DataIter row_end)
Appends a row to the table.
Definition: SparseTable.hpp:193
SparseTable(std::initializer_list< std::initializer_list< T >> initlist) requires(std
Initializer list constructor for easy construction of small SparseTables.
Definition: SparseTable.hpp:153
Definition: SparseTable.hpp:64
void assign(DataIter data_beg, DataIter data_end, IntegerIter rowsize_beg, IntegerIter rowsize_end)
Sets the table to contain the given data, organized into rows as indicated by the given row sizes...
Definition: SparseTable.hpp:169