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

The LaspackMatrix class wraps a QMatrix object from the Laspack library. More...

#include <laspack_matrix.h>

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

Public Member Functions

 LaspackMatrix (const Parallel::Communicator &comm)
 Constructor; initializes the matrix to be empty, without any structure, i.e. More...
 
 LaspackMatrix (LaspackMatrix &&)=delete
 This class manages a C-style struct (QMatrix) manually, so we don't want to allow any automatic copy/move functions to be generated, and we can't default the destructor. More...
 
 LaspackMatrix (const LaspackMatrix &)=delete
 
LaspackMatrixoperator= (const LaspackMatrix &)=delete
 
LaspackMatrixoperator= (LaspackMatrix &&)=delete
 
virtual ~LaspackMatrix ()
 
virtual SparseMatrix< T > & operator= (const SparseMatrix< T > &) override
 This looks like a copy assignment operator, but note that, unlike normal copy assignment operators, it is pure virtual. More...
 
virtual SolverPackage solver_package () override
 
virtual bool need_full_sparsity_pattern () const override
 The LaspackMatrix needs the full sparsity pattern. More...
 
virtual void update_sparsity_pattern (const SparsityPattern::Graph &) override
 Updates the matrix sparsity pattern. More...
 
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...
 
virtual void init (ParallelType=PARALLEL) override
 Initialize this matrix using the sparsity structure computed by dof_map. 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 std::unique_ptr< SparseMatrix< T > > zero_clone () const override
 
virtual std::unique_ptr< SparseMatrix< T > > clone () const override
 
virtual void close () override
 Calls the SparseMatrix's internal assembly routines, ensuring that the values are consistent across processors. More...
 
virtual numeric_index_type m () const override
 
virtual numeric_index_type n () const override
 
virtual numeric_index_type row_start () const override
 
virtual numeric_index_type row_stop () const override
 
virtual numeric_index_type col_start () const override
 
virtual numeric_index_type col_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 (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 print_personal (std::ostream &os=libMesh::out) const override
 Print the contents of the matrix to the screen in a package-personalized style, if available. 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...
 
virtual 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)
 Set a pointer to the DofMap to use. More...
 
void attach_sparsity_pattern (const SparsityPattern::Build &sp)
 Set a pointer to a sparsity pattern to use. More...
 
virtual bool require_sparsity_pattern () const
 
virtual void zero_rows (std::vector< numeric_index_type > &rows, T diag_value=0.0)
 Sets all row entries to 0 then puts diag_value in the diagonal entry. More...
 
virtual void flush ()
 For PETSc matrix , this function is similar to close but without shrinking memory. More...
 
virtual numeric_index_type local_m () const
 Get the number of rows owned by this process. More...
 
virtual numeric_index_type local_n () const
 Get the number of columns owned by this process. More...
 
virtual void add_block_matrix (const DenseMatrix< T > &dm, const std::vector< numeric_index_type > &brows, const std::vector< numeric_index_type > &bcols)
 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)
 Same as add_block_matrix(), but assumes the row and column maps are the same. More...
 
virtual void matrix_matrix_mult (SparseMatrix< T > &, SparseMatrix< T > &, bool)
 Compute Y = A*X for matrix X. More...
 
virtual void add_sparse_matrix (const SparseMatrix< T > &, const std::map< numeric_index_type, numeric_index_type > &, const std::map< numeric_index_type, numeric_index_type > &, const T)
 Add scalar* spm to the rows and cols of this matrix (A): A(rows[i], cols[j]) += scalar * spm(i,j) More...
 
Real l1_norm_diff (const SparseMatrix< T > &other_mat) const
 
virtual std::size_t n_nonzeros () const
 
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...
 
void print (const std::string &filename) const
 Print the contents of the matrix to a file, with a file format depending on the extension of filename. More...
 
template<>
void print (std::ostream &os, const bool sparse) const
 
virtual void print_coreform_hdf5 (const std::string &filename, const std::string &groupname="extraction") const
 Print the contents of the matrix to a file, with the HDF5 sparse matrix format used by CoreForm, putting CSR sparse matrix data in the group given by groupname. More...
 
virtual void print_matlab (const std::string &="") const
 Print the contents of the matrix in Matlab's sparse matrix format. More...
 
virtual void print_petsc_binary (const std::string &filename) const
 Write the contents of the matrix to a file in PETSc's binary sparse matrix format. More...
 
virtual void print_petsc_hdf5 (const std::string &filename) const
 Write the contents of the matrix to a file in PETSc's HDF5 sparse matrix format. More...
 
virtual void read (const std::string &filename)
 Read the contents of the matrix from a file, with the file format inferred from the extension of filename. More...
 
virtual void read_coreform_hdf5 (const std::string &filename, const std::string &groupname="extraction")
 Read the contents of the matrix from a file, with the HDF5 sparse matrix format used by CoreForm, expecing sparse matrix data in the group given by groupname. More...
 
virtual void read_matlab (const std::string &filename)
 Read the contents of the matrix from the Matlab-script sparse matrix format used by PETSc. More...
 
virtual void read_petsc_binary (const std::string &filename)
 Read the contents of the matrix from a file in PETSc's binary sparse matrix format. More...
 
virtual void read_petsc_hdf5 (const std::string &filename)
 Read the contents of the matrix from a file in PETSc's HDF5 sparse matrix format. More...
 
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 create_submatrix_nosort (SparseMatrix< T > &, const std::vector< numeric_index_type > &, const std::vector< numeric_index_type > &) const
 Similar to the above function, this function creates a submatrix which is defined by the indices given in the rows and cols vectors. 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...
 
virtual void scale (const T scale)
 Scales all elements of this matrix by scale. More...
 
virtual bool supports_hash_table () const
 
void use_hash_table (bool use_hash)
 Sets whether to use hash table assembly. More...
 
bool use_hash_table () const
 
virtual void restore_original_nonzero_pattern ()
 Reset the memory storage of the matrix. More...
 
const Parallel::Communicatorcomm () 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(), const MatrixBuildType matrix_build_type=MatrixBuildType::AUTOMATIC)
 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_stream=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 > &, 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. More...
 
void increment_constructor_count (const std::string &name) noexcept
 Increments the construction counter. More...
 
void increment_destructor_count (const std::string &name) noexcept
 Increments the destruction counter. More...
 

Protected Attributes

DofMap const * _dof_map
 The DofMap object associated with this object. More...
 
SparsityPattern::Build const * _sp
 The sparsity pattern associated with this object. More...
 
bool _is_initialized
 Flag indicating whether or not the matrix has been initialized. More...
 
bool _use_hash_table
 Flag indicating whether the matrix is assembled using a hash table. 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 Member Functions

numeric_index_type pos (const numeric_index_type i, const numeric_index_type j) const
 

Private Attributes

QMatrix _QMat
 The Laspack sparse matrix pointer. More...
 
std::vector< numeric_index_type_csr
 The compressed row indices. More...
 
std::vector< std::vector< numeric_index_type >::const_iterator > _row_start
 The start of each row in the compressed row index data structure. More...
 
bool _closed
 Flag indicating if the matrix has been closed yet. More...
 

Friends

class LaspackVector< T >
 Make other Laspack datatypes friends. More...
 
class LaspackLinearSolver< T >
 

Detailed Description

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

The LaspackMatrix class wraps a QMatrix object from the Laspack library.

Currently Laspack only supports real datatypes, so this class is a full specialization of SparseMatrix<T> with T = Real. All overridden virtual functions are documented in sparse_matrix.h.

Author
Benjamin S. Kirk
Date
2003

Definition at line 56 of file laspack_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 119 of file reference_counter.h.

Constructor & Destructor Documentation

◆ LaspackMatrix() [1/3]

template<typename T >
libMesh::LaspackMatrix< T >::LaspackMatrix ( const Parallel::Communicator comm)

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 462 of file laspack_matrix.C.

462  :
463  SparseMatrix<T>(comm),
464  _closed (false)
465 {
466 }
const Parallel::Communicator & comm() const
bool _closed
Flag indicating if the matrix has been closed yet.

◆ LaspackMatrix() [2/3]

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

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

◆ LaspackMatrix() [3/3]

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

◆ ~LaspackMatrix()

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

Definition at line 471 of file laspack_matrix.C.

472 {
473  this->clear ();
474 }
virtual void clear() override
Restores the SparseMatrix<T> to a pristine state.

Member Function Documentation

◆ _get_submatrix()

template<typename T>
virtual void libMesh::SparseMatrix< T >::_get_submatrix ( SparseMatrix< T > &  ,
const std::vector< numeric_index_type > &  ,
const std::vector< numeric_index_type > &  ,
const bool   
) const
inlineprotectedvirtualinherited

Protected implementation of the create_submatrix and reinit_submatrix routines.

Note
This function must be overridden in derived classes for it to work properly!

Reimplemented in libMesh::PetscMatrix< T >.

Definition at line 654 of file sparse_matrix.h.

Referenced by libMesh::SparseMatrix< ValOut >::create_submatrix(), and libMesh::SparseMatrix< ValOut >::reinit_submatrix().

658  {
659  libmesh_not_implemented();
660  }

◆ add() [1/2]

template<typename T >
void libMesh::LaspackMatrix< 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 626 of file laspack_matrix.C.

References libMesh::initialized(), libMesh::libmesh_assert(), and value.

629 {
630  libmesh_assert (this->initialized());
631  libmesh_assert_less (i, this->m());
632  libmesh_assert_less (j, this->n());
633 
634  const numeric_index_type position = this->pos(i,j);
635 
636  // Sanity check
637  libmesh_assert_equal_to (*(_row_start[i]+position), j);
638 
639  Q_AddVal (&_QMat, i+1, position, value);
640 }
virtual bool initialized() const
QMatrix _QMat
The Laspack sparse matrix pointer.
numeric_index_type pos(const numeric_index_type i, const numeric_index_type j) const
dof_id_type numeric_index_type
Definition: id_types.h:99
libmesh_assert(ctx)
std::vector< std::vector< numeric_index_type >::const_iterator > _row_start
The start of each row in the compressed row index data structure.
virtual numeric_index_type m() const override
virtual numeric_index_type n() const override
static const bool value
Definition: xdr_io.C:55

◆ add() [2/2]

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

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

Note
LASPACK does not provide a true axpy for matrices, so a hand-coded version with hopefully acceptable performance is provided.

Implements libMesh::SparseMatrix< T >.

Definition at line 654 of file laspack_matrix.C.

References libMesh::initialized(), libMesh::libmesh_assert(), libMesh::SparseMatrix< T >::m(), libMesh::SparseMatrix< T >::n(), and value.

655 {
656  libmesh_assert (this->initialized());
657  libmesh_assert_equal_to (this->m(), X_in.m());
658  libmesh_assert_equal_to (this->n(), X_in.n());
659 
660  const LaspackMatrix<T> * X =
661  cast_ptr<const LaspackMatrix<T> *> (&X_in);
662 
663  _LPNumber a = static_cast<_LPNumber> (a_in);
664 
665  libmesh_assert(X);
666 
667  // loops taken from LaspackMatrix<T>::zero ()
668 
669  const numeric_index_type n_rows = this->m();
670 
671  for (numeric_index_type row=0; row<n_rows; row++)
672  {
673  auto r_start = _row_start[row];
674 
675  const numeric_index_type len = (_row_start[row+1] - _row_start[row]);
676 
677  // Make sure we agree on the row length
678  libmesh_assert_equal_to (len, Q_GetLen(&_QMat, row+1));
679  // compare matrix sparsity structures
680  libmesh_assert_equal_to (len, Q_GetLen(&(X->_QMat), row+1));
681 
682 
683  for (numeric_index_type l=0; l<len; l++)
684  {
685  const numeric_index_type j = *(r_start + l);
686 
687  // Make sure the data structures are working
688  libmesh_assert_equal_to ((j+1), Q_GetPos (&_QMat, row+1, l));
689 
690  const _LPNumber value = a * Q_GetEl(const_cast<QMatrix*>(&(X->_QMat)), row+1, j+1);
691  Q_AddVal (&_QMat, row+1, l, value);
692  }
693  }
694 }
virtual bool initialized() const
QMatrix _QMat
The Laspack sparse matrix pointer.
dof_id_type numeric_index_type
Definition: id_types.h:99
libmesh_assert(ctx)
std::vector< std::vector< numeric_index_type >::const_iterator > _row_start
The start of each row in the compressed row index data structure.
virtual numeric_index_type m() const override
virtual numeric_index_type n() const override
static const bool value
Definition: xdr_io.C:55

◆ add_block_matrix() [1/2]

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

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 in libMesh::PetscMatrix< T >.

Definition at line 119 of file sparse_matrix.C.

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

122 {
123  libmesh_assert_equal_to (dm.m() / brows.size(), dm.n() / bcols.size());
124 
125  const numeric_index_type blocksize = cast_int<numeric_index_type>
126  (dm.m() / brows.size());
127 
128  libmesh_assert_equal_to (dm.m()%blocksize, 0);
129  libmesh_assert_equal_to (dm.n()%blocksize, 0);
130 
131  std::vector<numeric_index_type> rows, cols;
132 
133  rows.reserve(blocksize*brows.size());
134  cols.reserve(blocksize*bcols.size());
135 
136  for (auto & row : brows)
137  {
138  numeric_index_type i = row * blocksize;
139 
140  for (unsigned int v=0; v<blocksize; v++)
141  rows.push_back(i++);
142  }
143 
144  for (auto & col : bcols)
145  {
146  numeric_index_type j = col * blocksize;
147 
148  for (unsigned int v=0; v<blocksize; v++)
149  cols.push_back(j++);
150  }
151 
152  this->add_matrix (dm, rows, cols);
153 }
virtual void add_matrix(const DenseMatrix< T > &dm, const std::vector< numeric_index_type > &rows, const std::vector< numeric_index_type > &cols)=0
Add the full matrix dm to the SparseMatrix.
dof_id_type numeric_index_type
Definition: id_types.h:99

◆ add_block_matrix() [2/2]

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

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

Thus the matrix dm must be square.

Reimplemented in libMesh::PetscMatrix< T >.

Definition at line 337 of file sparse_matrix.h.

339  { this->add_block_matrix (dm, dof_indices, dof_indices); }
virtual void add_block_matrix(const DenseMatrix< T > &dm, const std::vector< numeric_index_type > &brows, const std::vector< numeric_index_type > &bcols)
Add the full matrix dm to the SparseMatrix.

◆ add_matrix() [1/2]

template<typename T >
void libMesh::LaspackMatrix< 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 260 of file laspack_matrix.C.

References libMesh::initialized(), libMesh::libmesh_assert(), libMesh::DenseMatrixBase< T >::m(), and libMesh::DenseMatrixBase< T >::n().

264 {
265  libmesh_assert (this->initialized());
266  unsigned int n_rows = cast_int<unsigned int>(rows.size());
267  unsigned int n_cols = cast_int<unsigned int>(cols.size());
268  libmesh_assert_equal_to (dm.m(), n_rows);
269  libmesh_assert_equal_to (dm.n(), n_cols);
270 
271 
272  for (unsigned int i=0; i<n_rows; i++)
273  for (unsigned int j=0; j<n_cols; j++)
274  this->add(rows[i],cols[j],dm(i,j));
275 }
virtual bool initialized() const
virtual void add(const numeric_index_type i, const numeric_index_type j, const T value) override
Add value to the element (i,j).
libmesh_assert(ctx)

◆ add_matrix() [2/2]

template<typename T >
void libMesh::LaspackMatrix< 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 645 of file laspack_matrix.C.

647 {
648  this->add_matrix (dm, dof_indices, dof_indices);
649 }
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.

◆ add_sparse_matrix()

template<typename T>
virtual void libMesh::SparseMatrix< T >::add_sparse_matrix ( const SparseMatrix< T > &  ,
const std::map< numeric_index_type, numeric_index_type > &  ,
const std::map< numeric_index_type, numeric_index_type > &  ,
const T   
)
inlinevirtualinherited

Add scalar* spm to the rows and cols of this matrix (A): A(rows[i], cols[j]) += scalar * spm(i,j)

Reimplemented in libMesh::PetscMatrix< T >.

Definition at line 356 of file sparse_matrix.h.

360  { libmesh_not_implemented(); }

◆ attach_dof_map()

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

Set a pointer to the DofMap to use.

If a separate sparsity pattern is not being used, use the one from the DofMap.

The lifetime of dof_map must exceed the lifetime of this.

Definition at line 100 of file sparse_matrix.C.

Referenced by libMesh::__libmesh_tao_hessian(), DMlibMeshJacobian(), libMesh::libmesh_petsc_snes_jacobian(), and libMesh::DofMap::update_sparsity_pattern().

101 {
102  _dof_map = &dof_map;
103  if (!_sp)
104  _sp = dof_map.get_sparsity_pattern();
105 }
SparsityPattern::Build const * _sp
The sparsity pattern associated with this object.
const SparsityPattern::Graph & get_sparsity_pattern() const
Rows of sparse matrix indices, indexed by the offset from the first DoF on this processor.
DofMap const * _dof_map
The DofMap object associated with this object.

◆ attach_sparsity_pattern()

template<typename T >
void libMesh::SparseMatrix< T >::attach_sparsity_pattern ( const SparsityPattern::Build sp)
inherited

Set a pointer to a sparsity pattern to use.

Useful in cases where a matrix requires a wider (or for efficiency narrower) pattern than most matrices in the system, or in cases where no system sparsity pattern is being calculated by the DofMap.

The lifetime of sp must exceed the lifetime of this.

Definition at line 110 of file sparse_matrix.C.

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

111 {
112  _sp = &sp;
113 }
SparsityPattern::Build const * _sp
The sparsity pattern associated with this object.

