【发布时间】:2017-11-03 10:43:38
【问题描述】:
全部成交, 感谢您花时间阅读我的问题。 我正在使用 Eigen3.3.4(http://eigen.tuxfamily.org/index.php?title=Main_Page) 编写一些 FEM 代码。
我阅读了 Eigen3.3.4 文档,在这个网站 (http://eigen.tuxfamily.org/dox/TopicFunctionTakingEigenTypes.html) 中,它说
我们应该使用Ref<MatrixBase>来避免额外的副本并获得高性能。
所以在我的 FEM 代码中,对于稀疏矩阵组装部分,假设函数是:
FormFE(const Ref<VectorXd> &U,const Ref<VectorXd> &V,
Ref<SparseMatrix<double> > AMATRIX,Ref<VectorXd> RHS)
其中 U 代表位移,V 代表速度项。 AMATRIX 是我的稀疏矩阵,RHS 是残差项。
然后我尝试在组装之前首先初始化我的 AMATRIX(我有一个包含所有非零元素及其值的三元组列表(我将值设置为零以进行初始化)) 所以我尝试了:
AMATRIX.setFromTriplets(ZeroTripList.begin(),ZeroTripList.end());
但我有一个错误:
class Eigen::Ref<Eigen::SparseMatrix<double, 0, int> >’ has no member named ‘setFromTriplets
那么我该如何解决这个问题呢?
我的一个解决方案是使用:
FormFE(const Ref<VectorXd> &U,const Ref<VectorXd> &V,
SparseMatrix<double> &AMATRIX,Ref<VectorXd> RHS)
这工作得很好,但我不确定它是否有效。 我不太擅长 cpp :P
其实我的问题是:
- 如何有效地使用 Eigen(尤其是 FEM 计算),我几乎在每个 FEM 相关函数中都使用 Eigen 的 VectorXd 和 MatrixXd。
- 如何高效组装 SparseMatrix?
- 是否可以为 FEM 组装做一些 OpenMP 并行化?
- 欢迎对基于 C++ 的 FEM 编码提出任何有用的建议(库推荐或任何有用的想法)!
谢谢。 最好的问候。
【问题讨论】:
-
这与汇编编程有什么关系?
-
嗨,我所有当前元素的系数都存储在一个tripletList中,所以我可以通过setFromTriplist进行组装。
-
那不是汇编编程。这个词有特定的含义。
-
对不起,这里的“组装”是指FEM的组装。
-
我明白这一点。但是,标签 [assembly] 是错误的,因为该标签是针对用汇编编写的程序的。
标签: c++ matrix sparse-matrix eigen eigen3