13#ifndef dealii_psblas_vector_h
14#define dealii_psblas_vector_h
28#ifdef DEAL_II_WITH_PSBLAS
36#ifdef DEAL_II_WITH_PSBLAS
37namespace PSCToolkitWrappers
69 class Vector :
public ReadVector<double>
85 VectorReference(Vector &vector,
const size_type index)
94 const VectorReference &
99 vector.owned_elements.is_element(index),
101 "You are trying to write to an element of the vector that is not "
102 "locally owned. This is not allowed for the current interface to"
103 " PSBLAS vectors."));
110 std::vector<size_type> idx{
index};
111 std::vector<value_type>
value{s};
112 vector.set(idx,
value);
120 const VectorReference &
134 std::vector<size_type> idx{
index};
135 std::vector<value_type>
value{s};
136 vector.add(idx,
value);
143 const VectorReference &
157 std::vector<size_type> idx{
index};
158 std::vector<value_type>
value{-s};
159 vector.add(idx,
value);
166 const VectorReference &
178 std::vector<size_type> idx{
index};
180 std::vector<value_type>
value{new_value};
181 vector.set(idx,
value);
189 const VectorReference &
197 std::vector<size_type> idx{
index};
199 std::vector<value_type>
value{new_value};
200 vector.set(idx,
value);
214 AssertThrow(vector.ghost_indices.is_element(index) ||
215 vector.owned_elements.is_element(index),
217 "You are trying to access an element of a vector "
218 "that is neither a locally owned element nor a "
219 "ghost element of the vector."));
224 vector.owned_elements.is_element(index),
225 ExcAccessToNonlocalElement(index,
226 *vector.owned_elements.begin(),
227 (*vector.owned_elements.begin() +
228 vector.locally_owned_size())));
230 return psb_c_dgetelem(vector.psblas_vector,
232 vector.psblas_descriptor.get());
263 explicit Vector(
const IndexSet &local_partitioning,
264 const MPI_Comm communicator);
275 Vector(
const IndexSet &local_partitioning,
276 const IndexSet &ghost_indices,
277 const MPI_Comm communicator);
293 reinit(
const IndexSet &local_partitioning,
294 const MPI_Comm communicator,
295 const bool omit_zeroing_entries =
false);
307 reinit(
const Vector &v,
const bool omit_zeroing_entries =
false);
321 reinit(
const IndexSet &local_partitioning,
322 const IndexSet &ghost_indices,
323 const MPI_Comm communicator);
353 operator=(
const Vector &v);
360 size()
const override;
366 extract_subvector_to(
367 const ArrayView<const types::global_dof_index> &indices,
368 const ArrayView<value_type> &elements)
const override;
386 extract_subvector_to(
const std::vector<size_type> &indices,
387 std::vector<value_type> &values)
const;
416 template <
typename ForwardIterator,
typename OutputIterator>
418 extract_subvector_to(ForwardIterator indices_begin,
419 ForwardIterator indices_end,
420 OutputIterator values_begin)
const;
432 locally_owned_size()
const;
441 set(
const std::vector<size_type> &indices,
442 const std::vector<value_type> &values);
449 add(
const std::vector<size_type> &indices,
450 const std::vector<value_type> &values);
470 scale(
const Vector &v);
482 add_and_dot(
const value_type a,
const Vector &v,
const Vector &W);
518 operator[](
const size_type index)
const;
524 operator[](
const size_type index);
536 operator-=(
const Vector &v);
542 operator+=(
const Vector &v);
573 locally_owned_elements()
const;
579 ghost_elements()
const;
588 has_ghost_elements()
const;
594 update_ghost_values()
const;
646 get_mpi_communicator()
const;
653 get_psblas_descriptor()
const;
660 get_psblas_vector()
const;
713 psb_c_dvector *psblas_vector;
718 psb_c_ctxt *psblas_context;
723 std::shared_ptr<psb_c_descriptor> psblas_descriptor;
728 MPI_Comm communicator;
733 IndexSet owned_elements;
738 IndexSet ghost_indices;
751 internal::State state;
766 inline PSCToolkitWrappers::Vector::value_type *
767 PSCToolkitWrappers::Vector::begin()
769 return psb_c_dvect_f_get_pnt(psblas_vector);
774 inline const PSCToolkitWrappers::Vector::value_type *
775 PSCToolkitWrappers::Vector::begin()
const
777 return psb_c_dvect_f_get_pnt(psblas_vector);
782 inline PSCToolkitWrappers::Vector::value_type *
783 PSCToolkitWrappers::Vector::end()
785 return psb_c_dvect_f_get_pnt(psblas_vector) + locally_owned_size();
790 inline const PSCToolkitWrappers::Vector::value_type *
791 PSCToolkitWrappers::Vector::end()
const
793 return psb_c_dvect_f_get_pnt(psblas_vector) + locally_owned_size();
801 return owned_elements.size();
806 inline const IndexSet &
809 return owned_elements;
814 inline const IndexSet &
815 Vector::ghost_elements()
const
817 return ghost_indices;
833 return psb_c_dgetelem(psblas_vector, index, psblas_descriptor.get());
838 inline Vector::VectorReference
841 return VectorReference(*
this, index);
854 inline Vector::VectorReference
864 const ArrayView<const types::global_dof_index> &indices,
865 const ArrayView<double> &elements)
const
868 extract_subvector_to(indices.
begin(), indices.
end(), elements.
begin());
875 std::vector<Vector::value_type> &values)
const
878 extract_subvector_to(indices.begin(), indices.end(),
values.begin());
883 template <
typename ForwardIterator,
typename OutputIterator>
886 ForwardIterator indices_end,
887 OutputIterator output)
const
889 if (indices_begin == indices_end)
897 auto input = indices_begin;
898 while (input != indices_end)
900 const auto index =
static_cast<psb_l_t
>(*input);
902 ghost_indices.is_element(index),
904 "You are trying to access an element of a vector "
905 "that is neither a locally owned element nor a "
906 "ghost element of the vector."));
908 psb_c_dgetelem(psblas_vector, index, psblas_descriptor.get());
920 while (indices_begin != indices_end)
923 Assert(owned_elements.is_element(index),
924 ExcMessage(
"You are accessing elements of a vector without "
925 "ghost elements that are not actually owned by "
926 "this vector. A typical case where this may "
927 "happen is if you are passing a non-ghosted "
928 "(completely distributed) vector to a function "
929 "that expects a vector that stores ghost "
930 "elements for all locally relevant or locally "
931 "active vector entries."));
934 psb_c_dgetelem(psblas_vector, index, psblas_descriptor.get());
* x_component_mask set(0, true)
* * reference operator*() const
* * Point< dim > operator()(const Point< dim > &p) const *
bool has_ghost_elements() const
types::global_dof_index size_type
Number operator[](const size_type i) const
virtual size_type size() const override
IndexSet locally_owned_elements() const
Number operator()(const size_type i) const
void extract_subvector_to(const std::vector< size_type > &indices, std::vector< OtherNumber > &values) const
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
static ::ExceptionBase & ExcGhostsPresent()
#define Assert(cond, exc)
#define AssertDimension(dim1, dim2)
#define AssertIndexRange(index, range)
static ::ExceptionBase & ExcMessage(std::string arg1)
#define AssertThrow(cond, exc)
const bool IsBlockVector< VectorType >::value
std::vector< value_type > l2_norm(const typename ::Triangulation< dim, spacedim >::cell_iterator &parent, const value_type parent_value)
types::global_dof_index size_type
SparseMatrix< double > SparseMatrix
std::enable_if_t< std::is_fundamental_v< T >, std::size_t > memory_consumption(const T &t)
std::string compress(const std::string &input)
void reinit(MatrixBlock< MatrixType > &v, const BlockSparsityPattern &p)
unsigned int global_dof_index
void swap(ObserverPointer< T, P > &t1, ObserverPointer< T, Q > &t2)
Number linfty_norm(const Tensor< 2, dim, Number > &t)
Number l1_norm(const Tensor< 2, dim, Number > &t)