在FORTRAN中高效搜索数组

时间:2012-05-29 01:01:50

标签: fortran numerical-methods finite-element-analysis

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

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

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

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