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
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());
295 const bool omit_zeroing_entries =
false);
307 reinit(
const Vector &v,
const bool omit_zeroing_entries =
false);
353 operator=(
const Vector &v);
360 size()
const override;
366 extract_subvector_to(
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;
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);
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;
751 internal::State state;
763 bool remote_entries_pending;
774 inline PSCToolkitWrappers::Vector::value_type *
775 PSCToolkitWrappers::Vector::begin()
777 return psb_c_dvect_f_get_pnt(psblas_vector);
782 inline const PSCToolkitWrappers::Vector::value_type *
783 PSCToolkitWrappers::Vector::begin()
const
785 return psb_c_dvect_f_get_pnt(psblas_vector);
790 inline PSCToolkitWrappers::Vector::value_type *
791 PSCToolkitWrappers::Vector::end()
798 inline const PSCToolkitWrappers::Vector::value_type *
799 PSCToolkitWrappers::Vector::end()
const
809 return owned_elements.size();
817 return owned_elements;
823 Vector::ghost_elements()
const
825 return ghost_indices;
841 return psb_c_dgetelem(psblas_vector, index, psblas_descriptor.get());
846 inline Vector::VectorReference
849 return VectorReference(*
this, index);
862 inline Vector::VectorReference
876 extract_subvector_to(indices.
begin(), indices.
end(), elements.
begin());
883 std::vector<Vector::value_type> &values)
const
886 extract_subvector_to(indices.begin(), indices.end(),
values.begin());
891 template <
typename ForwardIterator,
typename OutputIterator>
894 ForwardIterator indices_end,
895 OutputIterator output)
const
897 if (indices_begin == indices_end)
905 auto input = indices_begin;
906 while (input != indices_end)
908 const auto index =
static_cast<psb_l_t
>(*input);
910 ghost_indices.is_element(index),
912 "You are trying to access an element of a vector "
913 "that is neither a locally owned element nor a "
914 "ghost element of the vector."));
916 psb_c_dgetelem(psblas_vector, index, psblas_descriptor.get());
928 while (indices_begin != indices_end)
931 Assert(owned_elements.is_element(index),
932 ExcMessage(
"You are accessing elements of a vector without "
933 "ghost elements that are not actually owned by "
934 "this vector. A typical case where this may "
935 "happen is if you are passing a non-ghosted "
936 "(completely distributed) vector to a function "
937 "that expects a vector that stores ghost "
938 "elements for all locally relevant or locally "
939 "active vector entries."));
942 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
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)
types::global_dof_index locally_owned_size
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
PETScWrappers::PreconditionBoomerAMG PreconditionAMG
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)