Fortran例程仅适用于静态分配的矩阵

时间:2014-07-16 11:34:40

标签: memory-management matrix fortran dynamic-memory-allocation

我对Fortran相当新,我无法理解为什么子程序在编译时静态定义的矩阵正常工作,但不适用于在运行时使用allocate创建的类似矩阵

就我所知,矩阵应该非常相似:相同的类型,大小,sizeof和值。问题不在于这个具体的例子,而在于它们为什么以及什么时候会有不同的行为。

A'最低'工作示例at pastebinupdated 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 :我忘了提一些信息,对不起!使用所有相关参数dynamic调用ZHPADM会产生相同的错误。我只是将一些改回静态来表明它是动态的矩阵导致问题。由于这一点,接近尾声的几行变得不一致,抱歉。静态和动态变量的值是相同的。

编辑2 :新的pastebin中的第77行发生异常,动态ZHPADM调用(注释该行停止异常)。我在Ubuntu上使用gfortran 4.6.3就像这个gfortran demo.f90 -lexpokit -lblas -llapack(通常是一些警告标志)。

1 个答案:

答案 0 :(得分:1)

ZHPADM的动态调用中,您按fN的顺序传递H,但您只分配了dN个项目。如果fN .ne dN程序可能对未分配的内存位置执行某些操作,从而导致未定义的行为。