调用 f2py 包装函数后的 Python 代码不执行

问题描述 投票:0回答:0

我正在尝试使用一些现有代码在 python 项目中集成延迟微分方程(this page 的 radar5)。我以为我已经用 f2py 成功地包装了 fortran 代码,因为我能够调用一个 fortran 程序并看到集成器的输出。

但是,调用 radar5 之后的所有 python 代码都不会执行。

python代码:

import numpy
import radar5_f2pytest
print(radar5_f2pytest.__doc__)
i=[2]
x=[0]
rpar=numpy.array([1.34, 1.6E9, 8.0E3, 4.0E7, 1, 1, 6E-2, 6E-2, 15E-2],order='F')
ND=2
NRDENS=1
NGRID=1
NLAGS=1
NJACL=2
MXST=4000
LWORK=11
LIWORK=16
IJAC=1
MLJAC=ND
IMAS=0
IOUT=1
X=0
Y=numpy.array([1E-10,1E-5],order='F')
TAU=rpar[8]
XEND=100.5
ITOL=0
RTOL=1E-9
ATOL=RTOL*1E-9
H=1E-6
IWORK=numpy.zeros((16), order='F', dtype=numpy.int64)

WORK=numpy.array([1E-16, 0.9, 0.001, min(0.03, RTOL**0.5), 1, 1.2, XEND-X, 0.2, 8, 0, 5], order='F')
IWORK[1]=1000000
IWORK[4]=ND
IWORK[2]=7
IWORK[8]=1
IWORK[10]=2
IWORK[11]=MXST
IWORK[12]=NGRID
IWORK[13]=1
IWORK[14]=NRDENS
IPAST=numpy.zeros((NRDENS+1), order='F')
IPAST[0]=2

GRID=numpy.array([TAU], order='F')

ipar=numpy.zeros((1))
#print((WORK))
#print(IWORK)
print("WHAT")
radar5_f2pytest.radar5_f2py(X, Y, XEND, H, 
                                  RTOL, ATOL, ITOL, IJAC, 
                                  MLJAC, NLAGS, NJACL,
                                  IMAS,ND,0, IOUT, WORK, 
                                  IWORK,GRID, IPAST, rpar, ipar)


print("WHAT")

fortran 代码。请注意,存在外部依赖项和其他子例程,但为了简洁起见,我将只包括我用 f2py 包装的子例程。

! -*- f90 -*-

SUBROUTINE radar5_f2py(N, X, Y, XEND, H, RTOL, ATOL, ITOL,& 
&                          IJAC, MLJAC, MUJAC, NLAGS, NJACL, &
&                          IMAS, MLMAS, MUMAS, IOUT, WORK, IWORK, &
&                          GRID, IPAST, RPAR, IPAR, IDID, RESULT)
   
    IMPLICIT NONE
              
    INTEGER, PARAMETER :: DP=kind(1D0) 
    INTEGER, intent(in) :: N, NLAGS, NJACL
    REAL(kind=8), intent(inout) :: X
    REAL(kind=8), intent(in) :: XEND
    REAL(kind=8), intent(in) :: H
    LOGICAL, intent(in) :: ITOL, IJAC, IMAS, IOUT
    INTEGER, intent(in) :: MLJAC, MLMAS, MUMAS

    INTEGER, intent(in) :: MUJAC
    !f2py integer, optional, intent(in) :: MUJAC


    REAL(kind=8), dimension(N), intent(inout) :: Y 
    REAL(kind=8), intent(in), dimension(11) :: WORK 
    REAL(kind=8), intent(in) ::  ATOL,RTOL 
    INTEGER, intent(in), dimension(16) :: IWORK 
    REAL(kind=8), intent(inout) :: GRID 
    INTEGER, intent(inout) :: IPAST 
    REAL(kind=8), intent(in), dimension(9) :: RPAR 
    INTEGER, intent(in) :: IPAR
    INTEGER, intent(out) :: IDID
    REAL*8, intent(out), dimension(1,N) :: RESULT
    REAL(kind=8), EXTERNAL :: PHI
    REAL(kind=8), EXTERNAL :: ARGLAG
    EXTERNAL :: FCN, JFCN, JACLAG, SOLOUT, DUMMY

   !PRINT *, X, Y, WORK, ATOL, RTOL, IWORK, GRID, IPAST, RPAR, IPAR     
    CALL RADAR5(N,FCN,PHI,ARGLAG,X,Y,XEND,H,&
     &                  RTOL,ATOL,ITOL, &
     &                  JFCN,IJAC,MLJAC,MUJAC, &
     &                  JACLAG,NLAGS,NJACL, &
     &                  IMAS,SOLOUT,IOUT, &
     &                  WORK,IWORK,RPAR,IPAR,IDID,&
     &                  GRID,IPAST,DUMMY,MLMAS,MUMAS,RESULT)
    

    
     RESULT(1,1)=1
     !PRINT *, X, IDID
     RETURN   

END SUBROUTINE

f2py 模块是用这个命令编译的:

 flang -c radar5.f contr5.f dc_decdel.f decsol.f dontr5.f 
================================================================
start f2py...
f2py -c -m radar5_f2pytest radar5_template.f90 radar5.o contr5.o dc_decdel.o decsol.o dontr5.o only: radar5_f2py :

我首先编译 fortran 源文件,然后使用包含上述子例程的源文件将它们提供给 f2py。

重申一下,我可以看到 fortran 的输出表明对 RADAR5 的调用正在运行。结果与radar5的作者给出的例子相匹配。

我试过调试 python 代码,但这只是确认在第二次调用 f2py 模块后没有任何执行。

编辑:

很抱歉延迟和缺乏可重现的例子。我一直在尝试做一个例子来展示这个问题而不破坏其他东西,但是 radar5 非常大而且复杂,而且我对 fortran 没有经验。这个问题与对 radar5 的调用有关,因为如果我根本不调用 radar5,一切都会按预期进行。与此同时,这里是输出:

This module 'radar5_f2pytest' is auto-generated with f2py (version:1.21.5).
Functions:
  idid,result = radar5_f2py(x,y,xend,h,rtol,atol,itol,ijac,mljac,nlags,njacl,imas,mlmas,mumas,iout,work,iwork,grid,ipast,rpar,ipar,n=len(y),mujac=)
.
WHAT
 STARTING INTEGRATION...
 NUMBER OF PRESCRIBED GRID POINTS:             1
 NUMBER OF DELAYED COMPONENTS:             1
 INTEGRATION...
            0  COMPUTED BREAKING POINTS: 

在这里,我知道 radar5 正在被调用并正在执行,因为最后一行。我还可以打印出结果(来自 fortran),如 IDID 或集成的最终点。这些结果符合预期。

编辑2:

在交互式窗口中运行 python 代码导致崩溃:

版本详情:

Python 3.9.13 (main, Aug 25 2022, 23:51:50) [MSC v.1916 64 bit (AMD64)]
Type 'copyright', 'credits' or 'license' for more information
IPython 7.31.1 -- An enhanced Interactive Python. Type '?' for help.

交互窗口输出:

Canceled future for execute_request message before replies were done
The Kernel crashed while executing code in the the current cell or a previous cell. Please review the code in the cell(s) to identify a possible cause of the failure. Click here for more info. View Jupyter log for further details.
python fortran f2py
© www.soinside.com 2019 - 2024. All rights reserved.