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();