编译器错误 - Fortran 问题:"xx" 的参数在 (2) 处是一种类型,但在 (1) 处是另一种类型



我有一些"Argument是(1)处的一种类型,但是(2)处的另一种类型。程序中出现错误,但我不知道如何修改它。除了我所做的,还有其他写论点的方法吗?

Ps。我在g77中编译。但我也在gfortran中尝试过,其中出现的错误是"参数'z'在(1)(标量和秩-1)处的秩不匹配"。

以下是即将出现的错误:

geomalb.f: In subroutine `atmsetup':
geomalb.f:1083: 
         SUBROUTINE ATMSETUP(NLEVEL,Z,RHCH4,FH2,FARGON,TEMP,PRESS,DEN,XMU,
                                    1
geomalb.f:1122: (continued):
         SUMT=SUMT+(EFFG(Z(J))*ADEN)*( Z(J-1)-Z(J))*XMU(J)
                     2
Invalid declaration of or reference to symbol `z' at (2) [initially seen at (1)]
geomalb.f:80: warning:
         COLDEN(J)=RHOP*(PRESS(J+1)-PRESS(J))/EFFG(Z(J))
                                              1
geomalb.f:1122: (continued):
         SUMT=SUMT+(EFFG(Z(J))*ADEN)*( Z(J-1)-Z(J))*XMU(J)
                    2
Argument #1 of `effg' is one type at (2) but is some other type at (1) [info -f g77 M GLOBALS]
geomalb.f:80: warning:
         COLDEN(J)=RHOP*(PRESS(J+1)-PRESS(J))/EFFG(Z(J))
                                              1
geomalb.f:1124: (continued):
         SUMB=SUMB+(EFFG(Z(J))*ADEN)*( Z(J-1)-Z(J))*28.01340
                    2
Argument #1 of `effg' is one type at (2) but is some other type at (1) [info -f g77 M GLOBALS]
geomalb.f:72: warning:
         CALL ATMSETUP(NLEVEL,Z,RHCH4,FH2,FARGON,TEMP,PRESS,DEN,XMU,
              1
geomalb.f:1083: (continued):
         SUBROUTINE ATMSETUP(NLEVEL,Z,RHCH4,FH2,FARGON,TEMP,PRESS,DEN,XMU,
                    2
Argument #2 (named `z') of `atmsetup' is one type at (2) but is some other type at (1) [info -f g77 M GLOBALS]

程序的一部分:

      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)
      DIMENSION DEN(1), PRESS(1), TEMP(1), XMU(1)
      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
      END SUBROUTINE
      END

在程序的前面,我是这样调用子程序的:

      CALL ATMSETUP(NLEVEL,Z,RHCH4,FH2,FARGON,TEMP,PRESS,DEN,XMU,
     & CH4,H2,XN2,AR,IPRINT)

您不为变量提供任何类型信息,而是依赖于隐式类型。在默认的隐式键入规则下,变量ZEFFG声明为:

real :: Z
real :: EFFG

CCD_ 3和CCD_ 4都是秩为0(标量)的实变量。您可以通过以下方式引用这些变量

EFFG(Z(J))

这是等级不匹配。您可以将Z作为秩1变量访问,将EFFG作为秩1的变量访问,但它们被隐式定义为秩0变量。

修复方法是正确地将变量声明为秩1数组。在评论中,您注意到切换到gfortran将错误从一般的"类型不同"错误更改为特定的"等级不匹配"。这是一个更有用的错误消息,其他人已经注意到,您应该能够(一旦问题全部解决)使用gfortran编译代码,而不会对g77的编译内容进行任何(或只有微小)更改。采用现代做法是值得的,一个简单的开始就是改变

       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)
       DIMENSION DEN(1), PRESS(1), TEMP(1), XMU(1)

进入

       SUBROUTINE ATMSETUP(NLEVEL,Z,RHCH4,FH2,FARGON,TEMP,PRESS,DEN,XMU,
      & CH4,H2,XN2,AR,IPRINT)
       implicit none
       integer NMAX
       real CH4, H2, XN2, AR, TLINAL, DLINAL, PLINAL, DEN, PRESS, TEMP
       real xmu, Z, EFFG, RHCH4, FH2, FARGON, ADEN, CH4SAT, DENF, DT
       real SUMB, SUMT, TLAST, PCH4
       integer NLEVEL, IPRINT, ITS, J
       PARAMETER (NMAX=201)
       DIMENSION CH4(1),H2(1),XN2(1),AR(1)
       DIMENSION TLINAL(NMAX),DLINAL(NMAX),PLINAL(NMAX)
       DIMENSION DEN(1), PRESS(1), TEMP(1), XMU(1)

请注意,此更改不会修复您的错误,因为我没有咨询我的水晶球来确定ZEFFG的尺寸。我所做的只是添加显式类型,这应该被古老的g77编译器(以及固定形式的gfortran)所理解。还要注意,在确定上面使用的显式类型时,我假设了默认的隐式类型,如果它们不是您期望的那样,那么这是采用显式类型的更好理由。

相关内容

最新更新