[ English | Japanese ] [ 地球流体電脳倶楽部 / gtool プロジェクト ] [ gtool5 ドキュメント ]

Ruby による Fortran コード自動生成システム

本文書は、Ruby による Fortran コード自動生成システムを概観し、 その具体的な利用方法について記します。


  1. 概説
  2. 保守管理に必要なソフトウェア
  3. 関連ファイル
  4. rb2f90 ファイルの具体例
  5. 既存の rb2f90 ファイルと自動生成 f90 ファイル編集の手順
  6. 新規の rb2f90 ファイルの作成手順
  7. 次元数の最大値を変更するには

概説

Fortran 90 以降では、総称名称 (INTERFACE 文) を用いることで、 ある名称の手続きに対して異なる引数を与えることで、 複数の手続きを呼び出すことが可能です。 gtool4 データ出力用の HisoryPut を例にあげると、 HistoryPut では整数、単精度実数、倍精度実数のデータ型を持つ、 0 〜 7 次元 *1 の配列を引数として受け取ることが可能です。 これは、以下のように 24 (= 3 (型) × 8 (次元数) ) の実体となるサブルーチン (HistoryPut<型><次元数>) を HistoryPut という総称名に設定してるためです。

                       (個別名)
               +---- HistoryPutInt0   ( ..., array, ... )  ! integer:: array
               |---- HistoryPutInt1   ( ..., array(:), ... )
               |----       :
               |
               |----       :
 (総称名)      |---- HistoryPutInt7   ( ..., array(:,:,:,:,:,:,:), ... )
HistoryPut <---+---- HistoryPutReal0  ( ..., array, ... )  ! real:: array
               |---- HistoryPutReal1  ( ..., array(:), ... )
               |----       :
               |
               |----       :
               |---- HistoryPutReal7  ( ..., array(:,:,:,:,:,:,:), ... )
               |---- HistoryPutDouble0( ..., array, ... )  ! real(8):: array
               |----       :
               +---- HistoryPutDouble7( ..., array(:,:,:,:,:,:,:), ... )

しかしながら、 この 24 種のサブルーチンを個別に改良・メンテナンスするのは非常に手間がかかります。 これらサブルーチン群の内部はほぼ同様である (サブルーチンの名称、引数の型、引数の次元数ぐらいしか違わない) ため、これらを自動生成することによって、 メンテナンスコストの低減を図っています。

具体的には、Ruby によって Fortran コードの生成を行っています。 一方で、複雑な Ruby コードから Fortran コードを作成するようにすると、 その Ruby コードのメンテナンスのためのコストを増加させることとなるため、 「Fortran コードとしてもそれなりに読める Ruby コード」 から Fotrtran コードを自動生成できるよう試みています。 そのために Ruby で、いわばマクロとして動作するメソッドを用意し、 それをもちいて 「Fortran コードとしてもそれなりに読める Ruby コード」を作成しています。

なお、このようなマクロを実装するための UNIX 標準ツールとしては C プリプロセッサや M4 マクロプロセッサが良く知られていますが、 上記のような使用に際しては複雑な動作を容易に実装できる点、 そして文法エラー時のエラーメッセージが分かりやすい点などから Ruby を用いています。

保守管理に必要なソフトウェア

上記ドキュメントを保守管理する際には、 以下のソフトウェアが必要となります。

以降では、Ruby を以下のように実行できることを想定して解説します。 システムへのインストールやパスの設定を適切に行ってください。

$ ruby -v
ruby 1.X.X (20XX-XX-XX) ...

関連ファイル

これらのファイルと、Ruby コードによって Fortran コードを生成します。この Ruby コードは、Fortran コードの元となるという意味を込め、拡張子は rb2f90 としています。 一つの rb2f90 ファイルにつき、一つの f90 ファイルが生成されます。

rb2f90 ファイルの具体例

