我从论文中复制了一个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
答案 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)语句即可帮助它。