5

Pythonプログラムでいくつかの値を返すfortran関数を呼び出す必要があると仮定します。私はそのような方法でFortranコードを書き直すことを知りました:

subroutine pow2(in_x, out_x)
      implicit none
      real, intent(in)      :: in_x
!f2py real, intent(in, out) :: out_x
      real, intent(out)     :: out_x
      out_x = in_x ** 2
      return
end

そしてそれをPythonでそのような方法で呼び出します:

import modulename
a = 2.0
b = 0.0
b = modulename.pow2(a, b)

作業結果が得られます。他の方法でFortran関数を呼び出すことはできますか?最初の方法は少し不器用だと思いますか?

4

3 に答える 3

10

f2py関数のシグネチャを少し変更する必要があると思います(これout_xが唯一intent(out)であり、in_x唯一ですintent(in)):

subroutine pow2(in_x, out_x)
  implicit none
  real, intent(in)   :: in_x
  !f2py real, intent(in) :: in_x
  real, intent(out)     :: out_x
  !f2py real, intent(out) :: out_x
  out_x = in_x ** 2
  return
end subroutine pow2

今コンパイルします:

f2py -m test -c test.f90

今実行します:

>>> import test
>>> test.pow2(3)   #only need to pass intent(in) parameters :-)
9.0
>>>

この場合、特別なコメントなしf2pyで関数のシグネチャを正しくスキャンできることに注意してください。!f2py

!test2.f90
subroutine pow2(in_x, out_x)
  implicit none
  real, intent(in)   :: in_x
  real, intent(out)     :: out_x
  out_x = in_x ** 2
  return
end subroutine pow2

コンパイル:

f2py -m test2 -c test2.f90

走る:

>>> import test2
>>> test2.pow2(3)   #only need to pass intent(in) parameters :-)
9.0
>>>
于 2012-11-19T21:33:43.790 に答える
0

引数を回避することのもう1つの利点intent(inout)は、(他のいくつかの制限付きで)結果の関数を考慮することができることPUREです。これは、関数型言語で採用されている副作用のないアプローチに関連しており、Fortranコンパイラーによるより優れた最適化とエラー検出で成果を上げ、自動並列化にとって特に重要です。

于 2013-08-05T00:37:18.147 に答える
0

IPythonを使用している場合は、マジックコマンドを試してください。

%%fortran
subroutine pow2(in_x, out_x)
  implicit none
  real, intent(in)   :: in_x
  real, intent(out)     :: out_x
  out_x = in_x ** 2
  return
end subroutine pow2

次に、コードでこの関数を使用します(追加のインポートは必要ありません)。

于 2015-12-01T22:57:49.570 に答える