fortran66のブログ

fortran について書きます。

Python ctypes module による Fortran との連携。

参考ページ

Fortran DLL ソースコード

module m_test
  implicit none
  real(8), parameter :: pi = 4 * atan(1.0d0)
contains    
  subroutine test(n, x) BIND(c, name = 'test')
    !DEC$ ATTRIBUTES DLLEXPORT :: test
    integer, value :: n
    real(8), intent(out) :: x(n)
    integer :: i
    print *,'n = ',n
    do i = 1, n
      x(i) = sin( (i - 1) * pi / (n - 1) )
    end do  
  end subroutine test
end module m_test

x64 版は、calling convention が default でいいんじゃないかと思う...

スカラー引数は値呼び出しにしてみました。(F2003)

DLL EXPORT は F2003 の C 互換命令では対応できないので、インテル拡張の修飾子をつけてやる必要があります。

BIND オプション (f203) で LINKER に見える名前が指定できるので、MODULE の中にサブルーチンを置いても名前が MODULE 名の付加されためんどくさいものにならずに済みます。

Python 呼び出し

準備

from ctypes import *
my_mod = CDLL("./x64/release/DLL_Python.dll")
my_mod.test.argtypes = [
               c_int32,
               np.ctypeslib.ndpointer(dtype=np.float64)]
my_mod.test.restype = c_void_p

実行

x = np.arange(0.0, 100.0, dtype=np.float64)
my_mod.test(x.size, x)  
plot(x)

f:id:fortran66:20140226022355p:plain