用FORTRAN高效搜索数组
我试图以稀疏格式将刚度矩阵存储在FORTRAN中以节省内存,即,我使用三个非零元素向量irows、icols、A。确定这些数组的大小后,下一步是在其中插入值。所以我使用高斯点,也就是说,对于每个高斯点,我要找出局部刚度矩阵,然后把这个局部刚度矩阵插入到全局irows,icols,A中 这种插入的主要问题是,每次我们都必须检查全局数组中是否存在新值,因此,如果该值存在,则将新值添加到旧值中,如果不存在,则将其追加到末尾。i、 我们必须搜索整个数组,以找到该值是否存在。如果这些数组的大小irows、icols、A很大,那么这种搜索在计算上非常昂贵用FORTRAN高效搜索数组,fortran,numerical-methods,finite-element-analysis,Fortran,Numerical Methods,Finite Element Analysis,我试图以稀疏格式将刚度矩阵存储在FORTRAN中以节省内存,即,我使用三个非零元素向量irows、icols、A。确定这些数组的大小后,下一步是在其中插入值。所以我使用高斯点,也就是说,对于每个高斯点,我要找出局部刚度矩阵,然后把这个局部刚度矩阵插入到全局irows,icols,A中 这种插入的主要问题是,每次我们都必须检查全局数组中是否存在新值,因此,如果该值存在,则将新值添加到旧值中,如果不存在,则将其追加到末尾。i、 我们必须搜索整个数组,以找到该值是否存在。如果这些数组的大小irows、
有谁能建议一种更好的方法,为每个高斯点插入局部刚度矩阵,即全局刚度矩阵。如果使用预排序的数据结构,搜索它将非常有效。作为主数据结构或辅助数据结构。您需要一个可以在中间插入另一个条目的条目。例如,二叉搜索树http://en.wikipedia.org/wiki/Binary_search_tree. 如果使用预先排序的数据结构,搜索它将非常有效。作为主数据结构或辅助数据结构。您需要一个可以在中间插入另一个条目的条目。例如,二叉搜索树http://en.wikipedia.org/wiki/Binary_search_tree. 我相当肯定这是FEM分析中的一个众所周知的问题-我在这篇文章中找到了它的参考,但当然这些原则是独立于语言的。基本上你应该做的是按照你现有的格式创建你的矩阵,但是不要搜索矩阵来查看条目是否已经存在,只要假设它不存在就行了。这意味着您将得到重复的条目,这些条目需要加在一起才能得到正确的值
一旦你构建了你的矩阵,你通常会将它转换成更有效的形式来求解它,例如-确切的格式可能由你使用的稀疏解算器决定。在这个转换过程中,重复的条目应该被添加到一起——一些稀疏矩阵库将为您完成这项工作。我知道scipy可以做到这一点,它的许多内部例程都是用fortran编写的,所以您可以使用其中一个,它们都是开源的。或者您可以检查是否有任何合适的选项处于启用状态。我相当肯定这是FEM分析中的一个众所周知的问题-我在本文中找到了它的参考,但当然,这些原则与语言无关。基本上你应该做的是按照你现有的格式创建你的矩阵,但是不要搜索矩阵来查看条目是否已经存在,只要假设它不存在就行了。这意味着您将得到重复的条目,这些条目需要加在一起才能得到正确的值
一旦你构建了你的矩阵,你通常会将它转换成更有效的形式来求解它,例如-确切的格式可能由你使用的稀疏解算器决定。在这个转换过程中,重复的条目应该被添加到一起——一些稀疏矩阵库将为您完成这项工作。我知道scipy可以做到这一点,它的许多内部例程都是用fortran编写的,所以您可以使用其中一个,它们都是开源的。或者,您可以检查是否有任何合适的选项处于打开状态。那么,是哪一个?FORTRAN 90或FORTRAN 77?我正在使用FORTRAN 90,但我认为即使你能建议使用FORTRAN 77,它也会起作用。你可能想看看Tim Davis的书,这本书解释了稀疏数组是如何实现的。那么,是哪本?FORTRAN 90或FORTRAN 77?我正在使用FORTRAN 90,但我认为即使您可以建议使用FORTRAN 77,它也会起作用。您可能想看看Tim Davis的书,该书解释了稀疏数组是如何实现的。