非常旧代码的ifort方言选项

时间:2014-09-20 22:11:19

标签: fortran goto intel-fortran

我突然被给了一些非常旧的fortran代码来编译并为我的研究小组工作。在编译代码时使用ifort我收到以下错误:error #6526: A branch to a do-term-shared-stmt has occurred from outside the range of the corresponding inner-shared-do-construct.

以下是似乎有问题的代码:

...
      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成功编译? I.E.在ifort上是否有特定的方言兼容性选项,这将使其合法化?

特定代码对接受它的编译器有什么副作用?除了写声明之外,副作用是否可能与第121行相同?或者也许是循环应该去121?

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

1 个答案:

答案 0 :(得分:1)

我会注意到有问题的代码即使作为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,但我确实看到许多变量未在要跳过的部分中更新。