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 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 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...
 
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...
 
template<>
void print (std::ostream &os, const bool sparse) const
 
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)
 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)
 Write the contents of the matrix to a file in PETSc's HDF5 sparse matrix format. More...
 
virtual void read_matlab (const std::string &filename)
 Read the contents of the matrix from Matlab's sparse matrix format. 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...
 
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...
 
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 360 of file laspack_matrix.C.

360  :
361  SparseMatrix<T>(comm),
362  _closed (false)
363 {
364 }
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 369 of file laspack_matrix.C.

370 {
371  this->clear ();
372 }
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 555 of file sparse_matrix.h.

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

559  {
560  libmesh_not_implemented();
561  }

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

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

529 {
530  libmesh_assert (this->initialized());
531  libmesh_assert_less (i, this->m());
532  libmesh_assert_less (j, this->n());
533 
534  const numeric_index_type position = this->pos(i,j);
535 
536  // Sanity check
537  libmesh_assert_equal_to (*(_row_start[i]+position), j);
538 
539  Q_AddVal (&_QMat, i+1, position, value);
540 }
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:54

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

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

555 {
556  libmesh_assert (this->initialized());
557  libmesh_assert_equal_to (this->m(), X_in.m());
558  libmesh_assert_equal_to (this->n(), X_in.n());
559 
560  const LaspackMatrix<T> * X =
561  cast_ptr<const LaspackMatrix<T> *> (&X_in);
562 
563  _LPNumber a = static_cast<_LPNumber> (a_in);
564 
565  libmesh_assert(X);
566 
567  // loops taken from LaspackMatrix<T>::zero ()
568 
569  const numeric_index_type n_rows = this->m();
570 
571  for (numeric_index_type row=0; row<n_rows; row++)
572  {
573  auto r_start = _row_start[row];
574 
575  const numeric_index_type len = (_row_start[row+1] - _row_start[row]);
576 
577  // Make sure we agree on the row length
578  libmesh_assert_equal_to (len, Q_GetLen(&_QMat, row+1));
579  // compare matrix sparsity structures
580  libmesh_assert_equal_to (len, Q_GetLen(&(X->_QMat), row+1));
581 
582 
583  for (numeric_index_type l=0; l<len; l++)
584  {
585  const numeric_index_type j = *(r_start + l);
586 
587  // Make sure the data structures are working
588  libmesh_assert_equal_to ((j+1), Q_GetPos (&_QMat, row+1, l));
589 
590  const _LPNumber value = a * Q_GetEl(const_cast<QMatrix*>(&(X->_QMat)), row+1, j+1);
591  Q_AddVal (&_QMat, row+1, l, value);
592  }
593  }
594 }
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:54

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

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

85 {
86  libmesh_assert_equal_to (dm.m() / brows.size(), dm.n() / bcols.size());
87 
88  const numeric_index_type blocksize = cast_int<numeric_index_type>
89  (dm.m() / brows.size());
90 
91  libmesh_assert_equal_to (dm.m()%blocksize, 0);
92  libmesh_assert_equal_to (dm.n()%blocksize, 0);
93 
94  std::vector<numeric_index_type> rows, cols;
95 
96  rows.reserve(blocksize*brows.size());
97  cols.reserve(blocksize*bcols.size());
98 
99  for (auto & row : brows)
100  {
101  numeric_index_type i = row * blocksize;
102 
103  for (unsigned int v=0; v<blocksize; v++)
104  rows.push_back(i++);
105  }
106 
107  for (auto & col : bcols)
108  {
109  numeric_index_type j = col * blocksize;
110 
111  for (unsigned int v=0; v<blocksize; v++)
112  cols.push_back(j++);
113  }
114 
115  this->add_matrix (dm, rows, cols);
116 }
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 308 of file sparse_matrix.h.

