fortran77代码执行不会停止

时间:2014-07-30 17:14:50

标签: fortran fortran77

有一个F77代码,稍微修改了我。代码调用一个特定的例程,但似乎编译没有停止(我相信循环没有问题)。这让我想知道为什么会发生这种情况。

其次,我无法真正理解该例程的输出是什么。有人可以帮忙吗?

这是调用例程/函数的代码部分。通过MWE工作,

integer, parameter:: nf=101, ns=7, nas=427, na=61, nxm=3
integer:: i,j,k,     

allocate(xf(nf), xa(na))
allocate(absa(nxm,na-1), wgta(nxm,na-1),absf(nxm,nf-1), wgtf(nxm,nf-1))



    do 150 i=1,na-1
          call qgausl (nxp(i), xa(i), xa(i+1), absa(1,i), wgta(1,i))
 150    continue

       do 160 i=1,nf-1
          call qgausl (nxp(i), xf(i), xf(i+1), absf(1,i), wgtf(1,i))
  160    continue

这是常规

     subroutine qgausl(n,x1,x2,x,w)
      implicit none 
      integer:: n, m
      real*8:: xl,x2, x1, xm, eps, z, p1,p2,p3, pp, z1
      real*8:: x(n), w(n) 

     eps=1.0e-8
       m=(n+1)/2
      xm=0.5*(x2+x1)
      xl=0.5*(x2-x1)

      do 12 i=1,m

        z = cos(3.141592654*(i-.25)/(n+.5))
1       continue
print*, z
          p1 = 1.0
          p2 = 0.0
          do 11 j=1,n
            p3 = p2
            p2 = p1
            p1 = ((2.0*j-1.0)*z*p2-(j-1.0)*p3)/j
 11       continue
          pp = n*(z*p1-p2)/(z*z-1.0)
          z1 = z
          z = z1-p1/pp
          if (dabs(z-z1).gt.eps) go to 1
          x(i) = xm-xl*z
          x(n+1-i) = xm+xl*z
          w(i) = 2.0*xl/((1.0-z*z)*pp*pp)
          w(n+1-i) = w(i)
 12   continue
      return
      end subroutine 

为了您的信息,如果我做得很好,我将其翻译成Matlab,并且似乎例程中的循环没有问题。

1 个答案:

答案 0 :(得分:1)

一点延伸评论:

我注意到的一件事是你将它标记为fortran77但实际上如果这确实是f77类型的外部子程序(即不在模块/包含构造中)它将无法编译,因为你使用implicit none但是无法在子例程中声明i

(还有许多其他f77之后的语法功能。)

所以......假设这个子程序是内部的(即生活在调用例程中的contains)i这里:

 do 12 i=1,m

与调用例程的范围相同,即i。你实际上是为两个嵌套循环使用相同的变量。

这显然是非法的事情,我必须说我不安地看到gfortran默默地编译并在无休止的循环中逃跑..(!?!)

我建议将子程序移动到一个模块,或者只是在你认为是这种情况时将它移到外部。然后编译器将标记您未能声明i

例如

gfortran和ifort在没有警告的情况下编译:

  implicit none
  integer j
  do j = 1,2
     call x()
  enddo
  contains
  subroutine x()
  implicit none
  do j=3,4
     write(*,*)j
  enddo
  end subroutine
  end

gfortran版本无休止地打印3,4,3,4。英特尔版只写了3,4次(即不是你可能期望的那样)

在子程序中声明j当然会修复它。