【问题标题】:Fortran routine only works for statically allocated matrixFortran 例程仅适用于静态分配的矩阵
【发布时间】: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 未初始化! dNfN 是否相同?你不需要重置fipiv吗?除此之外,它的信息太少了!请使用编译器的所有调试选项来修复您的代码,直到您不再收到投诉,然后提供完整的错误描述包括发生异常的行
  • 可能值得检查allocate返回的状态标志。
  • @AlexanderVogt 你是对的,对不起。 dPP = 部分基于使用所有动态参数调用 ZHPADM,但后来我发现只有 dH 有问题,因此将其更改为最小。应该删除 dPP 行。
  • @HighPerformanceMark 确实是个好主意,我猜我一般应该这样做。但是,在这种情况下,我检查并发现分配正常。
  • 异常发生在哪一行?

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


【解决方案1】:

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

【讨论】:

  • 感谢您的回答!这当然是合理的,但在这种情况下fN = dN,很抱歉之前没有提及,我现在更新了问题。
猜你喜欢
  • 1970-01-01
  • 2014-10-11
  • 2014-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-13
  • 1970-01-01
  • 2023-03-03
相关资源
最近更新 更多