libMesh
Public Member Functions | Static Public Member Functions | Protected Types | Protected Member Functions | Protected Attributes | Static Protected Attributes | Private Attributes | List of all members
libMesh::PetscMatrix< T > Class Template Referencefinal

This class provides a nice interface to the PETSc C-based data structures for parallel, sparse matrices. More...

#include <petsc_matrix.h>

Inheritance diagram for libMesh::PetscMatrix< T >:
[legend]

Public Member Functions

 PetscMatrix (const Parallel::Communicator &comm_in)
 Constructor; initializes the matrix to be empty, without any structure, i.e. More...
 
 PetscMatrix (Mat m, const Parallel::Communicator &comm_in)
 Constructor. More...
 
 PetscMatrix (PetscMatrix &&)=delete
 This class manages a C-style struct (Mat) manually, so we don't want to allow any automatic copy/move functions to be generated, and we can't default the destructor. More...
 
 PetscMatrix (const PetscMatrix &)=delete
 
PetscMatrixoperator= (const PetscMatrix &)=delete
 
PetscMatrixoperator= (PetscMatrix &&)=delete
 
virtual ~PetscMatrix ()
 
void set_matrix_type (PetscMatrixType mat_type)
 
virtual void init (const numeric_index_type m, const numeric_index_type n, const numeric_index_type m_l, const numeric_index_type n_l, const numeric_index_type nnz=30, const numeric_index_type noz=10, const numeric_index_type blocksize=1) override
 Initialize SparseMatrix with the specified sizes. More...
 
void init (const numeric_index_type m, const numeric_index_type n, const numeric_index_type m_l, const numeric_index_type n_l, const std::vector< numeric_index_type > &n_nz, const std::vector< numeric_index_type > &n_oz, const numeric_index_type blocksize=1)
 Initialize a PETSc matrix. More...
 
virtual void init () override
 Initialize this matrix using the sparsity structure computed by dof_map. More...
 
void update_preallocation_and_zero ()
 Update the sparsity pattern based on dof_map, and set the matrix to zero. More...
 
void reset_preallocation ()
 Reset matrix to use the original nonzero pattern provided by users. More...
 
virtual void clear () override
 Restores the SparseMatrix<T> to a pristine state. More...
 
virtual void zero () override
 Set all entries to 0. More...
 
virtual void zero_rows (std::vector< numeric_index_type > &rows, T diag_value=0.0) override
 Sets all row entries to 0 then puts diag_value in the diagonal entry. More...
 
virtual void close () override
 Calls the SparseMatrix's internal assembly routines, ensuring that the values are consistent across processors. More...
 
virtual void flush () override
 For PETSc matrix , this function is similar to close but without shrinking memory. More...
 
virtual numeric_index_type m () const override
 
numeric_index_type local_m () const final
 Get the number of rows owned by this process. More...
 
virtual numeric_index_type n () const override
 
numeric_index_type local_n () const
 Get the number of columns owned by this process. More...
 
void get_local_size (numeric_index_type &m, numeric_index_type &n) const
 Get the number of rows and columns owned by this process. More...
 
virtual numeric_index_type row_start () const override
 
virtual numeric_index_type row_stop () const override
 
virtual void set (const numeric_index_type i, const numeric_index_type j, const T value) override
 Set the element (i,j) to value. More...
 
virtual void add (const numeric_index_type i, const numeric_index_type j, const T value) override
 Add value to the element (i,j). More...
 
virtual void add_matrix (const DenseMatrix< T > &dm, const std::vector< numeric_index_type > &rows, const std::vector< numeric_index_type > &cols) override
 Add the full matrix dm to the SparseMatrix. More...
 
virtual void add_matrix (const DenseMatrix< T > &dm, const std::vector< numeric_index_type > &dof_indices) override
 Same as add_matrix, but assumes the row and column maps are the same. More...
 
virtual void add_block_matrix (const DenseMatrix< T > &dm, const std::vector< numeric_index_type > &brows, const std::vector< numeric_index_type > &bcols) override
 Add the full matrix dm to the SparseMatrix. More...
 
virtual void add_block_matrix (const DenseMatrix< T > &dm, const std::vector< numeric_index_type > &dof_indices) override
 Same as add_block_matrix(), but assumes the row and column maps are the same. More...
 
virtual void add (const T a, const SparseMatrix< T > &X) override
 Compute A += a*X for scalar a, matrix X. More...
 
virtual T operator() (const numeric_index_type i, const numeric_index_type j) const override
 
virtual Real l1_norm () const override
 
virtual Real linfty_norm () const override
 
virtual bool closed () const override
 
virtual void set_destroy_mat_on_exit (bool destroy=true)
 If set to false, we don't delete the Mat on destruction and allow instead for PETSc to manage it. More...
 
virtual void print_personal (std::ostream &os=libMesh::out) const override
 Print the contents of the matrix to the screen with the PETSc viewer. More...
 
virtual void print_matlab (const std::string &name="") const override
 Print the contents of the matrix in Matlab's sparse matrix format. More...
 
virtual void get_diagonal (NumericVector< T > &dest) const override
 Copies the diagonal part of the matrix into dest. More...
 
virtual void get_transpose (SparseMatrix< T > &dest) const override
 Copies the transpose of the matrix into dest, which may be *this. More...
 
void swap (PetscMatrix< T > &)
 Swaps the internal data pointers of two PetscMatrices, no actual values are swapped. More...
 
Mat mat ()
 
void get_row (numeric_index_type i, std::vector< numeric_index_type > &indices, std::vector< T > &values) const override
 Get a row from the matrix. More...
 
virtual bool initialized () const
 
void attach_dof_map (const DofMap &dof_map)
 Get a pointer to the DofMap to use. More...
 
virtual bool need_full_sparsity_pattern () const
 
virtual void update_sparsity_pattern (const SparsityPattern::Graph &)
 Updates the matrix sparsity pattern. More...
 
void print (std::ostream &os=libMesh::out, const bool sparse=false) const
 Print the contents of the matrix to the screen in a uniform style, regardless of matrix/solver package being used. More...
 
template<>
void print (std::ostream &os, const bool sparse) const
 
virtual void create_submatrix (SparseMatrix< T > &submatrix, const std::vector< numeric_index_type > &rows, const std::vector< numeric_index_type > &cols) const
 This function creates a matrix called "submatrix" which is defined by the row and column indices given in the "rows" and "cols" entries. More...
 
virtual void reinit_submatrix (SparseMatrix< T > &submatrix, const std::vector< numeric_index_type > &rows, const std::vector< numeric_index_type > &cols) const
 This function is similar to the one above, but it allows you to reuse the existing sparsity pattern of "submatrix" instead of reallocating it again. More...
 
void vector_mult (NumericVector< T > &dest, const NumericVector< T > &arg) const
 Multiplies the matrix by the NumericVector arg and stores the result in NumericVector dest. More...
 
void vector_mult_add (NumericVector< T > &dest, const NumericVector< T > &arg) const
 Multiplies the matrix by the NumericVector arg and adds the result to the NumericVector dest. More...
 
const Parallel::Communicator & comm () const
 
processor_id_type n_processors () const
 
processor_id_type processor_id () const
 

Static Public Member Functions

static std::unique_ptr< SparseMatrix< T > > build (const Parallel::Communicator &comm, const SolverPackage solver_package=libMesh::default_solver_package())
 Builds a SparseMatrix<T> using the linear solver package specified by solver_package. More...
 
static std::string get_info ()
 Gets a string containing the reference information. More...
 
static void print_info (std::ostream &out=libMesh::out)
 Prints the reference information, by default to libMesh::out. More...
 
static unsigned int n_objects ()
 Prints the number of outstanding (created, but not yet destroyed) objects. More...
 
static void enable_print_counter_info ()
 Methods to enable/disable the reference counter output from print_info() More...
 
static void disable_print_counter_info ()
 

Protected Types

typedef std::map< std::string, std::pair< unsigned int, unsigned int > > Counts
 Data structure to log the information. More...
 

Protected Member Functions

virtual void _get_submatrix (SparseMatrix< T > &submatrix, const std::vector< numeric_index_type > &rows, const std::vector< numeric_index_type > &cols, const bool reuse_submatrix) const override
 This function either creates or re-initializes a matrix called submatrix which is defined by the indices given in the rows and cols vectors. More...
 
void increment_constructor_count (const std::string &name)
 Increments the construction counter. More...
 
void increment_destructor_count (const std::string &name)
 Increments the destruction counter. More...
 

Protected Attributes

const DofMap_dof_map
 The DofMap object associated with this object. More...
 
bool _is_initialized
 Flag indicating whether or not the matrix has been initialized. More...
 
const Parallel::Communicator & _communicator
 

Static Protected Attributes

static Counts _counts
 Actually holds the data. More...
 
static Threads::atomic< unsigned int_n_objects
 The number of objects. More...
 
static Threads::spin_mutex _mutex
 Mutual exclusion object to enable thread-safe reference counting. More...
 
static bool _enable_print_counter = true
 Flag to control whether reference count information is printed when print_info is called. More...
 

Private Attributes

Mat _mat
 PETSc matrix datatype to store values. More...
 
bool _destroy_mat_on_exit
 This boolean value should only be set to false for the constructor which takes a PETSc Mat object. More...
 
PetscMatrixType _mat_type
 
std::mutex _petsc_matrix_mutex
 
Threads::spin_mutex _petsc_matrix_mutex
 

Detailed Description

template<typename T>
class libMesh::PetscMatrix< T >

This class provides a nice interface to the PETSc C-based data structures for parallel, sparse matrices.

All overridden virtual functions are documented in sparse_matrix.h.

Author
Benjamin S. Kirk
Date
2002

SparseMatrix interface to PETSc Mat.

Definition at line 87 of file petsc_matrix.h.

Member Typedef Documentation

◆ Counts

typedef std::map<std::string, std::pair<unsigned int, unsigned int> > libMesh::ReferenceCounter::Counts
protectedinherited

Data structure to log the information.

The log is identified by the class name.

Definition at line 117 of file reference_counter.h.

Constructor & Destructor Documentation

◆ PetscMatrix() [1/4]

template<typename T >
libMesh::PetscMatrix< T >::PetscMatrix ( const Parallel::Communicator &  comm_in)
explicit

Constructor; initializes the matrix to be empty, without any structure, i.e.

the matrix is not usable at all. This constructor is therefore only useful for matrices which are members of a class. All other matrices should be created at a point in the data flow where all necessary information is available.

You have to initialize the matrix before usage with init(...).

Definition at line 92 of file petsc_matrix.C.

92  :
93  SparseMatrix<T>(comm_in),
95  _mat_type(AIJ)
96 {}

◆ PetscMatrix() [2/4]

template<typename T >
libMesh::PetscMatrix< T >::PetscMatrix ( Mat  m,
const Parallel::Communicator &  comm_in 
)
explicit

Constructor.

Creates a PetscMatrix assuming you already have a valid Mat object. In this case, m is NOT destroyed by the PetscMatrix destructor when this object goes out of scope. This allows ownership of m to remain with the original creator, and to simply provide additional functionality with the PetscMatrix.

Definition at line 103 of file petsc_matrix.C.

104  :
105  SparseMatrix<T>(comm_in),
106  _destroy_mat_on_exit(false),
107  _mat_type(AIJ)
108 {
109  this->_mat = mat_in;
110  this->_is_initialized = true;
111 }

◆ PetscMatrix() [3/4]

template<typename T>
libMesh::PetscMatrix< T >::PetscMatrix ( PetscMatrix< T > &&  )
delete

This class manages a C-style struct (Mat) manually, so we don't want to allow any automatic copy/move functions to be generated, and we can't default the destructor.

◆ PetscMatrix() [4/4]

template<typename T>
libMesh::PetscMatrix< T >::PetscMatrix ( const PetscMatrix< T > &  )
delete

◆ ~PetscMatrix()

template<typename T >
libMesh::PetscMatrix< T >::~PetscMatrix ( )
virtual

Definition at line 117 of file petsc_matrix.C.

118 {
119  this->clear();
120 }

Member Function Documentation

◆ _get_submatrix()

template<typename T>
void libMesh::PetscMatrix< T >::_get_submatrix ( SparseMatrix< T > &  submatrix,
const std::vector< numeric_index_type > &  rows,
const std::vector< numeric_index_type > &  cols,
const bool  reuse_submatrix 
) const
overrideprotectedvirtual

This function either creates or re-initializes a matrix called submatrix which is defined by the indices given in the rows and cols vectors.

This function is implemented in terms of MatGetSubMatrix(). The reuse_submatrix parameter determines whether or not PETSc will treat submatrix as one which has already been used (had memory allocated) or as a new matrix.

Reimplemented from libMesh::SparseMatrix< T >.

Definition at line 881 of file petsc_matrix.C.

885 {
886  if (!this->closed())
887  {
888  libmesh_deprecated();
889  libmesh_warning("The matrix must be assembled before calling PetscMatrix::create_submatrix().\n"
890  "Please update your code, as this warning will become an error in a future release.");
891  const_cast<PetscMatrix<T> *>(this)->close();
892  }
893 
894  // Make sure the SparseMatrix passed in is really a PetscMatrix
895  PetscMatrix<T> * petsc_submatrix = cast_ptr<PetscMatrix<T> *>(&submatrix);
896 
897  // If we're not reusing submatrix and submatrix is already initialized
898  // then we need to clear it, otherwise we get a memory leak.
899  if (!reuse_submatrix && submatrix.initialized())
900  submatrix.clear();
901 
902  // Construct row and column index sets.
903  PetscErrorCode ierr=0;
904  IS isrow, iscol;
905 
906  ierr = ISCreateLibMesh(this->comm().get(),
907  cast_int<PetscInt>(rows.size()),
908  numeric_petsc_cast(rows.data()),
910  &isrow); LIBMESH_CHKERR(ierr);
911 
912  ierr = ISCreateLibMesh(this->comm().get(),
913  cast_int<PetscInt>(cols.size()),
914  numeric_petsc_cast(cols.data()),
916  &iscol); LIBMESH_CHKERR(ierr);
917 
918  // Extract submatrix
919  ierr = LibMeshCreateSubMatrix(_mat,
920  isrow,
921  iscol,
922 #if PETSC_RELEASE_LESS_THAN(3,0,1)
923  PETSC_DECIDE,
924 #endif
925  (reuse_submatrix ? MAT_REUSE_MATRIX : MAT_INITIAL_MATRIX),
926  &(petsc_submatrix->_mat)); LIBMESH_CHKERR(ierr);
927 
928  // Specify that the new submatrix is initialized and close it.
929  petsc_submatrix->_is_initialized = true;
930  petsc_submatrix->close();
931 
932  // Clean up PETSc data structures
933  ierr = LibMeshISDestroy(&isrow); LIBMESH_CHKERR(ierr);
934  ierr = LibMeshISDestroy(&iscol); LIBMESH_CHKERR(ierr);
935 }

◆ add() [1/2]

template<typename T>
void libMesh::PetscMatrix< T >::add ( const numeric_index_type  i,
const numeric_index_type  j,
const T  value 
)
overridevirtual

Add value to the element (i,j).

Throws an error if the entry does not exist. Zero values can be "added" to non-existent entries.

Implements libMesh::SparseMatrix< T >.

Definition at line 1143 of file petsc_matrix.C.

1146 {
1147  libmesh_assert (this->initialized());
1148 
1149  PetscErrorCode ierr=0;
1150  PetscInt i_val=i, j_val=j;
1151 
1152  PetscScalar petsc_value = static_cast<PetscScalar>(value);
1153  ierr = MatSetValues(_mat, 1, &i_val, 1, &j_val,
1154  &petsc_value, ADD_VALUES);
1155  LIBMESH_CHKERR(ierr);
1156 }