◆ 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(),
const MatrixBuildType  matrix_build_type = MatrixBuildType::AUTOMATIC 
)
staticinherited

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

Definition at line 193 of file sparse_matrix.C.

Referenced by libMesh::CondensedEigenSystem::add_matrices(), libMesh::System::add_matrix(), libMesh::TransientRBConstruction::allocate_data_structures(), libMesh::RBConstruction::allocate_data_structures(), libMesh::CondensedEigenSystem::copy_super_to_sub(), libMesh::StaticCondensation::init(), main(), libMesh::DofMap::process_mesh_constraint_rows(), ConstraintOperatorTest::test1DCoarseningNewNodes(), ConstraintOperatorTest::test1DCoarseningOperator(), ConstraintOperatorTest::testCoreform(), ConnectedComponentsTest::testEdge(), SystemsTest::testProjectMatrix1D(), SystemsTest::testProjectMatrix2D(), and SystemsTest::testProjectMatrix3D().

196 {
197  // Avoid unused parameter warnings when no solver packages are enabled.
199 
200  if (matrix_build_type == MatrixBuildType::DIAGONAL)
201  return std::make_unique<DiagonalMatrix<T>>(comm);
202 
203  // Build the appropriate vector
204  switch (solver_package)
205  {
206 
207 #ifdef LIBMESH_HAVE_LASPACK
208  case LASPACK_SOLVERS:
209  return std::make_unique<LaspackMatrix<T>>(comm);
210 #endif
211 
212 
213 #ifdef LIBMESH_HAVE_PETSC
214  case PETSC_SOLVERS:
215  return std::make_unique<PetscMatrix<T>>(comm);
216 #endif
217 
218 
219 #ifdef LIBMESH_TRILINOS_HAVE_EPETRA
220  case TRILINOS_SOLVERS:
221  return std::make_unique<EpetraMatrix<T>>(comm);
222 #endif
223 
224 
225 #ifdef LIBMESH_HAVE_EIGEN
226  case EIGEN_SOLVERS:
227  return std::make_unique<EigenSparseMatrix<T>>(comm);
228 #endif
229 
230  default:
231  libmesh_error_msg("ERROR: Unrecognized solver package: " << solver_package);
232  }
233 }
const Parallel::Communicator & comm() const
void libmesh_ignore(const Args &...)
virtual SolverPackage solver_package()=0

◆ clear()

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

Restores the SparseMatrix<T> to a pristine state.

Implements libMesh::SparseMatrix< T >.

Definition at line 479 of file laspack_matrix.C.

References libMesh::libMeshPrivateData::_is_initialized, and libMesh::initialized().

Referenced by libMesh::LaspackMatrix< T >::get_transpose().

480 {
481  if (this->initialized())
482  {
483  Q_Destr(&_QMat);
484  }
485 
486  _csr.clear();
487  _row_start.clear();
488  _closed = false;
489  this->_is_initialized = false;
490 }
virtual bool initialized() const
std::vector< numeric_index_type > _csr
The compressed row indices.
QMatrix _QMat
The Laspack sparse matrix pointer.
bool _is_initialized
Flag indicating whether or not the matrix has been initialized.
std::vector< std::vector< numeric_index_type >::const_iterator > _row_start
The start of each row in the compressed row index data structure.
bool _closed
Flag indicating if the matrix has been closed yet.

◆ clone()

template<typename T >
std::unique_ptr< SparseMatrix< T > > libMesh::LaspackMatrix< T >::clone ( ) const
overridevirtual
Returns
A smart pointer to a copy of this matrix.
Note
This must be overridden in the derived classes.

Implements libMesh::SparseMatrix< T >.

Definition at line 543 of file laspack_matrix.C.

544 {
545  // We don't currently have a faster implementation than making a
546  // zero clone and then filling in the values.
547  auto mat_copy = this->zero_clone();
548  mat_copy->add(1., *this);
549 
550  return mat_copy;
551 }
virtual std::unique_ptr< SparseMatrix< T > > zero_clone() const override

◆ close()

template<typename T >
void libMesh::LaspackMatrix< 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 737 of file laspack_matrix.C.

References libMesh::initialized(), and libMesh::libmesh_assert().

Referenced by libMesh::LaspackLinearSolver< T >::adjoint_solve(), and libMesh::LaspackLinearSolver< T >::solve().

738 {
739  libmesh_assert(this->initialized());
740 
741  this->_closed = true;
742 
743  // We've probably changed some entries so we need to tell LASPACK
744  // that cached data is now invalid.
745  *_QMat.DiagElAlloc = _LPFalse;
746  *_QMat.ElSorted = _LPFalse;
747  if (*_QMat.ILUExists)
748  {
749  *_QMat.ILUExists = _LPFalse;
750  Q_Destr(_QMat.ILU);
751  }
752 }
virtual bool initialized() const
QMatrix _QMat
The Laspack sparse matrix pointer.
libmesh_assert(ctx)
bool _closed
Flag indicating if the matrix has been closed yet.

◆ closed()

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

Implements libMesh::SparseMatrix< T >.

Definition at line 169 of file laspack_matrix.h.

References libMesh::LaspackMatrix< T >::_closed.

169 { return _closed; }
bool _closed
Flag indicating if the matrix has been closed yet.

◆ col_start()

template<typename T >
numeric_index_type libMesh::LaspackMatrix< T >::col_start ( ) const
overridevirtual
Returns
The index of the first matrix column owned by this processor.

Implements libMesh::SparseMatrix< T >.

Definition at line 590 of file laspack_matrix.C.

591 {
592  return 0;
593 }

◆ col_stop()

template<typename T >
numeric_index_type libMesh::LaspackMatrix< T >::col_stop ( ) const
overridevirtual
Returns
The index of the last matrix column (+1) owned by this processor.

Implements libMesh::SparseMatrix< T >.

Definition at line 598 of file laspack_matrix.C.

599 {
600  return this->n();
601 }
virtual numeric_index_type n() const override

◆ comm()

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

Definition at line 97 of file parallel_object.h.

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::Partitioner::_find_global_index_by_pid_map(), 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::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::RBEIMEvaluation::add_interpolation_data(), libMesh::CondensedEigenSystem::add_matrices(), libMesh::EigenSystem::add_matrices(), libMesh::System::add_matrix(), libMesh::RBConstruction::add_scaled_matrix_and_vector(), libMesh::DofMap::add_variable(), libMesh::DofMap::add_variables(), libMesh::System::add_vector(), 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::AdvectionSystem::assemble_claw_rhs(), libMesh::FEMSystem::assemble_qoi(), libMesh::Nemesis_IO::assert_symmetric_cmaps(), libMesh::MeshCommunication::assign_global_indices(), libMesh::Partitioner::assign_partitioning(), libMesh::MeshTools::Generation::build_extrusion(), libMesh::Partitioner::build_graph(), libMesh::InfElemBuilder::build_inf_elem(), 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::MeshBase::cache_elem_data(), libMesh::System::calculate_norm(), libMesh::DofMap::check_dirichlet_bcid_consistency(), libMesh::MeshTetInterface::check_hull_integrity(), libMesh::MeshBase::complete_preparation(), 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::DofMap::computed_sparsity_already(), libMesh::Problem_Interface::computeF(), libMesh::Problem_Interface::computeJacobian(), libMesh::Problem_Interface::computePreconditioner(), libMesh::ContinuationSystem::ContinuationSystem(), libMesh::MeshBase::copy_constraint_rows(), libMesh::ExodusII_IO::copy_elemental_solution(), libMesh::ExodusII_IO::copy_nodal_solution(), libMesh::ExodusII_IO::copy_scalar_solution(), libMesh::CondensedEigenSystem::copy_super_to_sub(), 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::PetscMatrix< T >::create_submatrix_nosort(), create_wrapped_function(), libMesh::MeshCommunication::delete_remote_elements(), libMesh::RBEIMEvaluation::distribute_bfs(), DMlibMeshFunction(), DMlibMeshJacobian(), DMlibMeshSetSystem_libMesh(), DMVariableBounds_libMesh(), libMesh::DTKSolutionTransfer::DTKSolutionTransfer(), libMesh::MeshRefinement::eliminate_unrefined_patches(), libMesh::RBEIMConstruction::enrich_eim_approximation_on_interiors(), libMesh::RBEIMConstruction::enrich_eim_approximation_on_nodes(), libMesh::RBEIMConstruction::enrich_eim_approximation_on_sides(), libMesh::TransientRBConstruction::enrich_RB_space(), libMesh::EpetraVector< T >::EpetraVector(), AssembleOptimization::equality_constraints(), libMesh::PatchRecoveryErrorEstimator::estimate_error(), libMesh::WeightedPatchRecoveryErrorEstimator::estimate_error(), libMesh::AdjointRefinementEstimator::estimate_error(), libMesh::ExactErrorEstimator::estimate_error(), libMesh::SmoothnessEstimator::estimate_smoothness(), 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::RBEIMEvaluation::gather_bfs(), libMesh::DofMap::gather_constraints(), libMesh::MeshfreeInterpolation::gather_remote_data(), libMesh::CondensedEigenSystem::get_eigenpair(), libMesh::RBEIMEvaluation::get_eim_basis_function_node_value(), libMesh::RBEIMEvaluation::get_eim_basis_function_side_value(), libMesh::RBEIMEvaluation::get_eim_basis_function_value(), libMesh::System::get_info(), libMesh::MeshBase::get_info(), libMesh::DofMap::get_info(), libMesh::RBEIMEvaluation::get_interior_basis_functions_as_vecs(), libMesh::ImplicitSystem::get_linear_solver(), libMesh::RBEIMConstruction::get_max_abs_value(), libMesh::RBEIMConstruction::get_node_max_abs_value(), libMesh::RBEIMEvaluation::get_parametrized_function_node_value(), libMesh::RBEIMEvaluation::get_parametrized_function_side_value(), libMesh::RBEIMEvaluation::get_parametrized_function_value(), libMesh::RBEIMConstruction::get_random_point(), libMesh::MeshTetInterface::improve_hull_integrity(), AssembleOptimization::inequality_constraints(), AssembleOptimization::inequality_constraints_jacobian(), libMesh::LocationMap< T >::init(), libMesh::TimeSolver::init(), libMesh::StaticCondensation::init(), libMesh::SystemSubsetBySubdomain::init(), libMesh::PetscDMWrapper::init_and_attach_petscdm(), libMesh::AdvectionSystem::init_data(), libMesh::ClawSystem::init_data(), libMesh::PetscDMWrapper::init_petscdm(), libMesh::ExodusII_IO_Helper::initialize(), libMesh::OptimizationSystem::initialize_equality_constraints_storage(), libMesh::OptimizationSystem::initialize_inequality_constraints_storage(), libMesh::RBEIMConstruction::initialize_parametrized_functions_in_training_set(), libMesh::RBEIMConstruction::inner_product(), 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_equal_connectivity(), libMesh::MeshTools::libmesh_assert_equal_points(), 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_constraint_rows(), 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_linesearch_shellfunc(), libMesh::libmesh_petsc_preconditioner_apply(), libMesh::libmesh_petsc_recalculate_monitor(), libMesh::libmesh_petsc_snes_fd_residual(), libMesh::libmesh_petsc_snes_jacobian(), libMesh::libmesh_petsc_snes_mffd_interface(), libMesh::libmesh_petsc_snes_mffd_residual(), libMesh::libmesh_petsc_snes_postcheck(), libMesh::libmesh_petsc_snes_precheck(), 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(), libMesh::LinearImplicitSystem::LinearImplicitSystem(), 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_bcids_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(), libMesh::TriangulatorInterface::MeshedHole::MeshedHole(), LinearElasticityWithContact::move_mesh(), libMesh::DistributedMesh::n_active_elem(), libMesh::MeshTools::n_active_levels(), libMesh::BoundaryInfo::n_boundary_conds(), libMesh::MeshTools::n_connected_components(), libMesh::DofMap::n_constrained_dofs(), libMesh::MeshBase::n_constraint_rows(), libMesh::DofMap::n_dofs(), libMesh::DofMap::n_dofs_per_processor(), libMesh::BoundaryInfo::n_edge_conds(), libMesh::CondensedEigenSystem::n_global_non_condensed_dofs(), libMesh::MeshTools::n_levels(), MixedOrderTest::n_neighbor_links(), libMesh::BoundaryInfo::n_nodeset_conds(), libMesh::SparsityPattern::Build::n_nonzeros(), libMesh::MeshTools::n_p_levels(), libMesh::BoundaryInfo::n_shellface_conds(), libMesh::RBEIMEvaluation::node_distribute_bfs(), libMesh::RBEIMEvaluation::node_gather_bfs(), libMesh::RBEIMConstruction::node_inner_product(), libMesh::PetscVector< libMesh::Number >::operator=(), libMesh::MeshBase::operator==(), 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::BoundaryInfo::parallel_sync_node_ids(), libMesh::BoundaryInfo::parallel_sync_side_ids(), libMesh::MeshTools::paranoid_n_levels(), libMesh::Partitioner::partition(), libMesh::Partitioner::partition_unpartitioned_elements(), libMesh::petsc_auto_fieldsplit(), libMesh::System::point_gradient(), libMesh::System::point_hessian(), libMesh::System::point_value(), libMesh::MeshBase::print_constraint_rows(), libMesh::DofMap::print_dof_constraints(), libMesh::DofMap::process_mesh_constraint_rows(), libMesh::Partitioner::processor_pairs_to_interface_nodes(), libMesh::InterMeshProjection::project_system_vectors(), FEMParameters::read(), libMesh::Nemesis_IO::read(), libMesh::XdrIO::read(), libMesh::EquationSystems::read(), libMesh::ExodusII_IO::read_header(), libMesh::CheckpointIO::read_header(), libMesh::XdrIO::read_header(), libMesh::System::read_header(), libMesh::RBEIMEvaluation::read_in_interior_basis_functions(), libMesh::RBEIMEvaluation::read_in_node_basis_functions(), libMesh::RBEIMEvaluation::read_in_side_basis_functions(), libMesh::RBEvaluation::read_in_vectors_from_multiple_files(), 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::Nemesis_IO_Helper::read_var_names_impl(), MeshFunctionTest::read_variable_info_from_output_data(), libMesh::MeshBase::recalculate_n_partitions(), libMesh::MeshRefinement::refine_and_coarsen_elements(), libMesh::SimplexRefiner::refine_via_edges(), libMesh::StaticCondensationDofMap::reinit(), libMesh::BoundaryInfo::remove_edge_id(), libMesh::BoundaryInfo::remove_node_id(), libMesh::BoundaryInfo::remove_shellface_id(), libMesh::BoundaryInfo::remove_side_id(), libMesh::DistributedMesh::renumber_dof_objects(), libMesh::DistributedMesh::renumber_nodes_and_elements(), LinearElasticityWithContact::residual_and_jacobian(), OverlappingAlgebraicGhostingTest::run_ghosting_test(), OverlappingCouplingGhostingTest::run_sparsity_pattern_test(), scale_mesh_and_plot(), libMesh::DofMap::scatter_constraints(), libMesh::CheckpointIO::select_split_config(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::send_and_insert_dof_values(), libMesh::TransientRBConstruction::set_error_temporal_data(), libMesh::Partitioner::set_interface_node_processor_ids_BFS(), libMesh::Partitioner::set_interface_node_processor_ids_linear(), libMesh::Partitioner::set_interface_node_processor_ids_petscpartitioner(), libMesh::Partitioner::set_node_processor_ids(), libMesh::DofMap::set_nonlocal_dof_objects(), libMesh::Partitioner::set_parent_processor_ids(), libMesh::PetscDMWrapper::set_point_range_in_section(), libMesh::PetscDiffSolver::setup_petsc_data(), libMesh::RBEIMEvaluation::side_distribute_bfs(), libMesh::RBEIMEvaluation::side_gather_bfs(), libMesh::RBEIMConstruction::side_inner_product(), libMesh::Partitioner::single_partition(), libMesh::LaplaceMeshSmoother::smooth(), libMesh::VariationalMeshSmoother::smooth(), libMesh::ClawSystem::solve_conservation_law(), libMesh::split_mesh(), libMesh::RBEIMConstruction::store_eim_solutions_for_training_set(), libMesh::MeshBase::subdomain_ids(), libMesh::BoundaryInfo::sync(), libMesh::MeshBase::sync_subdomain_name_map(), ConstraintOperatorTest::test1DCoarseningNewNodes(), ConstraintOperatorTest::test1DCoarseningOperator(), MeshFunctionTest::test_bad_gradient_var_with_out_of_mesh_value(), MeshFunctionTest::test_bad_hessian_var_with_out_of_mesh_value(), libMesh::MeshRefinement::test_level_one(), MeshfunctionDFEM::test_mesh_function_dfem(), MeshfunctionDFEM::test_mesh_function_dfem_grad(), MeshFunctionTest::test_p_level(), libMesh::MeshRefinement::test_unflagged(), DofMapTest::testBadElemFECombo(), SystemsTest::testBlockRestrictedVarNDofs(), BoundaryInfoTest::testBoundaryOnChildrenErrors(), VolumeTest::testC0PolygonMethods(), VolumeTest::testC0PolyhedronMethods(), ConstraintOperatorTest::testCoreform(), ConnectedComponentsTest::testEdge(), MeshInputTest::testExodusIGASidesets(), MeshTriangulationTest::testFoundCenters(), PointLocatorTest::testLocator(), BoundaryInfoTest::testMesh(), PointLocatorTest::testPlanar(), MeshTriangulationTest::testPoly2TriRefinementBase(), SystemsTest::testProjectCubeWithMeshFunction(), BoundaryInfoTest::testRenumber(), BoundaryInfoTest::testSelectiveRenumber(), CheckpointIOTest::testSplitter(), MeshInputTest::testTetgenIO(), MeshTriangulationTest::testTriangulatorInterp(), MeshTriangulationTest::testTriangulatorMeshedHoles(), MeshTriangulationTest::testTriangulatorRoundHole(), MeshSmootherTest::testVariationalSmoother(), libMesh::MeshTools::total_weight(), libMesh::RBConstruction::train_reduced_basis_with_POD(), libMesh::MeshFunctionSolutionTransfer::transfer(), libMesh::MeshfreeSolutionTransfer::transfer(), libMesh::Poly2TriTriangulator::triangulate(), libMesh::TransientRBConstruction::truth_assembly(), libMesh::RBConstruction::truth_assembly(), libMesh::MeshRefinement::uniformly_coarsen(), update_current_local_solution(), libMesh::TransientRBConstruction::update_RB_initial_condition_all_N(), libMesh::TransientRBConstruction::update_RB_system_matrices(), libMesh::RBConstruction::update_RB_system_matrices(), libMesh::TransientRBConstruction::update_residual_terms(), libMesh::RBConstruction::update_residual_terms(), libMesh::MeshTools::volume(), libMesh::STLIO::write(), libMesh::NameBasedIO::write(), libMesh::XdrIO::write(), libMesh::VTKIO::write_nodal_data(), libMesh::RBEIMEvaluation::write_out_interior_basis_functions(), libMesh::RBEIMEvaluation::write_out_node_basis_functions(), libMesh::RBEIMEvaluation::write_out_side_basis_functions(), 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().

98  { return _communicator; }
const Parallel::Communicator & _communicator

◆ 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 PetscMatrixBase subclasses. Note: The rows and cols vectors need to be sorted; Use the nosort version below if rows and cols vectors are not sorted; The rows and cols only contain indices that are owned by this processor.

Definition at line 534 of file sparse_matrix.h.

Referenced by libMesh::CondensedEigenSystem::copy_super_to_sub(), libMesh::libmesh_petsc_DMCreateInterpolation(), and libMesh::CondensedEigenSystem::solve().

537  {
538  this->_get_submatrix(submatrix,
539  rows,
540  cols,
541  false); // false means DO NOT REUSE submatrix
542  }
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.

◆ create_submatrix_nosort()

template<typename T>
virtual void libMesh::SparseMatrix< T >::create_submatrix_nosort ( SparseMatrix< T > &  ,
const std::vector< numeric_index_type > &  ,
const std::vector< numeric_index_type > &   
) const
inlinevirtualinherited

Similar to the above function, this function creates a submatrix which is defined by the indices given in the rows and cols vectors.

Note: Both rows and cols can be unsorted; Use the above function for better efficiency if your indices are sorted; rows and cols can contain indices that are owned by other processors.

Reimplemented in libMesh::PetscMatrix< T >.

Definition at line 552 of file sparse_matrix.h.

555  {
556  libmesh_not_implemented();
557  }

◆ disable_print_counter_info()

void libMesh::ReferenceCounter::disable_print_counter_info ( )
staticinherited

Definition at line 100 of file reference_counter.C.

References libMesh::ReferenceCounter::_enable_print_counter.

101 {
102  _enable_print_counter = false;
103  return;
104 }
static bool _enable_print_counter
Flag to control whether reference count information is printed when print_info is called...

◆ enable_print_counter_info()

void libMesh::ReferenceCounter::enable_print_counter_info ( )
staticinherited

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

Enabled by default.

Definition at line 94 of file reference_counter.C.

References libMesh::ReferenceCounter::_enable_print_counter.

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

95 {
96  _enable_print_counter = true;
97  return;
98 }
static bool _enable_print_counter
Flag to control whether reference count information is printed when print_info is called...

◆ flush()

template<typename T>
virtual void libMesh::SparseMatrix< T >::flush ( )
inlinevirtualinherited

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 in libMesh::PetscMatrix< T >.

Definition at line 244 of file sparse_matrix.h.

244 { close(); }
virtual void close()=0
Calls the SparseMatrix&#39;s internal assembly routines, ensuring that the values are consistent across p...

◆ get_diagonal()

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

Copies the diagonal part of the matrix into dest.

Implements libMesh::SparseMatrix< T >.

Definition at line 348 of file laspack_matrix.C.

References libMesh::NumericVector< T >::init(), libMesh::make_range(), and libMesh::NumericVector< T >::set().

349 {
350  const numeric_index_type n_rows = this->m();
351 
352  dest.init(n_rows, n_rows);
353 
354  for (numeric_index_type i : make_range(n_rows))
355  dest.set(i, Q_GetEl (const_cast<QMatrix*>(&_QMat), i+1, i+1));
356 }
QMatrix _QMat
The Laspack sparse matrix pointer.
dof_id_type numeric_index_type
Definition: id_types.h:99
virtual numeric_index_type m() const override
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:176

◆ 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.

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

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

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 & [name, cd] : _counts)
59  oss << "| " << name << " reference count information:\n"
60  << "| Creations: " << cd.first << '\n'
61  << "| Destructions: " << cd.second << '\n';
62 
63  oss << " ---------------------------------------------------------------------------- \n";
64 
65  return oss.str();
66 
67 #else
68 
69  return "";
70 
71 #endif
72 }
std::string name(const ElemQuality q)
This function returns a string containing some name for q.
Definition: elem_quality.C:42
static Counts _counts
Actually holds the data.

