因此,在我的非线性有限元求解器中,我使用了Eigen3稀疏矩阵和LDLT分解。
问题是,这种因式分解在动态仿真中需要多次执行,并且需要花费大量的时间将系数插入到基于三叉图的迭代矩阵中(存储是保留的)。
对于如何利用稀疏性不变和插入顺序相同这一事实,有什么好的策略吗?在形成该矩阵时,在模型中对单元、耦合等进行循环,在仿真过程中的每一时刻插入顺序是相同的。
使用coeffref增加了大约10倍的模拟时间。
我一直在考虑对模型进行一次传递,并直接形成指向系数矩阵中各自位置的指针,但这似乎有点危险,特别是因为LDLT分解是在两者之间运行的。
发布于 2019-09-25 18:30:37
如果矩阵的稀疏模式没有在每个时间步骤中发生变化,那么您可以使用valuePtr()
直接更改原始数据数组的值。这是非常简单的,如果需要的话可以并行进行。如果你能搞清楚如何用线性的方式来做这件事,比如
SparseMatrix<double> A;
for(int i = 0; i < n; i++)
A.valuePtr()[i] = ...
然后它会愚蠢的快(与避免缓存,失误和其他黑魔法有关)。至于前面关于LDLT因式分解不会改变的评论,从理论的角度来看,这是正确的。然而,根据特征文件:
在因式分解()中,计算系数矩阵的因子。这一步应在矩阵的值变化__时调用。然而,矩阵的结构模式不应在多次调用之间发生变化。
我认为这是因为这些因素存储在求解器对象中,尽管我可能错了。一个测试应该是相当容易确认的方式。尽管如此,我认为您必须在更改值之后调用factorize()
。不过,只要调用一次analyzePattern()
例程,就可以节省大量时间。
https://stackoverflow.com/questions/57788939
复制相似问题