My Project
Loading...
Searching...
No Matches
WindowedArray.hpp
Go to the documentation of this file.
1/*
2 Copyright (c) 2018 Statoil ASA
3
4 This file is part of the Open Porous Media project (OPM).
5
6 OPM is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation, either version 3 of the License, or
9 (at your option) any later version.
10
11 OPM is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with OPM. If not, see <http://www.gnu.org/licenses/>.
18*/
19
20#ifndef OPM_WINDOWED_ARRAY_HPP
21#define OPM_WINDOWED_ARRAY_HPP
22
23#include <cassert>
24#include <exception>
25#include <iterator>
26#include <stdexcept>
27#include <type_traits>
28#include <vector>
29
30#include <boost/range/iterator_range.hpp>
31
36
37namespace Opm { namespace RestartIO { namespace Helpers {
38
48 template <typename T>
50 {
51 public:
53 using WriteWindow = boost::iterator_range<
54 typename std::vector<T>::iterator>;
55
57 using ReadWindow = boost::iterator_range<
58 typename std::vector<T>::const_iterator>;
59
60 using Idx = typename std::vector<T>::size_type;
61
64 struct NumWindows { Idx value; };
65
68 struct WindowSize { Idx value; };
69
74 explicit WindowedArray(const NumWindows n,
75 const WindowSize sz,
76 const T initial = T{})
77 : x_ (n.value * sz.value, initial)
78 , windowSize_(sz.value)
79 {
80 if (sz.value == 0) {
81 throw std::invalid_argument {
82 "Zero-sized windows are not permitted"
83 };
84 }
85 }
86
87 WindowedArray(const WindowedArray& rhs) = default;
88 WindowedArray(WindowedArray&& rhs) = default;
89 WindowedArray& operator=(const WindowedArray& rhs) = delete;
90 WindowedArray& operator=(WindowedArray&& rhs) = default;
91
93 Idx numWindows() const
94 {
95 return this->x_.size() / this->windowSize_;
96 }
97
99 Idx windowSize() const
100 {
101 return this->windowSize_;
102 }
103
108 WriteWindow operator[](const Idx window)
109 {
110 assert ((window < this->numWindows()) &&
111 "Window ID Out of Bounds");
112
113 auto b = std::begin(this->x_) + window*this->windowSize_;
114 auto e = b + this->windowSize_;
115
116 return { b, e };
117 }
118
123 ReadWindow operator[](const Idx window) const
124 {
125 assert ((window < this->numWindows()) &&
126 "Window ID Out of Bounds");
127
128 auto b = std::begin(this->x_) + window*this->windowSize_;
129 auto e = b + this->windowSize_;
130
131 return { b, e };
132 }
133
136 const std::vector<T>& data() const
137 {
138 return this->x_;
139 }
140
144 std::vector<T> getDataDestructively()
145 {
146 return std::move(this->x_);
147 }
148
149 private:
150 std::vector<T> x_;
151
152 Idx windowSize_;
153 };
154
155
167 template <typename T>
169 {
170 private:
171 using NumWindows = typename WindowedArray<T>::NumWindows;
172
173 public:
174 using WriteWindow = typename WindowedArray<T>::WriteWindow;
175 using ReadWindow = typename WindowedArray<T>::ReadWindow;
176 using WindowSize = typename WindowedArray<T>::WindowSize;
177 using Idx = typename WindowedArray<T>::Idx;
178
181 struct NumRows { Idx value; };
182
185 struct NumCols { Idx value; };
186
192 explicit WindowedMatrix(const NumRows& nRows,
193 const NumCols& nCols,
194 const WindowSize& sz,
195 const T initial = T{})
196 : data_ (NumWindows{ nRows.value * nCols.value }, sz, initial)
197 , numCols_(nCols.value)
198 {
199 if (nCols.value == 0) {
200 throw std::invalid_argument {
201 "Zero-columned windowed matrices are not permitted"
202 };
203 }
204 }
205
207 Idx numCols() const
208 {
209 return this->numCols_;
210 }
211
213 Idx numRows() const
214 {
215 return this->data_.numWindows() / this->numCols();
216 }
217
219 Idx windowSize() const
220 {
221 return this->data_.windowSize();
222 }
223
233 WriteWindow operator()(const Idx row, const Idx col)
234 {
235 return this->data_[ this->i(row, col) ];
236 }
237
247 ReadWindow operator()(const Idx row, const Idx col) const
248 {
249 return this->data_[ this->i(row, col) ];
250 }
251
254 auto data() const
255 -> decltype(std::declval<const WindowedArray<T>>().data())
256 {
257 return this->data_.data();
258 }
259
264 -> decltype(std::declval<WindowedArray<T>>()
266 {
267 return this->data_.getDataDestructively();
268 }
269
270 private:
271 WindowedArray<T> data_;
272
273 Idx numCols_;
274
276 Idx i(const Idx row, const Idx col) const
277 {
278 return row*this->numCols() + col;
279 }
280 };
281
282}}} // Opm::RestartIO::Helpers
283
284#endif // OPM_WINDOW_ARRAY_HPP
Provide read-only and read/write access to constantly sized portions/windows of a linearised buffer w...
Definition WindowedArray.hpp:50
std::vector< T > getDataDestructively()
Extract full, linearised data items for all windows.
Definition WindowedArray.hpp:144
Idx numWindows() const
Retrieve number of windows allocated for this array.
Definition WindowedArray.hpp:93
Idx windowSize() const
Retrieve number of data items per windows.
Definition WindowedArray.hpp:99
boost::iterator_range< typename std::vector< T >::const_iterator > ReadWindow
Read-only access.
Definition WindowedArray.hpp:58
const std::vector< T > & data() const
Get read-only access to full, linearised data items for all windows.
Definition WindowedArray.hpp:136
WriteWindow operator[](const Idx window)
Request read/write access to individual window.
Definition WindowedArray.hpp:108
boost::iterator_range< typename std::vector< T >::iterator > WriteWindow
Read/write access.
Definition WindowedArray.hpp:54
ReadWindow operator[](const Idx window) const
Request read-only access to individual window.
Definition WindowedArray.hpp:123
WindowedArray(const NumWindows n, const WindowSize sz, const T initial=T{})
Constructor.
Definition WindowedArray.hpp:74
Provide read-only and read/write access to constantly sized portions/windows of a linearised buffer w...
Definition WindowedArray.hpp:169
ReadWindow operator()(const Idx row, const Idx col) const
Request read-only access to individual window.
Definition WindowedArray.hpp:247
WriteWindow operator()(const Idx row, const Idx col)
Request read/write access to individual window.
Definition WindowedArray.hpp:233
auto getDataDestructively() -> decltype(std::declval< WindowedArray< T > >() .getDataDestructively())
Extract full, linearised data items for all windows.
Definition WindowedArray.hpp:263
Idx windowSize() const
Retrieve number of data items per windows.
Definition WindowedArray.hpp:219
Idx numRows() const
Retrieve number of rows allocated for this matrix.
Definition WindowedArray.hpp:213
Idx numCols() const
Retrieve number of columns allocated for this matrix.
Definition WindowedArray.hpp:207
WindowedMatrix(const NumRows &nRows, const NumCols &nCols, const WindowSize &sz, const T initial=T{})
Constructor.
Definition WindowedArray.hpp:192
auto data() const -> decltype(std::declval< const WindowedArray< T > >().data())
Get read-only access to full, linearised data items for all windows.
Definition WindowedArray.hpp:254
This class implements a small container which holds the transmissibility mulitpliers for all the face...
Definition Exceptions.hpp:30
Distinct compile-time type for number of windows in underlying storage.
Definition WindowedArray.hpp:64
Distinct compile-time type for size of windows (number of data items per window.)
Definition WindowedArray.hpp:68
Distinct compile-time type for number of matrix columns in underlying storage.
Definition WindowedArray.hpp:185
Distinct compile-time type for number of matrix rows in underlying storage.
Definition WindowedArray.hpp:181