2012-02-26 20 views
1

这是我的程序来解决三维圆柱鳍的问题。但是当我在Fortran 6.2中运行此程序时,此错误显示:”错误:数组表达式的形状不符合“

Error: The shapes of the array expressions do not conform. [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 
+0

错误是否给出了行号的任何指示?没有一些更具体的信息,这是有点多的代码来诊断。 – 2012-02-26 19:03:13

+0

更不用说它被写入的方式,它绝对不是实际代码的复制粘贴。评论标志在哪里?程序名不能有空格... – Rook 2012-02-26 19:33:09

+1

@ldigas:正如所写的,它看起来像完全精细的固定源代码形式给我(不看一行开头的空格数,因为这可能是一个神器降价系统)。 – eriktous 2012-02-26 20:38:35

回答

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) = 400400是一个整数,所以你最好使用400.

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错误信息是: “错误:不兼容的行列0和在分配1(1)” 与(1)在LHS指定的 “T”。很明显,T(I,J,K)是等级为0的缩放器。在RHS的某个地方,你有一系列等级1 - 由Azrael3000确定为“R”。

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

+0

人们总是抱怨没有使用'implicit none',虽然他们有一个观点,但在某些情况下,隐式键入可能会很有用。在任何情况下,使用'-Wuninitialized'都必须避免使用隐式类型时的错误(包含在'-Wall'中)。 – steabert 2012-02-27 09:50:32

+0

CAN U请告诉我这个代码是什么意思:“IF(ITER.LT.LAST)GOTO 31” – nafiz27me 2012-06-14 04:37:10

+0

以及如何为ITERATION END添加条件以使ERROR = 0? – nafiz27me 2012-06-14 04:38:35

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)。