From: Timo Heister Date: Tue, 22 Feb 2011 23:47:14 +0000 (+0000) Subject: Fixed: PETScWrappers:MPI:SparseMatrix and apply_boundary_values() produced an error... X-Git-Tag: v8.0.0~4280 X-Git-Url: https://gitweb.dealii.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d9dbddb0724b642d93659d884059be9a32511e16;p=dealii.git Fixed: PETScWrappers:MPI:SparseMatrix and apply_boundary_values() produced an error in debug mode about non-existant SparsityPattern entries. Reason: clear_rows() also eliminated the whole row in the PETSc-internal SparsityPattern, which resulted in an error in the next assembly process. git-svn-id: https://svn.dealii.org/trunk@23422 0785d39b-7218-0410-832d-ea1e28bc413d --- diff --git a/deal.II/doc/news/changes.h b/deal.II/doc/news/changes.h index 69369ef287..74ece855af 100644 --- a/deal.II/doc/news/changes.h +++ b/deal.II/doc/news/changes.h @@ -84,6 +84,11 @@ should be fixed now.

Specific improvements

    +
  1. Fixed: PETScWrappers:MPI:SparseMatrix and apply_boundary_values() produced an error in debug mode about non-existant SparsityPattern entries. Reason: clear_rows() also eliminated the whole row in the PETSc-internal SparsityPattern, which resulted in an error in the next assembly process. +
    +(Timo Heister, 2011/02/23) +
  2. +
  3. Fixed: It wasn't possible to use the FE_Nothing element inside an FESystem object and hand the result over to an FEValues object. This is now fixed.
    diff --git a/deal.II/source/lac/petsc_parallel_sparse_matrix.cc b/deal.II/source/lac/petsc_parallel_sparse_matrix.cc index 5fa947c3c7..e5287a1698 100644 --- a/deal.II/source/lac/petsc_parallel_sparse_matrix.cc +++ b/deal.II/source/lac/petsc_parallel_sparse_matrix.cc @@ -530,9 +530,9 @@ namespace PETScWrappers // Tell PETSc that we are not // planning on adding new entries // to the matrix. Generate errors - // in debugmode. -#if DEAL_II_PETSC_VERSION_LT(3,0,0) + // in debug mode. int ierr; +#if DEAL_II_PETSC_VERSION_LT(3,0,0) #ifdef DEBUG ierr = MatSetOption (matrix, MAT_NEW_NONZERO_LOCATION_ERR); AssertThrow (ierr == 0, ExcPETScError(ierr)); @@ -541,7 +541,6 @@ namespace PETScWrappers AssertThrow (ierr == 0, ExcPETScError(ierr)); #endif #else - int ierr; #ifdef DEBUG ierr = MatSetOption (matrix, MAT_NEW_NONZERO_LOCATION_ERR, PETSC_TRUE); AssertThrow (ierr == 0, ExcPETScError(ierr)); @@ -550,6 +549,22 @@ namespace PETScWrappers AssertThrow (ierr == 0, ExcPETScError(ierr)); #endif #endif + + // Tell PETSc to keep the + // SparsityPattern entries even if + // we delete a row with + // clear_rows() which calls + // MatZeroRows(). Otherwise one can + // not write into that row + // afterwards. +#if DEAL_II_PETSC_VERSION_LT(3,1,0) + ierr = MatSetOption (matrix, MAT_KEEP_ZEROED_ROWS, PETSC_TRUE); + AssertThrow (ierr == 0, ExcPETScError(ierr)); +#else + ierr = MatSetOption (matrix, MAT_KEEP_NONZERO_PATTERN, PETSC_TRUE); + AssertThrow (ierr == 0, ExcPETScError(ierr)); +#endif + } }