Обмен данными модуля Fortran 90 с F2PY между многими модулями расширения - PullRequest
0 голосов
/ 23 октября 2018

Я хочу поделиться данными, которые находятся в модуле Fortran 90, между многими самоскомпилированными модулями расширения F2PY.В документации F2PY говорится, что это невозможно из-за того, как Python импортирует разделяемые библиотеки в целом.

F2PY генерирует оболочки для общих блоков, определенных в обычном блоке подписи.Общие блоки видны для всех кодов Фортрана, связанных с текущим модулем расширения, но не для других модулей расширения (это ограничение связано с тем, как Python импортирует общие библиотеки).

[...]

Интерфейс F2PY для данных модуля Fortran 90 аналогичен общим блокам Fortran 77.

Ссылка на документацию

В связи с тем, что мне нужноиспользовать около 100 вложенных подпрограмм Fortran 90, мне нужно обмениваться данными между ними.Любые предложения, как мне этого добиться?

Я думал о передаче каждой переменной в качестве параметра каждой подпрограмме и возвращении переменных впоследствии, но это звучит как-то неправильно.

1 Ответ

0 голосов
/ 23 октября 2018

Хотя это всего лишь метод проб и ошибок, как насчет того, чтобы поместить модуль переменных и все подпрограммы в один файл и скомпилировать его с помощью f2py (* 1)?Например ...

mytest.f90:

include "vars.f90"
include "sub1.f90"
include "sub2.f90"

vars.f90:

module vars
    integer :: n = 100
end

sub1.f90:

subroutine sub1
    use vars, only: n
    implicit none
    print *, "sub1: n = ", n
end

sub2.f90:

subroutine sub2
    use vars, only: n
    implicit none
    print *, "sub2: n = ", n
    print *, "adding 1 to n"
    n = n + 1
    print *, "n = ", n
end

Компиляция:

f2py -c -m mytest mytest.f90

Тест:

$ /usr/local/bin/python3
>>> import mytest
>>> mytest.vars.n
array(100, dtype=int32)
>>> mytest.sub1()
 sub1: n =          100
>>> mytest.sub2()
 sub2: n =          100
 adding 1 to n
 n =          101
>>> mytest.sub2()
 sub2: n =          101
 adding 1 to n
 n =          102
>>> mytest.vars.n = 777
>>> mytest.sub2()
 sub2: n =          777
 adding 1 to n
 n =          778

(* 1) В приведенном выше случае просто укажите все имена файловдля f2py кажется достаточным, например,

$ f2py -c -m mytest vars.f90 sub1.f90 sub2.f90
...