有一个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,并且似乎例程中的循环没有问题。
答案 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
当然会修复它。