22
22
/// =========================================================================
24
24
# include "rheolef/array.h"
25
# include "boost/numeric/ublas/storage.hpp"
25
27
namespace rheolef {
30
using boost::numeric::ublas::basic_range;
31
using boost::numeric::ublas::range;
32
template <class Expr> struct vec_expr;
33
template <class T, class M> class vec_range;
34
template <class T, class M> class vec_range_const;
37
template <class T, class M> class vec_concat_value;
28
NAME: vec - vector in distributed environment (@PACKAGE@-@VERSION@)
40
NAME: @code{vec} - vector in distributed environment (@PACKAGE@-@VERSION@)
30
42
STL-like vector container for a sequential or
31
43
distributed memory machine model.
57
69
typedef array<T, M> base;
58
typedef typename base::size_type size_type;
59
typedef typename base::iterator iterator;
60
typedef typename base::const_iterator const_iterator;
70
typedef typename base::size_type size_type;
71
typedef std::ptrdiff_t difference_type;
73
// pb compile avec boost sur foehn:
74
typedef typename base::difference_type difference_type;
76
typedef basic_range<size_type, difference_type> range_type;
77
typedef typename base::reference reference;
78
typedef typename base::const_reference const_reference;
79
typedef typename base::iterator iterator;
80
typedef typename base::const_iterator const_iterator;
62
82
// allocator/deallocator:
75
95
size_type size = 0,
76
96
const T& init_val = std::numeric_limits<T>::max());
100
const_reference operator[] (size_type i) const;
101
reference operator[] (size_type i);
107
vec(const vec_range<T,M>& vr);
108
vec(const vec_range_const<T,M>& vr);
109
vec<T,M>& operator= (const vec_range<T,M>& vr);
110
vec<T,M>& operator= (const vec_range_const<T,M>& vr);
112
vec_range_const<T,M> operator[] (const range_type& r) const;
113
vec_range<T,M> operator[] (const range_type& r);
115
// assignment to a constant:
117
vec<T,M>& operator= (const int& expr);
118
vec<T,M>& operator= (const T& expr);
78
120
// expression template:
80
122
template<typename Expr>
81
123
vec (const Expr& expr);
83
125
template<typename Expr>
84
vec<T,M>& operator= (const Expr& expr);
126
vec<T,M>& operator= (const vec_expr<Expr>& expr);
86
128
template<typename Expr>
87
129
vec<T,M>& operator+= (const Expr& expr);
89
131
template<typename Expr>
90
132
vec<T,M>& operator-= (const Expr& expr);
134
// initializer list (c++ 2011):
136
#ifdef _RHEOLEF_HAVE_STD_INITIALIZER_LIST
137
vec (const std::initializer_list<vec_concat_value<T,M> >& init_list);
138
vec<T,M>& operator= (const std::initializer_list<vec_concat_value<T,M> >& init_list);
139
#endif // _RHEOLEF_HAVE_STD_INITIALIZER_LIST
126
175
size_type dis_size,
127
176
const T& init_val)
129
array<T,M>::resize (dis_size, init_val);
178
base::resize (dis_size, init_val);
180
template <class T, class M>
183
vec<T,M>::operator= (const int& expr)
185
std::fill (array<T,M>::begin(), array<T,M>::end(), expr);
188
template <class T, class M>
191
vec<T,M>::operator= (const T& expr)
193
std::fill (array<T,M>::begin(), array<T,M>::end(), expr);
196
template <class T, class M>
199
vec<T,M>::operator= (const vec_range_const<T,M>& vr)
201
distributor ownership (distributor::decide, vr._u.comm(), vr._r.size());
203
std::copy (vr.begin(), vr.end(), base::begin());
206
template <class T, class M>
209
vec<T,M>::operator= (const vec_range<T,M>& vr)
211
operator= (vec_range_const<T,M>(vr));
214
template <class T, class M>
216
vec<T,M>::vec(const vec_range<T,M>& vr)
221
template <class T, class M>
223
vec<T,M>::vec(const vec_range_const<T,M>& vr)
228
template <class T, class M>
230
typename vec<T,M>::const_reference
231
vec<T,M>::operator[] (size_type i) const
233
return base::operator[] (i);
235
template <class T, class M>
237
typename vec<T,M>::reference
238
vec<T,M>::operator[] (size_type i)
240
return base::operator[] (i);
242
template <class T, class M>
245
vec<T,M>::operator[] (const range_type& r)
247
return vec_range<T,M> (*this, r);
249
template <class T, class M>
252
vec<T,M>::operator[] (const range_type& r) const
254
return vec_range_const<T,M> (*this, r);
256
template <class T, class M>
259
vec<T,M>::max_abs () const
262
for (const_iterator iter = base::begin(), last = base::end(); iter != last; iter++) {
263
val = std::max(val, abs(*iter));
265
#ifdef _RHEOLEF_HAVE_MPI
266
val = mpi::all_reduce (base::comm(), val, mpi::maximum<T>());
267
#endif // _RHEOLEF_HAVE_MPI
131
270
template <class T>