monolish  0.16.0
MONOlithic LInear equation Solvers for Highly-parallel architecture
monolish_view1D.hpp
Go to the documentation of this file.
1 #pragma once
2 #include "./monolish_logger.hpp"
3 #include <cassert>
4 #include <exception>
5 #include <fstream>
6 #include <iostream>
7 #include <iterator>
8 #include <memory>
9 #include <omp.h>
10 #include <stdexcept>
11 #include <string>
12 #include <vector>
13 
14 #if USE_SXAT
15 #undef _HAS_CPP17
16 #endif
17 #include <random>
18 #if USE_SXAT
19 #define _HAS_CPP17 1
20 #endif
21 
22 #if defined USE_MPI
23 #include <mpi.h>
24 #endif
25 
26 namespace monolish {
27 template <typename Float> class vector;
28 
29 namespace matrix {
30 template <typename Float> class Dense;
31 template <typename Float> class CRS;
32 template <typename Float> class LinearOperator;
33 } // namespace matrix
34 
46 template <typename TYPE, typename Float> class view1D {
47 private:
48  TYPE &target;
49  Float *target_data;
50  size_t first;
51  size_t last;
52  size_t range;
53 
54 public:
65  view1D(vector<Float> &x, const size_t start, const size_t end) : target(x) {
66  first = start;
67  last = end;
68  range = last - first;
69  target_data = x.data();
70  }
71 
82  view1D(matrix::Dense<Float> &A, const size_t start, const size_t end)
83  : target(A) {
84  first = start;
85  last = end;
86  range = last - first;
87  target_data = A.val.data();
88  }
89 
100  view1D(view1D<vector<Float>, Float> &x, const size_t start, const size_t end)
101  : target(x) {
102  first = x.get_first() + start;
103  last = x.get_last() + end;
104  range = last - first;
105  target_data = x.data();
106  }
107 
118  view1D(view1D<matrix::Dense<Float>, Float> &x, const size_t start,
119  const size_t end)
120  : target(x) {
121  first = x.get_first() + start;
122  last = x.get_last() + end;
123  range = last - first;
124  target_data = x.data();
125  }
126 
133  [[nodiscard]] size_t size() const { return range; }
134 
141  [[nodiscard]] size_t get_nnz() const { return range; }
142 
149  [[nodiscard]] size_t get_first() const { return first; }
150 
157  [[nodiscard]] size_t get_last() const { return last; }
158 
165  [[nodiscard]] size_t get_offset() const { return first; }
166 
172  void set_first(size_t i) { first = i; }
173 
179  void set_last(size_t i) {
180  assert(first + i <= target.get_nnz());
181  last = i;
182  }
183 
192  [[nodiscard]] size_t get_device_mem_stat() const {
193  return target.get_device_mem_stat();
194  }
195 
203  [[nodiscard]] Float *data() const { return target_data; }
204 
211  [[nodiscard]] Float *data() { return target_data; }
212 
219  [[nodiscard]] Float *begin() const { return target_data + get_offset(); }
220 
227  [[nodiscard]] Float *begin() { return target_data + get_offset(); }
228 
235  [[nodiscard]] Float *end() const { return target_data + range; }
236 
243  [[nodiscard]] Float *end() { return target_data + range; }
244 
253  void print_all(bool force_cpu = false) const;
254 
265  void resize(size_t N) {
266  assert(first + N <= target.get_nnz());
267  last = first + N;
268  }
269 
279  [[nodiscard]] Float &operator[](const size_t i) {
280  if (target.get_device_mem_stat()) {
281  throw std::runtime_error("Error, GPU vector cant use operator[]");
282  }
283  return target_data[i + first];
284  }
285 
294  void fill(Float value);
295 };
298 } // namespace monolish
monolish::view1D::size
size_t size() const
get view1D size (end-start)
Definition: monolish_view1D.hpp:133
monolish::view1D::view1D
view1D(matrix::Dense< Float > &A, const size_t start, const size_t end)
create view1D(start:end) from Dense matrix
Definition: monolish_view1D.hpp:82
monolish::view1D::end
Float * end() const
returns a end iterator
Definition: monolish_view1D.hpp:235
monolish::view1D::first
size_t first
Definition: monolish_view1D.hpp:50
monolish::view1D::target
TYPE & target
Definition: monolish_view1D.hpp:48
monolish::view1D::get_device_mem_stat
size_t get_device_mem_stat() const
true: sended, false: not send
Definition: monolish_view1D.hpp:192
monolish::matrix::Dense::val
std::vector< Float > val
Dense format value(size M x N)
Definition: monolish_dense.hpp:46
monolish::matrix::Dense
Dense format Matrix.
Definition: monolish_coo.hpp:28
monolish::view1D::view1D
view1D(view1D< vector< Float >, Float > &x, const size_t start, const size_t end)
create view1D(start:end) from monolish::vector
Definition: monolish_view1D.hpp:100
monolish::vector::data
const Float * data() const
returns a direct pointer to the vector
Definition: monolish_vector.hpp:249
monolish::view1D::last
size_t last
Definition: monolish_view1D.hpp:51
monolish::view1D::resize
void resize(size_t N)
change last postion
Definition: monolish_view1D.hpp:265
monolish::view1D::get_first
size_t get_first() const
get first position
Definition: monolish_view1D.hpp:149
monolish::view1D::get_offset
size_t get_offset() const
get first position (same as get_first())
Definition: monolish_view1D.hpp:165
monolish::view1D::data
Float * data() const
returns a direct pointer to the original vector (dont include offset)
Definition: monolish_view1D.hpp:203
monolish
monolish namespaces
Definition: monolish_matrix_blas.hpp:5
monolish_logger.hpp
monolish::view1D::set_first
void set_first(size_t i)
change first position
Definition: monolish_view1D.hpp:172
monolish::view1D::view1D
view1D(view1D< matrix::Dense< Float >, Float > &x, const size_t start, const size_t end)
create view1D(start:end) from monolish::matrix::Dense
Definition: monolish_view1D.hpp:118
monolish::view1D::begin
Float * begin() const
returns begin iterator (include offset)
Definition: monolish_view1D.hpp:219
monolish::view1D::view1D
view1D(vector< Float > &x, const size_t start, const size_t end)
create view1D(start:end) from vector
Definition: monolish_view1D.hpp:65
monolish::view1D::print_all
void print_all(bool force_cpu=false) const
print all elements to standart I/O
monolish::view1D::get_last
size_t get_last() const
get end position
Definition: monolish_view1D.hpp:157
monolish::view1D
1D view class
Definition: monolish_coo.hpp:26
monolish::view1D::get_nnz
size_t get_nnz() const
get view1D size (same as size())
Definition: monolish_view1D.hpp:141
monolish::view1D::range
size_t range
Definition: monolish_view1D.hpp:52
monolish::view1D::target_data
Float * target_data
Definition: monolish_view1D.hpp:49
monolish::vector
vector class
Definition: monolish_coo.hpp:25
monolish::view1D::fill
void fill(Float value)
fill vector elements with a scalar value
monolish::view1D::data
Float * data()
returns a direct pointer to the vector (dont include offset)
Definition: monolish_view1D.hpp:211
monolish::view1D::set_last
void set_last(size_t i)
change last position
Definition: monolish_view1D.hpp:179
monolish::view1D::begin
Float * begin()
returns begin iterator (include offset)
Definition: monolish_view1D.hpp:227
monolish::view1D::operator[]
Float & operator[](const size_t i)
reference to the element at position
Definition: monolish_view1D.hpp:279
monolish::view1D::end
Float * end()
returns a end iterator
Definition: monolish_view1D.hpp:243