20 #ifndef LIBMESH_DENSE_MATRIX_BASE_IMPL_H
21 #define LIBMESH_DENSE_MATRIX_BASE_IMPL_H
24 #include "libmesh/dense_matrix.h"
25 #include "libmesh/dense_vector_base.h"
26 #include "libmesh/dense_vector.h"
27 #include "libmesh/int_range.h"
46 for (decltype(_m) i = 0; i < _m; ++i)
66 libmesh_assert_equal_to(M1.
m(), M2.
m());
67 libmesh_assert_equal_to(M1.
n(), M3.
n());
68 libmesh_assert_equal_to(M2.
n(), M3.
m());
70 const unsigned int m_s = M2.
m();
71 const unsigned int p_s = M2.
n();
72 const unsigned int n_s = M1.
n();
76 for (
unsigned int k = 0; k < p_s; k++)
77 for (
unsigned int j = 0; j < n_s; j++)
78 if (M3.
el(k, j) != 0.)
79 for (
unsigned int i = 0; i < m_s; i++)
80 M1.
el(i, j) += M2.
el(i, k) * M3.
el(k, j);
95 const unsigned int jv,
99 libmesh_assert_equal_to(this->_m, rhs.
size());
100 libmesh_assert_equal_to(iv, jv);
103 for (
auto i : make_range(this->m()))
105 rhs.
el(i) -= this->el(i, jv) * val;
106 this->el(i, jv) = 0.;
110 for (
auto j : make_range(this->n()))
111 this->el(iv, j) = 0.;
113 this->el(iv, jv) = 1.;
129 std::ios_base::fmtflags os_flags = os.flags();
132 for (
auto i : make_range(this->m()))
134 for (
auto j : make_range(this->n()))
137 << std::setprecision(precision)
138 << this->el(i, j) <<
" ";
157 for (
auto i : make_range(this->m()))
159 for (
auto j : make_range(this->n()))
161 << this->el(i, j) <<
" ";
173 #endif // LIBMESH_DENSE_MATRIX_BASE_IMPL_H
void print_scientific(std::ostream &os, unsigned precision=8) const
以科学计数法格式打印矩阵。
unsigned int n() const
返回矩阵的列维度。
virtual T el(const unsigned int i, const unsigned int j) const =0
返回矩阵的 (i,j) 元素。 由于内部数据表示可能不同,必须重新定义此函数。
unsigned int m() const
返回矩阵的行维度。
virtual unsigned int size() const =0
DenseVector< T > diagonal() const
返回矩阵的对角线。
定义用于有限元计算的抽象稠密向量基类。 可以从这个类派生出特定的稠密向量,例如 DenseSubVectors。
static void multiply(DenseMatrixBase< T > &M1, const DenseMatrixBase< T > &M2, const DenseMatrixBase< T > &M3)
辅助函数 - 执行计算 M1 = M2 * M3 其中: M1 = (m x n) M2 = (m x p) M3 = (p x n)
定义用于有限元计算的稠密向量类。该类基本上是为了补充 DenseMatrix 类而设计的。 它相对于 std::vector 具有额外的功能,使其在有限元中特别有用,特别是对于方程组。 所有重写的虚拟函...
为有限元类型的计算定义了一个抽象的稠密矩阵基类。例如 DenseSubMatrices 可以从这个类派生出来。
void print(std::ostream &os=libMesh::out) const
漂亮地打印矩阵,默认为 libMesh::out。
virtual T el(const unsigned int i) const =0
void condense(const unsigned int i, const unsigned int j, const T val, DenseVectorBase< T > &rhs)
将矩阵的 (i,j) 条目压缩出来,强制它取值为 val。这对于在数值模拟中应用边界条件很有用。 保留矩阵的对称性。