◆ add() [2/2]

template<typename T>
void libMesh::PetscMatrix< T >::add ( const T  a,
const SparseMatrix< T > &  X 
)
overridevirtual

Compute A += a*X for scalar a, matrix X.

Note
The matrices A and X need to have the same nonzero pattern, otherwise PETSc will crash!
It is advisable to not only allocate appropriate memory with init(), but also explicitly zero the terms of this whenever you add a non-zero value to X.
X will be closed, if not already done, before performing any work.

Implements libMesh::SparseMatrix< T >.

Definition at line 1174 of file petsc_matrix.C.

1175 {
1176  libmesh_assert (this->initialized());
1177 
1178  // sanity check. but this cannot avoid
1179  // crash due to incompatible sparsity structure...
1180  libmesh_assert_equal_to (this->m(), X_in.m());
1181  libmesh_assert_equal_to (this->n(), X_in.n());
1182 
1183  PetscScalar a = static_cast<PetscScalar> (a_in);
1184  const PetscMatrix<T> * X = cast_ptr<const PetscMatrix<T> *> (&X_in);
1185 
1186  libmesh_assert (X);
1187 
1188  PetscErrorCode ierr=0;
1189 
1190  // the matrix from which we copy the values has to be assembled/closed
1191  libmesh_assert(X->closed());
1192 
1193  semiparallel_only();
1194 
1195  ierr = MatAXPY(_mat, a, X->_mat, DIFFERENT_NONZERO_PATTERN);
1196  LIBMESH_CHKERR(ierr);
1197 }

◆ add_block_matrix() [1/2]

template<typename T>
void libMesh::PetscMatrix< T >::add_block_matrix ( const DenseMatrix< T > &  dm,
const std::vector< numeric_index_type > &  brows,
const std::vector< numeric_index_type > &  bcols 
)
overridevirtual

Add the full matrix dm to the SparseMatrix.

This is useful for adding an element matrix at assembly time. The matrix is assumed blocked, and brow, bcol correspond to the block row and column indices.

Reimplemented from libMesh::SparseMatrix< T >.

Definition at line 837 of file petsc_matrix.C.

840 {
841  libmesh_assert (this->initialized());
842 
843  const numeric_index_type n_brows =
844  cast_int<numeric_index_type>(brows.size());
845  const numeric_index_type n_bcols =
846  cast_int<numeric_index_type>(bcols.size());
847 
848  PetscErrorCode ierr=0;
849 
850 #ifndef NDEBUG
851  const numeric_index_type n_rows =
852  cast_int<numeric_index_type>(dm.m());
853  const numeric_index_type n_cols =
854  cast_int<numeric_index_type>(dm.n());
855  const numeric_index_type blocksize = n_rows / n_brows;
856 
857  libmesh_assert_equal_to (n_cols / n_bcols, blocksize);
858  libmesh_assert_equal_to (blocksize*n_brows, n_rows);
859  libmesh_assert_equal_to (blocksize*n_bcols, n_cols);
860 
861  PetscInt petsc_blocksize;
862  ierr = MatGetBlockSize(_mat, &petsc_blocksize);
863  LIBMESH_CHKERR(ierr);
864  libmesh_assert_equal_to (blocksize, static_cast<numeric_index_type>(petsc_blocksize));
865 #endif
866 
867  // These casts are required for PETSc <= 2.1.5
868  ierr = MatSetValuesBlocked(_mat,
869  n_brows, numeric_petsc_cast(brows.data()),
870  n_bcols, numeric_petsc_cast(bcols.data()),
871  pPS(const_cast<T*>(dm.get_values().data())),
872  ADD_VALUES);
873  LIBMESH_CHKERR(ierr);
874 }

Referenced by libMesh::PetscMatrix< libMesh::Number >::add_block_matrix().

◆ add_block_matrix() [2/2]

template<typename T>
virtual void libMesh::PetscMatrix< T >::add_block_matrix ( const DenseMatrix< T > &  dm,
const std::vector< numeric_index_type > &  dof_indices 
)
inlineoverridevirtual

Same as add_block_matrix(), but assumes the row and column maps are the same.

Thus the matrix dm must be square.

Reimplemented from libMesh::SparseMatrix< T >.

Definition at line 219 of file petsc_matrix.h.

221  { this->add_block_matrix (dm, dof_indices, dof_indices); }

◆ add_matrix() [1/2]

template<typename T>
void libMesh::PetscMatrix< T >::add_matrix ( const DenseMatrix< T > &  dm,
const std::vector< numeric_index_type > &  dof_indices 
)
overridevirtual

Same as add_matrix, but assumes the row and column maps are the same.

Thus the matrix dm must be square.

Implements libMesh::SparseMatrix< T >.

Definition at line 1161 of file petsc_matrix.C.

1163 {
1164  this->add_matrix (dm, dof_indices, dof_indices);
1165 }

◆ add_matrix() [2/2]

template<typename T>
void libMesh::PetscMatrix< T >::add_matrix ( const DenseMatrix< T > &  dm,
const std::vector< numeric_index_type > &  rows,
const std::vector< numeric_index_type > &  cols 
)
overridevirtual

Add the full matrix dm to the SparseMatrix.

This is useful for adding an element matrix at assembly time.

Implements libMesh::SparseMatrix< T >.

Definition at line 810 of file petsc_matrix.C.

813 {
814  libmesh_assert (this->initialized());
815 
816  const numeric_index_type n_rows = dm.m();
817  const numeric_index_type n_cols = dm.n();
818 
819  libmesh_assert_equal_to (rows.size(), n_rows);
820  libmesh_assert_equal_to (cols.size(), n_cols);
821 
822  PetscErrorCode ierr=0;
823  ierr = MatSetValues(_mat,
824  n_rows, numeric_petsc_cast(rows.data()),
825  n_cols, numeric_petsc_cast(cols.data()),
826  pPS(const_cast<T*>(dm.get_values().data())),
827  ADD_VALUES);
828  LIBMESH_CHKERR(ierr);
829 }

◆ attach_dof_map()

template<typename T>
void libMesh::SparseMatrix< T >::attach_dof_map ( const DofMap dof_map)
inlineinherited

Get a pointer to the DofMap to use.

Definition at line 108 of file sparse_matrix.h.

109  { _dof_map = &dof_map; }

Referenced by libMesh::__libmesh_tao_hessian(), and libMesh::DofMap::attach_matrix().

◆ build()

template<typename T >
std::unique_ptr< SparseMatrix< T > > libMesh::SparseMatrix< T >::build ( const Parallel::Communicator &  comm,
const SolverPackage  solver_package = libMesh::default_solver_package() 
)
staticinherited

Builds a SparseMatrix<T> using the linear solver package specified by solver_package.

Definition at line 130 of file sparse_matrix.C.

132 {
133  // Avoid unused parameter warnings when no solver packages are enabled.
135 
136  // Build the appropriate vector
137  switch (solver_package)
138  {
139 
140 #ifdef LIBMESH_HAVE_LASPACK
141  case LASPACK_SOLVERS:
142  return libmesh_make_unique<LaspackMatrix<T>>(comm);
143 #endif
144 
145 
146 #ifdef LIBMESH_HAVE_PETSC
147  case PETSC_SOLVERS:
148  return libmesh_make_unique<PetscMatrix<T>>(comm);
149 #endif
150 
151 
152 #ifdef LIBMESH_TRILINOS_HAVE_EPETRA
153  case TRILINOS_SOLVERS:
154  return libmesh_make_unique<EpetraMatrix<T>>(comm);
155 #endif
156 
157 
158 #ifdef LIBMESH_HAVE_EIGEN
159  case EIGEN_SOLVERS:
160  return libmesh_make_unique<EigenSparseMatrix<T>>(comm);
161 #endif
162 
163  default:
164  libmesh_error_msg("ERROR: Unrecognized solver package: " << solver_package);
165  }
166 }

Referenced by libMesh::ImplicitSystem::add_matrix(), libMesh::TransientRBConstruction::allocate_data_structures(), libMesh::RBConstruction::allocate_data_structures(), libMesh::EigenSystem::init_matrices(), SystemsTest::testProjectMatrix1D(), SystemsTest::testProjectMatrix2D(), and SystemsTest::testProjectMatrix3D().

◆ clear()

template<typename T >
void libMesh::PetscMatrix< T >::clear ( )
overridevirtual

Restores the SparseMatrix<T> to a pristine state.

Implements libMesh::SparseMatrix< T >.

Definition at line 560 of file petsc_matrix.C.

561 {
562  PetscErrorCode ierr=0;
563 
564  if ((this->initialized()) && (this->_destroy_mat_on_exit))
565  {
566  semiparallel_only();
567 
568  ierr = LibMeshMatDestroy (&_mat);
569  LIBMESH_CHKERR(ierr);
570 
571  this->_is_initialized = false;
572  }
573 }

◆ close()

template<typename T >
void libMesh::PetscMatrix< T >::close ( )
overridevirtual

Calls the SparseMatrix's internal assembly routines, ensuring that the values are consistent across processors.

Implements libMesh::SparseMatrix< T >.

Definition at line 989 of file petsc_matrix.C.

990 {
991  semiparallel_only();
992 
993  // BSK - 1/19/2004
994  // strictly this check should be OK, but it seems to
995  // fail on matrix-free matrices. Do they falsely
996  // state they are assembled? Check with the developers...
997  // if (this->closed())
998  // return;
999 
1000  PetscErrorCode ierr=0;
1001 
1002  ierr = MatAssemblyBegin (_mat, MAT_FINAL_ASSEMBLY);
1003  LIBMESH_CHKERR(ierr);
1004  ierr = MatAssemblyEnd (_mat, MAT_FINAL_ASSEMBLY);
1005  LIBMESH_CHKERR(ierr);
1006 }

Referenced by libMesh::PetscMatrix< libMesh::Number >::_get_submatrix(), libMesh::PetscLinearSolver< Number >::adjoint_solve(), libMesh::PetscMatrix< libMesh::Number >::get_transpose(), libMesh::PetscLinearSolver< Number >::solve(), libMesh::SlepcEigenSolver< libMesh::Number >::solve_generalized(), and libMesh::SlepcEigenSolver< libMesh::Number >::solve_standard().

◆ closed()

template<typename T >
bool libMesh::PetscMatrix< T >::closed ( ) const
overridevirtual
Returns
true if the matrix has been assembled.

Implements libMesh::SparseMatrix< T >.

Definition at line 1317 of file petsc_matrix.C.

1318 {
1319  libmesh_assert (this->initialized());
1320 
1321  PetscErrorCode ierr=0;
1322  PetscBool assembled;
1323 
1324  ierr = MatAssembled(_mat, &assembled);
1325  LIBMESH_CHKERR(ierr);
1326 
1327  return (assembled == PETSC_TRUE);
1328 }

Referenced by libMesh::PetscMatrix< libMesh::Number >::add().

◆ comm()

const Parallel::Communicator& libMesh::ParallelObject::comm ( ) const
inlineinherited
Returns
A reference to the Parallel::Communicator object used by this mesh.

Definition at line 94 of file parallel_object.h.

95  { return _communicator; }

References libMesh::ParallelObject::_communicator.

