Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Memory 当我增加稀疏矩阵的大小时,SuperLU dgstrf返回内存分配失败_Memory_Fortran - Fatal编程技术网

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

Memory 当我增加稀疏矩阵的大小时,SuperLU dgstrf返回内存分配失败,memory,fortran,Memory,Fortran,我正在创建一个FEA程序,我正在处理290-96 000平方或270-90亿个元素的矩阵。这些矩阵在很大程度上是稀疏的,所以我使用SuperLU来解决它们。我已经能够成功地使用SuperLU来解决这个问题,这个问题与较小矩阵的验证数据匹配得相当好。然而,随着我增加矩阵的大小,SuperLU的dgstrf函数输出的信息值大约为9亿(一次是914459273,另一次是893813121) 文档中说,此信息值是“内存分配失败时分配的字节数,加上->ncol”。但是,这并没有给出如何处理此错误的任何信息

我正在创建一个FEA程序,我正在处理290-96 000平方或270-90亿个元素的矩阵。这些矩阵在很大程度上是稀疏的,所以我使用SuperLU来解决它们。我已经能够成功地使用SuperLU来解决这个问题,这个问题与较小矩阵的验证数据匹配得相当好。然而,随着我增加矩阵的大小,SuperLU的dgstrf函数输出的信息值大约为9亿(一次是914459273,另一次是893813121)

文档中说,此信息值是“内存分配失败时分配的字节数,加上->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)

您的矩阵太大,无法使用直接(即基于因子分解的)解算器。直接解算器创建大量新的非零元素;这会导致程序内存不足。迭代解算器是唯一的解决方案;这里的讨论空间太小,您可能有兴趣在以下博客上查看更多详细信息(并提出任何问题):