37#ifndef OPM_SPARSEVECTOR_HEADER
38#define OPM_SPARSEVECTOR_HEADER
43#include <opm/common/ErrorMacros.hpp>
59 : size_(0), default_elem_()
66 : size_(sz), default_elem_()
75 template <
typename DataIter,
typename IntegerIter>
77 DataIter data_beg, DataIter data_end,
78 IntegerIter index_beg, IntegerIter index_end)
79 : size_(sz), data_(data_beg, data_end), indices_(index_beg, index_end),
83 OPM_ERROR_IF(sz < 0,
"The size of a SparseVector must be non-negative");
84 OPM_ERROR_IF(indices_.size() != data_.size(),
"The number of indices of a SparseVector must equal to the number of entries");
86 int num_ind = indices_.size();
87 for (
int i = 0; i < num_ind; ++i) {
88 int index = indices_[i];
89 if (index <= last_index || index >= sz) {
90 OPM_THROW(std::logic_error,
"Error in SparseVector construction, index is nonincreasing or out of range.");
103 assert(indices_.empty() || index > indices_.back());
104 assert(index < size_);
105 data_.push_back(elem);
106 indices_.push_back(index);
139 return size_ == other.size_ && data_ == other.data_ && indices_ == other.indices_;
149 OPM_ERROR_IF(index < 0,
150 "The index of a SparseVector must be non-negative "
151 "(is " + std::to_string(index) +
")");
152 OPM_ERROR_IF(index >= size_,
153 "The index of a SparseVector must be smaller "
154 "than the maximum value "
155 "(is " + std::to_string(index) +
156 ", max value: " + std::to_string(size_) +
")");
158 std::vector<int>::const_iterator lb = std::lower_bound(indices_.begin(), indices_.end(), index);
159 if (lb != indices_.end() && *lb == index) {
160 return data_[lb - indices_.begin()];
162 return default_elem_;
172 OPM_ERROR_IF(nzindex < 0,
173 "The index of a SparseVector must be non-negative "
174 "(is " + std::to_string(nzindex) +
")");
176 "The index of a SparseVector must be smaller "
177 "than the maximum value " +
178 "(is " + std::to_string(nzindex) +
179 ", max value: " + std::to_string(
nonzeroSize()) +
")");
181 return data_[nzindex];
189 assert(nzindex >= 0);
191 return indices_[nzindex];
200 std::vector<T> data_;
201 std::vector<int> indices_;
A SparseVector stores a vector with possibly many empty elements as efficiently as possible.
Definition SparseVector.hpp:55
int size() const
Returns the size of the vector.
Definition SparseVector.hpp:117
void clear()
Makes the vector empty().
Definition SparseVector.hpp:129
void addElement(const T &elem, int index)
Appends an element to the vector.
Definition SparseVector.hpp:101
int nonzeroIndex(int nzindex) const
O(1) index access.
Definition SparseVector.hpp:187
SparseVector(int sz, DataIter data_beg, DataIter data_end, IntegerIter index_beg, IntegerIter index_end)
A constructor taking all the element data for the vector and their indices.
Definition SparseVector.hpp:76
int nonzeroSize() const
Returns the number of nonzero data elements.
Definition SparseVector.hpp:123
bool empty() const
Definition SparseVector.hpp:110
const T & nonzeroElement(int nzindex) const
O(1) element access.
Definition SparseVector.hpp:169
const T & element(int index) const
O(log n) element access.
Definition SparseVector.hpp:146
SparseVector()
Default constructor. Yields an empty SparseVector.
Definition SparseVector.hpp:58
bool operator==(const SparseVector &other) const
Equality.
Definition SparseVector.hpp:137
SparseVector(int sz)
Constructs a SparseVector with a given size, but no nonzero elements.
Definition SparseVector.hpp:65
This class implements a small container which holds the transmissibility mulitpliers for all the face...
Definition Exceptions.hpp:30