9 const std::vector<int> &boundary_nodes,
10 const std::vector<mesh::LocalBoundary> &local_boundary,
11 const std::vector<mesh::LocalBoundary> &local_neumann_boundary,
12 const int n_boundary_samples,
15 const size_t obstacle_ndof,
16 const bool is_time_dependent,
18 : boundary_nodes_(boundary_nodes),
19 local_boundary_(&local_boundary),
20 local_neumann_boundary_(&local_neumann_boundary),
21 n_boundary_samples_(n_boundary_samples),
22 rhs_assembler_(&rhs_assembler),
23 is_time_dependent_(is_time_dependent),
31 const std::vector<int> &boundary_nodes,
33 const size_t obstacle_ndof,
34 const Eigen::MatrixXd &target_x)
35 : boundary_nodes_(boundary_nodes),
36 local_boundary_(nullptr),
37 local_neumann_boundary_(nullptr),
38 n_boundary_samples_(0),
39 rhs_assembler_(nullptr),
40 is_time_dependent_(false),
52 const size_t obstacle_ndof)
54 std::vector<Eigen::Triplet<double>> A_triplets;
62 A_triplets.emplace_back(i, bn, 1.0);
65 A_.setFromTriplets(A_triplets.begin(), A_triplets.end());
70 double min_diag = std::numeric_limits<double>::max();
76 if (it.col() == it.row())
78 min_diag = std::min(min_diag, it.value());
79 max_diag = std::max(max_diag, it.value());
83 if (max_diag <= 0 || min_diag <= 0 || min_diag / max_diag < 1e-16)
85 logger().warn(
"Lumped mass matrix ill-conditioned. Setting lumped mass matrix to identity.");
92 if (obstacle_ndof != 0)
94 const int n_fe_dof =
n_dofs_ - obstacle_ndof;
96 for (
int i = n_fe_dof; i <
n_dofs_; ++i)
107 std::vector<Eigen::Triplet<double>> tmp_triplets;
113 assert(it.col() == k);
114 tmp_triplets.emplace_back(it.row(), it.col(), sqrt(it.value()));
121 std::vector<bool> is_contraints(
n_dofs_,
false);
128 for (
int i = 0; i <
n_dofs_; ++i)
130 if (is_contraints[i])
133 A_triplets.emplace_back(i, index, 1.0);
138 A_proj_.setFromTriplets(A_triplets.begin(), A_triplets.end());
163 const Eigen::VectorXd dist =
A_ *
x -
b_;
189 const Eigen::VectorXd res =
A_ *
x -
b_;
190 return res.squaredNorm();
void set_bc(const std::vector< mesh::LocalBoundary > &local_boundary, const std::vector< int > &bounday_nodes, const int resolution, const std::vector< mesh::LocalBoundary > &local_neumann_boundary, Eigen::MatrixXd &rhs, const Eigen::MatrixXd &displacement=Eigen::MatrixXd(), const double t=1) const
Eigen::SparseMatrix< double > lump_matrix(const Eigen::SparseMatrix< double > &M)
Lump each row of a matrix into the diagonal.
Eigen::SparseMatrix< double > sparse_identity(int rows, int cols)
spdlog::logger & logger()
Retrieves the current logger.
Eigen::SparseMatrix< double, Eigen::ColMajor > StiffnessMatrix