libmesh解析
本工作只是尝试解析原libmesh的代码,供学习使用
 全部  命名空间 文件 函数 变量 类型定义 枚举 枚举值 友元 
Public 成员函数 | Protected 成员函数 | 静态 Protected 成员函数 | Protected 属性 | 友元 | 所有成员列表
libMesh::DenseMatrixBase< T > 模板类 参考abstract

为有限元类型的计算定义了一个抽象的稠密矩阵基类。例如 DenseSubMatrices 可以从这个类派生出来。 更多...

#include <dense_matrix_base.h>

类 libMesh::DenseMatrixBase< T > 继承关系图:
[图例]

Public 成员函数

 DenseMatrixBase (DenseMatrixBase &&)=default
 这五个特殊函数可以为此类默认。因为它不管理任何内存本身。 更多...
 
 DenseMatrixBase (const DenseMatrixBase &)=default
 
DenseMatrixBaseoperator= (const DenseMatrixBase &)=default
 
DenseMatrixBaseoperator= (DenseMatrixBase &&)=default
 
virtual ~DenseMatrixBase ()=default
 
virtual void zero ()=0
 将矩阵的每个元素设置为 0。必须重新定义零矩阵的含义,因为它取决于值的存储方式。 更多...
 
virtual T el (const unsigned int i, const unsigned int j) const =0
 返回矩阵的 (i,j) 元素。 由于内部数据表示可能不同,必须重新定义此函数。 更多...
 
virtual T & el (const unsigned int i, const unsigned int j)=0
 返回矩阵的 (i,j) 元素的可写引用。 由于内部数据表示可能不同,必须重新定义此函数。 更多...
 
virtual void left_multiply (const DenseMatrixBase< T > &M2)=0
 执行操作: (*this) <- M2 * (*this)。 更多...
 
virtual void right_multiply (const DenseMatrixBase< T > &M3)=0
 执行操作: (*this) <- (*this) * M3。 更多...
 
unsigned int m () const
 返回矩阵的行维度。 更多...
 
unsigned int n () const
 返回矩阵的列维度。 更多...
 
void print (std::ostream &os=libMesh::out) const
 漂亮地打印矩阵,默认为 libMesh::out。 更多...
 
void print_scientific (std::ostream &os, unsigned precision=8) const
 以科学计数法格式打印矩阵。 更多...
 
template<typename T2 , typename T3 >
boostcopy::enable_if_c
< ScalarTraits< T2 >::value,
void >::type 
add (const T2 factor, const DenseMatrixBase< T3 > &mat)
 factor 添加到矩阵的每个元素。 这应该仅在 T += T2 * T3 是有效的 C++,且 T2 是标量的情况下工作。返回类型是 void。 更多...
 
DenseVector< T > diagonal () const
 返回矩阵的对角线。 更多...
 

Protected 成员函数

 DenseMatrixBase (const unsigned int new_m=0, const unsigned int new_n=0)
 构造函数。创建一个维度为 mn 的稠密矩阵。 Protected,以便用户无法创建一个实例。 更多...
 
void condense (const unsigned int i, const unsigned int j, const T val, DenseVectorBase< T > &rhs)
 将矩阵的 (i,j) 条目压缩出来,强制它取值为 val。这对于在数值模拟中应用边界条件很有用。 保留矩阵的对称性。 更多...
 

静态 Protected 成员函数

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) 更多...
 

Protected 属性

unsigned int _m
 行维度。 更多...
 
unsigned int _n
 列维度。 更多...
 

友元

std::ostream & operator<< (std::ostream &os, const DenseMatrixBase< T > &m)
 格式化打印,允许执行 DenseMatrix K; libMesh::out << K << std::endl;。 更多...
 

详细描述

template<typename T>
class libMesh::DenseMatrixBase< T >

为有限元类型的计算定义了一个抽象的稠密矩阵基类。例如 DenseSubMatrices 可以从这个类派生出来。

作者
John W. Peterson
日期
2003

在文件 dense_matrix_base.h45 行定义.

