2015-01-27 2 views
1

Fortran 90과 f2py를 처음 사용하게되어 죄송합니다.F2PY에서 모듈 범위 변수를 볼 수 없습니다

저는 Windows 64 비트, Python 3.4 64 비트, gfortran을 사용하고 있습니다. NumPy와 버전은 1.9.1이며,이 링크의 지시에 따라 나는 "NotImplementedError 인상의 gnu.py에서 ("오직 MS 컴파일러의 Win64에 gfortran와 지원 ")"의 주석 부분 : http://scientificcomputingco.blogspot.com.au/2013/02/f2py-on-64bit-windows-python27.html

나는이 로 작성 포트란의 모듈은 dp 변수 모듈-범위로, 다음과

! testf2py.f90 
module testf2py 
    implicit none 
    private 
    public dp, i1 
    integer, parameter :: dp=kind(0.d0) 
contains 
    real(dp) function i1(m) 
     real(dp), intent(in) :: m(3, 3) 
     i1 = m(1, 1) + m(2, 2) + m(3, 3) 
     return 
    end function i1 
end module testf2py 

을 그럼, 그것은 그 DP 선언되지 않은 진술 오류를보고 할 f2py -c testf2py.f90 -m testf2py

를 실행합니다.

module-scope를 function-scope에 복사하면 작동합니다. 꽤 "젖은"입니다 로

! testf2py.f90 
module testf2py 
    implicit none 
    private 
    public i1 
    integer, parameter :: dp=kind(0.d0) 
contains 
    real(dp) function i1(m) 
     integer, parameter :: dp=kind(0.d0) 
     real(dp), intent(in) :: m(3, 3) 
     i1 = m(1, 1) + m(2, 2) + m(3, 3) 
     return 
    end function i1 
end module testf2py 

그러나,이,하지만 가장 좋은 코딩 관행처럼 보이지 않는다.

아이디어가 있으십니까?

답변

4

여기 작업 주위 dptypes 모듈로 이동되는 야하고 use typesi1 기능에 부가된다. 행동

! testf2py.f90 

module types 
    implicit none 
    integer, parameter :: dp=kind(0.d0) 
end module types 

module testf2py 
    implicit none 
    private 
    public i1 
contains 
    real(dp) function i1(m) 
     use types 
     real(dp), intent(in) :: m(3, 3) 
     i1 = m(1, 1) + m(2, 2) + m(3, 3) 
     return 
    end function i1 
end module testf2py 

:

In [6]: import numpy as np 

In [7]: m = np.array([[10, 20, 30], [40, 50, 60], [70, 80, 90]]) 

In [8]: import testf2py 

In [9]: testf2py.testf2py.i1(m) 
Out[9]: 150.0 

변화는 내가이 답변에 설명 된 세 번째 옵션과 유사합니다 f2py: Specifying real precision in fortran when interfacing with python?

+0

니스. 나는 승인한다 (그리고 f2py Fortran-python days ... : -). – mgilson

+0

@ 워렌 귀하의 회신에 감사드립니다! 그리고 늦은 응답에 대해 유감스럽게 생각합니다. 나는 또한 메일 링리스트에서 이메일을 받았지만 여기에있는 토론이 아마 더 많은 사람들이 접근 할 수있을 것이라고 생각했다. 나는 이것이 왜 일어나는지 이해하지 못한다는 의문을 가지고있다. 나는 f2py가 kind (kind)의 함수 호출이 사용 되었기 때문에'kind = kind (0.d0)'를 취하지 않는다는 것을 이해한다. 내 질문은 : –

+0

1) 모듈'types'을 먼저 컴파일하면 왜'dp'가 이런 식으로 괜찮을까요? 그것은 더 이상 함수 호출이 아니기 때문에 먼저 컴파일 되었기 때문입니까? 2)'use types, only : dp' 문이 모듈 수준에 있다면 왜 실패할까요? 그리고 그것이 기능 수준에 놓여 있다면 그것은 왜 효과가 있을까요? –

관련 문제