From 44e526df5fe37c0b9f2abaa7f67af25817ba030a Mon Sep 17 00:00:00 2001 From: young Date: Fri, 15 Oct 2010 08:34:56 +0000 Subject: [PATCH] Two PETSc functions. (i) A variation of mult () piecwise multiplication of two vectors, and (ii) a new function trace () computes the trace of a matrix. git-svn-id: https://svn.dealii.org/trunk@22347 0785d39b-7218-0410-832d-ea1e28bc413d --- deal.II/lac/include/lac/petsc_matrix_base.h | 10 ++++++++++ deal.II/lac/include/lac/petsc_vector_base.h | 7 +++++++ deal.II/lac/source/petsc_matrix_base.cc | 16 ++++++++++++++++ deal.II/lac/source/petsc_vector_base.cc | 9 +++++++++ 4 files changed, 42 insertions(+) diff --git a/deal.II/lac/include/lac/petsc_matrix_base.h b/deal.II/lac/include/lac/petsc_matrix_base.h index 8de24c42cc..6d5677afa1 100644 --- a/deal.II/lac/include/lac/petsc_matrix_base.h +++ b/deal.II/lac/include/lac/petsc_matrix_base.h @@ -837,6 +837,16 @@ namespace PETScWrappers */ PetscReal frobenius_norm () const; +#if DEAL_II_PETSC_VERSION_GTE(3,1,0) + /** + * Return the trace of the + * matrix, i.e. the sum of all + * diagonal entries in the + * matrix. + */ + PetscReal trace () const; +#endif + /** * Multiply the entire matrix by a * fixed factor. diff --git a/deal.II/lac/include/lac/petsc_vector_base.h b/deal.II/lac/include/lac/petsc_vector_base.h index c74409c916..0b93a15330 100644 --- a/deal.II/lac/include/lac/petsc_vector_base.h +++ b/deal.II/lac/include/lac/petsc_vector_base.h @@ -509,6 +509,13 @@ namespace PETScWrappers */ VectorBase & mult (); + /** + * A collective piecewise + * multiply operation of two + * vectors. + */ + VectorBase & mult (const VectorBase &v); + /** * Return whether the vector contains * only elements with value zero. This diff --git a/deal.II/lac/source/petsc_matrix_base.cc b/deal.II/lac/source/petsc_matrix_base.cc index a58b7a5fe9..62ceb30887 100644 --- a/deal.II/lac/source/petsc_matrix_base.cc +++ b/deal.II/lac/source/petsc_matrix_base.cc @@ -415,6 +415,22 @@ namespace PETScWrappers +#if DEAL_II_PETSC_VERSION_GTE(3,1,0) + PetscReal + MatrixBase::trace () const + { + PetscReal result; + + const int ierr + = MatGetTrace (matrix, &result); + AssertThrow (ierr == 0, ExcPETScError(ierr)); + + return result; + } +#endif + + + MatrixBase & MatrixBase::operator *= (const PetscScalar a) { diff --git a/deal.II/lac/source/petsc_vector_base.cc b/deal.II/lac/source/petsc_vector_base.cc index c958951b51..336483ccbd 100644 --- a/deal.II/lac/source/petsc_vector_base.cc +++ b/deal.II/lac/source/petsc_vector_base.cc @@ -592,6 +592,15 @@ namespace PETScWrappers return *this; } + VectorBase & + VectorBase::mult (const VectorBase &v) + { + const int ierr = VecPointwiseMult (vector,vector,v); + AssertThrow (ierr == 0, ExcPETScError(ierr)); + + return *this; + } + bool -- 2.39.5