21 #include "libmesh/distributed_vector.h"
24 #include "libmesh/dense_vector.h"
25 #include "libmesh/dense_subvector.h"
26 #include "libmesh/int_range.h"
27 #include "libmesh/libmesh_common.h"
28 #include "libmesh/tensor_tools.h"
51 parallel_object_only();
54 libmesh_assert_equal_to (_values.size(), _local_size);
55 libmesh_assert_equal_to ((_last_local_index - _first_local_index), _local_size);
59 for (
auto & val : _values)
62 this->comm().sum(local_sum);
73 parallel_object_only();
76 libmesh_assert_equal_to (_values.size(), _local_size);
77 libmesh_assert_equal_to ((_last_local_index - _first_local_index), _local_size);
81 for (
auto & val : _values)
84 this->comm().sum(local_l1);
95 parallel_object_only();
98 libmesh_assert_equal_to (_values.size(), _local_size);
99 libmesh_assert_equal_to ((_last_local_index - _first_local_index), _local_size);
103 for (
auto & val : _values)
106 this->comm().sum(local_l2);
113 template <
typename T>
117 parallel_object_only();
120 libmesh_assert_equal_to (_values.size(), _local_size);
121 libmesh_assert_equal_to ((_last_local_index - _first_local_index), _local_size);
123 Real local_linfty = 0.;
125 for (
auto & val : _values)
126 local_linfty = std::max(local_linfty,
132 this->comm().max(local_linfty);
139 template <
typename T>
144 libmesh_assert_equal_to (_values.size(), _local_size);
145 libmesh_assert_equal_to ((_last_local_index - _first_local_index), _local_size);
154 template <
typename T>
159 libmesh_assert_equal_to (_values.size(), _local_size);
160 libmesh_assert_equal_to ((_last_local_index - _first_local_index), _local_size);
169 template <
typename T>
172 libmesh_assert_equal_to(size(), v.
size());
177 _values[i] *= v_vec.
_values[i];
184 template <
typename T>
187 libmesh_assert_equal_to(size(), v.
size());
192 _values[i] /= v_vec.
_values[i];
200 template <
typename T>
203 for (
auto & val : _values)
206 libmesh_assert_not_equal_to (val, T(0));
215 template <
typename T>
219 for (
auto & val : _values)
227 template <
typename T>
231 libmesh_assert_equal_to (_values.size(), _local_size);
232 libmesh_assert_equal_to ((_last_local_index - _first_local_index), _local_size);
234 for (
auto & val : _values)
240 template <
typename T>
244 libmesh_assert_equal_to (_values.size(), _local_size);
245 libmesh_assert_equal_to ((_last_local_index - _first_local_index), _local_size);
252 template <
typename T>
256 libmesh_assert_equal_to (_values.size(), _local_size);
257 libmesh_assert_equal_to ((_last_local_index - _first_local_index), _local_size);
262 libmesh_error_msg(
"Cannot add different types of NumericVectors.");
265 _values[i] += a * v->
_values[i];
270 template <
typename T>
274 libmesh_assert_equal_to (_values.size(), _local_size);
275 libmesh_assert_equal_to ((_last_local_index - _first_local_index), _local_size);
277 for (
auto & val : _values)
281 template <
typename T>
285 libmesh_assert_equal_to ((_last_local_index - _first_local_index), _local_size);
287 for (
auto & val : _values)
295 template <
typename T>
299 parallel_object_only();
306 libmesh_assert_equal_to ( this->last_local_index(), v->
last_local_index() );
312 local_dot += this->_values[i] * v->
_values[i];
315 this->comm().sum(local_dot);
322 template <
typename T>
327 libmesh_assert_equal_to (_values.size(), _local_size);
328 libmesh_assert_equal_to ((_last_local_index - _first_local_index), _local_size);
330 for (
auto & val : _values)
338 template <
typename T>
352 template <
typename T>
368 libmesh_error_msg(
"v.local_size() = " << v.
local_size() <<
" must be equal to this->local_size() = " << this->local_size());
375 template <
typename T>
380 libmesh_assert_equal_to (_values.size(), _local_size);
381 libmesh_assert_equal_to ((_last_local_index - _first_local_index), _local_size);
383 if (v.size() == local_size())
386 else if (v.size() == size())
388 _values[i-first_local_index()] = v[i];
391 libmesh_error_msg(
"Incompatible sizes in DistributedVector::operator=");
398 template <
typename T>
403 libmesh_assert_equal_to (_values.size(), _local_size);
404 libmesh_assert_equal_to ((_last_local_index - _first_local_index), _local_size);
421 #ifndef LIBMESH_HAVE_MPI
423 libmesh_assert_equal_to (local_size(), size());
430 template <
typename T>
432 const std::vector<numeric_index_type> &)
const
435 libmesh_assert_equal_to (_values.size(), _local_size);
436 libmesh_assert_equal_to ((_last_local_index - _first_local_index), _local_size);
439 localize (v_local_in);
444 template <
typename T>
446 const std::vector<numeric_index_type> & indices)
const
449 v_local.resize(indices.size());
452 std::vector<numeric_index_type> local_sizes;
453 this->comm().allgather (_local_size, local_sizes);
456 std::vector<numeric_index_type> local_size_sums(this->n_processors());
457 local_size_sums[0] = local_sizes[0];
459 local_size_sums[i] = local_size_sums[i-1] + local_sizes[i];
464 std::map<processor_id_type, std::vector<numeric_index_type>>
465 requested_ids, local_requested_ids;
468 typedef typename std::vector<numeric_index_type>::iterator iter_t;
476 iter_t ub = std::upper_bound(local_size_sums.begin(),
477 local_size_sums.end(),
483 requested_ids[on_proc].push_back(indices[i]);
484 local_requested_ids[on_proc].push_back(i);
487 auto gather_functor =
490 std::vector<T> & values)
494 const std::size_t ids_size = ids.size();
495 values.resize(ids_size);
497 for (std::size_t i=0; i != ids_size; i++)
503 values[i] = _values[requested_index - _first_local_index];
507 auto action_functor =
508 [& v_local, & local_requested_ids]
510 const std::vector<dof_id_type> &,
511 const std::vector<T> & values)
517 libmesh_assert_less(i, local_requested_ids[pid].size());
521 local_requested_ids[pid][i];
524 v_local[local_requested_index] = values[i];
528 const T * ex =
nullptr;
529 Parallel::pull_parallel_vector_data
530 (this->comm(), requested_ids, gather_functor, action_functor, ex);
535 template <
typename T>
538 const std::vector<numeric_index_type> & send_list)
541 libmesh_assert_equal_to (this->size(), this->local_size());
542 libmesh_assert_greater (last_local_idx, first_local_idx);
543 libmesh_assert_less_equal (send_list.size(), this->size());
544 libmesh_assert_less (last_local_idx, this->size());
550 if ((first_local_idx == 0) &&
551 (my_local_size == my_size))
559 parallel_vec.
init (my_size, my_local_size,
true,
PARALLEL);
563 parallel_vec.
_values[i-first_local_idx] = _values[i];
566 parallel_vec.
localize (*
this, send_list);
571 template <
typename T>
575 parallel_object_only();
578 libmesh_assert_equal_to (_values.size(), _local_size);
579 libmesh_assert_equal_to ((_last_local_index - _first_local_index), _local_size);
581 v_local = this->_values;
583 this->comm().allgather (v_local);
585 #ifndef LIBMESH_HAVE_MPI
586 libmesh_assert_equal_to (local_size(), size());
592 template <
typename T>
597 parallel_object_only();
600 libmesh_assert_equal_to (_values.size(), _local_size);
601 libmesh_assert_equal_to ((_last_local_index - _first_local_index), _local_size);
603 v_local = this->_values;
605 this->comm().gather (pid, v_local);
607 #ifndef LIBMESH_HAVE_MPI
608 libmesh_assert_equal_to (local_size(), size());
614 template <
typename T>
620 libmesh_not_implemented();