]> https://gitweb.dealii.org/ - dealii.git/commitdiff
Consistently check PETSc/SLEPc error codes. 3576/head
authorDavid Wells <wellsd2@rpi.edu>
Thu, 17 Nov 2016 00:42:36 +0000 (19:42 -0500)
committerDavid Wells <wellsd2@rpi.edu>
Thu, 17 Nov 2016 15:35:04 +0000 (10:35 -0500)
source/base/mpi.cc
source/lac/petsc_matrix_base.cc
source/lac/petsc_parallel_sparse_matrix.cc
source/lac/petsc_precondition.cc
source/lac/petsc_solver.cc
source/lac/petsc_sparse_matrix.cc
source/lac/petsc_vector_base.cc

index 6ddcd0d52bd1dab8d7ec522ef0b2a2a89c7d3b3b..b1c770a8a876e9ef2563d7146bc61fd497530d3e 100644 (file)
@@ -48,6 +48,7 @@
 #  ifdef DEAL_II_WITH_MPI
 #    include <slepcsys.h>
 #  endif
+#  include <deal.II/lac/slepc_solver.h>
 #endif
 
 #ifdef DEAL_II_WITH_P4EST
@@ -357,10 +358,12 @@ namespace Utilities
 #ifdef DEAL_II_WITH_PETSC
 #  ifdef DEAL_II_WITH_SLEPC
       // Initialize SLEPc (with PETSc):
-      SlepcInitialize(&argc, &argv, PETSC_NULL, PETSC_NULL);
+      ierr = SlepcInitialize(&argc, &argv, PETSC_NULL, PETSC_NULL);
+      AssertThrow (ierr == 0, SLEPcWrappers::SolverBase::ExcSLEPcError(ierr));
 #  else
       // or just initialize PETSc alone:
-      PetscInitialize(&argc, &argv, PETSC_NULL, PETSC_NULL);
+      ierr = PetscInitialize(&argc, &argv, PETSC_NULL, PETSC_NULL);
+      AssertThrow (ierr == 0, ExcPETScError(ierr));
 #  endif
 #endif
 
index a94467b6c652d086f9292a917f61d5c08a8281c6..38612fb576aaed2cb9eb1a969b846014eed0a5f1 100644 (file)
@@ -561,11 +561,13 @@ namespace PETScWrappers
     assert_is_compressed ();
 
     // Set options
-    PetscViewerSetFormat (PETSC_VIEWER_STDOUT_WORLD,
-                          format);
+    int ierr = PetscViewerSetFormat (PETSC_VIEWER_STDOUT_WORLD,
+                                     format);
+    AssertThrow (ierr == 0, ExcPETScError(ierr));
 
     // Write to screen
-    MatView (matrix, PETSC_VIEWER_STDOUT_WORLD);
+    ierr = MatView (matrix, PETSC_VIEWER_STDOUT_WORLD);
+    AssertThrow (ierr == 0, ExcPETScError(ierr));
   }
 
   void
@@ -603,7 +605,8 @@ namespace PETScWrappers
   MatrixBase::memory_consumption() const
   {
     MatInfo info;
-    MatGetInfo(matrix, MAT_LOCAL, &info);
+    const int ierr = MatGetInfo(matrix, MAT_LOCAL, &info);
+    AssertThrow (ierr == 0, ExcPETScError(ierr));
 
     return sizeof(*this) + static_cast<size_type>(info.memory);
   }
index 9489b8b5d61a41767dc65b159f37a0cbaf9d2196..0444cb1e75d75d14d254346a4d80316a4810f907 100644 (file)
@@ -660,10 +660,11 @@ namespace PETScWrappers
             for (size_type i=local_row_start; i<local_row_end; ++i)
               {
                 PetscInt petsc_i = i;
-                MatSetValues (matrix, 1, &petsc_i,
-                              sparsity_pattern.row_length(i),
-                              &colnums_in_window[rowstart_in_window[i-local_row_start]],
-                              &values[0], INSERT_VALUES);
+                ierr = MatSetValues (matrix, 1, &petsc_i,
+                                     sparsity_pattern.row_length(i),
+                                     &colnums_in_window[rowstart_in_window[i-local_row_start]],
+                                     &values[0], INSERT_VALUES);
+                AssertThrow (ierr == 0, ExcPETScError(ierr));
               }
           }
 