构造及析构函数说明

template<typename T>
libMesh::DenseMatrixBase< T >::DenseMatrixBase ( const unsigned int  new_m = 0,
const unsigned int  new_n = 0 
)
inlineprotected

构造函数。创建一个维度为 mn 的稠密矩阵。 Protected,以便用户无法创建一个实例。

参数
new_m矩阵的行维度。
new_n矩阵的列维度。

在文件 dense_matrix_base.h56 行定义.

57  : _m(new_m), _n(new_n) {}
unsigned int _n
列维度。
unsigned int _m
行维度。
template<typename T>
libMesh::DenseMatrixBase< T >::DenseMatrixBase ( DenseMatrixBase< T > &&  )
default

这五个特殊函数可以为此类默认。因为它不管理任何内存本身。

template<typename T>
libMesh::DenseMatrixBase< T >::DenseMatrixBase ( const DenseMatrixBase< T > &  )
default
template<typename T>
virtual libMesh::DenseMatrixBase< T >::~DenseMatrixBase ( )
virtualdefault

成员函数说明

template<typename T >
template<typename T2 , typename T3 >
boostcopy::enable_if_c< ScalarTraits< T2 >::value, void >::type libMesh::DenseMatrixBase< T >::add ( const T2  factor,
const DenseMatrixBase< T3 > &  mat 
)
inline

factor 添加到矩阵的每个元素。 这应该仅在 T += T2 * T3 是有效的 C++,且 T2 是标量的情况下工作。返回类型是 void。

参数
factor要添加的标量因子。
mat乘法的右操作数矩阵。

在文件 dense_matrix_base.h217 行定义.

参考 libMesh::DenseMatrixBase< T >::el(), libMesh::DenseMatrixBase< T >::m() , 以及 libMesh::DenseMatrixBase< T >::n().

219 {
220  libmesh_assert_equal_to (this->m(), mat.m());
221  libmesh_assert_equal_to (this->n(), mat.n());
222 
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);
226 }
unsigned int n() const
返回矩阵的列维度。
virtual T el(const unsigned int i, const unsigned int j) const =0
返回矩阵的 (i,j) 元素。 由于内部数据表示可能不同,必须重新定义此函数。
unsigned int m() const
返回矩阵的行维度。
template<typename T >
void libMesh::DenseMatrixBase< T >::condense ( const unsigned int  iv,
const unsigned int  jv,
const T  val,
DenseVectorBase< T > &  rhs 
)
protected

将矩阵的 (i,j) 条目压缩出来,强制它取值为 val。这对于在数值模拟中应用边界条件很有用。 保留矩阵的对称性。

将矩阵列约减为已知值。

参数
i要压缩的行索引。
j要压缩的列索引。
val压缩出的值。
rhs与压缩操作相关联的右侧向量。
模板参数
T矩阵元素类型。
参数
iv列索引。
jv列索引。
val已知值。
rhs包含右侧向量的 DenseVectorBase 对象。

在文件 dense_matrix_base_impl.h94 行定义.

参考 libMesh::DenseVectorBase< T >::el() , 以及 libMesh::DenseVectorBase< T >::size().

参考自 libMesh::DenseMatrix< T >::condense().

98 {
99  libmesh_assert_equal_to(this->_m, rhs.size());
100  libmesh_assert_equal_to(iv, jv);
101 
102  // 将已知值移入 RHS,并将列置零
103  for (auto i : make_range(this->m()))
104  {
105  rhs.el(i) -= this->el(i, jv) * val;
106  this->el(i, jv) = 0.;
107  }
108 
109  // 将行置零
110  for (auto j : make_range(this->n()))
111  this->el(iv, j) = 0.;
112 
113  this->el(iv, jv) = 1.;
114  rhs.el(iv) = val;
115 }
unsigned int n() const
返回矩阵的列维度。
virtual T el(const unsigned int i, const unsigned int j) const =0
返回矩阵的 (i,j) 元素。 由于内部数据表示可能不同,必须重新定义此函数。
unsigned int m() const
返回矩阵的行维度。
unsigned int _m
行维度。
template<typename T >
DenseVector< T > libMesh::DenseMatrixBase< T >::diagonal ( ) const

