• 締切済み

fortran:関数副プログラムへ関数の引数 以外の変数を渡すには?

初心者で解説書のどこを見たらよいのかも分からない状態です。キーワードだけでもお願いいたします。 Fortranでプログラムを作っていますが、次のような状況です do i=・・・ do j=・・・ call【既成のライブラリ関数名】(f,・・・) ・・・・・・・ (ほかの処理) ・・・・・・・ end do end do 既成のライブラリ(今は数値積分)の要求する引数の中で1変数の関数名が要求されるのですが、実は今の自分の処理している問題ではfがdoループのカウンタの"i、j"に依存するのです。 実は、fはある行列Hにxで表される量を足したり引いたりした後の逆行列の(i,j)成分です。 だからfの依存性はf(x,i,j)というところです。 この状況でライブラリにfをあたかも積分変数の1変数関数であるかのようにわたすにはどうしたらよいのでしょうか? ご存知の方はよろしくお願いいたします。

みんなの回答

  • yfujii
  • ベストアンサー率17% (14/80)
回答No.2

間に副プログラムg(x,i,j,z)をかませれば計算可能と思います。安易な考えですがとにかく作りたいのであれば試されてはどうでしょうか。帰ってきたzを call【既成のライブラリ関数名】(z,・・・) で使います。 subroutine g(x,i,j,z) c-------- c 入力 :x,i,j c 出力 :z(返値1) c-------- : : c i,jの条件に従って関数f1..fnを呼ぶ if(i.eq.....) then call f1(....) elseif(......) then call f2(....) : endif : return end

toro2000
質問者

お礼

お返事ありがとうございました。 お礼が遅れて大変申し訳ありません。 zに相当するものがそれ自身内部にパラメータをもった関数名z(x)なのです。ライブラリのなかでそれがdoループのカウンタとxに応じて呼び出されxで積分されるはずでした。 お返事を下さった方々にこの場をかりてお礼申し上げます。

  • wolv
  • ベストアンサー率37% (376/1001)
回答No.1

文法はやや適当なので,アルゴリズムだけ参考にしてください. gは配列で,ixはその添え字です. ------------------------------------------------------------ 配列 gの宣言 do i=・・・ do j=・・・ do ix=・・・ g[ix]=f(ix,i,j) end do call 積分(g,添え字の範囲) ・・・・・・・ (ほかの処理) ・・・・・・・ end do end do ------------------------------------------------------------ こんな感じでよろしいでしょうか.

toro2000
質問者

お礼

先ほどはありがとうございました。 どうやらcommon文でうまくいくようです。 でも、この宣言文では、パラメータは渡せないのですね。 結局、副プログラム中にもパラメータを書くことになってしまうのですが、パラメータをいじった結果をしらべる目的のプログラムなので、いちいち主プログラムと副プログラムのパラメータを変更しなければいけないようで、困っています。 もし、よいお知恵をお持ちでしたらまたよろしくお願いします。

toro2000
質問者

補足

すばやいお答えありがとうございます。 でも、多分私の考えている問題ではg[ix]のixにあたるものが連続変数でなければいけないと思うのです。ライブラリの中から呼び出された時に呼び出された時点でのdoループのカウンタの値を使って関数を返してくれなければいけないのです。 説明が悪くて申し訳ありません。 ほかにいい手はないでしょうか・・