Shape smoothing: some comments added to accelerate matrix construction.

Konstantinos: this is what is so slow, not the solver!
This commit is contained in:
Pierre Alliez 2017-11-16 20:51:02 +01:00
parent e05831c1b3
commit 079f1baf86
2 changed files with 19 additions and 13 deletions

View File

@ -171,7 +171,6 @@ public:
//void solve_system(Eigen_matrix& stiffness_matrix)
void solve_system(Eigen::SparseMatrix<double>& L, const double time)
{
Eigen_matrix A(nb_vert_, nb_vert_);
Eigen_vector bx(nb_vert_);
@ -182,33 +181,33 @@ public:
Eigen_vector Xy(nb_vert_);
Eigen_vector Xz(nb_vert_);
std::cout << "compute coefficients...";
std::cerr << "compute coefficients...";
compute_coeff_matrix(A, L, time);
std::cout << "done" << std::endl;
std::cerr << "done" << std::endl;
std::cout << "rhs...";
std::cerr << "rhs...";
compute_rhs(bx, by, bz);
std::cout << "done" << std::endl;
std::cerr << "done" << std::endl;
// Cholesky factorization
std::cout << "compute ...";
std::cerr << "compute ...";
Eigen_solver solver;
solver.compute(A);
std::cout << "done" << std::endl;
std::cerr << "done" << std::endl;
// solver.analyzePattern(A);
// solver.factorize(A);
// back-substitution
std::cout << "solve...";
std::cerr << "solve...";
Xx = solver.solve(bx);
Xy = solver.solve(by);
Xz = solver.solve(bz);
std::cout << "done" << std::endl;
std::cerr << "done" << std::endl;
if(solver.info() != Eigen::Success)
{
std::cerr<<"Not Solved!\n";
std::cerr << "Not Solved!" << std::endl;
return;
}
@ -297,9 +296,13 @@ private:
return C;
}
Eigen_matrix stiff_matrix()
Eigen_matrix stiff_matrix() // TOFIX: pass reference to matrix
{
Eigen_matrix mat(nb_vert_, nb_vert_);
Eigen_matrix mat(nb_vert_, nb_vert_); // TOFIX
// TOFIX: very slow way to fill the matrx
// avoid matrix C!! and use triplets
// read http://eigen.tuxfamily.org/dox/group__TutorialSparse.html#TutorialSparseFilling
// cot values
Eigen_matrix C = cot_entries();

View File

@ -21,7 +21,10 @@ void smooth_shape(PolygonMesh& mesh, const double time, std::size_t nb_iter)
internal::Shape_smoother<PolygonMesh, VertexPointMap> smoother(mesh, vpmap);
Eigen::SparseMatrix<double> stiffness_matrix;
stiffness_matrix = smoother.calc_stiff_matrix();
std::cerr << "compute stiffness matrix...";
stiffness_matrix = smoother.calc_stiff_matrix(); // TOFIX: avoid copy
std::cerr << "done" << std::endl;
for(std::size_t t=0; t<nb_iter; ++t)
{