很抱歉提出这样的基本问题。我正在研究一些FOTRAN77代码并尝试从Python调用它。但是,我在从函数返回两个或多个值时发现了一些问题。
以下是代码。它有四个输入(APPRAT,APPNUM,APSPAC,KOC),我想返回三个参数值(APPTOT,KD,TDEGF),它们存储在GENEEC3中。当只返回一个参数时,我编译的代码运行良好,但当我请求它返回三个参数时,它不起作用。
所以请给我一些建议并感谢大家的帮助!
Function GENEEC3 (APPRAT,APPNUM,APSPAC,KOC)
REAL GENEEC3(3)
CHARACTER*1 METHOD,AGAIN,WETTED,ADSORP,AIRFLG,GRNFLG,ORCFLG,GRSIZE
Cf2py intent(in) APPRAT,APPNUM,APSPAC,KOC,METHAF,WETTED,METHOD,AIRFLG
Cf2py intent(in) YLOCEN,GRNFLG,ORCFLG,INCORP,SOL,METHAP,HYDHAP,FOTHAP
Cf2py intent(out) GENEEC3(3)
C
APPTOT=APPRAT*APPNUM
TDEGF = APPNUM * APSPAC
KD = 0.0116 * KOC
C
GENEEC3(1)=APPTOT
GENEEC3(2)=KD
GENEEC3(3)=TDEGF
C
RETURN
END Function GENEEC3
答案 0 :(得分:1)
我试图定义fortran函数并让它与f2py一起工作,但是f2py似乎创建了一个函数包装器,其中返回值是标量。我无法弄清楚如何直截了当。
相反,我试图定义子程序。然后f2py巧妙地猜到了我真正想要的是数值函数!我在下面确认了gfortran和pgf90的工作。
f2py --fcompiler=gnu95 -c -m geneec3 geneec3.f90
然后在python中
>>> import geneec3
>>> geneec3.geneec3(1,1,1,1)
>>> array([ 1. , 0.0116, 1. ], dtype=float32)
>>>
geneec3.f90
subroutine GENEEC3 (APPRAT,APPNUM,APSPAC,KOC, results)
implicit none
REAL, dimension(3), intent(out) :: results
real, intent(in) :: apprat, appnum, apspac, koc
real apptot, tdegf, kd
C
APPTOT=APPRAT*APPNUM
TDEGF = APPNUM * APSPAC
KD = 0.0116 * KOC
C
results(1)=APPTOT
results(2)=KD
results(3)=TDEGF
END subroutine GENEEC3