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 varform::DifferentiableVarForm> varform, const io::ResourceIO &resources, 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 varform::DifferentiableVarForm> varform_;
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 varform::DifferentiableVarForm> varform,
63 const io::ResourceIO &resources,
64 const std::vector<int> &boundary_ids,
65 const double dhat,
66 const bool use_log_barrier = false,
67 const double dmin = 0);
68
69 std::string name() const override { return "layer thickness"; }
70
71 double max_step_size(const Eigen::VectorXd &x0, const Eigen::VectorXd &x1) const override { return 1.; }
72
73 protected:
75
76 std::vector<int> boundary_ids_;
77 std::map<int, std::set<int>> boundary_ids_to_dof_;
78 Eigen::MatrixXi can_collide_cache_;
79 };
80
82 {
83 public:
84 DeformedCollisionBarrierForm(const VariableToSimulationGroup &variable_to_simulation, std::shared_ptr<const varform::DifferentiableVarForm> varform, std::shared_ptr<const DiffCache> diff_cache, const io::ResourceIO &resources, const double dhat);
85
86 std::string name() const override { return "deformed_collision_barrier"; }
87
88 double value_unweighted(const Eigen::VectorXd &x) const override;
89
90 void compute_partial_gradient(const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override;
91
92 void solution_changed(const Eigen::VectorXd &x) override;
93
94 bool is_step_collision_free(const Eigen::VectorXd &x0, const Eigen::VectorXd &x1) const override;
95
96 double max_step_size(const Eigen::VectorXd &x0, const Eigen::VectorXd &x1) const override;
97
98 private:
99 void build_collision_set(const Eigen::MatrixXd &displaced_surface);
100
101 Eigen::VectorXd get_updated_mesh_nodes(const Eigen::VectorXd &x) const;
102
103 std::shared_ptr<const varform::DifferentiableVarForm> varform_;
104 std::shared_ptr<const DiffCache> diff_cache_;
105
106 Eigen::VectorXd X_init;
107
108 ipc::CollisionMesh collision_mesh_;
109 ipc::NormalCollisions collision_set;
110 const double dhat_;
111 ipc::BroadPhaseMethod broad_phase_method_;
112
113 const ipc::BarrierPotential barrier_potential_;
114 };
115
117 {
118 public:
120 const VariableToSimulationGroup &variable_to_simulations,
121 std::shared_ptr<const varform::DifferentiableVarForm> varform,
122 std::shared_ptr<const DiffCache> diff_cache,
123 const json &args);
125
126 double value_unweighted_step(const int time_step, const Eigen::VectorXd &x) const override;
127 Eigen::VectorXd compute_adjoint_rhs_step(const int time_step, const Eigen::VectorXd &x, const varform::DifferentiableVarForm &varform, const DiffCache &diff_cache) const override;
128 void compute_partial_gradient_step(const int time_step, const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override;
129 void solution_changed_step(const int time_step, const Eigen::VectorXd &x) override;
130
131 protected:
133 ipc::SmoothCollisions get_smooth_collision_set(const Eigen::MatrixXd &displaced_surface);
134
135 std::shared_ptr<const varform::DifferentiableVarForm> varform_;
136 std::shared_ptr<const DiffCache> diff_cache_;
137 std::set<int> boundary_ids_;
138 std::map<int, std::set<int>> boundary_ids_to_dof_;
139
140 ipc::CollisionMesh collision_mesh_;
141 ipc::SmoothCollisions collisions_;
142 const ipc::SmoothContactParameters params_;
143 const double dmin_ = 0;
144
145 ipc::SmoothContactPotential potential_;
146 };
147} // namespace polyfem::solver
int x
Storage for additional data required by differntial code.
Definition DiffCache.hpp:22
Read-only interface to a hierarchical collection of simulation resources.
ipc::BarrierPotential barrier_potential_
std::string name() const override
void build_collision_set(const Eigen::MatrixXd &displaced_surface)
ipc::BroadPhaseMethod broad_phase_method_
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.
std::shared_ptr< const varform::DifferentiableVarForm > varform_
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.
std::shared_ptr< const varform::DifferentiableVarForm > varform_
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)
std::shared_ptr< const varform::DifferentiableVarForm > varform_
void solution_changed_step(const int time_step, const Eigen::VectorXd &x) override
Eigen::VectorXd compute_adjoint_rhs_step(const int time_step, const Eigen::VectorXd &x, const varform::DifferentiableVarForm &varform, const DiffCache &diff_cache) const override
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_
Optimization-facing interface implemented by differentiated VarForm adapters.
nlohmann::json json
Definition Common.hpp:9