ISPACK は石岡@京大理さん作のFOTRAN77による数値計算ライブラリーです。 Ruby-ISPACKはISPACKをRubyで使えるようにしようとするものです。
ruby-ispack-0.4.5.tar.gz (2011-08-17)
ruby本体のコンパイラと同系列のもの(gccとgfortranなど)でコンパイルしたものの方が、 インストールがうまくいきやすい、と思います。
$ tar zxvf ruby-ispack-0.?.tar.gz
$ ruby extconf.rb --with-フォートランコンパイラ名
その他オプションを付加する必要があるかもしれません。例:
$ ruby extconf.rb --with-gfortran --with-ispack-name=ispack --with-ispack-lib=/usr/local/lib
うまくいくMakefileができないかもしれません。 うまくいかない場合はsample/以下にサンプルをおいていますので 参考にしてください。
$ make
$ sudo make install
makeがうまくいくと ispack_raw.o, ispack_raw.so ができます。 これが下位ラッパーで、rubyとF77ライブラリの橋渡しをする部分。 make install で所定のディレクトリにインストールされます。
rubyスクリプト内で require "ispack_raw.so" とすれば 使えるようになります。 例えばFortranで
CALL STSRVA(MM,JM,IM,S,U,V,P,Q,R,IT,T)
としていた部分は
u,v = ISPACK::stsrva(mm,jm,im,s,p,q,r,it,t)
といったようになります。
下位ラッパーだけでは使いにくいので下位ラッパーを使うための クラスを作っています。lib/numru/ispack.rb です。 rubyスクリプト内で require "numru/ispack" とすれば 使えるようになります。 上の例では、まず
st = STPACK.new(mm,jm,im)
とSTPACKクラスのインスタンスを定義し、
u,v = st.srva(s)
とすることができます。こうすれば作業変数等が隠蔽され、自分で 変数を用意する必要がなくなります。
sample/以下に置いてあります。
test_c2pack.rb : ベナール対流ができます。 本家のsample/2D-channel/benard.f と同じ。 test_n2pack.rb : 双子渦が合体します。 本家のsample/2D-plane/model2d.f と同じ。 test_sppack.rb : 球面浅水モデル(絵は出ない)。 本家のsample/shallow-water-sphare/model.f と同じ。