【问题标题】:calling fortran 77 from c for arpack从 c 调用 fortran 77 以获取 arpack
【发布时间】:2016-07-07 09:34:13
【问题描述】:

我正在尝试从 ARPACK 调用 fortran 函数 dsaupd。我使用了来自netlib-java的C声明

  extern void dsaupd_(int *ido, char *bmat, int *n, char *which,
                       int *nev, double *tol, double *resid,
                       int *ncv, double *V, int *ldv,
                       int *iparam, int *ipntr, double *workd,
                       double *workl, int *lworkl, int *info);

然后我在调用 dsaupd 之前在程序中将 numcols 定义为 int

int ido = 0;
int ncv = 2*numeigs;
int maxiter = 30;
double tol = 1e-13;
double * v = (double *) malloc(numcols * ncv *sizeof(double));
int iparam[11] = {1, 0, maxiter, 1, 0, 0, 1, 0, 0, 0, 0};
int ipntr[11];
double * workd = (double *) malloc(3*numcols*sizeof(double));
int lworkl = ncv*(ncv + 8);
double * workl = (double *) malloc(lworkl*sizeof(double));
int arpack_info = 0;

char bmat = 'I';
char which[2] = {'L', 'M'};
MPI_Barrier(comm);
if (mpi_rank == 0) {
    printf("Here!\n");
    dsaupd_(&ido, &bmat, &numcols, which,
            &numeigs, &tol, vector, 
            &ncv, v, &numcols,
            iparam, ipntr, workd, 
            workl, &lworkl, &arpack_info);
    printf("Here!\n");
}

代码编译并使其成为第一个“Here”打印输出,但之后停止。知道我做错了什么,或者如何调试这个调用?

【问题讨论】:

  • 1) 不要在 C 中转换 malloc 和朋友的结果。2) 复合类型的初始化器必须是常量。
  • 这两个我都试过了,但我还是遇到了一个问题。初始化器是有意义的(虽然这里的 maxiter 是一个常数,所以应该不是问题),但是为什么我不应该将 malloc 转换为正确的类型呢?
  • maxiter 绝对不是常量,而是变量。即使它是合格的const,它也不是一个常数。 C 不是 C++,除了非常有限的 enum-constants 之外,它没有符号常量。
  • 我明白了。选角呢?谢谢。
  • 没关系,这个问题与 arpack 的编译方式有关。当我尝试运行他们的示例代码时,我也遇到了同样的问题。所以我切换到 arpack-ng 并且一切正常。

标签: c linker fortran hpc arpack


【解决方案1】:

我认为即使 arpack 正在我的系统上编译,它的链接也不正确。切换到arpack-ng 解决了这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-26
    • 2017-11-08
    • 2014-11-05
    • 1970-01-01
    相关资源
    最近更新 更多