From dfde6ffd585fb6503e3d771df8c0f2a3cea12c0b Mon Sep 17 00:00:00 2001 From: young Date: Tue, 21 Aug 2012 09:38:15 +0000 Subject: [PATCH] Revert patch 25771 - norms are required by tests/petsc/full_matrix_0{5,6}. git-svn-id: https://svn.dealii.org/trunk@26045 0785d39b-7218-0410-832d-ea1e28bc413d --- .../include/deal.II/lac/petsc_matrix_base.h | 66 +++++++++++++++++++ deal.II/source/lac/petsc_matrix_base.cc | 18 +++++ 2 files changed, 84 insertions(+) diff --git a/deal.II/include/deal.II/lac/petsc_matrix_base.h b/deal.II/include/deal.II/lac/petsc_matrix_base.h index f9b426ee96..03d6f676ba 100644 --- a/deal.II/include/deal.II/lac/petsc_matrix_base.h +++ b/deal.II/include/deal.II/lac/petsc_matrix_base.h @@ -838,6 +838,72 @@ namespace PETScWrappers */ PetscReal frobenius_norm () const; + + /** + * Return the square of the norm + * of the vector $v$ with respect + * to the norm induced by this + * matrix, + * i.e. $\left(v,Mv\right)$. This + * is useful, e.g. in the finite + * element context, where the + * $L_2$ norm of a function + * equals the matrix norm with + * respect to the mass matrix of + * the vector representing the + * nodal values of the finite + * element function. + * + * Obviously, the matrix needs to + * be quadratic for this operation. + * + * The implementation of this function + * is not as efficient as the one in + * the @p MatrixBase class used in + * deal.II (i.e. the original one, not + * the PETSc wrapper class) since PETSc + * doesn't support this operation and + * needs a temporary vector. + * + * Note that if the current object + * represents a parallel distributed + * matrix (of type + * PETScWrappers::MPI::SparseMatrix), + * then the given vector has to be + * a distributed vector as + * well. Conversely, if the matrix is + * not distributed, then neither + * may the vector be. + */ + PetscScalar matrix_norm_square (const VectorBase &v) const; + + + /** + * Compute the matrix scalar + * product $\left(u,Mv\right)$. + * + * The implementation of this function + * is not as efficient as the one in + * the @p MatrixBase class used in + * deal.II (i.e. the original one, not + * the PETSc wrapper class) since PETSc + * doesn't support this operation and + * needs a temporary vector. + * + * Note that if the current object + * represents a parallel distributed + * matrix (of type + * PETScWrappers::MPI::SparseMatrix), + * then both vectors have to be + * distributed vectors as + * well. Conversely, if the matrix is + * not distributed, then neither of the + * vectors may be. + */ + PetscScalar matrix_scalar_product (const VectorBase &u, + const VectorBase &v) const; + + #if DEAL_II_PETSC_VERSION_GTE(3,1,0) /** * Return the trace of the diff --git a/deal.II/source/lac/petsc_matrix_base.cc b/deal.II/source/lac/petsc_matrix_base.cc index 271c4f90b9..1a04913d70 100644 --- a/deal.II/source/lac/petsc_matrix_base.cc +++ b/deal.II/source/lac/petsc_matrix_base.cc @@ -420,6 +420,24 @@ namespace PETScWrappers } + PetscScalar + MatrixBase::matrix_norm_square (const VectorBase &v) const + { + Vector tmp(v.size()); + vmult (tmp, v); + return tmp*v; + } + + + PetscScalar + MatrixBase::matrix_scalar_product (const VectorBase &u, + const VectorBase &v) const + { + Vector tmp(v.size()); + vmult (tmp, v); + return u*tmp; + } + #if DEAL_II_PETSC_VERSION_GTE(3,1,0) PetscReal -- 2.39.5