【发布时间】:2014-09-06 22:07:35
【问题描述】:
我是 Fortran 的新手,我无法理解为什么子例程可以在编译时静态定义的矩阵上正常工作,但不能在运行时使用 allocate 创建的类似矩阵。
据我所知,这些矩阵应该非常相似:相同的类型、大小、sizeof 和值。问题不在于这个具体的例子,而在于他们为什么以及何时会有不同的表现。
一个“最低限度”的工作示例at pastebin (updated here!),我认为这里最重要的部分是:
! static 'allocation'
real(dp), dimension(fN, fN) :: fH
! static call
call ZHPADM(pade_deg, fN, dt, fH, fN, fwsp, flwsp, fipiv, iexph, ns, f)
! dynamic allocation
real(dp), allocatable, dimension(:, :) :: dH
allocate(dH(dN, dN))
! dynamic call
call ZHPADM(pade_deg, dN, dt, dH, dN, dwsp, dlwsp, dipiv, iexph, ns, f) ! full dynamic call
call ZHPADM(pade_deg, fN, dt, dH, fN, fwsp, flwsp, fipiv, iexph, ns, f) ! only fH->dH to show that it is the matrix that causes the error
使任何其他 (0D/1D) 参数动态都可以正常工作。例程为ZHPADM from expokit,错误为Program received signal 8 (SIGFPE): Floating-point exception.,但如前所述,首选一般解释。
编辑 1:我忘了提一些信息,抱歉!使用所有相关参数动态调用 ZHPADM 会产生相同的错误。我只是将一些改回静态以表明导致问题的矩阵是动态的。由于这个原因,接近结尾的几行变得不一致,对不起。静态变量和动态变量的值相同。
编辑 2:异常发生在新的 pastebin 中的第 77 行,即动态 ZHPADM 调用(注释该行会停止异常)。我在 Ubuntu 上使用 gfortran 4.6.3,就像 gfortran demo.f90 -lexpokit -lblas -llapack(通常还有一些警告标志)。
【问题讨论】:
-
我在 pastebin 的代码中看到了几个错误...例如
dPP = reshape(dwsp(iexph:iexph+dN**2-1), [dN, dN]):dwsp未初始化!dN和fN是否相同?你不需要重置fipiv吗?除此之外,它的信息太少了!请使用编译器的所有调试选项来修复您的代码,直到您不再收到投诉,然后提供完整的错误描述包括发生异常的行。 -
可能值得检查
allocate返回的状态标志。 -
@AlexanderVogt 你是对的,对不起。
dPP =部分基于使用所有动态参数调用ZHPADM,但后来我发现只有dH有问题,因此将其更改为最小。应该删除 dPP 行。 -
@HighPerformanceMark 确实是个好主意,我猜我一般应该这样做。但是,在这种情况下,我检查并发现分配正常。
-
异常发生在哪一行?
标签: memory-management matrix fortran dynamic-memory-allocation