2014-09-20 2 views
3

갑자기 몇 가지를 받았습니다. 매우 이전의 포트란 코드가 컴파일되어 내 연구 그룹에서 작동합니다. 좀 검색을하고있다아주 오래된 코드를위한 ifort dialect 옵션

... 
     IF(THRU.GT.0.D0) GO TO 120          00011900 
     L1=LL                00012000 
     A1=AA                00012100 
     DR1=DRR               00012200 
     RMAX1=RMAXX              00
     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 
... 

는 포트란으로 매우 익숙 것 : 여기 error #6526: A branch to a do-term-shared-stmt has occurred from outside the range of the corresponding inner-shared-do-construct.

잘못 것으로 보인다 코드의 비트입니다 : 나는 다음과 같은 오류가 코드를 컴파일 할 때 ifort를 사용하여 내가 볼 수있는 것은 DO 문을 DO 문으로 분기하는 IF 문을 좋아하지 않는다는 것이다. 또한 일부 오래된 방언이나 컴파일러가이를 지원하는 것으로 보입니다.

내 질문은 다음과 같습니다. ifort가 성공적으로 이것을 컴파일 할 수있게 해주는 옵션이 있습니까? I.E. 이 법을 가능하게 할 ifort에 특정 언어 호환 옵션이 있습니까?

컴파일러에서 허용하는 특정 코드의 부작용은 무엇입니까? 쓰기 문을 제외하고 부작용이 121 행과 동일 할 수 있습니까? 아니면 121 번에 가야 할 루프일까요?

고문 변호사가 먼저 컨설팅을하지 않고 변경해서는 안된다는 사실을 알지 못하면 코드 수정을 고려할 것이므로이 질문을 통해 컨설팅을 요청해야하는지 알 수 있습니다. 만약 내 유일한 옵션이 코드 수정을 제안한다면 환영받을 것입니다. 그래야 조언자에게 갈 때해야 할 일에 대한 아이디어를 얻을 수 있습니다.

+1

Anybode는 이러한 코드를 제공하고 더 나은 코드를 작성하도록 금지해야합니다. 이 코드는 자동 도구를 사용하여 현대적인 자유 형식으로 다시 작성해야합니다. –

+0

나는 그것에 동의하지만 내 고문은 코드 기능의 변경을 두려워한다고 생각합니다. 코딩 스타일은 끔찍하지만 작동합니다. 그것은 정확하게 알파 산란 데이터에 대한 광학 모델 적합 (Optical Model Fit)에서 사용하는 단일 접힌 알파 핵 상호 작용 가능성을 정확하게 계산합니다. 코드에 대한 변경 사항은 광범위하게 유효성을 검사해야하는데 이는 고통스런 일이지만 통증과 시간이 많이 걸리는 싱크대, 도매 재 형식화는 아마도 더 나 빠졌을 것입니다. 또한 고문은 검증을 피하는 숨겨진 부작용을 두려워한다고 생각합니다. 어쨌든, 나는 당신과 동의하지만 양쪽을 볼 수 있습니다. –

답변

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에 계속 루프를 구성하면 내가 아주 surpised 것으로 대체 될 수 명확성을 위해 코멘트 : 없음 write 문에 의해 참조되는 변수가 루프에서 업데이트됩니다. goto121을 참조 할 수도 있지만 건너 뛸 부분에서는 많은 변수가 업데이트되지 않습니다.

+0

제 검색에서 f66에 관한 약간의 실수를 보았습니다. ifort는 -f66 플래그로 컴파일하지 않습니다. –

+0

Fortran 66은 꽤 오래 전 이었지만,'-f66'은 Fortran 66 컴파일러로서 작동해야한다고 (하는 것처럼 보이지는 않습니다) ifort에게 말하지 않습니다. – francescalus

+0

고대 Fortran을 완전히 이해하지 못해 오해의 소지가있는 경우이 답변을 기꺼이 삭제하겠습니다. – francescalus

관련 문제