我正在使用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,即使是标准精度,我得到的解决方案看起来非常精细,所以它不像系统病态。
答案 0 :(得分:1)
一些提示:
solver.info()==Eigen::Success
之后检查factorize()
,检查分解是否顺利。NDEBUG
(在视觉上称为调试模式),看看Eigen是否触发了一些有见地的断言。double
而不是long double
进行检查可能有助于隔离问题。为此,您可以使用M
在本地投放load
和.cast<double>()
。 M
,让他们(即我自己;))重现这个问题。