1

我试图以稀疏格式将刚度矩阵存储在 FORTRAN 中以节省内存,即我正在使用三个非零元素向量(irows、icols、A)。在找出这些数组的大小之后,下一步是在其中插入值。所以我使用高斯点,即对于每个高斯点,我要找出局部刚度矩阵,然后将这个局部刚度矩阵插入全局(irows,icols,A)之一。

这种插入的主要问题是,每次我们必须检查新值是否存在于全局数组中,所以如果值存在,则将新值添加到旧值中,如果不添加到末尾。即我们必须搜索整个数组以查找该值是否存在。如果这些数组(irows、icols、A)的大小很大,那么这个搜索在计算上是非常昂贵的。

任何人都可以提出一种更好的方法来为每个高斯点插入全局刚度矩阵的局部刚度矩阵。

4

2 回答 2

2

如果您使用预先排序的数据结构,那么搜索它会非常有效。作为您的主要数据结构或作为辅助数据结构。您想要一个可以在中间插入另一个条目的条目。例如,二叉搜索树 (http://en.wikipedia.org/wiki/Binary_search_tree)。

于 2012-05-29T02:34:10.917 回答
2

我相当确定这是 FEM 分析中的一个众所周知的问题 - 我在这个scipy 文档中找到了对它的引用,但当然主体是独立于语言的。基本上你应该做的是以你拥有的格式创建你的矩阵,而不是搜索矩阵来查看一个条目是否已经存在,只是假设它不存在。这意味着您最终会得到重复的条目,这些条目需要添加在一起才能获得正确的值。

一旦你构建了你的矩阵,你通常会将它转换为一些更有效的形式来解决它(例如CSR 等) - 确切的格式可能由你正在使用的稀疏求解器确定。在此转换过程中,应将重复的条目添加在一起 ​​- 一些稀疏矩阵库会为您执行此操作。我知道 scipy 是这样做的,它的许多内部例程都是用 fortran 编写的,所以你也许可以使用其中的一个(它们都是开源的)。或者您可以检查netlib上是否有任何合适的东西。

于 2012-05-29T03:02:35.007 回答