Eigen SparseLU解决了错误读取访问冲突,这个> m_sup_to_col是0x111011101110112

时间:2018-01-15 22:41:52

标签: c++ sparse-matrix eigen access-violation solver

我正在使用Visual Studio Community 2015,我尝试在c ++中使用Eigen库来解决大型稀疏线性系统。我的所有东西都包含在我的类Domain2D中,定义了刚度矩阵和载荷向量,载荷向量是我自己的long double类型:

typedef Eigen::Matrix<long double, Eigen::Dynamic, 1> VectorXld; // somewhere way up in the code

class Domain2D {
private:
    ...
    Eigen::SparseMatrix<long double, Eigen::ColMajor> constant_stiffness;
    Eigen::SparseMatrix<long double, Eigen::ColMajor> convection_stiffness;
    ...
    VectorXld load;
    ...
public:
    ...
    void load_constant_stiffness() {
        ...
        resize, reserve, fill up with elements
    }
    ...
    void load_convection_stiffness() {
        ...
    }
    void load_RHS() {
        ...
    }
}

最后,在课堂的某个地方,我有以下例程:

void advance_step(const int &step) {
        ...
        Eigen::SparseLU<Eigen::SparseMatrix<long double, Eigen::ColMajor>, Eigen::COLAMDOrdering<int>> solver;
        Eigen::SparseMatrix<long double, Eigen::ColMajor> M;
        VectorXld res, res_new;
        res.resize(2 * N + n);
        ...
        while (d > 1e-5) {
            d = 0;
            load_convection_stiffness();
            load_RHS();
            M = constant_stiffness + convection_stiffness;
            M.makeCompressed();
            solver.analyzePattern(M);
            solver.factorize(M);
            res_new = solver.solve(load);
            ...
        }
        Save("output\\results\\", step);
        t += dt;
    }

程序在最后提到的行上失败:res_new = solver.solve(M);

它显示了一个名为&#34; SparseLU_SupermodalMatrix.h&#34;的文件,它失败的例程是void MappedSuperNodalMatrix<Scalar,Index_>::solveInPlace( MatrixBase<Dest>&X) const,行是Index fsupc = supToCol()[k];,它显示的错误是

Unhandled exception thrown: read access violation.

this->m_sup_to_col was 0x111011101110112.

If there is a handler for this exception, the program may be safely continued.

我正在搜索一下,我发现如果我在课堂上使用特征对象,我应该在公共部分添加行EIGEN_MAKE_ALIGNED_OPERATOR_NEW;,我做了,但没有用。所有矩阵都具有适当的大小,以及长双精度的向量。我已经解决了这些系统已经有一段时间了,但它突然发生了。可能是什么原因?

P.S。:我将矩阵和载荷矢量加载到mathematica,即使是标准精度,我得到的解决方案看起来非常精细,所以它不像系统病态。

1 个答案:

答案 0 :(得分:1)

一些提示:

  1. 您需要在调用solver.info()==Eigen::Success之后检查factorize(),检查分解是否顺利。
  2. 尝试使用3.3分支here的负责人来查看此问题是否已得到解决。
  3. 确保你没有定义NDEBUG(在视觉上称为调试模式),看看Eigen是否触发了一些有见地的断言。
  4. 使用double而不是long double进行检查可能有助于隔离问题。为此,您可以使用M在本地投放load.cast<double>()
  5. 在内存调试器中运行程序也可能有所帮助。
  6. 在尝试了所有这些之后,与Eigen的团队分享你的矩阵M,让他们(即我自己;))重现这个问题。