◆ get_row()

template<typename T >
void libMesh::LaspackMatrix< T >::get_row ( numeric_index_type  i,
std::vector< numeric_index_type > &  indices,
std::vector< T > &  values 
) 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

Implements libMesh::SparseMatrix< T >.

Definition at line 432 of file laspack_matrix.C.

435 {
436  indices.clear();
437  values.clear();
438 
439  const numeric_index_type len = (_row_start[i+1] - _row_start[i]);
440 
441  // Make sure we agree on the row length
442  libmesh_assert_equal_to (len, Q_GetLen(&_QMat, i+1));
443 
444  auto r_start = _row_start[i];
445 
446  for (numeric_index_type l=0; l<len; l++)
447  {
448  const numeric_index_type j = *(r_start + l);
449 
450  // Make sure the data structures are working
451  libmesh_assert_equal_to ((j+1), Q_GetPos (&_QMat, i+1, l));
452 
453  indices.push_back(j);
454 
455  values.push_back(Q_GetVal (&_QMat, i+1, l));
456  }
457 }
QMatrix _QMat
The Laspack sparse matrix pointer.
dof_id_type numeric_index_type
Definition: id_types.h:99
std::vector< std::vector< numeric_index_type >::const_iterator > _row_start
The start of each row in the compressed row index data structure.

◆ get_transpose()

template<typename T >
void libMesh::LaspackMatrix< 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 361 of file laspack_matrix.C.

References libMesh::LaspackMatrix< T >::_csr, libMesh::SparseMatrix< T >::_is_initialized, libMesh::LaspackMatrix< T >::_QMat, libMesh::LaspackMatrix< T >::_row_start, libMesh::LaspackMatrix< T >::clear(), libMesh::libmesh_assert(), libMesh::make_range(), and value.

362 {
363  LaspackMatrix<T> & target = cast_ref<LaspackMatrix<T> &>(dest);
364  target.clear();
365 
366  const numeric_index_type N = this->n();
367  libmesh_assert_equal_to(N, this->m());
368 
369  std::vector<numeric_index_type> col_sizes(N);
370  for (numeric_index_type row : make_range(N))
371  {
372  const numeric_index_type len = (_row_start[row+1] - _row_start[row]);
373  auto r_start = _row_start[row];
374  for (numeric_index_type l=0; l<len; l++)
375  {
376  const numeric_index_type col = *(r_start + l);
377  ++col_sizes[col];
378  }
379  }
380 
381  target._csr.resize(_csr.size());
382  target._row_start.resize(N+1);
383  std::vector<std::vector<numeric_index_type>::iterator> writeable_row_start(N+1);
384  writeable_row_start[0] = target._csr.begin();
385  target._row_start[0] = target._csr.begin();
386  for (numeric_index_type col: make_range(N))
387  {
388  writeable_row_start[col+1] = writeable_row_start[col] + col_sizes[col];
389  target._row_start[col+1] = target._row_start[col] + col_sizes[col];
390  }
391 
392  std::vector<numeric_index_type> col_offsets;
393  // Reuse memory
394  col_offsets.swap(col_sizes);
395  std::fill(col_offsets.begin(), col_offsets.end(), 0);
396 
397  Q_Constr(&target._QMat, const_cast<char *>("Mat"), N, _LPFalse, Rowws, Normal, _LPTrue);
398  target._is_initialized = true;
399 
400  for (numeric_index_type row : make_range(N))
401  {
402  const numeric_index_type len = (_row_start[row+1] - _row_start[row]);
403  auto r_start = _row_start[row];
404  for (numeric_index_type l=0; l<len; l++)
405  {
406  const numeric_index_type col = *(r_start + l);
407  *(writeable_row_start[col]+col_offsets[col]) = row;
408  ++col_offsets[col];
409  }
410  }
411 
412  for (numeric_index_type col : make_range(N))
413  {
414  auto len = col_offsets[col];
415  libmesh_assert(target._row_start[col] + len ==
416  target._row_start[col+1]);
417  Q_SetLen(&target._QMat, col+1, len);
418 
419  auto rs = target._row_start[col];
420  for (numeric_index_type l : make_range(len))
421  {
422  const numeric_index_type j = *(rs+l);
423  const auto value = Q_GetEl(const_cast<QMatrix*>(&_QMat), j+1, col+1);
424  Q_SetEntry (&target._QMat, col+1, l, j+1, value);
425  }
426  }
427 }
std::vector< numeric_index_type > _csr
The compressed row indices.
QMatrix _QMat
The Laspack sparse matrix pointer.
dof_id_type numeric_index_type
Definition: id_types.h:99
libmesh_assert(ctx)
std::vector< std::vector< numeric_index_type >::const_iterator > _row_start
The start of each row in the compressed row index data structure.
virtual numeric_index_type m() const override
virtual numeric_index_type n() const override
static const bool value
Definition: xdr_io.C:55
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:176

◆ increment_constructor_count()

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

Increments the construction counter.

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

Definition at line 183 of file reference_counter.h.

References libMesh::err, libMesh::BasicOStreamProxy< charT, traits >::get(), libMesh::Quality::name(), and libMesh::Threads::spin_mtx.

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

184 {
185  libmesh_try
186  {
187  Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx);
188  std::pair<unsigned int, unsigned int> & p = _counts[name];
189  p.first++;
190  }
191  libmesh_catch (...)
192  {
193  auto stream = libMesh::err.get();
194  stream->exceptions(stream->goodbit); // stream must not throw
195  libMesh::err << "Encountered unrecoverable error while calling "
196  << "ReferenceCounter::increment_constructor_count() "
197  << "for a(n) " << name << " object." << std::endl;
198  std::terminate();
199  }
200 }
std::string name(const ElemQuality q)
This function returns a string containing some name for q.
Definition: elem_quality.C:42
OStreamProxy err
static Counts _counts
Actually holds the data.
streamT * get()
Rather than implement every ostream/ios/ios_base function, we&#39;ll be lazy and make esoteric uses go th...
spin_mutex spin_mtx
A convenient spin mutex object which can be used for obtaining locks.
Definition: threads.C:30

◆ increment_destructor_count()

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

Increments the destruction counter.

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

Definition at line 207 of file reference_counter.h.

References libMesh::err, libMesh::BasicOStreamProxy< charT, traits >::get(), libMesh::Quality::name(), and libMesh::Threads::spin_mtx.

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

208 {
209  libmesh_try
210  {
211  Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx);
212  std::pair<unsigned int, unsigned int> & p = _counts[name];
213  p.second++;
214  }
215  libmesh_catch (...)
216  {
217  auto stream = libMesh::err.get();
218  stream->exceptions(stream->goodbit); // stream must not throw
219  libMesh::err << "Encountered unrecoverable error while calling "
220  << "ReferenceCounter::increment_destructor_count() "
221  << "for a(n) " << name << " object." << std::endl;
222  std::terminate();
223  }
224 }
std::string name(const ElemQuality q)
This function returns a string containing some name for q.
Definition: elem_quality.C:42
OStreamProxy err
static Counts _counts
Actually holds the data.
streamT * get()
Rather than implement every ostream/ios/ios_base function, we&#39;ll be lazy and make esoteric uses go th...
spin_mutex spin_mtx
A convenient spin mutex object which can be used for obtaining locks.
Definition: threads.C:30

◆ init() [1/2]

template<typename T >
void libMesh::LaspackMatrix< 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 laspack_matrix.C.

References libMesh::libMeshPrivateData::_is_initialized, libMesh::libmesh_assert(), and libMesh::make_range().

136 {
137  // noz ignored... only used for multiple processors!
138  libmesh_assert_equal_to (m_in, m_l);
139  libmesh_assert_equal_to (n_in, n_l);
140  libmesh_assert_equal_to (m_in, n_in);
141  libmesh_assert_greater (nnz, 0);
142 
143  if ((m_in != m_l) ||
144  (n_in != n_l))
145  libmesh_not_implemented_msg("Laspack does not support distributed matrices");
146 
147  if (m_in != n_in)
148  libmesh_not_implemented_msg("Laspack does not support rectangular matrices");
149 
150  if (nnz < n_in)
151  libmesh_warning("Using inefficient LaspackMatrix allocation via this init() method");
152 
153  const dof_id_type n_rows = m_in;
154 
155  // Laspack doesn't let us assign sparse indices on the fly, so
156  // without a sparsity pattern we're stuck allocating a dense matrix
157  {
158  _csr.resize (m_in * m_in);
159  _row_start.reserve(m_in + 1);
160  }
161 
162  // Initialize the _csr data structure.
163  {
164  std::vector<numeric_index_type>::iterator position = _csr.begin();
165 
166  _row_start.push_back (position);
167 
168  for (numeric_index_type row=0; row<n_rows; row++)
169  {
170  // insert the row indices
171  for (const auto & col : make_range(n_rows))
172  {
173  libmesh_assert (position != _csr.end());
174  *position = col;
175  ++position;
176  }
177 
178  _row_start.push_back (position);
179  }
180  }
181 
182  Q_Constr(&_QMat, const_cast<char *>("Mat"), m_in, _LPFalse, Rowws, Normal, _LPTrue);
183 
184  this->_is_initialized = true;
185 
186  // Tell the matrix about its structure. Initialize it
187  // to zero.
188  for (numeric_index_type i=0; i<n_rows; i++)
189  {
190  auto rs = _row_start[i];
191 
192  const numeric_index_type length = _row_start[i+1] - rs;
193 
194  Q_SetLen (&_QMat, i+1, length);
195 
196  for (numeric_index_type l=0; l<length; l++)
197  {
198  const numeric_index_type j = *(rs+l);
199 
200  libmesh_assert_equal_to (this->pos(i,j), l);
201  Q_SetEntry (&_QMat, i+1, l, j+1, 0.);
202  }
203  }
204 }
std::vector< numeric_index_type > _csr
The compressed row indices.
QMatrix _QMat
The Laspack sparse matrix pointer.
numeric_index_type pos(const numeric_index_type i, const numeric_index_type j) const
dof_id_type numeric_index_type
Definition: id_types.h:99
bool _is_initialized
Flag indicating whether or not the matrix has been initialized.
libmesh_assert(ctx)
std::vector< std::vector< numeric_index_type >::const_iterator > _row_start
The start of each row in the compressed row index data structure.
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:176
uint8_t dof_id_type
Definition: id_types.h:67

◆ init() [2/2]

template<typename T >
void libMesh::LaspackMatrix< T >::init ( ParallelType  type = PARALLEL)
overridevirtual

Initialize this matrix using the sparsity structure computed by dof_map.

Parameters
typeThe serial/parallel/ghosted type of the matrix

Implements libMesh::SparseMatrix< T >.

Definition at line 209 of file laspack_matrix.C.

References libMesh::libMeshPrivateData::_is_initialized, libMesh::initialized(), and libMesh::libmesh_assert().

210 {
211  // Ignore calls on initialized objects
212  if (this->initialized())
213  return;
214 
215  // We need a sparsity pattern for this!
216  libmesh_assert(this->_sp);
217 
218  // Clear initialized matrices
219  if (this->initialized())
220  this->clear();
221 
222  const numeric_index_type n_rows = this->_dof_map->n_dofs();
223 #ifndef NDEBUG
224  // The following variables are only used for assertions,
225  // so avoid declaring them when asserts are inactive.
226  const numeric_index_type n_cols = n_rows;
227  const numeric_index_type n_l = this->_dof_map->n_dofs_on_processor(0);
228  const numeric_index_type m_l = n_l;
229 #endif
230 
231  // Laspack Matrices only work for uniprocessor cases
232  libmesh_assert_equal_to (n_rows, n_cols);
233  libmesh_assert_equal_to (m_l, n_rows);
234  libmesh_assert_equal_to (n_l, n_cols);
235 
236 #ifndef NDEBUG
237  // The following variables are only used for assertions,
238  // so avoid declaring them when asserts are inactive.
239  const std::vector<numeric_index_type> & n_nz = this->_sp->get_n_nz();
240  const std::vector<numeric_index_type> & n_oz = this->_sp->get_n_oz();
241 #endif
242 
243  // Make sure the sparsity pattern isn't empty
244  libmesh_assert_equal_to (n_nz.size(), n_l);
245  libmesh_assert_equal_to (n_oz.size(), n_l);
246 
247  if (n_rows==0)
248  return;
249 
250  Q_Constr(&_QMat, const_cast<char *>("Mat"), n_rows, _LPFalse, Rowws, Normal, _LPTrue);
251 
252  this->_is_initialized = true;
253 
254  libmesh_assert_equal_to (n_rows, this->m());
255 }
virtual bool initialized() const
const std::vector< dof_id_type > & get_n_oz() const
The number of off-processor nonzeros in my portion of the global matrix.
SparsityPattern::Build const * _sp
The sparsity pattern associated with this object.
dof_id_type n_dofs(const unsigned int vn) const
Definition: dof_map.h:776
QMatrix _QMat
The Laspack sparse matrix pointer.
dof_id_type numeric_index_type
Definition: id_types.h:99
bool _is_initialized
Flag indicating whether or not the matrix has been initialized.
libmesh_assert(ctx)
dof_id_type n_dofs_on_processor(const processor_id_type proc) const
Definition: dof_map_base.h:197
const std::vector< dof_id_type > & get_n_nz() const
The number of on-processor nonzeros in my portion of the global matrix.
virtual void clear() override
Restores the SparseMatrix<T> to a pristine state.
DofMap const * _dof_map
The DofMap object associated with this object.
virtual numeric_index_type m() const override

