【问题标题】:Fortran issue with undefined statements in subroutine子例程中未定义语句的 Fortran 问题
【发布时间】:2015-06-22 21:46:27
【问题描述】:

我有一堆错误,说我的变量不是变量,我的语句是未定义的。这个子例程是编译我的大程序所必需的,所以我只是将它复制粘贴到我的程序末尾。如果我将它们一起编译到不同的文件上,它就不起作用了。 我将如何解决那些“未定义”的问题?是因为我在程序末尾复制粘贴子程序的方式吗? (我用 g77 和 gfortran 编译,同样的事情发生)

geomalb.f:1088.6:

      TEMP(J)= TLINAL(J)                                                
      1
Error: Unclassifiable statement at (1)
geomalb.f:1089.6:

      DEN(J)= DLINAL(J)                                                 
      1
Error: Unclassifiable statement at (1)
geomalb.f:1090.6:

      PRESS(J)=PLINAL(J)                                                
      1
Error: Unclassifiable statement at (1)
geomalb.f:1110.6:

      XMU(J)=28.0134*XN2(J)+2.158*H2(J)+16.0426*CH4(J)+39.948*AR(J)     
      1
Error: Unclassifiable statement at (1)
geomalb.f:1132.6:

  1001 IF (IPRINT .LT. 0) RETURN                                        
      1
Error: Bad continuation line at (1)
geomalb.f:1152.72:

      ENDDO                                                             
                                                                    1
Error: Statement label in ENDDO at (1) doesn't match DO label
geomalb.f:1130.72:

      IF (DT .LT. 0.001) GO TO 1001                                     
                                                                        1
Error: Label 1001 referenced at (1) is never defined
geomalb.f:72.27:

      CALL ATMSETUP(NLEVEL,Z,RHCH4,FH2,FARGON,TEMP,PRESS,DEN,XMU,       
                           1
Warning: Rank mismatch in argument 'z' at (1) (scalar and rank-1)

这是程序的子程序部分:

      SUBROUTINE ATMSETUP(NLEVEL,Z,RHCH4,FH2,FARGON,TEMP,PRESS,DEN,XMU,
     & CH4,H2,XN2,AR,IPRINT)
      PARAMETER (NMAX=201)
      DIMENSION CH4(1),H2(1),XN2(1),AR(1)
      DIMENSION TLINAL(NMAX),DLINAL(NMAX),PLINAL(NMAX)
      CALL LINDAL(NLEVEL,Z,TLINAL,DLINAL,PLINAL)
      DO J=1,NLEVEL
      TEMP(J)= TLINAL(J)
      DEN(J)= DLINAL(J)
      PRESS(J)=PLINAL(J)
      ENDDO
      DO 1000 ITS =1,20
      CH4(NLEVEL)=PCH4(TEMP(NLEVEL))*RHCH4/PRESS(NLEVEL)
      DO 134 J=NLEVEL-1,1,-1
      CH4SAT=PCH4(TEMP(J))/PRESS(J)
      CH4(J)=AMIN1(CH4SAT,CH4(NLEVEL),CH4(J+1))
  134  CONTINUE
      DO 20 J=1,NLEVEL
      H2(J)=FH2
      IF (FARGON .LT. 0.) THEN
      AR(J)=(-FARGON-28.0134+25.8554*H2(J)+11.9708*CH4(J))/11.9346
      ELSE
      IF (FARGON .EQ. 0.) THEN
      AR(J)=0.0
      ELSE
      AR(J)=FARGON
      ENDIF
      ENDIF
      XN2(J)=1.0 - H2(J) - CH4(J) -AR(J)
      XMU(J)=28.0134*XN2(J)+2.158*H2(J)+16.0426*CH4(J)+39.948*AR(J)
  20   CONTINUE
      SUMT=PLINAL(1)*6.02E23/10.
      SUMB=SUMT
      TLAST=TEMP(NLEVEL)
      DO J=2,NLEVEL
      DENF=294.1/(XN2(J)*294.1 + CH4(J)*410. + H2(J)*136. + AR(J)*277.8)
      DEN(J) = DLINAL(J)*DENF
      ADEN=(DEN(J)-DEN(J-1))/ALOG(DEN(J)/DEN(J-1))
      SUMT=SUMT+(EFFG(Z(J))*ADEN)*( Z(J-1)-Z(J))*XMU(J)
      ADEN=(DLINAL(J)-DLINAL(J-1))/ALOG(DLINAL(J)/DLINAL(J-1))
      SUMB=SUMB+(EFFG(Z(J))*ADEN)*( Z(J-1)-Z(J))*28.01340
      PRESS(J)=PLINAL(J)*SUMT/SUMB
      TEMP(J) =TLINAL(J)*(SUMT/SUMB)*(1./DENF)
      ENDDO
  30  CONTINUE
      DT= ABS(TEMP(NLEVEL)-TLAST)
      IF (DT .LT. 0.001) GO TO 1001
  1000 CONTINUE
  1001 IF (IPRINT .LT. 0) RETURN
      WRITE (6,139)RHCH4,FH2,FARGON,DT
      DO 135 J=1,NLEVEL-1
      WRITE(6,140)J,Z(J),PRESS(J),DEN(J),TEMP(J),
     &          CH4(J)*PRESS(J)/PCH4(TEMP(J))
     &         ,CH4(J)*100.,XN2(J)*100.,H2(J)*100.,AR(J)*100.,XMU(J)
     &         ,(TEMP(J+1)-TEMP(J))/(Z(J+1)-Z(J))
  135    CONTINUE
      J=NLEVEL
      WRITE(6,140)J,Z(J),PRESS(J),DEN(J),TEMP(J),
     &    CH4(J)*PRESS(J)/PCH4(TEMP(J))
     &    ,CH4(J)*100.,XN2(J)*100.,H2(J)*100.,AR(J)*100.,XMU(J)
  139 FORMAT(///'   BACKGROUNG ATMOSPHERE AT LEVELS'/
     & ' SURFACE HUMIDITY OF CH4:',F5.3,'  H2 MIXING RATIO:',F6.4,
     & ' ARGON SETTING:',F8.4/'  FINAL CONVERGENCE ON TEMP:',F10.5
     &  '   LINDAL ET AL SCALING'/
     &' LVL ALTITUDE  P(BARS)  DEN(CM-3) TEMP RH-CH4'
     & , ' %CH4  %N2   %H2  %AR   MU   DT/DZ'  )
  140 FORMAT(1X,I3,F8.3,1P2E10.3,0PF7.2,F5.2,2F6.2,2F5.2,4F6.2)
      RETURN
      ENDDO
      END

【问题讨论】:

    标签: compilation compiler-errors fortran fortran77


    【解决方案1】:

    你需要一个

          DIMENSION DEN(1), PRESS(1), TEMP(1)
    

    子程序中的语句。否则,子程序不“知道”这些变量将被视为数组。

    【讨论】:

    • 很好,工作。谢谢 !关于“排名不匹配”错误和 1001 错误的任何想法?
    • @JadeChee:标签1001从哪一栏开始?根据命令行开关,它可能必须从第 1 列开始。
    • @wallyk 现在,它从第 2 列开始。我试图让它从第 1 列开始,但出现了同样的错误。
    • 起始列无关紧要,重要的是第 6 列必须为空白。
    • 最好使用DEN(*) 甚至更好的REAL DEN(*) 以避免隐式输入。
    猜你喜欢
    • 2014-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-24
    • 2013-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多