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

Memory management Fortran例程仅适用于静态分配的矩阵,memory-management,matrix,fortran,dynamic-memory-allocation,Memory Management,Matrix,Fortran,Dynamic Memory Allocation,我对Fortran相当陌生,我很难理解为什么子例程在编译时可以很好地处理静态定义的矩阵,但在运行时不能处理使用allocate创建的类似矩阵 据我所知,矩阵应该非常相似:相同的类型、大小、sizeof和值。问题不在于这个具体的例子,而在于为什么和什么时候他们的行为会完全不同 一个“最小”的工作示例(),我认为是这里的关键部分: ! static 'allocation' real(dp), dimension(fN, fN) :: fH ! static call call ZHPADM(pad

我对Fortran相当陌生,我很难理解为什么子例程在编译时可以很好地处理静态定义的矩阵,但在运行时不能处理使用
allocate
创建的类似矩阵

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

一个“最小”的工作示例(),我认为是这里的关键部分:

! 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)参数动态工作正常。例行程序是错误的,程序接收到信号8(SIGFPE):浮点异常。但如前所述,最好给出一般性解释

编辑1:我忘了提到一些信息,很抱歉!调用带有所有相关参数dynamic的
ZHPADM
会产生相同的错误。我只是将一些内容改回了静态,以表明是动态矩阵导致了问题。结尾的几行因此变得不一致,对不起。静态变量和动态变量的值相同


编辑2:异常发生在新pastebin的第77行,动态ZHPADM调用(注释该行将停止异常)。我在Ubuntu上使用gfortran 4.6.3,如下所示
gfortran demo.f90-lexpokit-lblas-llapack
(通常还有一些警告标志)。

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

我在pastebin中看到您的代码中有几个错误。。。例如,
dPP=reformate(dwsp(iexph:iexph+dN**2-1),[dN,dN])
dwsp
未初始化!
dN
fN
是否相同?您不需要重置
fipiv
?除此之外,信息太少了!请使用编译器的所有调试选项修复代码,直到不再收到投诉,然后给出完整的错误描述,包括发生异常的行。可能值得检查
allocate
@AlexanderVogt返回的状态标志。你是对的,抱歉。
dPP=
部分基于使用所有动态参数调用
ZHPADM
,但我后来发现只有
dH
会产生问题,所以将其更改为最小值。应该删除民进党的路线。@HighPerformanceMark好主意,我想总的来说我应该这么做。不过,我检查了一下,在这种情况下分配顺利。异常发生在哪一行?谢谢您的回答!这当然是合理的,但在这种情况下,
fN
=
dN
,很抱歉之前没有提到这一点,我现在更新了问题。