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であたえていることだ。