310  { 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.
Definition: sparse_matrix.C:82

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

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

263 {
264  libmesh_assert (this->initialized());
265  unsigned int n_rows = cast_int<unsigned int>(rows.size());
266  unsigned int n_cols = cast_int<unsigned int>(cols.size());
267  libmesh_assert_equal_to (dm.m(), n_rows);
268  libmesh_assert_equal_to (dm.n(), n_cols);
269 
270 
271  for (unsigned int i=0; i<n_rows; i++)
272  for (unsigned int j=0; j<n_cols; j++)
273  this->add(rows[i],cols[j],dm(i,j));
274 }
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 545 of file laspack_matrix.C.

547 {
548  this->add_matrix (dm, dof_indices, dof_indices);
549 }
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 327 of file sparse_matrix.h.

331  { 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 63 of file sparse_matrix.C.

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

64 {
65  _dof_map = &dof_map;
66  if (!_sp)
67  _sp = dof_map.get_sparsity_pattern();
68 }
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 73 of file sparse_matrix.C.

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

74 {
75  _sp = &sp;
76 }
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 156 of file sparse_matrix.C.

Referenced by libMesh::TransientRBConstruction::allocate_data_structures(), libMesh::RBConstruction::allocate_data_structures(), libMesh::DofMap::process_mesh_constraint_rows(), ConstraintOperatorTest::test1DCoarseningNewNodes(), ConstraintOperatorTest::test1DCoarseningOperator(), ConstraintOperatorTest::testCoreform(), SystemsTest::testProjectMatrix1D(), SystemsTest::testProjectMatrix2D(), and SystemsTest::testProjectMatrix3D().

159 {
160  // Avoid unused parameter warnings when no solver packages are enabled.
162 
163  if (matrix_build_type == MatrixBuildType::DIAGONAL)
164  return std::make_unique<DiagonalMatrix<T>>(comm);
165 
166  // Build the appropriate vector
167  switch (solver_package)
168  {
169 
170 #ifdef LIBMESH_HAVE_LASPACK
171  case LASPACK_SOLVERS:
172  return std::make_unique<LaspackMatrix<T>>(comm);
173 #endif
174 
175 
176 #ifdef LIBMESH_HAVE_PETSC
177  case PETSC_SOLVERS:
178  return std::make_unique<PetscMatrix<T>>(comm);
179 #endif
180 
181 
182 #ifdef LIBMESH_TRILINOS_HAVE_EPETRA
183  case TRILINOS_SOLVERS:
184  return std::make_unique<EpetraMatrix<T>>(comm);
185 #endif
186 
187 
188 #ifdef LIBMESH_HAVE_EIGEN
189  case EIGEN_SOLVERS:
190  return std::make_unique<EigenSparseMatrix<T>>(comm);
191 #endif
192 
193  default:
194  libmesh_error_msg("ERROR: Unrecognized solver package: " << solver_package);
195  }
196 }
const Parallel::Communicator & comm() const
void libmesh_ignore(const Args &...)

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

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

378 {
379  if (this->initialized())
380  {
381  Q_Destr(&_QMat);
382  }
383 
384  _csr.clear();
385  _row_start.clear();
386  _closed = false;
387  this->_is_initialized = false;
388 }
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 441 of file laspack_matrix.C.

442 {
443  // We don't currently have a faster implementation than making a
444  // zero clone and then filling in the values.
445  auto mat_copy = this->zero_clone();
446  mat_copy->add(1., *this);
447 
448  // Work around an issue on older compilers. We are able to simply
449  // "return mat_copy;" on newer compilers
450  return std::unique_ptr<SparseMatrix<T>>(mat_copy.release());
451 }
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 637 of file laspack_matrix.C.

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

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

638 {
639  libmesh_assert(this->initialized());
640 
641  this->_closed = true;
642 
643  // We've probably changed some entries so we need to tell LASPACK
644  // that cached data is now invalid.
645  *_QMat.DiagElAlloc = _LPFalse;
646  *_QMat.ElSorted = _LPFalse;
647  if (*_QMat.ILUExists)
648  {
649  *_QMat.ILUExists = _LPFalse;
650  Q_Destr(_QMat.ILU);
651  }
652 }
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 159 of file laspack_matrix.h.

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

159 { 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 490 of file laspack_matrix.C.

491 {
492  return 0;
493 }

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

499 {
500  return this->n();
501 }
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::SlepcEigenSolver< libMesh::Number >::_petsc_shell_matrix_get_diagonal(), libMesh::PetscLinearSolver< Number >::_petsc_shell_matrix_get_diagonal(), libMesh::SlepcEigenSolver< libMesh::Number >::_petsc_shell_matrix_mult(), libMesh::PetscLinearSolver< 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::EigenSystem::add_matrices(), libMesh::System::add_matrix(), libMesh::RBConstruction::add_scaled_matrix_and_vector(), libMesh::System::add_variable(), libMesh::System::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::FEMSystem::assemble_qoi(), libMesh::Nemesis_IO::assert_symmetric_cmaps(), libMesh::MeshCommunication::assign_global_indices(), libMesh::Partitioner::assign_partitioning(), libMesh::MeshTools::Generation::build_extrusion(), libMesh::BoundaryInfo::build_node_list_from_side_list(), libMesh::EquationSystems::build_parallel_elemental_solution_vector(), libMesh::EquationSystems::build_parallel_solution_vector(), libMesh::PetscDMWrapper::build_section(), libMesh::PetscDMWrapper::build_sf(), libMesh::MeshBase::cache_elem_data(), libMesh::System::calculate_norm(), libMesh::DofMap::check_dirichlet_bcid_consistency(), libMesh::RBConstruction::compute_Fq_representor_innerprods(), libMesh::RBConstruction::compute_max_error_bound(), libMesh::Nemesis_IO_Helper::compute_num_global_elem_blocks(), libMesh::Nemesis_IO_Helper::compute_num_global_nodesets(), libMesh::Nemesis_IO_Helper::compute_num_global_sidesets(), libMesh::RBConstruction::compute_output_dual_innerprods(), libMesh::RBConstruction::compute_residual_dual_norm_slow(), libMesh::RBSCMConstruction::compute_SCM_bounds_on_training_set(), libMesh::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::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< libMesh::Number >::create_submatrix_nosort(), libMesh::MeshCommunication::delete_remote_elements(), libMesh::RBEIMEvaluation::distribute_bfs(), libMesh::DofMap::distribute_dofs(), 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::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::MeshBase::get_info(), libMesh::System::get_info(), libMesh::DofMap::get_info(), 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(), AssembleOptimization::inequality_constraints(), AssembleOptimization::inequality_constraints_jacobian(), libMesh::LocationMap< T >::init(), libMesh::TimeSolver::init(), libMesh::SystemSubsetBySubdomain::init(), libMesh::PetscDMWrapper::init_and_attach_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_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::DofMap::n_constrained_dofs(), 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::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::prepare_for_use(), 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::System::read_legacy_data(), libMesh::TransientRBConstruction::read_riesz_representors_from_files(), libMesh::RBConstruction::read_riesz_representors_from_files(), libMesh::System::read_SCALAR_dofs(), libMesh::XdrIO::read_serialized_bc_names(), libMesh::XdrIO::read_serialized_bcs_helper(), libMesh::System::read_serialized_blocked_dof_objects(), libMesh::XdrIO::read_serialized_connectivity(), libMesh::XdrIO::read_serialized_nodes(), libMesh::XdrIO::read_serialized_nodesets(), libMesh::XdrIO::read_serialized_subdomain_names(), libMesh::System::read_serialized_vector(), libMesh::Nemesis_IO_Helper::read_var_names_impl(), libMesh::MeshBase::recalculate_n_partitions(), libMesh::MeshRefinement::refine_and_coarsen_elements(), 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::split_mesh(), libMesh::RBEIMConstruction::store_eim_solutions_for_training_set(), libMesh::MeshBase::subdomain_ids(), libMesh::BoundaryInfo::sync(), ConstraintOperatorTest::test1DCoarseningNewNodes(), ConstraintOperatorTest::test1DCoarseningOperator(), 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(), ConstraintOperatorTest::testCoreform(), MeshInputTest::testExodusIGASidesets(), MeshTriangulationTest::testFoundCenters(), PointLocatorTest::testLocator(), BoundaryInfoTest::testMesh(), PointLocatorTest::testPlanar(), MeshTriangulationTest::testPoly2TriRefinementBase(), SystemsTest::testProjectCubeWithMeshFunction(), BoundaryInfoTest::testRenumber(), CheckpointIOTest::testSplitter(), MeshInputTest::testTetgenIO(), MeshTriangulationTest::testTriangulatorInterp(), MeshTriangulationTest::testTriangulatorMeshedHoles(), MeshTriangulationTest::testTriangulatorRoundHole(), 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(), 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::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 PetscMatrix type. 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 469 of file sparse_matrix.h.

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

472  {
473  this->_get_submatrix(submatrix,
474  rows,
475  cols,
476  false); // false means DO NOT REUSE submatrix
477  }
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 487 of file sparse_matrix.h.

490  {
491  libmesh_not_implemented();
492  }

◆ 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()

Definition at line 94 of file reference_counter.C.

References libMesh::ReferenceCounter::_enable_print_counter.

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 >, and libMesh::PetscMatrix< libMesh::Number >.

Definition at line 215 of file sparse_matrix.h.

215 { 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 314 of file laspack_matrix.C.

315 {
316  libmesh_not_implemented();
317 }

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

333 {
334  indices.clear();
335  values.clear();
336 
337  const numeric_index_type len = (_row_start[i+1] - _row_start[i]);
338 
339  // Make sure we agree on the row length
340  libmesh_assert_equal_to (len, Q_GetLen(&_QMat, i+1));
341 
342  auto r_start = _row_start[i];
343 
344  for (numeric_index_type l=0; l<len; l++)
345  {
346  const numeric_index_type j = *(r_start + l);
347 
348  // Make sure the data structures are working
349  libmesh_assert_equal_to ((j+1), Q_GetPos (&_QMat, i+1, l));
350 
351  indices.push_back(j);
352 
353  values.push_back(Q_GetVal (&_QMat, i+1, l));
354  }
355 }
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 322 of file laspack_matrix.C.

323 {
324  libmesh_not_implemented();
325 }

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

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

135 {
136  // noz ignored... only used for multiple processors!
137  libmesh_assert_equal_to (m_in, m_l);
138  libmesh_assert_equal_to (n_in, n_l);
139  libmesh_assert_equal_to (m_in, n_in);
140  libmesh_assert_greater (nnz, 0);
141 
142  if ((m_in != m_l) ||
143  (n_in != n_l))
144  libmesh_not_implemented_msg("Laspack does not support distributed matrices");
145 
146  if (m_in != n_in)
147  libmesh_not_implemented_msg("Laspack does not support rectangular matrices");
148 
149  if (nnz < n_in)
150  libmesh_warning("Using inefficient LaspackMatrix allocation via this init() method");
151 
152  const dof_id_type n_rows = m_in;
153 
154  // Laspack doesn't let us assign sparse indices on the fly, so
155  // without a sparsity pattern we're stuck allocating a dense matrix
156  {
157  _csr.resize (m_in * m_in);
158  _row_start.reserve(m_in + 1);
159  }
160 
161  // Initialize the _csr data structure.
162  {
163  std::vector<numeric_index_type>::iterator position = _csr.begin();
164 
165  _row_start.push_back (position);
166 
167  for (numeric_index_type row=0; row<n_rows; row++)
168  {
169  // insert the row indices
170  for (const auto & col : make_range(n_rows))
171  {
172  libmesh_assert (position != _csr.end());
173  *position = col;
174  ++position;
175  }
176 
177  _row_start.push_back (position);
178  }
179  }
180 
181  Q_Constr(&_QMat, const_cast<char *>("Mat"), m_in, _LPFalse, Rowws, Normal, _LPTrue);
182 
183  this->_is_initialized = true;
184 
185  // Tell the matrix about its structure. Initialize it
186  // to zero.
187  for (numeric_index_type i=0; i<n_rows; i++)
188  {
189  auto rs = _row_start[i];
190 
191  const numeric_index_type length = _row_start[i+1] - rs;
192 
193  Q_SetLen (&_QMat, i+1, length);
194 
195  for (numeric_index_type l=0; l<length; l++)
196  {
197  const numeric_index_type j = *(rs+l);
198 
199  libmesh_assert_equal_to (this->pos(i,j), l);
200  Q_SetEntry (&_QMat, i+1, l, j+1, 0.);
201  }
202  }
203 }
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:134
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 208 of file laspack_matrix.C.

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

209 {
210  // Ignore calls on initialized objects
211  if (this->initialized())
212  return;
213 
214  // We need a sparsity pattern for this!
215  libmesh_assert(this->_sp);
216 
217  // Clear initialized matrices
218  if (this->initialized())
219  this->clear();
220 
221  const numeric_index_type n_rows = this->_dof_map->n_dofs();
222 #ifndef NDEBUG
223  // The following variables are only used for assertions,
224  // so avoid declaring them when asserts are inactive.
225  const numeric_index_type n_cols = n_rows;
226  const numeric_index_type n_l = this->_dof_map->n_dofs_on_processor(0);
227  const numeric_index_type m_l = n_l;
228 #endif
229 
230  // Laspack Matrices only work for uniprocessor cases
231  libmesh_assert_equal_to (n_rows, n_cols);
232  libmesh_assert_equal_to (m_l, n_rows);
233  libmesh_assert_equal_to (n_l, n_cols);
234 
235 #ifndef NDEBUG
236  // The following variables are only used for assertions,
237  // so avoid declaring them when asserts are inactive.
238  const std::vector<numeric_index_type> & n_nz = this->_sp->get_n_nz();
239  const std::vector<numeric_index_type> & n_oz = this->_sp->get_n_oz();
240 #endif
241 
242  // Make sure the sparsity pattern isn't empty
243  libmesh_assert_equal_to (n_nz.size(), n_l);
244  libmesh_assert_equal_to (n_oz.size(), n_l);
245 
246  if (n_rows==0)
247  return;
248 
249  Q_Constr(&_QMat, const_cast<char *>("Mat"), n_rows, _LPFalse, Rowws, Normal, _LPTrue);
250 
251  this->_is_initialized = true;
252 
253  libmesh_assert_equal_to (n_rows, this->m());
254 }
virtual bool initialized() const
dof_id_type n_dofs_on_processor(const processor_id_type proc) const
Definition: dof_map.h:675
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.
QMatrix _QMat
The Laspack sparse matrix pointer.
dof_id_type n_dofs() const
Definition: dof_map.h:659
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)
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.

Definition at line 109 of file sparse_matrix.h.

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

109 { 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 279 of file laspack_matrix.C.

References std::abs(), and libMesh::make_range().

280 {
281  // There does not seem to be a straightforward way to iterate over
282  // the columns of a LaspackMatrix. So we use some extra storage and
283  // keep track of the column sums while going over the row entries...
284  std::vector<Real> abs_col_sums(this->n());
285 
286  const numeric_index_type n_rows = this->m();
287 
288  for (numeric_index_type row : make_range(n_rows))
289  {
290  auto r_start = _row_start[row];
291 
292  const numeric_index_type len = (_row_start[row+1] - _row_start[row]);
293 
294  // Make sure we agree on the row length
295  libmesh_assert_equal_to (len, Q_GetLen(&_QMat, row+1));
296 
297  for (numeric_index_type l=0; l<len; l++)
298  {
299  const numeric_index_type j = *(r_start + l);
300 
301  // Make sure the data structures are working
302  libmesh_assert_equal_to ((j+1), Q_GetPos (&_QMat, row+1, l));
303 
304  abs_col_sums[j] += std::abs(Q_GetVal (&_QMat, row+1, l));
305  }
306  }
307 
308  return *(std::max_element(abs_col_sums.begin(), abs_col_sums.end()));
309 }
QMatrix _QMat
The Laspack sparse matrix pointer.
ADRealEigenVector< T, D, asd > abs(const ADRealEigenVector< T, D, asd > &)
Definition: type_vector.h:57
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:134

◆ linfty_norm()

template<typename T>
virtual Real libMesh::LaspackMatrix< T >::linfty_norm ( ) const
inlineoverridevirtual
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 157 of file laspack_matrix.h.

157 { libmesh_not_implemented(); return 0.; }

◆ 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::PetscMatrix< T >, and libMesh::PetscMatrix< libMesh::Number >.

Definition at line 225 of file sparse_matrix.h.

225 { 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::PetscMatrix< T >, and libMesh::PetscMatrix< libMesh::Number >.

Definition at line 230 of file sparse_matrix.h.

230 { 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 454 of file laspack_matrix.C.

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

455 {
456  libmesh_assert (this->initialized());
457 
458  return static_cast<numeric_index_type>(Q_GetDim(const_cast<QMatrix*>(&_QMat)));
459 }
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 320 of file sparse_matrix.h.

321  { 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 464 of file laspack_matrix.C.

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

465 {
466  libmesh_assert (this->initialized());
467 
468  return static_cast<numeric_index_type>(Q_GetDim(const_cast<QMatrix*>(&_QMat)));
469 }
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 229 of file sparse_matrix.C.

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

230 {
231  if (!_sp)
232  return 0;
233  return _sp->n_nonzeros();
234 }
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::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::ExodusII_IO::copy_scalar_solution(), libMesh::Nemesis_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::SystemSubsetBySubdomain::init(), libMesh::PetscDMWrapper::init_and_attach_petscdm(), libMesh::Nemesis_IO_Helper::initialize(), libMesh::ExodusII_IO_Helper::initialize(), libMesh::DistributedMesh::insert_elem(), libMesh::MeshTools::libmesh_assert_contiguous_dof_ids(), libMesh::MeshTools::libmesh_assert_parallel_consistent_new_node_procids(), libMesh::MeshTools::libmesh_assert_parallel_consistent_procids< Elem >(), libMesh::MeshTools::libmesh_assert_parallel_consistent_procids< Node >(), libMesh::MeshTools::libmesh_assert_topology_consistent_procids< Node >(), libMesh::MeshTools::libmesh_assert_valid_boundary_ids(), libMesh::MeshTools::libmesh_assert_valid_dof_ids(), libMesh::MeshTools::libmesh_assert_valid_neighbors(), libMesh::MeshTools::libmesh_assert_valid_refinement_flags(), libMesh::DofMap::local_variable_indices(), libMesh::MeshRefinement::make_coarsening_compatible(), libMesh::MeshBase::n_active_elem_on_proc(), 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::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 86 of file laspack_matrix.h.

87  { 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 600 of file laspack_matrix.C.

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

602 {
603  libmesh_assert (this->initialized());
604  libmesh_assert_less (i, this->m());
605  libmesh_assert_less (j, this->n());
606 
607  return Q_GetEl (const_cast<QMatrix*>(&_QMat), i+1, j+1);
608 }
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/2]

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

◆ operator=() [2/2]

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

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

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

615 {
616  libmesh_assert_less (i, this->m());
617  libmesh_assert_less (j, this->n());
618  libmesh_assert_less (i+1, _row_start.size());
619  libmesh_assert (_row_start.back() == _csr.end());
620 
621  // note this requires the _csr to be sorted
622  auto p = std::equal_range (_row_start[i], _row_start[i+1], j);
623 
624  // Make sure the row contains the element j
625  libmesh_assert (p.first != p.second);
626 
627  // Make sure the values match
628  libmesh_assert (*p.first == j);
629 
630  // Return the position in the compressed row
631  return std::distance (_row_start[i], p.first);
632 }
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/2]

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

Definition at line 122 of file sparse_matrix.C.

123 {
124  // std::complex<>::operator<<() is defined, but use this form
125 
126  if (sparse)
127  {
128  libmesh_not_implemented();
129  }
130 
131  os << "Real part:" << std::endl;
132  for (auto i : make_range(this->m()))
133  {
134  for (auto j : make_range(this->n()))
135  os << std::setw(8) << (*this)(i,j).real() << " ";
136  os << std::endl;
137  }
138 
139  os << std::endl << "Imaginary part:" << std::endl;
140  for (auto i : make_range(this->m()))
141  {
142  for (auto j : make_range(this->n()))
143  os << std::setw(8) << (*this)(i,j).imag() << " ";
144  os << std::endl;
145  }
146 }
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:134
boost::multiprecision::float128 imag(const boost::multiprecision::float128)
virtual numeric_index_type n() const =0

◆ print() [2/2]

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

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

Definition at line 238 of file sparse_matrix.C.

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

239 {
240  parallel_object_only();
241 
242  libmesh_assert (this->initialized());
243 
244  const numeric_index_type first_dof = this->row_start(),
245  end_dof = this->row_stop();
246 
247  // We'll print the matrix from processor 0 to make sure
248  // it's serialized properly
249  if (this->processor_id() == 0)
250  {
251  libmesh_assert_equal_to (first_dof, 0);
252  for (numeric_index_type i : make_range(end_dof))
253  {
254  if (sparse)
255  {
256  for (auto j : make_range(this->n()))
257  {
258  T c = (*this)(i,j);
259  if (c != static_cast<T>(0.0))
260  {
261  os << i << " " << j << " " << c << std::endl;
262  }
263  }
264  }
265  else
266  {
267  for (auto j : make_range(this->n()))
268  os << (*this)(i,j) << " ";
269  os << std::endl;
270  }
271  }
272 
273  std::vector<numeric_index_type> ibuf, jbuf;
274  std::vector<T> cbuf;
275  numeric_index_type currenti = end_dof;
276  for (auto p : IntRange<processor_id_type>(1, this->n_processors()))
277  {
278  this->comm().receive(p, ibuf);
279  this->comm().receive(p, jbuf);
280  this->comm().receive(p, cbuf);
281  libmesh_assert_equal_to (ibuf.size(), jbuf.size());
282  libmesh_assert_equal_to (ibuf.size(), cbuf.size());
283 
284  if (ibuf.empty())
285  continue;
286  libmesh_assert_greater_equal (ibuf.front(), currenti);
287  libmesh_assert_greater_equal (ibuf.back(), ibuf.front());
288 
289  std::size_t currentb = 0;
290  for (;currenti <= ibuf.back(); ++currenti)
291  {
292  if (sparse)
293  {
294  for (numeric_index_type j=0; j<this->n(); j++)
295  {
296  if (currentb < ibuf.size() &&
297  ibuf[currentb] == currenti &&
298  jbuf[currentb] == j)
299  {
300  os << currenti << " " << j << " " << cbuf[currentb] << std::endl;
301  currentb++;
302  }
303  }
304  }
305  else
306  {
307  for (auto j : make_range(this->n()))
308  {
309  if (currentb < ibuf.size() &&
310  ibuf[currentb] == currenti &&
311  jbuf[currentb] == j)
312  {
313  os << cbuf[currentb] << " ";
314  currentb++;
315  }
316  else
317  os << static_cast<T>(0.0) << " ";
318  }
319  os << std::endl;
320  }
321  }
322  }
323  if (!sparse)
324  {
325  for (; currenti != this->m(); ++currenti)
326  {
327  for (numeric_index_type j=0; j<this->n(); j++)
328  os << static_cast<T>(0.0) << " ";
329  os << std::endl;
330  }
331  }
332  }
333  else
334  {
335  std::vector<numeric_index_type> ibuf, jbuf;
336  std::vector<T> cbuf;
337 
338  // We'll assume each processor has access to entire
339  // matrix rows, so (*this)(i,j) is valid if i is a local index.
340  for (numeric_index_type i : make_range(first_dof, end_dof))
341  {
342  for (auto j : make_range(this->n()))
343  {
344  T c = (*this)(i,j);
345  if (c != static_cast<T>(0.0))
346  {
347  ibuf.push_back(i);
348  jbuf.push_back(j);
349  cbuf.push_back(c);
350  }
351  }
352  }
353  this->comm().send(0,ibuf);
354  this->comm().send(0,jbuf);
355  this->comm().send(0,cbuf);
356  }
357 }
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:134
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 >, and libMesh::PetscMatrix< libMesh::Number >.

Definition at line 361 of file sparse_matrix.C.

362 {
363  parallel_object_only();
364 
365  libmesh_assert (this->initialized());
366 
367  const numeric_index_type first_dof = this->row_start(),
368  end_dof = this->row_stop();
369 
370  // We'll print the matrix from processor 0 to make sure
371  // it's serialized properly
372  if (this->processor_id() == 0)
373  {
374  std::unique_ptr<std::ofstream> file;
375 
376  if (name != "")
377  file = std::make_unique<std::ofstream>(name.c_str());
378 
379  std::ostream & os = (name == "") ? libMesh::out : *file;
380 
381  std::size_t sparsity_nonzeros = this->n_nonzeros();
382 
383  std::size_t real_nonzeros = 0;
384 
385  libmesh_assert_equal_to(first_dof, 0);
386  for (numeric_index_type i : make_range(end_dof))
387  {
388  for (auto j : make_range(this->n()))
389  {
390  T c = (*this)(i,j);
391  if (c != static_cast<T>(0.0))
392  ++real_nonzeros;
393  }
394  }
395 
396 
397  for (auto p : IntRange<processor_id_type>(1, this->n_processors()))
398  {
399  std::size_t nonzeros_on_p = 0;
400  this->comm().receive(p, nonzeros_on_p);
401  real_nonzeros += nonzeros_on_p;
402  }
403 
404  if (sparsity_nonzeros &&
405  sparsity_nonzeros != real_nonzeros)
406  libmesh_warning(sparsity_nonzeros <<
407  " nonzeros allocated, but " <<
408  real_nonzeros << " used.");
409 
410  // We probably want to be more consistent than that, if our
411  // sparsity is overallocated.
412 
413  // Print a header similar to PETSc's mat_view ascii_matlab
414  os << "%Mat Object: () " << this->n_processors() << " MPI processes\n"
415  << "% type: " << (this->n_processors() > 1 ? "mpi" : "seq") << "aij\n"
416  << "% Size = " << this->m() << ' ' << this->n() << '\n'
417  << "% Nonzeros = " << real_nonzeros << '\n'
418  << "zzz = zeros(" << real_nonzeros << ",3);\n"
419  << "zzz = [\n";
420 
421  for (numeric_index_type i : make_range(end_dof))
422  {
423  // FIXME - we need a base class way to iterate over a
424  // SparseMatrix row.
425  for (auto j : make_range(this->n()))
426  {
427  T c = (*this)(i,j);
428  if (c != static_cast<T>(0.0))
429  {
430  // Convert from 0-based to 1-based indexing
431  os << (i+1) << ' ' << (j+1) << " " << c << '\n';
432  }
433  }
434  }
435 
436  std::vector<numeric_index_type> ibuf, jbuf;
437  std::vector<T> cbuf;
438  for (auto p : IntRange<processor_id_type>(1, this->n_processors()))
439  {
440  this->comm().receive(p, ibuf);
441  this->comm().receive(p, jbuf);
442  this->comm().receive(p, cbuf);
443  libmesh_assert_equal_to (ibuf.size(), jbuf.size());
444  libmesh_assert_equal_to (ibuf.size(), cbuf.size());
445 
446  for (auto n : index_range(ibuf))
447  os << ibuf[n] << ' ' << jbuf[n] << " " << cbuf[n] << '\n';
448  }
449 
450  os << "];\n" << "Mat_sparse = spconvert(zzz);" << std::endl;
451  }
452  else
453  {
454  std::vector<numeric_index_type> ibuf, jbuf;
455  std::vector<T> cbuf;
456  std::size_t my_nonzeros = 0;
457 
458  // We'll assume each processor has access to entire
459  // matrix rows, so (*this)(i,j) is valid if i is a local index.
460  for (numeric_index_type i : make_range(first_dof, end_dof))
461  {
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  ibuf.push_back(i);
468  jbuf.push_back(j);
469  cbuf.push_back(c);
470  ++my_nonzeros;
471  }
472  }
473  }
474  this->comm().send(0,my_nonzeros);
475  this->comm().send(0,ibuf);
476  this->comm().send(0,jbuf);
477  this->comm().send(0,cbuf);
478  }
479 }
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:134
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:111
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 161 of file laspack_matrix.h.

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

161 { 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)
virtualinherited

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

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

Definition at line 484 of file sparse_matrix.C.

485 {
486  libmesh_not_implemented_msg
487  ("libMesh cannot write PETSc binary-format files from non-PETSc matrices");
488 }

◆ print_petsc_hdf5()

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

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

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

Definition at line 493 of file sparse_matrix.C.

494 {
495  libmesh_not_implemented_msg
496  ("libMesh cannot write PETSc HDF5-format files from non-PETSc matrices");
497 }

◆ 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::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::ExodusII_IO::copy_scalar_solution(), libMesh::Nemesis_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_local_dofs_node_major(), libMesh::DofMap::distribute_local_dofs_var_major(), libMesh::DofMap::distribute_scalar_dofs(), libMesh::DistributedMesh::DistributedMesh(), libMesh::DofMap::end_dof(), libMesh::DofMap::end_old_dof(), libMesh::EnsightIO::EnsightIO(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::SubFunctor::find_dofs_to_send(), libMesh::MeshFunction::find_element(), libMesh::MeshFunction::find_elements(), libMesh::UnstructuredMesh::find_neighbors(), libMesh::DofMap::first_dof(), libMesh::DofMap::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::Nemesis_IO_Helper::get_loadbal_param(), libMesh::DofMap::get_local_constraints(), libMesh::Nemesis_IO_Helper::get_node_cmap(), libMesh::Nemesis_IO_Helper::get_node_map(), libMesh::Nemesis_IO_Helper::get_ns_param_global(), libMesh::Nemesis_IO_Helper::get_ss_param_global(), libMesh::SparsityPattern::Build::handle_vi_vj(), libMesh::LaplaceMeshSmoother::init(), libMesh::SystemSubsetBySubdomain::init(), libMesh::PetscDMWrapper::init_and_attach_petscdm(), HeatSystem::init_data(), libMesh::ExodusII_IO_Helper::initialize(), libMesh::ExodusII_IO_Helper::initialize_element_variables(), libMesh::ExodusII_IO_Helper::initialize_global_variables(), libMesh::ExodusII_IO_Helper::initialize_nodal_variables(), libMesh::DistributedMesh::insert_elem(), libMesh::DofMap::is_evaluable(), libMesh::SparsityPattern::Build::join(), libMesh::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::BoundaryInfo::n_edge_conds(), libMesh::DofMap::n_local_dofs(), libMesh::System::n_local_dofs(), libMesh::MeshBase::n_local_elem(), libMesh::MeshBase::n_local_nodes(), libMesh::BoundaryInfo::n_nodeset_conds(), libMesh::BoundaryInfo::n_shellface_conds(), libMesh::RBEIMEvaluation::node_gather_bfs(), libMesh::SparsityPattern::Build::operator()(), 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::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::System::read_legacy_data(), 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::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(), ExodusTest< elem_type >::test_read_gold(), ExodusTest< elem_type >::test_write(), MeshInputTest::testAbaqusRead(), 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::testLowOrderEdgeBlocks(), SystemsTest::testProjectMatrix1D(), SystemsTest::testProjectMatrix2D(), SystemsTest::testProjectMatrix3D(), BoundaryInfoTest::testShellFaceConstraints(), MeshInputTest::testSingleElementImpl(), WriteVecAndScalar::testSolution(), CheckpointIOTest::testSplitter(), MeshInputTest::testTetgenIO(), libMesh::MeshTools::total_weight(), libMesh::MeshRefinement::uniformly_coarsen(), libMesh::DistributedMesh::update_parallel_id_counts(), libMesh::DTKAdapter::update_variable_values(), libMesh::NameBasedIO::write(), libMesh::XdrIO::write(), libMesh::CheckpointIO::write(), libMesh::EquationSystems::write(), libMesh::GMVIO::write_discontinuous_gmv(), libMesh::ExodusII_IO::write_element_data(), libMesh::ExodusII_IO_Helper::write_element_values(), libMesh::ExodusII_IO_Helper::write_element_values_element_major(), libMesh::ExodusII_IO_Helper::write_elements(), libMesh::ExodusII_IO_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_matlab()

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

Read the contents of the matrix from Matlab's sparse matrix format.

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

Referenced by ConstraintOperatorTest::test1DCoarseningNewNodes(), and ConstraintOperatorTest::testCoreform().

503 {
504 #ifndef LIBMESH_HAVE_CXX11_REGEX
505  libmesh_not_implemented(); // What is your compiler?!? Email us!
506  libmesh_ignore(filename);
507 #else
508  parallel_object_only();
509 
510  // The sizes we get from the file
511  std::size_t m = 0,
512  n = 0;
513 
514  // We'll read through the file three times: once to get a reliable
515  // value for the matrix size (so we can divvy it up among
516  // processors), then again to get the sparsity to send to each
517  // processor, then a final time to get the entries to send to each
518  // processor.
519  std::unique_ptr<std::ifstream> file;
520 
521  // We'll be using regular expressions to make ourselves slightly
522  // more robust to formatting.
523  const std::regex start_regex // assignment like "zzz = ["
524  ("\\s*\\w+\\s*=\\s*\\[");
525  const std::regex entry_regex // row/col/val like "1 1 -2.0e-4"
526  ("(\\d+)\\s+(\\d+)\\s+([+-]?(\\d+([.]\\d*)?([eE][+-]?\\d+)?|[.]\\d+([eE][+-]?\\d+)?))");
527  const std::regex end_regex // end of assignment
528  ("^[^%]*\\]");
529 
530  // We'll read the matrix on processor 0 rather than try to juggle
531  // parallel I/O. Start by reading to deduce the size.
532  if (this->processor_id() == 0)
533  {
534  file = std::make_unique<std::ifstream>(filename.c_str());
535 
536  // If we have a matrix with all-zero trailing rows, the only
537  // way to get the size is if it ended up in a comment
538  const std::regex size_regex // comment like "% size = 8 8"
539  ("%\\s*[Ss][Ii][Zz][Ee]\\s*=\\s*(\\d+)\\s+(\\d+)");
540 
541  // Get the size
542  bool have_started = false;
543  bool have_ended = false;
544  std::size_t largest_i_seen = 0, largest_j_seen = 0;
545  for (std::string line; std::getline(*file, line);)
546  {
547  std::smatch sm;
548 
549  if (std::regex_search(line, sm, size_regex))
550  {
551  const std::string msize = sm[1];
552  const std::string nsize = sm[2];
553  m = std::stoull(msize);
554  n = std::stoull(nsize);
555  }
556 
557  if (std::regex_search(line, start_regex))
558  have_started = true;
559 
560  if (std::regex_search(line, sm, entry_regex))
561  {
562  libmesh_error_msg_if
563  (!have_started, "Confused by premature entries in matrix file " << filename);
564 
565  const std::string istr = sm[1];
566  const std::string jstr = sm[2];
567 
568  std::size_t i = std::stoull(istr);
569  largest_i_seen = std::max(i, largest_i_seen);
570  std::size_t j = std::stoull(jstr);
571  largest_j_seen = std::max(j, largest_j_seen);
572  }
573 
574  if (std::regex_search(line, end_regex))
575  {
576  have_ended = true;
577  break;
578  }
579  }
580 
581  libmesh_error_msg_if
582  (!have_started, "Confused by missing assignment beginning in matrix file " << filename);
583 
584  libmesh_error_msg_if
585  (!have_ended, "Confused by missing assignment ending in matrix file " << filename);
586 
587  libmesh_error_msg_if
588  (m > largest_i_seen, "Confused by missing final row(s) in matrix file " << filename);
589 
590  libmesh_error_msg_if
591  (m > 0 && m < largest_i_seen, "Confused by extra final row(s) in matrix file " << filename);
592 
593  if (!m)
594  m = largest_i_seen;
595 
596  libmesh_error_msg_if
597  (n > largest_j_seen, "Confused by missing final column(s) in matrix file " << filename);
598 
599  libmesh_error_msg_if
600  (n > 0 && n < largest_j_seen, "Confused by extra final column(s) in matrix file " << filename);
601 
602  if (!n)
603  n = largest_j_seen;
604 
605  this->comm().broadcast(m);
606  this->comm().broadcast(n);
607  }
608  else
609  {
610  this->comm().broadcast(m);
611  this->comm().broadcast(n);
612  }
613 
614  // If we don't already have this size, we'll need to reinit later,
615  // and we'll need to redetermine which rows each processor is in
616  // charge of.
617 
619  new_row_start = this->processor_id() * m / this->n_processors(),
620  new_row_stop = (this->processor_id()+1) * m / this->n_processors();
622  new_col_start = this->processor_id() * n / this->n_processors(),
623  new_col_stop = (this->processor_id()+1) * n / this->n_processors();
624 
625  if (this->initialized() &&
626  m == this->m() &&
627  n == this->n())
628  {
629  new_row_start = this->row_start(),
630  new_row_stop = this->row_stop();
631 
632  new_col_start = this->col_start(),
633  new_col_stop = this->col_stop();
634  }
635 
636  std::vector<numeric_index_type> new_row_starts, new_row_stops,
637  new_col_starts, new_col_stops;
638 
639  this->comm().gather(0, new_row_start, new_row_starts);
640  this->comm().gather(0, new_row_stop, new_row_stops);
641  this->comm().gather(0, new_col_start, new_col_starts);
642  this->comm().gather(0, new_col_stop, new_col_stops);
643 
644  // Reread to deduce the sparsity pattern, or at least the maximum
645  // number of on- and off- diagonal non-zeros per row.
646  numeric_index_type on_diagonal_nonzeros =0,
647  off_diagonal_nonzeros =0;
648 
649  if (this->processor_id() == 0)
650  {
651  file->seekg(0);
652 
653  bool have_started = false;
654 
655  // Data for the row we're working on
656 
657  // Use 1-based indexing for current_row, as in the file
658  numeric_index_type current_row = 1;
659  processor_id_type current_proc = 0;
660  numeric_index_type current_on_diagonal_nonzeros = 0;
661  numeric_index_type current_off_diagonal_nonzeros = 0;
662 
663  for (std::string line; std::getline(*file, line);)
664  {
665  std::smatch sm;
666 
667  if (std::regex_search(line, start_regex))
668  have_started = true;
669 
670  if (have_started && std::regex_search(line, sm, entry_regex))
671  {
672  const std::string istr = sm[1];
673  const std::string jstr = sm[2];
674 
675  const numeric_index_type i = std::stoull(istr);
676  const numeric_index_type j = std::stoull(jstr);
677 
678  libmesh_error_msg_if
679  (!i || !j, "Expected 1-based indexing in matrix file "
680  << filename);
681 
682  libmesh_error_msg_if
683  (i < current_row,
684  "Can't handle out-of-order entries in matrix file "
685  << filename);
686  if (i > current_row)
687  {
688  current_row = i;
689  // +1 for 1-based indexing in file
690  while (current_row >= (new_row_stops[current_proc]+1))
691  ++current_proc;
692  current_on_diagonal_nonzeros = 0;
693  current_off_diagonal_nonzeros = 0;
694  }
695 
696  // +1 for 1-based indexing in file
697  if (j >= (new_col_starts[current_proc]+1) &&
698  j < (new_col_stops[current_proc]+1))
699  {
700  ++current_on_diagonal_nonzeros;
701  on_diagonal_nonzeros =
702  std::max(on_diagonal_nonzeros,
703  current_on_diagonal_nonzeros);
704  }
705  else
706  {
707  ++current_off_diagonal_nonzeros;
708  off_diagonal_nonzeros =
709  std::max(off_diagonal_nonzeros,
710  current_off_diagonal_nonzeros);
711  }
712  }
713 
714  if (std::regex_search(line, end_regex))
715  break;
716  }
717  }
718 
719  this->comm().broadcast(on_diagonal_nonzeros);
720  this->comm().broadcast(off_diagonal_nonzeros);
721 
722  this->init(m, n,
723  new_row_stop-new_row_start,
724  new_col_stop-new_col_start,
725  on_diagonal_nonzeros,
726  off_diagonal_nonzeros);
727 
728  // One last reread to set values
729  if (this->processor_id() == 0)
730  {
731  file->seekg(0);
732 
733  bool have_started = false;
734 
735  for (std::string line; std::getline(*file, line);)
736  {
737  std::smatch sm;
738 
739  if (std::regex_search(line, start_regex))
740  have_started = true;
741 
742  if (have_started && std::regex_search(line, sm, entry_regex))
743  {
744  const std::string istr = sm[1];
745  const std::string jstr = sm[2];
746  const std::string cstr = sm[3];
747 
748  const numeric_index_type i = std::stoull(istr);
749  const numeric_index_type j = std::stoull(jstr);
750 
751  // Try to be compatible with
752  // higher-than-double-precision T
753  std::stringstream ss(cstr);
754  T value;
755  ss >> value;
756 
757  // Convert from 1-based to 0-based indexing
758  this->set(i-1, j-1, value);
759  }
760 
761  if (std::regex_search(line, end_regex))
762  break;
763  }
764  }
765  this->close();
766 #endif
767 }
virtual bool initialized() const
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
static const bool value
Definition: xdr_io.C:54
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 >, and libMesh::PetscMatrix< libMesh::Number >.

Definition at line 772 of file sparse_matrix.C.

773 {
774  libmesh_not_implemented_msg
775  ("libMesh cannot read PETSc binary-format files into non-PETSc matrices");
776 }

◆ 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 >, and libMesh::PetscMatrix< libMesh::Number >.

Definition at line 781 of file sparse_matrix.C.

782 {
783  libmesh_not_implemented_msg
784  ("libMesh cannot read PETSc HDF5-format files into non-PETSc matrices");
785 }

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

503  {
504  this->_get_submatrix(submatrix,
505  rows,
506  cols,
507  true); // true means REUSE submatrix
508  }
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.

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

475 {
476  return 0;
477 }

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

483 {
484  return this->m();
485 }
virtual numeric_index_type m() const override

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

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

509 {
510  libmesh_assert (this->initialized());
511  libmesh_assert_less (i, this->m());
512  libmesh_assert_less (j, this->n());
513 
514  const numeric_index_type position = this->pos(i,j);
515 
516  // Sanity check
517  libmesh_assert_equal_to (*(_row_start[i]+position), j);
518  libmesh_assert_equal_to ((j+1), Q_GetPos (&_QMat, i+1, position));
519 
520  Q_SetEntry (&_QMat, i+1, position, j+1, value);
521 }
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:54

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

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

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

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

Referenced by libMesh::TransientRBConstruction::add_IC_to_RB_space(), libMesh::RBSCMConstruction::Aq_inner_product(), 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().

202 {
203  dest.zero();
204  this->vector_mult_add(dest,arg);
205 }
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 210 of file sparse_matrix.C.

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

212 {
213  /* This functionality is actually implemented in the \p
214  NumericVector class. */
215  dest.add_vector(arg,*this);
216 }

◆ zero()

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

Set all entries to 0.

Implements libMesh::SparseMatrix< T >.

Definition at line 393 of file laspack_matrix.C.

394 {
395  const numeric_index_type n_rows = this->m();
396 
397  for (numeric_index_type row=0; row<n_rows; row++)
398  {
399  auto r_start = _row_start[row];
400 
401  const numeric_index_type len = (_row_start[row+1] - _row_start[row]);
402 
403  // Make sure we agree on the row length
404  libmesh_assert_equal_to (len, Q_GetLen(&_QMat, row+1));
405 
406  for (numeric_index_type l=0; l<len; l++)
407  {
408  const numeric_index_type j = *(r_start + l);
409 
410  // Make sure the data structures are working
411  libmesh_assert_equal_to ((j+1), Q_GetPos (&_QMat, row+1, l));
412 
413  Q_SetEntry (&_QMat, row+1, l, j+1, 0.);
414  }
415  }
416 
417  this->close();
418 }
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 423 of file laspack_matrix.C.

424 {
425  // Make empty copy with matching comm, initialize, zero, and return.
426  auto mat_copy = std::make_unique<LaspackMatrix<T>>(this->comm());
427  if (this->_dof_map)
428  mat_copy->attach_dof_map(*this->_dof_map);
429  else
430  mat_copy->init(this->m(), this->n(), this->local_m(),
431  this->local_n(), this->local_n());
432 
433  mat_copy->zero();
434 
435  return mat_copy;
436 }
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::PetscMatrix< T >, and libMesh::DiagonalMatrix< T >.

Definition at line 221 of file sparse_matrix.C.

222 {
223  /* This functionality isn't implemented or stubbed in every subclass yet */
224  libmesh_not_implemented();
225 }

Friends And Related Function Documentation

◆ LaspackLinearSolver< T >

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

Definition at line 205 of file laspack_matrix.h.

◆ LaspackVector< T >

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

Make other Laspack datatypes friends.

Definition at line 204 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 199 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 188 of file laspack_matrix.h.

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

The Laspack sparse matrix pointer.

Definition at line 183 of file laspack_matrix.h.

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

◆ _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 194 of file laspack_matrix.h.

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


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