[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[dennou-ruby:002293] Re: Ruby-ISPACK 作成中



堀之内です.

# 亀レス第2段

> > どういう設計にするのがいいのかがよく分からないので,もっと適切な方法が
> > ありましたら教えていただければ幸いです.
> 
> ひとつ用意したい(すべき)と考えているものは, 
> Fortran90 版の spml ライブラリと全く同じ命名法と
> 引数でメソッドをそろえたものです. 
> Fortran90 で書かれたモデルと一緒に違和感なく使いたい, という希望です. 
> 多分北村さんの試作品でのメソッド名をきっちり揃えればいいんだと思ってます. 

spml の ee_module をみてみると,今の北村さんの n2pack のラッパー
と,引数は基本的に揃ってますね.ただ,spml では,計算領域の座標
も設定できて,このため微分はちゃんと微分になるようになってるなど,
n2pack のラッパーを越えたものとなってますね.並列で別物として作っ
てもいいし,微分関連以外は結構共通するでしょうから,N2Pack クラ
スのサブクラスとして実現してもいいかもしれません.

Ruby のクラス化ということで,Fotrtan モジュールの集合である SPML 
と同じ呼び方にできないのは次の2点ぐらいでしょう. 

  * 初期化のメソッド名は new である (ee_initialize などとは
    ならない)
  * クラスなので「関数」の前にはオブジェクトがくっつく.
      Fotrtan90:
         call ee_inital(i,j,k,l,xmin,xmax,ymin,ymax)
         eel2 = ee_Lapla_ee(ee)
         yx = yx_ee(ee)
      Ruby:
         eepk =  EEPack.new(i,j,k,l,xmin,xmax,ymin,ymax)
         eel2 = eepk.ee_Lapla_ee(ee)
         yx = eepk.yx_ee(ee)

呼び方は同一ではないですが,対応は規則的ですから,読み替え可能で
はないでしょうか.

なお,クラス化のメリットは,異なるパラメターでの変換を併存させら
れるということです.分解能やグリッドサイズが違う2つの領域での変
換を併存させれらますので,例えば結合モデルを作ることができます.

一方,Ruby の module を使えば Fortran90 のモジュールの使い方に
より近づけることができます.この場合,Fortran90 同様,変換パラメ
ターは1プロセス内でグローバルで一組のみとなります.一組使えれば
十分というプログラムが多いでしょうから,これも作る価値あると思い
ます.

なお,上記のクラスを作っておけば,モジュール化はそれを使って自動
的にできます.モジュール化は以下のようにするだけでOKのはず.
ですから,ともかくまずはクラスさえ作ればいいでしょう.

module EEPACK
  @@eepack = nil
  module_function
  def initialize(*args)
    @@eepack = EEPack.new(*args)
  end
  ['ee_Lapla_ee','yx_ee',..ここにメソッド列挙..].each do |method|
     eval <<-EOS
       def #{method}(*args)
         raise "module not initialized: call EEPACK.initialize" if !@@eepack
         @@eepack.#{method}(*args)
       end
     EOS
  end
end

> しかし, 全く別な, もっと ruby の機能を生かしたくるみ方も
> ありだと思います. それがどのようなものになるのかは
> 初心者の私には想像できませんので, 慣れた方々にお委せしたいです. 

ISPACK に関して言えば,モジュールでなくクラスにするという点だけ
が ruby 的な点で,あとは変ったことは必要ないように思います. 
しかもクラスを作っておくと上に書いたようにモジュールは自動的に作
れますので,困らないのではないでしょうか.

# ところで,SPML のマニュアルは
   http://www.gfd-dennou.org/library/spmodel/ には展開しておいて
   ないんですね.(ダウンロードしないとならなかった)