首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将pardiso解算器与eigen结合使用

将pardiso解算器与eigen结合使用
EN

Stack Overflow用户
提问于 2019-10-22 12:37:46
回答 1查看 383关注 0票数 0

我正在尝试用eigenpardiso求解器来解决非常大的sparse matrix system (Ax = b)。当我使用g++编译代码时,出现以下错误:

代码语言:javascript
复制
In file included from ${Eigenroot}/Eigen/PardisoSupport:31,
                 from code.cpp:8:
${Eigenroot}/Eigen/src/PardisoSupport/PardisoSupport.h: In static member function 'static IndexType Eigen::internal::pardiso_run_selector<IndexType>::run(void*, IndexType, IndexType, IndexType, IndexType, IndexType, void*, IndexType*, IndexType*, IndexType*, IndexType, IndexType*, IndexType, void*, void*) [with IndexType = int]':
${Eigenroot}/Eigen/src/PardisoSupport/PardisoSupport.h:269:   instantiated from 'Derived& Eigen::PardisoImpl<Derived>::compute(const typename Eigen::internal::pardiso_traits<Derived>::MatrixType&) [with Derived = Eigen::PardisoLU<Eigen::SparseMatrix<double, 0, int> >]'
${Eigenroot}/Eigen/src/PardisoSupport/PardisoSupport.h:409:   instantiated from 'Eigen::PardisoLU<_MatrixType>::PardisoLU(const MatrixType&) [with MatrixType = Eigen::SparseMatrix<double, 0, int>]'
code.cpp:82:   instantiated from here
${Eigenroot}/Eigen/src/PardisoSupport/PardisoSupport.h:50: error: cannot convert 'int*' to 'const long long int*' for argument '2' to 'void pardiso(void*, const long long int*, const long long int*, const long long int*, const long long int*, const long long int*, const void*, const long long int*, const long long int*, long long int*, const long long int*, long long int*, const long long int*, void*, void*, long long int*)'

我认为我不需要改变sparse matrices的形式,但似乎我需要改变稀疏矩阵的形式应该适合pardiso。但是当我找到别人的示例代码时,他们并没有改变sparse matrix的形式。而且它似乎也起作用了。

我做得对吗?我不很清楚。谁能告诉我问题出在哪里?

(关于A和B,它们与这个问题无关。因为我确实用sparseLU得到了答案,它是eigen的内置求解器。但是它的速度太慢了,我尝试使用pardisoLU。)

代码语言:javascript
复制
#include <iostream>
#include <fstream>
#include <string>
#include <Eigen/Sparse>
#include <unsupported/Eigen/SparseExtra>
#include <Eigen/PardisoSupport>

using namespace std;
using namespace Eigen;
typedef Eigen::Triplet<double> T;
typedef Eigen::SparseMatrix<double> SpMat;

int main(){ 
int m = 10000; // number of rows;
int n = 10000; // number of cols;
SpMat A(m,n); // declare sparse matrix A
//
make tripletlist
//
A.setFromTriplets(TripletList.begin(), TripletList.end());
SpMat B(m,1);
// 
insert values into B
//
PardisoLU< SparseMatrix<double> > solver( A );
x = solver.solve( B );
}

并使用g++将其编译为

代码语言:javascript
复制
g++ -I ${Eigenroot} -DEIGEN_USE_MKL_ALL -DMKL_ILP64 -m64 -I ${mklroot}/linux/mkl/include -o out.out code.cpp -L ${mklroot}/linux/mkl/lib/intel64 -Wl, -lmkl_intel_ilp64 -lmkl_gnu_thread -lmkl_core -lmkl_blacs_intelmpi_ilp64 -lgomp -lpthread -lm -ldl
EN

回答 1

Stack Overflow用户

发布于 2019-10-22 18:30:56

ILP64链接可能会出现一些问题。您是否可以尝试在没有-DMKL_ILP64选项的情况下使用-lmkl_intel_lp64而不是-lmkl_intel_ilp64进行链接

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58497158

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档