返回矩阵的对角线。

返回稠密矩阵的对角线。

返回
矩阵对角线的 DenseVector。
模板参数
T矩阵元素类型。
返回
返回包含对角线元素的 DenseVector 对象。

在文件 dense_matrix_base_impl.h43 行定义.

参考自 libMesh::DiagonalMatrix< T >::add_matrix().

44 {
45  DenseVector<T> ret(_m);
46  for (decltype(_m) i = 0; i < _m; ++i)
47  ret(i) = el(i, i);
48  return ret;
49 }
virtual T el(const unsigned int i, const unsigned int j) const =0
返回矩阵的 (i,j) 元素。 由于内部数据表示可能不同,必须重新定义此函数。
unsigned int _m
行维度。
template<typename T>
virtual T libMesh::DenseMatrixBase< T >::el ( const unsigned int  i,
const unsigned int  j 
) const
pure virtual

返回矩阵的 (i,j) 元素。 由于内部数据表示可能不同,必须重新定义此函数。

参数
i行索引。
j列索引。
返回
T 类型的矩阵元素。

libMesh::DenseMatrix< T > , 以及 libMesh::DenseSubMatrix< T > 内被实现.

参考自 libMesh::DenseMatrixBase< T >::add() , 以及 libMesh::DenseMatrixBase< T >::multiply().

template<typename T>
virtual T& libMesh::DenseMatrixBase< T >::el ( const unsigned int  i,
const unsigned int  j 
)
pure virtual

返回矩阵的 (i,j) 元素的可写引用。 由于内部数据表示可能不同,必须重新定义此函数。

参数
i行索引。
j列索引。
返回
T 类型的矩阵元素的可写引用。

libMesh::DenseMatrix< T > , 以及 libMesh::DenseSubMatrix< T > 内被实现.

template<typename T>
virtual void libMesh::DenseMatrixBase< T >::left_multiply ( const DenseMatrixBase< T > &  M2)
pure virtual

执行操作: (*this) <- M2 * (*this)。

参数
M2乘法的右操作数矩阵。

libMesh::DenseMatrix< T > , 以及 libMesh::DenseSubMatrix< T > 内被实现.

template<typename T>
unsigned int libMesh::DenseMatrixBase< T >::m ( ) const
inline

返回矩阵的行维度。

返回
矩阵的行维度。

在文件 dense_matrix_base.h115 行定义.

参考 libMesh::DenseMatrixBase< T >::_m.

参考自 libMesh::DenseMatrix< T >::_left_multiply_transpose(), libMesh::DenseMatrix< T >::_multiply_blas(), libMesh::DenseMatrix< T >::_right_multiply_transpose(), libMesh::DenseMatrix< T >::_svd_solve_lapack(), libMesh::DenseMatrixBase< T >::add(), libMesh::SparseMatrix< T >::add_block_matrix(), libMesh::PetscMatrix< T >::add_block_matrix(), libMesh::EigenSparseMatrix< T >::add_matrix(), libMesh::DiagonalMatrix< T >::add_matrix(), libMesh::LaspackMatrix< T >::add_matrix(), libMesh::EpetraMatrix< T >::add_matrix(), libMesh::PetscMatrix< T >::add_matrix(), libMesh::DofMap::build_constraint_matrix(), libMesh::DofMap::build_constraint_matrix_and_vector(), libMesh::DofMap::constrain_element_dyad_matrix(), libMesh::DofMap::constrain_element_matrix(), libMesh::DofMap::constrain_element_matrix_and_vector(), libMesh::DofMap::constrain_element_vector(), libMesh::DofMap::extract_local_vector(), libMesh::DenseMatrix< T >::get_transpose(), libMesh::DofMap::heterogeneously_constrain_element_jacobian_and_residual(), libMesh::DofMap::heterogeneously_constrain_element_matrix_and_vector(), libMesh::DofMap::heterogeneously_constrain_element_residual(), libMesh::DofMap::heterogeneously_constrain_element_vector(), libMesh::DenseMatrix< T >::left_multiply(), libMesh::DofMap::max_constraint_error(), libMesh::DenseMatrixBase< T >::multiply(), libMesh::DenseMatrix< T >::right_multiply() , 以及 MetaPhysicL::RawType< libMesh::DenseMatrix< T > >::value().

