21 #include "libmesh/libmesh_config.h" 23 #ifdef LIBMESH_HAVE_EIGEN 25 #include "libmesh/eigen_sparse_vector.h" 26 #include "libmesh/eigen_sparse_matrix.h" 27 #include "libmesh/dense_matrix.h" 28 #include "libmesh/dof_map.h" 29 #include "libmesh/sparsity_pattern.h" 51 libmesh_assert_equal_to (m_in, m_l);
52 libmesh_assert_equal_to (n_in, n_l);
53 libmesh_assert_greater (nnz, 0);
55 _mat.resize(m_in, n_in);
56 _mat.reserve(Eigen::Matrix<numeric_index_type, Eigen::Dynamic, 1>::Constant(m_in,nnz));
88 libmesh_assert_equal_to (m_l, n_rows);
89 libmesh_assert_equal_to (n_l, n_cols);
91 const std::vector<numeric_index_type> & n_nz = this->_sp->get_n_nz();
96 const std::vector<numeric_index_type> & n_oz = this->_sp->get_n_oz();
100 libmesh_assert_equal_to (n_nz.size(), n_l);
101 libmesh_assert_equal_to (n_oz.size(), n_l);
109 _mat.resize(n_rows,n_cols);
114 libmesh_assert_equal_to (n_rows, this->m());
115 libmesh_assert_equal_to (n_cols, this->n());
120 template <
typename T>
122 const std::vector<numeric_index_type> & rows,
123 const std::vector<numeric_index_type> & cols)
127 unsigned int n_rows = cast_int<unsigned int>(rows.size());
128 unsigned int n_cols = cast_int<unsigned int>(cols.size());
129 libmesh_assert_equal_to (dm.
m(), n_rows);
130 libmesh_assert_equal_to (dm.
n(), n_cols);
133 for (
unsigned int i=0; i<n_rows; i++)
134 for (
unsigned int j=0; j<n_cols; j++)
135 this->add(rows[i],cols[j],dm(i,j));
140 template <
typename T>
145 dest.
_vec = _mat.diagonal();
150 template <
typename T>
155 dest.
_mat = _mat.transpose();
160 template <
typename T>
169 template <
typename T>
180 template <
typename T>
189 const std::vector<numeric_index_type> & n_nz = this->_sp->get_n_nz();
196 template <
typename T>
201 auto ret = std::make_unique<EigenSparseMatrix<T>>(*this);
209 template <
typename T>
212 return std::make_unique<EigenSparseMatrix<T>>(*this);
217 template <
typename T>
222 return cast_int<numeric_index_type>(_mat.rows());
227 template <
typename T>
232 return cast_int<numeric_index_type>(_mat.cols());
237 template <
typename T>
245 template <
typename T>
253 template <
typename T>
261 template <
typename T>
269 template <
typename T>
275 libmesh_assert_less (i, this->m());
276 libmesh_assert_less (j, this->n());
278 _mat.coeffRef(i,j) =
value;
283 template <
typename T>
289 libmesh_assert_less (i, this->m());
290 libmesh_assert_less (j, this->n());
292 _mat.coeffRef(i,j) +=
value;
297 template <
typename T>
299 const std::vector<numeric_index_type> & dof_indices)
301 this->add_matrix (dm, dof_indices, dof_indices);
306 template <
typename T>
310 libmesh_assert_equal_to (this->m(), X_in.
m());
311 libmesh_assert_equal_to (this->n(), X_in.
n());
314 cast_ref<const EigenSparseMatrix<T> &> (X_in);
322 template <
typename T>
327 libmesh_assert_less (i, this->m());
328 libmesh_assert_less (j, this->n());
330 return _mat.coeff(i,j);
335 template <
typename T>
342 std::vector<Real> abs_col_sums(this->n());
348 EigenSM::InnerIterator it(_mat, row);
350 abs_col_sums[it.col()] += std::abs(it.value());
353 return *(std::max_element(abs_col_sums.begin(), abs_col_sums.end()));
358 template <
typename T>
361 Real max_abs_row_sum = 0.;
367 Real current_abs_row_sum = 0.;
368 EigenSM::InnerIterator it(_mat, row);
370 current_abs_row_sum += std::abs(it.value());
372 max_abs_row_sum = std::max(max_abs_row_sum, current_abs_row_sum);
375 return max_abs_row_sum;
380 template <
typename T>
382 std::vector<numeric_index_type> & indices,
383 std::vector<T> & values)
const 389 static_assert(EigenSM::IsRowMajor);
391 for (EigenSM::InnerIterator it(_mat, i); it; ++it)
393 indices.push_back(it.col());
394 values.push_back(it.value());
407 #endif // #ifdef LIBMESH_HAVE_EIGEN virtual void set(const numeric_index_type i, const numeric_index_type j, const T value) override
Set the element (i,j) to value.
The EigenSparseMatrix class wraps a sparse matrix object from the Eigen library.
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 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 m() const override
virtual numeric_index_type row_stop() const override
DataType _vec
Actual Eigen::SparseVector<> we are wrapping.
virtual std::unique_ptr< SparseMatrix< T > > clone() const override
Provides a uniform interface to vector storage schemes for different linear algebra libraries...
The libMesh namespace provides an interface to certain functionality in the library.
DataType _mat
Actual Eigen::SparseMatrix<> we are wrapping.
virtual void get_transpose(SparseMatrix< T > &dest) const override
Copies the transpose of the matrix into dest, which may be *this.
virtual void zero() override
Set all entries to 0.
virtual numeric_index_type n() const override
virtual void get_diagonal(NumericVector< T > &dest) const override
Copies the diagonal part of the matrix into dest.
dof_id_type numeric_index_type
bool _is_initialized
Flag that tells if init() has been called.
EigenSparseMatrix(const Parallel::Communicator &comm)
Constructor; initializes the matrix to be empty, without any structure, i.e.
virtual numeric_index_type m() const =0
virtual numeric_index_type col_stop() const override
virtual T operator()(const numeric_index_type i, const numeric_index_type j) const override
virtual numeric_index_type row_start() const override
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
virtual Real linfty_norm() const override
virtual numeric_index_type col_start() const override
virtual void clear() override
Restores the SparseMatrix<T> to a pristine state.
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.
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...
bool initialized()
Checks that library initialization has been done.
virtual std::unique_ptr< SparseMatrix< T > > zero_clone() const override
virtual Real l1_norm() const override
Defines a dense matrix for use in Finite Element-type computations.
This class provides a nice interface to the Eigen C++-based data structures for serial vectors...
virtual numeric_index_type n() const =0
ParallelType
Defines an enum for parallel data structure types.
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.