0

很抱歉问了这么基本的问题。我正在研究一些 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   
4

1 回答 1

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)
>>>

基因3.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
于 2012-04-04T21:22:54.783 回答