20 #include "libmesh/libmesh_common.h"
24 #ifndef LIBMESH_DISTRIBUTED_VECTOR_H
25 #define LIBMESH_DISTRIBUTED_VECTOR_H
28 #include "libmesh/int_range.h"
29 #include "libmesh/numeric_vector.h"
30 #include "libmesh/parallel.h"
89 const std::vector<numeric_index_type> & ghost,
110 virtual void close ()
override;
112 virtual void clear ()
override;
114 virtual void zero ()
override;
116 virtual std::unique_ptr<NumericVector<T>>
zero_clone ()
const override;
118 virtual std::unique_ptr<NumericVector<T>>
clone ()
const override;
122 const bool fast=
false,
126 const bool fast=
false,
131 const std::vector<numeric_index_type> & ghost,
132 const bool fast =
false,
136 const bool fast =
false)
override;
144 virtual Real min ()
const override;
146 virtual Real max ()
const override;
148 virtual T
sum()
const override;
182 virtual void add (
const T s)
override;
196 { libmesh_not_implemented(); }
200 { libmesh_not_implemented(); }
202 virtual void scale (
const T factor)
override;
204 virtual void abs()
override;
208 virtual void localize (std::vector<T> & v_local)
const override;
213 const std::vector<numeric_index_type> & send_list)
const override;
215 virtual void localize (std::vector<T> & v_local,
216 const std::vector<numeric_index_type> & indices)
const override;
220 const std::vector<numeric_index_type> & send_list)
override;
261 template <
typename T>
268 _first_local_index(0),
269 _last_local_index (0)
276 template <
typename T>
283 this->
init(n, n,
false, ptype);
288 template <
typename T>
296 this->
init(n, n_local,
false, ptype);
301 template <
typename T>
306 const std::vector<numeric_index_type> & ghost,
310 this->
init(n, n_local, ghost,
false, ptype);
315 template <
typename T>
323 parallel_object_only();
325 libmesh_assert_less_equal (n_local, n);
345 _values.resize(n_local);
346 _local_size = n_local;
349 _first_local_index = 0;
351 #ifdef LIBMESH_HAVE_MPI
353 std::vector<numeric_index_type> local_sizes (this->n_processors(), 0);
355 local_sizes[this->processor_id()] = n_local;
357 this->comm().sum(local_sizes);
362 _first_local_index += local_sizes[p];
371 dbg_sum += local_sizes[p];
373 libmesh_assert_equal_to (dbg_sum, n);
381 libmesh_error_msg(
"ERROR: MPI is required for n != n_local!");
385 _last_local_index = _first_local_index + n_local;
396 template <
typename T>
400 const std::vector<numeric_index_type> & ,
405 this->
init(n, n_local, fast, ptype);
421 template <
typename T>
427 this->
init(n,n,fast,ptype);
432 template <
typename T>
438 this->_is_closed =
true;
443 template <
typename T>
452 _last_local_index = 0;
460 template <
typename T>
465 libmesh_assert_equal_to (_values.size(), _local_size);
466 libmesh_assert_equal_to ((_last_local_index - _first_local_index), _local_size);
468 std::fill (_values.begin(),
475 template <
typename T>
480 cloned_vector->
init(*
this);
481 return std::unique_ptr<NumericVector<T>>(cloned_vector);
486 template <
typename T>
491 cloned_vector->
init(*
this,
true);
492 *cloned_vector = *
this;
493 return std::unique_ptr<NumericVector<T>>(cloned_vector);
498 template <
typename T>
503 libmesh_assert_equal_to (_values.size(), _local_size);
504 libmesh_assert_equal_to ((_last_local_index - _first_local_index), _local_size);
511 template <
typename T>
516 libmesh_assert_equal_to (_values.size(), _local_size);
517 libmesh_assert_equal_to ((_last_local_index - _first_local_index), _local_size);
524 template <
typename T>
529 libmesh_assert_equal_to (_values.size(), _local_size);
530 libmesh_assert_equal_to ((_last_local_index - _first_local_index), _local_size);
532 return _first_local_index;
537 template <
typename T>
542 libmesh_assert_equal_to (_values.size(), _local_size);
543 libmesh_assert_equal_to ((_last_local_index - _first_local_index), _local_size);
545 return _last_local_index;
550 template <
typename T>
555 libmesh_assert_equal_to (_values.size(), _local_size);
556 libmesh_assert_equal_to ((_last_local_index - _first_local_index), _local_size);
558 (i < last_local_index())) );
560 return _values[i - _first_local_index];
565 template <
typename T>
570 libmesh_assert_equal_to (_values.size(), _local_size);
571 libmesh_assert_equal_to ((_last_local_index - _first_local_index), _local_size);
572 libmesh_assert_less (i, size());
573 libmesh_assert_less (i-first_local_index(), local_size());
575 _values[i - _first_local_index] =
value;
580 template <
typename T>
585 libmesh_assert_equal_to (_values.size(), _local_size);
586 libmesh_assert_equal_to ((_last_local_index - _first_local_index), _local_size);
587 libmesh_assert_less (i, size());
588 libmesh_assert_less (i-first_local_index(), local_size());
590 _values[i - _first_local_index] +=
value;
595 template <
typename T>
600 parallel_object_only();
603 libmesh_assert_equal_to (_values.size(), _local_size);
604 libmesh_assert_equal_to ((_last_local_index - _first_local_index), _local_size);
606 Real local_min = std::numeric_limits<Real>::max();
607 for (
auto v : _values)
610 this->comm().min(local_min);
617 template <
typename T>
622 parallel_object_only();
625 libmesh_assert_equal_to (_values.size(), _local_size);
626 libmesh_assert_equal_to ((_last_local_index - _first_local_index), _local_size);
628 Real local_max = -std::numeric_limits<Real>::max();
629 for (
auto v : _values)
632 this->comm().max(local_max);
638 template <
typename T>
656 #endif // LIBMESH_DISTRIBUTED_VECTOR_H