Search code examples
fortrangotointel-fortran

ifort dialect options for very old code


I have been suddenly given a few very old fortran codes to compile and get working for my research group. Using ifort when I compile the code I get the following error:error #6526: A branch to a do-term-shared-stmt has occurred from outside the range of the corresponding inner-shared-do-construct.

Here is the bit of code that seems to be at fault:

...
      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
...

Being quite unfamiliar with fortran I have been doing some searching and what I can see is that it does not like that IF statement branching to the terminal statement of the DO loop. Also, it seems that some older dialects or compilers supported this.

My questions is this: Is there an option that will allow ifort to successfully compile this? I.E. Is there a specific dialect compatibility option on ifort that will make this legal?

What are the side effects of that particular code on a compiler that would accept it? Is it possible that aside from the write statement the side effects are identical to going to line 121? Or was maybe the do loop supposed to go to 121?

I would consider modifying the code if not for the fact that my advisor told me that I should not make any changes whatsoever without consulting him first and so I ask this question to see if I need to consult him or not. That said if my only option is a modification to the code suggestions would be welcome for that so that I can have an idea of what needs to be done when I go to my advisor.


Solution

  • I'll note that the code in question isn't valid even as Fortran 77, but people did weird stuff back in the mists of time. I'll defer to any historian or person with experience. In particular, one should be very careful to understand any subtleties in the code in relation to my "answer" here.

    If we assume that the intention of the goto given is to jump to code after the execution of the loop, then I answer about minimal change to the code.

    Stripping line-number comments for clarity then

          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
    

    can be replaced by

          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
    

    I would be quite surpised if the author of the code intended the loop to continue to 121: no variable referenced by the write statement is updated in the loop. It is possible that the goto was intended to reference 121 but I do see that many variables are not updated in the section that would be skipped.