gpt4 book ai didi

fortran - 适用于非常旧的代码的 ifort 方言选项

转载 作者:行者123 更新时间:2023-12-02 18:26:26 26 4
gpt4 key购买 nike

我突然得到了一些非常旧的 Fortran 代码来编译并开始为我的研究小组工作。使用 ifort 编译代码时出现以下错误:错误 #6526:从相应的内部共享-do-构造的范围之外发生了到 do-term-shared-stmt 的分支。

这是一段似乎有问题的代码:

...
IF(THRU.GT.0.D0) GO TO 120 00011900
L1=LL 00012000
A1=AA 00012100
DR1=DRR 00012200
RMAX1=RMAXX 00012300
RMIN1=RMINN 00012400
IF(DR1.EQ.0.D0) DR1=DRP 00012500
KMAX1=(RMAX1-RMIN1)/DR1+1.D-08 00012600
IF(KMAX1.GT.NN .OR. KMAX1.LE.0) KMAX1=NN 00012700
RINT1=RMAX1 00012800
IF(RMAX1.NE.0.D0) 00012900
2RMAX1=DR1*DFLOAT(KMAX1)+RMIN1 00013000
IUP=KMAX1 00013100
R=RMIN1 00013200
DO 120 K1=1,KMAX1 00013300
R=R+DR1 00013400
XX(K1)=R 00013500
120 CONTINUE 00013600
WRITE(IW,940) NAM1,IOPT1,L1,A1,DR1,RMAX1,RMIN1,ANU1,BNU1,CNU1 00013700
121 CONTINUE 00013800
...

由于对 fortran 相当不熟悉,我一直在进行一些搜索,我发现它不喜欢 IF 语句分支到 DO 循环的终止语句。另外,似乎一些较旧的方言或编译器支持这一点。

我的问题是:是否有一个选项可以让 ifort 成功编译它? ifort 上是否有特定的方言兼容性选项可以使其合法?

该特定代码对接受它的编译器有何副作用?除了 write 语句之外,副作用是否可能与转到第 121 行相同?或者也许 do 循环应该转到 121?

如果不是因为我的顾问告诉我,在没有先咨询他的情况下我不应该进行任何更改,我会考虑修改代码,所以我问这个问题是为了看看我是否需要咨询他。也就是说,如果我唯一的选择是修改代码,那么我会欢迎建议,以便我在去找顾问时可以了解需要做什么。

最佳答案

我会注意到,即使在 Fortran 77 中,所讨论的代码也是无效的,但人们在过去的迷雾中做了一些奇怪的事情。我会尊重任何历史学家或有经验的人。特别是,应该非常小心地理解代码中与我的“答案”相关的任何微妙之处。

如果我们假设给出的 goto 的目的是在执行循环之后跳转到代码,那么我会回答对代码的最小更改。

为了清楚起见,删除行号注释

      DO 120 K1=1,KMAX1
R=R+DR1
XX(K1)=R
120 CONTINUE
WRITE(IW,940) NAM1,IOPT1,L1,A1,DR1,RMAX1,RMIN1,ANU1,BNU1,CNU1

可以替换为

      DO K1=1,KMAX1
R=R+DR1
XX(K1)=R
END DO
120 WRITE(IW,940) NAM1,IOPT1,L1,A1,DR1,RMAX1,RMIN1,ANU1,BNU1,CNU1

如果代码作者希望循环继续到121,我会感到非常惊讶:循环中没有更新write语句引用的变量。 goto 可能旨在引用 121,但我确实看到许多变量在将被跳过的部分中没有更新。

关于fortran - 适用于非常旧的代码的 ifort 方言选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25953788/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com