0

このような基本的な質問をしてすみません。私はいくつかのFOTRAN77コードに取り組んでおり、Pythonからそれを呼び出そうとしています。ただし、関数から2つ以上の値を返す際にいくつかの問題が見つかりました。

以下はコードです。4つの入力(APPRAT、APPNUM、APSPAC、KOC)があり、GENEEC3に格納されている3つのパラメーター値(APPTOT、KD、TDEGF)を返したいと思います。コンパイルされたコードは、1つのパラメーターのみが返される場合は正常に機能しますが、3つのパラメーターを返送するように要求すると機能しません。

だから私にいくつかの提案をしてくださいそして助けてくれてみんなに感謝します!

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

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
于 2012-04-04T21:22:54.783 に答える