f2py复杂化由于参数数组维度在模块/公共块中定义

时间:2014-05-24 18:28:03

标签: fortran fortran90 f2py

我在Fortran 90中有以下子程序:

subroutine foo(bar)

  use spam ! dimension n is defined in the module spam

  implicit none

  real*8 bar(n)
  ....
end subroutine foo

由于数组维n是在模块spam中定义的,因此我在编译C包装函数(由f2py生成)时遇到错误,例如

error: ‘n’ undeclared (first use in this function)

因为C包装函数没有对spamn的任何引用。

这应该是什么解决方案?

我目前正在为巨大的Fortran程序做准备,这是一个我没有写过的程序。我现在认为在公共块/模块中传递有关参数的信息是不好的做法,因为它可能导致这样的问题。

是否有任何解决方法,或者我是否必须重构整个代码以将数组维度添加为参数?

此外,没有机会修改C源,因为它是由f2py自动生成的。

1 个答案:

答案 0 :(得分:1)

mod.f90

module m
  integer :: n = 1
end module

main.f90时

subroutine s
  use m
  real :: a(n)
  print *,n
end subroutine

蟒:

f2py -c -m main mod.f90 main.f90


ipython

In [1]: import main

In [2]: main.s()
       1

In [3]: main.m.n=5

In [4]: main.s()
           5

我在使用模块变量时没有遇到任何问题。

<强> --- ---编辑

当大小取决于模块变量(不是命名常量)时,我可以用显式大小数组伪参数确认问题,即:

subroutine s(a)
  use m, only: n
  real :: a(n)
end subroutine

避免显式边界的一种方法是使用假定的形状数组(a(:))。假定的大小数组需要显式接口,因此它们必须放在调用代码使用的模块中,或者必须提供接口块。模块通常是首选。