◆ initialized()

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

Reimplemented in libMesh::StaticCondensation.

Definition at line 133 of file sparse_matrix.h.

Referenced by libMesh::PetscMatrix< T >::_get_submatrix(), libMesh::ImplicitSystem::assemble(), libMesh::System::init_matrices(), and libMesh::StaticCondensation::initialized().

133 { return _is_initialized; }
bool _is_initialized
Flag indicating whether or not the matrix has been initialized.

◆ l1_norm()

template<typename T >
Real libMesh::LaspackMatrix< 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 280 of file laspack_matrix.C.

References libMesh::make_range().

281 {
282  // There does not seem to be a straightforward way to iterate over
283  // the columns of a LaspackMatrix. So we use some extra storage and
284  // keep track of the column sums while going over the row entries...
285  std::vector<Real> abs_col_sums(this->n());
286 
287  const numeric_index_type n_rows = this->m();
288 
289  for (numeric_index_type row : make_range(n_rows))
290  {
291  auto r_start = _row_start[row];
292 
293  const numeric_index_type len = (_row_start[row+1] - _row_start[row]);
294 
295  // Make sure we agree on the row length
296  libmesh_assert_equal_to (len, Q_GetLen(&_QMat, row+1));
297 
298  for (numeric_index_type l=0; l<len; l++)
299  {
300  const numeric_index_type j = *(r_start + l);
301 
302  // Make sure the data structures are working
303  libmesh_assert_equal_to ((j+1), Q_GetPos (&_QMat, row+1, l));
304 
305  abs_col_sums[j] += std::abs(Q_GetVal (&_QMat, row+1, l));
306  }
307  }
308 
309  return *(std::max_element(abs_col_sums.begin(), abs_col_sums.end()));
310 }
QMatrix _QMat
The Laspack sparse matrix pointer.
dof_id_type numeric_index_type
Definition: id_types.h:99
std::vector< std::vector< numeric_index_type >::const_iterator > _row_start
The start of each row in the compressed row index data structure.
virtual numeric_index_type m() const override
virtual numeric_index_type n() const override
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:176

◆ l1_norm_diff()

template<typename T>
Real libMesh::SparseMatrix< T >::l1_norm_diff ( const SparseMatrix< T > &  other_mat) const
inherited
Returns
The l1_norm() of the difference of this and other_mat

Definition at line 1362 of file sparse_matrix.C.

1363 {
1364  auto diff_mat = this->clone();
1365  diff_mat->add(-1.0, other_mat);
1366  return diff_mat->l1_norm();
1367 }
virtual std::unique_ptr< SparseMatrix< T > > clone() const =0

◆ linfty_norm()

template<typename T >
Real libMesh::LaspackMatrix< 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 315 of file laspack_matrix.C.

References libMesh::make_range(), and libMesh::Real.

316 {
317  const numeric_index_type n_rows = this->m();
318 
319  Real max_row_sum = 0;
320 
321  for (numeric_index_type row : make_range(n_rows))
322  {
323  Real row_sum = 0;
324 
325  const numeric_index_type len = (_row_start[row+1] - _row_start[row]);
326 
327  // Make sure we agree on the row length
328  libmesh_assert_equal_to (len, Q_GetLen(&_QMat, row+1));
329 
330  for (numeric_index_type l=0; l<len; l++)
331  {
332  // Make sure the data structures are working
333  libmesh_assert_equal_to ((*(_row_start[row] + l)+1), Q_GetPos
334  (&_QMat, row+1, l));
335 
336  row_sum += std::abs(Q_GetVal (&_QMat, row+1, l));
337  }
338 
339  max_row_sum = std::max(max_row_sum, row_sum);
340  }
341 
342  return max_row_sum;
343 }
QMatrix _QMat
The Laspack sparse matrix pointer.
dof_id_type numeric_index_type
Definition: id_types.h:99
std::vector< std::vector< numeric_index_type >::const_iterator > _row_start
The start of each row in the compressed row index data structure.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
virtual numeric_index_type m() const override
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:176

◆ local_m()

template<typename T>
virtual numeric_index_type libMesh::SparseMatrix< T >::local_m ( ) const
inlinevirtualinherited

Get the number of rows owned by this process.

Reimplemented in libMesh::PetscMatrixBase< T >, libMesh::PetscMatrixBase< libMesh::Number >, and libMesh::PetscMatrixBase< Number >.

Definition at line 254 of file sparse_matrix.h.

Referenced by libMesh::CondensedEigenSystem::copy_super_to_sub().

254 { return row_stop() - row_start(); }
virtual numeric_index_type row_stop() const =0
virtual numeric_index_type row_start() const =0

◆ local_n()

template<typename T>
virtual numeric_index_type libMesh::SparseMatrix< T >::local_n ( ) const
inlinevirtualinherited

Get the number of columns owned by this process.

Reimplemented in libMesh::PetscMatrixBase< T >, libMesh::PetscMatrixBase< libMesh::Number >, and libMesh::PetscMatrixBase< Number >.

Definition at line 259 of file sparse_matrix.h.

259 { return col_stop() - col_start(); }
virtual numeric_index_type col_stop() const =0
virtual numeric_index_type col_start() const =0

◆ m()

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

Implements libMesh::SparseMatrix< T >.

Definition at line 554 of file laspack_matrix.C.

References libMesh::initialized(), and libMesh::libmesh_assert().

555 {
556  libmesh_assert (this->initialized());
557 
558  return static_cast<numeric_index_type>(Q_GetDim(const_cast<QMatrix*>(&_QMat)));
559 }
virtual bool initialized() const
QMatrix _QMat
The Laspack sparse matrix pointer.
dof_id_type numeric_index_type
Definition: id_types.h:99
libmesh_assert(ctx)

◆ matrix_matrix_mult()

template<typename T>
virtual void libMesh::SparseMatrix< T >::matrix_matrix_mult ( SparseMatrix< T > &  ,
SparseMatrix< T > &  ,
bool   
)
inlinevirtualinherited

Compute Y = A*X for matrix X.

Reimplemented in libMesh::PetscMatrix< T >.

Definition at line 349 of file sparse_matrix.h.

350  { libmesh_not_implemented(); }

◆ n()

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

Implements libMesh::SparseMatrix< T >.

Definition at line 564 of file laspack_matrix.C.

References libMesh::initialized(), and libMesh::libmesh_assert().

565 {
566  libmesh_assert (this->initialized());
567 
568  return static_cast<numeric_index_type>(Q_GetDim(const_cast<QMatrix*>(&_QMat)));
569 }
virtual bool initialized() const
QMatrix _QMat
The Laspack sparse matrix pointer.
dof_id_type numeric_index_type
Definition: id_types.h:99
libmesh_assert(ctx)

◆ n_nonzeros()

template<typename T >
std::size_t libMesh::SparseMatrix< T >::n_nonzeros ( ) const
virtualinherited
Returns
the global number of non-zero entries in the matrix sparsity pattern

Definition at line 266 of file sparse_matrix.C.

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

267 {
268  if (!_sp)
269  return 0;
270  return _sp->n_nonzeros();
271 }
std::size_t n_nonzeros() const
The total number of nonzeros in the global matrix.
SparsityPattern::Build const * _sp
The sparsity pattern associated with this object.

◆ n_objects()

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

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

Definition at line 85 of file reference_counter.h.

References libMesh::ReferenceCounter::_n_objects.

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

86  { return _n_objects; }
static Threads::atomic< unsigned int > _n_objects
The number of objects.

◆ n_processors()

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

Definition at line 103 of file parallel_object.h.

References libMesh::ParallelObject::_communicator, libMesh::libmesh_assert(), and TIMPI::Communicator::size().

Referenced by libMesh::Partitioner::_find_global_index_by_pid_map(), 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::System::add_vector(), libMesh::LaplaceMeshSmoother::allgather_graph(), libMesh::DofMap::allgather_recursive_constraints(), libMesh::FEMSystem::assembly(), libMesh::Nemesis_IO::assert_symmetric_cmaps(), libMesh::Partitioner::assign_partitioning(), libMesh::AztecLinearSolver< T >::AztecLinearSolver(), libMesh::Partitioner::build_graph(), libMesh::EquationSystems::build_parallel_elemental_solution_vector(), libMesh::DistributedMesh::clear(), libMesh::DistributedMesh::clear_elems(), libMesh::Nemesis_IO_Helper::compute_border_node_ids(), libMesh::Nemesis_IO_Helper::construct_nemesis_filename(), libMesh::UnstructuredMesh::copy_nodes_and_elements(), libMesh::Nemesis_IO::copy_scalar_solution(), libMesh::ExodusII_IO::copy_scalar_solution(), libMesh::UnstructuredMesh::create_pid_mesh(), libMesh::MeshTools::create_processor_bounding_box(), libMesh::DofMap::distribute_dofs(), libMesh::DofMap::distribute_scalar_dofs(), libMesh::DistributedMesh::DistributedMesh(), libMesh::EnsightIO::EnsightIO(), libMesh::RBEIMEvaluation::gather_bfs(), libMesh::MeshBase::get_info(), libMesh::StaticCondensation::init(), libMesh::SystemSubsetBySubdomain::init(), libMesh::PetscDMWrapper::init_petscdm(), libMesh::Nemesis_IO_Helper::initialize(), libMesh::ExodusII_IO_Helper::initialize(), libMesh::DistributedMesh::insert_elem(), libMesh::NumericVector< Number >::is_effectively_ghosted(), libMesh::NumericVector< Number >::is_effectively_serial(), 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::n_active_elem_on_proc(), libMesh::DofMap::n_dofs_per_processor(), libMesh::MeshBase::n_elem_on_proc(), libMesh::MeshBase::n_nodes_on_proc(), libMesh::RBEIMEvaluation::node_gather_bfs(), libMesh::Partitioner::partition(), libMesh::MeshBase::partition(), libMesh::Partitioner::partition_unpartitioned_elements(), libMesh::System::point_gradient(), libMesh::System::point_hessian(), libMesh::System::point_value(), libMesh::DofMap::prepare_send_list(), libMesh::MeshBase::print_constraint_rows(), 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(), libMesh::Partitioner::repartition(), OverlappingFunctorTest::run_partitioner_test(), libMesh::DofMap::scatter_constraints(), libMesh::DistributedMesh::set_next_unique_id(), libMesh::DofMap::set_nonlocal_dof_objects(), libMesh::PetscDMWrapper::set_point_range_in_section(), WriteVecAndScalar::setupTests(), libMesh::RBEIMEvaluation::side_gather_bfs(), DistributedMeshTest::testRemoteElemError(), CheckpointIOTest::testSplitter(), libMesh::MeshRefinement::uniformly_coarsen(), libMesh::DistributedMesh::update_parallel_id_counts(), libMesh::GMVIO::write_binary(), libMesh::GMVIO::write_discontinuous_gmv(), libMesh::ExodusII_IO_Helper::write_nodal_coordinates(), libMesh::VTKIO::write_nodal_data(), libMesh::ExodusII_IO::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().

104  {
105  processor_id_type returnval =
106  cast_int<processor_id_type>(_communicator.size());
107  libmesh_assert(returnval); // We never have an empty comm
108  return returnval;
109  }
const Parallel::Communicator & _communicator
processor_id_type size() const
uint8_t processor_id_type
libmesh_assert(ctx)

◆ need_full_sparsity_pattern()

template<typename T>
virtual bool libMesh::LaspackMatrix< T >::need_full_sparsity_pattern ( ) const
inlineoverridevirtual

The LaspackMatrix needs the full sparsity pattern.

Reimplemented from libMesh::SparseMatrix< T >.

Definition at line 96 of file laspack_matrix.h.

97  { return true; }

◆ operator()()

template<typename T >
T libMesh::LaspackMatrix< 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 700 of file laspack_matrix.C.

References libMesh::initialized(), and libMesh::libmesh_assert().

702 {
703  libmesh_assert (this->initialized());
704  libmesh_assert_less (i, this->m());
705  libmesh_assert_less (j, this->n());
706 
707  return Q_GetEl (const_cast<QMatrix*>(&_QMat), i+1, j+1);
708 }
virtual bool initialized() const
QMatrix _QMat
The Laspack sparse matrix pointer.
libmesh_assert(ctx)
virtual numeric_index_type m() const override
virtual numeric_index_type n() const override

◆ operator=() [1/3]

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

◆ operator=() [2/3]

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

◆ operator=() [3/3]

template<typename T>
virtual SparseMatrix<T>& libMesh::LaspackMatrix< T >::operator= ( const SparseMatrix< T > &  )
inlineoverridevirtual

This looks like a copy assignment operator, but note that, unlike normal copy assignment operators, it is pure virtual.

This function should be overridden in derived classes so that they can be copied correctly via references to the base class. This design usually isn't a good idea in general, but in this context it works because we usually don't have a mix of different kinds of SparseMatrix active in the library at a single time.

Returns
A reference to *this as the base type.

Reimplemented from libMesh::SparseMatrix< T >.

Definition at line 82 of file laspack_matrix.h.

83  {
84  libmesh_not_implemented();
85  return *this;
86  }

◆ pos()

template<typename T >
numeric_index_type libMesh::LaspackMatrix< T >::pos ( const numeric_index_type  i,
const numeric_index_type  j 
) const
private
Returns
The position in the compressed row storage scheme of the \( (i,j) \) element.

Definition at line 713 of file laspack_matrix.C.

References distance(), and libMesh::libmesh_assert().

715 {
716  libmesh_assert_less (i, this->m());
717  libmesh_assert_less (j, this->n());
718  libmesh_assert_less (i+1, _row_start.size());
719  libmesh_assert (_row_start.back() == _csr.end());
720 
721  // note this requires the _csr to be sorted
722  auto p = std::equal_range (_row_start[i], _row_start[i+1], j);
723 
724  // Make sure the row contains the element j
725  libmesh_assert (p.first != p.second);
726 
727  // Make sure the values match
728  libmesh_assert (*p.first == j);
729 
730  // Return the position in the compressed row
731  return std::distance (_row_start[i], p.first);
732 }
std::vector< numeric_index_type > _csr
The compressed row indices.
Real distance(const Point &p)
libmesh_assert(ctx)
std::vector< std::vector< numeric_index_type >::const_iterator > _row_start
The start of each row in the compressed row index data structure.
virtual numeric_index_type m() const override
virtual numeric_index_type n() const override

◆ print() [1/3]

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

Definition at line 159 of file sparse_matrix.C.

160 {
161  // std::complex<>::operator<<() is defined, but use this form
162 
163  if (sparse)
164  {
165  libmesh_not_implemented();
166  }
167 
168  os << "Real part:" << std::endl;
169  for (auto i : make_range(this->m()))
170  {
171  for (auto j : make_range(this->n()))
172  os << std::setw(8) << (*this)(i,j).real() << " ";
173  os << std::endl;
174  }
175 
176  os << std::endl << "Imaginary part:" << std::endl;
177  for (auto i : make_range(this->m()))
178  {
179  for (auto j : make_range(this->n()))
180  os << std::setw(8) << (*this)(i,j).imag() << " ";
181  os << std::endl;
182  }
183 }
boost::multiprecision::float128 real(const boost::multiprecision::float128 in)
virtual numeric_index_type m() const =0
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:176
boost::multiprecision::float128 imag(const boost::multiprecision::float128)
virtual numeric_index_type n() const =0

◆ print() [2/3]

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 275 of file sparse_matrix.C.

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

