创建一个稀疏矩阵

计算科学 有限元 稀疏矩阵
2021-12-20 20:31:11

我正在编写一个有限元程序来计算均匀载荷下的位移。我想在不使用外部库的情况下以稀疏形式(COO)存储刚度矩阵。假设每行非零元素数量的上限是已知的。我的问题是我无法以稀疏形式组装矩阵,并且我发现它们将整个矩阵作为输入然后使其稀疏的所有示例。就我而言,我希望从一开始就出现痉挛,这可能吗?

3个回答

从一个矩阵开始,该矩阵仅存储您已明确写入非零值的那些条目。例如(不是特别有效,但可行),您可以这样做

class SparseMatrix {
  using std::pair<int,int> ij_coordinates;
  std::map<ij_coordinates,double> entries;

  ...
};

最初,没有条目,但当您添加条目时,地图会填满。

稀疏性将取决于您选择的基函数以及您选择问题的几何网格的方式。如果基础是立方体上的三线性四边形网格化一个 15x15x10 的立方体,则给出一种结构,如果域是 L 形,则给出另一种结构。

如果您了解所有三个方面:元素类型、底层域以及将该域划分为元素,您就有希望在组装之前形成稀疏性。除非您尝试在网格化时缓慢构建矩阵(使用大量动态分配和惰性评估),否则您可能必须事先了解所有这些。

我会推荐第 8 章的稀疏矩阵技术,Sergio Pissanetzky,1984 年。他展示了元素-节点连通性数组,一旦变成稀疏矩阵格式,就可以用来生成节点-节点连通性。这种连通性是有限元方法的稀疏矩阵索引。这种连通性可用于初始化填充有元素组装的稀疏矩阵存储。