Referenced by libMesh::__libmesh_petsc_diff_solver_jacobian(), libMesh::__libmesh_petsc_diff_solver_monitor(), libMesh::__libmesh_petsc_diff_solver_residual(), libMesh::__libmesh_tao_equality_constraints(), libMesh::__libmesh_tao_equality_constraints_jacobian(), libMesh::__libmesh_tao_gradient(), libMesh::__libmesh_tao_hessian(), libMesh::__libmesh_tao_inequality_constraints(), libMesh::__libmesh_tao_inequality_constraints_jacobian(), libMesh::__libmesh_tao_objective(), libMesh::MeshRefinement::_coarsen_elements(), libMesh::ExactSolution::_compute_error(), libMesh::UniformRefinementEstimator::_estimate_error(), libMesh::BoundaryInfo::_find_id_maps(), libMesh::PetscLinearSolver< Number >::_petsc_shell_matrix_get_diagonal(), libMesh::SlepcEigenSolver< libMesh::Number >::_petsc_shell_matrix_get_diagonal(), libMesh::PetscLinearSolver< Number >::_petsc_shell_matrix_mult(), libMesh::SlepcEigenSolver< libMesh::Number >::_petsc_shell_matrix_mult(), libMesh::PetscLinearSolver< Number >::_petsc_shell_matrix_mult_add(), libMesh::EquationSystems::_read_impl(), libMesh::MeshRefinement::_refine_elements(), libMesh::MeshRefinement::_smooth_flags(), libMesh::DofMap::add_constraints_to_send_list(), add_cube_convex_hull_to_mesh(), libMesh::PetscDMWrapper::add_dofs_helper(), libMesh::PetscDMWrapper::add_dofs_to_section(), libMesh::TransientRBConstruction::add_IC_to_RB_space(), libMesh::ImplicitSystem::add_matrix(), libMesh::RBConstruction::add_scaled_matrix_and_vector(), libMesh::DynaIO::add_spline_constraints(), libMesh::System::add_vector(), libMesh::UnstructuredMesh::all_second_order(), libMesh::MeshTools::Modification::all_tri(), libMesh::LaplaceMeshSmoother::allgather_graph(), libMesh::DofMap::allgather_recursive_constraints(), libMesh::TransientRBConstruction::allocate_data_structures(), libMesh::RBConstruction::allocate_data_structures(), libMesh::TransientRBConstruction::assemble_affine_expansion(), libMesh::FEMSystem::assemble_qoi(), libMesh::MeshCommunication::assign_global_indices(), libMesh::DofMap::attach_matrix(), libMesh::MeshTools::Generation::build_extrusion(), libMesh::BoundaryInfo::build_node_list_from_side_list(), libMesh::EquationSystems::build_parallel_elemental_solution_vector(), libMesh::EquationSystems::build_parallel_solution_vector(), libMesh::PetscDMWrapper::build_section(), libMesh::PetscDMWrapper::build_sf(), libMesh::System::calculate_norm(), libMesh::DofMap::check_dirichlet_bcid_consistency(), libMesh::RBConstruction::compute_Fq_representor_innerprods(), libMesh::RBConstruction::compute_max_error_bound(), libMesh::Nemesis_IO_Helper::compute_num_global_elem_blocks(), libMesh::Nemesis_IO_Helper::compute_num_global_nodesets(), libMesh::Nemesis_IO_Helper::compute_num_global_sidesets(), libMesh::RBConstruction::compute_output_dual_innerprods(), libMesh::RBConstruction::compute_residual_dual_norm_slow(), libMesh::RBSCMConstruction::compute_SCM_bounds_on_training_set(), libMesh::Problem_Interface::computeF(), libMesh::Problem_Interface::computeJacobian(), libMesh::Problem_Interface::computePreconditioner(), libMesh::ExodusII_IO::copy_elemental_solution(), libMesh::ExodusII_IO::copy_scalar_solution(), libMesh::MeshTools::correct_node_proc_ids(), libMesh::MeshTools::create_bounding_box(), libMesh::DofMap::create_dof_constraints(), libMesh::MeshTools::create_nodal_bounding_box(), libMesh::MeshRefinement::create_parent_error_vector(), libMesh::MeshTools::create_processor_bounding_box(), libMesh::MeshTools::create_subdomain_bounding_box(), libMesh::MeshCommunication::delete_remote_elements(), libMesh::DofMap::distribute_dofs(), DMlibMeshFunction(), DMlibMeshJacobian(), DMlibMeshSetSystem_libMesh(), DMVariableBounds_libMesh(), libMesh::DTKSolutionTransfer::DTKSolutionTransfer(), libMesh::MeshRefinement::eliminate_unrefined_patches(), libMesh::RBEIMConstruction::enrich_RB_space(), libMesh::TransientRBConstruction::enrich_RB_space(), libMesh::RBConstruction::enrich_RB_space(), libMesh::EpetraVector< T >::EpetraVector(), AssembleOptimization::equality_constraints(), libMesh::WeightedPatchRecoveryErrorEstimator::estimate_error(), libMesh::PatchRecoveryErrorEstimator::estimate_error(), libMesh::JumpErrorEstimator::estimate_error(), libMesh::AdjointRefinementEstimator::estimate_error(), libMesh::ExactErrorEstimator::estimate_error(), libMesh::RBEIMConstruction::evaluate_mesh_function(), libMesh::MeshRefinement::flag_elements_by_elem_fraction(), libMesh::MeshRefinement::flag_elements_by_error_fraction(), libMesh::MeshRefinement::flag_elements_by_error_tolerance(), libMesh::MeshRefinement::flag_elements_by_mean_stddev(), libMesh::MeshRefinement::flag_elements_by_nelem_target(), libMesh::DofMap::gather_constraints(), libMesh::MeshfreeInterpolation::gather_remote_data(), libMesh::CondensedEigenSystem::get_eigenpair(), libMesh::DofMap::get_info(), libMesh::ImplicitSystem::get_linear_solver(), AssembleOptimization::inequality_constraints(), AssembleOptimization::inequality_constraints_jacobian(), libMesh::LocationMap< T >::init(), libMesh::TimeSolver::init(), libMesh::SystemSubsetBySubdomain::init(), libMesh::PetscDMWrapper::init_and_attach_petscdm(), libMesh::EigenSystem::init_matrices(), libMesh::OptimizationSystem::initialize_equality_constraints_storage(), libMesh::OptimizationSystem::initialize_inequality_constraints_storage(), libMesh::RBEIMConstruction::initialize_rb_construction(), integrate_function(), libMesh::MeshTools::libmesh_assert_consistent_distributed(), libMesh::MeshTools::libmesh_assert_consistent_distributed_nodes(), libMesh::MeshTools::libmesh_assert_contiguous_dof_ids(), libMesh::MeshTools::libmesh_assert_parallel_consistent_new_node_procids(), libMesh::MeshTools::libmesh_assert_parallel_consistent_procids< Elem >(), libMesh::MeshTools::libmesh_assert_parallel_consistent_procids< Node >(), libMesh::MeshTools::libmesh_assert_topology_consistent_procids< Node >(), libMesh::MeshTools::libmesh_assert_valid_boundary_ids(), libMesh::MeshTools::libmesh_assert_valid_dof_ids(), libMesh::MeshTools::libmesh_assert_valid_neighbors(), libMesh::DistributedMesh::libmesh_assert_valid_parallel_flags(), libMesh::DistributedMesh::libmesh_assert_valid_parallel_object_ids(), libMesh::DistributedMesh::libmesh_assert_valid_parallel_p_levels(), libMesh::MeshTools::libmesh_assert_valid_refinement_flags(), libMesh::MeshTools::libmesh_assert_valid_unique_ids(), libMesh::libmesh_petsc_preconditioner_apply(), libMesh::libmesh_petsc_snes_fd_residual(), libMesh::libmesh_petsc_snes_jacobian(), libMesh::libmesh_petsc_snes_mffd_residual(), libMesh::libmesh_petsc_snes_postcheck(), libMesh::libmesh_petsc_snes_residual(), libMesh::libmesh_petsc_snes_residual_helper(), libMesh::MeshRefinement::limit_level_mismatch_at_edge(), libMesh::MeshRefinement::limit_level_mismatch_at_node(), libMesh::MeshRefinement::limit_overrefined_boundary(), libMesh::MeshRefinement::limit_underrefined_boundary(), main(), libMesh::MeshRefinement::make_coarsening_compatible(), libMesh::MeshCommunication::make_elems_parallel_consistent(), libMesh::MeshRefinement::make_flags_parallel_consistent(), libMesh::MeshCommunication::make_new_node_proc_ids_parallel_consistent(), libMesh::MeshCommunication::make_new_nodes_parallel_consistent(), libMesh::MeshCommunication::make_node_ids_parallel_consistent(), libMesh::MeshCommunication::make_node_proc_ids_parallel_consistent(), libMesh::MeshCommunication::make_node_unique_ids_parallel_consistent(), libMesh::MeshCommunication::make_nodes_parallel_consistent(), libMesh::MeshCommunication::make_p_levels_parallel_consistent(), libMesh::MeshRefinement::make_refinement_compatible(), libMesh::TransientRBConstruction::mass_matrix_scaled_matvec(), libMesh::FEMSystem::mesh_position_set(), LinearElasticityWithContact::move_mesh(), libMesh::DistributedMesh::n_active_elem(), libMesh::MeshTools::n_active_levels(), libMesh::BoundaryInfo::n_boundary_conds(), libMesh::DofMap::n_constrained_dofs(), libMesh::BoundaryInfo::n_edge_conds(), libMesh::CondensedEigenSystem::n_global_non_condensed_dofs(), libMesh::MeshTools::n_levels(), libMesh::BoundaryInfo::n_nodeset_conds(), libMesh::MeshTools::n_p_levels(), libMesh::BoundaryInfo::n_shellface_conds(), libMesh::DistributedMesh::parallel_max_elem_id(), libMesh::DistributedMesh::parallel_max_node_id(), libMesh::ReplicatedMesh::parallel_max_unique_id(), libMesh::DistributedMesh::parallel_max_unique_id(), libMesh::DistributedMesh::parallel_n_elem(), libMesh::DistributedMesh::parallel_n_nodes(), libMesh::SparsityPattern::Build::parallel_sync(), libMesh::MeshTools::paranoid_n_levels(), libMesh::petsc_auto_fieldsplit(), libMesh::System::point_gradient(), libMesh::System::point_hessian(), libMesh::System::point_value(), libMesh::DofMap::print_dof_constraints(), FEMParameters::read(), libMesh::Nemesis_IO::read(), libMesh::XdrIO::read(), libMesh::CheckpointIO::read_header(), libMesh::XdrIO::read_header(), libMesh::System::read_header(), libMesh::RBEvaluation::read_in_vectors_from_multiple_files(), libMesh::System::read_legacy_data(), libMesh::TransientRBConstruction::read_riesz_representors_from_files(), libMesh::RBConstruction::read_riesz_representors_from_files(), libMesh::System::read_SCALAR_dofs(), libMesh::XdrIO::read_serialized_bc_names(), libMesh::XdrIO::read_serialized_bcs_helper(), libMesh::System::read_serialized_blocked_dof_objects(), libMesh::XdrIO::read_serialized_connectivity(), libMesh::XdrIO::read_serialized_nodes(), libMesh::XdrIO::read_serialized_nodesets(), libMesh::XdrIO::read_serialized_subdomain_names(), libMesh::System::read_serialized_vector(), libMesh::MeshRefinement::refine_and_coarsen_elements(), libMesh::DistributedMesh::renumber_dof_objects(), LinearElasticityWithContact::residual_and_jacobian(), OverlappingAlgebraicGhostingTest::run_ghosting_test(), OverlappingCouplingGhostingTest::run_sparsity_pattern_test(), libMesh::DofMap::scatter_constraints(), libMesh::CheckpointIO::select_split_config(), libMesh::TransientRBConstruction::set_error_temporal_data(), libMesh::RBEIMConstruction::set_explicit_sys_subvector(), libMesh::DofMap::set_nonlocal_dof_objects(), libMesh::PetscDMWrapper::set_point_range_in_section(), libMesh::PetscDiffSolver::setup_petsc_data(), libMesh::LaplaceMeshSmoother::smooth(), libMesh::split_mesh(), libMesh::BoundaryInfo::sync(), libMesh::MeshRefinement::test_level_one(), MeshfunctionDFEM::test_mesh_function_dfem(), MeshfunctionDFEM::test_mesh_function_dfem_grad(), MeshFunctionTest::test_p_level(), libMesh::MeshRefinement::test_unflagged(), SystemsTest::testBlockRestrictedVarNDofs(), PointLocatorTest::testLocator(), BoundaryInfoTest::testMesh(), SystemsTest::testProjectCubeWithMeshFunction(), CheckpointIOTest::testSplitter(), libMesh::MeshTools::total_weight(), libMesh::MeshFunctionSolutionTransfer::transfer(), libMesh::MeshfreeSolutionTransfer::transfer(), libMesh::TransientRBConstruction::truth_assembly(), libMesh::RBConstruction::truth_assembly(), libMesh::MeshRefinement::uniformly_coarsen(), libMesh::TransientRBConstruction::update_RB_initial_condition_all_N(), libMesh::RBEIMConstruction::update_RB_system_matrices(), libMesh::TransientRBConstruction::update_RB_system_matrices(), libMesh::RBConstruction::update_RB_system_matrices(), libMesh::TransientRBConstruction::update_residual_terms(), libMesh::RBConstruction::update_residual_terms(), libMesh::NameBasedIO::write(), libMesh::XdrIO::write(), libMesh::VTKIO::write_nodal_data(), libMesh::RBEvaluation::write_out_vectors(), libMesh::TransientRBConstruction::write_riesz_representors_to_files(), libMesh::RBConstruction::write_riesz_representors_to_files(), libMesh::System::write_SCALAR_dofs(), libMesh::XdrIO::write_serialized_bcs_helper(), libMesh::System::write_serialized_blocked_dof_objects(), libMesh::XdrIO::write_serialized_connectivity(), libMesh::XdrIO::write_serialized_nodes(), libMesh::XdrIO::write_serialized_nodesets(), libMesh::RBDataSerialization::RBEvaluationSerialization::write_to_file(), libMesh::RBDataSerialization::TransientRBEvaluationSerialization::write_to_file(), libMesh::RBDataSerialization::RBEIMEvaluationSerialization::write_to_file(), and libMesh::RBDataSerialization::RBSCMEvaluationSerialization::write_to_file().

◆ create_submatrix()

template<typename T>
virtual void libMesh::SparseMatrix< T >::create_submatrix ( SparseMatrix< T > &  submatrix,
const std::vector< numeric_index_type > &  rows,
const std::vector< numeric_index_type > &  cols 
) const
inlinevirtualinherited

This function creates a matrix called "submatrix" which is defined by the row and column indices given in the "rows" and "cols" entries.

Currently this operation is only defined for the PetscMatrix type.

Definition at line 358 of file sparse_matrix.h.

361  {
362  this->_get_submatrix(submatrix,
363  rows,
364  cols,
365  false); // false means DO NOT REUSE submatrix
366  }

Referenced by libMesh::libmesh_petsc_DMCreateInterpolation().

◆ disable_print_counter_info()

void libMesh::ReferenceCounter::disable_print_counter_info ( )
staticinherited

Definition at line 106 of file reference_counter.C.

107 {
108  _enable_print_counter = false;
109  return;
110 }

References libMesh::ReferenceCounter::_enable_print_counter.

Referenced by libMesh::LibMeshInit::LibMeshInit().

◆ enable_print_counter_info()

void libMesh::ReferenceCounter::enable_print_counter_info ( )
staticinherited

Methods to enable/disable the reference counter output from print_info()

Definition at line 100 of file reference_counter.C.

101 {
102  _enable_print_counter = true;
103  return;
104 }

References libMesh::ReferenceCounter::_enable_print_counter.

◆ flush()

template<typename T >
void libMesh::PetscMatrix< T >::flush ( )
overridevirtual

For PETSc matrix , this function is similar to close but without shrinking memory.

This is useful when we want to switch between ADD_VALUES and INSERT_VALUES. close should be called before using the matrix.

Reimplemented from libMesh::SparseMatrix< T >.

Definition at line 1009 of file petsc_matrix.C.

1010 {
1011  semiparallel_only();
1012 
1013  PetscErrorCode ierr=0;
1014 
1015  ierr = MatAssemblyBegin (_mat, MAT_FLUSH_ASSEMBLY);
1016  LIBMESH_CHKERR(ierr);
1017  ierr = MatAssemblyEnd (_mat, MAT_FLUSH_ASSEMBLY);
1018  LIBMESH_CHKERR(ierr);
1019 }

◆ get_diagonal()

template<typename T>
void libMesh::PetscMatrix< T >::get_diagonal ( NumericVector< T > &  dest) const
overridevirtual

Copies the diagonal part of the matrix into dest.

Implements libMesh::SparseMatrix< T >.

Definition at line 940 of file petsc_matrix.C.

941 {
942  // Make sure the NumericVector passed in is really a PetscVector
943  PetscVector<T> & petsc_dest = cast_ref<PetscVector<T> &>(dest);
944 
945  // Needs a const_cast since PETSc does not work with const.
946  PetscErrorCode ierr =
947  MatGetDiagonal(const_cast<PetscMatrix<T> *>(this)->mat(),petsc_dest.vec()); LIBMESH_CHKERR(ierr);
948 }

◆ get_info()

std::string libMesh::ReferenceCounter::get_info ( )
staticinherited

Gets a string containing the reference information.

Definition at line 47 of file reference_counter.C.

48 {
49 #if defined(LIBMESH_ENABLE_REFERENCE_COUNTING) && defined(DEBUG)
50 
51  std::ostringstream oss;
52 
53  oss << '\n'
54  << " ---------------------------------------------------------------------------- \n"
55  << "| Reference count information |\n"
56  << " ---------------------------------------------------------------------------- \n";
57 
58  for (const auto & pr : _counts)
59  {
60  const std::string name(pr.first);
61  const unsigned int creations = pr.second.first;
62  const unsigned int destructions = pr.second.second;
63 
64  oss << "| " << name << " reference count information:\n"
65  << "| Creations: " << creations << '\n'
66  << "| Destructions: " << destructions << '\n';
67  }
68 
69  oss << " ---------------------------------------------------------------------------- \n";
70 
71  return oss.str();
72 
73 #else
74 
75  return "";
76 
77 #endif
78 }

References libMesh::ReferenceCounter::_counts, and libMesh::Quality::name().

Referenced by libMesh::ReferenceCounter::print_info().

◆ get_local_size()

template<typename T >
void libMesh::PetscMatrix< T >::get_local_size ( numeric_index_type m,
numeric_index_type n 
) const

Get the number of rows and columns owned by this process.

Parameters
iRow size
jColumn size

Definition at line 1078 of file petsc_matrix.C.

1080 {
1081  libmesh_assert (this->initialized());
1082 
1083  PetscInt petsc_m = 0, petsc_n = 0;
1084 
1085  auto ierr = MatGetLocalSize (_mat, &petsc_m, &petsc_n);
1086  LIBMESH_CHKERR(ierr);
1087 
1088  m = static_cast<numeric_index_type>(petsc_m);
1089  n = static_cast<numeric_index_type>(petsc_n);
1090 }

◆ get_row()

template<typename T>
void libMesh::PetscMatrix< T >::get_row ( numeric_index_type  ,
std::vector< numeric_index_type > &  ,
std::vector< T > &   
) const
overridevirtual

Get a row from the matrix.

Parameters
iThe matrix row to get
indicesA container that will be filled with the column indices corresponding to (possibly) non-zero values
valuesA container holding the column values

Reimplemented from libMesh::SparseMatrix< T >.

Definition at line 1260 of file petsc_matrix.C.

