PolyFEM
Loading...
Searching...
No Matches
DiffCache.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <polyfem/Common.hpp>
5
7
8#include <ipc/ipc.hpp>
9#include <ipc/collisions/normal/normal_collisions.hpp>
10#include <ipc/collisions/tangential/tangential_collisions.hpp>
11
12#include <Eigen/Core>
13
14#include <cassert>
15#include <optional>
16#include <vector>
17
18namespace polyfem
19{
22 {
23 public:
25 std::optional<varform::InitialConditionOverride> initial_condition_override;
26
27 void cache_adjoints(const Eigen::MatrixXd &adjoint_mat);
28
36 void cache_transient(
37 int step,
39 const Eigen::MatrixXd &sol,
40 const Eigen::MatrixXd *pressure);
41
42 const Eigen::MatrixXd &adjoint_mat() const { return adjoint_mat_; }
43
45
46 inline int size() const { return cur_size_; }
47 inline int bdf_order(int step) const
48 {
49 assert(step < size());
50 if (step < 0)
51 step += bdf_order_.size();
52 return bdf_order_(step);
53 }
54
55 Eigen::MatrixXd disp_grad(int step = 0) const
56 {
57 assert(step < size());
58 if (step < 0)
59 step += disp_grad_.size();
60 return disp_grad_[step];
61 }
62
63 Eigen::VectorXd u(int step) const
64 {
65 assert(step < size());
66 if (step < 0)
67 step += u_.cols();
68 return u_.col(step);
69 }
70 Eigen::VectorXd v(int step) const
71 {
72 assert(step < size());
73 if (step < 0)
74 step += v_.cols();
75 return v_.col(step);
76 }
77 Eigen::VectorXd acc(int step) const
78 {
79 assert(step < size());
80 if (step < 0)
81 step += acc_.cols();
82 return acc_.col(step);
83 }
84
85 const StiffnessMatrix &gradu_h(int step) const
86 {
87 assert(step < size());
88 if (step < 0)
89 step += gradu_h_.size();
90 return gradu_h_[step];
91 }
92 // const StiffnessMatrix &gradu_h_prev(const int step) const { assert(step < size()); return gradu_h_prev_[step]; }
93
94 const ipc::NormalCollisions &collision_set(int step) const
95 {
96 assert(step < size());
97 if (step < 0)
98 step += collision_set_.size();
99 return collision_set_[step];
100 }
101 const ipc::SmoothCollisions &smooth_collision_set(int step) const
102 {
103 assert(step < size());
104 if (step < 0)
105 step += smooth_collision_set_.size();
106 return smooth_collision_set_[step];
107 }
108 const ipc::TangentialCollisions &friction_collision_set(int step) const
109 {
110 assert(step < size());
111 if (step < 0)
112 step += friction_collision_set_.size();
113 return friction_collision_set_[step];
114 }
115 const ipc::NormalCollisions &normal_adhesion_collision_set(int step) const
116 {
117 assert(step < size());
118 if (step < 0)
119 step += normal_adhesion_collision_set_.size();
121 }
122 const ipc::TangentialCollisions &tangential_adhesion_collision_set(int step) const
123 {
124 assert(step < size());
125 if (step < 0)
128 }
129
130 private:
132 int cur_size_ = 0;
133
134 // Mapping from positions of FE basis nodes to positions of geometry nodes.
136
137 std::vector<Eigen::MatrixXd> disp_grad_; // macro linear displacement in homogenization
138 Eigen::MatrixXd u_; // PDE solution
139 Eigen::MatrixXd v_; // velocity in transient elastic simulations
140 Eigen::MatrixXd acc_; // acceleration in transient elastic simulations
141
142 Eigen::VectorXi bdf_order_; // BDF orders used at each time step in forward simulation
143
144 std::vector<StiffnessMatrix> gradu_h_; // gradient of force at time T wrt. u at time T
145 // std::vector<StiffnessMatrix> gradu_h_prev_; // gradient of force at time T wrt. u at time (T-1) in transient simulations
146
147 std::vector<ipc::NormalCollisions> collision_set_;
148 std::vector<ipc::SmoothCollisions> smooth_collision_set_;
149 std::vector<ipc::TangentialCollisions> friction_collision_set_;
150
151 std::vector<ipc::NormalCollisions> normal_adhesion_collision_set_;
152 std::vector<ipc::TangentialCollisions> tangential_adhesion_collision_set_;
153
154 Eigen::MatrixXd adjoint_mat_;
155
156 void init(const int dimension, const int ndof, const int n_time_steps = 0);
157
159 const Eigen::MatrixXd &u,
161 const ipc::NormalCollisions &collision_set,
162 const ipc::SmoothCollisions &smooth_collision_set,
163 const ipc::TangentialCollisions &friction_constraint_set,
164 const ipc::NormalCollisions &normal_adhesion_set,
165 const ipc::TangentialCollisions &tangential_adhesion_set,
166 const Eigen::MatrixXd &disp_grad);
167
169 const int cur_step,
170 const int cur_bdf_order,
171 const Eigen::MatrixXd &u,
172 const Eigen::MatrixXd &v,
173 const Eigen::MatrixXd &acc,
175 // const StiffnessMatrix &gradu_h_prev,
176 const ipc::NormalCollisions &collision_set,
177 const ipc::SmoothCollisions &smooth_collision_set,
178 const ipc::TangentialCollisions &friction_collision_set);
179
181 const int cur_step,
182 const Eigen::MatrixXd &u,
184 const ipc::NormalCollisions &collision_set,
185 const ipc::SmoothCollisions &smooth_collision_set,
186 const ipc::NormalCollisions &normal_adhesion_set,
187 const Eigen::MatrixXd &disp_grad);
188 };
189} // namespace polyfem
Storage for additional data required by differntial code.
Definition DiffCache.hpp:22
int bdf_order(int step) const
Definition DiffCache.hpp:47
int size() const
Definition DiffCache.hpp:46
Eigen::MatrixXd v_
std::vector< StiffnessMatrix > gradu_h_
std::vector< ipc::NormalCollisions > normal_adhesion_collision_set_
Eigen::MatrixXd acc_
std::vector< ipc::TangentialCollisions > friction_collision_set_
const ipc::NormalCollisions & collision_set(int step) const
Definition DiffCache.hpp:94
Eigen::MatrixXd disp_grad(int step=0) const
Definition DiffCache.hpp:55
std::optional< varform::InitialConditionOverride > initial_condition_override
Initial-condition override storage for initial condition optimization.
Definition DiffCache.hpp:25
Eigen::MatrixXd adjoint_mat_
Eigen::VectorXd v(int step) const
Definition DiffCache.hpp:70
StiffnessMatrix basis_nodes_to_gbasis_nodes_
std::vector< Eigen::MatrixXd > disp_grad_
const ipc::TangentialCollisions & friction_collision_set(int step) const
const Eigen::MatrixXd & adjoint_mat() const
Definition DiffCache.hpp:42
void cache_quantities_static(const Eigen::MatrixXd &u, const StiffnessMatrix &gradu_h, const ipc::NormalCollisions &collision_set, const ipc::SmoothCollisions &smooth_collision_set, const ipc::TangentialCollisions &friction_constraint_set, const ipc::NormalCollisions &normal_adhesion_set, const ipc::TangentialCollisions &tangential_adhesion_set, const Eigen::MatrixXd &disp_grad)
Eigen::VectorXd acc(int step) const
Definition DiffCache.hpp:77
void cache_transient(int step, varform::DifferentiableVarForm &varform, const Eigen::MatrixXd &sol, const Eigen::MatrixXd *pressure)
Cache time-dependent adjoint optimization data.
std::vector< ipc::SmoothCollisions > smooth_collision_set_
std::vector< ipc::TangentialCollisions > tangential_adhesion_collision_set_
const StiffnessMatrix & basis_nodes_to_gbasis_nodes() const
Eigen::VectorXi bdf_order_
void cache_quantities_quasistatic(const int cur_step, const Eigen::MatrixXd &u, const StiffnessMatrix &gradu_h, const ipc::NormalCollisions &collision_set, const ipc::SmoothCollisions &smooth_collision_set, const ipc::NormalCollisions &normal_adhesion_set, const Eigen::MatrixXd &disp_grad)
std::vector< ipc::NormalCollisions > collision_set_
const ipc::SmoothCollisions & smooth_collision_set(int step) const
Eigen::VectorXd u(int step) const
Definition DiffCache.hpp:63
void cache_adjoints(const Eigen::MatrixXd &adjoint_mat)
const StiffnessMatrix & gradu_h(int step) const
Definition DiffCache.hpp:85
void init(const int dimension, const int ndof, const int n_time_steps=0)
const ipc::NormalCollisions & normal_adhesion_collision_set(int step) const
Eigen::MatrixXd u_
void cache_quantities_transient(const int cur_step, const int cur_bdf_order, const Eigen::MatrixXd &u, const Eigen::MatrixXd &v, const Eigen::MatrixXd &acc, const StiffnessMatrix &gradu_h, const ipc::NormalCollisions &collision_set, const ipc::SmoothCollisions &smooth_collision_set, const ipc::TangentialCollisions &friction_collision_set)
const ipc::TangentialCollisions & tangential_adhesion_collision_set(int step) const
Optimization-facing interface implemented by differentiated VarForm adapters.
Eigen::SparseMatrix< double, Eigen::ColMajor > StiffnessMatrix
Definition Types.hpp:24