2

最近まで、私は計算問題の大部分に IDL を使用してきました。私が最も頻繁に使用するルーチンの 1 つは、C でラップされ、CALL_EXTERNAL 関数を使用して IDL から呼び出されるちょっとした fortran90 コードです (これは私が書いたものではありません)。さまざまな理由から、計算の大部分を Python に移行していますが、Fortran コードを組み込むための適切な方法がわかりませんでした。F2PY が最も明白な方法のように見えますが、実際には結果として得られるモジュールは非常に不安定なようです。

基本的に、問題にアプローチするためのより良い方法があるかどうか疑問に思っています。既存の C ラッパーと Cython を Python のコードを使用するように作り直すのは比較的簡単なようですが、私は C/Cython について完全に無知であり、Python にはまったく慣れていないことを告白しなければなりません。 .

参考までに、既存の C ラッパーを以下に含めます。

#include <stdio.h>

void bvls(int argc, void *argv[]) {

extern void bvls_(); 
int *n, *m, *nsetp, *index, *ierr;     
double **a, **b, **bnd, **w, **x;   
double *rnorm;

a =     (double **) argv[0];
m =     (int *)     argv[1];
n =     (int *)     argv[2];
b =     (double **) argv[3];
bnd =   (double **) argv[4];
x =     (double **) argv[5];
rnorm = (double *)  argv[6];
nsetp = (int *)     argv[7];
w =     (double **) argv[8];
index = (int *)     argv[9];
ierr =  (int *)     argv[10];

bvls_(a,m,n,b,bnd,x,rnorm,nsetp,w,index,ierr); 

}

編集: これを他の誰かに言及した後、中間のCラッパーの必要性をバイパスして、fortran ISO_C_BINDINGSモジュールを使用してCythonと直接インターフェースすることも可能であるべきだと彼らは提案しました。

4

1 に答える 1