FORTRAN77函数返回一个数组

时间:2012-04-04 19:48:47

标签: python fortran77

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

1 个答案:

答案 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