libMesh
Loading...
Searching...
No Matches
eigen_sparse_matrix.h
Go to the documentation of this file.
1// The libMesh Finite Element Library.
2// Copyright (C) 2002-2026 Benjamin S. Kirk, John W. Peterson, Roy H. Stogner
3
4// This library is free software; you can redistribute it and/or
5// modify it under the terms of the GNU Lesser General Public
6// License as published by the Free Software Foundation; either
7// version 2.1 of the License, or (at your option) any later version.
8
9// This library is distributed in the hope that it will be useful,
10// but WITHOUT ANY WARRANTY; without even the implied warranty of
11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12// Lesser General Public License for more details.
13
14// You should have received a copy of the GNU Lesser General Public
15// License along with this library; if not, write to the Free Software
16// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17
18
19
20#ifndef LIBMESH_EIGEN_SPARSE_MATRIX_H
21#define LIBMESH_EIGEN_SPARSE_MATRIX_H
22
23#include "libmesh/libmesh_config.h"
24
25#ifdef LIBMESH_HAVE_EIGEN
26
27// Local includes
28#include "libmesh/sparse_matrix.h"
29#include "libmesh/eigen_core_support.h"
30
31// Eigen includes
32
33// C++ includes
34#include <algorithm>
35#include <cstddef>
36
37namespace libMesh
38{
39
40// Forward declarations
41template <typename T> class DenseMatrix;
42template <typename T> class EigenSparseVector;
43template <typename T> class EigenSparseLinearSolver;
44
53template <typename T>
54class EigenSparseMatrix final : public SparseMatrix<T>
55{
56
57public:
69
78 virtual ~EigenSparseMatrix () = default;
79
80 virtual SolverPackage solver_package() override
81 {
82 return EIGEN_SOLVERS;
83 }
84
85 virtual SparseMatrix<T> & operator=(const SparseMatrix<T> & v) override
86 {
87 *this = cast_ref<const EigenSparseMatrix<T> &>(v);
88 return *this;
89 }
90
95 typedef Eigen::Triplet<T,eigen_idx_type> TripletType;
96
97 virtual void init (const numeric_index_type m,
99 const numeric_index_type m_l,
100 const numeric_index_type n_l,
101 const numeric_index_type nnz=30,
102 const numeric_index_type noz=10,
103 const numeric_index_type blocksize=1) override;
104
105 virtual void init (ParallelType = PARALLEL) override;
106
107 virtual void clear () override;
108
109 virtual void zero () override;
110
111 virtual std::unique_ptr<SparseMatrix<T>> zero_clone () const override;
112
113 virtual std::unique_ptr<SparseMatrix<T>> clone () const override;
114
115 virtual void close () override { this->_closed = true; }
116
117 virtual numeric_index_type m () const override;
118
119 virtual numeric_index_type n () const override;
120
121 virtual numeric_index_type row_start () const override;
122
123 virtual numeric_index_type row_stop () const override;
124
125 virtual numeric_index_type col_start () const override;
126
127 virtual numeric_index_type col_stop () const override;
128
129 virtual void set (const numeric_index_type i,
130 const numeric_index_type j,
131 const T value) override;
132
133 virtual void add (const numeric_index_type i,
134 const numeric_index_type j,
135 const T value) override;
136
137 virtual void add_matrix (const DenseMatrix<T> & dm,
138 const std::vector<numeric_index_type> & rows,
139 const std::vector<numeric_index_type> & cols) override;
140
141 virtual void add_matrix (const DenseMatrix<T> & dm,
142 const std::vector<numeric_index_type> & dof_indices) override;
143
144 virtual void add (const T a, const SparseMatrix<T> & X) override;
145
146 virtual T operator () (const numeric_index_type i,
147 const numeric_index_type j) const override;
148
149 virtual Real l1_norm () const override;
150
151 virtual Real linfty_norm () const override;
152
153 virtual bool closed() const override { return _closed; }
154
155 virtual void print_personal(std::ostream & os=libMesh::out) const override { this->print(os); }
156
157 virtual void get_diagonal (NumericVector<T> & dest) const override;
158
159 virtual void get_transpose (SparseMatrix<T> & dest) const override;
160
161 virtual void get_row(numeric_index_type i,
162 std::vector<numeric_index_type> & indices,
163 std::vector<T> & values) const override;
164private:
165
170
175
179 friend class EigenSparseVector<T>;
180 friend class EigenSparseLinearSolver<T>;
181};
182
183} // namespace libMesh
184
185#endif // #ifdef LIBMESH_HAVE_EIGEN
186#endif // #ifdef LIBMESH_EIGEN_SPARSE_MATRIX_H
Defines a dense matrix for use in Finite Element-type computations.
This class provides an interface to Eigen iterative solvers that is compatible with the libMesh Linea...
The EigenSparseMatrix class wraps a sparse matrix object from the Eigen library.
virtual void zero() override
Set all entries to 0.
virtual void get_diagonal(NumericVector< T > &dest) const override
Copies the diagonal part of the matrix into dest.
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.
virtual bool closed() const override
DataType _mat
Actual Eigen::SparseMatrix<> we are wrapping.
virtual Real l1_norm() const override
virtual ~EigenSparseMatrix()=default
virtual SparseMatrix< T > & operator=(const SparseMatrix< T > &v) override
This looks like a copy assignment operator, but note that, unlike normal copy assignment operators,...
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.
virtual numeric_index_type m() const override
virtual void clear() override
Restores the SparseMatrix<T> to a pristine state.
virtual std::unique_ptr< SparseMatrix< T > > clone() const override
virtual SolverPackage solver_package() override
EigenSM DataType
Convenient typedefs.
virtual Real linfty_norm() const override
virtual void close() override
Calls the SparseMatrix's internal assembly routines, ensuring that the values are consistent across p...
bool _closed
Flag indicating if the matrix has been closed yet.
Eigen::Triplet< T, eigen_idx_type > TripletType
virtual std::unique_ptr< SparseMatrix< T > > zero_clone() const override
EigenSparseMatrix & operator=(const EigenSparseMatrix &)=default
EigenSparseMatrix(const EigenSparseMatrix &)=default
virtual numeric_index_type row_stop() const override
virtual T operator()(const numeric_index_type i, const numeric_index_type j) const override
EigenSparseMatrix(EigenSparseMatrix &&)=default
The 5 special functions can be defaulted for this class, as it does not manage any memory itself.
virtual void get_transpose(SparseMatrix< T > &dest) const override
Copies the transpose of the matrix into dest, which may be *this.
virtual void set(const numeric_index_type i, const numeric_index_type j, const T value) override
Set the element (i,j) to value.
virtual numeric_index_type n() const override
virtual void add(const numeric_index_type i, const numeric_index_type j, const T value) override
Add value to the element (i,j).
virtual numeric_index_type col_start() const override
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.
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.
virtual numeric_index_type row_start() const override
virtual numeric_index_type col_stop() const override
This class provides a nice interface to the Eigen C++-based data structures for serial vectors.
Provides a uniform interface to vector storage schemes for different linear algebra libraries.
const Parallel::Communicator & comm() const
Generic sparse matrix.
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...
The libMesh namespace provides an interface to certain functionality in the library.
ParallelType
Defines an enum for parallel data structure types.
OStreamProxy out
Eigen::SparseMatrix< Number, Eigen::RowMajor, eigen_idx_type > EigenSM
dof_id_type numeric_index_type
Definition id_types.h:99
SolverPackage
Defines an enum for various linear solver packages.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
static const bool value
Definition xdr_io.C:55