我正在玩 f2py。我对 numpy 内在类型与 fortran 90 类型有点困惑。在与 python 交互时,似乎我只能在 fortran 90 中使用单精度实数。让我用一个例子来说明:
假设我有这个 fortran 90 模块 test.f90,要用 f2py 编译并在 python 中导入:
module test
implicit none
integer, parameter :: sp = selected_real_kind(6,37) ! single precision
integer, parameter :: dp = selected_real_kind(15,307) ! double precision
real(sp) :: r_sp = 1.0
real(dp) :: r_dp = 1.0_dp
end module
我这样编译:
f2py -c -m 测试 test.f90
然后,在python中:
>>> import test
>>> test.test.r_sp
array(1.0, dtype=float32)
>>> test.test.r_dp
array(1.0)
IOW,似乎 f2py 不接受双精度。当从 python 向 fortran 90 子例程传递输入时,这变得更加成问题。假设我将模块扩展到:
module test
implicit none
integer, parameter :: sp = selected_real_kind(6,37) ! single precision
integer, parameter :: dp = selected_real_kind(15,307) ! double precision
real(sp) :: r_sp = 1.0
real(dp) :: r_dp = 1.0_dp
contains
subroutine input_sp(val)
real(sp), intent(in) :: val
real(sp) :: x
x = val
write(*,*) x
end subroutine
subroutine input_dp(val)
real(dp), intent(in) :: val
real(dp) :: x
x = val
write(*,*) x
end subroutine
end module
f2py -c -m 测试 test.f90
Python
>>> import test
>>> test.test.input_sp(array(1.0,dtype=float32))
1.0000000
>>> test.test.input_sp(array(1.0,dtype=float64))
1.0000000
>>> test.test.input_dp(array(1.0,dtype=float32))
-1.15948430791165406E+155
>>> test.test.input_dp(array(1.0,dtype=float64))
-1.15948430791165406E+155
因此,似乎从 python 发送的任何输入变量都必须声明为单精度。这是 f2py 的已知问题吗?
此外,作为后续问题:从 sp 转换为 dp 工作,在以下意义上:
subroutine input_sp_to_dp(val)
real(sp), intent(in) :: val(2)
real(dp) :: x(2)
x = val
write(*,*) x
end subroutine
但我想知道这是否是特定于编译器的?我可以期望上述子例程对任何架构上的任何编译器都做正确的事情吗?测试时,我在上述所有示例中都使用了 gfortran。