PolyFEM
Loading...
Searching...
No Matches
AdjointTools.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <polyfem/Common.hpp>
6
7#include <Eigen/Core>
8
9#include <vector>
10#include <set>
11
12namespace polyfem
13{
14 namespace legacy
15 {
16 class State;
17 }
18 class IntegrableFunctional;
19
20 namespace solver
21 {
22 class PeriodicMeshToMesh;
23 }
24} // namespace polyfem
25
26namespace polyfem::solver
27{
29 {
30 Volume,
31 Surface,
33 };
34
35 namespace AdjointTools
36 {
38 const legacy::State &state,
39 const IntegrableFunctional &j,
40 const Eigen::MatrixXd &solution,
41 const std::set<int> &interested_ids, // either body id or surface id
42 const SpatialIntegralType spatial_integral_type,
43 const int cur_step = 0);
44 void dJ_du_step(
45 const legacy::State &state,
46 const IntegrableFunctional &j,
47 const Eigen::MatrixXd &solution,
48 const std::set<int> &interested_ids,
49 const SpatialIntegralType spatial_integral_type,
50 const int cur_step,
51 Eigen::VectorXd &term);
53 const legacy::State &state,
54 const Eigen::MatrixXd &solution,
55 const IntegrableFunctional &j,
56 const std::set<int> &interested_ids, // either body id or surface id
57 const SpatialIntegralType spatial_integral_type,
58 Eigen::VectorXd &term,
59 const int cur_time_step);
61 const legacy::State &state,
62 const DiffCache &diff_cache,
63 const Eigen::MatrixXd &sol,
64 const Eigen::MatrixXd &adjoint,
65 Eigen::VectorXd &one_form);
66
67 // The periodic simulation result may not be differentiable wrt.
68 // every vertex of the periodic mesh, since a pair of periodic
69 // vertices cannot move freely, in which case
70 // dJ_periodic_shape_adjoint_term() instead of
71 // dJ_shape_homogenization_adjoint_term() should be used: When it
72 // computes shape derivatives, it considers the pair of periodic
73 // vertices as only one degree of freedom.
75 const legacy::State &state,
76 const DiffCache &diff_cache,
77 const Eigen::MatrixXd &sol,
78 const Eigen::MatrixXd &adjoint,
79 Eigen::VectorXd &one_form);
81 const legacy::State &state,
82 const DiffCache &diff_cache,
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 legacy::State &state,
91 const DiffCache &diff_cache,
92 const Eigen::MatrixXd &adjoint_nu,
93 const Eigen::MatrixXd &adjoint_p,
94 Eigen::VectorXd &one_form);
96 const legacy::State &state,
97 const Eigen::MatrixXd &sol,
98 const Eigen::MatrixXd &adjoint,
99 Eigen::VectorXd &one_form);
101 const legacy::State &state,
102 const DiffCache &diff_cache,
103 const Eigen::MatrixXd &adjoint_nu,
104 const Eigen::MatrixXd &adjoint_p,
105 Eigen::VectorXd &one_form);
107 const legacy::State &state,
108 const DiffCache &diff_cache,
109 const Eigen::MatrixXd &adjoint_nu,
110 const Eigen::MatrixXd &adjoint_p,
111 Eigen::VectorXd &one_form);
113 const legacy::State &state,
114 const DiffCache &diff_cache,
115 const Eigen::MatrixXd &adjoint_nu,
116 const Eigen::MatrixXd &adjoint_p,
117 Eigen::VectorXd &one_form);
119 const legacy::State &state,
120 const Eigen::MatrixXd &adjoint_nu,
121 const Eigen::MatrixXd &adjoint_p,
122 Eigen::VectorXd &one_form);
124 const legacy::State &state,
125 const DiffCache &diff_cache,
126 const Eigen::MatrixXd &adjoint,
127 Eigen::VectorXd &one_form);
129 const legacy::State &state,
130 const Eigen::MatrixXd &adjoint_nu,
131 const Eigen::MatrixXd &adjoint_p,
132 Eigen::VectorXd &one_form);
134 const legacy::State &state,
135 const std::vector<int> &boundary_ids,
136 const Eigen::MatrixXd &sol,
137 const Eigen::MatrixXd &adjoint,
138 Eigen::VectorXd &one_form);
140 const legacy::State &state,
141 const DiffCache &diff_cache,
142 const std::vector<int> &boundary_ids,
143 const Eigen::MatrixXd &adjoint_nu,
144 const Eigen::MatrixXd &adjoint_p,
145 Eigen::VectorXd &one_form);
146
147 Eigen::VectorXd map_primitive_to_node_order(
148 const legacy::State &state,
149 const Eigen::VectorXd &primitives);
150 Eigen::VectorXd map_node_to_primitive_order(
151 const legacy::State &state,
152 const Eigen::VectorXd &nodes);
153
154 Eigen::MatrixXd edge_normal_gradient(
155 const Eigen::MatrixXd &V);
156 Eigen::MatrixXd face_normal_gradient(
157 const Eigen::MatrixXd &V);
158
159 Eigen::MatrixXd edge_velocity_divergence(
160 const Eigen::MatrixXd &V);
161 Eigen::MatrixXd face_velocity_divergence(
162 const Eigen::MatrixXd &V);
163
164 void scaled_jacobian(const Eigen::MatrixXd &V, const Eigen::MatrixXi &F, Eigen::VectorXd &quality);
165 }; // namespace AdjointTools
166} // namespace polyfem::solver
int V
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:114
polyfem::legacy::State State
Definition Remesher.hpp:19
void dJ_shape_homogenization_adjoint_term(const legacy::State &state, const DiffCache &diff_cache, const Eigen::MatrixXd &sol, const Eigen::MatrixXd &adjoint, Eigen::VectorXd &one_form)
double integrate_objective(const legacy::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)
void dJ_friction_transient_adjoint_term(const legacy::State &state, const DiffCache &diff_cache, const Eigen::MatrixXd &adjoint_nu, const Eigen::MatrixXd &adjoint_p, Eigen::VectorXd &one_form)
void dJ_initial_condition_adjoint_term(const legacy::State &state, const Eigen::MatrixXd &adjoint_nu, const Eigen::MatrixXd &adjoint_p, Eigen::VectorXd &one_form)
Eigen::MatrixXd face_velocity_divergence(const Eigen::MatrixXd &V)
void dJ_material_transient_adjoint_term(const legacy::State &state, const DiffCache &diff_cache, const Eigen::MatrixXd &adjoint_nu, const Eigen::MatrixXd &adjoint_p, Eigen::VectorXd &one_form)
void scaled_jacobian(const Eigen::MatrixXd &V, const Eigen::MatrixXi &F, Eigen::VectorXd &quality)
Eigen::MatrixXd face_normal_gradient(const Eigen::MatrixXd &V)
void dJ_periodic_shape_adjoint_term(const legacy::State &state, const DiffCache &diff_cache, const PeriodicMeshToMesh &periodic_mesh_map, const Eigen::VectorXd &periodic_mesh_representation, const Eigen::MatrixXd &sol, const Eigen::MatrixXd &adjoint, Eigen::VectorXd &one_form)
void dJ_shape_static_adjoint_term(const legacy::State &state, const DiffCache &diff_cache, const Eigen::MatrixXd &sol, const Eigen::MatrixXd &adjoint, Eigen::VectorXd &one_form)
Eigen::MatrixXd edge_velocity_divergence(const Eigen::MatrixXd &V)
void dJ_du_step(const legacy::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)
Eigen::VectorXd map_primitive_to_node_order(const legacy::State &state, const Eigen::VectorXd &primitives)
void dJ_dirichlet_transient_adjoint_term(const legacy::State &state, const Eigen::MatrixXd &adjoint_nu, const Eigen::MatrixXd &adjoint_p, Eigen::VectorXd &one_form)
Eigen::MatrixXd edge_normal_gradient(const Eigen::MatrixXd &V)
void compute_shape_derivative_functional_term(const legacy::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)
void dJ_material_static_adjoint_term(const legacy::State &state, const Eigen::MatrixXd &sol, const Eigen::MatrixXd &adjoint, Eigen::VectorXd &one_form)
void dJ_pressure_static_adjoint_term(const legacy::State &state, const std::vector< int > &boundary_ids, const Eigen::MatrixXd &sol, const Eigen::MatrixXd &adjoint, Eigen::VectorXd &one_form)
Eigen::VectorXd map_node_to_primitive_order(const legacy::State &state, const Eigen::VectorXd &nodes)
void dJ_dirichlet_static_adjoint_term(const legacy::State &state, const DiffCache &diff_cache, const Eigen::MatrixXd &adjoint, Eigen::VectorXd &one_form)
void dJ_damping_transient_adjoint_term(const legacy::State &state, const DiffCache &diff_cache, const Eigen::MatrixXd &adjoint_nu, const Eigen::MatrixXd &adjoint_p, Eigen::VectorXd &one_form)
void dJ_shape_transient_adjoint_term(const legacy::State &state, const DiffCache &diff_cache, const Eigen::MatrixXd &adjoint_nu, const Eigen::MatrixXd &adjoint_p, Eigen::VectorXd &one_form)
void dJ_pressure_transient_adjoint_term(const legacy::State &state, const DiffCache &diff_cache, const std::vector< int > &boundary_ids, const Eigen::MatrixXd &adjoint_nu, const Eigen::MatrixXd &adjoint_p, Eigen::VectorXd &one_form)