我从一篇论文中复制了一个 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
最佳答案
很难确定(不完全确定您的代码段与您的源文件完全匹配)但您的问题可能来自于旧的 FORTRAN 问题 -- 0
在第 6 列中(或者更确切地说是)被视为空白。第 6 列中的任何其他(非空白)字符被视为/被视为继续指示符,但不是 0
.
关于FORTRAN IV/66 程序在 DO 循环中停顿,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16960949/