18 #include "libmesh/diagonal_matrix.h"
19 #include "libmesh/numeric_vector.h"
20 #include "libmesh/dense_matrix.h"
21 #include "libmesh/dof_map.h"
22 #include "libmesh/libmesh_common.h"
68 _diagonal->init(m, m_l);
75 libmesh_assert(this->_dof_map);
77 _diagonal->init(this->_dof_map->n_dofs(),
78 this->_dof_map->n_dofs_on_processor(this->processor_id()),
87 _diagonal->init(other, fast);
104 template <
typename T>
111 template <
typename T>
115 auto mat_copy = std::make_unique<DiagonalMatrix<T>>(this->comm());
119 mat_copy->init(*
this,
false);
123 return std::unique_ptr<SparseMatrix<T>>(mat_copy.release());
128 template <
typename T>
132 auto mat_copy = std::make_unique<DiagonalMatrix<T>>(this->comm());
135 auto diag_copy = _diagonal->clone();
138 *mat_copy = std::move(*diag_copy);
142 return std::unique_ptr<SparseMatrix<T>>(mat_copy.release());
145 template <
typename T>
152 template <
typename T>
156 return _diagonal->size();
159 template <
typename T>
163 return _diagonal->size();
166 template <
typename T>
170 return _diagonal->first_local_index();
173 template <
typename T>
177 return _diagonal->last_local_index();
180 template <
typename T>
185 _diagonal->set(i, value);
188 template <
typename T>
193 _diagonal->add(i, value);
196 template <
typename T>
199 const std::vector<numeric_index_type> & rows,
200 const std::vector<numeric_index_type> & cols)
205 for (decltype(m) i = 0; i < m; ++i)
206 for (decltype(n) j = 0; j < n; ++j)
208 auto global_i = rows[i];
209 auto global_j = cols[j];
210 if (global_i == global_j)
211 _diagonal->add(global_i, dm(i, j));
215 template <
typename T>
218 const std::vector<numeric_index_type> & dof_indices)
220 _diagonal->add_vector(dm.
diagonal(), dof_indices);
223 template <
typename T>
227 auto x_diagonal = _diagonal->zero_clone();
229 _diagonal->add(a, *x_diagonal);
232 template <
typename T>
237 return (*_diagonal)(i);
242 template <
typename T>
246 return _diagonal->l1_norm();
249 template <
typename T>
253 return _diagonal->linfty_norm();
256 template <
typename T>
260 return _diagonal->closed();
263 template <
typename T>
267 _diagonal->print(os);
270 template <
typename T>
277 template <
typename T>
283 *diagonal_dest = *_diagonal;
285 libmesh_error_msg(
"DenseMatrix<T>::get_transpose currently only accepts another DenseMatrix<T> "
289 template <
typename T>
293 for (
auto row : rows)
294 _diagonal->set(row, val);
297 template <
typename T>
unsigned int n() const
返回矩阵的列维度。
virtual void get_transpose(SparseMatrix< T > &dest) const override
获取当前矩阵的转置,并将其存储在指定的 SparseMatrix 对象中。
virtual Real l1_norm() 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
将指定的 DenseMatrix dm 添加到矩阵中的指定行和列。
virtual void zero() override
将矩阵的所有元素置零。
virtual bool closed() const override
返回矩阵是否已关闭,即是否已完成初始化并可以用于计算。
virtual numeric_index_type n() const override
返回矩阵的总列数。
const NumericVector< T > & diagonal() const
返回对底层数据存储 NumericVector 的常量引用。
这是一个通用的稀疏矩阵类。该类包含了必须在派生类中覆盖的纯虚拟成员。 使用一个公共的基类允许从不同的求解器包中以不同的格式统一访问稀疏矩阵。
virtual numeric_index_type m() const override
返回矩阵的总行数。
virtual void close() override
完成矩阵的初始化和结构设置,使其可以用于计算。
dof_id_type numeric_index_type
virtual numeric_index_type row_stop() const override
返回矩阵在本地计算中的结束行号。
unsigned int m() const
返回矩阵的行维度。
virtual void clear() override
清除矩阵的所有内容,将其恢复到初始状态。
virtual void get_diagonal(NumericVector< T > &dest) const =0
复制矩阵的对角线部分到 dest。
DiagonalMatrix(const Parallel::Communicator &comm)
构造函数;将矩阵初始化为空,没有任何结构,即矩阵根本无法使用。因此,此构造函数仅对是类成员的矩阵有用。 所有其他矩阵应在数据流中的某一点创建,此时所有必要的信息都是可用的。 ...
virtual T operator()(const numeric_index_type i, const numeric_index_type j) const override
返回矩阵中指定位置的元素值。
static std::unique_ptr< NumericVector< T > > build(const Parallel::Communicator &comm, const SolverPackage solver_package=libMesh::default_solver_package())
构建一个 NumericVector 对象。
virtual void print_personal(std::ostream &os=libMesh::out) const override
在输出流中打印矩阵的个性化信息。
virtual void zero_rows(std::vector< numeric_index_type > &rows, T val=0) override
将指定行的所有元素置零。
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
virtual void get_diagonal(NumericVector< T > &dest) const override
获取对角矩阵的对角线元素,并将它们存储在指定的 NumericVector 对象中。
virtual Real linfty_norm() const override
计算矩阵的 范数。
DenseVector< T > diagonal() const
返回矩阵的对角线。
DiagonalMatrix & operator=(DiagonalMatrix &&)=default
virtual void set(const numeric_index_type i, const numeric_index_type j, const T value) override
设置矩阵中指定位置的元素值。
virtual std::unique_ptr< SparseMatrix< T > > clone() const override
克隆当前矩阵,返回一个新的矩阵,其结构和维度相同。
virtual numeric_index_type row_start() const override
返回矩阵在本地计算中的起始行号。
std::unique_ptr< NumericVector< T > > _diagonal
底层对角矩阵存储
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
初始化矩阵的维度和结构
定义用于有限元类型计算的密集矩阵。 用于在求和成全局矩阵之前存储单元刚度矩阵。所有被覆盖的虚函数都记录在dense_matrix_base.h中。
virtual void add(const numeric_index_type i, const numeric_index_type j, const T value) override
在矩阵中指定位置的元素上添加一个值。
virtual std::unique_ptr< SparseMatrix< T > > zero_clone() const override
创建当前矩阵的零副本,其结构和维度相同。