6
3

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.

Pythonで簡単にFortranのsubroutineを用いる方法

Last updated at Posted at 2018-02-20

はじめまして。
私はFortran中級者,Python初心者です。Pythonを最近はじめたばかりなのですが、Pythonではうまく書けなかったりする場合が多く、今までに自分の使える言語、Fortranをうまく用いれないかと調べ、この記事を書きました。基本的にはf2pyのサイトに書かれている部分を日本語訳しただけなので、英語を読む力と元気のある方は元のオリジナルのページを読んでください。参考にしたオリジナルページ
自分のメモ用という側面もありますので、間違いや言葉足らずな部分があるかもしれませんが、ご了承ください。

Fortranのサブルーチンを用いるにはPythonのNumpyで提供されているf2pyというインターフェースを用います。

まず、f2pyとターミナルから入力し、自分の環境にインストールされているか確認します。
もし、インストールされていなければ、

pip install python-f2py

と入力すると、自分の環境にインストールされる。(pipをインストールしていない方は、先にインストールしてください。)

今回は簡単に、Helloと表示させ、さらに(Python側で)入力した整数の初期値を同時に出力させるサブルーチンを作成することにする。
以下で作成するhello.f90とfromfort.pyは同じディレクトリに入れてください。

hello.f90
subroutine foo (a)
  integer :: a
  write(*,*) "Hello from Fortran!" !ここで文字を出力
  write(*,*) "a=",a !ここで整数を出力
end subroutine foo

このsubroutineを

f2py -c --fcompiler=gfortran -m hello hello.f90

としてコンパイルすると、この場合だとhello.soというファイルが生成される。

(※Fortran初心者の方へ書いておくと、gfortranとはFortranのコンパイラで私の環境(Ubuntu)では

sudo apt-get install gfortran

とすることでインストールできる。)

そして、Pythonのスクリプトでは、

fromfort.py
# -*- coding: utf-8 -*-
import hello
hello.foo(4)

のように書く。このfromfort.pyを以下のようにしてターミナルから実行します。

python fromfort.py

すると、

Hello from Fortran!
 a=           4

と表示されます。
うまく、PythonからFortranのsubroutineを呼び出すことに成功しました。

Spyderから同じファイルを実行すると、うまく動作しませんでした。ライブラリなどの検索ファイルに自分が作成したディレクトリを入れていないせいかもしれません。初心者なのでここらはまだ理解できていません。

今後はもう少し複雑なサブルーチンを用いる際にどうなるかといったことや、Pythonで書くよりもf2pyを用いたほうが計算速度が速いのかといったことについても具体的に調べたいと考えています。
それでは、失礼します。

6
3
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
6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?