20 #ifndef LIBMESH_DENSE_MATRIX_BASE_H
21 #define LIBMESH_DENSE_MATRIX_BASE_H
24 #include "libmesh/libmesh_common.h"
25 #include "libmesh/compare_types.h"
26 #include "libmesh/int_range.h"
34 template <
typename T>
class DenseVectorBase;
35 template <
typename T>
class DenseVector;
57 const unsigned int new_n=0) :
_m(new_m),
_n(new_n) {}
72 virtual void zero() = 0;
82 virtual T
el(
const unsigned int i,
83 const unsigned int j)
const = 0;
93 virtual T &
el(
const unsigned int i,
94 const unsigned int j) = 0;
115 unsigned int m()
const {
return _m; }
122 unsigned int n()
const {
return _n; }
136 friend std::ostream & operator << (std::ostream & os, const DenseMatrixBase<T> &
m)
157 template <
typename T2,
typename T3>
158 typename boostcopy::enable_if_c<
159 ScalarTraits<T2>::value,
void >::type
160 add (
const T2 factor,
197 const unsigned int j,
213 template<
typename T2,
typename T3>
215 typename boostcopy::enable_if_c<
216 ScalarTraits<T2>::value,
void >::type
220 libmesh_assert_equal_to (this->m(), mat.
m());
221 libmesh_assert_equal_to (this->n(), mat.
n());
223 for (
auto j : make_range(this->n()))
224 for (
auto i : make_range(this->m()))
225 this->el(i,j) += factor*mat.
el(i,j);
231 #endif // LIBMESH_DENSE_MATRIX_BASE_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) 元素。 由于内部数据表示可能不同,必须重新定义此函数。
virtual void left_multiply(const DenseMatrixBase< T > &M2)=0
执行操作: (*this) <- M2 * (*this)。
unsigned int m() const
返回矩阵的行维度。
DenseMatrixBase(const unsigned int new_m=0, const unsigned int new_n=0)
构造函数。创建一个维度为 m 乘 n 的稠密矩阵。 Protected,以便用户无法创建一个实例。
DenseMatrixBase & operator=(const DenseMatrixBase &)=default
virtual void right_multiply(const DenseMatrixBase< T > &M3)=0
执行操作: (*this) <- (*this) * M3。
boostcopy::enable_if_c< ScalarTraits< T2 >::value, void >::type add(const T2 factor, const DenseMatrixBase< T3 > &mat)
将 factor 添加到矩阵的每个元素。 这应该仅在 T += T2 * T3 是有效的 C++,且 T2 是标量的情况下工作。返回类型是 void。
virtual void zero()=0
将矩阵的每个元素设置为 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 ~DenseMatrixBase()=default
void condense(const unsigned int i, const unsigned int j, const T val, DenseVectorBase< T > &rhs)
将矩阵的 (i,j) 条目压缩出来,强制它取值为 val。这对于在数值模拟中应用边界条件很有用。 保留矩阵的对称性。