首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Fortran问题:"xx“的论点是(2)的一种类型,但在(1)则是另一种类型。

Fortran问题:"xx“的论点是(2)的一种类型,但在(1)则是另一种类型。
EN

Stack Overflow用户
提问于 2015-06-23 17:29:37
回答 1查看 301关注 0票数 0

我有几个“参数是一个类型at (1),但在我的程序中出现了其他类型的错误,但是我不知道如何修改它。除了我所做的,还有其他的方法来写参数吗?”

Ps。我用g77编译。但我在gfortran中也尝试过,这里出现的错误是“论点'z‘at (1) (标量和秩-1)中的秩不匹配”。

以下是即将出现的错误:

代码语言:javascript
复制
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]

方案的一部分:

代码语言:javascript
复制
      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

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

代码语言:javascript
复制
      CALL ATMSETUP(NLEVEL,Z,RHCH4,FH2,FARGON,TEMP,PRESS,DEN,XMU,
     & CH4,H2,XN2,AR,IPRINT)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-23 19:09:30

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

代码语言:javascript
复制
real :: Z
real :: EFFG

ZEFFG都是秩0(标量)的实变量。以下列方式引用这些变量

代码语言:javascript
复制
EFFG(Z(J))

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

修复方法是正确地将变量声明为1级数组。在注释中,您注意到切换到gfortran会将错误从泛型“类型不同”更改为特定的“等级错配”。这是一条更有用的错误消息,其他人已经注意到,您应该能够(一旦您的问题都解决了)使用gfortran编译您的代码,而对g77编译的内容没有(或仅仅是小的)更改。采用现代实践是值得的,一个简单的开始就是改变。

代码语言:javascript
复制
       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)

转到

代码语言:javascript
复制
       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 )来理解。还请注意,在确定上面使用的显式类型时,我假设了默认的隐式类型,如果它们不是您所期望的,那么这就是采用显式类型的更好的理由。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31009537

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档