1263 {
1264  libmesh_assert (this->initialized());
1265 
1266  const PetscScalar * petsc_row;
1267  const PetscInt * petsc_cols;
1268 
1269  PetscErrorCode ierr=0;
1270  PetscInt
1271  ncols=0,
1272  i_val = static_cast<PetscInt>(i_in);
1273 
1274  // the matrix needs to be closed for this to work
1275  // this->close();
1276  // but closing it is a semiparallel operation; we want operator()
1277  // to run on one processor.
1278  libmesh_assert(this->closed());
1279 
1280  // PETSc makes no effort at being thread safe. Helgrind complains about
1281  // possible data races even just in PetscFunctionBegin (due to things
1282  // like stack counter incrementing). Perhaps we could ignore
1283  // this, but there are legitimate data races for Mat data members like
1284  // mat->getrowactive between MatGetRow and MatRestoreRow. Moreover,
1285  // there could be a write into mat->rowvalues during MatGetRow from
1286  // one thread while we are attempting to read from mat->rowvalues
1287  // (through petsc_cols) during data copy in another thread. So
1288  // the safe thing to do is to lock the whole method
1289 
1290 #ifdef LIBMESH_HAVE_CXX11_THREAD
1291  std::lock_guard<std::mutex>
1292 #else
1293  Threads::spin_mutex::scoped_lock
1294 #endif
1295  lock(_petsc_matrix_mutex);
1296 
1297  ierr = MatGetRow(_mat, i_val, &ncols, &petsc_cols, &petsc_row);
1298  LIBMESH_CHKERR(ierr);
1299 
1300  // Copy the data
1301  indices.resize(static_cast<std::size_t>(ncols));
1302  values.resize(static_cast<std::size_t>(ncols));
1303 
1304  for (auto i : index_range(indices))
1305  {
1306  indices[i] = static_cast<numeric_index_type>(petsc_cols[i]);
1307  values[i] = static_cast<T>(petsc_row[i]);
1308  }
1309 
1310  ierr = MatRestoreRow(_mat, i_val,
1311  &ncols, &petsc_cols, &petsc_row);
1312  LIBMESH_CHKERR(ierr);
1313 }

◆ get_transpose()

template<typename T>
void libMesh::PetscMatrix< T >::get_transpose ( SparseMatrix< T > &  dest) const
overridevirtual

Copies the transpose of the matrix into dest, which may be *this.

Implements libMesh::SparseMatrix< T >.

Definition at line 953 of file petsc_matrix.C.

954 {
955  // Make sure the SparseMatrix passed in is really a PetscMatrix
956  PetscMatrix<T> & petsc_dest = cast_ref<PetscMatrix<T> &>(dest);
957 
958  // If we aren't reusing the matrix then need to clear dest,
959  // otherwise we get a memory leak
960  if (&petsc_dest != this)
961  dest.clear();
962 
963  PetscErrorCode ierr;
964 #if PETSC_VERSION_LESS_THAN(3,0,0)
965  if (&petsc_dest == this)
966  ierr = MatTranspose(_mat,NULL);
967  else
968  ierr = MatTranspose(_mat,&petsc_dest._mat);
969  LIBMESH_CHKERR(ierr);
970 #else
971  // FIXME - we can probably use MAT_REUSE_MATRIX in more situations
972  if (&petsc_dest == this)
973  ierr = MatTranspose(_mat,MAT_REUSE_MATRIX,&petsc_dest._mat);
974  else
975  ierr = MatTranspose(_mat,MAT_INITIAL_MATRIX,&petsc_dest._mat);
976  LIBMESH_CHKERR(ierr);
977 #endif
978 
979  // Specify that the transposed matrix is initialized and close it.
980  petsc_dest._is_initialized = true;
981  petsc_dest.close();
982 }

◆ increment_constructor_count()

void libMesh::ReferenceCounter::increment_constructor_count ( const std::string &  name)
inlineprotectedinherited

Increments the construction counter.

Should be called in the constructor of any derived class that will be reference counted.

Definition at line 181 of file reference_counter.h.

182 {
183  Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx);
184  std::pair<unsigned int, unsigned int> & p = _counts[name];
185 
186  p.first++;
187 }

References libMesh::ReferenceCounter::_counts, libMesh::Quality::name(), and libMesh::Threads::spin_mtx.

Referenced by libMesh::ReferenceCountedObject< RBParametrized >::ReferenceCountedObject().

◆ increment_destructor_count()

void libMesh::ReferenceCounter::increment_destructor_count ( const std::string &  name)
inlineprotectedinherited

Increments the destruction counter.

Should be called in the destructor of any derived class that will be reference counted.

Definition at line 194 of file reference_counter.h.

195 {
196  Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx);
197  std::pair<unsigned int, unsigned int> & p = _counts[name];
198 
199  p.second++;
200 }

References libMesh::ReferenceCounter::_counts, libMesh::Quality::name(), and libMesh::Threads::spin_mtx.

Referenced by libMesh::ReferenceCountedObject< RBParametrized >::~ReferenceCountedObject().

◆ init() [1/3]

template<typename T >
void libMesh::PetscMatrix< T >::init ( )
overridevirtual

Initialize this matrix using the sparsity structure computed by dof_map.

Implements libMesh::SparseMatrix< T >.

Definition at line 358 of file petsc_matrix.C.

359 {
360  libmesh_assert(this->_dof_map);
361 
362  // Clear initialized matrices
363  if (this->initialized())
364  this->clear();
365 
366  this->_is_initialized = true;
367 
368 
369  const numeric_index_type my_m = this->_dof_map->n_dofs();
370  const numeric_index_type my_n = my_m;
371  const numeric_index_type n_l = this->_dof_map->n_dofs_on_processor(this->processor_id());
372  const numeric_index_type m_l = n_l;
373 
374 
375  const std::vector<numeric_index_type> & n_nz = this->_dof_map->get_n_nz();
376  const std::vector<numeric_index_type> & n_oz = this->_dof_map->get_n_oz();
377 
378  // Make sure the sparsity pattern isn't empty unless the matrix is 0x0
379  libmesh_assert_equal_to (n_nz.size(), m_l);
380  libmesh_assert_equal_to (n_oz.size(), m_l);
381 
382  PetscErrorCode ierr = 0;
383  PetscInt m_global = static_cast<PetscInt>(my_m);
384  PetscInt n_global = static_cast<PetscInt>(my_n);
385  PetscInt m_local = static_cast<PetscInt>(m_l);
386  PetscInt n_local = static_cast<PetscInt>(n_l);
387 
388  ierr = MatCreate(this->comm().get(), &_mat);
389  LIBMESH_CHKERR(ierr);
390  ierr = MatSetSizes(_mat, m_local, n_local, m_global, n_global);
391  LIBMESH_CHKERR(ierr);
392  PetscInt blocksize = static_cast<PetscInt>(this->_dof_map->block_size());
393  ierr = MatSetBlockSize(_mat,blocksize);
394  LIBMESH_CHKERR(ierr);
395 
396 #ifdef LIBMESH_ENABLE_BLOCKED_STORAGE
397  if (blocksize > 1)
398  {
399  // specified blocksize, bs>1.
400  // double check sizes.
401  libmesh_assert_equal_to (m_local % blocksize, 0);
402  libmesh_assert_equal_to (n_local % blocksize, 0);
403  libmesh_assert_equal_to (m_global % blocksize, 0);
404  libmesh_assert_equal_to (n_global % blocksize, 0);
405 
406  ierr = MatSetType(_mat, MATBAIJ); // Automatically chooses seqbaij or mpibaij
407  LIBMESH_CHKERR(ierr);
408 
409  // transform the per-entry n_nz and n_oz arrays into their block counterparts.
410  std::vector<numeric_index_type> b_n_nz, b_n_oz;
411 
412  transform_preallocation_arrays (blocksize,
413  n_nz, n_oz,
414  b_n_nz, b_n_oz);
415 
416  ierr = MatSeqBAIJSetPreallocation (_mat,
417  blocksize,
418  0,
419  numeric_petsc_cast(b_n_nz.empty() ? nullptr : b_n_nz.data()));
420  LIBMESH_CHKERR(ierr);
421 
422  ierr = MatMPIBAIJSetPreallocation (_mat,
423  blocksize,
424  0,
425  numeric_petsc_cast(b_n_nz.empty() ? nullptr : b_n_nz.data()),
426  0,
427  numeric_petsc_cast(b_n_oz.empty() ? nullptr : b_n_oz.data()));
428  LIBMESH_CHKERR(ierr);
429  }
430  else
431 #endif
432  {
433  switch (_mat_type) {
434  case AIJ:
435  ierr = MatSetType(_mat, MATAIJ); // Automatically chooses seqaij or mpiaij
436  LIBMESH_CHKERR(ierr);
437  ierr = MatSeqAIJSetPreallocation (_mat,
438  0,
439  numeric_petsc_cast(n_nz.empty() ? nullptr : n_nz.data()));
440  LIBMESH_CHKERR(ierr);
441  ierr = MatMPIAIJSetPreallocation (_mat,
442  0,
443  numeric_petsc_cast(n_nz.empty() ? nullptr : n_nz.data()),
444  0,
445  numeric_petsc_cast(n_oz.empty() ? nullptr : n_oz.data()));
446  break;
447 
448  case HYPRE:
449 #if !PETSC_VERSION_LESS_THAN(3,9,4) && LIBMESH_HAVE_PETSC_HYPRE
450  ierr = MatSetType(_mat, MATHYPRE);
451  LIBMESH_CHKERR(ierr);
452  ierr = MatHYPRESetPreallocation (_mat,
453  0,
454  numeric_petsc_cast(n_nz.empty() ? nullptr : n_nz.data()),
455  0,
456  numeric_petsc_cast(n_oz.empty() ? nullptr : n_oz.data()));
457  LIBMESH_CHKERR(ierr);
458 #else
459  libmesh_error_msg("PETSc 3.9.4 or higher with hypre is required for MatHypre");
460 #endif
461  break;
462 
463  default: libmesh_error_msg("Unsupported petsc matrix type");
464  }
465  }
466 
467  // Make it an error for PETSc to allocate new nonzero entries during assembly
468 #if PETSC_VERSION_LESS_THAN(3,0,0)
469  ierr = MatSetOption(_mat, MAT_NEW_NONZERO_ALLOCATION_ERR);
470 #else
471  ierr = MatSetOption(_mat, MAT_NEW_NONZERO_ALLOCATION_ERR, PETSC_TRUE);
472 #endif
473  LIBMESH_CHKERR(ierr);
474 
475  // Is prefix information available somewhere? Perhaps pass in the system name?
476  ierr = MatSetOptionsPrefix(_mat, "");
477  LIBMESH_CHKERR(ierr);
478  ierr = MatSetFromOptions(_mat);
479  LIBMESH_CHKERR(ierr);
480 
481  this->zero();
482 }

◆ init() [2/3]

template<typename T >
void libMesh::PetscMatrix< T >::init ( const numeric_index_type  m,
const numeric_index_type  n,
const numeric_index_type  m_l,
const numeric_index_type  n_l,
const numeric_index_type  nnz = 30,
const numeric_index_type  noz = 10,
const numeric_index_type  blocksize = 1 
)
overridevirtual

Initialize SparseMatrix with the specified sizes.

Parameters
mThe global number of rows.
nThe global number of columns.
m_lThe local number of rows.
n_lThe local number of columns.
nnzThe number of on-diagonal nonzeros per row (defaults to 30).
nozThe number of off-diagonal nonzeros per row (defaults to 10).
blocksizeOptional value indicating dense coupled blocks for systems with multiple variables all of the same type.

Implements libMesh::SparseMatrix< T >.

Definition at line 129 of file petsc_matrix.C.

136 {
137  // So compilers don't warn when !LIBMESH_ENABLE_BLOCKED_STORAGE
138  libmesh_ignore(blocksize_in);
139 
140  // Clear initialized matrices
141  if (this->initialized())
142  this->clear();
143 
144  this->_is_initialized = true;
145 
146 
147  PetscErrorCode ierr = 0;
148  PetscInt m_global = static_cast<PetscInt>(m_in);
149  PetscInt n_global = static_cast<PetscInt>(n_in);
150  PetscInt m_local = static_cast<PetscInt>(m_l);
151  PetscInt n_local = static_cast<PetscInt>(n_l);
152  PetscInt n_nz = static_cast<PetscInt>(nnz);
153  PetscInt n_oz = static_cast<PetscInt>(noz);
154 
155  ierr = MatCreate(this->comm().get(), &_mat);
156  LIBMESH_CHKERR(ierr);
157  ierr = MatSetSizes(_mat, m_local, n_local, m_global, n_global);
158  LIBMESH_CHKERR(ierr);
159  PetscInt blocksize = static_cast<PetscInt>(blocksize_in);
160  ierr = MatSetBlockSize(_mat,blocksize);
161  LIBMESH_CHKERR(ierr);
162 
163 #ifdef LIBMESH_ENABLE_BLOCKED_STORAGE
164  if (blocksize > 1)
165  {
166  // specified blocksize, bs>1.
167  // double check sizes.
168  libmesh_assert_equal_to (m_local % blocksize, 0);
169  libmesh_assert_equal_to (n_local % blocksize, 0);
170  libmesh_assert_equal_to (m_global % blocksize, 0);
171  libmesh_assert_equal_to (n_global % blocksize, 0);
172  libmesh_assert_equal_to (n_nz % blocksize, 0);
173  libmesh_assert_equal_to (n_oz % blocksize, 0);
174 
175  ierr = MatSetType(_mat, MATBAIJ); // Automatically chooses seqbaij or mpibaij
176  LIBMESH_CHKERR(ierr);
177  ierr = MatSeqBAIJSetPreallocation(_mat, blocksize, n_nz/blocksize, NULL);
178  LIBMESH_CHKERR(ierr);
179  ierr = MatMPIBAIJSetPreallocation(_mat, blocksize,
180  n_nz/blocksize, NULL,
181  n_oz/blocksize, NULL);
182  LIBMESH_CHKERR(ierr);
183  }
184  else
185 #endif
186  {
187  switch (_mat_type) {
188  case AIJ:
189  ierr = MatSetType(_mat, MATAIJ); // Automatically chooses seqaij or mpiaij
190  LIBMESH_CHKERR(ierr);
191  ierr = MatSeqAIJSetPreallocation(_mat, n_nz, NULL);
192  LIBMESH_CHKERR(ierr);
193  ierr = MatMPIAIJSetPreallocation(_mat, n_nz, NULL, n_oz, NULL);
194  LIBMESH_CHKERR(ierr);
195  break;
196 
197  case HYPRE:
198 #if !PETSC_VERSION_LESS_THAN(3,9,4) && LIBMESH_HAVE_PETSC_HYPRE
199  ierr = MatSetType(_mat, MATHYPRE);
200  LIBMESH_CHKERR(ierr);
201  ierr = MatHYPRESetPreallocation(_mat, n_nz, NULL, n_oz, NULL);
202  LIBMESH_CHKERR(ierr);
203 #else
204  libmesh_error_msg("PETSc 3.9.4 or higher with hypre is required for MatHypre");
205 #endif
206  break;
207 
208  default: libmesh_error_msg("Unsupported petsc matrix type");
209  }
210  }
211 
212  // Make it an error for PETSc to allocate new nonzero entries during assembly
213 #if PETSC_VERSION_LESS_THAN(3,0,0)
214  ierr = MatSetOption(_mat, MAT_NEW_NONZERO_ALLOCATION_ERR);
215 #else
216  ierr = MatSetOption(_mat, MAT_NEW_NONZERO_ALLOCATION_ERR, PETSC_TRUE);
217 #endif
218  LIBMESH_CHKERR(ierr);
219 
220  // Is prefix information available somewhere? Perhaps pass in the system name?
221  ierr = MatSetOptionsPrefix(_mat, "");
222  LIBMESH_CHKERR(ierr);
223  ierr = MatSetFromOptions(_mat);
224  LIBMESH_CHKERR(ierr);
225 
226  this->zero ();
227 }

◆ init() [3/3]