115 { return _m; }
unsigned int _m
行维度。
template<typename T >
void libMesh::DenseMatrixBase< T >::multiply ( DenseMatrixBase< T > &  M1,
const DenseMatrixBase< T > &  M2,
const DenseMatrixBase< T > &  M3 
)
staticprotected

辅助函数 - 执行计算 M1 = M2 * M3 其中: M1 = (m x n) M2 = (m x p) M3 = (p x n)

将两个矩阵相乘。

参数
M1乘法的结果矩阵。
M2乘法的左操作数矩阵。
M3乘法的右操作数矩阵。
模板参数
T矩阵元素类型。
参数
M1存储结果的矩阵。
M2第一个矩阵。
M3第二个矩阵。

在文件 dense_matrix_base_impl.h61 行定义.

参考 libMesh::DenseMatrixBase< T >::el(), libMesh::DenseMatrixBase< T >::m() , 以及 libMesh::DenseMatrixBase< T >::n().

64 {
65  // 断言确保我们传递了正确维度的矩阵
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());
69 
70  const unsigned int m_s = M2.m();
71  const unsigned int p_s = M2.n();
72  const unsigned int n_s = M1.n();
73 
74  // 通过这种方式执行是因为有很大的机会(至少对于约束矩阵来说)
75  // 在右乘时 M3(k,j) = 0.
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);
81 }
template<typename T>
unsigned int libMesh::DenseMatrixBase< T >::n ( ) const
inline

返回矩阵的列维度。

返回
矩阵的列维度。

在文件 dense_matrix_base.h122 行定义.

参考 libMesh::DenseMatrixBase< T >::_n.

参考自 libMesh::DenseMatrix< T >::_left_multiply_transpose(), libMesh::DenseMatrix< T >::_multiply_blas(), libMesh::DenseMatrix< T >::_right_multiply_transpose(), libMesh::DenseMatrix< T >::_svd_solve_lapack(), libMesh::DenseMatrixBase< T >::add(), libMesh::SparseMatrix< T >::add_block_matrix(), libMesh::PetscMatrix< T >::add_block_matrix(), libMesh::EigenSparseMatrix< T >::add_matrix(), libMesh::DiagonalMatrix< T >::add_matrix(), libMesh::LaspackMatrix< T >::add_matrix(), libMesh::EpetraMatrix< T >::add_matrix(), libMesh::PetscMatrix< T >::add_matrix(), libMesh::DofMap::build_constraint_matrix(), libMesh::DofMap::build_constraint_matrix_and_vector(), libMesh::DofMap::constrain_element_dyad_matrix(), libMesh::DofMap::constrain_element_matrix(), libMesh::DofMap::constrain_element_matrix_and_vector(), libMesh::DofMap::constrain_element_residual(), libMesh::DofMap::constrain_element_vector(), libMesh::DofMap::extract_local_vector(), libMesh::DenseMatrix< T >::get_transpose(), libMesh::DofMap::heterogeneously_constrain_element_jacobian_and_residual(), libMesh::DofMap::heterogeneously_constrain_element_matrix_and_vector(), libMesh::DofMap::heterogeneously_constrain_element_residual(), libMesh::DofMap::heterogeneously_constrain_element_vector(), libMesh::DenseMatrix< T >::left_multiply(), libMesh::DofMap::max_constraint_error(), libMesh::DenseMatrixBase< T >::multiply(), libMesh::DenseMatrix< T >::right_multiply() , 以及 MetaPhysicL::RawType< libMesh::DenseMatrix< T > >::value().

