PolyFEM
Loading...
Searching...
No Matches
BCLagrangianForm.hpp
Go to the documentation of this file.
1#pragma once
2
5
9
10namespace polyfem::solver
11{
13 enum class BCLumpingMode
14 {
15 ROW_SUM,
16 HRZ
17 };
18
21 {{BCLumpingMode::ROW_SUM, "row_sum"},
22 {BCLumpingMode::HRZ, "hrz"}});
23
26 {
27 public:
39 BCLagrangianForm(const int ndof,
40 const std::vector<int> &boundary_nodes,
41 const std::vector<mesh::LocalBoundary> &local_boundary,
42 const std::vector<mesh::LocalBoundary> &local_neumann_boundary,
43 const QuadratureOrders &n_boundary_samples,
44 const StiffnessMatrix &mass,
45 const assembler::RhsAssembler &rhs_assembler,
46 const size_t obstacle_ndof,
47 const bool is_time_dependent,
48 const double t,
50
51 std::string name() const override
52 {
53 return "bc-alagrangian";
54 }
55
62 BCLagrangianForm(const int ndof,
63 const std::vector<int> &boundary_nodes,
64 const StiffnessMatrix &mass,
65 const size_t obstacle_ndof,
66 const Eigen::MatrixXd &target_x);
67
71 double value_unweighted(const Eigen::VectorXd &x) const override;
72
76 void first_derivative_unweighted(const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override;
77
81 void second_derivative_unweighted(const Eigen::VectorXd &x, StiffnessMatrix &hessian) const override;
82
83 public:
87 void update_quantities(const double t, const Eigen::VectorXd &x) override;
88
89 void update_lagrangian(const Eigen::VectorXd &x, const double k_al) override;
90
91 double compute_error(const Eigen::VectorXd &x) const override;
92
93 virtual bool can_project() const override;
94 virtual void project_gradient(Eigen::VectorXd &grad) const override;
95 virtual void project_diag(Eigen::VectorXd &diag) const override;
96 virtual void project_hessian(StiffnessMatrix &hessian) const override;
97
98 private:
99 const std::vector<int> &boundary_nodes_;
100 const std::vector<mesh::LocalBoundary> *local_boundary_;
101 const std::vector<mesh::LocalBoundary> *local_neumann_boundary_;
103 const int n_dofs_;
104 Eigen::VectorXi constraints_;
105 Eigen::VectorXi not_constraints_;
109 std::vector<int> old_to_new_;
110
113
116
118
123 const StiffnessMatrix &mass,
124 const size_t obstacle_ndof);
125
128 void update_target(const double t);
129 };
130} // namespace polyfem::solver
int x
Form of the augmented lagrangian for bc constraints.
Eigen::VectorXi not_constraints_
Not Constraints.
void first_derivative_unweighted(const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override
Compute the first derivative of the value wrt x.
std::string name() const override
const QuadratureOrders n_boundary_samples_
void update_quantities(const double t, const Eigen::VectorXd &x) override
Update time dependent quantities.
void update_target(const double t)
Update target x to the Dirichlet boundary values at time t.
std::vector< int > old_to_new_
Map from full DOF index to reduced DOF index (-1 if constrained).
virtual bool can_project() const override
void update_lagrangian(const Eigen::VectorXd &x, const double k_al) override
double compute_error(const Eigen::VectorXd &x) const override
const assembler::RhsAssembler * rhs_assembler_
Reference to the RHS assembler.
void second_derivative_unweighted(const Eigen::VectorXd &x, StiffnessMatrix &hessian) const override
Compute the second derivative of the value wrt x.
virtual void project_gradient(Eigen::VectorXd &grad) const override
void init_masked_lumped_mass(const StiffnessMatrix &mass, const size_t obstacle_ndof)
Initialize the masked lumped mass matrix.
const std::vector< mesh::LocalBoundary > * local_neumann_boundary_
const std::vector< mesh::LocalBoundary > * local_boundary_
virtual void project_diag(Eigen::VectorXd &diag) const override
StiffnessMatrix masked_lumped_mass_sqrt_
sqrt mass matrix masked by the AL dofs
double value_unweighted(const Eigen::VectorXd &x) const override
Compute the value of the form.
virtual void project_hessian(StiffnessMatrix &hessian) const override
BCLumpingMode lumping_
lumping mode for the mass metric
StiffnessMatrix masked_lumped_mass_
mass matrix masked by the AL dofs
const std::vector< int > & boundary_nodes_
Eigen::VectorXi constraints_
Constraints.
NLOHMANN_JSON_SERIALIZE_ENUM(CollisionProxyTessellation, {{CollisionProxyTessellation::REGULAR, "regular"}, {CollisionProxyTessellation::IRREGULAR, "irregular"}})
BCLumpingMode
Lumping mode for the mass metric of the BC penalty.
@ ROW_SUM
Row-sum lumping (falls back to HRZ if ill-conditioned)
@ HRZ
Hinton-Rock-Zienkiewicz diagonal-scaling lumping.
std::array< int, 2 > QuadratureOrders
Definition Types.hpp:19
Eigen::SparseMatrix< double, Eigen::ColMajor > StiffnessMatrix
Definition Types.hpp:24