PolyFEM
Loading...
Searching...
No Matches
SurfaceTractionForms.hpp
Go to the documentation of this file.
1#pragma once
2
7
8#include <Eigen/Core>
9
10#include <memory>
11#include <map>
12#include <set>
13#include <vector>
14#include <utility>
15
16namespace polyfem::solver
17{
18 // class TractionNormForm : public SpatialIntegralForm
19 // {
20 // public:
21 // TractionNormForm(const VariableToSimulationGroup &variable_to_simulations, const State &state, const json &args) : SpatialIntegralForm(variable_to_simulations, state, args)
22 // {
23 // set_integral_type(SpatialIntegralType::Surface);
24
25 // auto tmp_ids = args["surface_selection"].get<std::vector<int>>();
26 // ids_ = std::set(tmp_ids.begin(), tmp_ids.end());
27
28 // if (args["power"] > 0)
29 // in_power_ = args["power"];
30 // }
31
32 // protected:
33 // IntegrableFunctional get_integral_functional() const override;
34
35 // private:
36 // int in_power_ = 2;
37 // };
38
39 // class TrueContactForceForm : public StaticForm
40 // {
41 // public:
42 // TrueContactForceForm(const VariableToSimulationGroup &variable_to_simulations, const State &state, const json &args) : StaticForm(variable_to_simulations), state_(state)
43 // {
44 // auto tmp_ids = args["surface_selection"].get<std::vector<int>>();
45 // ids_ = std::set(tmp_ids.begin(), tmp_ids.end());
46
47 // build_active_nodes();
48 // }
49 // ~TrueContactForceForm() = default;
50
51 // const State &get_state() { return state_; }
52
53 // double value_unweighted_step(const int time_step, const Eigen::VectorXd &x) const override;
54 // Eigen::VectorXd compute_adjoint_rhs_step(const int time_step, const Eigen::VectorXd &x, const State &state) const override;
55 // Eigen::VectorXd compute_adjoint_rhs_step_prev(const int time_step, const Eigen::VectorXd &x, const State &state) const override;
56 // virtual void compute_partial_gradient_step(const int time_step, const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override;
57
58 // void build_active_nodes();
59
60 // protected:
61 // const State &state_;
62 // std::set<int> ids_;
63 // Eigen::VectorXi active_nodes_;
64 // StiffnessMatrix active_nodes_mat_;
65 // int dim_;
66
67 // double dhat_, epsv_, friction_coefficient_;
68 // };
69
71 {
72 public:
74 const VariableToSimulationGroup &variable_to_simulations,
75 std::shared_ptr<const State> state,
76 std::shared_ptr<const DiffCache> diff_cache,
77 const double dhat,
78 const bool quadratic_potential,
79 const json &args);
81
82 double value_unweighted_step(const int time_step, const Eigen::VectorXd &x) const override;
83 Eigen::VectorXd compute_adjoint_rhs_step(const int time_step, const Eigen::VectorXd &x, const State &state, const DiffCache &diff_cache) const override;
84 void compute_partial_gradient_step(const int time_step, const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override;
85 void solution_changed_step(const int time_step, const Eigen::VectorXd &x) override
86 {
87 if (curr_x_.size() > 0 && (curr_x_ - x).norm() < 1e-8)
88 return;
89
92 curr_x_ = x;
93 }
94
95 protected:
98 const ipc::NormalCollisions &get_or_compute_collision_set(const int time_step, const Eigen::MatrixXd &displaced_surface) const;
99
100 std::shared_ptr<const State> state_;
101 std::shared_ptr<const DiffCache> diff_cache_;
102 std::set<int> boundary_ids_;
103 std::map<int, std::set<int>> boundary_ids_to_dof_;
104 Eigen::MatrixXi can_collide_cache_;
105
106 Eigen::MatrixXd node_positions_;
107
108 mutable Eigen::VectorXi collision_set_indicator_;
109 std::vector<std::shared_ptr<ipc::NormalCollisions>> collision_sets_;
110
111 ipc::CollisionMesh collision_mesh_;
112 const double dhat_;
113 const double dmin_ = 0;
114 ipc::BroadPhaseMethod broad_phase_method_;
115
116 Eigen::VectorXd curr_x_;
117
118 ipc::BarrierPotential barrier_potential_;
119 };
120
121} // 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
std::shared_ptr< const DiffCache > diff_cache_
double value_unweighted_step(const int time_step, const Eigen::VectorXd &x) const override
std::vector< std::shared_ptr< ipc::NormalCollisions > > collision_sets_
std::map< int, std::set< int > > boundary_ids_to_dof_
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 State &state, const DiffCache &diff_cache) const override
void compute_partial_gradient_step(const int time_step, const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override
const ipc::NormalCollisions & get_or_compute_collision_set(const int time_step, const Eigen::MatrixXd &displaced_surface) const
A collection of VariableToSimulation.
nlohmann::json json
Definition Common.hpp:9