2015-01-27 4 views
1

Извините, что вы новичок как в Fortran 90, так и в f2py.F2PY не может видеть переменные области видимости

Я использую Windows 64 бит, Python 3.4 64 бит, gfortran. Numpy версия 1.9.1, и я откомментировал «Поднятие NotImplementedError (» Только MS компилятор поддерживал с gfortran на Win64 «)» в gnu.py, как указано на этой ссылке: http://scientificcomputingco.blogspot.com.au/2013/02/f2py-on-64bit-windows-python27.html

У меня есть модуль Fortran, записывается следующим образом, с модулем-Scope переменной 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 

Тогда, если я бегу f2py -c testf2py.f90 -m testf2py

Он сообщит об ошибке, о том, что дп не была объявлена.

Если я копирую область модуля в область функций, она будет работать.

! 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

Вот обходные, в котором dp перемещается в types модуля, а use types заявление добавляется к функции i1.

! 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

@Warren Спасибо за ваш ответ! И сожалею о позднем ответе. Я также получил электронное письмо из списка рассылки, но подумал, что обсуждение здесь, вероятно, будет доступно для большего количества людей. У меня есть вопрос, что я не понимаю, почему это происходит. Я действительно понимаю, что f2py не принимает, где 'kind = kind (0.d0)', потому что используется вызов функции 'kind()'. Мои вопросы: –

+0

1) если мы сначала скомпилируем модуль 'types', почему бы' dp' быть в порядке? Это потому, что он сначала скомпилирован, так что он больше не является вызовом функции? 2) Почему это произойдет, если выражение 'use types, only: dp' было на уровне модуля? И почему он будет работать, если он будет размещен на уровне функции? –

Смежные вопросы