Fortran子例程在返回时失败

时间:2012-08-01 18:03:31

标签: arrays fortran fortran90

我有一个Fortran数字代码,它从外部模块调用子程序。在我尝试编译并在另一台机器上运行之前,这段代码一直运行正常。在新机器上,我的程序很快就崩溃了。

使用调试打印语句,我已经发现从外部子例程返回时发生了崩溃。主程序多次调用子程序,从第二次调用子程序返回时发生崩溃(第一次调用正常)。它总是在第二个子程序调用时使用这组输入数据崩溃,但是使用另一组输入数据(大约是第一个输入数据的1/3),它会在从第五个子程序调用返回时崩溃。

症状告诉我,每次都会有东西存储在内存中并累积在每个子程序调用上,直到空间不足为止,但我不确定那是什么或者会发生什么。代码很难简化到最小的工作示例,但我已经在下面发布了相关部分。如果还有其他有助于查看的内容,请与我们联系。它基本上是由Fortran 90修复的。

         use fd

         implicit none

         integer, parameter :: ms = 2000
         integer n
         real(dp), dimension(ms) :: s
         real(dp), dimension(ms) :: e
         real(dp), dimension(ms) :: f
         real(dp), dimension(ms) :: d1f
         real(dp), dimension(ms) :: d2f
         real(dp), dimension(ms) :: c, d
         real(dp), dimension(ms) :: a
         real(dp), dimension(ms) :: b
         real(dp), dimension(ms) :: temp
         integer w
         integer k
         real(dp) th

         do i = 1,n
           temp(i) = a(i)
         end do
         call lprsmf(s(1:n),temp(1:n),n,w,k,th,a(1:n),d1f(1:n),
      *               d2f(1:n))

         do i = 1,n
           temp(i) = b(i)
         end do
         call lprsmf(s(1:n),temp(1:n),n,w,k,th,b(1:n),d1f(1:n),
      *               d2f(1:n))

         do i = 1,n
           temp(i) = c(i)
         end do
         call lprsmf(s(1:n),temp(1:n),n,w,k,th,c(1:n),d1f(1:n),
      *               d2f(1:n))

         do i = 1,n
           temp(i) = d(i)
         end do
         call lprsmf(s(1:n),temp(1:n),n,w,k,th,d(1:n),d1f(1:n),
      *               d2f(1:n))

         do i = 1,n
           temp(i) = e(i)
         end do
         call lprsmf(s(1:n),temp(1:n),n,w,k,th,e(1:n),d1f(1:n),
      *               d2f(1:n))

         do i = 1,n
           temp(i) = f(i)
         end do
         call lprsmf(s(1:n),temp(1:n),n,w,k,th,f(1:n),d1f(1:n),
      *               d2f(1:n))

模块fd

      module fd
        ! Double precision real kind
        integer, parameter :: dp = selected_real_kind(15)

      contains

      subroutine lprsmf(x,y,n,w,k,th,s,d1,d2)
!       INPUTS:
!         x, y, n, w, k, th
!       OUTPUTS:
!         s, d1, d2

        implicit none

        real(dp), dimension(n) :: x,y,s,d1,d2
        integer n,w,k
        real(dp) th

!     ... code here ...

      end subroutine lprsmf

      end module fd

我的编译器是gfortran 4.6.1。除了让代码停止崩溃之外,我真的想了解传递参数的根本原因(因为我认为问题在于数组切片被传递出程序)。请注意,a,b,c,d,e,f,s,temp,d1f,d2f的长度为2000,而n(表示有效数据的范围)在100-500范围内,具体取决于输入数据的长度。

编辑:错误消息是Windows发出一个对话框,通知我该程序已停止工作。

1 个答案:

答案 0 :(得分:1)

感谢大家帮忙解决这个问题。我跟着M.S.B.'s suggestion并使用-O2 -fimplicit-none -Wall -Wline-truncation -Wcharacter-truncation -Wsurprising -Waliasing -Wimplicit-interface -Wunused-parameter -fwhole-file -fcheck=all -fbacktrace编译。这揭示了我在子程序中包含的其他人的旧F77代码中的内存泄漏。显然,一些内部数组声明的长度比所需的长1项。我解决了这个问题,现在一切似乎都运转正常。