Scilab で g95 を使用する

Scilab で g95 を使用する
クイックリンク:

「link()」による dll のロード
モジュール手順
Scilab での Fortran とのインターフェース

トップに戻る
「link()」による dll のロード
Scilab ( www.scilab.org ) は、Matlab に似た無料の数値計算パッケージです。このページでは、Scilab 4.0 で Fortran プロシージャにアクセスする方法について説明します。

Scilab ヘルプでは、’fort’ キーワードの下に、次の Fortran サブルーチンが例として提供されています:

サブルーチン foof(c,a,b,n,m)
整数 n,m
倍精度 a(*),b,c(*)
do 10 i=1,m*n
c(i) = sin(a(i) )+b
10 継続
終了
次のコマンドの作業環境は、Windows の Msys シェルです。コードを foof.f90 として保存し、g95 でコンパイルします。

$ g95 -c foof.f90
サブルーチン名がどのように「装飾」されているかを確認するには、次のように入力します。

$ dlltool -z foof.def –export-all-symbols foof.o
$ cat foof.def
;c:\mingw\bin\dlltool.exe -z foof.def –export-all-symbols foof.o
EXPORTS
foof_ @ 1
サブルーチン名の末尾にアンダースコアが追加されていることに注意してください。サブルーチンのエントリ ポイントは「foof_」です。Scilab は外部手続き名の末尾にアンダースコアがあることを想定しており、g95 はデフォルトでこれらを非モジュール手続き名に追加します。

Linux では、Scilab ‘link()’ はオブジェクト ファイルを処理できますが、Windows システムでは、Scilab で使用するためにオブジェクト ファイルを dll としてコンパイルする必要があります。それは以下で行われます:

$ g95 -shared -mrtd -o foof.dll foof.o foof.def
.def ファイルの使用はオプションですが、ここでは Fortran サブルーチンが Scilab でどのように動作するかを説明するために使用されました。dll は Scilab 作業ディレクトリにある必要があります.

Scilab での結果
__________________________________________________________
scilab-4.0
Copyright (c) 1989-2006
Consortium Scilab (INRIA, ENPC)
__________________________________________________________

スタートアップ実行:
初期環境の読み込み
–>cd c:\work;
–>link(“foof.dll”,”foof”);
共有アーカイブがロードされました
リンク完了
–>a=[1,2,3;4,5,6];b= %pi;
–>[m,n]=サイズ(a);
–>// 入力:
–>// a は位置 2 で倍精度
–>// b 3 倍精度
–>// n 4 整数
–>// m 5 整数
–>
–>/ / 出力:
–>// c は位置 1 にあり、サイズ [m,n] の double
–>c=call(“foof”,a,2,”d”,b,3,”d”,n ,4,”i”,m,5,”i”,”out”,[m,n],1,”d”);
–> c
c =

3.9830636 4.0508901 3.
–>
トップに戻る
モジュール手順
モジュール プロシージャが g95 でコンパイルされると、末尾のアンダースコアがプロシージャ名に追加されません。モジュール プロシージャを g95 で動作させるには、プロシージャ名に末尾のアンダースコアを付ける何らかの方法が必要です。それを実行し、Scilab でモジュール プロシージャにアクセスするいくつかの方法を以下に概説します。

1. bind(c) を使用する
bind(c) を使用すると、Fortran プロシージャに任意の名前を割り当てることができます。これにより、Scilab によってロードされるプロシージャの名前に末尾のアンダースコアを付けるための、洗練された標準準拠の方法が提供されます。

モジュール foo に はサブルーチン foof(c,a,b,n,m) bind(c, name=’foof_’) :: foof integer n,m double precision a(*),b,c(*) do 10 i=
が含まれます1,m*n c(i) = sin(a(i))+b 10 継続 終了サブルーチン終了モジュール

 

 

 

bind(c) 行をコードに追加すると、モジュール プロシージャを Scilab にロードして、非モジュール サブルーチンと同じように使用できます。この例の Scilab の結果は、上記と同じです。

2. .def ファイルを使用する
このコードを「foofm.f90」として保存します。

モジュール fooにはサブルーチン foof(c,a,b,n,m) が
含まれます 整数 n,m 倍精度 a(*),b,c(*) do 10 i=1,m*n c(i) = sin(a (i))+b 10 終了サブルーチン終了モジュール fooを続行します。

 

 

 

モジュールをコンパイルします。

$ g95 -c foofm.f90
次に、dlltool を使用して .def ファイルを作成します。

$ dlltool -z foofm.def –export-all-symbols foofm.o
.def ファイルでは、シンボルが dll でどのように識別されるかを制御できます。テキスト エディタで .def ファイルを開くか、次の操作を行います。

