bool EigenLisLinearSolver::solve(EigenMatrix &A_, EigenVector& b_, EigenVector &x_) { static_assert(EigenMatrix::RawMatrixType::IsRowMajor, "Sparse matrix is required to be in row major storage."); auto &A = A_.getRawMatrix(); auto &b = b_.getRawVector(); auto &x = x_.getRawVector(); if (!A.isCompressed()) A.makeCompressed(); int nnz = A.nonZeros(); int* ptr = A.outerIndexPtr(); int* col = A.innerIndexPtr(); double* data = A.valuePtr(); LisMatrix lisA(A_.getNumberOfRows(), nnz, ptr, col, data); LisVector lisb(b.rows(), b.data()); LisVector lisx(x.rows(), x.data()); LisLinearSolver lissol; // TODO not always creat Lis solver here lissol.setOption(_lis_option); lissol.solve(lisA, lisb, lisx); for (std::size_t i=0; i<lisx.size(); i++) x[i] = lisx[i]; return true; // TODO implement checks }
void EigenLisLinearSolver::solve(EigenVector &b_, EigenVector &x_) { auto &A = _A.getRawMatrix(); auto &b = b_.getRawVector(); auto &x = x_.getRawVector(); if (!A.isCompressed()) A.makeCompressed(); int nnz = A.nonZeros(); int* ptr = A.outerIndexPtr(); int* col = A.innerIndexPtr(); double* data = A.valuePtr(); LisMatrix lisA(_A.getNRows(), nnz, ptr, col, data); LisVector lisb(b.rows(), b.data()); LisVector lisx(x.rows(), x.data()); LisLinearSolver lissol(lisA); lissol.setOption(_option); lissol.solve(lisb, lisx); for (std::size_t i=0; i<lisx.size(); i++) x[i] = lisx[i]; }