PolyFEM
Loading...
Searching...
No Matches
AdjointTools.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <polyfem/Common.hpp>
4#include <set>
5
6namespace polyfem
7{
8 class State;
9 class IntegrableFunctional;
10
11 namespace solver {
12 class PeriodicMeshToMesh;
13 }
14} // namespace polyfem
15
16namespace polyfem::solver
17{
30
32 {
33 Volume,
34 Surface,
36 };
37
38 namespace AdjointTools
39 {
41 const State &state,
42 const IntegrableFunctional &j,
43 const Eigen::MatrixXd &solution,
44 const std::set<int> &interested_ids, // either body id or surface id
45 const SpatialIntegralType spatial_integral_type,
46 const int cur_step = 0);
47 void dJ_du_step(
48 const State &state,
49 const IntegrableFunctional &j,
50 const Eigen::MatrixXd &solution,
51 const std::set<int> &interested_ids,
52 const SpatialIntegralType spatial_integral_type,
53 const int cur_step,
54 Eigen::VectorXd &term);
56 const State &state,
57 const Eigen::MatrixXd &solution,
58 const IntegrableFunctional &j,
59 const std::set<int> &interested_ids, // either body id or surface id
60 const SpatialIntegralType spatial_integral_type,
61 Eigen::VectorXd &term,
62 const int cur_time_step);
64 const State &state,
65 const Eigen::MatrixXd &sol,
66 const Eigen::MatrixXd &adjoint,
67 Eigen::VectorXd &one_form);
68
69 // The periodic simulation result may not be differentiable wrt.
70 // every vertex of the periodic mesh, since a pair of periodic
71 // vertices cannot move freely, in which case
72 // dJ_periodic_shape_adjoint_term() instead of
73 // dJ_shape_homogenization_adjoint_term() should be used: When it
74 // computes shape derivatives, it considers the pair of periodic
75 // vertices as only one degree of freedom.
77 const State &state,
78 const Eigen::MatrixXd &sol,
79 const Eigen::MatrixXd &adjoint,
80 Eigen::VectorXd &one_form);
82 const State &state,
83 const PeriodicMeshToMesh &periodic_mesh_map,
84 const Eigen::VectorXd &periodic_mesh_representation,
85 const Eigen::MatrixXd &sol,
86 const Eigen::MatrixXd &adjoint,
87 Eigen::VectorXd &one_form);
88
90 const State &state,
91 const Eigen::MatrixXd &adjoint_nu,
92 const Eigen::MatrixXd &adjoint_p,
93 Eigen::VectorXd &one_form);
95 const State &state,
96 const Eigen::MatrixXd &sol,
97 const Eigen::MatrixXd &adjoint,
98 Eigen::VectorXd &one_form);
100 const State &state,
101 const Eigen::MatrixXd &adjoint_nu,
102 const Eigen::MatrixXd &adjoint_p,
103 Eigen::VectorXd &one_form);
105 const State &state,
106 const Eigen::MatrixXd &adjoint_nu,
107 const Eigen::MatrixXd &adjoint_p,
108 Eigen::VectorXd &one_form);
110 const State &state,
111 const Eigen::MatrixXd &adjoint_nu,
112 const Eigen::MatrixXd &adjoint_p,
113 Eigen::VectorXd &one_form);
115 const State &state,
116 const Eigen::MatrixXd &adjoint_nu,
117 const Eigen::MatrixXd &adjoint_p,
118 Eigen::VectorXd &one_form);
120 const State &state,
121 const Eigen::MatrixXd &adjoint_nu,
122 const Eigen::MatrixXd &adjoint_p,
123 Eigen::VectorXd &one_form);
125 const State &state,
126 const std::vector<int> &boundary_ids,
127 const Eigen::MatrixXd &sol,
128 const Eigen::MatrixXd &adjoint,
129 Eigen::VectorXd &one_form);
131 const State &state,
132 const std::vector<int> &boundary_ids,
133 const Eigen::MatrixXd &adjoint_nu,
134 const Eigen::MatrixXd &adjoint_p,
135 Eigen::VectorXd &one_form);
136
137 Eigen::VectorXd map_primitive_to_node_order(
138 const State &state,
139 const Eigen::VectorXd &primitives);
140 Eigen::VectorXd map_node_to_primitive_order(
141 const State &state,
142 const Eigen::VectorXd &nodes);
143
144 Eigen::MatrixXd edge_normal_gradient(
145 const Eigen::MatrixXd &V);
146 Eigen::MatrixXd face_normal_gradient(
147 const Eigen::MatrixXd &V);
148
149 Eigen::MatrixXd edge_velocity_divergence(
150 const Eigen::MatrixXd &V);
151 Eigen::MatrixXd face_velocity_divergence(
152 const Eigen::MatrixXd &V);
153
154 double triangle_jacobian(const Eigen::VectorXd &v1, const Eigen::VectorXd &v2, const Eigen::VectorXd &v3);
155 double tet_determinant(const Eigen::VectorXd &v1, const Eigen::VectorXd &v2, const Eigen::VectorXd &v3, const Eigen::VectorXd &v4);
156 void scaled_jacobian(const Eigen::MatrixXd &V, const Eigen::MatrixXi &F, Eigen::VectorXd &quality);
157 bool is_flipped(const Eigen::MatrixXd &V, const Eigen::MatrixXi &F);
158 }; // namespace AdjointTools
159} // namespace polyfem::solver
int V
main class that contains the polyfem solver and all its state
Definition State.hpp:79
double tet_determinant(const Eigen::VectorXd &v1, const Eigen::VectorXd &v2, const Eigen::VectorXd &v3, const Eigen::VectorXd &v4)
void dJ_pressure_static_adjoint_term(const State &state, const std::vector< int > &boundary_ids, const Eigen::MatrixXd &sol, const Eigen::MatrixXd &adjoint, Eigen::VectorXd &one_form)
void dJ_periodic_shape_adjoint_term(const State &state, const PeriodicMeshToMesh &periodic_mesh_map, const Eigen::VectorXd &periodic_mesh_representation, const Eigen::MatrixXd &sol, const Eigen::MatrixXd &adjoint, Eigen::VectorXd &one_form)
Eigen::MatrixXd face_velocity_divergence(const Eigen::MatrixXd &V)
void scaled_jacobian(const Eigen::MatrixXd &V, const Eigen::MatrixXi &F, Eigen::VectorXd &quality)
double integrate_objective(const State &state, const IntegrableFunctional &j, const Eigen::MatrixXd &solution, const std::set< int > &interested_ids, const SpatialIntegralType spatial_integral_type, const int cur_step=0)
Eigen::MatrixXd face_normal_gradient(const Eigen::MatrixXd &V)
void dJ_friction_transient_adjoint_term(const State &state, const Eigen::MatrixXd &adjoint_nu, const Eigen::MatrixXd &adjoint_p, Eigen::VectorXd &one_form)
void dJ_pressure_transient_adjoint_term(const State &state, const std::vector< int > &boundary_ids, const Eigen::MatrixXd &adjoint_nu, const Eigen::MatrixXd &adjoint_p, Eigen::VectorXd &one_form)
void dJ_initial_condition_adjoint_term(const State &state, const Eigen::MatrixXd &adjoint_nu, const Eigen::MatrixXd &adjoint_p, Eigen::VectorXd &one_form)
void dJ_material_transient_adjoint_term(const State &state, const Eigen::MatrixXd &adjoint_nu, const Eigen::MatrixXd &adjoint_p, Eigen::VectorXd &one_form)
Eigen::MatrixXd edge_velocity_divergence(const Eigen::MatrixXd &V)
Eigen::MatrixXd edge_normal_gradient(const Eigen::MatrixXd &V)
void compute_shape_derivative_functional_term(const State &state, const Eigen::MatrixXd &solution, const IntegrableFunctional &j, const std::set< int > &interested_ids, const SpatialIntegralType spatial_integral_type, Eigen::VectorXd &term, const int cur_time_step)
Eigen::VectorXd map_primitive_to_node_order(const State &state, const Eigen::VectorXd &primitives)
void dJ_shape_homogenization_adjoint_term(const State &state, const Eigen::MatrixXd &sol, const Eigen::MatrixXd &adjoint, Eigen::VectorXd &one_form)
void dJ_shape_transient_adjoint_term(const State &state, const Eigen::MatrixXd &adjoint_nu, const Eigen::MatrixXd &adjoint_p, Eigen::VectorXd &one_form)
double triangle_jacobian(const Eigen::VectorXd &v1, const Eigen::VectorXd &v2, const Eigen::VectorXd &v3)
void dJ_material_static_adjoint_term(const State &state, const Eigen::MatrixXd &sol, const Eigen::MatrixXd &adjoint, Eigen::VectorXd &one_form)
void dJ_dirichlet_transient_adjoint_term(const State &state, const Eigen::MatrixXd &adjoint_nu, const Eigen::MatrixXd &adjoint_p, Eigen::VectorXd &one_form)
void dJ_shape_static_adjoint_term(const State &state, const Eigen::MatrixXd &sol, const Eigen::MatrixXd &adjoint, Eigen::VectorXd &one_form)
void dJ_damping_transient_adjoint_term(const State &state, const Eigen::MatrixXd &adjoint_nu, const Eigen::MatrixXd &adjoint_p, Eigen::VectorXd &one_form)
bool is_flipped(const Eigen::MatrixXd &V, const Eigen::MatrixXi &F)
Eigen::VectorXd map_node_to_primitive_order(const State &state, const Eigen::VectorXd &nodes)
void dJ_du_step(const State &state, const IntegrableFunctional &j, const Eigen::MatrixXd &solution, const std::set< int > &interested_ids, const SpatialIntegralType spatial_integral_type, const int cur_step, Eigen::VectorXd &term)