]> https://gitweb.dealii.org/ - dealii.git/commitdiff
PETScWrappers::MatrixBase: add default getter for mpi comm and constructor from Mat
authorStefano Zampini <stefano.zampini@gmail.com>
Mon, 17 Oct 2022 10:23:52 +0000 (13:23 +0300)
committerLuca Heltai <luca.heltai@sissa.it>
Mon, 19 Dec 2022 17:08:07 +0000 (18:08 +0100)
include/deal.II/lac/petsc_matrix_base.h
source/lac/petsc_matrix_base.cc

index e6c712148564c737191ded1436c2a72b0b663d3d..dea9e730cbdaed749a225910f1f1cee5b863826f 100644 (file)
@@ -304,6 +304,12 @@ namespace PETScWrappers
      */
     MatrixBase();
 
+    /**
+     * Initialize a Matrix from a PETSc Mat object. Note that we do not copy
+     * the matrix.
+     */
+    explicit MatrixBase(const Mat &);
+
     /**
      * Copy constructor. It is deleted as copying this base class
      * without knowing the concrete kind of matrix stored may both
@@ -335,6 +341,7 @@ namespace PETScWrappers
      */
     MatrixBase &
     operator=(const value_type d);
+
     /**
      * Release all memory and return to a state just like after having called
      * the default constructor.
@@ -643,10 +650,11 @@ namespace PETScWrappers
 
     /**
      * Return a reference to the MPI communicator object in use with this
-     * matrix. This function has to be implemented in derived classes.
+     * matrix. If not implemented, it returns the communicator used by the
+     * PETSc Mat.
      */
     virtual const MPI_Comm &
-    get_mpi_communicator() const = 0;
+    get_mpi_communicator() const;
 
     /**
      * Return the number of nonzero elements of this matrix. Actually, it
@@ -1610,6 +1618,14 @@ namespace PETScWrappers
     prepare_action(VectorOperation::insert);
   }
 
+  inline const MPI_Comm &
+  MatrixBase::get_mpi_communicator() const
+  {
+    static MPI_Comm comm;
+    PetscObjectGetComm(reinterpret_cast<PetscObject>(matrix), &comm);
+    return comm;
+  }
+
 #  endif // DOXYGEN
 } // namespace PETScWrappers
 
index c8a26155b8af19f8bb83938b566f596b989e61d3..185fbf99974d8519b7968c58db5e20552beb355f 100644 (file)
@@ -80,6 +80,16 @@ namespace PETScWrappers
   {}
 
 
+  MatrixBase::MatrixBase(const Mat &A)
+    : matrix(A)
+    , last_action(VectorOperation::unknown)
+  {
+    const PetscErrorCode ierr =
+      PetscObjectReference(reinterpret_cast<PetscObject>(matrix));
+    AssertNothrow(ierr == 0, ExcPETScError(ierr));
+    (void)ierr;
+  }
+
 
   MatrixBase::~MatrixBase()
   {

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.