index 3f9d104c14564a06724b60ce3a53cb600169805f..b54b1fd68a6cd0cc96fdf4e50bf2ea26a86e3aa2 100644 (file)
@@ -393,12 +393,11 @@ namespace PETScWrappers
 
     create_pc();
 
-    int ierr;
-    ierr = PCSetType (pc, const_cast<char *>(PCICC));
+    int ierr = PCSetType (pc, const_cast<char *>(PCICC));
     AssertThrow (ierr == 0, ExcPETScError(ierr));
 
     // then set flags
-    PCFactorSetLevels (pc, additional_data.levels);
+    ierr = PCFactorSetLevels (pc, additional_data.levels);
     AssertThrow (ierr == 0, ExcPETScError(ierr));
 
     ierr = PCSetFromOptions (pc);
@@ -445,7 +444,7 @@ namespace PETScWrappers
     AssertThrow (ierr == 0, ExcPETScError(ierr));
 
     // then set flags
-    PCFactorSetLevels (pc, additional_data.levels);
+    ierr = PCFactorSetLevels (pc, additional_data.levels);
     AssertThrow (ierr == 0, ExcPETScError(ierr));
 
     ierr = PCSetFromOptions (pc);
index a6107b6b84980d82faf3d83f22d4b905f3fa0a6c..4c1457664327c871a26264c8996a247241d8365e 100644 (file)
@@ -110,9 +110,10 @@ namespace PETScWrappers
         // checks with the solver_control
         // object we have in this object for
         // convergence
-        KSPSetConvergenceTest (solver_data->ksp, &convergence_test,
-                               reinterpret_cast<void *>(&solver_control),
-                               PETSC_NULL);
+        ierr = KSPSetConvergenceTest (solver_data->ksp, &convergence_test,
+                                      reinterpret_cast<void *>(&solver_control),
+                                      PETSC_NULL);
+        AssertThrow (ierr == 0, ExcPETScError(ierr));
       }
 
     // set the command line option prefix name
@@ -227,9 +228,10 @@ namespace PETScWrappers
     // checks with the solver_control
     // object we have in this object for
     // convergence
-    KSPSetConvergenceTest (solver_data->ksp, &convergence_test,
-                           reinterpret_cast<void *>(&solver_control),
-                           PETSC_NULL);
+    ierr = KSPSetConvergenceTest (solver_data->ksp, &convergence_test,
+                                  reinterpret_cast<void *>(&solver_control),
+                                  PETSC_NULL);
+    AssertThrow (ierr == 0, ExcPETScError(ierr));
 
     // set the command line options provided
     // by the user to override the defaults
@@ -272,7 +274,8 @@ namespace PETScWrappers
     // in the deal.II solvers, we always
     // honor the initial guess in the
     // solution vector. do so here as well:
-    KSPSetInitialGuessNonzero (ksp, PETSC_TRUE);
+    ierr = KSPSetInitialGuessNonzero (ksp, PETSC_TRUE);
+    AssertThrow (ierr == 0, ExcPETScError(ierr));
 
     // Hand over the absolute
     // tolerance and the maximum
@@ -287,8 +290,9 @@ namespace PETScWrappers
     // the Richardson iteration,
     // where no residual is
     // available.
-    KSPSetTolerances(ksp, PETSC_DEFAULT, this->solver_control.tolerance(),
-                     PETSC_DEFAULT, this->solver_control.max_steps()+1);
+    ierr = KSPSetTolerances(ksp, PETSC_DEFAULT, this->solver_control.tolerance(),
+                            PETSC_DEFAULT, this->solver_control.max_steps()+1);
+    AssertThrow (ierr == 0, ExcPETScError(ierr));
   }
 
 
@@ -320,7 +324,8 @@ namespace PETScWrappers
     // in the deal.II solvers, we always
     // honor the initial guess in the
     // solution vector. do so here as well:
-    KSPSetInitialGuessNonzero (ksp, PETSC_TRUE);
+    ierr = KSPSetInitialGuessNonzero (ksp, PETSC_TRUE);
+    AssertThrow (ierr == 0, ExcPETScError(ierr));
   }
 
 
@@ -344,7 +349,8 @@ namespace PETScWrappers
     // in the deal.II solvers, we always
     // honor the initial guess in the
     // solution vector. do so here as well:
