22 Кб, 420x340
Пишу расширение для Питона. На Фортране с помощью F2PY, да. Пишу функцию, которая должна принимать кучу аргументов, в т.ч. массив. Как написано в руководстве, и как я всегда делал:
module yoba
contains
subroutine ff(N,AR)
!f2py depend(N) AR
integer,intent(in) :: N
real(4),dimension(0:N-1),intent(in) :: AR
! Какой-то код
end subroutine
end module
Но аргументов у функции при таком подходе будет штук 10, неудобно. Плюс функция будет вызываться тысячи раз за время исполнения основной программы, а часть аргументов меняться не будет. Поэтому хочется их инициализировать один раз, сохранив данные в пространстве памяти модуля на Фортране в переменных модуля, а потом постоянно дергать из моей функции. Например, хочется так:
module yoba
integer,public :: N
contains
subroutine init(x)
integer :: x
N=x
end subroutine
subroutine ff(AR)
!f2py depend(N) AR
real(4),dimension(0:N-1),intent(in) :: AR
! Какой-то код
end subroutine
end module
GNU Fortran съедает этот код легко и непринуждённо, и позволяет использовать в тестовой программе на Фортране же. А вот F2PY - нет, он орёт, что переменная N не объявлена.
Можно ли заставить F2PY использовать переменные модуля таким образом, или надо обязательно таскать в каждой функции стопяцот аргументов?
module yoba
contains
subroutine ff(N,AR)
!f2py depend(N) AR
integer,intent(in) :: N
real(4),dimension(0:N-1),intent(in) :: AR
! Какой-то код
end subroutine
end module
Но аргументов у функции при таком подходе будет штук 10, неудобно. Плюс функция будет вызываться тысячи раз за время исполнения основной программы, а часть аргументов меняться не будет. Поэтому хочется их инициализировать один раз, сохранив данные в пространстве памяти модуля на Фортране в переменных модуля, а потом постоянно дергать из моей функции. Например, хочется так:
module yoba
integer,public :: N
contains
subroutine init(x)
integer :: x
N=x
end subroutine
subroutine ff(AR)
!f2py depend(N) AR
real(4),dimension(0:N-1),intent(in) :: AR
! Какой-то код
end subroutine
end module
GNU Fortran съедает этот код легко и непринуждённо, и позволяет использовать в тестовой программе на Фортране же. А вот F2PY - нет, он орёт, что переменная N не объявлена.
Можно ли заставить F2PY использовать переменные модуля таким образом, или надо обязательно таскать в каждой функции стопяцот аргументов?
>>3566938 (OP)
Тебе не то чтобы в /pr/. Тебе даже на двач теперь ходить не надо ради такой ерунды.
Тебе не то чтобы в /pr/. Тебе даже на двач теперь ходить не надо ради такой ерунды.
>>013
За руководство спасибо. Нюанс в том, что массив AR в функции
subroutine ff(AR)
!f2py depend(N) AR
real(4),dimension(0:N-1),intent(in) :: AR
! Какой-то код
end subroutine
создаётся в питонокоде и приезжает из него в фортранокод. AR большой и в каждом вызове ff новый, так что тратить на его копирование процессорное время жалко. AR приходится использовать как аргумент ff, а вот N и другие подобные переменные, описывающие размер передаваемых и отдаваемых массивов хочется вынести в COMMON BLOCK
А можно ли в питонокоде присваивать ссылку на массив указателю в COMMON BLOCK, а потом в фортранокоде использовать массив по ссылке?
За руководство спасибо. Нюанс в том, что массив AR в функции
subroutine ff(AR)
!f2py depend(N) AR
real(4),dimension(0:N-1),intent(in) :: AR
! Какой-то код
end subroutine
создаётся в питонокоде и приезжает из него в фортранокод. AR большой и в каждом вызове ff новый, так что тратить на его копирование процессорное время жалко. AR приходится использовать как аргумент ff, а вот N и другие подобные переменные, описывающие размер передаваемых и отдаваемых массивов хочется вынести в COMMON BLOCK
А можно ли в питонокоде присваивать ссылку на массив указателю в COMMON BLOCK, а потом в фортранокоде использовать массив по ссылке?
>>013
Что поделать, мне не дают зарегистрироваться на StackOverflow, чтобы там вопрошать
>Тебе не то чтобы в /pr/. Тебе даже на двач теперь ходить не надо ради такой ерунды.
Что поделать, мне не дают зарегистрироваться на StackOverflow, чтобы там вопрошать