276 {
277  parallel_object_only();
278 
279  libmesh_assert (this->initialized());
280 
281  const numeric_index_type first_dof = this->row_start(),
282  end_dof = this->row_stop();
283 
284  // We'll print the matrix from processor 0 to make sure
285  // it's serialized properly
286  if (this->processor_id() == 0)
287  {
288  libmesh_assert_equal_to (first_dof, 0);
289  for (numeric_index_type i : make_range(end_dof))
290  {
291  if (sparse)
292  {
293  for (auto j : make_range(this->n()))
294  {
295  T c = (*this)(i,j);
296  if (c != static_cast<T>(0.0))
297  {
298  os << i << " " << j << " " << c << std::endl;
299  }
300  }
301  }
302  else
303  {
304  for (auto j : make_range(this->n()))
305  os << (*this)(i,j) << " ";
306  os << std::endl;
307  }
308  }
309 
310  std::vector<numeric_index_type> ibuf, jbuf;
311  std::vector<T> cbuf;
312  numeric_index_type currenti = end_dof;
313  for (auto p : IntRange<processor_id_type>(1, this->n_processors()))
314  {
315  this->comm().receive(p, ibuf);
316  this->comm().receive(p, jbuf);
317  this->comm().receive(p, cbuf);
318  libmesh_assert_equal_to (ibuf.size(), jbuf.size());
319  libmesh_assert_equal_to (ibuf.size(), cbuf.size());
320 
321  if (ibuf.empty())
322  continue;
323  libmesh_assert_greater_equal (ibuf.front(), currenti);
324  libmesh_assert_greater_equal (ibuf.back(), ibuf.front());
325 
326  std::size_t currentb = 0;
327  for (;currenti <= ibuf.back(); ++currenti)
328  {
329  if (sparse)
330  {
331  for (numeric_index_type j=0; j<this->n(); j++)
332  {
333  if (currentb < ibuf.size() &&
334  ibuf[currentb] == currenti &&
335  jbuf[currentb] == j)
336  {
337  os << currenti << " " << j << " " << cbuf[currentb] << std::endl;
338  currentb++;
339  }
340  }
341  }
342  else
343  {
344  for (auto j : make_range(this->n()))
345  {
346  if (currentb < ibuf.size() &&
347  ibuf[currentb] == currenti &&
348  jbuf[currentb] == j)
349  {
350  os << cbuf[currentb] << " ";
351  currentb++;
352  }
353  else
354  os << static_cast<T>(0.0) << " ";
355  }
356  os << std::endl;
357  }
358  }
359  }
360  if (!sparse)
361  {
362  for (; currenti != this->m(); ++currenti)
363  {
364  for (numeric_index_type j=0; j<this->n(); j++)
365  os << static_cast<T>(0.0) << " ";
366  os << std::endl;
367  }
368  }
369  }
370  else
371  {
372  std::vector<numeric_index_type> ibuf, jbuf;
373  std::vector<T> cbuf;
374 
375  // We'll assume each processor has access to entire
376  // matrix rows, so (*this)(i,j) is valid if i is a local index.
377  for (numeric_index_type i : make_range(first_dof, end_dof))
378  {
379  for (auto j : make_range(this->n()))
380  {
381  T c = (*this)(i,j);
382  if (c != static_cast<T>(0.0))
383  {
384  ibuf.push_back(i);
385  jbuf.push_back(j);
386  cbuf.push_back(c);
387  }
388  }
389  }
390  this->comm().send(0,ibuf);
391  this->comm().send(0,jbuf);
392  this->comm().send(0,cbuf);
393  }
394 }
virtual bool initialized() const
const Parallel::Communicator & comm() const
virtual numeric_index_type row_stop() const =0
processor_id_type n_processors() const
Status receive(const unsigned int dest_processor_id, T &buf, const MessageTag &tag=any_tag) const
dof_id_type numeric_index_type
Definition: id_types.h:99
virtual numeric_index_type m() const =0
libmesh_assert(ctx)
virtual numeric_index_type row_start() const =0
void send(const unsigned int dest_processor_id, const T &buf, const MessageTag &tag=no_tag) const
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:176
processor_id_type processor_id() const
virtual numeric_index_type n() const =0

◆ print() [3/3]

template<typename T >
void libMesh::SparseMatrix< T >::print ( const std::string &  filename) const
inherited

Print the contents of the matrix to a file, with a file format depending on the extension of filename.

Definition at line 754 of file sparse_matrix.C.

755 {
756  {
757  std::ofstream outstr (filename.c_str());
758  libmesh_error_msg_if
759  (!outstr.good(), "ERROR: cannot write to file:\n\t" <<
760  filename);
761  }
762 
763  std::string_view basename = Utility::basename_of(filename);
764 
765  const bool gzipped_file = Utility::ends_with(filename, ".gz");
766 
767  if (gzipped_file)
768  basename.remove_suffix(3);
769 
770  if (Utility::ends_with(basename, ".matlab") ||
771  Utility::ends_with(basename, ".m"))
772  this->print_matlab(filename);
773  else if (Utility::ends_with(basename, ".petsc64"))
774  {
775 #ifndef LIBMESH_HAVE_PETSC
776  libmesh_error_msg("Cannot load PETSc matrix file " <<
777  filename << " without PETSc-enabled libMesh.");
778 #elif LIBMESH_DOF_ID_BYTES != 8
779  libmesh_error_msg("Cannot load 64-bit PETSc matrix file " <<
780  filename << " with non-64-bit libMesh.");
781 #endif
782  if (gzipped_file)
783  libmesh_not_implemented_msg("Gzipped PETSc matrices are not currently supported");
784  this->print_petsc_binary(filename);
785  }
786  else if (Utility::ends_with(basename, ".petsc32"))
787  {
788 #ifndef LIBMESH_HAVE_PETSC
789  libmesh_error_msg("Cannot load PETSc matrix file " <<
790  filename << " without PETSc-enabled libMesh.");
791 #elif LIBMESH_DOF_ID_BYTES != 4
792  libmesh_error_msg("Cannot load 32-bit PETSc matrix file " <<
793  filename << " with non-32-bit libMesh.");
794 #endif
795  if (gzipped_file)
796  libmesh_not_implemented_msg("Gzipped PETSc matrices are not currently supported");
797  this->print_petsc_binary(filename);
798  }
799  else if (Utility::ends_with(basename, ".h5"))
800  {
801  if (gzipped_file)
802  libmesh_not_implemented_msg("Gzipped HDF5 matrices are not currently supported");
803  this->print_coreform_hdf5(filename);
804  }
805  else
806  libmesh_error_msg(" ERROR: Unrecognized matrix file extension on: "
807  << basename
808  << "\n I understand the following:\n\n"
809  << " *.h5 -- CoreForm HDF5 sparse matrix format\n"
810  << " *.matlab -- Matlab sparse matrix format\n"
811  << " *.matlab.gz -- Matlab sparse matrix format, gzipped\n"
812  << " *.m -- Matlab sparse matrix format\n"
813  << " *.m.gz -- Matlab sparse matrix format, gzipped\n"
814  << " *.petsc32 -- PETSc binary format, 32-bit\n"
815  << " *.petsc64 -- PETSc binary format, 64-bit\n"
816  );
817 }
bool ends_with(std::string_view superstring, std::string_view suffix)
Look for a substring at the very end of a string.
Definition: utility.C:213
virtual void print_coreform_hdf5(const std::string &filename, const std::string &groupname="extraction") const
Print the contents of the matrix to a file, with the HDF5 sparse matrix format used by CoreForm...
virtual void print_petsc_binary(const std::string &filename) const
Write the contents of the matrix to a file in PETSc&#39;s binary sparse matrix format.
std::string_view basename_of(const std::string &fullname)
Definition: utility.C:108
virtual void print_matlab(const std::string &="") const
Print the contents of the matrix in Matlab&#39;s sparse matrix format.

◆ print_coreform_hdf5()

template<typename T >
void libMesh::SparseMatrix< T >::print_coreform_hdf5 ( const std::string &  filename,
const std::string &  groupname = "extraction" 
) const
virtualinherited

Print the contents of the matrix to a file, with the HDF5 sparse matrix format used by CoreForm, putting CSR sparse matrix data in the group given by groupname.

Definition at line 521 of file sparse_matrix.C.

