Skip to content

Commit 5fe982d

Browse files
authored
Merge pull request #16 from geomechanics/feature/fast_matrix_assembly
[Feature] Fast matrix assembly
2 parents d31f823 + 0888d17 commit 5fe982d

File tree

2 files changed

+16
-10
lines changed

2 files changed

+16
-10
lines changed

include/linear_solvers/assemblers/assembler_eigen_implicit_linear.tcc

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@ bool mpm::AssemblerEigenImplicitLinear<Tdim>::assemble_stiffness_matrix() {
1717
stiffness_matrix_.resize(active_dof_ * Tdim, active_dof_ * Tdim);
1818
stiffness_matrix_.setZero();
1919

20-
// Reserve storage for sparse matrix
21-
stiffness_matrix_.reserve(
22-
Eigen::VectorXi::Constant(active_dof_ * Tdim, sparse_row_size_ * Tdim));
20+
// Triplets and reserve storage for sparse matrix
21+
std::vector<Eigen::Triplet<double>> tripletList;
22+
tripletList.reserve(active_dof_ * Tdim * sparse_row_size_ * Tdim);
2323

2424
// Cell pointer
2525
const auto& cells = mesh_->cells();
@@ -43,17 +43,23 @@ bool mpm::AssemblerEigenImplicitLinear<Tdim>::assemble_stiffness_matrix() {
4343
for (unsigned j = 0; j < nids.size(); ++j) {
4444
for (unsigned k = 0; k < Tdim; ++k) {
4545
for (unsigned l = 0; l < Tdim; ++l) {
46-
stiffness_matrix_.coeffRef(
47-
nactive_node * k + global_node_indices_.at(cid)(i),
48-
nactive_node * l + global_node_indices_.at(cid)(j)) +=
49-
cell_stiffness(Tdim * i + k, Tdim * j + l);
46+
if (std::abs(cell_stiffness(Tdim * i + k, Tdim * j + l)) >
47+
std::numeric_limits<double>::epsilon())
48+
tripletList.push_back(Eigen::Triplet<double>(
49+
nactive_node * k + global_node_indices_.at(cid)(i),
50+
nactive_node * l + global_node_indices_.at(cid)(j),
51+
cell_stiffness(Tdim * i + k, Tdim * j + l)));
5052
}
5153
}
5254
}
5355
}
5456
++cid;
5557
}
5658
}
59+
60+
// Fast assembly from triplets
61+
stiffness_matrix_.setFromTriplets(tripletList.begin(), tripletList.end());
62+
5763
} catch (std::exception& exception) {
5864
console_->error("{} #{}: {}\n", __FILE__, __LINE__, exception.what());
5965
status = false;

include/solvers/mpm_implicit_linear.tcc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -345,16 +345,16 @@ bool mpm::MPMImplicitLinear<Tdim>::compute_equilibrium_equation() {
345345
Tdim * assembler_->global_active_dof());
346346

347347
// Prepare rank global mapper
348-
std::vector<int> predictor_rgm;
348+
std::vector<int> matrix_rgm;
349349
for (unsigned dir = 0; dir < Tdim; ++dir) {
350350
auto dir_rgm = assembler_->rank_global_mapper();
351351
std::for_each(dir_rgm.begin(), dir_rgm.end(),
352352
[size = assembler_->global_active_dof(),
353353
dir = dir](int& rgm) { rgm += dir * size; });
354-
predictor_rgm.insert(predictor_rgm.end(), dir_rgm.begin(), dir_rgm.end());
354+
matrix_rgm.insert(matrix_rgm.end(), dir_rgm.begin(), dir_rgm.end());
355355
}
356356
// Assign rank global mapper to solver
357-
linear_solver_["displacement"]->assign_rank_global_mapper(predictor_rgm);
357+
linear_solver_["displacement"]->assign_rank_global_mapper(matrix_rgm);
358358
#endif
359359

360360
// Solve matrix equation and assign solution to assembler

0 commit comments

Comments
 (0)