FORTRAN IV / 66程序停止在DO循环中

时间:2013-06-06 11:27:54

标签: fortran gfortran

我从论文中复制了一个FORTRAN IV程序,因此它可能在编写时起作用。我用gfortran编译了它。运行时,它会在集成子例程中停止。我试图缓解残差,但无济于事。我正在寻求帮助,因为(假设代码中没有错误)gfortran可能不喜欢古老的66 / IV代码,并且更新它不在我的能力之内。

程序被第9行卡住了,所以我想知道DO循环是否有责任。注意,第1行和第6行对我来说很不寻常,因为在末端添加了',1':例如= 1,N,1。

我认为没有必要在第5行显示调用的FUNC子程序,但我很乐意在必要时提供它。

如果您需要更详细的信息,我很乐意提供。

00000001 13  DO 22 TDP=QDP,7,1
00000002     TD=TDP-1
00000003     X=X0+H0
00000004     IF(TD.EQ.QD) GOTO 15
00000005     CALL FUNC(N,DY,X,Y,J)   
00000006 15  DO 21 RD=1,N,1
00000007     GOTO (120,121,122,123,124,125,126),TDP
00000008 120     RK(5*N*RD)=Y(RD)
00000009     GOTO 21
00000010 121     RK(RD)=HD*DY(RD)
00000011     H0=0.5*HD
00000012     F0=0.5*RK(RD)
00000013     GOTO 20
00000014 122     RK(N+RD)=HD*DY(RD)
00000015     F0=0.25*(RK(RD)+RK(N+RD))
00000016     GOTO 20
00000017 123     RK(2*N+RD)=HD*DY(RD)
00000018     H0=HD
00000019     F0=-RK(N+RD)+2.*RK(2*N+RD)
00000020     GOTO 20
00000021 124     RK(3*N+RD)=HD*DY(RD)
00000022     H0=0.66666666667*HD
00000023     F0=(7.*RK(RD)+10.*RK(N+RD)+RK(3*N+RD))/27.
00000024     GOTO 20
00000025 125     RK(4*N+RD)=HD*DY(RD)
00000026     H0=0.2*HD
00000027     F0=(28.*RK(RD)-125.*RK(N+RD)+546.*RK(2*N+RD)+54.*RK(3*N+RD)-
00000028    1378.*RK(4*N+RD))/625.
00000029     GOTO 20
00000030 126     RK(6*N+RD)=HD*DY(RD)
00000031     F0=0.1666666667*(RK(RD)+4.*RK(2*N+RD)+RK(3*N+RD))
00000032     X=X0+HD
00000033     ER=(-42.*RK(RD)-224.*RK(2*N+RD)-21.*RK(3*N+RD)+162.*RK(4*N+RD)
00000034    1+125.*RK(6*N+RD))/67.2
00000035     YN=RK(5*N+RD)+F0
00000036     IF(ABS(YN).LT.1E-8) YN=1
00000037     ER=ABS(ER/YN)
00000038     IF(ER.GT.G0) GOTO 115
00000039     IF(ED.GT.ER) GOTO 20
00000040     QD=-1
00000041 20  Y(RD)=RK(5*N+RD)+F0
00000042 21  CONTINUE
00000043 22  CONTINUE

2 个答案:

答案 0 :(得分:3)

很难确定(不完全确定您的代码段与您的源文件完全匹配)但您的问题可能来自旧的FORTRAN问题 - 第6列中的0被(或者更确切地说)视为空白。第6列中的任何其他(非空白)字符被视为继续指示符,但不被视为0

答案 1 :(得分:0)

1位是让编译器发现错误。执行以下操作非常常见

DO 10 I = 1.7

这是完全合法的,因为变量名中允许使用空格。如果你想避免这种情况,那么请加上额外的号码。以下将产生错误

DO 10 I = 1.7,1
DO 10 I = 1,7.1
DO 10 I = 1.7.1

重新启动程序,尝试在标签21和22之间放置一个连续行。在更高版本的Fortran中,if-goto与if-not-then相同,并且计算的goto与select语句相同。你不需要重新编码它:除了年轻人在看到goto时感到困惑,它没有任何问题。你需要做的只是缩进它,它变得显而易见。所以你将拥有的是

    DO 22 TDP = QDP, 7, 1
       ...
       DO 23 RD = 1, N, 1
          GOTO (...) TDP
             ...
             GOTO 21
             ...
             GOTO 20
             ...
             GOTO 20
             ...
20        CONTINUE
          Y(RD) = ...
21        CONTINUE
23      CONTINUE
22   CONTINUE

如果您尝试重新编码,您可能会得到更多代码。它看起来完全一样,只不过用其他单词取代了。编译器可能生成错误的代码,因此只需添加一些虚拟(CONTINUE)语句即可帮助它。