直到最近,我一直在使用 IDL 来解决我的大部分计算问题。我最常用的例程之一是一些 fortran90 代码,用 C 语言包装并使用 CALL_EXTERNAL 函数从 IDL 调用(这些都不是我写的)。由于各种原因,我将大部分计算转移到 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);
}
编辑: 在向其他人提到这一点后,他们建议也应该可以使用 fortran ISO_C_BINDINGS 模块直接与 Cython 交互,绕过对中间 C 包装器的需要。