无法分类的陈述(1)Fortran错误

时间:2016-02-08 06:56:15

标签: fortran

在第64行确认错误开始

我被要求修改遗留代码。我在编译error compiling picture时发现了这些错误。有谁知道如何解决这些错误?我使用gfortran作为我的编译器。

源代码:

   * Spectral analysis of measured data *

      PARAMETER (ND=86400,NSP=43200,NND=86400)
      COMMON /WDATA/ WD(NND),WD2(NND)
      COMMON /SPEC/ WSP(NSP)
      COMMON /TSDATA/ TS(ND*2),CTTS(ND*2)
      COMMON /SPDATA/ P(NSP),DF

      REAL MEAN

      DATA DT/1.0/
      DATA COTL/14400.0/
      DATA COTS/600.0/
      PI=3.141593

      OPEN(32,FILE="Pw.txt",STATUS="OLD")

      OPEN(12,FILE="output1",STATUS="UNKNOWN")

      OPEN(13,FILE="output2",STATUS="UNKNOWN")

      DO J=1,NND
          READ(32,*)WD(J)
      END DO

       TOTAL=0.0
       MEAN=0.0
       DO J=1,NND
        TOTAL=TOTAL+WD(J)
       END DO

        MEAN=TOTAL/FLOAT(NND)

        DO J=1,NND
         WD(J)=WD(J)-MEAN
        END DO

    Numerical filtering and Spectral analysis

      M=ND/2
      KF=1
      TD=DT*FLOAT(ND)
      DF=1./TD

      DO J=1,ND          
        TS(J)=WD(J)
        TS(J+ND)=0.
      END DO  

      COFL=1./COTL
      COFH=1./COTS
      NCUTL=IFIX((COFL+DF/2.)/DF)+1
      NCUTH=IFIX((COFH-DF/2.)/DF)+1
      =========================  
      CALL CUTOFF(M,NCUTL,NCUTH)
      =========================
      DO J=1,ND
        WD2(J)=CTTS(J)
      END DO
     =================================
      SUBROUTINE CUTOFF(M,NCUTL,NCUTH)
     =================================
      PARAMETER(ND=86400,NSP=43200)
      COMMON /TSDATA/ TS(ND*2),CTTS(ND*2)
      COMMON /FFTDATA/ W1(ND*2)
      MM=M+M
      M4=MM+MM

      DO J=1,MM
        W1(2*J-1)=TS(J)
    W1(2*J)=TS(J+MM)
      END DO
      ===============
      CALL FOUR1(MM,1)
      ===============
      DO J=1,M
        IF(J.EQ.1.AND.NCUTL.GT.0)THEN
      W1(1)=0.
      W1(2)=0.
        ELSE IF(J.LT.NCUTL)THEN
      W1(2*J-1)=0.
      W1(2*J)=0.
      W1(M4-2*J+3)=0.
      W1(M4-2*J+4)=0.
    END IF  
        IF(J.GT.NCUTH)THEN
      W1(2*J-1)=0.
      W1(2*J)=0.
      W1(M4-2*J+3)=0.
      W1(M4-2*J+4)=0.
    END IF
    IF(NCUTH.GT.M) THEN
      W1(MM+1)=0.
      W1(MM+2)=0.
    END IF
      END DO

     -----------------
      CALL FOUR1(MM,-1)
     -----------------

      DO I=1,MM
        CTTS(I)=W1(2*I-1)/FLOAT(MM)
        CTTS(I+MM)=W1(2*I)/FLOAT(MM)
      END DO

      RETURN
      END

     ==========================
      SUBROUTINE FOUR1(NN,ISIGN)
     ==========================
      PARAMETER(ND=86400)
      REAL*8 WR,WI,WPR,WPI,WTEMP,THETA
      COMMON /FFTDATA/ DATA(ND*2)C
      N=2*NN
      J=1
      DO 11 I=1,N,2
        IF(J.GT.I) THEN
      TEMPR=DATA(J)
      TEMPI=DATA(J+1)
      DATA(J)=DATA(I)
      DATA(J+1)=DATA(I+1)
      DATA(I)=TEMPR
      DATA(I+1)=TEMPI
    ENDIF
    M=N/2
    1   IF ((M.GE.2).AND.(J.GT.M)) THEN
          J=J-M
      M=M/2
    GO TO 1
    ENDIF
    J=J+M

        11 CONTINUE
      MMAX=2
    2 IF (N.GT.MMAX) THEN
        ISTEP=2*MMAX
    THETA=6.28318530717959D0/(ISIGN*MMAX)
    WPR=-2.D0*DSIN(0.5D0*THETA)**2
    WPI=DSIN(THETA)
    WR=1.D0
    WI=0.D0
    DO 13 M=1,MMAX,2
      DO 12 I=M,N,ISTEP
      J=I+MMAX
      TEMPR=SNGL(WR)*DATA(J)-SNGL(WI)*DATA(J+1)
      TEMPI=SNGL(WR)*DATA(J+1)+SNGL(WI)*DATA(J)
      DATA(J)=DATA(I)-TEMPR
      DATA(J+1)=DATA(I+1)-TEMPI
      DATA(I)=DATA(I)+TEMPR
      DATA(I+1)=DATA(I+1)+TEMPI
    12     CONTINUE
        WTEMP=WR
       WR=WR*WPR-WI*WPI+WR
      WI=WI*WPR+WTEMP*WPI+WI
    13   CONTINUE
        MMAX=ISTEP
      GO TO 2
      ENDIF
      RETURN
      END

2 个答案:

答案 0 :(得分:2)

您尚未在end声明之前使用subroutine cutoff声明关闭主程序

      DO J=1,ND
          WD2(J)=CTTS(J)
      END DO
      =================================
      SUBROUTINE CUTOFF(M,NCUTL,NCUTH)
      =================================

这应该是类似

的内容
      DO J=1,ND
         WD2(J)=CTTS(J)
      END DO
      END
      SUBROUTINE CUTOFF(M,NCUTL,NCUTH)
然而,这并没有多大意义。我相信还有更多缺失的线条。代码中还有许多非法声明,主要是由于弗拉基米尔F注意到的格式错误。

答案 1 :(得分:2)

Muhajjir,

如果gfortran曾经像fortran那样,那么这段代码就会生成一个 过多的错误。有一件事是肯定的,在主要结尾处确实有和END的声明。否则,编译器会非常困惑。在 此外,您的一些陈述似乎在第7列的左侧有代码。 请记住,Fortran可以追溯到IBM打卡的日子 列导向。首都' c'通常在第1列中用来表示a 评论。第6列保留用于延续字符,最终 只要第6列不为空,就会变成你想要的任何角色。用作标签的数字HAD从第1列开始,不能超过第5列到第6列或更高。此代码看起来违反了许多这些基本规则。检查一切,整理出来,每一件事都应该没问题。如果没有,我们可以从那里开始。

                                 Blake Mitchell
                                 Retired free lance programmer

P.S。敬启者, 我已经阅读了如何回答链接,这个答案似乎适合 要求完美。为什么你认为它没有?