20 #ifndef LIBMESH_SPARSE_MATRIX_H 21 #define LIBMESH_SPARSE_MATRIX_H 25 #include "libmesh/libmesh.h" 26 #include "libmesh/libmesh_common.h" 27 #include "libmesh/reference_counted_object.h" 28 #include "libmesh/id_types.h" 29 #include "libmesh/parallel_object.h" 30 #include "libmesh/enum_parallel_type.h" 31 #include "libmesh/enum_matrix_build_type.h" 32 #include "libmesh/enum_solver_package.h" 44 template <
typename T>
class SparseMatrix;
45 template <
typename T>
class DenseMatrix;
47 namespace SparsityPattern {
51 template <
typename T>
class NumericVector;
56 std::ostream & operator << (std::ostream & os, const SparseMatrix<T> & m);
69 class SparseMatrix :
public ReferenceCountedObject<SparseMatrix<T>>,
100 libmesh_not_implemented();
122 static std::unique_ptr<SparseMatrix<T>>
206 virtual void clear () = 0;
211 virtual void zero () = 0;
219 virtual std::unique_ptr<SparseMatrix<T>>
zero_clone ()
const = 0;
226 virtual std::unique_ptr<SparseMatrix<T>>
clone ()
const = 0;
231 virtual void zero_rows (std::vector<numeric_index_type> & rows, T diag_value = 0.0);
237 virtual void close () = 0;
313 const std::vector<numeric_index_type> & rows,
314 const std::vector<numeric_index_type> & cols) = 0;
321 const std::vector<numeric_index_type> & dof_indices) = 0;
330 const std::vector<numeric_index_type> & brows,
331 const std::vector<numeric_index_type> & bcols);
338 const std::vector<numeric_index_type> & dof_indices)
350 { libmesh_not_implemented(); }
357 const std::map<numeric_index_type, numeric_index_type> & ,
358 const std::map<numeric_index_type, numeric_index_type> & ,
360 { libmesh_not_implemented(); }
401 virtual bool closed()
const = 0;
442 friend std::ostream & operator << <>(std::ostream & os,
const SparseMatrix<T> &
m);
455 virtual void print_matlab(
const std::string & =
"")
const;
474 virtual void read(
const std::string & filename);
487 virtual void read_matlab(
const std::string & filename);
510 const std::vector<numeric_index_type> & rows,
511 const std::vector<numeric_index_type> & cols)
const 528 const std::vector<numeric_index_type> & ,
529 const std::vector<numeric_index_type> & )
const 531 libmesh_not_implemented();
541 const std::vector<numeric_index_type> & rows,
542 const std::vector<numeric_index_type> & cols)
const 583 std::vector<numeric_index_type> & indices,
584 std::vector<T> & values)
const = 0;
630 const std::vector<numeric_index_type> & ,
631 const std::vector<numeric_index_type> & ,
634 libmesh_not_implemented();
665 template <
typename T>
669 libmesh_error_msg_if(use_hash && !this->supports_hash_table(),
670 "This matrix class does not support hash table assembly");
671 this->_use_hash_table = use_hash;
679 template <
typename T>
680 std::ostream & operator << (std::ostream & os, const SparseMatrix<T> & m)
686 template <
typename T>
690 return mat.l1_norm();
693 template <
typename T>
697 return mat1.l1_norm_diff(mat2);
703 #endif // LIBMESH_SPARSE_MATRIX_H 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.
virtual bool initialized() const
virtual void restore_original_nonzero_pattern()
Reset the memory storage of the matrix.
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 give...
virtual std::size_t n_nonzeros() const
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.
virtual void print_personal(std::ostream &os=libMesh::out) const =0
Print the contents of the matrix to the screen in a package-personalized style, if available...
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. ...
SparseMatrix(const Parallel::Communicator &comm)
Constructor; initializes the matrix to be empty, without any structure, i.e.
This helper class can be called on multiple threads to compute the sparsity pattern (or graph) of the...
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...
virtual ~SparseMatrix()=default
While this class doesn't manage any memory, the derived class might and users may be deleting through...
virtual numeric_index_type local_m() const
Get the number of rows owned by this process.
SparsityPattern::Build const * _sp
The sparsity pattern associated with this object.
bool use_hash_table() const
void attach_sparsity_pattern(const SparsityPattern::Build &sp)
Set a pointer to a sparsity pattern to use.
Provides a uniform interface to vector storage schemes for different linear algebra libraries...
const Parallel::Communicator & comm() const
virtual void matrix_matrix_mult(SparseMatrix< T > &, SparseMatrix< T > &, bool)
Compute Y = A*X for matrix X.
The libMesh namespace provides an interface to certain functionality in the library.
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.
virtual numeric_index_type local_n() const
Get the number of columns owned by this process.
virtual numeric_index_type row_stop() const =0
virtual void clear()=0
Restores the SparseMatrix<T> to a pristine state.
virtual void add(const numeric_index_type i, const numeric_index_type j, const T value)=0
Add value to the element (i,j).
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...
SolverPackage default_solver_package()
virtual void read_matlab(const std::string &filename)
Read the contents of the matrix from the Matlab-script sparse matrix format used by PETSc...
This class handles the numbering of degrees of freedom on a mesh.
virtual void flush()
For PETSc matrix , this function is similar to close but without shrinking memory.
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.
virtual SolverPackage solver_package()=0
virtual void zero()=0
Set all entries to 0.
auto l1_norm(const NumericVector< T > &vec)
dof_id_type numeric_index_type
virtual SparseMatrix< T > & operator=(const SparseMatrix< T > &)
This looks like a copy assignment operator, but note that, unlike normal copy assignment operators...
bool _is_initialized
Flag indicating whether or not the matrix has been initialized.
auto l1_norm_diff(const NumericVector< T > &vec1, const NumericVector< T > &vec2)
virtual std::unique_ptr< SparseMatrix< T > > zero_clone() const =0
virtual numeric_index_type m() const =0
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.
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.
virtual numeric_index_type col_stop() const =0
virtual void get_diagonal(NumericVector< T > &dest) const =0
Copies the diagonal part of the matrix into dest.
virtual numeric_index_type col_start() const =0
virtual void read(const std::string &filename)
Read the contents of the matrix from a file, with the file format inferred from the extension of file...
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 o...
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 give...
Real l1_norm_diff(const SparseMatrix< T > &other_mat) const
virtual bool closed() const =0
void attach_dof_map(const DofMap &dof_map)
Set a pointer to the DofMap to use.
DofMap const * _dof_map
The DofMap object associated with this object.
virtual void get_row(numeric_index_type i, std::vector< numeric_index_type > &indices, std::vector< T > &values) const =0
Get a row from the matrix.
virtual bool need_full_sparsity_pattern() const
virtual void close()=0
Calls the SparseMatrix's internal assembly routines, ensuring that the values are consistent across p...
virtual void update_sparsity_pattern(const SparsityPattern::Graph &)
Updates the matrix sparsity pattern.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
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...
virtual numeric_index_type row_start() const =0
virtual void print_matlab(const std::string &="") const
Print the contents of the matrix in Matlab's sparse matrix format.
virtual void get_transpose(SparseMatrix< T > &dest) const =0
Copies the transpose of the matrix into dest, which may be *this.
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.
virtual void scale(const T scale)
Scales all elements of this matrix by scale.
bool _use_hash_table
Flag indicating whether the matrix is assembled using a hash table.
virtual Real linfty_norm() const =0
virtual bool supports_hash_table() const
SolverPackage
Defines an enum for various linear solver packages.
virtual Real l1_norm() const =0
MatrixBuildType
Defines an enum for matrix build types.
virtual std::unique_ptr< SparseMatrix< T > > clone() const =0
Defines a dense matrix for use in Finite Element-type computations.
virtual T operator()(const numeric_index_type i, const numeric_index_type j) const =0
virtual bool require_sparsity_pattern() 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 packag...
virtual numeric_index_type n() const =0
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.
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.
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.
ParallelType
Defines an enum for parallel data structure types.