template<typename T >
void libMesh::PetscMatrix< T >::init ( const numeric_index_type  m,
const numeric_index_type  n,
const numeric_index_type  m_l,
const numeric_index_type  n_l,
const std::vector< numeric_index_type > &  n_nz,
const std::vector< numeric_index_type > &  n_oz,
const numeric_index_type  blocksize = 1 
)

Initialize a PETSc matrix.

Parameters
mThe global number of rows.
nThe global number of columns.
m_lThe local number of rows.
n_lThe local number of columns.
n_nzarray containing the number of nonzeros in each row of the DIAGONAL portion of the local submatrix.
n_ozArray containing the number of nonzeros in each row of the OFF-DIAGONAL portion of the local submatrix.
blocksizeOptional value indicating dense coupled blocks for systems with multiple variables all of the same type.

Definition at line 231 of file petsc_matrix.C.

238 {
239  // So compilers don't warn when !LIBMESH_ENABLE_BLOCKED_STORAGE
240  libmesh_ignore(blocksize_in);
241 
242  // Clear initialized matrices
243  if (this->initialized())
244  this->clear();
245 
246  this->_is_initialized = true;
247 
248  // Make sure the sparsity pattern isn't empty unless the matrix is 0x0
249  libmesh_assert_equal_to (n_nz.size(), m_l);
250  libmesh_assert_equal_to (n_oz.size(), m_l);
251 
252  PetscErrorCode ierr = 0;
253  PetscInt m_global = static_cast<PetscInt>(m_in);
254  PetscInt n_global = static_cast<PetscInt>(n_in);
255  PetscInt m_local = static_cast<PetscInt>(m_l);
256  PetscInt n_local = static_cast<PetscInt>(n_l);
257 
258  ierr = MatCreate(this->comm().get(), &_mat);
259  LIBMESH_CHKERR(ierr);
260  ierr = MatSetSizes(_mat, m_local, n_local, m_global, n_global);
261  LIBMESH_CHKERR(ierr);
262  PetscInt blocksize = static_cast<PetscInt>(blocksize_in);
263  ierr = MatSetBlockSize(_mat,blocksize);
264  LIBMESH_CHKERR(ierr);
265 
266 #ifdef LIBMESH_ENABLE_BLOCKED_STORAGE
267  if (blocksize > 1)
268  {
269  // specified blocksize, bs>1.
270  // double check sizes.
271  libmesh_assert_equal_to (m_local % blocksize, 0);
272  libmesh_assert_equal_to (n_local % blocksize, 0);
273  libmesh_assert_equal_to (m_global % blocksize, 0);
274  libmesh_assert_equal_to (n_global % blocksize, 0);
275 
276  ierr = MatSetType(_mat, MATBAIJ); // Automatically chooses seqbaij or mpibaij
277  LIBMESH_CHKERR(ierr);
278 
279  // transform the per-entry n_nz and n_oz arrays into their block counterparts.
280  std::vector<numeric_index_type> b_n_nz, b_n_oz;
281 
282  transform_preallocation_arrays (blocksize,
283  n_nz, n_oz,
284  b_n_nz, b_n_oz);
285 
286  ierr = MatSeqBAIJSetPreallocation (_mat,
287  blocksize,
288  0,
289  numeric_petsc_cast(b_n_nz.empty() ? nullptr : b_n_nz.data()));
290  LIBMESH_CHKERR(ierr);
291 
292  ierr = MatMPIBAIJSetPreallocation (_mat,
293  blocksize,
294  0,
295  numeric_petsc_cast(b_n_nz.empty() ? nullptr : b_n_nz.data()),
296  0,
297  numeric_petsc_cast(b_n_oz.empty() ? nullptr : b_n_oz.data()));
298  LIBMESH_CHKERR(ierr);
299  }
300  else
301 #endif
302  {
303  switch (_mat_type) {
304  case AIJ:
305  ierr = MatSetType(_mat, MATAIJ); // Automatically chooses seqaij or mpiaij
306  LIBMESH_CHKERR(ierr);
307  ierr = MatSeqAIJSetPreallocation (_mat,
308  0,
309  numeric_petsc_cast(n_nz.empty() ? nullptr : n_nz.data()));
310  LIBMESH_CHKERR(ierr);
311  ierr = MatMPIAIJSetPreallocation (_mat,
312  0,
313  numeric_petsc_cast(n_nz.empty() ? nullptr : n_nz.data()),
314  0,
315  numeric_petsc_cast(n_oz.empty() ? nullptr : n_oz.data()));
316  break;
317 
318  case HYPRE:
319 #if !PETSC_VERSION_LESS_THAN(3,9,4) && LIBMESH_HAVE_PETSC_HYPRE
320  ierr = MatSetType(_mat, MATHYPRE);
321  LIBMESH_CHKERR(ierr);
322  ierr = MatHYPRESetPreallocation (_mat,
323  0,
324  numeric_petsc_cast(n_nz.empty() ? nullptr : n_nz.data()),
325  0,
326  numeric_petsc_cast(n_oz.empty() ? nullptr : n_oz.data()));
327  LIBMESH_CHKERR(ierr);
328 #else
329  libmesh_error_msg("PETSc 3.9.4 or higher with hypre is required for MatHypre");
330 #endif
331  break;
332 
333  default: libmesh_error_msg("Unsupported petsc matrix type");
334  }
335 
336  }
337 
338  // Make it an error for PETSc to allocate new nonzero entries during assembly
339 #if PETSC_VERSION_LESS_THAN(3,0,0)
340  ierr = MatSetOption(_mat, MAT_NEW_NONZERO_ALLOCATION_ERR);
341 #else
342  ierr = MatSetOption(_mat, MAT_NEW_NONZERO_ALLOCATION_ERR, PETSC_TRUE);
343 #endif
344  LIBMESH_CHKERR(ierr);
345 
346  // Is prefix information available somewhere? Perhaps pass in the system name?
347  ierr = MatSetOptionsPrefix(_mat, "");
348  LIBMESH_CHKERR(ierr);
349  ierr = MatSetFromOptions(_mat);
350  LIBMESH_CHKERR(ierr);
351 
352 
353  this->zero();
354 }

◆ initialized()

template<typename T>
virtual bool libMesh::SparseMatrix< T >::initialized ( ) const
inlinevirtualinherited
Returns
true if the matrix has been initialized, false otherwise.

Definition at line 103 of file sparse_matrix.h.

103 { return _is_initialized; }

Referenced by libMesh::PetscMatrix< libMesh::Number >::_get_submatrix(), libMesh::ImplicitSystem::assemble(), and libMesh::ImplicitSystem::init_matrices().

◆ l1_norm()

template<typename T >
Real libMesh::PetscMatrix< T >::l1_norm ( ) const
overridevirtual
Returns
The \( \ell_1 \)-norm of the matrix, that is the max column sum: \( |M|_1 = \max_{j} \sum_{i} |M_{ij}| \)

This is the natural matrix norm that is compatible with the \( \ell_1 \)-norm for vectors, i.e. \( |Mv|_1 \leq |M|_1 |v|_1 \). (cf. Haemmerlin-Hoffmann : Numerische Mathematik)

Implements libMesh::SparseMatrix< T >.

Definition at line 578 of file petsc_matrix.C.

579 {
580  libmesh_assert (this->initialized());
581 
582  semiparallel_only();
583 
584  PetscErrorCode ierr=0;
585  PetscReal petsc_value;
586  Real value;
587 
588  libmesh_assert (this->closed());
589 
590  ierr = MatNorm(_mat, NORM_1, &petsc_value);
591  LIBMESH_CHKERR(ierr);
592 
593  value = static_cast<Real>(petsc_value);
594 
595  return value;
596 }

◆ linfty_norm()

template<typename T >
Real libMesh::PetscMatrix< T >::linfty_norm ( ) const
overridevirtual
Returns
The \( \ell_{\infty} \)-norm of the matrix, that is the max row sum:

\( |M|_{\infty} = \max_{i} \sum_{j} |M_{ij}| \)

This is the natural matrix norm that is compatible to the \( \ell_{\infty} \)-norm of vectors, i.e. \( |Mv|_{\infty} \leq |M|_{\infty} |v|_{\infty} \). (cf. Haemmerlin-Hoffmann : Numerische Mathematik)

Implements libMesh::SparseMatrix< T >.

Definition at line 601 of file petsc_matrix.C.

602 {
603  libmesh_assert (this->initialized());
604 
605  semiparallel_only();
606 
607  PetscErrorCode ierr=0;
608  PetscReal petsc_value;
609  Real value;
610 
611  libmesh_assert (this->closed());
612 
613  ierr = MatNorm(_mat, NORM_INFINITY, &petsc_value);
614  LIBMESH_CHKERR(ierr);
615 
616  value = static_cast<Real>(petsc_value);
617 
618  return value;
619 }

◆ local_m()

template<typename T >
numeric_index_type libMesh::PetscMatrix< T >::local_m ( ) const
finalvirtual

Get the number of rows owned by this process.

Reimplemented from libMesh::SparseMatrix< T >.

Definition at line 1038 of file petsc_matrix.C.

1039 {
1040  libmesh_assert (this->initialized());
1041 
1042  PetscInt m = 0;
1043 
1044  auto ierr = MatGetLocalSize (_mat, &m, NULL);
1045  LIBMESH_CHKERR(ierr);
1046 
1047  return static_cast<numeric_index_type>(m);
1048 }

◆ local_n()

template<typename T >
numeric_index_type libMesh::PetscMatrix< T >::local_n ( ) const

Get the number of columns owned by this process.

Definition at line 1065 of file petsc_matrix.C.

1066 {
1067  libmesh_assert (this->initialized());
1068 
1069  PetscInt n = 0;
1070 
1071  auto ierr = MatGetLocalSize (_mat, NULL, &n);
1072  LIBMESH_CHKERR(ierr);
1073 
1074  return static_cast<numeric_index_type>(n);
1075 }

◆ m()

template<typename T >
numeric_index_type libMesh::PetscMatrix< T >::m ( ) const
overridevirtual
Returns
The row-dimension of the matrix.

Implements libMesh::SparseMatrix< T >.

Definition at line 1024 of file petsc_matrix.C.

1025 {
1026  libmesh_assert (this->initialized());
1027 
1028  PetscInt petsc_m=0, petsc_n=0;
1029  PetscErrorCode ierr=0;
1030 
1031  ierr = MatGetSize (_mat, &petsc_m, &petsc_n);
1032  LIBMESH_CHKERR(ierr);
1033 
1034  return static_cast<numeric_index_type>(petsc_m);
1035 }

◆ mat()

template<typename T>
Mat libMesh::PetscMatrix< T >::mat ( )
inline

◆ n()

template<typename T >
numeric_index_type libMesh::PetscMatrix< T >::n ( ) const
overridevirtual
Returns
The column-dimension of the matrix.

Implements libMesh::SparseMatrix< T >.

Definition at line 1051 of file petsc_matrix.C.

1052 {
1053  libmesh_assert (this->initialized());
1054 
1055  PetscInt petsc_m=0, petsc_n=0;
1056  PetscErrorCode ierr=0;
1057 
1058  ierr = MatGetSize (_mat, &petsc_m, &petsc_n);
1059  LIBMESH_CHKERR(ierr);
1060 
1061  return static_cast<numeric_index_type>(petsc_n);
1062 }

◆ n_objects()

static unsigned int libMesh::ReferenceCounter::n_objects ( )
inlinestaticinherited

Prints the number of outstanding (created, but not yet destroyed) objects.

Definition at line 83 of file reference_counter.h.

84  { return _n_objects; }

References libMesh::ReferenceCounter::_n_objects.

◆ n_processors()

processor_id_type libMesh::ParallelObject::n_processors ( ) const
inlineinherited
Returns
The number of processors in the group.

Definition at line 100 of file parallel_object.h.

101  { return cast_int<processor_id_type>(_communicator.size()); }

References libMesh::ParallelObject::_communicator.

Referenced by libMesh::BoundaryInfo::_find_id_maps(), libMesh::DofMap::add_constraints_to_send_list(), libMesh::PetscDMWrapper::add_dofs_to_section(), libMesh::DistributedMesh::add_elem(), libMesh::DofMap::add_neighbors_to_send_list(), libMesh::DistributedMesh::add_node(), libMesh::LaplaceMeshSmoother::allgather_graph(), libMesh::DofMap::allgather_recursive_constraints(), libMesh::FEMSystem::assembly(), libMesh::AztecLinearSolver< T >::AztecLinearSolver(), libMesh::BoundaryInfo::build_node_list_from_side_list(), libMesh::EquationSystems::build_parallel_elemental_solution_vector(), libMesh::DistributedMesh::clear(), libMesh::Nemesis_IO_Helper::compute_border_node_ids(), libMesh::Nemesis_IO_Helper::construct_nemesis_filename(), libMesh::ExodusII_IO::copy_scalar_solution(), libMesh::UnstructuredMesh::create_pid_mesh(), libMesh::MeshTools::create_processor_bounding_box(), libMesh::DofMap::distribute_dofs(), libMesh::DofMap::distribute_local_dofs_node_major(), libMesh::DofMap::distribute_local_dofs_var_major(), libMesh::EnsightIO::EnsightIO(), libMesh::SystemSubsetBySubdomain::init(), libMesh::PetscDMWrapper::init_and_attach_petscdm(), libMesh::Nemesis_IO_Helper::initialize(), libMesh::DistributedMesh::insert_elem(), libMesh::MeshTools::libmesh_assert_contiguous_dof_ids(), libMesh::MeshTools::libmesh_assert_parallel_consistent_new_node_procids(), libMesh::MeshTools::libmesh_assert_parallel_consistent_procids< Elem >(), libMesh::MeshTools::libmesh_assert_parallel_consistent_procids< Node >(), libMesh::MeshTools::libmesh_assert_topology_consistent_procids< Node >(), libMesh::MeshTools::libmesh_assert_valid_boundary_ids(), libMesh::MeshTools::libmesh_assert_valid_dof_ids(), libMesh::MeshTools::libmesh_assert_valid_neighbors(), libMesh::MeshTools::libmesh_assert_valid_refinement_flags(), libMesh::DofMap::local_variable_indices(), libMesh::MeshRefinement::make_coarsening_compatible(), libMesh::MeshBase::partition(), libMesh::System::point_gradient(), libMesh::System::point_hessian(), libMesh::System::point_value(), libMesh::DofMap::prepare_send_list(), libMesh::DofMap::print_dof_constraints(), libMesh::NameBasedIO::read(), libMesh::Nemesis_IO::read(), libMesh::CheckpointIO::read(), libMesh::CheckpointIO::read_connectivity(), libMesh::XdrIO::read_header(), libMesh::CheckpointIO::read_nodes(), libMesh::System::read_parallel_data(), libMesh::System::read_SCALAR_dofs(), libMesh::System::read_serialized_blocked_dof_objects(), libMesh::System::read_serialized_vector(), libMesh::DistributedMesh::renumber_dof_objects(), OverlappingFunctorTest::run_partitioner_test(), libMesh::DofMap::scatter_constraints(), libMesh::DofMap::set_nonlocal_dof_objects(), libMesh::PetscDMWrapper::set_point_range_in_section(), CheckpointIOTest::testSplitter(), WriteVecAndScalar::testWrite(), libMesh::MeshRefinement::uniformly_coarsen(), libMesh::DistributedMesh::update_parallel_id_counts(), libMesh::GMVIO::write_binary(), libMesh::GMVIO::write_discontinuous_gmv(), libMesh::VTKIO::write_nodal_data(), libMesh::System::write_parallel_data(), libMesh::System::write_SCALAR_dofs(), libMesh::XdrIO::write_serialized_bcs_helper(), libMesh::System::write_serialized_blocked_dof_objects(), libMesh::XdrIO::write_serialized_connectivity(), libMesh::XdrIO::write_serialized_nodes(), and libMesh::XdrIO::write_serialized_nodesets().

