divrot in an infinitesimal box

Julia, python, algorithmのメモです

Julia - fortran 90をwrap (bind) する

FortranのコードをJuliaに変換するのは、ものによっては結構しんどいので、juliaからfortran (90)を呼び出そうという例です。

最も簡単な例

まず、ただ入力値をprintするだけのsubroutine printintを格納したfortran90 module testfを用意します。

module for a simple julia wrapper of fortran90

次にこれをshared libraryにします。

~>  gfortran testf.f90 -o testf.so -shared -fPIC

Juliaのwrapperはこんな感じです

simple julia wrapper of fortran 90

ここでポイントはmodule testfのsubroutine printintを呼び出すには

:__testf_MOD_printint

と記述する所です。

~> julia wrap_ftest.jl
           7

こんな感じで呼び出せます。

出力も得る

上の例ではinputだけでしたが、fortran90側が

のように、integerを入力して、+3したintegerを返す場合はどうでしょうか?

この場合、julia側では

こんな感じで呼び出せます。

~> julia wrap_ftest.jl
Int32[7]
Int32[10]

のように返ってきます。

他の型

他の型は、 http://docs.julialang.org/en/release-0.4/manual/calling-c-and-fortran-code/ を参考に対応関係を知るとできます。

  • Float32 <-> Real*4
  • Float64 <-> Real*8
  • Complex64 <-> Complex*8
  • Complex128 <-> Complex*16

などなど。Complex*16の場合の、複素共役を返す例を以下に与えた。

fortran

julia 側

配列を入出力する

さて次は配列の入出力である。複素数配列の複素共役を返す例を以下に与えた。

fortran

julia側

ここでポイントとなるのは配列の要素数を与えるnをccallの中で、&nであたえていることだ。