Извините, что вы новичок как в 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
Однако, это не выглядит как лучшая практика кодирования, хотя, как это довольно «мокрая».
Любые идеи?
Ницца. Я одобряю (и пропускаю мои f2py fortran-python days ...: - /). – mgilson
@Warren Спасибо за ваш ответ! И сожалею о позднем ответе. Я также получил электронное письмо из списка рассылки, но подумал, что обсуждение здесь, вероятно, будет доступно для большего количества людей. У меня есть вопрос, что я не понимаю, почему это происходит. Я действительно понимаю, что f2py не принимает, где 'kind = kind (0.d0)', потому что используется вызов функции 'kind()'. Мои вопросы: –
1) если мы сначала скомпилируем модуль 'types', почему бы' dp' быть в порядке? Это потому, что он сначала скомпилирован, так что он больше не является вызовом функции? 2) Почему это произойдет, если выражение 'use types, only: dp' было на уровне модуля? И почему он будет работать, если он будет размещен на уровне функции? –