codegen[fortran] - Fortran のソースコードの生成
使い方
fortran(s);
fortran(s, options);
パラメータ
s - 式, 式の配列, 方程式のリスト, または手続き
|
説明
|
|
•
|
fortran 関数は入力を評価する Fortran 77 ソース・コードを生成します。入力 s は以下のいずれかでなければなりません: 単一の代数式、代数式の配列、name = algebraic の形の等式のリスト(これは代入文の列と解釈されます)、または Maple の手続き。配列に名前が付けられていなければ、名前 unknown が用いられます。残りの引数はオプションであり、以下のように記述されます。Maple の手続きの Fortran への翻訳に関するヘルプは、codegen/fortran/procedure を見なさい。fortran コマンドは出力を制御するため以下のオプションの引数をとります。
|
•
|
filename オプション:デフォルトで出力は標準出力に送られます。filename = "foo" の形の付加的な引数により出力をファイル foo に書き込むことができます。出力はファイルに書き加えられます。
|
•
|
optimized オプション:キーワード optimized が付加的な引数として指定されると、共通部分式の最適化を行ないます。結果は、一時的な値が文字 t で始まる局所変数にストアされる代入文の列となります。この目的のため、fortran によって大域変数名 t0, t1, t2, ... はリザーブされています。オプティマイザーへの入力はある条件を満足しなければなりません。より詳しい情報は codegen/optimize を見てください。
|
•
|
digits オプション:整数、分数、そして Pi のような記号など浮動小数点形式でない Maple の定数は evalf を用いることにより浮動小数点定数に変換されますが、この際、例えば sqrt などの実数関数への引数が必要となります。デフォルトで、単精度に対して 7、倍精度に対して 16 が用いられます。またオプション引数 digits = n を指定することによって n に設定されます。
|
•
|
precision オプション:オプション引数 precision=single または precision=double が与えられたとき、これは浮動小数点定数を、それぞれ、E (倍精度)または D (単精度)いずれの形式に出力することを指定します。また、関数名がどう翻訳されるかも指定します。mode=single または mode=complex オプションが与えられているならば、デフォルトは単精度となり、そうでなければ倍精度となります。
|
•
|
mode オプション:Maple から Fortran への関数名の対応は、オプション引数 mode=t を与えることで制御できます。ここで t は single、double、generic、または complex のいずれかです。mode オプションが与えられなければ、デフォルトは mode=generic です。例えば、自然対数関数(Maple における ln または log)は以下のように翻訳されます。
|
mode translation
single alog
double dlog
complex clog
generic log
•
|
Maple における arctan から Fortran における atan のような、残りの関数の対応は関数 codegen/fortran/function_name によって行なわれます。ユーザは関数名がどう付け替えられるか変えることができます。例えば、
|
`codegen/fortran/function_name`(arctan,1,double) := datan;
`codegen/fortran/function_name`(arctan,2,single) := atan2;
•
|
配列(Maple のベクトル、行列、そして他の配列)を翻訳する際、fortran 関数は、配列の添え字を Fortran の要請する 1 から始まるインデックスに付け直しません。Maple のベクトルおよび行列は添え字 1 から始まるため、これは問題にはなりません。ユーザが 0 または他の何かの添え字から始まる配列を持っているなら、それを 1 から始まる添え字に変換しなければなりません。このことは convert 関数を用いることで容易にできます。convert[array] のヘルプ・ページを見てください。配列が値の代入されていないエントリーを含むならば、Fortran ソースコードにおいて出力される値は文字列 undefined となります。
|
•
|
Fortran言語には、継続行は19行以内、超過した場合コンパイルにおいてエラーとなる制限があります。この制限を超過する大きな式に対して、fortran ルーチンは自動的に式を打ち切ります。fortran はこの目的のため大域変数名 s0, s1, s2, ... をリザーブしています。
|
•
|
関数 fortran は Fortran ソース・コードを副作用として生成し、関数の値としては NULL を返します。従って、ディット・コマンド(%および%%)は fortran コマンドによって出力を呼び戻しません。
|
•
|
with(codegen,fortran) コマンドはこのコマンドの短縮形の使用を可能にします。
|
|
|
例
|
|
>
|
with(codegen,fortran):
f := 1-2*x+3*x^2-2*x^3+x^4;
|
| (2.1) |
t0 = 1-2*x+3*x**2-2*x**3+x**4
| |
t2 = x**2
t6 = t2**2
t7 = 1-2*x+3*t2-2*t2*x+t6
| |
>
|
fortran(convert(f,horner,x));
|
t0 = 1+(-2+(3+(-2+x)*x)*x)*x
| |
>
|
f := Pi*ln(x^2)-sqrt(2)*ln(x^2)^2;
|
| (2.2) |
t0 = 0.3141592653589793D1*log(x**2)-sqrt(2.D0)*log(x**2)**2
| |
t1 = x**2
t2 = log(t1)
t4 = sqrt(2.D0)
t5 = t2**2
t7 = 0.3141592653589793D1*t2-t4*t5
| |
>
|
fortran([s = x^2, t = ln(s), r = Pi*t-sqrt(2)*s^2 ], precision=single);
|
s = x**2
t = log(s)
r = 0.3141593E1*t-sqrt(2.E0)*s**2
| |
>
|
A := array(1..2,1..2,symmetric):
A[1,1] := log(x): A[1,2] := 1-log(x):
print(A);
|
| (2.3) |
>
|
fortran(A,mode=single);
|
A(1,1) = alog(x)
A(1,2) = 1-alog(x)
A(2,1) = 1-alog(x)
A(2,2) = 0.E0
| |
>
|
fortran(A,optimized,mode=double);
|
t1 = dlog(x)
t2 = 1-t1
A(1,1) = t1
A(1,2) = t2
A(2,1) = t2
A(2,2) = (0.D0/0.D0)
| |
>
|
f := convert(1-2*x+3*x^2-2*x^3+x^4,horner);
|
| (2.4) |
>
|
f := unapply(f,x); # Make the expression into a procedure
|
| (2.5) |
c The options were : operatorarrow
doubleprecision function f(x)
doubleprecision x
f = 1+(-2+(3+(-2+x)*x)*x)*x
return
end
| |
|
|