子例程中未定义语句的 Fortran 问题

Fortran issue with undefined statements in subroutine

我遇到了一堆错误,说我的变量不是变量,而且我的语句是未定义的。这个子程序是编译我的大程序所必需的,所以我只是将它复制粘贴到程序的末尾。如果我在不同的文件上将它们编译在一起,它就不起作用了。 我将如何解决这些 "undefined" 问题?是因为我在程序末尾复制粘贴子程序的方式吗? (我用 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

你需要

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

子程序中的语句。否则子程序不会 "know" 认为这些变量将被视为数组。