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

标签 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

最佳答案

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

关于FORTRAN IV/66 程序在 DO 循环中停顿,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16960949/

相关文章:

带有子例程和函数的 Fortran OpenMP

compiler-errors - 如何使用 `real sepaa[allocatable](:)` 语法编译 Fortran?

fortran - 为什么这是一个在模块内部声明的函数,然后在链接器看不到的同一模块中的其他地方使用?

assembly - 相当于 Gfortran 中的 asm volatile ?

ruby - 为什么 Fortran 中的单元测试框架依赖于 Ruby 而不是 Fortran 本身?

function - Fortran 函数返回可分配数组

performance - Fortran 模块性能

c - 我可以为 gfortran 使用哪些 gcc 编译器选项

复数的 Fortran 格式说明符

linux - 无法为 (RegCM) 安装找到打开的 MPI 文件