-    KSPSetInitialGuessNonzero (ksp, PETSC_TRUE);
+    ierr = KSPSetInitialGuessNonzero (ksp, PETSC_TRUE);
+    AssertThrow (ierr == 0, ExcPETScError(ierr));
   }
 
 
@@ -368,7 +374,8 @@ namespace PETScWrappers
     // in the deal.II solvers, we always
     // honor the initial guess in the
     // solution vector. do so here as well:
-    KSPSetInitialGuessNonzero (ksp, PETSC_TRUE);
+    ierr = KSPSetInitialGuessNonzero (ksp, PETSC_TRUE);
+    AssertThrow (ierr == 0, ExcPETScError(ierr));
   }
 
 
@@ -444,7 +451,8 @@ namespace PETScWrappers
     // in the deal.II solvers, we always
     // honor the initial guess in the
     // solution vector. do so here as well:
-    KSPSetInitialGuessNonzero (ksp, PETSC_TRUE);
+    ierr = KSPSetInitialGuessNonzero (ksp, PETSC_TRUE);
+    AssertThrow (ierr == 0, ExcPETScError(ierr));
   }
 
 
@@ -468,7 +476,8 @@ namespace PETScWrappers
     // in the deal.II solvers, we always
     // honor the initial guess in the
     // solution vector. do so here as well:
-    KSPSetInitialGuessNonzero (ksp, PETSC_TRUE);
+    ierr = KSPSetInitialGuessNonzero (ksp, PETSC_TRUE);
+    AssertThrow (ierr == 0, ExcPETScError(ierr));
   }
 
 
@@ -492,7 +501,8 @@ namespace PETScWrappers
     // in the deal.II solvers, we always
     // honor the initial guess in the
     // solution vector. do so here as well:
-    KSPSetInitialGuessNonzero (ksp, PETSC_TRUE);
+    ierr = KSPSetInitialGuessNonzero (ksp, PETSC_TRUE);
+    AssertThrow (ierr == 0, ExcPETScError(ierr));
   }
 
 
@@ -510,14 +520,14 @@ namespace PETScWrappers
   void
   SolverTFQMR::set_solver_type (KSP &ksp) const
   {
-    int ierr;
-    ierr = KSPSetType (ksp, KSPTFQMR);
+    int ierr = KSPSetType (ksp, KSPTFQMR);
     AssertThrow (ierr == 0, ExcPETScError(ierr));
 
     // in the deal.II solvers, we always
     // honor the initial guess in the
     // solution vector. do so here as well:
-    KSPSetInitialGuessNonzero (ksp, PETSC_TRUE);
+    ierr = KSPSetInitialGuessNonzero (ksp, PETSC_TRUE);
+    AssertThrow (ierr == 0, ExcPETScError(ierr));
   }
 
 
@@ -541,7 +551,8 @@ namespace PETScWrappers
     // in the deal.II solvers, we always
     // honor the initial guess in the
     // solution vector. do so here as well:
-    KSPSetInitialGuessNonzero (ksp, PETSC_TRUE);
+    ierr = KSPSetInitialGuessNonzero (ksp, PETSC_TRUE);
+    AssertThrow (ierr == 0, ExcPETScError(ierr));
   }
 
 
@@ -559,14 +570,14 @@ namespace PETScWrappers
   void
   SolverCR::set_solver_type (KSP &ksp) const
   {
-    int ierr;
-    ierr = KSPSetType (ksp, KSPCR);
+    int ierr = KSPSetType (ksp, KSPCR);
     AssertThrow (ierr == 0, ExcPETScError(ierr));
 
     // in the deal.II solvers, we always
     // honor the initial guess in the
     // solution vector. do so here as well:
-    KSPSetInitialGuessNonzero (ksp, PETSC_TRUE);
+    ierr = KSPSetInitialGuessNonzero (ksp, PETSC_TRUE);
+    AssertThrow (ierr == 0, ExcPETScError(ierr));
   }
 
 
@@ -590,7 +601,8 @@ namespace PETScWrappers
     // in the deal.II solvers, we always
     // honor the initial guess in the
     // solution vector. do so here as well:
