From 2dc92ec00f1651ee073d5ce086a195a8ebc0ce50 Mon Sep 17 00:00:00 2001 From: wolf Date: Mon, 12 Apr 2004 16:29:07 +0000 Subject: [PATCH] Don't access non-local rows of a matrix. git-svn-id: https://svn.dealii.org/trunk@8989 0785d39b-7218-0410-832d-ea1e28bc413d --- deal.II/lac/include/lac/petsc_matrix_base.h | 16 ++++++++ deal.II/lac/source/petsc_matrix_base.cc | 41 +++++++++++++++++++-- 2 files changed, 53 insertions(+), 4 deletions(-) diff --git a/deal.II/lac/include/lac/petsc_matrix_base.h b/deal.II/lac/include/lac/petsc_matrix_base.h index 558d2bab2a..2503272619 100644 --- a/deal.II/lac/include/lac/petsc_matrix_base.h +++ b/deal.II/lac/include/lac/petsc_matrix_base.h @@ -95,6 +95,22 @@ namespace PETScWrappers * Exception */ DeclException0 (ExcBeyondEndOfMatrix); + /** + * Exception + */ + DeclException1 (ExcPETScError, + int, + << "An error with error number " << arg1 + << " occured while calling a PETSc function"); + /** + * Exception + */ + DeclException3 (ExcAccessToNonlocalRow, + int, int, int, + << "You tried to access row " << arg1 + << " of a distributed matrix, but only rows " + << arg2 << " through " << arg3 + << " are stored locally and can be accessed."); private: /** diff --git a/deal.II/lac/source/petsc_matrix_base.cc b/deal.II/lac/source/petsc_matrix_base.cc index 8251719562..4819b82aa9 100644 --- a/deal.II/lac/source/petsc_matrix_base.cc +++ b/deal.II/lac/source/petsc_matrix_base.cc @@ -13,6 +13,8 @@ #include +#include +#include #include #ifdef DEAL_II_USE_PETSC @@ -40,8 +42,39 @@ namespace PETScWrappers // otherwise first flush PETSc caches matrix->compress (); - - const signed int a_row_int = this->a_row; + + // next get the number of the row + // relative to the rows this process + // actually stores (remember that + // matrices can be distributed) + signed int local_row; + if (dynamic_cast(matrix) != 0) + { + local_row = this->a_row; + } + else if (dynamic_cast(matrix) + != 0) + { + // first verify that the requested + // element is actually locally + // available + int ierr; + int begin, end; + ierr = MatGetOwnershipRange (static_cast(*matrix), + &begin, &end); + AssertThrow (ierr == 0, ExcPETScError(ierr)); + + AssertThrow ((this->a_row >= static_cast(begin)) && + (this->a_row < static_cast(end)), + ExcAccessToNonlocalRow (this->a_row, begin, end-1)); + + // alright, so we seem to have this + // particular row on the present + // processor + local_row = this->a_row - begin; + } + else + Assert (false, ExcInternalError()); // get a representation of the present // row @@ -50,7 +83,7 @@ namespace PETScWrappers PetscScalar *values; int ierr; - ierr = MatGetRow(*matrix, a_row_int, &ncols, &colnums, &values); + ierr = MatGetRow(*matrix, local_row, &ncols, &colnums, &values); AssertThrow (ierr == 0, MatrixBase::ExcPETScError(ierr)); // copy it into our caches @@ -59,7 +92,7 @@ namespace PETScWrappers value_cache.reset (new std::vector (values, values+ncols)); // and finally restore the matrix - ierr = MatRestoreRow(*matrix, a_row_int, &ncols, &colnums, &values); + ierr = MatRestoreRow(*matrix, local_row, &ncols, &colnums, &values); AssertThrow (ierr == 0, MatrixBase::ExcPETScError(ierr)); } } -- 2.39.5