Lapack的dgesv编译,但dgesvxx没有编译

时间:2015-05-29 08:01:34

标签: compilation fortran linear-algebra lapack

我需要求解一个(573或更多)方程的大系统,其形式为(A0-A1*t)*x=b,其中A0,A1是矩阵t是实数,x,b是向量。我已经使用了Lapack的dgesv和MUMPS来解决一系列t的值,并且两个求解器都失败了t的某些值但不是同一个值。如果t的步长足够小(1.0e-6),两个求解器都会显示明确定义的区域,它们可以解决或不解决,但他们不同意这些区域。

两个求解器报告的误差是矩阵在无法求解时是奇异的。在我看来,这似乎是一个病态的矩阵问题,所以我尝试在我准备的一个小得多的矩阵上使用Lapack的专业例程dgesvx和dgesvxx作为例子。我知道这些例程会搜索预处理器来解决,但我并不完全确定。

The demonstration I made

示例中的矩阵以这样的方式构造:改变参数lam,在0时使矩阵的行列式lam=0和系统的解是[2,3} ,5,7]无论lam的值如何。我可以让dgesvx编译并解决没有任何问题,但我无法理解错误dgesv返回几乎所有的改进。

所以我尝试使用dgesvxx,但gfortran不会编译它。我运行命令

$ gfortran ill_conditioned.f90 -o ill_conditioned -llapack

并收到错误

/tmp/ccaC8jCk.o: In function `MAIN__': ill_conditioned.f90:(.text+0x38e): undefined reference to `dgesvxx_' collect2: error: ld returned 1 exit status

dgesvdgesvx不会发生这种情况。我使用命令sudo apt-get install liblapack-dev在我的Ubuntu机器上安装了lapack版本3.5.0-2ubuntu1。

1 个答案:

答案 0 :(得分:2)

这对我来说似乎是一些分配问题。

在我的发行版(OpenSUSE)上,虽然dgesvxx.f将{C}接口定义为lapacke.h,但我也dgesvxx丢失了。

在共享库中搜索符号dgesvx

nm -D /usr/lib64/liblapack.so | grep dgesvx

仅查找dgesvx而不是dgesvxx

我建议您从netlib下载LAPACK源代码,并使用一些高性能BLAS自行构建。您也可以尝试OpenBLAS,其中包括LAPACK。