18 #include "libmesh/lumped_mass_matrix.h"
19 #include "libmesh/numeric_vector.h"
35 std::unique_ptr<SparseMatrix<T>>
39 auto mat_copy = std::make_unique<LumpedMassMatrix<T>>(this->comm());
43 mat_copy->init(*
this,
false);
47 return std::unique_ptr<SparseMatrix<T>>(mat_copy.release());
51 std::unique_ptr<SparseMatrix<T>>
55 auto mat_copy = std::make_unique<LumpedMassMatrix<T>>(this->comm());
58 auto diag_copy = this->_diagonal->clone();
61 *mat_copy = std::move(*diag_copy);
65 return std::unique_ptr<SparseMatrix<T>>(mat_copy.release());
74 libmesh_assert_msg(i == j,
"Set in a lumped mass matrix really only makes sense for i == j");
75 this->_diagonal->set(i,
std::abs(value));
82 this->_diagonal->add(i,
std::abs(value));
91 auto x_diagonal = this->_diagonal->zero_clone();
93 this->_diagonal->add(a, *x_diagonal);
96 libmesh_error_msg(
"Unsupported matrix type passed to LumpedMassMatrix::add");
103 *this->_diagonal = vec;
107 template <
typename T>
111 this->_diagonal->swap(vec);
virtual void set(const numeric_index_type i, const numeric_index_type j, const T value) override
设置矩阵中指定位置 的值为 value。
LumpedMassMatrix(const Parallel::Communicator &comm)
构造函数;将矩阵初始化为空,没有任何结构,即矩阵完全无法使用。 因此,此构造函数仅适用于作为类的成员的矩阵。所有其他矩阵应在具有所有必要信息的数据流中创建。
virtual void add(const numeric_index_type i, const numeric_index_type j, const T value) override
将值 value 添加到矩阵中的指定位置 。
ADRealEigenVector< T, D, asd > abs(const ADRealEigenVector< T, D, asd > &)
计算自动微分实数向量的绝对值。
这是一个通用的稀疏矩阵类。该类包含了必须在派生类中覆盖的纯虚拟成员。 使用一个公共的基类允许从不同的求解器包中以不同的格式统一访问稀疏矩阵。
dof_id_type numeric_index_type
virtual void get_diagonal(NumericVector< T > &dest) const =0
复制矩阵的对角线部分到 dest。
virtual std::unique_ptr< SparseMatrix< T > > clone() const override
克隆当前矩阵的唯一指针。
LumpedMassMatrix & operator=(LumpedMassMatrix &&)=default
模板类用于构造集中质量矩阵。 可能还有用于计算与整体系统缩放相关的数量。每当在此类上调用 add 方法时,我们都会将提供的值的绝对值相加到行索引 i 中。
virtual std::unique_ptr< SparseMatrix< T > > zero_clone() const override
创建一个与当前矩阵相同的零矩阵的唯一指针。