◆ need_full_sparsity_pattern()

template<typename T>
virtual bool libMesh::SparseMatrix< T >::need_full_sparsity_pattern ( ) const
inlinevirtualinherited
Returns
true if this sparse matrix format needs to be fed the graph of the sparse matrix.

This is true for LaspackMatrix, but not PetscMatrix. In the case where the full graph is not required, we can efficiently approximate it to provide a good estimate of the required size of the sparse matrix.

Reimplemented in libMesh::EpetraMatrix< T >, and libMesh::LaspackMatrix< T >.

Definition at line 120 of file sparse_matrix.h.

121  { return false; }

Referenced by libMesh::DofMap::attach_matrix().

◆ operator()()

template<typename T >
T libMesh::PetscMatrix< T >::operator() ( const numeric_index_type  i,
const numeric_index_type  j 
) const
overridevirtual
Returns
A copy of matrix entry (i,j).
Note
This may be an expensive operation, and you should always be careful where you call this function.

Implements libMesh::SparseMatrix< T >.

Definition at line 1203 of file petsc_matrix.C.

1205 {
1206  libmesh_assert (this->initialized());
1207 
1208  // PETSc 2.2.1 & newer
1209  const PetscScalar * petsc_row;
1210  const PetscInt * petsc_cols;
1211 
1212  // If the entry is not in the sparse matrix, it is 0.
1213  T value=0.;
1214 
1215  PetscErrorCode
1216  ierr=0;
1217  PetscInt
1218  ncols=0,
1219  i_val=static_cast<PetscInt>(i_in),
1220  j_val=static_cast<PetscInt>(j_in);
1221 
1222 
1223  // the matrix needs to be closed for this to work
1224  // this->close();
1225  // but closing it is a semiparallel operation; we want operator()
1226  // to run on one processor.
1227  libmesh_assert(this->closed());
1228 
1229  ierr = MatGetRow(_mat, i_val, &ncols, &petsc_cols, &petsc_row);
1230  LIBMESH_CHKERR(ierr);
1231 
1232  // Perform a binary search to find the contiguous index in
1233  // petsc_cols (resp. petsc_row) corresponding to global index j_val
1234  std::pair<const PetscInt *, const PetscInt *> p =
1235  std::equal_range (petsc_cols, petsc_cols + ncols, j_val);
1236 
1237  // Found an entry for j_val
1238  if (p.first != p.second)
1239  {
1240  // The entry in the contiguous row corresponding
1241  // to the j_val column of interest
1242  const std::size_t j =
1243  std::distance (const_cast<PetscInt *>(petsc_cols),
1244  const_cast<PetscInt *>(p.first));
1245 
1246  libmesh_assert_less (j, ncols);
1247  libmesh_assert_equal_to (petsc_cols[j], j_val);
1248 
1249  value = static_cast<T> (petsc_row[j]);
1250  }
1251 
1252  ierr = MatRestoreRow(_mat, i_val,
1253  &ncols, &petsc_cols, &petsc_row);
1254  LIBMESH_CHKERR(ierr);
1255 
1256  return value;
1257 }

◆ operator=() [1/2]

template<typename T>
PetscMatrix& libMesh::PetscMatrix< T >::operator= ( const PetscMatrix< T > &  )
delete

◆ operator=() [2/2]

template<typename T>
PetscMatrix& libMesh::PetscMatrix< T >::operator= ( PetscMatrix< T > &&  )
delete

◆ print() [1/2]

template<>
void libMesh::SparseMatrix< Complex >::print ( std::ostream &  os,
const bool  sparse 
) const
inherited

Definition at line 96 of file sparse_matrix.C.

97 {
98  // std::complex<>::operator<<() is defined, but use this form
99 
100  if (sparse)
101  {
102  libmesh_not_implemented();
103  }
104 
105  os << "Real part:" << std::endl;
106  for (auto i : IntRange<numeric_index_type>(0, this->m()))
107  {
108  for (auto j : IntRange<numeric_index_type>(0, this->n()))
109  os << std::setw(8) << (*this)(i,j).real() << " ";
110  os << std::endl;
111  }
112 
113  os << std::endl << "Imaginary part:" << std::endl;
114  for (auto i : IntRange<numeric_index_type>(0, this->m()))
115  {
116  for (auto j : IntRange<numeric_index_type>(0, this->n()))
117  os << std::setw(8) << (*this)(i,j).imag() << " ";
118  os << std::endl;
119  }
120 }

◆ print() [2/2]

template<typename T >
void libMesh::SparseMatrix< T >::print ( std::ostream &  os = libMesh::out,
const bool  sparse = false 
) const
inherited

Print the contents of the matrix to the screen in a uniform style, regardless of matrix/solver package being used.

Definition at line 200 of file sparse_matrix.C.

201 {
202  parallel_object_only();
203 
204  libmesh_assert (this->initialized());
205 
206  if (!this->_dof_map)
207  libmesh_error_msg("Error! Trying to print a matrix with no dof_map set!");
208 
209  // We'll print the matrix from processor 0 to make sure
210  // it's serialized properly
211  if (this->processor_id() == 0)
212  {
213  libmesh_assert_equal_to (this->_dof_map->first_dof(), 0);
214  for (numeric_index_type i=this->_dof_map->first_dof();
215  i!=this->_dof_map->end_dof(); ++i)
216  {
217  if (sparse)
218  {
219  for (auto j : IntRange<numeric_index_type>(0, this->n()))
220  {
221  T c = (*this)(i,j);
222  if (c != static_cast<T>(0.0))
223  {
224  os << i << " " << j << " " << c << std::endl;
225  }
226  }
227  }
228  else
229  {
230  for (auto j : IntRange<numeric_index_type>(0, this->n()))
231  os << (*this)(i,j) << " ";
232  os << std::endl;
233  }
234  }
235 
236  std::vector<numeric_index_type> ibuf, jbuf;
237  std::vector<T> cbuf;
238  numeric_index_type currenti = this->_dof_map->end_dof();
239  for (auto p : IntRange<processor_id_type>(1, this->n_processors()))
240  {
241  this->comm().receive(p, ibuf);
242  this->comm().receive(p, jbuf);
243  this->comm().receive(p, cbuf);
244  libmesh_assert_equal_to (ibuf.size(), jbuf.size());
245  libmesh_assert_equal_to (ibuf.size(), cbuf.size());
246 
247  if (ibuf.empty())
248  continue;
249  libmesh_assert_greater_equal (ibuf.front(), currenti);
250  libmesh_assert_greater_equal (ibuf.back(), ibuf.front());
251 
252  std::size_t currentb = 0;
253  for (;currenti <= ibuf.back(); ++currenti)
254  {
255  if (sparse)
256  {
257  for (numeric_index_type j=0; j<this->n(); j++)
258  {
259  if (currentb < ibuf.size() &&
260  ibuf[currentb] == currenti &&
261  jbuf[currentb] == j)
262  {
263  os << currenti << " " << j << " " << cbuf[currentb] << std::endl;
264  currentb++;
265  }
266  }
267  }
268  else
269  {
270  for (auto j : IntRange<numeric_index_type>(0, this->n()))
271  {
272  if (currentb < ibuf.size() &&
273  ibuf[currentb] == currenti &&
274  jbuf[currentb] == j)
275  {
276  os << cbuf[currentb] << " ";
277  currentb++;
278  }
279  else
280  os << static_cast<T>(0.0) << " ";
281  }
282  os << std::endl;
283  }
284  }
285  }
286  if (!sparse)
287  {
288  for (; currenti != this->m(); ++currenti)
289  {
290  for (numeric_index_type j=0; j<this->n(); j++)
291  os << static_cast<T>(0.0) << " ";
292  os << std::endl;
293  }
294  }
295  }
296  else
297  {
298  std::vector<numeric_index_type> ibuf, jbuf;
299  std::vector<T> cbuf;
300 
301  // We'll assume each processor has access to entire
302  // matrix rows, so (*this)(i,j) is valid if i is a local index.
303  for (numeric_index_type i=this->_dof_map->first_dof();
304  i!=this->_dof_map->end_dof(); ++i)
305  {
306  for (auto j : IntRange<numeric_index_type>(0, this->n()))
307  {
308  T c = (*this)(i,j);
309  if (c != static_cast<T>(0.0))
310  {
311  ibuf.push_back(i);
312  jbuf.push_back(j);
313  cbuf.push_back(c);
314  }
315  }
316  }
317  this->comm().send(0,ibuf);
318  this->comm().send(0,jbuf);
319  this->comm().send(0,cbuf);
320  }
321 }

Referenced by libMesh::EigenSparseMatrix< T >::print_personal(), and libMesh::LaspackMatrix< T >::print_personal().

◆ print_info()

void libMesh::ReferenceCounter::print_info ( std::ostream &  out = libMesh::out)
staticinherited

Prints the reference information, by default to libMesh::out.

Definition at line 87 of file reference_counter.C.

88 {
90  out_stream << ReferenceCounter::get_info();
91 }

References libMesh::ReferenceCounter::_enable_print_counter, and libMesh::ReferenceCounter::get_info().

◆ print_matlab()

template<typename T >
void libMesh::PetscMatrix< T >::print_matlab ( const std::string &  = "") const
overridevirtual

Print the contents of the matrix in Matlab's sparse matrix format.

Optionally prints the matrix to the file named name. If name is not specified it is dumped to the screen.

Create an ASCII file containing the matrix if a filename was provided.

Otherwise the matrix will be dumped to the screen.

Destroy the viewer.

Reimplemented from libMesh::SparseMatrix< T >.

Definition at line 624 of file petsc_matrix.C.

625 {
626  libmesh_assert (this->initialized());
627 
628  semiparallel_only();
629 
630  if (!this->closed())
631  {
632  libmesh_deprecated();
633  libmesh_warning("The matrix must be assembled before calling PetscMatrix::print_matlab().\n"
634  "Please update your code, as this warning will become an error in a future release.");
635  const_cast<PetscMatrix<T> *>(this)->close();
636  }
637 
638  PetscErrorCode ierr=0;
639  PetscViewer petsc_viewer;
640 
641 
642  ierr = PetscViewerCreate (this->comm().get(),
643  &petsc_viewer);
644  LIBMESH_CHKERR(ierr);
645 
650  if (name != "")
651  {
652  ierr = PetscViewerASCIIOpen( this->comm().get(),
653  name.c_str(),
654  &petsc_viewer);
655  LIBMESH_CHKERR(ierr);
656 
657 #if PETSC_VERSION_LESS_THAN(3,7,0)
658  ierr = PetscViewerSetFormat (petsc_viewer,
659  PETSC_VIEWER_ASCII_MATLAB);
660 #else
661  ierr = PetscViewerPushFormat (petsc_viewer,
662  PETSC_VIEWER_ASCII_MATLAB);
663 #endif
664 
665  LIBMESH_CHKERR(ierr);
666 
667  ierr = MatView (_mat, petsc_viewer);
668  LIBMESH_CHKERR(ierr);
669  }
670 
674  else
675  {
676 #if PETSC_VERSION_LESS_THAN(3,7,0)
677  ierr = PetscViewerSetFormat (PETSC_VIEWER_STDOUT_WORLD,
678  PETSC_VIEWER_ASCII_MATLAB);
679 #else
680  ierr = PetscViewerPushFormat (PETSC_VIEWER_STDOUT_WORLD,
681  PETSC_VIEWER_ASCII_MATLAB);
682 #endif
683 
684  LIBMESH_CHKERR(ierr);
685 
686  ierr = MatView (_mat, PETSC_VIEWER_STDOUT_WORLD);
687  LIBMESH_CHKERR(ierr);
688  }
689 
690 
694  ierr = LibMeshPetscViewerDestroy (&petsc_viewer);
695  LIBMESH_CHKERR(ierr);
696 }

◆ print_personal()

template<typename T >
void libMesh::PetscMatrix< T >::print_personal ( std::ostream &  os = libMesh::out) const
overridevirtual

Print the contents of the matrix to the screen with the PETSc viewer.

This function only allows printing to standard out since we have limited ourselves to one PETSc implementation for writing.

Implements libMesh::SparseMatrix< T >.

Definition at line 703 of file petsc_matrix.C.

704 {
705  libmesh_assert (this->initialized());
706 
707  // Routine must be called in parallel on parallel matrices
708  // and serial on serial matrices.
709  semiparallel_only();
710 
711  // #ifndef NDEBUG
712  // if (os != std::cout)
713  // libMesh::err << "Warning! PETSc can only print to std::cout!" << std::endl;
714  // #endif
715 
716  // Matrix must be in an assembled state to be printed
717  if (!this->closed())
718  {
719  libmesh_deprecated();
720  libmesh_warning("The matrix must be assembled before calling PetscMatrix::print_personal().\n"
721  "Please update your code, as this warning will become an error in a future release.");
722  const_cast<PetscMatrix<T> *>(this)->close();
723  }
724 
725  PetscErrorCode ierr=0;
726 
727  // Print to screen if ostream is stdout
728  if (os.rdbuf() == std::cout.rdbuf())
729  {
730  ierr = MatView(_mat, PETSC_VIEWER_STDOUT_SELF);
731  LIBMESH_CHKERR(ierr);
732  }
733 
734  // Otherwise, print to the requested file, in a roundabout way...
735  else
736  {
737  // We will create a temporary filename, and file, for PETSc to
738  // write to.
739  std::string temp_filename;
740 
741  {
742  // Template for temporary filename
743  char c[] = "temp_petsc_matrix.XXXXXX";
744 
745  // Generate temporary, unique filename only on processor 0. We will
746  // use this filename for PetscViewerASCIIOpen, before copying it into
747  // the user's stream
748  if (this->processor_id() == 0)
749  {
750  int fd = mkstemp(c);
751 
752  // Check to see that mkstemp did not fail.
753  if (fd == -1)
754  libmesh_error_msg("mkstemp failed in PetscMatrix::print_personal()");
755 
756  // mkstemp returns a file descriptor for an open file,
757  // so let's close it before we hand it to PETSc!
758  ::close (fd);
759  }
760 
761  // Store temporary filename as string, makes it easier to broadcast
762  temp_filename = c;
763  }
764 
765  // Now broadcast the filename from processor 0 to all processors.
766  this->comm().broadcast(temp_filename);
767 
768  // PetscViewer object for passing to MatView
769  PetscViewer petsc_viewer;
770 
771  // This PETSc function only takes a string and handles the opening/closing
772  // of the file internally. Since print_personal() takes a reference to
773  // an ostream, we have to do an extra step... print_personal() should probably
774  // have a version that takes a string to get rid of this problem.
775  ierr = PetscViewerASCIIOpen( this->comm().get(),
776  temp_filename.c_str(),
777  &petsc_viewer);
778  LIBMESH_CHKERR(ierr);
779 
780  // Probably don't need to set the format if it's default...
781  // ierr = PetscViewerSetFormat (petsc_viewer,
782  // PETSC_VIEWER_DEFAULT);
783  // LIBMESH_CHKERR(ierr);
784 
785  // Finally print the matrix using the viewer
786  ierr = MatView (_mat, petsc_viewer);
787  LIBMESH_CHKERR(ierr);
788 
789  if (this->processor_id() == 0)
790  {
791  // Now the inefficient bit: open temp_filename as an ostream and copy the contents
792  // into the user's desired ostream. We can't just do a direct file copy, we don't even have the filename!
793  std::ifstream input_stream(temp_filename.c_str());
794  os << input_stream.rdbuf(); // The "most elegant" way to copy one stream into another.
795  // os.close(); // close not defined in ostream
796 
797  // Now remove the temporary file
798  input_stream.close();
799  std::remove(temp_filename.c_str());
800  }
801  }
802 }