523 {
524 #if defined(LIBMESH_USE_COMPLEX_NUMBERS) || !defined(LIBMESH_HAVE_HDF5)
525  // TODO: HDF5 version 2.0.0 and later adds native support for
526  // complex numbers with the H5T_NATIVE_DOUBLE_COMPLEX type [0], so
527  // we could consider supporting T==std::complex<Real> in the future.
528  // [0]: https://forum.hdfgroup.org/t/coming-in-the-next-hdf5-release-native-support-for-complex-number-datatypes/13543
529  libmesh_ignore(filename, groupname);
530  libmesh_error_msg("ERROR: need HDF5 support to handle .h5 files!!!");
531 #else
532  LOG_SCOPE("print_coreform_hdf5()", "SparseMatrix");
533 
534  // In this implementation, we copy the SparseMatrix entries into a
535  // std::vector<double>, so this won't work for any Number type for
536  // which sizeof(Number) > sizeof(double).
537  if constexpr (sizeof(T) > sizeof(double))
538  libmesh_not_implemented();
539 
540  const numeric_index_type first_dof = this->row_start(),
541  end_dof = this->row_stop();
542 
543  std::vector<std::size_t> cols, row_offsets;
544  std::vector<double> vals;
545 
546  if (this->processor_id() == 0)
547  row_offsets.push_back(0);
548 
549  for (numeric_index_type i : make_range(first_dof, end_dof))
550  {
551  for (auto j : make_range(this->n()))
552  {
553  T c = (*this)(i,j);
554  if (c != static_cast<T>(0.0))
555  {
556  cols.push_back(j);
557  vals.push_back(c);
558  }
559  }
560  // This is a *local* row offset; proc 0 may need to adjust later
561  row_offsets.push_back(cols.size());
562  }
563 
564  if (this->processor_id() == 0)
565  {
566  const hid_t file = H5Fcreate(filename.c_str(), H5F_ACC_TRUNC,
567  H5P_DEFAULT, H5P_DEFAULT);
568  if (file == H5I_INVALID_HID)
569  libmesh_file_error(filename);
570 
571  const hid_t group =
572  H5Gcreate2(file, groupname.c_str(), H5P_DEFAULT, H5P_DEFAULT,
573  H5P_DEFAULT);
574  check_open(filename, group, groupname);
575 
576  auto write_size_attribute = [&filename, &group]
577  (const std::string & attribute_name, unsigned long long writeval)
578  {
579  const hid_t fspace = H5Screate(H5S_SCALAR);
580  check_hdf5(filename, fspace, attribute_name + " fspace");
581 
582  const hid_t attr = H5Acreate2(group, attribute_name.c_str(),
583  H5T_STD_I64LE, fspace,
584  H5P_DEFAULT, H5P_DEFAULT);
585  check_hdf5(filename, attr, attribute_name);
586 
587  // HDF5 is supposed to handle both upscaling and endianness
588  // conversions here
589  const herr_t errval = H5Awrite(attr, H5T_NATIVE_ULLONG, &writeval);
590  check_hdf5(filename, errval, attribute_name + " write");
591 
592  H5Aclose(attr);
593  H5Sclose(fspace);
594  };
595 
596  write_size_attribute("num_cols", this->n());
597  write_size_attribute("num_rows", this->m());
598 
599  auto write_vector = [&filename, &group]
600  (const std::string & dataname, auto hdf5_file_type,
601  auto hdf5_native_type, auto & datavec)
602  {
603  const hsize_t len[1] = {cast_int<hsize_t>(datavec.size())};
604 
605  const hid_t space = H5Screate_simple(1, len, nullptr);
606  check_hdf5(filename, space, dataname + " space");
607 
608  const hid_t data =
609  H5Dcreate2(group, dataname.c_str(), hdf5_file_type, space,
610  H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
611  check_hdf5(filename, data, dataname + " data");
612 
613  const hid_t errval =
614  H5Dwrite(data, hdf5_native_type, H5S_ALL, H5S_ALL,
615  H5P_DEFAULT, datavec.data());
616  check_hdf5(filename, errval, dataname + " write");
617 
618  H5Dclose(data);
619  H5Sclose(space);
620  };
621 
622  std::vector<std::size_t> vals_sizes, first_dofs;
623  this->comm().gather(0, vals.size(), vals_sizes);
624  this->comm().gather(0, cast_int<std::size_t>(first_dof), first_dofs);
625  first_dofs.push_back(this->m());
626 
627  this->comm().allgather(cols);
628  this->comm().allgather(vals);
629  this->comm().allgather(row_offsets);
630 
631  libmesh_assert_equal_to(vals.size(),
632  cols.size());
633  libmesh_assert_equal_to(vals.size(),
634  std::accumulate(vals_sizes.begin(),
635  vals_sizes.end(),
636  std::size_t(0)));
637 
638  std::size_t extra_offset = 0;
639  for (auto p : make_range(processor_id_type(1), this->n_processors()))
640  {
641  extra_offset += vals_sizes[p-1];
642  for (auto i : make_range(first_dofs[p]+1, first_dofs[p+1]+1))
643  row_offsets[i] += extra_offset;
644  }
645 
646  write_vector("cols", H5T_STD_U64LE, H5T_NATIVE_ULLONG, cols);
647  write_vector("row_offsets", H5T_STD_U64LE, H5T_NATIVE_ULLONG, row_offsets);
648  write_vector("vals", H5T_IEEE_F64LE, H5T_NATIVE_DOUBLE, vals);
649 
650  H5Gclose(group);
651  H5Fclose(file);
652  }
653  else
654  {
655  std::vector<std::size_t> dummy;
656  this->comm().gather(0, vals.size(), dummy);
657  this->comm().gather(0, cast_int<std::size_t>(first_dof), dummy);
658  this->comm().allgather(cols);
659  this->comm().allgather(vals);
660  this->comm().allgather(row_offsets);
661  }
662 #endif // LIBMESH_HAVE_HDF5
663 }
void allgather(const T &send_data, std::vector< T, A > &recv_data) const
void gather(const unsigned int root_id, const T &send_data, std::vector< T, A > &recv) const
const Parallel::Communicator & comm() const
uint8_t processor_id_type
Definition: id_types.h:104
virtual numeric_index_type row_stop() const =0
processor_id_type n_processors() const
void libmesh_ignore(const Args &...)
dof_id_type numeric_index_type
Definition: id_types.h:99
virtual numeric_index_type m() const =0
virtual numeric_index_type row_start() const =0
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:176
processor_id_type processor_id() const
virtual numeric_index_type n() const =0

◆ print_info()

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

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

Definition at line 81 of file reference_counter.C.

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

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

82 {
84  out_stream << ReferenceCounter::get_info();
85 }
static std::string get_info()
Gets a string containing the reference information.
static bool _enable_print_counter
Flag to control whether reference count information is printed when print_info is called...

◆ print_matlab()

template<typename T >
void libMesh::SparseMatrix< T >::print_matlab ( const std::string &  name = "") const
virtualinherited

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.

Reimplemented in libMesh::PetscMatrix< T >.

Definition at line 398 of file sparse_matrix.C.

399 {
400  parallel_object_only();
401 
402  libmesh_assert (this->initialized());
403 
404  const numeric_index_type first_dof = this->row_start(),
405  end_dof = this->row_stop();
406 
407  // We'll print the matrix from processor 0 to make sure
408  // it's serialized properly
409  if (this->processor_id() == 0)
410  {
411  std::unique_ptr<std::ofstream> file;
412 
413  if (name != "")
414  file = std::make_unique<std::ofstream>(name.c_str());
415 
416  std::ostream & os = (name == "") ? libMesh::out : *file;
417 
418  std::size_t sparsity_nonzeros = this->n_nonzeros();
419 
420  std::size_t real_nonzeros = 0;
421 
422  libmesh_assert_equal_to(first_dof, 0);
423  for (numeric_index_type i : make_range(end_dof))
424  {
425  for (auto j : make_range(this->n()))
426  {
427  T c = (*this)(i,j);
428  if (c != static_cast<T>(0.0))
429  ++real_nonzeros;
430  }
431  }
432 
433 
434  for (auto p : IntRange<processor_id_type>(1, this->n_processors()))
435  {
436  std::size_t nonzeros_on_p = 0;
437  this->comm().receive(p, nonzeros_on_p);
438  real_nonzeros += nonzeros_on_p;
439  }
440 
441  if (sparsity_nonzeros &&
442  sparsity_nonzeros != real_nonzeros)
443  libmesh_warning(sparsity_nonzeros <<
444  " nonzeros allocated, but " <<
445  real_nonzeros << " used.");
446 
447  // We probably want to be more consistent than that, if our
448  // sparsity is overallocated.
449 
450  // Print a header similar to PETSc's mat_view ascii_matlab
451  os << "%Mat Object: () " << this->n_processors() << " MPI processes\n"
452  << "% type: " << (this->n_processors() > 1 ? "mpi" : "seq") << "aij\n"
453  << "% Size = " << this->m() << ' ' << this->n() << '\n'
454  << "% Nonzeros = " << real_nonzeros << '\n'
455  << "zzz = zeros(" << real_nonzeros << ",3);\n"
456  << "zzz = [\n";
457 
458  for (numeric_index_type i : make_range(end_dof))
459  {
460  // FIXME - we need a base class way to iterate over a
461  // SparseMatrix row.
462  for (auto j : make_range(this->n()))
463  {
464  T c = (*this)(i,j);
465  if (c != static_cast<T>(0.0))
466  {
467  // Convert from 0-based to 1-based indexing
468  os << (i+1) << ' ' << (j+1) << " " << c << '\n';
469  }
470  }
471  }
472 
473  std::vector<numeric_index_type> ibuf, jbuf;
474  std::vector<T> cbuf;
475  for (auto p : IntRange<processor_id_type>(1, this->n_processors()))
476  {
477  this->comm().receive(p, ibuf);
478  this->comm().receive(p, jbuf);
479  this->comm().receive(p, cbuf);
480  libmesh_assert_equal_to (ibuf.size(), jbuf.size());
481  libmesh_assert_equal_to (ibuf.size(), cbuf.size());
482 
483  for (auto n : index_range(ibuf))
484  os << ibuf[n] << ' ' << jbuf[n] << " " << cbuf[n] << '\n';
485  }
486 
487  os << "];\n" << "Mat_sparse = spconvert(zzz);" << std::endl;
488  }
489  else
490  {
491  std::vector<numeric_index_type> ibuf, jbuf;
492  std::vector<T> cbuf;
493  std::size_t my_nonzeros = 0;
494 
495  // We'll assume each processor has access to entire
496  // matrix rows, so (*this)(i,j) is valid if i is a local index.
497  for (numeric_index_type i : make_range(first_dof, end_dof))
498  {
499  for (auto j : make_range(this->n()))
500  {
501  T c = (*this)(i,j);
502  if (c != static_cast<T>(0.0))
503  {
504  ibuf.push_back(i);
505  jbuf.push_back(j);
506  cbuf.push_back(c);
507  ++my_nonzeros;
508  }
509  }
510  }
511  this->comm().send(0,my_nonzeros);
512  this->comm().send(0,ibuf);
513  this->comm().send(0,jbuf);
514  this->comm().send(0,cbuf);
515  }
516 }
std::string name(const ElemQuality q)
This function returns a string containing some name for q.
Definition: elem_quality.C:42
virtual bool initialized() const
virtual std::size_t n_nonzeros() const
const Parallel::Communicator & comm() const
virtual numeric_index_type row_stop() const =0
processor_id_type n_processors() const
Status receive(const unsigned int dest_processor_id, T &buf, const MessageTag &tag=any_tag) const
dof_id_type numeric_index_type
Definition: id_types.h:99
virtual numeric_index_type m() const =0
libmesh_assert(ctx)
virtual numeric_index_type row_start() const =0
void send(const unsigned int dest_processor_id, const T &buf, const MessageTag &tag=no_tag) const
OStreamProxy out
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:176
processor_id_type processor_id() const
auto index_range(const T &sizable)
Helper function that returns an IntRange<std::size_t> representing all the indices of the passed-in v...
Definition: int_range.h:153
virtual numeric_index_type n() const =0

◆ print_personal()

template<typename T>
virtual void libMesh::LaspackMatrix< T >::print_personal ( std::ostream &  os = libMesh::out) const
inlineoverridevirtual

Print the contents of the matrix to the screen in a package-personalized style, if available.

Implements libMesh::SparseMatrix< T >.

Definition at line 171 of file laspack_matrix.h.

References libMesh::SparseMatrix< T >::print().

171 { this->print(os); }
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 packag...

◆ print_petsc_binary()

template<typename T >
void libMesh::SparseMatrix< T >::print_petsc_binary ( const std::string &  filename) const
virtualinherited

Write the contents of the matrix to a file in PETSc's binary sparse matrix format.

Reimplemented in libMesh::PetscMatrix< T >.

Definition at line 668 of file sparse_matrix.C.

669 {
670  libmesh_not_implemented_msg
671  ("libMesh cannot write PETSc binary-format files from non-PETSc matrices");
672 }

◆ print_petsc_hdf5()

template<typename T >
void libMesh::SparseMatrix< T >::print_petsc_hdf5 ( const std::string &  filename) const
virtualinherited

Write the contents of the matrix to a file in PETSc's HDF5 sparse matrix format.

Reimplemented in libMesh::PetscMatrix< T >.

Definition at line 677 of file sparse_matrix.C.

678 {
679  libmesh_not_implemented_msg
680  ("libMesh cannot write PETSc HDF5-format files from non-PETSc matrices");
681 }

◆ processor_id()

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

Definition at line 114 of file parallel_object.h.

References libMesh::ParallelObject::_communicator, and TIMPI::Communicator::rank().

Referenced by libMesh::BoundaryInfo::_find_id_maps(), 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::MeshTools::Modification::all_tri(), libMesh::DofMap::allgather_recursive_constraints(), libMesh::FEMSystem::assembly(), libMesh::Nemesis_IO::assert_symmetric_cmaps(), libMesh::Partitioner::assign_partitioning(), libMesh::Nemesis_IO_Helper::build_element_and_node_maps(), libMesh::Partitioner::build_graph(), libMesh::InfElemBuilder::build_inf_elem(), libMesh::BoundaryInfo::build_node_list_from_side_list(), libMesh::EquationSystems::build_parallel_elemental_solution_vector(), libMesh::EquationSystems::build_parallel_solution_vector(), libMesh::MeshFunction::check_found_elem(), libMesh::DistributedMesh::clear(), libMesh::DistributedMesh::clear_elems(), 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_elemental_solution(), libMesh::ExodusII_IO::copy_nodal_solution(), libMesh::Nemesis_IO::copy_scalar_solution(), libMesh::ExodusII_IO::copy_scalar_solution(), libMesh::MeshTools::correct_node_proc_ids(), libMesh::ExodusII_IO_Helper::create(), libMesh::DistributedMesh::delete_elem(), libMesh::MeshCommunication::delete_remote_elements(), libMesh::DofMap::distribute_dofs(), libMesh::DofMap::distribute_scalar_dofs(), libMesh::DistributedMesh::DistributedMesh(), libMesh::DofMapBase::end_dof(), libMesh::DofMapBase::end_old_dof(), libMesh::EnsightIO::EnsightIO(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::SubFunctor::find_dofs_to_send(), libMesh::UnstructuredMesh::find_neighbors(), libMesh::DofMapBase::first_dof(), libMesh::DofMapBase::first_old_dof(), libMesh::RBEIMEvaluation::gather_bfs(), 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::MeshBase::get_info(), libMesh::DofMap::get_info(), libMesh::Nemesis_IO_Helper::get_init_global(), libMesh::Nemesis_IO_Helper::get_init_info(), libMesh::RBEIMEvaluation::get_interior_basis_functions_as_vecs(), libMesh::Nemesis_IO_Helper::get_loadbal_param(), libMesh::DofMap::get_local_constraints(), libMesh::MeshBase::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::LaplaceMeshSmoother::init(), libMesh::SystemSubsetBySubdomain::init(), 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::TransientRBEvaluation::legacy_write_offline_data_to_files(), libMesh::RBSCMEvaluation::legacy_write_offline_data_to_files(), libMesh::RBEvaluation::legacy_write_offline_data_to_files(), 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::TriangulatorInterface::MeshedHole::MeshedHole(), libMesh::MeshBase::n_active_local_elem(), libMesh::BoundaryInfo::n_boundary_conds(), libMesh::MeshTools::n_connected_components(), libMesh::MeshBase::n_constraint_rows(), libMesh::BoundaryInfo::n_edge_conds(), libMesh::DofMapBase::n_local_dofs(), libMesh::MeshBase::n_local_elem(), libMesh::MeshBase::n_local_nodes(), libMesh::BoundaryInfo::n_nodeset_conds(), libMesh::BoundaryInfo::n_shellface_conds(), libMesh::RBEIMEvaluation::node_gather_bfs(), libMesh::DistributedMesh::own_node(), libMesh::BoundaryInfo::parallel_sync_node_ids(), libMesh::BoundaryInfo::parallel_sync_side_ids(), libMesh::System::point_gradient(), libMesh::System::point_hessian(), libMesh::System::point_value(), libMesh::MeshBase::print_constraint_rows(), libMesh::DofMap::print_dof_constraints(), libMesh::DofMap::process_mesh_constraint_rows(), 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::EquationSystems::read(), libMesh::ExodusII_IO_Helper::read_elem_num_map(), libMesh::ExodusII_IO_Helper::read_global_values(), libMesh::ExodusII_IO::read_header(), libMesh::CheckpointIO::read_header(), libMesh::XdrIO::read_header(), libMesh::System::read_header(), libMesh::DynaIO::read_mesh(), 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::Nemesis_IO_Helper::read_var_names_impl(), libMesh::SimplexRefiner::refine_via_edges(), libMesh::StaticCondensationDofMap::reinit(), libMesh::DistributedMesh::renumber_dof_objects(), libMesh::DistributedMesh::renumber_nodes_and_elements(), libMesh::DofMap::scatter_constraints(), libMesh::CheckpointIO::select_split_config(), libMesh::DistributedMesh::set_next_unique_id(), libMesh::DofMap::set_nonlocal_dof_objects(), libMesh::PetscDMWrapper::set_point_range_in_section(), libMesh::RBEIMEvaluation::side_gather_bfs(), MeshFunctionTest::test_bad_gradient_var_with_out_of_mesh_value(), MeshFunctionTest::test_bad_hessian_var_with_out_of_mesh_value(), ExodusTest< elem_type >::test_read_gold(), ExodusTest< elem_type >::test_write(), MeshInputTest::testAbaqusRead(), MeshInputTest::testBadGmsh(), BoundaryInfoTest::testBoundaryIDs(), MeshInputTest::testCopyElementSolutionImpl(), MeshInputTest::testCopyElementVectorImpl(), MeshInputTest::testCopyNodalSolutionImpl(), DefaultCouplingTest::testCoupling(), PointNeighborCouplingTest::testCoupling(), MeshInputTest::testDynaFileMappings(), MeshInputTest::testDynaNoSplines(), MeshInputTest::testDynaReadElem(), MeshInputTest::testDynaReadPatch(), MeshInputTest::testExodusFileMappings(), MeshInputTest::testExodusIGASidesets(), MeshInputTest::testExodusWriteElementDataFromDiscontinuousNodalData(), MeshInputTest::testGmshBCIDOverlap(), MeshInputTest::testGoodGmsh(), MeshInputTest::testGoodSTL(), MeshInputTest::testGoodSTLBinary(), BoundaryInfoTest::testInternalBoundary(), MeshInputTest::testLowOrderEdgeBlocks(), SystemsTest::testProjectMatrix3D(), BoundaryInfoTest::testShellFaceConstraints(), MeshInputTest::testSingleElementImpl(), WriteVecAndScalar::testSolution(), CheckpointIOTest::testSplitter(), MeshInputTest::testTetgenIO(), MeshSmootherTest::testVariationalSmoother(), libMesh::MeshTools::total_weight(), libMesh::NetGenMeshInterface::triangulate(), libMesh::MeshRefinement::uniformly_coarsen(), libMesh::DistributedMesh::update_parallel_id_counts(), libMesh::DTKAdapter::update_variable_values(), libMesh::MeshTools::volume(), libMesh::STLIO::write(), 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_Helper::write_elemset_data(), libMesh::ExodusII_IO_Helper::write_elemsets(), 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::UCDIO::write_nodal_data(), libMesh::VTKIO::write_nodal_data(), libMesh::ExodusII_IO::write_nodal_data(), libMesh::ExodusII_IO::write_nodal_data_common(), libMesh::ExodusII_IO::write_nodal_data_discontinuous(), libMesh::ExodusII_IO_Helper::write_nodal_values(), libMesh::ExodusII_IO_Helper::write_nodeset_data(), libMesh::Nemesis_IO_Helper::write_nodesets(), libMesh::ExodusII_IO_Helper::write_nodesets(), libMesh::RBEIMEvaluation::write_out_interior_basis_functions(), libMesh::RBEIMEvaluation::write_out_node_basis_functions(), libMesh::RBEIMEvaluation::write_out_side_basis_functions(), 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().

115  { return cast_int<processor_id_type>(_communicator.rank()); }
processor_id_type rank() const
const Parallel::Communicator & _communicator

◆ read()

template<typename T >
void libMesh::SparseMatrix< T >::read ( const std::string &  filename)
virtualinherited

Read the contents of the matrix from a file, with the file format inferred from the extension of filename.

Definition at line 686 of file sparse_matrix.C.

687 {
688  {
689  std::ifstream in (filename.c_str());
690  libmesh_error_msg_if
691  (!in.good(), "ERROR: cannot read file:\n\t" <<
692  filename);
693  }
694 
695  std::string_view basename = Utility::basename_of(filename);
696 
697  const bool gzipped_file = Utility::ends_with(filename, ".gz");
698 
699  if (gzipped_file)
700  basename.remove_suffix(3);
701 
702  if (Utility::ends_with(basename, ".matlab") ||
703  Utility::ends_with(basename, ".m"))
704  this->read_matlab(filename);
705  else if (Utility::ends_with(basename, ".petsc64"))
706  {
707 #ifndef LIBMESH_HAVE_PETSC
708  libmesh_error_msg("Cannot load PETSc matrix file " <<
709  filename << " without PETSc-enabled libMesh.");
710 #elif LIBMESH_DOF_ID_BYTES != 8
711  libmesh_error_msg("Cannot load 64-bit PETSc matrix file " <<
712  filename << " with non-64-bit libMesh.");
713 #endif
714  if (gzipped_file)
715  libmesh_not_implemented_msg("Gzipped PETSc matrices are not currently supported");
716  this->read_petsc_binary(filename);
717  }
718  else if (Utility::ends_with(basename, ".petsc32"))
719  {
720 #ifndef LIBMESH_HAVE_PETSC
721  libmesh_error_msg("Cannot load PETSc matrix file " <<
722  filename << " without PETSc-enabled libMesh.");
723 #elif LIBMESH_DOF_ID_BYTES != 4
724  libmesh_error_msg("Cannot load 32-bit PETSc matrix file " <<
725  filename << " with non-32-bit libMesh.");
726 #endif
727  if (gzipped_file)
728  libmesh_not_implemented_msg("Gzipped PETSc matrices are not currently supported");
729  this->read_petsc_binary(filename);
730  }
731  else if (Utility::ends_with(basename, ".h5"))
732  {
733  if (gzipped_file)
734  libmesh_not_implemented_msg("Gzipped HDF5 matrices are not currently supported");
735  this->read_coreform_hdf5(filename);
736  }
737  else
738  libmesh_error_msg(" ERROR: Unrecognized matrix file extension on: "
739  << basename
740  << "\n I understand the following:\n\n"
741  << " *.h5 -- CoreForm HDF5 sparse matrix format\n"
742  << " *.matlab -- Matlab sparse matrix format\n"
743  << " *.matlab.gz -- Matlab sparse matrix format, gzipped\n"
744  << " *.m -- Matlab sparse matrix format\n"
745  << " *.m.gz -- Matlab sparse matrix format, gzipped\n"
746  << " *.petsc32 -- PETSc binary format, 32-bit\n"
747  << " *.petsc64 -- PETSc binary format, 64-bit\n"
748  );
749 }
bool ends_with(std::string_view superstring, std::string_view suffix)
Look for a substring at the very end of a string.
Definition: utility.C:213
virtual void read_coreform_hdf5(const std::string &filename, const std::string &groupname="extraction")
Read the contents of the matrix from a file, with the HDF5 sparse matrix format used by CoreForm...
virtual void read_matlab(const std::string &filename)
Read the contents of the matrix from the Matlab-script sparse matrix format used by PETSc...
virtual void read_petsc_binary(const std::string &filename)
Read the contents of the matrix from a file in PETSc&#39;s binary sparse matrix format.
std::string_view basename_of(const std::string &fullname)
Definition: utility.C:108

◆ read_coreform_hdf5()

template<typename T >
void libMesh::SparseMatrix< T >::read_coreform_hdf5 ( const std::string &  filename,
const std::string &  groupname = "extraction" 
)
virtualinherited

Read the contents of the matrix from a file, with the HDF5 sparse matrix format used by CoreForm, expecing sparse matrix data in the group given by groupname.

This will be initialized with the sparsity from the file, linearly partitioned onto the number of processors available unless this matrix is pre-sized and pre-partitionsed.

Definition at line 822 of file sparse_matrix.C.

824 {
825 #ifndef LIBMESH_HAVE_HDF5
826  libmesh_ignore(filename, groupname);
827  libmesh_error_msg("ERROR: need HDF5 support to handle .h5 files!!!");
828 #else
829  LOG_SCOPE("read_coreform_hdf5()", "SparseMatrix");
830 
831  std::size_t num_rows = 0, num_cols = 0;
832 
833  // These are only used on pid 0, but avoid "uninitialized" warnings
834  hid_t group = H5I_INVALID_HID;
835  hid_t file = H5I_INVALID_HID;
836 
837  if (this->processor_id() == 0)
838  {
839  file = H5Fopen(filename.c_str(), H5F_ACC_RDONLY, H5P_DEFAULT);
840 
841  if (file == H5I_INVALID_HID)
842  libmesh_file_error(filename);
843 
844  group = H5Gopen(file, groupname.c_str(), H5P_DEFAULT);
845  check_open(filename, group, groupname);
846 
847  auto read_size_attribute = [&filename, &group]
848  (const std::string & attribute_name)
849  {
850  unsigned long long returnval = 0;
851 
852  const hid_t attr = H5Aopen(group, attribute_name.c_str(), H5P_DEFAULT);
853  check_open(filename, attr, attribute_name);
854 
855  const hid_t attr_type = H5Aget_type(attr);
856  check_hdf5(filename, attr_type, attribute_name + " type");
857 
858  // HDF5 will convert between the file's integer type and ours, but
859  // we do expect an integer type.
860  if (H5Tget_class(attr_type) != H5T_INTEGER)
861  libmesh_error_msg("Non-integer type for " + attribute_name + " in " + filename);
862 
863  H5Tclose(attr_type);
864 
865  // HDF5 is supposed to handle both upscaling and endianness
866  // conversions here
867  const herr_t errval = H5Aread(attr, H5T_NATIVE_ULLONG, &returnval);
868  check_hdf5(filename, errval, attribute_name + " read");
869 
870  H5Aclose(attr);
871 
872  return returnval;
873  };
874 
875  num_cols = read_size_attribute("num_cols");
876  num_rows = read_size_attribute("num_rows");
877 
878  this->comm().broadcast(num_cols);
879  this->comm().broadcast(num_rows);
880  }
881  else
882  {
883  this->comm().broadcast(num_cols);
884  this->comm().broadcast(num_rows);
885  }
886 
887  numeric_index_type new_row_start, new_row_stop,
888  new_col_start, new_col_stop;
889 
890  // If we need to reinit, we need to determine which rows+columns
891  // each processor is in charge of.
892  std::vector<numeric_index_type> new_row_starts, new_row_stops,
893  new_col_starts, new_col_stops;
894 
895  if (this->initialized() &&
896  num_cols == this->n() &&
897  num_rows == this->m())
898  {
899  new_row_start = this->row_start(),
900  new_row_stop = this->row_stop();
901 
902  new_col_start = this->col_start(),
903  new_col_stop = this->col_stop();
904  }
905  else
906  {
907  // Determine which rows/columns each processor will be in charge of
908  new_row_start = this->processor_id() * num_rows / this->n_processors(),
909  new_row_stop = (this->processor_id()+1) * num_rows / this->n_processors();
910 
911  new_col_start = this->processor_id() * num_cols / this->n_processors(),
912  new_col_stop = (this->processor_id()+1) * num_cols / this->n_processors();
913  }
914 
915  this->comm().gather(0, new_row_start, new_row_starts);
916  this->comm().gather(0, new_row_stop, new_row_stops);
917  this->comm().gather(0, new_col_start, new_col_starts);
918  this->comm().gather(0, new_col_stop, new_col_stops);
919 
920  numeric_index_type on_diagonal_nonzeros = 0,
921  off_diagonal_nonzeros = 0;
922 
923  std::vector<std::size_t> cols, row_offsets;
924  std::vector<double> vals;
925 
926  if (this->processor_id() == 0)
927  {
928  auto read_vector = [&filename, &group]
929  (const std::string & dataname, auto hdf5_class,
930  auto hdf5_type, auto & datavec)
931  {
932  const hid_t data = H5Dopen1(group, dataname.c_str());
933  check_open(filename, data, dataname.c_str());
934 
935  const hid_t data_type = H5Dget_type(data);
936  check_hdf5(filename, data_type, dataname + " type");
937 
938  // HDF5 will convert between the file's integer type and ours, but
939  // we do expect an integer type.
940  if (H5Tget_class(data_type) != hdf5_class)
941  libmesh_error_msg("Unexpected type for " + dataname + " in " + filename);
942 
943  H5Tclose(data_type);
944 
945  const hid_t dataspace = H5Dget_space(data);
946  check_hdf5(filename, dataspace, dataname + " space");
947 
948  int ndims = H5Sget_simple_extent_ndims(dataspace);
949  if (ndims != 1)
950  libmesh_error_msg("Non-vector space for " + dataname + " in " + filename);
951 
952  hsize_t len, maxlen;
953  herr_t errval = H5Sget_simple_extent_dims(dataspace, &len, &maxlen);
954  check_hdf5(filename, errval, dataname + " dims");
955 
956  datavec.resize(len);
957 
958  errval = H5Dread(data, hdf5_type, H5S_ALL, H5S_ALL, H5P_DEFAULT, datavec.data());
959  check_hdf5(filename, errval, dataname + " read");
960 
961  H5Dclose(data);
962  };
963 
964  read_vector("cols", H5T_INTEGER, H5T_NATIVE_ULLONG, cols);
965  read_vector("row_offsets", H5T_INTEGER, H5T_NATIVE_ULLONG, row_offsets);
966  read_vector("vals", H5T_FLOAT, H5T_NATIVE_DOUBLE, vals);
967 
968  if (cols.size() != vals.size())
969  libmesh_error_msg("Inconsistent cols/vals sizes in " + filename);
970 
971  if (row_offsets.size() != num_rows + 1)
972  libmesh_error_msg("Inconsistent row_offsets size in " + filename);
973 
974  // Data for the row we're working on
975  numeric_index_type current_row = 0;
976  processor_id_type current_proc = 0;
977  numeric_index_type current_on_diagonal_nonzeros = 0;
978  numeric_index_type current_off_diagonal_nonzeros = 0;
979  if (row_offsets[0] != 0)
980  libmesh_error_msg("Unexpected row_offsets[0] in " + filename);
981 
982  for (auto i : index_range(cols))
983  {
984  while (row_offsets[current_row+1] <= i)
985  {
986  ++current_row;
987  if (row_offsets[current_row] < row_offsets[current_row-1])
988  libmesh_error_msg("Non-monotonic row_offsets in " + filename);
989  current_on_diagonal_nonzeros = 0;
990  current_off_diagonal_nonzeros = 0;
991  }
992 
993  while (current_row >= new_row_stops[current_proc])
994  ++current_proc;
995 
996  // 0-based indexing in file
997  if (cols[i] >= new_col_starts[current_proc] &&
998  cols[i] < new_col_stops[current_proc])
999  {
1000  ++current_on_diagonal_nonzeros;
1001  on_diagonal_nonzeros =
1002  std::max(on_diagonal_nonzeros,
1003  current_on_diagonal_nonzeros);
1004  }
1005  else
1006  {
1007  ++current_off_diagonal_nonzeros;
1008  off_diagonal_nonzeros =
1009  std::max(off_diagonal_nonzeros,
1010  current_off_diagonal_nonzeros);
1011  }
1012  }
1013  }
1014 
1015  this->comm().broadcast(on_diagonal_nonzeros);
1016  this->comm().broadcast(off_diagonal_nonzeros);
1017 
1018  this->init(num_rows, num_cols,
1019  new_row_stop-new_row_start,
1020  new_col_stop-new_col_start,
1021  on_diagonal_nonzeros,
1022  off_diagonal_nonzeros);
1023 
1024  // Set the matrix values last.
1025  if (this->processor_id() == 0)
1026  {
1027  numeric_index_type current_row = 0;
1028  for (auto i : index_range(cols))
1029  {
1030  while (row_offsets[current_row+1] <= i)
1031  {
1032  ++current_row;
1033  libmesh_assert_greater_equal (row_offsets[current_row],
1034  row_offsets[current_row-1]);
1035  }
1036  this->set(current_row, cols[i], vals[i]);
1037  }
1038 
1039  H5Gclose(group);
1040  H5Fclose(file);
1041  }
1042 
1043  this->close();
1044 #endif // LIBMESH_HAVE_HDF5
1045 }
virtual bool initialized() const
MPI_Datatype data_type
void gather(const unsigned int root_id, const T &send_data, std::vector< T, A > &recv) const
const Parallel::Communicator & comm() const
virtual numeric_index_type row_stop() const =0
uint8_t processor_id_type
processor_id_type n_processors() const
void libmesh_ignore(const Args &...)
dof_id_type numeric_index_type
Definition: id_types.h:99
virtual numeric_index_type m() const =0
virtual numeric_index_type col_stop() const =0
virtual numeric_index_type col_start() const =0
void broadcast(T &data, const unsigned int root_id=0, const bool identical_sizes=false) const
virtual void close()=0
Calls the SparseMatrix&#39;s internal assembly routines, ensuring that the values are consistent across p...
virtual numeric_index_type row_start() const =0
processor_id_type processor_id() const
auto index_range(const T &sizable)
Helper function that returns an IntRange<std::size_t> representing all the indices of the passed-in v...
Definition: int_range.h:153
virtual numeric_index_type n() const =0
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)=0
Initialize SparseMatrix with the specified sizes.

◆ read_matlab()

template<typename T >
void libMesh::SparseMatrix< T >::read_matlab ( const std::string &  filename)
virtualinherited

Read the contents of the matrix from the Matlab-script sparse matrix format used by PETSc.

If the size and sparsity of the matrix in filename appears consistent with the existing sparsity of this then the existing parallel decomposition and sparsity will be retained. If not, then this will be initialized with the sparsity from the file, linearly partitioned onto the number of processors available.

Definition at line 1050 of file sparse_matrix.C.

Referenced by ConstraintOperatorTest::test1DCoarseningNewNodes().

1051 {
1052  LOG_SCOPE("read_matlab()", "SparseMatrix");
1053 
1054 #ifndef LIBMESH_HAVE_CXX11_REGEX
1055  libmesh_not_implemented(); // What is your compiler?!? Email us!
1056  libmesh_ignore(filename);
1057 #else
1058  parallel_object_only();
1059 
1060  const bool gzipped_file = Utility::ends_with(filename, ".gz");
1061 
1062  // The sizes we get from the file
1063  std::size_t m = 0,
1064  n = 0;
1065 
1066  // If we don't already have this size, we'll need to reinit, and
1067  // determine which rows+columns each processor is in charge of.
1068  std::vector<numeric_index_type> new_row_starts, new_row_stops,
1069  new_col_starts, new_col_stops;
1070 
1071  numeric_index_type new_row_start, new_row_stop,
1072  new_col_start, new_col_stop;
1073 
1074  // We'll read through the file three times: once to get a reliable
1075  // value for the matrix size (so we can divvy it up among
1076  // processors), then again to get the sparsity to send to each
1077  // processor, then a final time to get the entries to send to each
1078  // processor.
1079  //
1080  // We'll use an istream here; it might be an ifstream if we're
1081  // opening a raw ASCII file or a gzstream if we're opening a
1082  // compressed one.
1083  std::unique_ptr<std::istream> file;
1084 
1085  // We'll need a temporary structure to cache matrix entries, because
1086  // we need to read through the whole file before we know the size
1087  // and sparsity structure with which we can init().
1088  //
1089  // Reading through the file three times via `seekg` doesn't work
1090  // with our gzstream wrapper, and seems to take three times as long
1091  // even with a plain ifstream. What happened to disk caching!?
1092  std::vector<std::tuple<numeric_index_type, numeric_index_type, T>> entries;
1093 
1094  // First read through the file, saving size and entry data
1095  {
1096  // We'll read the matrix on processor 0 rather than try to juggle
1097  // parallel I/O.
1098  if (this->processor_id() == 0)
1099  {
1100  // We'll be using regular expressions to make ourselves slightly
1101  // more robust to formatting.
1102  const std::regex start_regex // assignment like "zzz = ["
1103  ("\\s*\\w+\\s*=\\s*\\[");
1104  const std::regex end_regex // end of assignment
1105  ("^[^%]*\\]");
1106 
1107  if (gzipped_file)
1108  {
1109 #ifdef LIBMESH_HAVE_GZSTREAM
1110  auto inf = std::make_unique<igzstream>();
1111  libmesh_assert(inf);
1112  inf->open(filename.c_str(), std::ios::in);
1113  file = std::move(inf);
1114 #else
1115  libmesh_error_msg("ERROR: need gzstream to handle .gz files!!!");
1116 #endif
1117  }
1118  else
1119  {
1120  auto inf = std::make_unique<std::ifstream>();
1121  libmesh_assert(inf);
1122 
1123  std::string new_name = Utility::unzip_file(filename);
1124 
1125  inf->open(new_name.c_str(), std::ios::in);
1126  file = std::move(inf);
1127  }
1128 
1129  // If we have a matrix with all-zero trailing rows, the only
1130  // way to get the size is if it ended up in a comment
1131  const std::regex size_regex // comment like "% size = 8 8"
1132  ("%\\s*[Ss][Ii][Zz][Ee]\\s*=\\s*(\\d+)\\s+(\\d+)");
1133  const std::string whitespace = " \t";
1134 
1135  bool have_started = false;
1136  bool have_ended = false;
1137  std::size_t largest_i_seen = 0, largest_j_seen = 0;
1138 
1139  // Data for the row we're working on
1140  // Use 1-based indexing for current_row, as in the file
1141  std::size_t current_row = 1;
1142 
1143  for (std::string line; std::getline(*file, line);)
1144  {
1145  std::smatch sm;
1146 
1147  // First, try to match an entry. This is the most common
1148  // case so we won't rely on slow std::regex for it.
1149  // stringstream is at least an improvement over that.
1150 
1151  // Look for row/col/val like "1 1 -2.0e-4"
1152 
1153  std::istringstream l(line);
1154 
1155  std::size_t i, j;
1156  T value;
1157 
1158  l >> i >> j >> value;
1159 
1160  if (!l.fail())
1161  {
1162  libmesh_error_msg_if
1163  (!have_started, "Confused by premature entries in matrix file " << filename);
1164 
1165  entries.emplace_back(cast_int<numeric_index_type>(i),
1166  cast_int<numeric_index_type>(j),
1167  value);
1168 
1169  libmesh_error_msg_if
1170  (!i || !j, "Expected 1-based indexing in matrix file "
1171  << filename);
1172 
1173  current_row = std::max(current_row, i);
1174 
1175  libmesh_error_msg_if
1176  (i < current_row,
1177  "Can't handle out-of-order entries in matrix file "
1178  << filename);
1179 
1180  largest_i_seen = std::max(i, largest_i_seen);
1181  largest_j_seen = std::max(j, largest_j_seen);
1182  }
1183 
1184  else if (std::regex_search(line, sm, size_regex))
1185  {
1186  const std::string msize = sm[1];
1187  const std::string nsize = sm[2];
1188  m = std::stoull(msize);
1189  n = std::stoull(nsize);
1190  }
1191 
1192  else if (std::regex_search(line, start_regex))
1193  have_started = true;
1194 
1195  else if (std::regex_search(line, end_regex))
1196  {
1197  have_ended = true;
1198  break;
1199  }
1200  }
1201 
1202  libmesh_error_msg_if
1203  (!have_started, "Confused by missing assignment beginning in matrix file " << filename);
1204 
1205  libmesh_error_msg_if
1206  (!have_ended, "Confused by missing assignment ending in matrix file " << filename);
1207 
1208  libmesh_error_msg_if
1209  (m > largest_i_seen, "Confused by missing final row(s) in matrix file " << filename);
1210 
1211  libmesh_error_msg_if
1212  (m > 0 && m < largest_i_seen, "Confused by extra final row(s) in matrix file " << filename);
1213 
1214  if (!m)
1215  m = largest_i_seen;
1216 
1217  libmesh_error_msg_if
1218  (n > largest_j_seen, "Confused by missing final column(s) in matrix file " << filename);
1219 
1220  libmesh_error_msg_if
1221  (n > 0 && n < largest_j_seen, "Confused by extra final column(s) in matrix file " << filename);
1222 
1223  if (!n)
1224  n = largest_j_seen;
1225 
1226  this->comm().broadcast(m);
1227  this->comm().broadcast(n);
1228  }
1229  else
1230  {
1231  this->comm().broadcast(m);
1232  this->comm().broadcast(n);
1233  }
1234 
1235  if (this->initialized() &&
1236  m == this->m() &&
1237  n == this->n())
1238  {
1239  new_row_start = this->row_start(),
1240  new_row_stop = this->row_stop();
1241 
1242  new_col_start = this->col_start(),
1243  new_col_stop = this->col_stop();
1244  }
1245  else
1246  {
1247  // Determine which rows/columns each processor will be in charge of
1248  new_row_start = this->processor_id() * m / this->n_processors(),
1249  new_row_stop = (this->processor_id()+1) * m / this->n_processors();
1250 
1251  new_col_start = this->processor_id() * n / this->n_processors(),
1252  new_col_stop = (this->processor_id()+1) * n / this->n_processors();
1253  }
1254 
1255  this->comm().gather(0, new_row_start, new_row_starts);
1256  this->comm().gather(0, new_row_stop, new_row_stops);
1257  this->comm().gather(0, new_col_start, new_col_starts);
1258  this->comm().gather(0, new_col_stop, new_col_stops);
1259 
1260  } // Done reading entry data and broadcasting matrix size
1261 
1262  // Calculate the matrix sparsity and initialize it second
1263  {
1264  // Deduce the sparsity pattern, or at least the maximum number of
1265  // on- and off- diagonal non-zeros per row.
1266  numeric_index_type on_diagonal_nonzeros =0,
1267  off_diagonal_nonzeros =0;
1268 
1269  if (this->processor_id() == 0)
1270  {
1271  // Data for the row we're working on
1272  // Use 1-based indexing for current_row, as in the file
1273  numeric_index_type current_row = 1;
1274  processor_id_type current_proc = 0;
1275  numeric_index_type current_on_diagonal_nonzeros = 0;
1276  numeric_index_type current_off_diagonal_nonzeros = 0;
1277 
1278  for (auto [i, j, value] : entries)
1279  {
1280  if (i > current_row)
1281  {
1282  current_row = i;
1283  // +1 for 1-based indexing in file
1284  while (current_row >= (new_row_stops[current_proc]+1))
1285  ++current_proc;
1286  current_on_diagonal_nonzeros = 0;
1287  current_off_diagonal_nonzeros = 0;
1288  }
1289 
1290  // +1 for 1-based indexing in file
1291  if (j >= (new_col_starts[current_proc]+1) &&
1292  j < (new_col_stops[current_proc]+1))
1293  {
1294  ++current_on_diagonal_nonzeros;
1295  on_diagonal_nonzeros =
1296  std::max(on_diagonal_nonzeros,
1297  current_on_diagonal_nonzeros);
1298  }
1299  else
1300  {
1301  ++current_off_diagonal_nonzeros;
1302  off_diagonal_nonzeros =
1303  std::max(off_diagonal_nonzeros,
1304  current_off_diagonal_nonzeros);
1305  }
1306  }
1307  }
1308 
1309  this->comm().broadcast(on_diagonal_nonzeros);
1310  this->comm().broadcast(off_diagonal_nonzeros);
1311 
1312  this->init(m, n,
1313  new_row_stop-new_row_start,
1314  new_col_stop-new_col_start,
1315  on_diagonal_nonzeros,
1316  off_diagonal_nonzeros);
1317  }
1318 
1319  // Set the matrix values last.
1320  // Convert from 1-based to 0-based indexing
1321  if (this->processor_id() == 0)
1322  for (auto [i, j, value] : entries)
1323  this->set(i-1, j-1, value);
1324 
1325  this->close();
1326 #endif
1327 }
virtual bool initialized() const
bool ends_with(std::string_view superstring, std::string_view suffix)
Look for a substring at the very end of a string.
Definition: utility.C:213
void gather(const unsigned int root_id, const T &send_data, std::vector< T, A > &recv) const
const Parallel::Communicator & comm() const
virtual numeric_index_type row_stop() const =0
uint8_t processor_id_type
processor_id_type n_processors() const
void libmesh_ignore(const Args &...)
dof_id_type numeric_index_type
Definition: id_types.h:99
virtual numeric_index_type m() const =0
std::string unzip_file(std::string_view name)
Create an unzipped copy of a bz2 or xz file, returning the name of the now-unzipped file that can be ...
Definition: utility.C:164
libmesh_assert(ctx)
virtual numeric_index_type col_stop() const =0
virtual numeric_index_type col_start() const =0
void broadcast(T &data, const unsigned int root_id=0, const bool identical_sizes=false) const
virtual void close()=0
Calls the SparseMatrix&#39;s internal assembly routines, ensuring that the values are consistent across p...
virtual numeric_index_type row_start() const =0
static const bool value
Definition: xdr_io.C:55
processor_id_type processor_id() const
virtual numeric_index_type n() const =0
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)=0
Initialize SparseMatrix with the specified sizes.