122 { return _n; }
unsigned int _n
列维度。
template<typename T>
DenseMatrixBase& libMesh::DenseMatrixBase< T >::operator= ( const DenseMatrixBase< T > &  )
default
template<typename T>
DenseMatrixBase& libMesh::DenseMatrixBase< T >::operator= ( DenseMatrixBase< T > &&  )
default
template<typename T >
void libMesh::DenseMatrixBase< T >::print ( std::ostream &  os = libMesh::out) const

漂亮地打印矩阵,默认为 libMesh::out。

以普通格式打印矩阵。

参数
os输出流,默认为 libMesh::out。
模板参数
T矩阵元素类型。
参数
os输出流。

在文件 dense_matrix_base_impl.h155 行定义.

156 {
157  for (auto i : make_range(this->m()))
158  {
159  for (auto j : make_range(this->n()))
160  os << std::setw(8)
161  << this->el(i, j) << " ";
162 
163  os << std::endl;
164  }
165 
166  return;
167 }
unsigned int n() const
返回矩阵的列维度。
virtual T el(const unsigned int i, const unsigned int j) const =0
返回矩阵的 (i,j) 元素。 由于内部数据表示可能不同,必须重新定义此函数。
unsigned int m() const
返回矩阵的行维度。
template<typename T >
void libMesh::DenseMatrixBase< T >::print_scientific ( std::ostream &  os,
unsigned  precision = 8 
) const

以科学计数法格式打印矩阵。

参数
os输出流。
precision打印的精度。
模板参数
T矩阵元素类型。
参数
os输出流。
precision打印的精度。

在文件 dense_matrix_base_impl.h126 行定义.

127 {
128  // 保存初始格式标志
129  std::ios_base::fmtflags os_flags = os.flags();
130 
131  // 打印矩阵元素
132  for (auto i : make_range(this->m()))
133  {
134  for (auto j : make_range(this->n()))
135  os << std::setw(15)
136  << std::scientific
137  << std::setprecision(precision)
138  << this->el(i, j) << " ";
139 
140  os << std::endl;
141  }
142 
143  // 恢复原始格式标志
144  os.flags(os_flags);
145 }
unsigned int n() const
返回矩阵的列维度。
virtual T el(const unsigned int i, const unsigned int j) const =0
返回矩阵的 (i,j) 元素。 由于内部数据表示可能不同,必须重新定义此函数。
unsigned int m() const
返回矩阵的行维度。
template<typename T>
virtual void libMesh::DenseMatrixBase< T >::right_multiply ( const DenseMatrixBase< T > &  M3)
pure virtual

执行操作: (*this) <- (*this) * M3。

参数
M3乘法的右操作数矩阵。

libMesh::DenseMatrix< T > , 以及 libMesh::DenseSubMatrix< T > 内被实现.

template<typename T>
virtual void libMesh::DenseMatrixBase< T >::zero ( )
pure virtual

将矩阵的每个元素设置为 0。必须重新定义零矩阵的含义,因为它取决于值的存储方式。

libMesh::DenseMatrix< T > , 以及 libMesh::DenseSubMatrix< T > 内被实现.

友元及相关函数文档

template<typename T>
std::ostream& operator<< ( std::ostream &  os,
const DenseMatrixBase< T > &  m 
)
friend

格式化打印,允许执行 DenseMatrix K; libMesh::out << K << std::endl;。

参数
os输出流。

在文件 dense_matrix_base.h136 行定义.

137  {
138  m.print(os);
139  return os;
140  }
unsigned int m() const
返回矩阵的行维度。

类成员变量说明

template<typename T>
unsigned int libMesh::DenseMatrixBase< T >::_m
protected

行维度。

在文件 dense_matrix_base.h204 行定义.

参考自 libMesh::DenseMatrixBase< T >::m().

template<typename T>
unsigned int libMesh::DenseMatrixBase< T >::_n
protected

列维度。

在文件 dense_matrix_base.h209 行定义.

参考自 libMesh::DenseMatrixBase< T >::n().


该类的文档由以下文件生成: