17
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

f2pyことはじめ

Posted at

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より面倒さが少なくていいですね。
検証が不十分でつっこみ所満載かと思うのですが、とりあえず始めてみたいという方に参考になれば幸いです。今後も色々検討していきたいと思います。

17
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?