我有一些“参数是(1)的一种类型,但是是(2)的另一种类型,我的程序中出现错误,但是我不确定如何修改它。
除了我所做的以外,还有其他写论点的方法吗?
附言我用g77编译。但是我也在gfortran中尝试过,其中出现的错误是“(1)(标量和等级1)的参数'z'中的等级不匹配”。
以下是即将出现的错误:
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)
最佳答案
您不为变量提供任何类型信息,而是依靠隐式类型。在默认的隐式键入规则下,您的变量Z
和EFFG
声明为:
real :: Z
real :: EFFG
Z
和EFFG
都是等级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)
请注意,此更改不会解决您的错误,因为我没有咨询我的 Crystal 球来确定
Z
和EFFG
的尺寸。我所做的只是添加显式类型,古代的g77编译器(以及固定格式的gfortran)应该理解这些类型。还要注意,在确定上面使用的显式类型时,我已经假设了默认的隐式类型,如果它们不是您期望的默认类型,那是采用显式类型的一个更好的理由。
关于compiler-errors - Fortran问题: Argument of “xx” is one type at (2) but is some other type at (1),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31009537/