在许多扩展模块之间使用 F2PY 共享 Fortran 90 模块数据
Share Fortran 90 module data with F2PY between many extension modules
我想在许多自编译的 F2PY 扩展模块之间共享位于 Fortran 90 模块中的数据。 F2PY 的文档说这是不可能的,因为 Python 通常如何导入共享库。
F2PY generates wrappers to common blocks defined in a routine
signature block. Common blocks are visible by all Fortran codes linked
with the current extension module, but not to other extension modules
(this restriction is due to how Python imports shared libraries).
[...]
The F2PY interface to Fortran 90 module data is similar to Fortran 77
common blocks.
由于我必须使用大约 100 个嵌套的 Fortran 90 子例程,我需要在它们之间共享数据。有什么建议可以实现吗?
我考虑过将每个变量作为参数传递给每个子例程,然后 return 传递变量,但这听起来有些不对。
虽然只是一种试错法,但将变量模块和所有子程序放入一个文件中并使用 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
我想在许多自编译的 F2PY 扩展模块之间共享位于 Fortran 90 模块中的数据。 F2PY 的文档说这是不可能的,因为 Python 通常如何导入共享库。
F2PY generates wrappers to common blocks defined in a routine signature block. Common blocks are visible by all Fortran codes linked with the current extension module, but not to other extension modules (this restriction is due to how Python imports shared libraries).
[...]
The F2PY interface to Fortran 90 module data is similar to Fortran 77 common blocks.
由于我必须使用大约 100 个嵌套的 Fortran 90 子例程,我需要在它们之间共享数据。有什么建议可以实现吗?
我考虑过将每个变量作为参数传递给每个子例程,然后 return 传递变量,但这听起来有些不对。
虽然只是一种试错法,但将变量模块和所有子程序放入一个文件中并使用 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