-    KSPSetInitialGuessNonzero (ksp, PETSC_TRUE);
+    ierr = KSPSetInitialGuessNonzero (ksp, PETSC_TRUE);
+    AssertThrow (ierr == 0, ExcPETScError(ierr));
   }
 
 
@@ -608,8 +620,7 @@ namespace PETScWrappers
   void
   SolverPreOnly::set_solver_type (KSP &ksp) const
   {
-    int ierr;
-    ierr = KSPSetType (ksp, KSPPREONLY);
+    int ierr = KSPSetType (ksp, KSPPREONLY);
     AssertThrow (ierr == 0, ExcPETScError(ierr));
 
     // The KSPPREONLY solver of
@@ -625,7 +636,8 @@ namespace PETScWrappers
     // Using the PREONLY solver with
     // a nonzero initial guess leads
     // PETSc to produce some error messages.
-    KSPSetInitialGuessNonzero (ksp, PETSC_FALSE);
+    ierr = KSPSetInitialGuessNonzero (ksp, PETSC_FALSE);
+    AssertThrow (ierr == 0, ExcPETScError(ierr));
   }
 
 
@@ -670,7 +682,8 @@ namespace PETScWrappers
      * Using a PREONLY solver with a nonzero initial guess leads PETSc to
      * produce some error messages.
      */
-    KSPSetInitialGuessNonzero (ksp, PETSC_FALSE);
+    ierr = KSPSetInitialGuessNonzero (ksp, PETSC_FALSE);
+    AssertThrow (ierr == 0, ExcPETScError(ierr));
   }
 
   void
@@ -752,9 +765,10 @@ namespace PETScWrappers
          * convergence monitor function that checks with the solver_control
          * object for convergence
          */
-        KSPSetConvergenceTest (solver_data->ksp, &convergence_test,
-                               reinterpret_cast<void *>(&solver_control),
-                               PETSC_NULL);
+        ierr = KSPSetConvergenceTest (solver_data->ksp, &convergence_test,
+                                      reinterpret_cast<void *>(&solver_control),
+                                      PETSC_NULL);
+        AssertThrow (ierr == 0, ExcPETScError(ierr));
 
         /**
          * set the software that is to be used to perform the lu
index 7acf5e0644ecd7dd9a796010ac60aa8a7045978a..d8eadb3953b2f856102e367b90c387205fe3301c 100644 (file)
@@ -129,7 +129,8 @@ namespace PETScWrappers
   SparseMatrix::get_mpi_communicator () const
   {
     static MPI_Comm comm;
-    PetscObjectGetComm((PetscObject)matrix, &comm);
+    const int ierr = PetscObjectGetComm((PetscObject)matrix, &comm);
+    AssertThrow (ierr == 0, ExcPETScError(ierr));
     return comm;
   }
 
@@ -229,9 +230,10 @@ namespace PETScWrappers
               row_entries[j] = sparsity_pattern.column_number (i,j);
 
             const PetscInt int_row = i;
-            MatSetValues (matrix, 1, &int_row,
-                          row_lengths[i], &row_entries[0],
-                          &row_values[0], INSERT_VALUES);
+            const int ierr = MatSetValues (matrix, 1, &int_row,
+                                           row_lengths[i], &row_entries[0],
+                                           &row_values[0], INSERT_VALUES);
+            AssertThrow (ierr == 0, ExcPETScError(ierr));
           }
         compress (VectorOperation::insert);
 
index 71a2e7e6edf5a893b99248ecea84f0220b124adc..9a6390030cd3f850ec15a2ae8a6242b7810903f4 100644 (file)
@@ -1052,11 +1052,13 @@ namespace PETScWrappers
     //TODO[TH]:assert(is_compressed())
 
     // Set options
-    PetscViewerSetFormat (PETSC_VIEWER_STDOUT_WORLD,
-                          format);
+    int ierr = PetscViewerSetFormat (PETSC_VIEWER_STDOUT_WORLD,
+                                     format);
+    AssertThrow (ierr == 0, ExcPETScError(ierr));
 
     // Write to screen
-    VecView (vector, PETSC_VIEWER_STDOUT_WORLD);
+    ierr = VecView (vector, PETSC_VIEWER_STDOUT_WORLD);
+    AssertThrow (ierr == 0, ExcPETScError(ierr));
   }
 
 

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.

Douglas Adams


Typeset in Trocchi and Trocchi Bold Sans Serif.