f2py double precision issue - 20.1111

由于工作需要把Python和Fortran连接在一起,最近去学了以下怎么用f2py。f2py的具体用法见 f2py Manual

  • 错误信息

在Fortran里,我们往往喜欢用下面这种方法来声明数据的类型

module types
  implicit none
  integer, parameter  :: dp = kind(1.0d0), sp = kind(1.0)
end module types

module consts_dp
  use types
  implicit none
  real(dp), public, parameter :: pi =&
       & 3.141592653589793238462643383279502884197_dp

但这种声明数据类型的方法,在用f2py去生成Python module的时候会遇到一些问题。
首先,生成Python module的过程中不会报错,不过你会看到下面这样的信息

getctype: "real(kind=dp)" is mapped to C "float" (to override define dict(real = dict(dp="<C typespec>")) in /media/xx/xxx/xxxx/xxx/xx/f2py_trial/.f2py_f2cmap file).

其次,当你在Python里调用这个来自Fortran的module时,如果你用到了上面这种声明数据类型的方法,你可能会发现f2py不能很好地把double precision在Fortran和Python之间传递。Reference [1]给了一个很生动很好的例子。

  • 解决办法

Refernce [1]中给出了三种解决方法,其中第二种方法可能是最经典的。Reference [1]中的第二种方法参考了Reference [2]。

我们回头看f2py返回的信息,里面明确讲了f2py把Fortran中的“real(kind=dp)”映射为C中的"Float"。如果想改写这种映射,可以在当前目录下的.f2py_f2cmap中定义

dict(real = dict(dp="<C typespec>")       #把这里的'C typespec'替换成需要的数据类型

重新定义完映射之后,再用f2py连接一次Python和Fortran就可以了。

  • Reference
  1. Stackoverflow - good example & good solution
  2. f2py Q&A
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值