◆ processor_id()

processor_id_type libMesh::ParallelObject::processor_id ( ) const
inlineinherited
Returns
The rank of this processor in the group.

Definition at line 106 of file parallel_object.h.

107  { return cast_int<processor_id_type>(_communicator.rank()); }

References libMesh::ParallelObject::_communicator.

Referenced by libMesh::BoundaryInfo::_find_id_maps(), libMesh::EquationSystems::_read_impl(), libMesh::PetscDMWrapper::add_dofs_to_section(), libMesh::DistributedMesh::add_elem(), libMesh::BoundaryInfo::add_elements(), libMesh::DofMap::add_neighbors_to_send_list(), libMesh::DistributedMesh::add_node(), libMesh::UnstructuredMesh::all_second_order(), libMesh::MeshTools::Modification::all_tri(), libMesh::DofMap::allgather_recursive_constraints(), libMesh::FEMSystem::assembly(), libMesh::Nemesis_IO_Helper::build_element_and_node_maps(), libMesh::InfElemBuilder::build_inf_elem(), libMesh::BoundaryInfo::build_node_list_from_side_list(), libMesh::EquationSystems::build_parallel_elemental_solution_vector(), libMesh::DistributedMesh::clear(), libMesh::ExodusII_IO_Helper::close(), libMesh::Nemesis_IO_Helper::compute_border_node_ids(), libMesh::Nemesis_IO_Helper::compute_communication_map_parameters(), libMesh::Nemesis_IO_Helper::compute_internal_and_border_elems_and_internal_nodes(), libMesh::RBConstruction::compute_max_error_bound(), libMesh::Nemesis_IO_Helper::compute_node_communication_maps(), libMesh::Nemesis_IO_Helper::compute_num_global_elem_blocks(), libMesh::Nemesis_IO_Helper::compute_num_global_nodesets(), libMesh::Nemesis_IO_Helper::compute_num_global_sidesets(), libMesh::Nemesis_IO_Helper::construct_nemesis_filename(), libMesh::ExodusII_IO::copy_scalar_solution(), libMesh::MeshTools::correct_node_proc_ids(), libMesh::ExodusII_IO_Helper::create(), libMesh::DistributedMesh::delete_elem(), libMesh::DistributedMesh::delete_node(), libMesh::MeshCommunication::delete_remote_elements(), libMesh::DofMap::distribute_dofs(), libMesh::DofMap::distribute_local_dofs_node_major(), libMesh::DofMap::distribute_local_dofs_var_major(), libMesh::DistributedMesh::DistributedMesh(), libMesh::DofMap::end_dof(), libMesh::DofMap::end_old_dof(), libMesh::EnsightIO::EnsightIO(), libMesh::RBEIMConstruction::evaluate_mesh_function(), libMesh::MeshFunction::find_element(), libMesh::MeshFunction::find_elements(), libMesh::UnstructuredMesh::find_neighbors(), libMesh::DofMap::first_dof(), libMesh::DofMap::first_old_dof(), libMesh::Nemesis_IO_Helper::get_cmap_params(), libMesh::Nemesis_IO_Helper::get_eb_info_global(), libMesh::Nemesis_IO_Helper::get_elem_cmap(), libMesh::Nemesis_IO_Helper::get_elem_map(), libMesh::DofMap::get_info(), libMesh::Nemesis_IO_Helper::get_init_global(), libMesh::Nemesis_IO_Helper::get_init_info(), libMesh::Nemesis_IO_Helper::get_loadbal_param(), libMesh::DofMap::get_local_constraints(), libMesh::Nemesis_IO_Helper::get_node_cmap(), libMesh::Nemesis_IO_Helper::get_node_map(), libMesh::Nemesis_IO_Helper::get_ns_param_global(), libMesh::Nemesis_IO_Helper::get_ss_param_global(), libMesh::SparsityPattern::Build::handle_vi_vj(), libMesh::SystemSubsetBySubdomain::init(), libMesh::PetscDMWrapper::init_and_attach_petscdm(), HeatSystem::init_data(), libMesh::ExodusII_IO_Helper::initialize(), libMesh::ExodusII_IO_Helper::initialize_element_variables(), libMesh::ExodusII_IO_Helper::initialize_global_variables(), libMesh::ExodusII_IO_Helper::initialize_nodal_variables(), libMesh::DistributedMesh::insert_elem(), libMesh::DofMap::is_evaluable(), libMesh::SparsityPattern::Build::join(), libMesh::DofMap::last_dof(), libMesh::TransientRBEvaluation::legacy_write_offline_data_to_files(), libMesh::RBEIMEvaluation::legacy_write_offline_data_to_files(), libMesh::RBEvaluation::legacy_write_offline_data_to_files(), libMesh::RBSCMEvaluation::legacy_write_offline_data_to_files(), libMesh::RBEIMEvaluation::legacy_write_out_interpolation_points_elem(), libMesh::MeshTools::libmesh_assert_consistent_distributed(), libMesh::MeshTools::libmesh_assert_consistent_distributed_nodes(), libMesh::MeshTools::libmesh_assert_contiguous_dof_ids(), libMesh::MeshTools::libmesh_assert_parallel_consistent_procids< Elem >(), libMesh::MeshTools::libmesh_assert_valid_neighbors(), libMesh::DistributedMesh::libmesh_assert_valid_parallel_object_ids(), libMesh::DofMap::local_variable_indices(), main(), libMesh::MeshRefinement::make_coarsening_compatible(), AugmentSparsityOnInterface::mesh_reinit(), libMesh::MeshBase::n_active_local_elem(), libMesh::BoundaryInfo::n_boundary_conds(), libMesh::BoundaryInfo::n_edge_conds(), libMesh::DofMap::n_local_dofs(), libMesh::System::n_local_dofs(), libMesh::MeshBase::n_local_elem(), libMesh::MeshBase::n_local_nodes(), libMesh::BoundaryInfo::n_nodeset_conds(), libMesh::BoundaryInfo::n_shellface_conds(), libMesh::SparsityPattern::Build::operator()(), libMesh::DistributedMesh::own_node(), libMesh::System::point_gradient(), libMesh::System::point_hessian(), libMesh::System::point_value(), libMesh::DofMap::print_dof_constraints(), libMesh::Nemesis_IO_Helper::put_cmap_params(), libMesh::Nemesis_IO_Helper::put_elem_cmap(), libMesh::Nemesis_IO_Helper::put_elem_map(), libMesh::Nemesis_IO_Helper::put_loadbal_param(), libMesh::Nemesis_IO_Helper::put_node_cmap(), libMesh::Nemesis_IO_Helper::put_node_map(), libMesh::NameBasedIO::read(), libMesh::Nemesis_IO::read(), libMesh::XdrIO::read(), libMesh::CheckpointIO::read(), libMesh::ExodusII_IO_Helper::read_elem_num_map(), libMesh::ExodusII_IO_Helper::read_global_values(), libMesh::CheckpointIO::read_header(), libMesh::XdrIO::read_header(), libMesh::System::read_header(), libMesh::RBEvaluation::read_in_vectors_from_multiple_files(), libMesh::System::read_legacy_data(), libMesh::ExodusII_IO_Helper::read_node_num_map(), libMesh::System::read_parallel_data(), libMesh::TransientRBConstruction::read_riesz_representors_from_files(), libMesh::RBConstruction::read_riesz_representors_from_files(), libMesh::System::read_SCALAR_dofs(), libMesh::XdrIO::read_serialized_bc_names(), libMesh::XdrIO::read_serialized_bcs_helper(), libMesh::System::read_serialized_blocked_dof_objects(), libMesh::XdrIO::read_serialized_connectivity(), libMesh::System::read_serialized_data(), libMesh::XdrIO::read_serialized_nodes(), libMesh::XdrIO::read_serialized_nodesets(), libMesh::XdrIO::read_serialized_subdomain_names(), libMesh::System::read_serialized_vector(), libMesh::System::read_serialized_vectors(), libMesh::DistributedMesh::renumber_dof_objects(), libMesh::DofMap::scatter_constraints(), libMesh::CheckpointIO::select_split_config(), libMesh::DofMap::set_nonlocal_dof_objects(), libMesh::PetscDMWrapper::set_point_range_in_section(), libMesh::LaplaceMeshSmoother::smooth(), DefaultCouplingTest::testCoupling(), PointNeighborCouplingTest::testCoupling(), MeshInputTest::testDynaReadElem(), MeshInputTest::testDynaReadPatch(), MeshInputTest::testExodusCopyElementSolution(), MeshInputTest::testExodusWriteElementDataFromDiscontinuousNodalData(), SystemsTest::testProjectMatrix1D(), SystemsTest::testProjectMatrix2D(), SystemsTest::testProjectMatrix3D(), BoundaryInfoTest::testShellFaceConstraints(), CheckpointIOTest::testSplitter(), WriteVecAndScalar::testWrite(), libMesh::MeshTools::total_weight(), libMesh::MeshRefinement::uniformly_coarsen(), libMesh::Parallel::Packing< Node * >::unpack(), libMesh::Parallel::Packing< Elem * >::unpack(), libMesh::DistributedMesh::update_parallel_id_counts(), libMesh::DTKAdapter::update_variable_values(), libMesh::NameBasedIO::write(), libMesh::XdrIO::write(), libMesh::CheckpointIO::write(), libMesh::EquationSystems::write(), libMesh::GMVIO::write_discontinuous_gmv(), libMesh::ExodusII_IO::write_element_data(), libMesh::ExodusII_IO_Helper::write_element_values(), libMesh::ExodusII_IO_Helper::write_element_values_element_major(), libMesh::ExodusII_IO_Helper::write_elements(), libMesh::ExodusII_IO::write_global_data(), libMesh::ExodusII_IO_Helper::write_global_values(), libMesh::System::write_header(), libMesh::ExodusII_IO::write_information_records(), libMesh::ExodusII_IO_Helper::write_information_records(), libMesh::ExodusII_IO_Helper::write_nodal_coordinates(), libMesh::VTKIO::write_nodal_data(), libMesh::UCDIO::write_nodal_data(), libMesh::ExodusII_IO::write_nodal_data(), libMesh::ExodusII_IO::write_nodal_data_discontinuous(), libMesh::ExodusII_IO_Helper::write_nodal_values(), libMesh::Nemesis_IO_Helper::write_nodesets(), libMesh::ExodusII_IO_Helper::write_nodesets(), libMesh::RBEvaluation::write_out_vectors(), write_output_solvedata(), libMesh::System::write_parallel_data(), libMesh::RBConstruction::write_riesz_representors_to_files(), libMesh::System::write_SCALAR_dofs(), libMesh::XdrIO::write_serialized_bc_names(), libMesh::XdrIO::write_serialized_bcs_helper(), libMesh::System::write_serialized_blocked_dof_objects(), libMesh::XdrIO::write_serialized_connectivity(), libMesh::System::write_serialized_data(), libMesh::XdrIO::write_serialized_nodes(), libMesh::XdrIO::write_serialized_nodesets(), libMesh::XdrIO::write_serialized_subdomain_names(), libMesh::System::write_serialized_vector(), libMesh::System::write_serialized_vectors(), libMesh::ExodusII_IO_Helper::write_sideset_data(), libMesh::Nemesis_IO_Helper::write_sidesets(), libMesh::ExodusII_IO_Helper::write_sidesets(), libMesh::ExodusII_IO::write_timestep(), libMesh::ExodusII_IO_Helper::write_timestep(), and libMesh::ExodusII_IO::write_timestep_discontinuous().

◆ reinit_submatrix()

template<typename T>
virtual void libMesh::SparseMatrix< T >::reinit_submatrix ( SparseMatrix< T > &  submatrix,
const std::vector< numeric_index_type > &  rows,
const std::vector< numeric_index_type > &  cols 
) const
inlinevirtualinherited

This function is similar to the one above, but it allows you to reuse the existing sparsity pattern of "submatrix" instead of reallocating it again.

This should hopefully be more efficient if you are frequently extracting submatrices of the same size.

Definition at line 374 of file sparse_matrix.h.

377  {
378  this->_get_submatrix(submatrix,
379  rows,
380  cols,
381  true); // true means REUSE submatrix
382  }

◆ reset_preallocation()

template<typename T >
void libMesh::PetscMatrix< T >::reset_preallocation ( )

Reset matrix to use the original nonzero pattern provided by users.

Definition at line 492 of file petsc_matrix.C.

493 {
494 #if !PETSC_VERSION_LESS_THAN(3,9,0)
495  libmesh_assert (this->initialized());
496 
497  auto ierr = MatResetPreallocation(_mat);
498  LIBMESH_CHKERR(ierr);
499 #else
500  libmesh_warning("Your version of PETSc doesn't support resetting of "
501  "preallocation, so we will use your most recent sparsity "
502  "pattern. This may result in a degradation of performance\n");
503 #endif
504 }

◆ row_start()

template<typename T >
numeric_index_type libMesh::PetscMatrix< T >::row_start ( ) const
overridevirtual
Returns
The index of the first matrix row stored on this processor.

Implements libMesh::SparseMatrix< T >.

Definition at line 1093 of file petsc_matrix.C.

1094 {
1095  libmesh_assert (this->initialized());
1096 
1097  PetscInt start=0, stop=0;
1098  PetscErrorCode ierr=0;
1099 
1100  ierr = MatGetOwnershipRange(_mat, &start, &stop);
1101  LIBMESH_CHKERR(ierr);
1102 
1103  return static_cast<numeric_index_type>(start);
1104 }

◆ row_stop()

template<typename T >
numeric_index_type libMesh::PetscMatrix< T >::row_stop ( ) const
overridevirtual
Returns
The index of the last matrix row (+1) stored on this processor.

Implements libMesh::SparseMatrix< T >.

Definition at line 1109 of file petsc_matrix.C.

1110 {
1111  libmesh_assert (this->initialized());
1112 
1113  PetscInt start=0, stop=0;
1114  PetscErrorCode ierr=0;
1115 
1116  ierr = MatGetOwnershipRange(_mat, &start, &stop);
1117  LIBMESH_CHKERR(ierr);
1118 
1119  return static_cast<numeric_index_type>(stop);
1120 }

◆ set()

template<typename T>
void libMesh::PetscMatrix< T >::set ( const numeric_index_type  i,
const numeric_index_type  j,
const T  value 
)
overridevirtual

Set the element (i,j) to value.

Throws an error if the entry does not exist. Zero values can be "stored" in non-existent fields.

Implements libMesh::SparseMatrix< T >.

Definition at line 1125 of file petsc_matrix.C.

1128 {
1129  libmesh_assert (this->initialized());
1130 
1131  PetscErrorCode ierr=0;
1132  PetscInt i_val=i, j_val=j;
1133 
1134  PetscScalar petsc_value = static_cast<PetscScalar>(value);
1135  ierr = MatSetValues(_mat, 1, &i_val, 1, &j_val,
1136  &petsc_value, INSERT_VALUES);
1137  LIBMESH_CHKERR(ierr);
1138 }

◆ set_destroy_mat_on_exit()

template<typename T >
void libMesh::PetscMatrix< T >::set_destroy_mat_on_exit ( bool  destroy = true)
virtual

If set to false, we don't delete the Mat on destruction and allow instead for PETSc to manage it.

Definition at line 1331 of file petsc_matrix.C.

1332 {
1333  this->_destroy_mat_on_exit = destroy;
1334 }

◆ set_matrix_type()

template<typename T >
void libMesh::PetscMatrix< T >::set_matrix_type ( PetscMatrixType  mat_type)

Definition at line 123 of file petsc_matrix.C.

124 {
125  _mat_type = mat_type;
126 }

◆ swap()

template<typename T>
void libMesh::PetscMatrix< T >::swap ( PetscMatrix< T > &  m_in)