以下では、rb2f90 の具体例として、整数型、単精度実数型、倍精度実数型の データ型を持つ 0 〜 7 次元の配列を引数として受け取るサブルーチン Polymor を提供する polymorphism モジュール (ファイル名 polymorphism.f90) を生成する Ruby コード polymorphism.rb2f90 をサンプルとして紹介します。

まず、Ruby コードと、そのファイルから得られる Fortran コード、 およびその利用例を紹介し、その後に解説を行います。

Ruby コード、Fortran コード、利用例

このコードが記述されたファイルを実行することで、 Fortran コードが標準出力へと出力されます。 ただし、関連ファイルlib-rb2f90-macro.rblib-rb2f90-macro-intrinsic_types.rb が置かれているディレクトリにパスが通っている必要があります。 例えば、/home/user/gtool5/script/rb2f90 に上記の 2 ファイルが置かれているのであれば、 以下のように実行してください。

$ RUBYLIB=/home/user/gtool5/script/rb2f90  ruby  polymorphism.rb2f90 > polymorphism.f90

結果として得られる Fortran コードは以下のようになります。 (400 行強となるため、一部を抜粋しています)。

このファイルを実際に使用してみます。 以下のような主プログラムファイルを用意します。

上記の polymorphism.f90polymorphism-main.f90 を以下のようにコンパイル、実行してみます。

$ gt5frt polymorphism.f90 polymorphism-main.f90
$ ./a.out

その結果、以下のような結果が表示されます。

PolymorInt0 is called
sum=          11
PolymorReal5 is called
sum=   3232.000    
PolymorDouble7 is called
sum=   128128.000000000     

解説

このように、マクロライブラリの使用によって、 様々な型を受け取ることが可能な関数やサブルーチンの作成やメンテナンスを容易に行うことが可能となります。 特に、型の違いに拠らない部分については Fortran コードと全く同様に記述できます。

既存の rb2f90 ファイルと自動生成 f90 ファイル編集の手順

既存の rb2f90 が存在する場合には、 f90 ファイルではなく、rb2f90 ファイルを編集 して下さい。 make コマンドにより、自動的に rb2f90 から f90 ファイルが生成され、 その f90 ファイルのコンパイルを行います。

CVS コミットの注意 (1)

利用者が gtool5 インストール時に Ruby が不要であるよう、 rb2f90 ファイルだけでなく、f90 ファイルもコミットしてください。

新規の rb2f90 ファイルの作成手順

新規に rb2f90 ファイルを作成する場合には、以下のように行ってください。

rb2f90 ファイルの作成

rb2f90 ファイルの具体例 を参考に、rb2f90 ファイルを作成してください。

Makefile の設定

Makefile の以下の部分を編集してください。 (今回は、追加するファイルが new.rb2f90 とします)。

OBJS = new.o

RB2F90 = new.f90

new.f90:$(RUBY) $(RUBYVERCHECK) > /dev/null 2>&1 && \
            $(RUBY) $< --max_dim=$(MAXDIM) > $@ || \
            touch $@

この設定により、make コマンドによって new.rb2f90 -> new.f90 -> new.o が生成されることを確認してください。

CVS コミットの注意 (2)

CVS コミットの注意 (1) を参照ください。

次元数の最大値を変更するには

次元数の 7 は Fortran 90/95 の規格で定められている、 配列の次元数の最大値です。 ただし、処理系によってはそれ以上の次元数に設定することも可能です。 もしもこれよりも大きい次元を設定したい場合には、 configure の際に --with-maxdim に次元数の最大値となる数値を与えてください。


$Id: lib-rb2f90.rd,v 1.6 2009-05-29 16:08:40 morikawa Exp $

*1 次元数の 7 は Fortran 90/95 の規格で定められている、 配列の次元数の最大値です。 ただし、処理系によってはそれ以上の次元数に設定することも可能です。 もしもこれよりも大きい次元を設定したい場合には、 次元数の最大値を変更するには を参照してください。


gtool Development Group / GFD Dennou Staff dcstaff@gfd-dennou.org