2012-04-04 220 views
0

對不起,提出這樣一個基本問題。我正在研究一些FOTRAN77代碼並試圖從Python中調用它。但是,我從函數返回兩個或更多值時發現了一些問題。FORTRAN77函數返回一個數組

以下是代碼。它有四個輸入(APPRAT,APPNUM,APSPAC,KOC),我想返回存儲在GENEEC3中的三個參數值(APPTOT,KD,TDEGF)。只有一個參數返回時,我的編譯代碼運行良好,但當我請求它返回三個參數時不起作用。

所以請給我一些建議,並感謝大家的幫助!

 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

不能使用FORTRAN 90或更高版本?我懷疑Fortran 77支持數組作爲函數的返回值 – yosukesabai 2012-04-04 19:55:41

+0

@yosukesabai,我很抱歉,我無法將其更改爲fortran90 ... – 2012-04-04 19:57:36

+0

爲什麼是...? f90是f77的超集,所以幾乎所有的f77代碼都是有效的f90代碼。現在有免費的f90編譯器,如果錢是一個問題(例如gfortran) – yosukesabai 2012-04-04 19:59:41

回答

1

我試圖定義Fortran函數,讓它與f2py工作,但f2py似乎產生了一個函數包裝,其中返回值是標量。我無法弄清楚如何弄直。

而是我試圖定義子例程。然後f2py巧妙地猜到我真正想要的是數組值函數!我在gfortran和pgf90上確認了下面的工作。

f2py --fcompiler=gnu95 -c -m geneec3 geneec3.f90 

然後在蟒蛇

>>> 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 
+0

非常感謝您的幫助!這真的爲我節省了很多時間! – 2012-04-04 21:38:20