16 #ifndef dealii__petsc_vector_base_h 17 #define dealii__petsc_vector_base_h 20 #include <deal.II/base/config.h> 22 #ifdef DEAL_II_WITH_PETSC 24 # include <deal.II/base/subscriptor.h> 25 # include <deal.II/lac/exceptions.h> 26 # include <deal.II/lac/vector.h> 31 # include <petscvec.h> 32 # include <deal.II/base/index_set.h> 34 DEAL_II_NAMESPACE_OPEN
37 template <
typename number>
class Vector;
88 VectorReference (
const VectorBase &vector,
89 const size_type index);
105 const VectorReference &operator = (
const VectorReference &r)
const;
112 VectorReference &operator = (
const VectorReference &r);
117 const VectorReference &operator = (
const PetscScalar &s)
const;
122 const VectorReference &operator += (
const PetscScalar &s)
const;
127 const VectorReference &operator -= (
const PetscScalar &s)
const;
132 const VectorReference &operator *= (
const PetscScalar &s)
const;
137 const VectorReference &operator /= (
const PetscScalar &s)
const;
142 PetscReal real ()
const;
150 PetscReal imag ()
const;
156 operator PetscScalar ()
const;
163 <<
"An error with error number " << arg1
164 <<
" occurred while calling a PETSc function");
170 <<
"You tried to access element " << arg1
171 <<
" of a distributed vector, but only elements " 172 << arg2 <<
" through " << arg3
173 <<
" are stored locally and can be accessed.");
179 <<
"You tried to do a " 184 <<
" operation but the vector is currently in " 189 <<
" mode. You first have to call 'compress()'.");
195 const VectorBase &vector;
200 const size_type index;
206 friend class ::PETScWrappers::VectorBase;
247 typedef PetscReal real_type;
249 typedef internal::VectorReference reference;
250 typedef const internal::VectorReference const_reference;
280 virtual void clear ();
292 void compress (
const VectorOperation::values operation);
326 size_type size ()
const;
336 size_type local_size ()
const;
346 std::pair<size_type, size_type>
347 local_range ()
const;
353 bool in_local_range (
const size_type index)
const;
368 IndexSet locally_owned_elements ()
const;
376 bool has_ghost_elements()
const;
382 operator () (
const size_type index);
388 operator () (
const size_type index)
const;
396 operator [] (
const size_type index);
404 operator [] (
const size_type index)
const;
412 void set (
const std::vector<size_type> &indices,
413 const std::vector<PetscScalar> &values);
421 void extract_subvector_to (
const std::vector<size_type> &indices,
422 std::vector<PetscScalar> &values)
const;
428 template <
typename ForwardIterator,
typename OutputIterator>
429 void extract_subvector_to (
const ForwardIterator indices_begin,
430 const ForwardIterator indices_end,
431 OutputIterator values_begin)
const;
437 void add (
const std::vector<size_type> &indices,
438 const std::vector<PetscScalar> &values);
444 void add (
const std::vector<size_type> &indices,
445 const ::Vector<PetscScalar> &values);
452 void add (
const size_type n_elements,
453 const size_type *indices,
454 const PetscScalar *values);
462 PetscScalar operator * (
const VectorBase &vec)
const;
467 real_type norm_sqr ()
const;
472 PetscScalar mean_value ()
const;
477 real_type l1_norm ()
const;
483 real_type l2_norm ()
const;
489 real_type lp_norm (
const real_type p)
const;
495 real_type linfty_norm ()
const;
512 PetscScalar add_and_dot (
const PetscScalar a,
527 real_type min () const;
532 real_type max () const;
579 bool all_zero () const;
586 bool is_non_negative () const;
591 VectorBase &operator *= (const PetscScalar factor);
596 VectorBase &operator /= (const PetscScalar factor);
612 void add (const PetscScalar s);
619 void add (const
VectorBase &V) DEAL_II_DEPRECATED;
624 void add (const PetscScalar a, const
VectorBase &V);
629 void add (const PetscScalar a, const
VectorBase &V,
635 void sadd (const PetscScalar s,
641 void sadd (const PetscScalar s,
650 void sadd (const PetscScalar s,
662 void sadd (const PetscScalar s,
675 void scale (const
VectorBase &scaling_factors);
680 void equ (const PetscScalar a, const
VectorBase &V);
687 void equ (const PetscScalar a, const
VectorBase &V,
688 const PetscScalar b, const
VectorBase &W) DEAL_II_DEPRECATED;
710 void write_ascii (const PetscViewerFormat format = PETSC_VIEWER_DEFAULT) ;
719 void print (
std::ostream &out,
720 const
unsigned int precision = 3,
721 const
bool scientific = true,
722 const
bool across = true) const;
745 operator const Vec &() const;
750 std::
size_t memory_consumption () const;
756 virtual const MPI_Comm &get_mpi_communicator () const;
796 bool attained_ownership;
803 void do_set_add_operation (const size_type n_elements,
804 const size_type *indices,
805 const PetscScalar *values,
806 const
bool add_values);
833 VectorReference::VectorReference (
const VectorBase &vector,
834 const size_type index)
842 const VectorReference &
843 VectorReference::operator = (
const VectorReference &r)
const 849 *
this =
static_cast<PetscScalar
> (r);
858 VectorReference::operator = (
const VectorReference &r)
864 *
this =
static_cast<PetscScalar
> (r);
872 const VectorReference &
873 VectorReference::operator = (
const PetscScalar &value)
const 878 ExcWrongMode (VectorOperation::insert,
883 const PetscInt petsc_i = index;
886 = VecSetValues (vector, 1, &petsc_i, &value, INSERT_VALUES);
897 const VectorReference &
898 VectorReference::operator += (
const PetscScalar &value)
const 903 ExcWrongMode (VectorOperation::add,
917 if (value == PetscScalar())
921 const PetscInt petsc_i = index;
923 = VecSetValues (vector, 1, &petsc_i, &value, ADD_VALUES);
933 const VectorReference &
934 VectorReference::operator -= (
const PetscScalar &value)
const 939 ExcWrongMode (VectorOperation::add,
953 if (value == PetscScalar())
958 const PetscInt petsc_i = index;
959 const PetscScalar subtractand = -value;
961 = VecSetValues (vector, 1, &petsc_i, &subtractand, ADD_VALUES);
970 const VectorReference &
971 VectorReference::operator *= (
const PetscScalar &value)
const 976 ExcWrongMode (VectorOperation::insert,
993 const PetscInt petsc_i = index;
994 const PetscScalar new_value
995 =
static_cast<PetscScalar
>(*this) * value;
998 = VecSetValues (vector, 1, &petsc_i, &new_value, INSERT_VALUES);
1007 const VectorReference &
1008 VectorReference::operator /= (
const PetscScalar &value)
const 1013 ExcWrongMode (VectorOperation::insert,
1030 const PetscInt petsc_i = index;
1031 const PetscScalar new_value
1032 =
static_cast<PetscScalar
>(*this) / value;
1035 = VecSetValues (vector, 1, &petsc_i, &new_value, INSERT_VALUES);
1045 VectorReference::real ()
const 1047 #ifndef PETSC_USE_COMPLEX 1048 return static_cast<PetscScalar
>(*this);
1050 return PetscRealPart (static_cast<PetscScalar>(*
this));
1058 VectorReference::imag ()
const 1060 #ifndef PETSC_USE_COMPLEX 1061 return PetscReal (0);
1063 return PetscImaginaryPart (static_cast<PetscScalar>(*
this));
1073 PetscInt begin, end;
1074 const int ierr = VecGetOwnershipRange (static_cast<const Vec &>(vector),
1078 return ((index >= static_cast<size_type>(begin)) &&
1079 (index < static_cast<size_type>(end)));
1090 const std::pair<size_type, size_type> x = local_range();
1107 internal::VectorReference
1110 return internal::VectorReference (*
this, index);
1119 return static_cast<PetscScalar
>(internal::VectorReference (*
this, index));
1125 internal::VectorReference
1128 return operator()(index);
1137 return operator()(index);
1144 static MPI_Comm comm;
1145 PetscObjectGetComm((PetscObject)vector, &comm);
1151 std::vector<PetscScalar> &values)
const 1153 extract_subvector_to(&(indices[0]), &(indices[0]) + indices.size(), &(values[0]));
1156 template <
typename ForwardIterator,
typename OutputIterator>
1159 const ForwardIterator indices_end,
1160 OutputIterator values_begin)
const 1162 const PetscInt n_idx =
static_cast<PetscInt
>(indices_end - indices_begin);
1190 PetscInt begin, end;
1191 ierr = VecGetOwnershipRange (vector, &begin, &end);
1194 Vec locally_stored_elements = PETSC_NULL;
1195 ierr = VecGhostGetLocalForm(vector, &locally_stored_elements);
1199 ierr = VecGetSize(locally_stored_elements, &lsize);
1203 ierr = VecGetArray(locally_stored_elements, &ptr);
1206 for (PetscInt i=0; i<n_idx; ++i)
1208 const unsigned int index = *(indices_begin+i);
1209 if ( index>=static_cast<unsigned int>(begin)
1210 && index<static_cast<unsigned int>(end) )
1213 *(values_begin+i) = *(ptr+index-begin);
1218 const unsigned int ghostidx
1219 = ghost_indices.index_within_set(index);
1221 Assert(ghostidx+end-begin<(
unsigned int)lsize, ExcInternalError());
1222 *(values_begin+i) = *(ptr+ghostidx+end-begin);
1226 ierr = VecRestoreArray(locally_stored_elements, &ptr);
1229 ierr = VecGhostRestoreLocalForm(vector, &locally_stored_elements);
1240 PetscInt begin, end;
1241 ierr = VecGetOwnershipRange (vector, &begin, &end);
1245 ierr = VecGetArray(vector, &ptr);
1248 for (PetscInt i=0; i<n_idx; ++i)
1250 const unsigned int index = *(indices_begin+i);
1252 Assert(index>=static_cast<unsigned int>(begin)
1253 && index<static_cast<unsigned int>(end), ExcInternalError());
1255 *(values_begin+i) = *(ptr+index-begin);
1258 ierr = VecRestoreArray(vector, &ptr);
1267 DEAL_II_NAMESPACE_CLOSE
1269 #endif // DEAL_II_WITH_PETSC reference operator[](const size_type index)
types::global_dof_index size_type
#define DeclException2(Exception2, type1, type2, outsequence)
#define AssertThrow(cond, exc)
bool in_local_range(const size_type index) const
BlockDynamicSparsityPattern BlockCompressedSparsityPattern DEAL_II_DEPRECATED
#define DeclException1(Exception1, type1, outsequence)
unsigned int global_dof_index
VectorOperation::values last_action
#define Assert(cond, exc)
void add_range(const size_type begin, const size_type end)
bool has_ghost_elements() const
reference operator()(const size_type index)
IndexSet locally_owned_elements() const
#define DeclException3(Exception3, type1, type2, type3, outsequence)
void extract_subvector_to(const std::vector< size_type > &indices, std::vector< PetscScalar > &values) const
virtual const MPI_Comm & get_mpi_communicator() const