Swaps the internal data pointers of two PetscMatrices, no actual values are swapped.

Definition at line 1338 of file petsc_matrix.C.

1339 {
1340  std::swap(_mat, m_in._mat);
1342 }

Referenced by libMesh::__libmesh_petsc_diff_solver_jacobian().

◆ update_preallocation_and_zero()

template<typename T >
void libMesh::PetscMatrix< T >::update_preallocation_and_zero ( )

Update the sparsity pattern based on dof_map, and set the matrix to zero.

This is useful in cases where the sparsity pattern changes during a computation.

Definition at line 486 of file petsc_matrix.C.

487 {
488  libmesh_not_implemented();
489 }

◆ update_sparsity_pattern()

template<typename T>
virtual void libMesh::SparseMatrix< T >::update_sparsity_pattern ( const SparsityPattern::Graph )
inlinevirtualinherited

Updates the matrix sparsity pattern.

When your SparseMatrix<T> implementation does not need this data, simply do not override this method.

Reimplemented in libMesh::EpetraMatrix< T >, and libMesh::LaspackMatrix< T >.

Definition at line 128 of file sparse_matrix.h.

128 {}

Referenced by libMesh::DofMap::attach_matrix().

◆ vector_mult()

template<typename T>
void libMesh::SparseMatrix< T >::vector_mult ( NumericVector< T > &  dest,
const NumericVector< T > &  arg 
) const
inherited

◆ vector_mult_add()

template<typename T>
void libMesh::SparseMatrix< T >::vector_mult_add ( NumericVector< T > &  dest,
const NumericVector< T > &  arg 
) const
inherited

Multiplies the matrix by the NumericVector arg and adds the result to the NumericVector dest.

Definition at line 180 of file sparse_matrix.C.

182 {
183  /* This functionality is actually implemented in the \p
184  NumericVector class. */
185  dest.add_vector(arg,*this);
186 }

Referenced by libMesh::ImplicitSystem::weighted_sensitivity_adjoint_solve().

◆ zero()

template<typename T >
void libMesh::PetscMatrix< T >::zero ( )
overridevirtual

Set all entries to 0.

Implements libMesh::SparseMatrix< T >.

Definition at line 507 of file petsc_matrix.C.

508 {
509  libmesh_assert (this->initialized());
510 
511  semiparallel_only();
512 
513  PetscErrorCode ierr=0;
514 
515  PetscInt m_l, n_l;
516 
517  ierr = MatGetLocalSize(_mat,&m_l,&n_l);
518  LIBMESH_CHKERR(ierr);
519 
520  if (n_l)
521  {
522  ierr = MatZeroEntries(_mat);
523  LIBMESH_CHKERR(ierr);
524  }
525 }

◆ zero_rows()

template<typename T>
void libMesh::PetscMatrix< T >::zero_rows ( std::vector< numeric_index_type > &  rows,
diag_value = 0.0 
)
overridevirtual

Sets all row entries to 0 then puts diag_value in the diagonal entry.

Reimplemented from libMesh::SparseMatrix< T >.

Definition at line 528 of file petsc_matrix.C.

529 {
530  libmesh_assert (this->initialized());
531 
532  semiparallel_only();
533 
534  PetscErrorCode ierr=0;
535 
536 #if PETSC_RELEASE_LESS_THAN(3,1,1)
537  if (!rows.empty())
538  ierr = MatZeroRows(_mat, rows.size(),
539  numeric_petsc_cast(rows.data()), diag_value);
540  else
541  ierr = MatZeroRows(_mat, 0, NULL, diag_value);
542 #else
543  // As of petsc-dev at the time of 3.1.0, MatZeroRows now takes two additional
544  // optional arguments. The optional arguments (x,b) can be used to specify the
545  // solutions for the zeroed rows (x) and right hand side (b) to update.
546  // Could be useful for setting boundary conditions...
547  if (!rows.empty())
548  ierr = MatZeroRows(_mat, cast_int<PetscInt>(rows.size()),
549  numeric_petsc_cast(rows.data()), PS(diag_value),
550  NULL, NULL);
551  else
552  ierr = MatZeroRows(_mat, 0, NULL, PS(diag_value), NULL,
553  NULL);
554 #endif
555 
556  LIBMESH_CHKERR(ierr);
557 }

Member Data Documentation

◆ _communicator

const Parallel::Communicator& libMesh::ParallelObject::_communicator
protectedinherited

◆ _counts

ReferenceCounter::Counts libMesh::ReferenceCounter::_counts
staticprotectedinherited

◆ _destroy_mat_on_exit

template<typename T>
bool libMesh::PetscMatrix< T >::_destroy_mat_on_exit
private

This boolean value should only be set to false for the constructor which takes a PETSc Mat object.

Definition at line 314 of file petsc_matrix.h.

Referenced by libMesh::PetscMatrix< libMesh::Number >::swap().

◆ _dof_map

template<typename T>
const DofMap* libMesh::SparseMatrix< T >::_dof_map
protectedinherited

The DofMap object associated with this object.

Definition at line 443 of file sparse_matrix.h.

Referenced by libMesh::SparseMatrix< ValOut >::attach_dof_map().

◆ _enable_print_counter

bool libMesh::ReferenceCounter::_enable_print_counter = true
staticprotectedinherited

Flag to control whether reference count information is printed when print_info is called.

Definition at line 141 of file reference_counter.h.

Referenced by libMesh::ReferenceCounter::disable_print_counter_info(), libMesh::ReferenceCounter::enable_print_counter_info(), and libMesh::ReferenceCounter::print_info().

◆ _is_initialized

template<typename T>
bool libMesh::SparseMatrix< T >::_is_initialized
protectedinherited

◆ _mat

template<typename T>
Mat libMesh::PetscMatrix< T >::_mat
private

◆ _mat_type

template<typename T>
PetscMatrixType libMesh::PetscMatrix< T >::_mat_type
private

Definition at line 316 of file petsc_matrix.h.

◆ _mutex

Threads::spin_mutex libMesh::ReferenceCounter::_mutex
staticprotectedinherited

Mutual exclusion object to enable thread-safe reference counting.

Definition at line 135 of file reference_counter.h.

◆ _n_objects

Threads::atomic< unsigned int > libMesh::ReferenceCounter::_n_objects
staticprotectedinherited

The number of objects.

Print the reference count information when the number returns to 0.

Definition at line 130 of file reference_counter.h.

Referenced by libMesh::ReferenceCounter::n_objects(), libMesh::ReferenceCounter::ReferenceCounter(), and libMesh::ReferenceCounter::~ReferenceCounter().

◆ _petsc_matrix_mutex [1/2]

template<typename T>
std::mutex libMesh::PetscMatrix< T >::_petsc_matrix_mutex
mutableprivate

Definition at line 319 of file petsc_matrix.h.

◆ _petsc_matrix_mutex [2/2]

template<typename T>
Threads::spin_mutex libMesh::PetscMatrix< T >::_petsc_matrix_mutex
mutableprivate

Definition at line 321 of file petsc_matrix.h.


The documentation for this class was generated from the following files:
libMesh::PetscMatrix::clear
virtual void clear() override
Restores the SparseMatrix<T> to a pristine state.
Definition: petsc_matrix.C:560
libMesh::PETSC_SOLVERS
Definition: enum_solver_package.h:36
libMesh::DofMap::n_dofs
dof_id_type n_dofs() const
Definition: dof_map.h:625
libMesh::DofMap::get_n_oz
const std::vector< dof_id_type > & get_n_oz() const
Definition: dof_map.h:518
libMesh::AIJ
Definition: petsc_matrix.h:73
libMesh::index_range
IntRange< std::size_t > index_range(const std::vector< T > &vec)
Helper function that returns an IntRange<std::size_t> representing all the indices of the passed-in v...
Definition: int_range.h:106
libMesh::PetscMatrix::mat
Mat mat()
Definition: petsc_matrix.h:281
libMesh::SparseMatrix::initialized
virtual bool initialized() const
Definition: sparse_matrix.h:103
libMesh::pPS
PetscScalar * pPS(T *ptr)
Definition: petsc_macro.h:174
libMesh::ReferenceCounter::_counts
static Counts _counts
Actually holds the data.
Definition: reference_counter.h:122
libMesh::ParallelObject::comm
const Parallel::Communicator & comm() const
Definition: parallel_object.h:94
libMesh::SparseMatrix::_dof_map
const DofMap * _dof_map
The DofMap object associated with this object.
Definition: sparse_matrix.h:443
libMesh::ReferenceCounter::_n_objects
static Threads::atomic< unsigned int > _n_objects
The number of objects.
Definition: reference_counter.h:130
libMesh::DenseMatrixBase::n
unsigned int n() const
Definition: dense_matrix_base.h:109
libMesh::DenseMatrix::get_values
std::vector< T > & get_values()
Definition: dense_matrix.h:371
libMesh::DofMap::first_dof
dof_id_type first_dof(const processor_id_type proc) const
Definition: dof_map.h:650
libMesh::ierr
ierr
Definition: petsc_dm_wrapper.C:72
libMesh::SparseMatrix::clear
virtual void clear()=0
Restores the SparseMatrix<T> to a pristine state.
libMesh::ReferenceCounter::get_info
static std::string get_info()
Gets a string containing the reference information.
Definition: reference_counter.C:47
libMesh::SparseMatrix
Generic sparse matrix.
Definition: vector_fe_ex5.C:45
PetscBool
PetscTruth PetscBool
Definition: petsc_macro.h:73
libMesh::DenseMatrixBase::m
unsigned int m() const
Definition: dense_matrix_base.h:104
libMesh::PetscMatrix::zero
virtual void zero() override
Set all entries to 0.
Definition: petsc_matrix.C:507
PETSC_USE_POINTER
Definition: petsc_macro.h:103
libMesh::libmesh_assert
libmesh_assert(ctx)
libMesh::MacroFunctions::stop
void stop(const char *file, int line, const char *date, const char *time)
Definition: libmesh_common.C:53
libMesh::numeric_petsc_cast
PetscInt * numeric_petsc_cast(const numeric_index_type *p)
Definition: petsc_vector.h:1228
libMesh::ParallelObject::n_processors
processor_id_type n_processors() const
Definition: parallel_object.h:100
libMesh::TriangleWrapper::destroy
void destroy(triangulateio &t, IO_Type)
Frees any memory which has been dynamically allocated by Triangle.
libMesh::PS
PetscScalar PS(T val)
Definition: petsc_macro.h:168
libMesh::Threads::spin_mtx
spin_mutex spin_mtx
A convenient spin mutex object which can be used for obtaining locks.
Definition: threads.C:29
libMesh::ParallelObject::processor_id
processor_id_type processor_id() const
Definition: parallel_object.h:106
libMesh::libmesh_ignore
void libmesh_ignore(const Args &...)
Definition: libmesh_common.h:526
libMesh::PetscMatrix::_petsc_matrix_mutex
std::mutex _petsc_matrix_mutex
Definition: petsc_matrix.h:319
libMesh::PetscMatrix::add_block_matrix
virtual void add_block_matrix(const DenseMatrix< T > &dm, const std::vector< numeric_index_type > &brows, const std::vector< numeric_index_type > &bcols) override
Add the full matrix dm to the SparseMatrix.
Definition: petsc_matrix.C:837
libMesh::ParallelObject::_communicator
const Parallel::Communicator & _communicator
Definition: parallel_object.h:112
libMesh::DofMap::get_n_nz
const std::vector< dof_id_type > & get_n_nz() const
Definition: dof_map.h:505
libMesh::SparseMatrix::vector_mult_add
void vector_mult_add(NumericVector< T > &dest, const NumericVector< T > &arg) const
Multiplies the matrix by the NumericVector arg and adds the result to the NumericVector dest.
Definition: sparse_matrix.C:180
libMesh::PetscMatrix::_mat_type
PetscMatrixType _mat_type
Definition: petsc_matrix.h:316
libMesh::PetscVector
This class provides a nice interface to PETSc's Vec object.
Definition: petsc_vector.h:72
libMesh::SparseMatrix::m
virtual numeric_index_type m() const =0
libMesh::LASPACK_SOLVERS
Definition: enum_solver_package.h:38
libMesh::numeric_index_type
dof_id_type numeric_index_type
Definition: id_types.h:99
libMesh::DofMap::n_dofs_on_processor
dof_id_type n_dofs_on_processor(const processor_id_type proc) const
Definition: dof_map.h:641
libMesh::TRILINOS_SOLVERS
Definition: enum_solver_package.h:37
distance
Real distance(const Point &p)
Definition: subdomains_ex3.C:50
libMesh::PetscMatrix::m
virtual numeric_index_type m() const override
Definition: petsc_matrix.C:1024
libMesh::SparseMatrix::_get_submatrix
virtual void _get_submatrix(SparseMatrix< T > &, const std::vector< numeric_index_type > &, const std::vector< numeric_index_type > &, const bool) const
Protected implementation of the create_submatrix and reinit_submatrix routines.
Definition: sparse_matrix.h:432
swap
void swap(Iterator &lhs, Iterator &rhs)
swap, used to implement op=
Definition: variant_filter_iterator.h:478
libMesh::ReferenceElem::get
const Elem & get(const ElemType type_in)
Definition: reference_elem.C:237
value
static const bool value
Definition: xdr_io.C:56
libMesh::PetscMatrix
This class provides a nice interface to the PETSc C-based data structures for parallel,...
Definition: petsc_matrix.h:87
libMesh::PetscMatrix::close
virtual void close() override
Calls the SparseMatrix's internal assembly routines, ensuring that the values are consistent across p...
Definition: petsc_matrix.C:989
libMesh::PetscMatrix::_destroy_mat_on_exit
bool _destroy_mat_on_exit
This boolean value should only be set to false for the constructor which takes a PETSc Mat object.
Definition: petsc_matrix.h:314
libMesh::PetscVector::vec
Vec vec()
Definition: petsc_vector.h:335
libMesh::PetscMatrix::closed
virtual bool closed() const override
Definition: petsc_matrix.C:1317
libMesh::PetscMatrix::n
virtual numeric_index_type n() const override
Definition: petsc_matrix.C:1051
libMesh::Real
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
Definition: libmesh_common.h:121
libMesh::ReferenceCounter::_enable_print_counter
static bool _enable_print_counter
Flag to control whether reference count information is printed when print_info is called.
Definition: reference_counter.h:141
libMesh::HYPRE
Definition: petsc_matrix.h:74
libMesh::DofMap::block_size
unsigned int block_size() const
Definition: dof_map.h:617
libMesh::EIGEN_SOLVERS
Definition: enum_solver_package.h:40
libMesh::PetscMatrix::add_matrix
virtual void add_matrix(const DenseMatrix< T > &dm, const std::vector< numeric_index_type > &rows, const std::vector< numeric_index_type > &cols) override
Add the full matrix dm to the SparseMatrix.
Definition: petsc_matrix.C:810
std::imag
boost::multiprecision::float128 imag(const boost::multiprecision::float128)
Definition: float128_shims.h:83
libMesh::PetscMatrix::_mat
Mat _mat
PETSc matrix datatype to store values.
Definition: petsc_matrix.h:308
libMesh::Quality::name
std::string name(const ElemQuality q)
This function returns a string containing some name for q.
Definition: elem_quality.C:42
libMesh::SparseMatrix::_is_initialized
bool _is_initialized
Flag indicating whether or not the matrix has been initialized.
Definition: sparse_matrix.h:448
libMesh::DofMap::end_dof
dof_id_type end_dof(const processor_id_type proc) const
Definition: dof_map.h:692
libMesh::SparseMatrix::n
virtual numeric_index_type n() const =0
std::real
boost::multiprecision::float128 real(const boost::multiprecision::float128 in)
Definition: float128_shims.h:77