当我增加稀疏矩阵的大小时,SuperLU dgstrf返回内存分配失败

时间:2018-10-19 14:05:51

标签: memory fortran

我正在创建一个FEA程序,并且正在处理290-9.6万平方或27-9十亿个元素的矩阵。这些矩阵基本上是稀疏的,因此我正在使用SuperLU来解决它们。我已经能够成功地使用SuperLU解决与矩阵较小的验证数据相匹配的问题。但是,随着我增加矩阵的大小,SuperLU的dgstrf函数将输出大约9亿的信息值(一次输出914459273,另一次输出893813121)。

文档说此信息值是“发生内存分配失败时分配的字节数,加上A-> ncol。”但是,这没有提供有关如何解决此错误的任何信息。在这种情况下限制内存的原因是什么?库会限制内存吗?它是硬编码到库中还是在编译过程中确定?在我的Fortran代码编译中,内存是否受到限制?

我正在用Fortran编写代码,并使用预建的c_fortran_dgssv.c文件与SuperLU链接。该文件确实允许系统“通过系统malloc在内部分配空间”(lwork = 0)。这是我可以更改以拥有更多空间的东西。

我正在使用与fortran示例类似的调用来调用代码。

nrhs = 1
ldb = Dim3DFull
iopt = 1
call c_fortran_dgssv(iopt,Dim3DFull,TotalNonZeroElements_BCs,nrhs, &
    Global_Matrix_T_Value_BC_CSC,Global_Matrix_T_Row_BC_CSC, &
    Global_Matrix_T_Col_BC_CSC,Global_Temp,ldb,factors,info)
if (info .eq. 0) then
    write (*,*) 'Factorization succeeded'
else
    write(*,*) 'INFO from factorization = ', info
endif
!Second, solve the system using the existing factors.
iopt = 2
call c_fortran_dgssv(iopt,Dim3DFull,TotalNonZeroElements_BCs,nrhs, &
    Global_Matrix_T_Value_BC_CSC,Global_Matrix_T_Row_BC_CSC, &
    Global_Matrix_T_Col_BC_CSC,Global_Temp,ldb,factors,info)
if (info .eq. 0) then
    write (*,*) 'Solve succeeded'
else
    write(*,*) 'INFO from triangular solve = ', info
endif
!Last, free the storage allocated inside SuperLU
iopt = 3
call c_fortran_dgssv(iopt,Dim3DFull,TotalNonZeroElements_BCs,nrhs, &
    Global_Matrix_T_Value_BC_CSC,Global_Matrix_T_Row_BC_CSC, &
    Global_Matrix_T_Col_BC_CSC,Global_Temp,ldb,factors,info)

1 个答案:

答案 0 :(得分:0)

您的矩阵太大,无法使用直接(即基于分解)的求解器。直接求解器会创建大量新的非零元素。这会导致程序用完RAM。迭代求解器是唯一的解决方案。这里讨论的空间太小,您可能有兴趣在以下博客上查看更多详细信息(并在那里询问任何问题):http://comecau.blogspot.com/2018_09_05_archive.html