使用f2py

问题描述

我想使用Fortran90代码和LAPACK库对矩阵求逆,并使其能够在使用f2py的Python中使用。这是我想用f2py在Python中实现的子例程:

subroutine inv(A,Ainv)
    implicit none

  real(kind=8),dimension(:,:),intent(in) :: A
  real(kind=8),dimension(size(A,1),size(A,2)),intent(out) :: Ainv

  real(kind=8),1)) :: work  ! work array for LAPACK
  integer,1)) :: ipiv   ! pivot indices
  integer :: n,info

  ! External procedures defined in LAPACK
  external DGETRF
  external DGETRI

  ! Store A in Ainv to prevent it from being overwritten by LAPACK
  Ainv = A
  n = size(A,1)

  ! DGETRF computes an LU factorization of a general M-by-N matrix A
  ! using partial pivoting with row interchanges.
  call DGETRF(n,n,Ainv,ipiv,info)

  if (info /= 0) then
     stop 'Matrix is numerically singular!'
  end if

  ! DGETRI computes the inverse of a matrix using the LU factorization
  ! computed by DGETRF.
  call DGETRI(n,work,info)

  if (info /= 0) then
     stop 'Matrix inversion Failed!'
  end if
end subroutine inv

当我在fortran程序中编译并运行它时,此代码有效。

然后,要使用f2py进行编译,请使用以下命令:

f2py -c inverse.f90 -m inverse --fcompiler=gnu95 --compiler=mingw32 -L. -lliblapack

它会编译并创建模块inverse.cp38-win_amd64.pyd,通常我应该能够在Python shell中将其导入,但是出现以下错误

>>> import inverse
Traceback (most recent call last):
  File "<stdin>",line 1,in <module>
ImportError: DLL load Failed while importing inverse: the specified module is not found.

我认为DLL文件是使用的LAPACK库,所以我想知道是否有一种方法可以将LAPACK库与不同于-L/path/to/library and -l<library.dll>的f2py链接起来

我使用的gfortran编译器与MinGW 64位一起使用,我的python版本是3.8.5和64位,我的LAPACK库也是64位的预构建库,并且我在Windows 10上。

谢谢您的帮助!

Dorian

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)