![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
fortranの質問です。
integer ix,iy,maxX,maxY
で宣言しており、
do istep=1,100
call B_DIF(☆)
do ix=0,maxX
do iy=0,maxY
B_M(ix,iy)=B_P(ix,iy)
end do
end do
end do
のルーチンで悩んでいます。
B_DIFは
B_P(ix,iy)=K(係数のことです)*B_M(ix,iy)+B_M(ix+1,iy)-B_M(ix-1,iy)
といった感じのサブルーチンです。functionで表していないのは、ややこしい関数があるので、サブルーチンでまとめてメインに返すという手法をとっています。ご了承下さい。
ここで、B_P(☆)の☆には何を入れると適切に動くと思いますか?
☆に
データix,iyを入れるだけで意とするB_P(ix,iy)がでてくるのか、
それとも、ix,iy,B_Mのデータを受け渡すべきか・・
一番の問題は、
B_P(ix,iy)=K(係数のことです)*B_M(ix,iy)+B_M(ix+1,iy)-B_M(ix-1,iy)
にix,iyを送ったとき、B_M(ix+1,iy)などが意図する値を吐いてくれるのかということです。
ix=1,iy=2でB_DIFのルーチンにおいて、
B_P(1,2)=K(係数のことです)*B_M(1,2)+B_M(2,2)-B_M(0,2)
とパソコンが読み取ってくれるのか疑問です。
ちなみに、B_M(1,2)、B_M(2,2)、B_M(0,2)は既知の値です。
頭がこんがらがって、どうすべきかわかりません。
2次元配列の添字の継承・・
よろしくお願いします。
No.4ベストアンサー
- 回答日時:
一応「common ブロックで渡す」と書いたけど, 明らかにそんなことをしない方がいいです. あとでプログラムを見たときに苦しむこ
とが目に見えているので, 素直に引数で渡してください.No.3
- 回答日時:
「B_P(☆)の☆には何を入れると適切に動くと思いますか」の B_P は B_DIF のことでしょうか? もしそうなら, 「どのような」 (what), 「どのように」 (how) 情報を渡す必要があるのかを決めることになります. まず what については, 必要な情報は K, B_P, B_M, maxX, maxY の 5つでしょうか. それはいいんですが, 次に how の方は, 思い付くのは「引数で渡す」と「common ブロックで渡す」の 2通り. どちらがお好み?
あと, 配列の定義のときは副プログラムなら整合配列 (って言うんだっけ?) が使えるはずですし, メインプログラムでも (Fortran なら) allocatable 属性を付けて定義してから適当な大きさで allocate すればいいはず>#2.
#1, #2 では「Fortran の勉強」と言われてますが, なんとなくこれは「Fortran の勉強」ではすまないような感じがします. もっとはっきりいうと「(言語の問題ではなく) プログラムを組めない」という感じがします.
この回答への補足
>思い付くのは「引数で渡す」と「common ブロックで渡す」の 2通り. どちらがお好み?
引数で渡す方が好きです。ってか前者しかできません。
common ブロックはやり方がわかりません。(テキスト読んでも??な感じでした)覚えたいとは思っているのですが・・とっかかりが無く、習得できそうな気がしません。便利だとは思うんですけどね。
commonを使ったコードあったら教えてもらえると、嬉しいです。
勉強に役立てたいと思います。
No.2
- 回答日時:
前回の質問からあまり変わっていないようですが、FORTRANの文法は読まれましたか?
●do istep=1,100 のistepはどの計算で使うのですか?
この値をB_Difの中で使うのであれば渡す必要がありますが、どこにも書かれていません。
(Kの値が istep で変わる場合は istep も渡す必要あり)
●B_DIFF呼び出しの例(未検証) 関連部分のみ記載
注:maxX,maxY の値が定数なら xxxx,yyyy は maxX、maxY の値にする
変数なら、取り得る最大の値にする
real*8 B_P(xxxx, yyyy)
real*8 B_M(xxxx, yyyy)
・・・
call B_DIF(B_P, B_M, maxX, maxY)
・・・
subroutine B_DIFF(B_P, B_M, ixmax, iymax)
real*8 B_P(xxxx, yyyy)
real*8 B_M(xxxx, yyyy)
do ix=0,ixmax
do iy=0,iymax
B_P(ix,iy)=K * B_M(ix,iy) + B_M(ix+1,iy) - B_M(ix-1,iy)
end do
end do
●xxxx,yyyyが大きすぎてエラーになる場合は、配列の要素毎に渡してください。
・二次元配列の要素で計算に必要な値を渡す。
・計算結果は1つなのでfunctionが使える
B_P(ix,iy) = B_DIF( B_M(ix,iy), B_M(ix+1,iy), B_M(ix-1,iy) )
・・・
real*8 function B_DIF(a, b, c)
B_DIF = K * a + b - c
return
end
この回答への補足
●do istep=1,100 のistepはどの計算で使うのですか?
すいません、書くの忘れてました。
if (mod(istep,nwrite).eq.0) then
ic=ic+1
って感じで使っています。
nwrite刻みでファイル出力する形をとっています。
nwriteはintegerで定数定義しています。
上記の後に、
isen=ic/1000
ihun=mod((ic/100),10)
iten=mod((ic/10),10)
ione=mod(ic,10)
*
ofile='temp.'//char(48+isen)
&//char(48+ihun)//char(48+iten)//char(48+ione)
write(6,*) ic,ofile
open(16,status='unknown',file=ofile)
が続きます。
No.1
- 回答日時:
何がしたいのか・・・
subroutineにしてもfunctionにしても、
副関数で定めた引数を渡さないとダメですよ。
>パソコンが読み取ってくれるのか疑問です。
ためしてみました?
おそらくFortranの基礎がまったくわかっていないのが問題です。
勉強しなおしてください。
この回答への補足
試しました。
うまく動作しない!!との事実だけがわかりました。
で、デバック作業してるんですが、、、
正直、B_P(ix+1,iy),B_P(ix,iy)とかを別途、functionで定義して、それとのやり取りをして、メインに返すのがいいのかなと思ったんですが、それだとごちゃごちゃするので、もっとスムーズに組めるのではないかと思って、皆さんに尋ねています。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 数学 {e^(ix)-e^(-ix)}^2の複素フーリエ級数を求めろという問題が分からないので教えて欲しい 5 2022/12/13 16:56
- 数学 Ix-1I=2を解く時にはx-1=±2を解きます。なのにIx-1I=2xを解くのはなぜ1つ目の例と同 6 2023/04/05 15:10
- 数学 2階線型微分方程式の特殊解 2 2022/05/21 18:37
- 数学 コーシーリーマンの関係式の誘導 2 2022/06/13 10:35
- その他(車) BMW iX(笑) なんでこうなったんですか? 8 2022/11/16 12:34
- 数学 sinh2z=0を満たすz(z=x+iy)を求める問題で、写真の上下の2通りの解法はどちらも正しいで 1 2023/04/11 16:38
- 数学 とある参考書に Ix|≧a ↔x≧aまたはx≦-a とかかれていました これってaが負のとき xは全 2 2022/12/21 13:51
- 数学 『虚数の連続性』 4 2023/01/30 20:25
- 工学 照度の問題 答えが、14.14Ixになります。なぜでしょうか? 選択肢には答えがありません。 問題は 2 2023/04/09 08:50
- 大学・短大 複素関数についての問題です。 x軸、y軸をそれぞれ実軸、虚軸とする複素平面上の点は z=x+iyで与 1 2023/05/10 21:34
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
配列数式の解除
-
2つ以上の変数を比較して最大数...
-
配列で飛び飛びの値を指定して...
-
特定のセル範囲で4文字以上入力...
-
fortranのプログラムで困ってい...
-
行列の積の計算プログラムを教...
-
VB2008: CSV を二次元配列に読...
-
VB.NET2015 サブルーチンの使い方
-
for each の現在の配列ポインタ...
-
クイックソート
-
fortran 渡す値について
-
コンボボックスの記述の簡素化
-
マクロの記録を使用したマクロ...
-
Excel マクロ VBA プロシー...
-
メッセージボックスのOKボタ...
-
教えて下さい
-
ExcelVBAでPDFを閉じるソース
-
ExcelのVBAを使ってタイトル行...
-
特定のPCだけ動作しないVBAマク...
-
UserForm1.Showでエラーになり...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
配列数式の解除
-
2つ以上の変数を比較して最大数...
-
for each の現在の配列ポインタ...
-
配列変数の添字が範囲外ですと...
-
VBA 1次元配列を2次元に追加する
-
特定のセル範囲で4文字以上入力...
-
subの配列引数をoptionalで使う...
-
ListViewで、非表示列って作れ...
-
VB6 配列を初期化したい
-
Excel-VBAの配列「Public Const...
-
配列を任意の数値で埋める方法
-
VBのFunctionで、配列を引数...
-
Dim は何の略ですか?
-
2次元動的配列の第一引数のみを...
-
verilogで配列の任意の8bitを取...
-
エクセルで最小値から0を除く方法
-
VBA Match関数の限界
-
Excel VBA配列をFunctionに渡す
-
VB2008: CSV を二次元配列に読...
-
fortranでのcsvファイルの読み込み
おすすめ情報