Deal all, Thank you for your time to read my question. I'm using Eigen3.3.4(http://eigen.tuxfamily.org/index.php?title=Main_Page) to write some FEM code.
I read the Eigen3.3.4 document, and in this website(http://eigen.tuxfamily.org/dox/TopicFunctionTakingEigenTypes.html), it says
we should use Ref<MatrixBase>
to avoid the additioinal copy and obtain high performance.
So in my FEM code, for the sparse matrix assemble part, let's say the function is:
FormFE(const Ref<VectorXd> &U,const Ref<VectorXd> &V,
Ref<SparseMatrix<double> > AMATRIX,Ref<VectorXd> RHS)
where U represent the displacement, V represent the velocity term. AMATRIX is my sparse matrix, RHS is the residual term.
Then I try to first initializing my AMATRIX before assemble(I have a tripletList which contains all the non-zero element and its value(I set the value to zero for initializing)) So I tried:
AMATRIX.setFromTriplets(ZeroTripList.begin(),ZeroTripList.end());
But I have an error:
class Eigen::Ref<Eigen::SparseMatrix<double, 0, int> >’ has no member named ‘setFromTriplets
So how could I solve this problem?
One of my solution is using :
FormFE(const Ref<VectorXd> &U,const Ref<VectorXd> &V,
SparseMatrix<double> &AMATRIX,Ref<VectorXd> RHS)
this is working very fine, but I'm not sure it is efficient or not. I'm not very good at cpp :P
Actually, My questions are:
- How to efficiently use Eigen(especially for FEM calculation), I use Eigen's VectorXd and MatrixXd almost everywhere in each of my FEM-related function.
- How to efficiently assemble a SparseMatrix?
- Is it possible to do some OpenMP parallelization for the FEM assemble?
- Any helpful suggestions for C++ based FEM coding(library recommendation or any helpful ideas) are welcome!
Thank you. Best regards.