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,
"The index of a SparseVector must be non-negative (is " << index <<
")");
150 OPM_ERROR_IF(index >= size_,
"The index of a SparseVector must be smaller than the maximum value (is " << index <<
", max value: " << size_ <<
")");
152 std::vector<int>::const_iterator lb = std::lower_bound(indices_.begin(), indices_.end(), index);
153 if (lb != indices_.end() && *lb == index) {
154 return data_[lb - indices_.begin()];
156 return default_elem_;
166 OPM_ERROR_IF(nzindex < 0,
"The index of a SparseVector must be non-negative (is " << nzindex <<
")");
167 OPM_ERROR_IF(nzindex >=
nonzeroSize(),
"The index of a SparseVector must be smaller than the maximum value (is " << nzindex <<
", max value: " <<
nonzeroSize() <<
")");
169 return data_[nzindex];
177 assert(nzindex >= 0);
179 return indices_[nzindex];
188 std::vector<T> data_;
189 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
const T & nonzeroElement(int nzindex) const
O(1) element access.
Definition: SparseVector.hpp:163
int nonzeroIndex(int nzindex) const
O(1) index access.
Definition: SparseVector.hpp:175
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
SparseVector()
Default constructor. Yields an empty SparseVector.
Definition: SparseVector.hpp:58
bool operator==(const SparseVector &other) const
Equality.
Definition: SparseVector.hpp:137
const T & element(int index) const
O(log n) element access.
Definition: SparseVector.hpp:146
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:29