f2pyの簡単な使い方
はじめに
科学計算を行う時など、fortranで書かれたコードに遭遇することは多いと思う。このような時、pythonの素晴しい可視化環境に慣れてしまった自分にとっては当然これを使いたいと思うわけだが、変数をいちいちテキスト出力してそれをpython側で読み込みなおして、なんてやってられない。
そんな時、f2pyがおすすめ。
f2pyは、fortranソースをコンパイルして、pythonのモジュール化するもの、と理解しています。pythonで読み易くするためだけでなく、スピードもpythonネイティブより早くなるので、計算のコアをfortranで書き、その結果をpythonの豊富なモジュールを利用して解析・可視化する、という方法はとてもいいと思う。
使い方
コンパイル
f2py --fcompiler=xxx -m モジュール名 -c hoge.f90
--fcompiler
で何が指定できるかは、f2py -c --help-fcompiler
で確認することができる。(-cが必要らしい)
モジュール名は例えばhoge
など好きな名前を付けよう。
fortranソースの方
これは至極簡単でsubroutine
で定義したものを用意する。例えば以下のようなもの。
引数は勿論intent(in)
も使うことができる(と思う)が、python側からfortran側で計算した変数を読み込みたい時には、intent(out)
で指定する。
また、引数にintent(out)
で指定している変数を書かないとだめ。
subroutine cal_test(x,y,z)
integer x,y,z
intent(out) x,y,z
x = 10
y = x * 10
z = y * 10
end subroutine cal_test
呼び出す時
上記のコンパイルが上手くいけば、*.so
ができるはず。それをpythonのモジュールとしてインポートすれば呼び出せる。
また、定義したsubroutine
でのintent(out)
で指定した変数は返り値として返ってくるので、それを受けとるようにする。
#!/bin/python3
# -*- coding:utf-8 -*-
import test
x,y,z = test.cal_test()
print("x is ", x, ",y is ", y, ", z is ",z)
終わりに
もっと複雑なコードだとどうなるか分からないのですが、少なくとも一つのsubroutine
で済むような場合ではcythonより面倒さが少なくていいですね。
検証が不十分でつっこみ所満載かと思うのですが、とりあえず始めてみたいという方に参考になれば幸いです。今後も色々検討していきたいと思います。