python-在许多扩展模块之间使用F2PY共享Fortran 90模块数据

我想在许多自编译的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.

Link to Documentation

由于这个事实,我必须使用大约100个嵌套的Fortran 90子例程,因此我需要在它们之间共享数据.有什么建议可以实现吗?

我考虑过将每个变量作为参数传递给每个子例程,然后再返回变量,但这听起来有点不对劲.

解决方法:

尽管只是一种反复试验的方法,但是如何将变量模块和所有子例程放入一个文件中并使用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
上一篇:FORTRAN语言


下一篇:模糊查询(附上源码和jquery-1.12.1.js,jquery-ui.js,jquery-ui.css)