こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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

投稿日時 - 2008-02-26 13:12:46

QNo.3811162

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

> コンパイラーは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() の合計値に置き換えてやればいいような気がします。
ただし計算式の元となる理論は皆目わかりませんので、理屈には合ってないかもしれません。

投稿日時 - 2008-02-27 03:14:02

ANo.2

申し訳ないけど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)

こっちはどういう意味の計算なのか見当がつきません。

投稿日時 - 2008-02-26 16:58:16

お礼

度々ありがとうございます。
コンパイラーはMicrosoft Developer Studio
というFORTRANソフトについていたものを使用しています。
どういった環境というのはパソコン環境のことでよろしいのでしょうか?
初心者なものですいません。

投稿日時 - 2008-02-26 17:15:57

ANo.1

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 と書いてもなにを加算するのか、と言う話。

たぶんどこかから拾ってきたと思うんだけど、
写し間違いとかしてるんじゃないかな。
あるいはコンパイラの違いが問題とか。

投稿日時 - 2008-02-26 15:22:29

お礼

ありがとうございます。
121で計算したFBを入れたいのですが、
どうすればうまくいくのでしょうか。

投稿日時 - 2008-02-26 16:24:18

あなたにオススメの質問