$ cat foofm.def
; c:\mingw\bin\dlltool.exe -z foofm.def –export-all-symbols foofm.o
EXPORTS
foo_MP_foof @ 1
g95 では、接頭辞 “foo_MP_” がプロシージャ名に追加されていることに注意してください。

テキスト エディターでファイル foofm.def を開き、次のように編集して、末尾にアンダースコアを付けたモジュール プロシージャ名のエイリアスを作成します。

;
EXPORTS
foo_MP_foof@1
foof_ = foo_MP_foof@1
dll をコンパイルするとき、コマンド ラインに新しく編集されたバージョンの foofm.def を含めます。

$ g95 -shared -mrtd -o foofm.dll foofm.o foofm.def
.def ファイルでモジュール プロシージャ名のエイリアスを定義し、エイリアスの末尾にアンダースコアを付け、g95 で dll としてコンパイルすると、モジュール プロシージャを Scilab にロードできます。

3. プロシージャ名の末尾にアンダースコアを追加する
もう 1 つのオプションは、Fortran ソース コード内のプロシージャ名に末尾のアンダーコアを追加することです。コードを dll にコンパイルし、<module-name>_MP_<procedure-name> から末尾のアンダースコアを引いた名前で Scilab のプロシージャを呼び出します。コード例は次のようになります。

モジュール fooにはサブルーチン foof_(c,a,b,n,m) が
含まれます 整数 n,m 倍精度 a(*),b,c(*) do 10 i=1,m*n c(i) = sin(a (i))+b 10 終了サブルーチン終了モジュール fooを続行します。

 

 

 

前と同じようにモジュールをコンパイルし、”foo_MP_foof” という名前を使用して Scilab のサブルーチンにアクセスします。これは、Scilab 内から g95 でコンパイルされたモジュール プロシージャにアクセスするための、おそらくあまり洗練されていない別の方法です。

トップに戻る
Scilab での Fortran とのインターフェース
以下の例では、別のサブルーチンがモジュール ‘foo’ に追加されており、g95 で dll としてコンパイルされ、Scilab にロードされています。2 番目のサブルーチンは、実数配列 c (Scilab では c1) を引数 ‘s’ および ‘ch’ と共に出力します。’s’ 引数は実数スカラーで、’ch’ の型は character(len=4) です。

モジュール foo にはサブルーチン foof(c,a,b,n,m) bind(c, name=’foof_’) :: foof integer n,m double precision a(*),b,c(*) do 10 i=

が含まれます1,m*n c(i) = sin(a(i))+b 10 継続 end サブルーチンサブルーチン foofsum(c,a,b,n,m,s,ch) bind(c, name=’foofsum_’) :: foofsum integer n,m character(len=4) :: ch real :: a(*),b,c(*),s s=0.0 do 10 i=1,m*n c(i) = sin (a(i))+b s = s+c(i) 10 続行 ch = 「完了」サブルーチン終了

 

 

 

 

 

 

 

 

 

モジュール foo を終了
上記のコードを「foo.f90」として保存します。コンパイル:

g95 -c foo.f90
g95 -共有 -mrtd -o foo.dll foo.o
Scilabの結果:
__________________________________________________________
scilab-4.0
Copyright (c) 1989-2006
Consortium Scilab (INRIA, ENPC)
__________________________________________________________
起動実行:
初期環境の読み込み
–>cd c:/work;
–>foosubs=[ “foof”,”foofsum” ];
–>link(“foo.dll”,foosubs);
共有アーカイブがロードされました
リンク完了
–>a=[1,2,3;4,5,6];b= %pi;
–>[m,n]=サイズ(a);
–>// サブルーチン “foof” では、
–>// a が位置 2 で倍精度
–>// b が位置 3 で倍精度
–>// c が位置 1 でサイズ [ m,n]
–>//
–>c=call(“foof”,a,2,”d”,b,3,”d”,n,4,”i”,m,5,”i “,”アウト”,[m,n],1,”d”);
–>c
c =

3.9830636 4.0508901 3.2827127
2.3847902 2.1826684 2.8621772

–>// サブルーチン「foofsum」で、

–>// call ステートメントの “out” キーワードに続く引数はサブルーチン出力です
–>// c1 は位置 1 にあり、サイズは [m,n] の実数です
–>// s は位置 6 にあり、実数です
– ->// ch は文字型 (len=4) の位置 7 にあります
–>//
–>[c1,s,ch] = call(“foofsum”,a,2,”r”,b,3 ,”r”,n,4,”i”,m,5,”i”, … –>
“out”,[m,n],1,”r”,[1,1],6 ,”r”,[1,4],7,”c”);
–>c1
c1 =

3.9830637 4.05089 3.2827127
2.3847902 2.1826684 2.8621771

–>s
s =

18.746304

–>ch
ch =

完了

–>

タイトルとURLをコピーしました