- 締切済み
FORTRANプログラミング、1質点系地震動弾塑性応答解析
FORTRAN77で地震動応答解析を行なっています。 弾塑性応答解析なのですが、このプログラムだとコンパイルエラーが発生してしまいます。 文番号124、125、126のSA(I)にassignment between arrays of differing rankというエラーメッセージが出てきます。 どこを改善すればよいでしょうか。 OSはWINDOWS XPです。宜しくお願いします。 SUBROUTINE SOSEI(W,H,NN,AMAX,SD,QB,E,VE,VD,ED,WH,QY,DT) ! DIMENSION IM(10),IQ(10) DIMENSION QB(10000),SA(50000),SV(10000),SD(10000) DIMENSION FB(2000),FC(2000),FX(2000) ! REAL SA,SV,SD,QB,K1,K2,E,VE,VD,ED,QY ! ! X12=4. X34=3. SD1=X12 SD2=X34 SD3=SD1+SD2 XBE=3. !降伏変位 SDM=XBE K1=W*W K2=K1/10 SSA=K1*980 SSV=SSA/W SSD=SSV/W ! ! ! DO 30 I=1,NN DO 20 IL=1,NN IF(SSV.LT.0.AND.ABS(SSD-SD3).GT.SDM) GOTO 110 !SD3=SD1+SD2=X1,2正+X3,4負 塑性変形量 SDM=Xbe 弾性限変形 IF(ABS(SSD).GT.SDM.AND.SSV.GT.0.) GOTO 111 IF(ABS(SSD-SD1).LT.SDM) GOTO 112 !IQは変数 IF(ABS(SSD-SD3).LT.SDM) GOTO 113 ! ! ! ! IM(IL)=0 !弾性 GOTO 114 ! 110 IM(IL)=-1 !弾性~塑性(-) IQ(IL)=-1 !位置 GOTO 117 ! 111 IM(IL)=1 !弾性~塑性(+) IQ(IL)=1 GOTO 115 ! 112 IM(IL)=2 !塑性~弾性(+) IQ(IL)=2 GOTO 116 ! 113 IM(IL)=-2 !塑性~弾性(-) IQ(IL)=-2 GOTO 118 ! ! ! ! 114 QB(IL)=K1*SSD !0~1 ! 115 QB(IL)=(K1-K2)*SDM+K2*SSD !1~2 ! 116 QB(IL)=-(K1-K2)*SD1+K1*SSD !2~3 ! 117 QB(IL)=-(K1-K2)*SDM+K2*SSD !3~4 ! 118 QB(IL)=-(K1-K2)*SDM+K1*SSD !4~5 ! ! ! 20 CONTINUE ! 30 CONTINUE ! ! M=1. WE=SQRT(K1/M) WP=SQRT(K2/M) W2E=WE*WE !弾性 W2P=WP*WP !塑性 HWE=H*WE SA(1)=0. SV(1)=0. SD(1)=0. ! ! ! 121 FB=-(W2E-W2P)*SD1 !弾性 ! 122 FC=(W2E-W2P)*SDM !塑性 (SV>0) ! 123 FX=-(W2E-W2P)*SDM !塑性 (SV<0) ! ! DO 300 I=2,NN ! IF(IM(IL).EQ.0) GOTO 124 IF(IM(IL).EQ.1.AND.IQ(IL).EQ.1) GOTO 125 IF(IM(IL).EQ.-1.AND.IQ(IL).EQ.-1) GOTO 126 IF(IM(IL).EQ.2.AND.IQ(IL).EQ.2) GOTO 125 IF(IM(IL).EQ.-2.AND.IQ(IL).EQ.-2) GOTO 126 ! 124 A1=1+(HWE*DT)+((DT**2)/6)*W2E !弾性 A2=(HWE*DT)+((DT**2)/3)*W2E A3=(2*HWE)+(DT*W2E) SA(I)=(-1./A1)*(AMAX+A2*SA(I-1)+A3*SV(I-1)+W2E*SD(I-1)+FB) SV(I)=SV(I-1)+(DT/2)*SA(I-1)+(DT/2)*SA(I) SD(I)=SD(I-1)+DT*SD(I-1)+((DT**2)/3)*SA(I-1)+((DT**2)/6)*SA(I) GOTO 127 ! 125 A1=1+(HWE*DT)+((DT**2)/6)*W2P !塑性 (SV>0) A2=(HWE*DT)+((DT**2)/3)*W2P A3=(2*HWE)+(DT*W2P) SA(I)=(-1./A1)*(AMAX+A2*SA(I-1)+A3*SV(I-1)+W2E*SD(I-1)+FC) SV(I)=SV(I-1)+(DT/2)*SA(I-1)+(DT/2)*SA(I) SD(I)=SD(I-1)+DT*SD(I-1)+((DT**2)/3)*SA(I-1)+((DT**2)/6.)*SA(I) GOTO 127 ! 126 A1=1+(HWE*DT)+((DT**2)/6)*W2P !塑性 (SV<0) A2=(HWE*DT)+((DT**2)/3)*W2P A3=(2*HWE)+(DT*W2P) SA(I)=(-1./A1)*(AMAX+A2*SA(I-1)+A3*SV(I-1)+W2E*SD(I-1)+FX) SV(I)=SV(I-1)+(DT/2)*SA(I-1)+(DT/2)*SA(I) SD(I)=SD(I-1)+DT*SD(I-1)+((DT**2)/3)*SA(I-1)+((DT**2)/6)*SA(I) GOTO 127 ! ! ! 127 E=SD(I)*AMAX VE=SQRT(2.*E) VD=VE/(1.+(3.*H)+(1.2*SQRT(H))) ED=(VD**2)/2. WH=E-ED QY=W*VD ! ! 300 CONTINUE RETURN END
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- sakusaker7
- ベストアンサー率62% (800/1280)
> コンパイラーはMicrosoft Developer Studio > というFORTRANソフトについていたものを使用しています。 > どういった環境というのはパソコン環境のことでよろしいのでしょうか? > 初心者なものですいません。 んー Developer Studio というのはFortranコンパイラそのものの名前ではないです。 本来MicrosoftではC/C++とかVisual BASICをそこに含めて販売しているのですが、 たとえば Intel Fortran なんかをあとからインストールして、それを Developer Studioから もともとあったもののように使えるのです。 環境云々ですが、 ・プログラムは基本的に非常に古いスタイルで書かれている ・にもかかわらず標準には最近入ったような機能(配列に対する一括代入)を使っている ということで、質問にあるプログラムは質問者さんが0から作ってきたものではなくて どこかにあるものを持ってきたとか、書籍の記述を参考にしたのではないかと 思っているのですが違いますか? で、あるミニコン用のFortarn向けに書かれたものとか、汎用機で使ってたものが元だという話だと、 それぞれの拡張機能を使っていたりするとそのままではWindowsとかでコンパイルできない可能性がある。 ということです。 SA(I)=(-1./A1)*(AMAX+A2*SA(I-1)+A3*SV(I-1)+W2E*SD(I-1)+FB) 多分、ですが、+FBの部分を FB() の合計値に置き換えてやればいいような気がします。 ただし計算式の元となる理論は皆目わかりませんので、理屈には合ってないかもしれません。
- sakusaker7
- ベストアンサー率62% (800/1280)
申し訳ないけどFORTRANからは引退した状態なんで詳しくはわからないのだけど、 少なくともわたしの試したコンパイラ(GNU Fortran) では あなたのいう場所以外に 121 FB=-(W2E-W2P)*SD1 ^ Expression at (^) has incorrect data type or rank for its context hoge.f:87: ここでもうエラーが出てます。 配列が演算対象だったときに特別扱いがあったような なかったような気はするのですが、 この辺はFORTRANコンパイラの仕様にもよるんじゃないでしょうか? 少なくとも、あなたが今使っていてエラーになるコンパイラの 名前と、このプログラムの出自(どういった環境で使われていたものなのか)が 明確にならないとなんともいえませんし、 ロジックの修正となると、このプログラムを読み解くのは 勘弁願いたいです :) 121 FB=-(W2E-W2P)*SD1 122 FC=(W2E-W2P)*SDM 123 FX=-(W2E-W2P)*SDM これらは、左辺の配列の要素すべてを右辺の結果で埋めるのかという気がしますが SA(I)=(-1./A1)*(AMAX+A2*SA(I-1)+A3*SV(I-1)+W2E*SD(I-1)+FB) こっちはどういう意味の計算なのか見当がつきません。
- sakusaker7
- ベストアンサー率62% (800/1280)
FORTRANはいい加減忘れかけてるけど エラーの場所が違ったりしない? hoge.f: In subroutine `sosei': hoge.f:84: 121 FB=-(W2E-W2P)*SD1 ^ Expression at (^) has incorrect data type or rank for its context hoge.f:87: 122 FC=(W2E-W2P)*SDM ^ Expression at (^) has incorrect data type or rank for its context hoge.f:90: 123 FX=-(W2E-W2P)*SDM ^ Expression at (^) has incorrect data type or rank for its context hoge.f:105: SA(I)=(-1./A1)*(AMAX+A2*SA(I-1)+A3*SV(I-1)+W2E*SD(I-1)+FB) 12 Arithmetic operator at (1) must operate on two scalar (not array) subexpressions, two function invocations returning arithmetic scalars, or a combination of both -- but the subexpression at (2) is an array hoge.f:113: SA(I)=(-1./A1)*(AMAX+A2*SA(I-1)+A3*SV(I-1)+W2E*SD(I-1)+FC) 12 Arithmetic operator at (1) must operate on two scalar (not array) subexpressions, two function invocations returning arithmetic scalars, or a combination of both -- but the subexpression at (2) is an array hoge.f:121: SA(I)=(-1./A1)*(AMAX+A2*SA(I-1)+A3*SV(I-1)+W2E*SD(I-1)+FX) 12 Arithmetic operator at (1) must operate on two scalar (not array) subexpressions, two function invocations returning arithmetic scalars, or a combination of both -- but the subexpression at (2) is an array >124 A1=1+(HWE*DT)+((DT**2)/6)*W2E !弾性 じゃなくてその下の > SA(I)=(-1./A1)*(AMAX+A2*SA(I-1)+A3*SV(I-1)+W2E*SD(I-1)+FB) でエラーになってると思うのだけど。 で、これだとすると最後にあるFBが配列なので、 ほげほげ + FB と書いてもなにを加算するのか、と言う話。 たぶんどこかから拾ってきたと思うんだけど、 写し間違いとかしてるんじゃないかな。 あるいはコンパイラの違いが問題とか。
お礼
ありがとうございます。 121で計算したFBを入れたいのですが、 どうすればうまくいくのでしょうか。
お礼
度々ありがとうございます。 コンパイラーはMicrosoft Developer Studio というFORTRANソフトについていたものを使用しています。 どういった環境というのはパソコン環境のことでよろしいのでしょうか? 初心者なものですいません。