9 const std::shared_ptr<utils::PeriodicBoundary> &periodic_bc)
10 : periodic_bc_(periodic_bc),
13 std::vector<Eigen::Triplet<double>> A_triplets;
19 for (
int d = 0; d < dim; d++)
21 A_triplets.emplace_back(d + i * dim, d + dim * c[0], 1.0);
22 A_triplets.emplace_back(d + i * dim, d + dim * c[1], -1.0);
26 A_.setFromTriplets(A_triplets.begin(), A_triplets.end());
29 b_.setZero(
A_.rows(), 1);
34 for (
int i = 0; i < index_map.size(); i++)
35 for (
int d = 0; d < dim; d++)
36 A_triplets.emplace_back(i * dim + d, index_map(i) * dim + d, 1.0);
37 assert(index_map.size() * dim ==
n_dofs_);
41 A_proj_.setFromTriplets(A_triplets.begin(), A_triplets.end());
64 const Eigen::VectorXd dist =
A_ *
x -
b_;
65 const double L_penalty = -
lagr_mults_.transpose() * dist;
66 const double A_penalty = 0.5 * dist.transpose() * dist;
84 const Eigen::VectorXd res =
A_ *
x -
b_;
85 return res.squaredNorm();
Eigen::SparseMatrix< double, Eigen::ColMajor > StiffnessMatrix