“错误:数组表达式的形状不符合”

时间:2012-02-26 18:49:14

标签: fortran

这是我解决三维圆柱形翅片问题的方案。但是当我在Fortran 6.2中运行这个程序时,会出现这个错误:

  

错误:数组表达式的形状不符合。 [T]“

现在我不明白为什么会这样。我需要快速帮助。有人请帮助我。

        PROGRAM CYLINDRICAL FIN
    DIMENSION T(500,500,500), OLDT(500,500,500),ERR(500,500,500)
    DIMENSION R(500),Y(500),Z(500)

    REAL CC,H,DR,DY,DZ,A,D,RY,YZ,ZR,B,E,TA,RL,YL,ZL
     +P,AC,QF,MF,Q,EF,EFF,QMAX,AS,LC,QT,QF1,QF2
    INTEGER I,J,K,M,N,L,M1,N1,L1,M2,M4,M34,N2,N4,N34,L2,L4,L34

    RL=0.5
    YL=6.283
    ZL=0.04
    M=100
    N=40
    L=20
    M2=((M/2)+1)
    M4=((M/4)+1)
    M34=((3*M/4)+1)
    N2=((N/2)+1)
    N4=((N/4)+1)
    N34=((3*N/4)+1)
    L2=((L/2)+1)
    L4=((L/4)+1)
    L34=((3*L/4)+1)



    DR=RL/M
    DY=YL/N
    DZ=ZL/L

    CC=400.0
    H=10.0
    TA=25
    M1=M-1
    N1=N-1
    L1=L-1

************VARIABLES************
    A=DR*DY*DZ
    D=DR+DY+DZ
    RY=DR*DY
    YZ=DY*DZ
    ZR=DZ*DR
      E=RY+YZ+ZR

************VARIABLES FOR EFFICIENCY AND EFFECTIVENESS (CROSS-SECTION AREA,PERIMETER,M,SURFACE AREA OF FIN)************
    AC=3.1416*DR**2
    P=2*(3.1416*DR+DZ)
    MF=((H*P)/(CC*AC))**(0.5)
    AS=2*3.1416*DR*DZ+3.1416*DR**2
**************************************  distance discritization ******************

    R(1)=0.0
    Y(1)=0.0
    Z(1)=0.0


    R(M+1)=RL
    Y(N+1)=YL
    Z(L+1)=ZL

    DO I=2,M
    R(I)=R(I-1)+DR
    END DO 
    DO J=2,N
    Y(J)=Y(J-1)+DY
    END DO
    DO K=2,L
    Z(K)=Z(K-1)+DZ
    END DO


    DO I=1,M
    DO J=1,N
    DO K=1,L
    T(I,J,K)=0.0
    END DO
    END DO
    END DO 

    DO I=1,M
    DO J=1,N
    T(I,J,1)=400
    END DO
    END DO

    ITER=0.0


    READ(*,*) LAST

31  CONTINUE


    ITER=ITER+1
*************************************** FORMULAS**********************************

      DO I=2,M1
    DO J=2,N1
    DO K=2,L1


      T(I,J,K)=((R*DR*T(I+1,J,K)*(YZ)**2.0)-((T(I+1,J,K)+T(I-1,J,K))*
     +(R*YZ)**2.0)-((T(I,J+1,K)+T(I,J-1,K))*(ZR**2.0))-((T(I,J,K+1)+
     +T(I,J,K-1))*(R*RY)**2.0))/((R*DR*(YZ)**2.0)-(2.0*(R*YZ)**2.0)-
     +(2.0*(ZR)**2.0)-(2.0*(R*RY)**2.0))
    END DO 
    END DO
    END DO




*************************************** END OF ITERATIONG FORMULAS****************
    DO I=1,M
    DO J=1,N
    DO K=1,L
    OLDT(I,J,K)=T(I,J,K)
    END DO
    END DO
    END DO


    DO I=1,M
    DO J=1,N
    DO K=1,L
    ERR(I,J,K)=T(I,J,K)-OLDT(I,J,K)
    END DO
    END DO
    END DO

    EMAX=0.0
    EMAX=MAX(EMAX,ERR(I,J,K))

    WRITE(*,*) ITER,   EMAX

    IF (ITER.LT.LAST) GOTO 31


    WRITE(*,*) DR,A,B,E

    END PROGRAM CYLINDRICAL FIN

3 个答案:

答案 0 :(得分:5)

在你的长公式中你有R没有索引。但R是一个向量,这就是你得到错误的原因。

DO I=1,M
DO J=1,N
T(I,J,1)=400
END DO
END DO

可以写得更快 T(1:M,1:N,1) = 400 400也是一个整数,因此您最好使用400.

答案 1 :(得分:2)

我很快将程序转换为自由格式并用gfortran编译。问题在于:

T(I,J,K)=((R*DR*T(I+1,J,K)*(YZ)**2.0)-((T(I+1,J,K)+T(I-1,J,K))*  &
 (R*YZ)**2.0)-((T(I,J+1,K)+T(I,J-1,K))*(ZR**2.0))-((T(I,J,K+1)+   &
 T(I,J,K-1))*(R*RY)**2.0))/((R*DR*(YZ)**2.0)-(2.0*(R*YZ)**2.0)-   &
 (2.0*(ZR)**2.0)-(2.0*(R*RY)**2.0))

gfortran错误消息是: “错误:在(1)的分配中,0级和1级不兼容” (1)指定LHS上的“T”。显然,T(I,J,K)是秩0的缩放器。在RHS的某个地方,你有一个等级1的数组 - 由Azrael3000识别为“R”。

P.S。我建议使用“隐式无”并输入所有变量。隐式类型是有害的,例如,它允许编译器接受变量名中的拼写错误。

答案 2 :(得分:0)

您的问题来自您尝试执行的阵列操作。

如果你简化了这一行:

  T(I,J,K)=((R*DR*T(I+1,J,K)*(YZ)**2.0)-((T(I+1,J,K)+T(I-1,J,K))*
 +(R*YZ)**2.0)-((T(I,J+1,K)+T(I,J-1,K))*(ZR**2.0))-((T(I,J,K+1)+
 +T(I,J,K-1))*(R*RY)**2.0))/((R*DR*(YZ)**2.0)-(2.0*(R*YZ)**2.0)-
 +(2.0*(ZR)**2.0)-(2.0*(R*RY)**2.0))

您最终可能会显示同样的错误:

T(I,J,K)= T(I,J,K-1)*R


The shapes of the array expressions do not conform.   [T]

所以你可以看到你的问题来自于尝试将数组R分配给标量T(I,J,K)。