◆ read_petsc_binary()

template<typename T >
void libMesh::SparseMatrix< T >::read_petsc_binary ( const std::string &  filename)
virtualinherited

Read the contents of the matrix from a file in PETSc's binary sparse matrix format.

Reimplemented in libMesh::PetscMatrix< T >.

Definition at line 1332 of file sparse_matrix.C.

1333 {
1334  libmesh_not_implemented_msg
1335  ("libMesh cannot read PETSc binary-format files into non-PETSc matrices");
1336 }

◆ read_petsc_hdf5()

template<typename T >
void libMesh::SparseMatrix< T >::read_petsc_hdf5 ( const std::string &  filename)
virtualinherited

Read the contents of the matrix from a file in PETSc's HDF5 sparse matrix format.

Reimplemented in libMesh::PetscMatrix< T >.

Definition at line 1341 of file sparse_matrix.C.

1342 {
1343  libmesh_not_implemented_msg
1344  ("libMesh cannot read PETSc HDF5-format files into non-PETSc matrices");
1345 }

◆ 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 565 of file sparse_matrix.h.

568  {
569  this->_get_submatrix(submatrix,
570  rows,
571  cols,
572  true); // true means REUSE submatrix
573  }
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.

◆ require_sparsity_pattern()

template<typename T>
virtual bool libMesh::SparseMatrix< T >::require_sparsity_pattern ( ) const
inlinevirtualinherited
Returns
Whether this matrix needs the sparsity pattern computed by the DofMap

