2012-02-26 96 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

エラーは行番号を示していますか?これは、より具体的な情報なしで診断するためのコードです。 –

+0

書かれていることは言うまでもありませんが、実際のコードのコピー貼り付けではありません。コメント記号はどこにありますか?プログラム名には空白を入れることはできません... – Rook

+1

@ldigas:書かれているように、私には完璧な細かい固定ソース形式のように見えます(行の先頭に空白の数はありません。マークダウンシステム)。 – eriktous

答えて

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ように、より迅速に書き込むことができますが、より良い、私はすぐにフリーフォーマットにプログラムを変換してのgfortranでそれをコンパイル400.

2

を使用して整数です。問題の行がある:

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をランク付けする" LHS(1)名称 "T" と 。明らかに、T(I、J、K)はランク0のスケーラーです。RHS上のどこかに、Azrael3000によって "R"と識別されるランク1の配列があります。

P.S.私は "暗黙のnone"を使用し、すべての変数を入力することをお勧めします。暗黙の型指定は、変数名の型名をコンパイラが受け入れるようにするなど、悪質なものです。

+0

人々は常に '暗黙のnone'を使用しないことについて文句を言って、彼らはポイントを持っていますが、暗黙の型を持つことが有用な場合もあります。いずれにせよ、 '-Wuninitialized'を使用することは、暗黙の型指定(' -Wall'に含まれています)を使用するときにエラーを避けるために不可欠です。 – steabert

+0

はUは何このコードMEANを教えてくださいすることができます – nafiz27me

+0

「(ITER.LT.LAST)GOTO 31のIF」とどのように私はERROR = 0 FOR反復ENDの条件を追加することができます? – nafiz27me

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)に代入する。