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 class IntegrableFunctional;
15
16 namespace solver
17 {
18 class PeriodicMeshToMesh;
19 }
20} // namespace polyfem
21
22namespace polyfem::solver
23{
25 {
26 Volume,
27 Surface,
29 };
30
31 namespace AdjointTools
32 {
34 const varform::DifferentiableVarForm &varform,
35 const IntegrableFunctional &j,
36 const Eigen::MatrixXd &solution,
37 const std::set<int> &interested_ids, // either body id or surface id
38 const SpatialIntegralType spatial_integral_type,
39 const int cur_step = 0);
40 void dJ_du_step(
41 const varform::DifferentiableVarForm &varform,
42 const IntegrableFunctional &j,
43 const Eigen::MatrixXd &solution,
44 const std::set<int> &interested_ids,
45 const SpatialIntegralType spatial_integral_type,
46 const int cur_step,
47 Eigen::VectorXd &term);
49 const varform::DifferentiableVarForm &varform,
50 const Eigen::MatrixXd &solution,
51 const IntegrableFunctional &j,
52 const std::set<int> &interested_ids, // either body id or surface id
53 const SpatialIntegralType spatial_integral_type,
54 Eigen::VectorXd &term,
55 const int cur_time_step);
57 const varform::DifferentiableVarForm &varform,
58 const DiffCache &diff_cache,
59 const Eigen::MatrixXd &sol,
60 const Eigen::MatrixXd &adjoint,
61 Eigen::VectorXd &one_form);
62
63 // The periodic simulation result may not be differentiable wrt.
64 // every vertex of the periodic mesh, since a pair of periodic
65 // vertices cannot move freely, in which case
66 // dJ_periodic_shape_adjoint_term() instead of
67 // dJ_shape_homogenization_adjoint_term() should be used: When it
68 // computes shape derivatives, it considers the pair of periodic
69 // vertices as only one degree of freedom.
71 const varform::DifferentiableVarForm &varform,
72 const DiffCache &diff_cache,
73 const Eigen::MatrixXd &sol,
74 const Eigen::MatrixXd &adjoint,
75 Eigen::VectorXd &one_form);
77 const varform::DifferentiableVarForm &varform,
78 const DiffCache &diff_cache,
79 const PeriodicMeshToMesh &periodic_mesh_map,
80 const Eigen::VectorXd &periodic_mesh_representation,
81 const Eigen::MatrixXd &sol,
82 const Eigen::MatrixXd &adjoint,
83 Eigen::VectorXd &one_form);
84
86 const varform::DifferentiableVarForm &varform,
87 const DiffCache &diff_cache,
88 const Eigen::MatrixXd &adjoint_nu,
89 const Eigen::MatrixXd &adjoint_p,
90 Eigen::VectorXd &one_form);
92 const varform::DifferentiableVarForm &varform,
93 const Eigen::MatrixXd &sol,
94 const Eigen::MatrixXd &adjoint,
95 Eigen::VectorXd &one_form);
97 const varform::DifferentiableVarForm &varform,
98 const DiffCache &diff_cache,
99 const Eigen::MatrixXd &adjoint_nu,
100 const Eigen::MatrixXd &adjoint_p,
101 Eigen::VectorXd &one_form);
103 const varform::DifferentiableVarForm &varform,
104 const DiffCache &diff_cache,
105 const Eigen::MatrixXd &adjoint_nu,
106 const Eigen::MatrixXd &adjoint_p,
107 Eigen::VectorXd &one_form);
109 const varform::DifferentiableVarForm &varform,
110 const DiffCache &diff_cache,
111 const Eigen::MatrixXd &adjoint_nu,
112 const Eigen::MatrixXd &adjoint_p,
113 Eigen::VectorXd &one_form);
115 const varform::DifferentiableVarForm &varform,
116 const Eigen::MatrixXd &adjoint_nu,
117 const Eigen::MatrixXd &adjoint_p,
118 Eigen::VectorXd &one_form);
120 const varform::DifferentiableVarForm &varform,
121 const DiffCache &diff_cache,
122 const Eigen::MatrixXd &adjoint,
123 Eigen::VectorXd &one_form);
125 const varform::DifferentiableVarForm &varform,
126 const Eigen::MatrixXd &adjoint_nu,
127 const Eigen::MatrixXd &adjoint_p,
128 Eigen::VectorXd &one_form);
130 const varform::DifferentiableVarForm &varform,
131 const std::vector<int> &boundary_ids,
132 const Eigen::MatrixXd &sol,
133 const Eigen::MatrixXd &adjoint,
134 Eigen::VectorXd &one_form);
136 const varform::DifferentiableVarForm &varform,
137 const DiffCache &diff_cache,
138 const std::vector<int> &boundary_ids,
139 const Eigen::MatrixXd &adjoint_nu,
140 const Eigen::MatrixXd &adjoint_p,
141 Eigen::VectorXd &one_form);
142
143 Eigen::VectorXd map_primitive_to_node_order(
144 const varform::DifferentiableVarForm &varform,
145 const Eigen::VectorXd &primitives);
146 Eigen::VectorXd map_node_to_primitive_order(
147 const varform::DifferentiableVarForm &varform,
148 const Eigen::VectorXd &nodes);
149
150 Eigen::MatrixXd edge_normal_gradient(
151 const Eigen::MatrixXd &V);
152 Eigen::MatrixXd face_normal_gradient(
153 const Eigen::MatrixXd &V);
154
155 Eigen::MatrixXd edge_velocity_divergence(
156 const Eigen::MatrixXd &V);
157 Eigen::MatrixXd face_velocity_divergence(
158 const Eigen::MatrixXd &V);
159
160 void scaled_jacobian(const Eigen::MatrixXd &V, const Eigen::MatrixXi &F, Eigen::VectorXd &quality);
161 }; // namespace AdjointTools
162} // namespace polyfem::solver
int V
Storage for additional data required by differntial code.
Definition DiffCache.hpp:22
Optimization-facing interface implemented by differentiated VarForm adapters.
Eigen::VectorXd map_node_to_primitive_order(const varform::DifferentiableVarForm &varform, const Eigen::VectorXd &nodes)
void dJ_material_transient_adjoint_term(const varform::DifferentiableVarForm &varform, const DiffCache &diff_cache, const Eigen::MatrixXd &adjoint_nu, const Eigen::MatrixXd &adjoint_p, Eigen::VectorXd &one_form)
void dJ_damping_transient_adjoint_term(const varform::DifferentiableVarForm &varform, const DiffCache &diff_cache, const Eigen::MatrixXd &adjoint_nu, const Eigen::MatrixXd &adjoint_p, Eigen::VectorXd &one_form)
void dJ_dirichlet_static_adjoint_term(const varform::DifferentiableVarForm &varform, const DiffCache &diff_cache, const Eigen::MatrixXd &adjoint, Eigen::VectorXd &one_form)
Eigen::MatrixXd face_velocity_divergence(const Eigen::MatrixXd &V)
double integrate_objective(const varform::DifferentiableVarForm &varform, 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_initial_condition_adjoint_term(const varform::DifferentiableVarForm &varform, const Eigen::MatrixXd &adjoint_nu, const Eigen::MatrixXd &adjoint_p, Eigen::VectorXd &one_form)
void compute_shape_derivative_functional_term(const varform::DifferentiableVarForm &varform, 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 scaled_jacobian(const Eigen::MatrixXd &V, const Eigen::MatrixXi &F, Eigen::VectorXd &quality)
void dJ_du_step(const varform::DifferentiableVarForm &varform, 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 varform::DifferentiableVarForm &varform, const Eigen::VectorXd &primitives)
void dJ_friction_transient_adjoint_term(const varform::DifferentiableVarForm &varform, const DiffCache &diff_cache, const Eigen::MatrixXd &adjoint_nu, const Eigen::MatrixXd &adjoint_p, Eigen::VectorXd &one_form)
Eigen::MatrixXd face_normal_gradient(const Eigen::MatrixXd &V)
void dJ_material_static_adjoint_term(const varform::DifferentiableVarForm &varform, const Eigen::MatrixXd &sol, const Eigen::MatrixXd &adjoint, Eigen::VectorXd &one_form)
void dJ_shape_transient_adjoint_term(const varform::DifferentiableVarForm &varform, 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 varform::DifferentiableVarForm &varform, const DiffCache &diff_cache, const std::vector< int > &boundary_ids, const Eigen::MatrixXd &adjoint_nu, const Eigen::MatrixXd &adjoint_p, Eigen::VectorXd &one_form)
void dJ_dirichlet_transient_adjoint_term(const varform::DifferentiableVarForm &varform, 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 dJ_periodic_shape_adjoint_term(const varform::DifferentiableVarForm &varform, 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 varform::DifferentiableVarForm &varform, const DiffCache &diff_cache, const Eigen::MatrixXd &sol, const Eigen::MatrixXd &adjoint, Eigen::VectorXd &one_form)
void dJ_pressure_static_adjoint_term(const varform::DifferentiableVarForm &varform, const std::vector< int > &boundary_ids, const Eigen::MatrixXd &sol, const Eigen::MatrixXd &adjoint, Eigen::VectorXd &one_form)
void dJ_shape_homogenization_adjoint_term(const varform::DifferentiableVarForm &varform, const DiffCache &diff_cache, const Eigen::MatrixXd &sol, const Eigen::MatrixXd &adjoint, Eigen::VectorXd &one_form)