Reimplemented in libMesh::StaticCondensation, libMesh::PetscMatrixShellMatrix< T >, and libMesh::PetscMatrixShellMatrix< Number >.

Definition at line 168 of file sparse_matrix.h.

168 { return !this->use_hash_table(); }
bool use_hash_table() const

◆ restore_original_nonzero_pattern()

template<typename T>
virtual void libMesh::SparseMatrix< T >::restore_original_nonzero_pattern ( )
inlinevirtualinherited

Reset the memory storage of the matrix.

Unlike clear(), this does not destroy the matrix but rather will reset the matrix to use the original preallocation or when using hash table matrix assembly (see use_hash_table()) will reset (clear) the hash table used for assembly. In the words of the MatResetPreallocation documentation in PETSc, 'current values in the matrix are lost in this call', so a user can expect to have back their original sparsity pattern in a zeroed state

Reimplemented in libMesh::PetscMatrix< T >, and libMesh::DiagonalMatrix< T >.

Definition at line 644 of file sparse_matrix.h.

644 { libmesh_not_implemented(); }

◆ row_start()

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

Implements libMesh::SparseMatrix< T >.

Definition at line 574 of file laspack_matrix.C.

575 {
576  return 0;
577 }

◆ row_stop()

template<typename T >
numeric_index_type libMesh::LaspackMatrix< 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 582 of file laspack_matrix.C.

583 {
584  return this->m();
585 }
virtual numeric_index_type m() const override

◆ scale()

template<typename T>
void libMesh::SparseMatrix< T >::scale ( const T  scale)
virtualinherited

Scales all elements of this matrix by scale.

Reimplemented in libMesh::PetscMatrix< T >.

Definition at line 1350 of file sparse_matrix.C.

1351 {
1352  libmesh_assert(this->closed());
1353 
1354  for (const auto i : make_range(this->row_start(), this->row_stop()))
1355  for (const auto j : make_range(this->col_start(), this->col_stop()))
1356  this->set(i, j, (*this)(i, j) * scale);
1357 }
virtual numeric_index_type row_stop() const =0
libmesh_assert(ctx)
virtual numeric_index_type col_stop() const =0
virtual numeric_index_type col_start() const =0
virtual bool closed() const =0
virtual numeric_index_type row_start() const =0
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:176
virtual void scale(const T scale)
Scales all elements of this matrix by scale.

◆ set()

template<typename T >
void libMesh::LaspackMatrix< 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 606 of file laspack_matrix.C.

References libMesh::initialized(), libMesh::libmesh_assert(), and value.

609 {
610  libmesh_assert (this->initialized());
611  libmesh_assert_less (i, this->m());
612  libmesh_assert_less (j, this->n());
613 
614  const numeric_index_type position = this->pos(i,j);
615 
616  // Sanity check
617  libmesh_assert_equal_to (*(_row_start[i]+position), j);
618  libmesh_assert_equal_to ((j+1), Q_GetPos (&_QMat, i+1, position));
619 
620  Q_SetEntry (&_QMat, i+1, position, j+1, value);
621 }
virtual bool initialized() const
QMatrix _QMat
The Laspack sparse matrix pointer.
numeric_index_type pos(const numeric_index_type i, const numeric_index_type j) const
dof_id_type numeric_index_type
Definition: id_types.h:99
libmesh_assert(ctx)
std::vector< std::vector< numeric_index_type >::const_iterator > _row_start
The start of each row in the compressed row index data structure.
virtual numeric_index_type m() const override
virtual numeric_index_type n() const override
static const bool value
Definition: xdr_io.C:55

◆ solver_package()

template<typename T>
virtual SolverPackage libMesh::LaspackMatrix< T >::solver_package ( )
inlineoverridevirtual

Implements libMesh::SparseMatrix< T >.

Definition at line 88 of file laspack_matrix.h.

References libMesh::LASPACK_SOLVERS.

◆ supports_hash_table()

template<typename T>
virtual bool libMesh::SparseMatrix< T >::supports_hash_table ( ) const
inlinevirtualinherited
Returns
Whether the matrix supports hash table assembly

Reimplemented in libMesh::PetscMatrix< T >.

Definition at line 619 of file sparse_matrix.h.

619 { return false; }

◆ update_sparsity_pattern()

template<typename T >
void libMesh::LaspackMatrix< T >::update_sparsity_pattern ( const SparsityPattern::Graph sparsity_pattern)
overridevirtual

Updates the matrix sparsity pattern.

This will tell the underlying matrix storage scheme how to map the \( (i,j) \) elements.

Reimplemented from libMesh::SparseMatrix< T >.

Definition at line 43 of file laspack_matrix.C.

References libMesh::TriangleWrapper::init(), libMesh::initialized(), and libMesh::libmesh_assert().

44 {
45  // clear data, start over
46  this->clear ();
47 
48  // big trouble if this fails!
49  libmesh_assert(this->_dof_map);
50 
51  const numeric_index_type n_rows = sparsity_pattern.size();
52 
53  // Initialize the _row_start data structure,
54  // allocate storage for the _csr array
55  {
56  std::size_t size = 0;
57 
58  for (numeric_index_type row=0; row<n_rows; row++)
59  size += sparsity_pattern[row].size();
60 
61  _csr.resize (size);
62  _row_start.reserve(n_rows + 1);
63  }
64 
65 
66  // Initialize the _csr data structure.
67  {
68  std::vector<numeric_index_type>::iterator position = _csr.begin();
69 
70  _row_start.push_back (position);
71 
72  for (numeric_index_type row=0; row<n_rows; row++)
73  {
74  // insert the row indices
75  for (const auto & col : sparsity_pattern[row])
76  {
77  libmesh_assert (position != _csr.end());
78  *position = col;
79  ++position;
80  }
81 
82  _row_start.push_back (position);
83  }
84  }
85 
86 
87  // Initialize the matrix
88  libmesh_assert (!this->initialized());
89  this->init ();
90  libmesh_assert (this->initialized());
91  //libMesh::out << "n_rows=" << n_rows << std::endl;
92  //libMesh::out << "m()=" << m() << std::endl;
93  libmesh_assert_equal_to (n_rows, this->m());
94 
95  // Tell the matrix about its structure. Initialize it
96  // to zero.
97  for (numeric_index_type i=0; i<n_rows; i++)
98  {
99  auto rs = _row_start[i];
100 
101  const numeric_index_type length = _row_start[i+1] - rs;
102 
103  Q_SetLen (&_QMat, i+1, length);
104 
105  for (numeric_index_type l=0; l<length; l++)
106  {
107  const numeric_index_type j = *(rs+l);
108 
109  // sanity check
110  //libMesh::out << "m()=" << m() << std::endl;
111  //libMesh::out << "(i,j,l) = (" << i
112  // << "," << j
113  // << "," << l
114  // << ")" << std::endl;
115  //libMesh::out << "pos(i,j)=" << pos(i,j)
116  // << std::endl;
117  libmesh_assert_equal_to (this->pos(i,j), l);
118  Q_SetEntry (&_QMat, i+1, l, j+1, 0.);
119  }
120  }
121 
122  // That's it!
123  //libmesh_here();
124 }
virtual bool initialized() const
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.
std::vector< numeric_index_type > _csr
The compressed row indices.
QMatrix _QMat
The Laspack sparse matrix pointer.
numeric_index_type pos(const numeric_index_type i, const numeric_index_type j) const
dof_id_type numeric_index_type
Definition: id_types.h:99
libmesh_assert(ctx)
virtual void clear() override
Restores the SparseMatrix<T> to a pristine state.
DofMap const * _dof_map
The DofMap object associated with this object.
std::vector< std::vector< numeric_index_type >::const_iterator > _row_start
The start of each row in the compressed row index data structure.
virtual numeric_index_type m() const override

◆ use_hash_table() [1/2]

template<typename T >
void libMesh::SparseMatrix< T >::use_hash_table ( bool  use_hash)
inherited

Sets whether to use hash table assembly.

This will error if the passed-in value is true and the matrix type does not support hash tables. Hash table or hash map assembly means storing maps from i-j locations in the matrix to values. Because it is a hash map as opposed to a contiguous array of data, no preallocation is required to use it

Definition at line 692 of file sparse_matrix.h.

Referenced by PetscMatrixTest::testPetscCopyFromHash().

693 {
694  libmesh_error_msg_if(use_hash && !this->supports_hash_table(),
695  "This matrix class does not support hash table assembly");
696  this->_use_hash_table = use_hash;
697 }
bool _use_hash_table
Flag indicating whether the matrix is assembled using a hash table.
virtual bool supports_hash_table() const

◆ use_hash_table() [2/2]

template<typename T>
bool libMesh::SparseMatrix< T >::use_hash_table ( ) const
inlineinherited
Returns
Whether this matrix is using hash table assembly. Hash table or hash map assembly means storing maps from i-j locations in the matrix to values. Because it is a hash map as opposed to a contiguous array of data, no preallocation is required to use it

Definition at line 634 of file sparse_matrix.h.

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

634 { return _use_hash_table; }
bool _use_hash_table
Flag indicating whether the matrix is assembled using a hash table.

◆ vector_mult()

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

Multiplies the matrix by the NumericVector arg and stores the result in NumericVector dest.

Definition at line 237 of file sparse_matrix.C.

Referenced by libMesh::TransientRBConstruction::add_IC_to_RB_space(), libMesh::RBSCMConstruction::Aq_inner_product(), libMesh::AdvectionSystem::assemble_claw_rhs(), libMesh::RBSCMConstruction::B_inner_product(), libMesh::RBConstruction::compute_Fq_representor_innerprods(), libMesh::RBConstruction::compute_output_dual_innerprods(), libMesh::RBConstruction::compute_residual_dual_norm_slow(), libMesh::TransientRBConstruction::enrich_RB_space(), libMesh::RBConstruction::enrich_RB_space(), AssembleOptimization::gradient(), libMesh::TransientRBConstruction::mass_matrix_scaled_matvec(), AssembleOptimization::objective(), libMesh::RBConstruction::print_basis_function_orthogonality(), libMesh::ImplicitSystem::qoi_parameter_hessian(), libMesh::ImplicitSystem::qoi_parameter_hessian_vector_product(), libMesh::TransientRBConstruction::set_error_temporal_data(), libMesh::RBConstruction::train_reduced_basis_with_POD(), libMesh::TransientRBConstruction::truth_assembly(), libMesh::RBConstruction::truth_solve(), libMesh::TransientRBConstruction::update_RB_system_matrices(), libMesh::RBConstruction::update_RB_system_matrices(), libMesh::TransientRBConstruction::update_residual_terms(), and libMesh::RBConstruction::update_residual_terms().

239 {
240  dest.zero();
241  this->vector_mult_add(dest,arg);
242 }
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...

◆ 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 247 of file sparse_matrix.C.

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

249 {
250  /* This functionality is actually implemented in the \p
251  NumericVector class. */
252  dest.add_vector(arg,*this);
253 }

◆ zero()

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

Set all entries to 0.

Implements libMesh::SparseMatrix< T >.

Definition at line 495 of file laspack_matrix.C.

496 {
497  const numeric_index_type n_rows = this->m();
498 
499  for (numeric_index_type row=0; row<n_rows; row++)
500  {
501  auto r_start = _row_start[row];
502 
503  const numeric_index_type len = (_row_start[row+1] - _row_start[row]);
504 
505  // Make sure we agree on the row length
506  libmesh_assert_equal_to (len, Q_GetLen(&_QMat, row+1));
507 
508  for (numeric_index_type l=0; l<len; l++)
509  {
510  const numeric_index_type j = *(r_start + l);
511 
512  // Make sure the data structures are working
513  libmesh_assert_equal_to ((j+1), Q_GetPos (&_QMat, row+1, l));
514 
515  Q_SetEntry (&_QMat, row+1, l, j+1, 0.);
516  }
517  }
518 
519  this->close();
520 }
QMatrix _QMat
The Laspack sparse matrix pointer.
virtual void close() override
Calls the SparseMatrix&#39;s internal assembly routines, ensuring that the values are consistent across p...
dof_id_type numeric_index_type
Definition: id_types.h:99
std::vector< std::vector< numeric_index_type >::const_iterator > _row_start
The start of each row in the compressed row index data structure.
virtual numeric_index_type m() const override

◆ zero_clone()

template<typename T >
std::unique_ptr< SparseMatrix< T > > libMesh::LaspackMatrix< T >::zero_clone ( ) const
overridevirtual
Returns
A smart pointer to a copy of this matrix with the same type, size, and partitioning, but with all zero entries.
Note
This must be overridden in the derived classes.

Implements libMesh::SparseMatrix< T >.

Definition at line 525 of file laspack_matrix.C.

526 {
527  // Make empty copy with matching comm, initialize, zero, and return.
528  auto mat_copy = std::make_unique<LaspackMatrix<T>>(this->comm());
529  if (this->_dof_map)
530  mat_copy->attach_dof_map(*this->_dof_map);
531  else
532  mat_copy->init(this->m(), this->n(), this->local_m(),
533  this->local_n(), this->local_n());
534 
535  mat_copy->zero();
536 
537  return mat_copy;
538 }
virtual numeric_index_type local_m() const
Get the number of rows owned by this process.
const Parallel::Communicator & comm() const
virtual numeric_index_type local_n() const
Get the number of columns owned by this process.
DofMap const * _dof_map
The DofMap object associated with this object.
virtual numeric_index_type m() const override
virtual numeric_index_type n() const override

◆ zero_rows()

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

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

Reimplemented in libMesh::DiagonalMatrix< T >, and libMesh::PetscMatrix< T >.

Definition at line 258 of file sparse_matrix.C.

259 {
260  /* This functionality isn't implemented or stubbed in every subclass yet */
261  libmesh_not_implemented();
262 }

Friends And Related Function Documentation

◆ LaspackLinearSolver< T >

template<typename T>
friend class LaspackLinearSolver< T >
friend

Definition at line 215 of file laspack_matrix.h.

◆ LaspackVector< T >

template<typename T>
friend class LaspackVector< T >
friend

Make other Laspack datatypes friends.

Definition at line 214 of file laspack_matrix.h.

Member Data Documentation

◆ _closed

template<typename T>
bool libMesh::LaspackMatrix< T >::_closed
private

Flag indicating if the matrix has been closed yet.

Definition at line 209 of file laspack_matrix.h.

Referenced by libMesh::LaspackMatrix< T >::closed().

◆ _communicator

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

◆ _counts

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

Actually holds the data.

Definition at line 124 of file reference_counter.h.

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

◆ _csr

template<typename T>
std::vector<numeric_index_type> libMesh::LaspackMatrix< T >::_csr
private

The compressed row indices.

Definition at line 198 of file laspack_matrix.h.

Referenced by libMesh::LaspackMatrix< T >::get_transpose().

◆ _dof_map

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

The DofMap object associated with this object.

May be queried for degree-of-freedom counts on processors.

Definition at line 666 of file sparse_matrix.h.

◆ _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 143 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

◆ _mutex

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

Mutual exclusion object to enable thread-safe reference counting.

Definition at line 137 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 132 of file reference_counter.h.

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

◆ _QMat

template<typename T>
QMatrix libMesh::LaspackMatrix< T >::_QMat
private

◆ _row_start

template<typename T>
std::vector<std::vector<numeric_index_type>::const_iterator> libMesh::LaspackMatrix< T >::_row_start
private

The start of each row in the compressed row index data structure.

Definition at line 204 of file laspack_matrix.h.

Referenced by libMesh::LaspackMatrix< T >::get_transpose().

◆ _sp

template<typename T>
SparsityPattern::Build const* libMesh::SparseMatrix< T >::_sp
protectedinherited

The sparsity pattern associated with this object.

Should be queried for entry counts (or with need_full_sparsity_pattern, patterns) when needed.

Definition at line 673 of file sparse_matrix.h.

◆ _use_hash_table

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

Flag indicating whether the matrix is assembled using a hash table.

Definition at line 683 of file sparse_matrix.h.

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


The documentation for this class was generated from the following files: