アプリ版:「スタンプのみでお礼する」機能のリリースについて

FDTD法を用いた計算の中で遠方界を計算するのにフーリエ変換が必要になり以下のプログラムを作ったのですがコンパイルの際に以下のエラーが出てしまいます。文字の定義もいろいろと変えてやってはいるのですが、なかなかうまくいきません。どなたかわかる方がいらっしゃったら教えて下さい。よろしくお願いします。
plane_yz = dy*dz
fac_yz = plane_yz/(4.0d0*pi*c*dt)
ie = nx-6
i = ie+1
do j = 5, ny-5
do k = 5, nz-5
x = (i-0.5d0-ic)*dx
y = (j-jc)*dy
z = (k-kc)*dz
eys = 0.5d0*(ey(i,j,k)+ey(i,j,k+1))
ezs = 0.5d0*(ez(i,j,k)+ez(i,j+1,k))
hys = 0.25d0*(hy(i,j,k)+hy(i,j+1,k)+hy(i-1,j,k)+hy(i-1,j+1,k))
hzs = 0.25d0*(hz(i,j,k)+hz(i,j,k+1)+hz(i-1,j,k)+hz(i-1,j,k+1))
do l = 1, nang
time_e = time-dt
time_h = time-dt/2.0d0
timesh = -(dirs(l,1)*x+dirs(l,2)*y+dirs(l,3)*z)/c+rf/c
tc_e = time_e+timesh
tc_h = time_h+timesh
m_e = int(tc_e/dt+0.5d0)
m_h = int(tc_h/dt+0.5d0)
a_e = (0.5d0+tc_e/dt-m_e)*fac
b_e = (0.5d0-tc_e/dt+m_e)*fac
ab_e = a_e-b_e
a_h = (0.5d0+tc_h/dt-m_h)*fac
b_h = (0.5d0-tc_h/dt+m_h)*fac
ab_h = a_h-b_h
wy(l,m_h-1) = wy(l,m_h-1)-hzs*b_h
wz(l,m_h-1) = wz(l,m_h-1)+hys*b_h
uy(l,m_e-1) = uy(l,m_e-1)+ezs*b_e
uz(l,m_e-1) = uz(l,m_e-1)-eys*b_e
wy(l,m_h) = wy(l,m_h)-hzs*ab_h
wz(l,m_h) = wz(l,m_h)+hys*ab_h
uy(l,m_e) = uy(l,m_e)+ezs*ab_e
uz(l,m_e) = uz(l,m_e)-eys*ab_e
wy(l,m_h+1) = wy(l,m_h+1)+hzs*a_h
wz(l,m_h+1) = wz(l,m_h+1)-hys*a_h
uy(l,m_e+1) = uy(l,m_e+1)-ezs*a_e
uz(l,m_e+1) = uz(l,m_e+1)+eys*a_e
enddo
enddo
enddo

コンパイル後timesh = -(dirs(l,1)*x+dirs(l,2)*y+dirs(l,3)*z)/c+rf/c
1
Error: Unexpected array reference at (1)
In file far_field.f90:48

wy(l,m_h-1) = wy(l,m_h-1)-hzs*b_h
1
Error: Unexpected array reference at (1)
In file far_field.f90:49

wz(l,m_h-1) = wz(l,m_h-1)+hys*b_h
1
Error: Unexpected array reference at (1)
In file far_field.f90:50

uy(l,m_e-1) = uy(l,m_e-1)+ezs*b_e
1
Error: Unexpected array reference at (1)
In file far_field.f90:51
と続きます。

A 回答 (5件)

m_e とか m_h には parameter 属性が付いているので, 後で代入なんてできるわけがありません. そもそもこいつらは「配列の大きさ」を決める定数なんだから, 後で (しかもループの中で) 変更する意味など微塵もないはず.


で, 実際のところ「配列の大きさ」をどうしたいの?

この回答への補足

回答ありがとうございました。m_e, m_hにparameter属性を付けていたのが間違いでした。parameter属性を外してそれぞれm_e(500,500),m_h(500,500)としたらうまくコンパイルできました。内容がちゃんとできているかどうかは心配ですが。ご指摘ありがとうございました。まだまだFortranの知識が足りないようです。

補足日時:2009/12/21 17:34
    • good
    • 0

ついでですが, 「無駄な大きさにしたくない」というなら


allocatable属性 + allocate文
を視野に入れるべき.
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。allocatable属性+allocate文 についても参考にいろいろ組み込んでみたいと思います。

お礼日時:2009/12/22 08:57

#1 でも言われていますが, 使っているすべての変数の定義を示してください. この部分だけでは正しいかどうか判断できません.

この回答への補足

すみません、宣言文の部分も見せなければわかりませんよね。失礼しました。
以下のように宣言しています。
integer, parameter :: nang = 400
integer, parameter :: l = 500
real(8) :: dirs(l,3)
integer, parameter :: m_e = 400, m_h = 400
integer :: ic, jc, kc
real(8) :: rf
real(8) :: x, y, z
real(8) :: exs, eys, ezs
real(8) :: hxs, hys, hzs
real(8) :: time_e, time_h, timesh
real(8) :: tc_e, tc_h
real(8) :: a_e, b_e, ab_e, a_h, b_h, ab_h
real(8) :: wx(l,m_h), wy(l,m_h), wz(l,m_h)
real(8) :: ux(l,m_e), uy(l,m_e), uz(l,m_e)

このように宣言すると今度は以下の様なエラーが出ました。

In file far_field.f90:40

m_e = int(tc_e/dt+0.5d0)
1
Error: Expected 'm_e' at (1) to be a VARIABLE
In file far_field.f90:41

m_h = int(tc_h/dt+0.5d0)
1
Error: Expected 'm_h' at (1) to be a VARIABLE
In file far_field.f90:81

m_e = int(tc_e/dt+0.5d0)
1
Error: Expected 'm_e' at (1) to be a VARIABLE
In file far_field.f90:82

m_h = int(tc_h/dt+0.5d0)
1

宣言文をかえると宣言文のファイルがエラーになり、宣言文がうまくコンパイルできると今度は実際のプログラムがエラーになってしまいます。
すみません。よろしくお願いします。

補足日時:2009/12/21 16:27
    • good
    • 0

こんにちは


#1です
三次元配列なんてボケをかましてしまいました..

>dirs()

ですね。

この回答への補足

回答ありがとうございます。>dirs() とはどういう意味でしょうか?すみません、理解が足りなくて。

補足日時:2009/12/21 16:14
    • good
    • 0

こんにちは


 三次元配列(要素が3つ)を使用されていますが、この配列に対する宣言はどのように?
 エラーは配列の添え字があらかじめの約束と違う(聞いてないよ!)と云っていますね(^^;
※配列の添え字のエラーは48行目で初めて起こったようですよ..
    • good
    • 0
この回答へのお礼

エラーの内容わかりやすく説明いただきありがとうございました。非常に理解の参考になりました。

お礼日時:2009/12/22 08:59

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!