PolyFEM
Loading...
Searching...
No Matches
BarrierForms.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <polyfem/Common.hpp>
9
10#include <Eigen/Core>
11#include <ipc/potentials/barrier_potential.hpp>
12#include <ipc/smooth_contact/smooth_collisions.hpp>
13#include <ipc/smooth_contact/smooth_contact_potential.hpp>
14
15#include <memory>
16#include <map>
17#include <set>
18#include <string>
19#include <vector>
20
21namespace polyfem::solver
22{
24 {
25 public:
26 CollisionBarrierForm(const VariableToSimulationGroup &variable_to_simulation, std::shared_ptr<const State> state, const double dhat, const double dmin = 0);
27
28 double value_unweighted(const Eigen::VectorXd &x) const override;
29
30 void compute_partial_gradient(const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override;
31
32 void solution_changed(const Eigen::VectorXd &x) override;
33
34 bool is_step_collision_free(const Eigen::VectorXd &x0, const Eigen::VectorXd &x1) const override;
35
36 std::string name() const override { return "collision barrier"; }
37
38 double max_step_size(const Eigen::VectorXd &x0, const Eigen::VectorXd &x1) const override;
39
40 protected:
41 void build_collision_set(const Eigen::MatrixXd &displaced_surface);
42
43 Eigen::VectorXd get_updated_mesh_nodes(const Eigen::VectorXd &x) const;
44
45 std::shared_ptr<const State> state_;
46
47 Eigen::VectorXd X_init;
48
49 ipc::CollisionMesh collision_mesh_;
50 ipc::NormalCollisions collision_set;
51 const double dhat_;
52 const double dmin_;
53 ipc::BroadPhaseMethod broad_phase_method_;
54
55 ipc::BarrierPotential barrier_potential_;
56 };
57
59 {
60 public:
61 LayerThicknessForm(const VariableToSimulationGroup &variable_to_simulations,
62 std::shared_ptr<const State> state,
63 const std::vector<int> &boundary_ids,
64 const double dhat,
65 const bool use_log_barrier = false,
66 const double dmin = 0);
67
68 std::string name() const override { return "layer thickness"; }
69
70 double max_step_size(const Eigen::VectorXd &x0, const Eigen::VectorXd &x1) const override { return 1.; }
71
72 protected:
74
75 std::vector<int> boundary_ids_;
76 std::map<int, std::set<int>> boundary_ids_to_dof_;
77 Eigen::MatrixXi can_collide_cache_;
78 };
79
81 {
82 public:
83 DeformedCollisionBarrierForm(const VariableToSimulationGroup &variable_to_simulation, std::shared_ptr<const State> state, std::shared_ptr<const DiffCache> diff_cache, const double dhat);
84
85 std::string name() const override { return "deformed_collision_barrier"; }
86
87 double value_unweighted(const Eigen::VectorXd &x) const override;
88
89 void compute_partial_gradient(const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override;
90
91 void solution_changed(const Eigen::VectorXd &x) override;
92
93 bool is_step_collision_free(const Eigen::VectorXd &x0, const Eigen::VectorXd &x1) const override;
94
95 double max_step_size(const Eigen::VectorXd &x0, const Eigen::VectorXd &x1) const override;
96
97 private:
98 void build_collision_set(const Eigen::MatrixXd &displaced_surface);
99
100 Eigen::VectorXd get_updated_mesh_nodes(const Eigen::VectorXd &x) const;
101
102 std::shared_ptr<const State> state_;
103 std::shared_ptr<const DiffCache> diff_cache_;
104
105 Eigen::VectorXd X_init;
106
107 ipc::CollisionMesh collision_mesh_;
108 ipc::NormalCollisions collision_set;
109 const double dhat_;
110 ipc::BroadPhaseMethod broad_phase_method_;
111
112 const ipc::BarrierPotential barrier_potential_;
113 };
114
116 {
117 public:
119 const VariableToSimulationGroup &variable_to_simulations,
120 std::shared_ptr<const State> state,
121 std::shared_ptr<const DiffCache> diff_cache,
122 const json &args);
124
125 double value_unweighted_step(const int time_step, const Eigen::VectorXd &x) const override;
126 Eigen::VectorXd compute_adjoint_rhs_step(const int time_step, const Eigen::VectorXd &x, const State &state, const DiffCache &diff_cache) const override;
127 void compute_partial_gradient_step(const int time_step, const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override;
128 void solution_changed_step(const int time_step, const Eigen::VectorXd &x) override;
129
130 protected:
132 ipc::SmoothCollisions get_smooth_collision_set(const Eigen::MatrixXd &displaced_surface);
133
134 std::shared_ptr<const State> state_;
135 std::shared_ptr<const DiffCache> diff_cache_;
136 std::set<int> boundary_ids_;
137 std::map<int, std::set<int>> boundary_ids_to_dof_;
138
139 ipc::CollisionMesh collision_mesh_;
140 ipc::SmoothCollisions collisions_;
141 const ipc::SmoothContactParameters params_;
142 const double dmin_ = 0;
143
144 ipc::SmoothContactPotential potential_;
145 };
146} // namespace polyfem::solver
int x
Storage for additional data required by differntial code.
Definition DiffCache.hpp:21
main class that contains the polyfem solver and all its state
Definition State.hpp:113
ipc::BarrierPotential barrier_potential_
std::string name() const override
void build_collision_set(const Eigen::MatrixXd &displaced_surface)
ipc::BroadPhaseMethod broad_phase_method_
std::shared_ptr< const State > state_
bool is_step_collision_free(const Eigen::VectorXd &x0, const Eigen::VectorXd &x1) const override
Checks if the step is collision free.
double max_step_size(const Eigen::VectorXd &x0, const Eigen::VectorXd &x1) const override
Determine the maximum step size allowable between the current and next solution.
void compute_partial_gradient(const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override
void solution_changed(const Eigen::VectorXd &x) override
Update cached fields upon a change in the solution.
double value_unweighted(const Eigen::VectorXd &x) const override
Compute the value of the form.
Eigen::VectorXd get_updated_mesh_nodes(const Eigen::VectorXd &x) const
bool is_step_collision_free(const Eigen::VectorXd &x0, const Eigen::VectorXd &x1) const override
Checks if the step is collision free.
std::shared_ptr< const DiffCache > diff_cache_
void compute_partial_gradient(const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override
double max_step_size(const Eigen::VectorXd &x0, const Eigen::VectorXd &x1) const override
Determine the maximum step size allowable between the current and next solution.
double value_unweighted(const Eigen::VectorXd &x) const override
Compute the value of the form.
const ipc::BarrierPotential barrier_potential_
void build_collision_set(const Eigen::MatrixXd &displaced_surface)
Eigen::VectorXd get_updated_mesh_nodes(const Eigen::VectorXd &x) const
void solution_changed(const Eigen::VectorXd &x) override
Update cached fields upon a change in the solution.
double max_step_size(const Eigen::VectorXd &x0, const Eigen::VectorXd &x1) const override
Determine the maximum step size allowable between the current and next solution.
std::map< int, std::set< int > > boundary_ids_to_dof_
std::string name() const override
ipc::SmoothCollisions get_smooth_collision_set(const Eigen::MatrixXd &displaced_surface)
Eigen::VectorXd compute_adjoint_rhs_step(const int time_step, const Eigen::VectorXd &x, const State &state, const DiffCache &diff_cache) const override
void solution_changed_step(const int time_step, const Eigen::VectorXd &x) override
std::shared_ptr< const State > state_
double value_unweighted_step(const int time_step, const Eigen::VectorXd &x) const override
void compute_partial_gradient_step(const int time_step, const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override
std::map< int, std::set< int > > boundary_ids_to_dof_
const ipc::SmoothContactParameters params_
std::shared_ptr< const DiffCache > diff_cache_
ipc::SmoothContactPotential potential_
A collection of VariableToSimulation.
nlohmann::json json
Definition Common.hpp:9