PolyFEM
Loading...
Searching...
No Matches
Parametrizations.hpp
Go to the documentation of this file.
1#pragma once
2
3#include "Parametrization.hpp"
4#include <polyfem/Common.hpp>
5
6namespace polyfem::mesh
7{
8 class Mesh;
9}
10
11namespace polyfem::basis
12{
13 class ElementBases;
14}
15
16namespace polyfem::solver
17{
19 {
20 public:
21 ExponentialMap(const int from = -1, const int to = -1);
22
23 int inverse_size(int y_size) const override;
24 int size(const int x_size) const override;
25 Eigen::VectorXd inverse_eval(const Eigen::VectorXd &y) const override;
26 Eigen::VectorXd eval(const Eigen::VectorXd &x) const override;
27 Eigen::VectorXd apply_jacobian(const Eigen::VectorXd &grad, const Eigen::VectorXd &x) const override;
28
29 private:
30 const int from_, to_;
31 };
32
33 class Scaling : public Parametrization
34 {
35 public:
36 Scaling(const double scale, const int from = -1, const int to = -1);
37
38 int inverse_size(int y_size) const override;
39 int size(const int x_size) const override;
40 Eigen::VectorXd inverse_eval(const Eigen::VectorXd &y) const override;
41 Eigen::VectorXd eval(const Eigen::VectorXd &x) const override;
42 Eigen::VectorXd apply_jacobian(const Eigen::VectorXd &grad, const Eigen::VectorXd &x) const override;
43
44 private:
45 const int from_, to_;
46 const double scale_;
47 };
48
50 {
51 public:
52 PowerMap(const double power = 1, const int from = -1, const int to = -1);
53
54 int inverse_size(int y_size) const override;
55 int size(const int x_size) const override;
56 Eigen::VectorXd inverse_eval(const Eigen::VectorXd &y) const override;
57 Eigen::VectorXd eval(const Eigen::VectorXd &x) const override;
58 Eigen::VectorXd apply_jacobian(const Eigen::VectorXd &grad, const Eigen::VectorXd &x) const override;
59
60 private:
61 const double power_;
62 const int from_, to_;
63 };
64
66 {
67 public:
68 ENu2LambdaMu(const bool is_volume);
69
70 int inverse_size(int y_size) const override;
71 int size(const int x_size) const override;
72 Eigen::VectorXd inverse_eval(const Eigen::VectorXd &y) const override;
73 Eigen::VectorXd eval(const Eigen::VectorXd &x) const override;
74 Eigen::VectorXd apply_jacobian(const Eigen::VectorXd &grad, const Eigen::VectorXd &x) const override;
75
76 private:
77 const bool is_volume_;
78 };
79
85 {
86 public:
87 PerBody2PerNode(const mesh::Mesh &mesh, const std::vector<basis::ElementBases> &bases, const int n_bases);
88
89 int size(const int x_size) const override;
90 int inverse_size(int y_size) const override;
91 Eigen::VectorXd inverse_eval(const Eigen::VectorXd &y) const override;
92 Eigen::VectorXd eval(const Eigen::VectorXd &x) const override;
93 Eigen::VectorXd apply_jacobian(const Eigen::VectorXd &grad, const Eigen::VectorXd &x) const override;
94
95 private:
97 const std::vector<basis::ElementBases> &bases_;
100 Eigen::VectorXi compacted_body_node_num_;
102 };
103
106 {
107 public:
108 PerBody2PerElem(const mesh::Mesh &mesh);
109
110 int size(const int x_size) const override;
111 int inverse_size(int y_size) const override;
112 Eigen::VectorXd inverse_eval(const Eigen::VectorXd &y) const override;
113 Eigen::VectorXd eval(const Eigen::VectorXd &x) const override;
114 Eigen::VectorXd apply_jacobian(const Eigen::VectorXd &grad, const Eigen::VectorXd &x) const override;
115
116 private:
120 Eigen::VectorXi compacted_body_elem_num_;
122 };
123
125 {
126 public:
127 SliceMap(const int from = -1, const int to = -1, const int total = -1);
128
129 int size(const int x_size) const override { return to_ - from_; }
130 int inverse_size(int y_size) const override;
131 Eigen::VectorXd inverse_eval(const Eigen::VectorXd &y) const override;
132 Eigen::VectorXd eval(const Eigen::VectorXd &x) const override;
133 Eigen::VectorXd apply_jacobian(const Eigen::VectorXd &grad, const Eigen::VectorXd &x) const override;
134
135 private:
136 const int from_, to_, total_;
137 };
138
140 {
141 public:
142 InsertConstantMap(const int size = -1, const double val = 0, const int start_index = -1);
143 InsertConstantMap(const Eigen::VectorXd &values, const int start_index = -1);
144
145 int size(const int x_size) const override;
146 int inverse_size(int y_size) const override;
147 Eigen::VectorXd inverse_eval(const Eigen::VectorXd &y) const override;
148 Eigen::VectorXd eval(const Eigen::VectorXd &x) const override;
149 Eigen::VectorXd apply_jacobian(const Eigen::VectorXd &grad, const Eigen::VectorXd &x) const override;
150
151 private:
152 // const int size_;
153 // const double val_;
154 int start_index_ = -1;
155 Eigen::VectorXd values_;
156 };
157
160 {
161 public:
162 LinearFilter(const mesh::Mesh &mesh, const double radius);
163
164 int size(const int x_size) const override;
165 int inverse_size(int y_size) const override;
166 Eigen::VectorXd eval(const Eigen::VectorXd &x) const override;
167 Eigen::VectorXd inverse_eval(const Eigen::VectorXd &y) const override;
168 Eigen::VectorXd apply_jacobian(const Eigen::VectorXd &grad, const Eigen::VectorXd &x) const override;
169
170 private:
171 Eigen::SparseMatrix<double> tt_radius_adjacency;
173 };
174
176 {
177 public:
178 ScalarVelocityParametrization(const double start_val, const double dt);
179
180 int size(const int x_size) const override;
181 int inverse_size(int y_size) const override;
182 Eigen::VectorXd inverse_eval(const Eigen::VectorXd &y) const override;
183 Eigen::VectorXd eval(const Eigen::VectorXd &x) const override;
184 Eigen::VectorXd apply_jacobian(const Eigen::VectorXd &grad, const Eigen::VectorXd &x) const override;
185
186 private:
187 const double start_val_;
188 const double dt_;
189 };
190} // namespace polyfem::solver
double val
Definition Assembler.cpp:86
int y
int x
Abstract mesh class to capture 2d/3d conforming and non-conforming meshes.
Definition Mesh.hpp:41
Eigen::VectorXd apply_jacobian(const Eigen::VectorXd &grad, const Eigen::VectorXd &x) const override
Apply jacobian for chain rule.
Eigen::VectorXd eval(const Eigen::VectorXd &x) const override
Eval y = f(x).
int size(const int x_size) const override
Compute DOF of y given DOF of x.
int inverse_size(int y_size) const override
Compute DOF of x given DOF of y.
Eigen::VectorXd inverse_eval(const Eigen::VectorXd &y) const override
Eval x = f^-1 (y).
int size(const int x_size) const override
Compute DOF of y given DOF of x.
int inverse_size(int y_size) const override
Compute DOF of x given DOF of y.
Eigen::VectorXd eval(const Eigen::VectorXd &x) const override
Eval y = f(x).
Eigen::VectorXd inverse_eval(const Eigen::VectorXd &y) const override
Eval x = f^-1 (y).
Eigen::VectorXd apply_jacobian(const Eigen::VectorXd &grad, const Eigen::VectorXd &x) const override
Apply jacobian for chain rule.
Eigen::VectorXd apply_jacobian(const Eigen::VectorXd &grad, const Eigen::VectorXd &x) const override
Apply jacobian for chain rule.
Eigen::VectorXd inverse_eval(const Eigen::VectorXd &y) const override
Eval x = f^-1 (y).
int size(const int x_size) const override
Compute DOF of y given DOF of x.
Eigen::VectorXd eval(const Eigen::VectorXd &x) const override
Eval y = f(x).
int inverse_size(int y_size) const override
Compute DOF of x given DOF of y.
Maps to average of neighboring.
Eigen::SparseMatrix< double > tt_radius_adjacency
Eigen::VectorXd apply_jacobian(const Eigen::VectorXd &grad, const Eigen::VectorXd &x) const override
Apply jacobian for chain rule.
Eigen::VectorXd inverse_eval(const Eigen::VectorXd &y) const override
Eval x = f^-1 (y).
Eigen::VectorXd eval(const Eigen::VectorXd &x) const override
Eval y = f(x).
int size(const int x_size) const override
Compute DOF of y given DOF of x.
int inverse_size(int y_size) const override
Compute DOF of x given DOF of y.
Map per body to per element in dim major layout (x1 x2 ... y1 y1 ... z1 z2 ...)
Eigen::VectorXd eval(const Eigen::VectorXd &x) const override
Eval y = f(x).
Eigen::VectorXi compacted_body_elem_num_
Body num.
int size(const int x_size) const override
Compute DOF of y given DOF of x.
Eigen::VectorXd inverse_eval(const Eigen::VectorXd &y) const override
Eval x = f^-1 (y).
Eigen::VectorXd apply_jacobian(const Eigen::VectorXd &grad, const Eigen::VectorXd &x) const override
Apply jacobian for chain rule.
int inverse_size(int y_size) const override
Compute DOF of x given DOF of y.
Eigen::VectorXi elem_id_to_compacted_body_id_
Number if elements of a body.
Map per body to per FE node in node major layout (x1 y1 z1 x2 y2 z2...)
int size(const int x_size) const override
Compute DOF of y given DOF of x.
Eigen::VectorXd eval(const Eigen::VectorXd &x) const override
Eval y = f(x).
Eigen::VectorXi compacted_body_node_num_
Body num.
Eigen::VectorXi node_id_to_compacted_body_
Number of nodes of a body.
Eigen::VectorXd apply_jacobian(const Eigen::VectorXd &grad, const Eigen::VectorXd &x) const override
Apply jacobian for chain rule.
int inverse_size(int y_size) const override
Compute DOF of x given DOF of y.
Eigen::VectorXd inverse_eval(const Eigen::VectorXd &y) const override
Eval x = f^-1 (y).
const std::vector< basis::ElementBases > & bases_
int inverse_size(int y_size) const override
Compute DOF of x given DOF of y.
Eigen::VectorXd eval(const Eigen::VectorXd &x) const override
Eval y = f(x).
int size(const int x_size) const override
Compute DOF of y given DOF of x.
Eigen::VectorXd apply_jacobian(const Eigen::VectorXd &grad, const Eigen::VectorXd &x) const override
Apply jacobian for chain rule.
Eigen::VectorXd inverse_eval(const Eigen::VectorXd &y) const override
Eval x = f^-1 (y).
int inverse_size(int y_size) const override
Compute DOF of x given DOF of y.
Eigen::VectorXd apply_jacobian(const Eigen::VectorXd &grad, const Eigen::VectorXd &x) const override
Apply jacobian for chain rule.
int size(const int x_size) const override
Compute DOF of y given DOF of x.
Eigen::VectorXd eval(const Eigen::VectorXd &x) const override
Eval y = f(x).
Eigen::VectorXd inverse_eval(const Eigen::VectorXd &y) const override
Eval x = f^-1 (y).
Eigen::VectorXd eval(const Eigen::VectorXd &x) const override
Eval y = f(x).
int inverse_size(int y_size) const override
Compute DOF of x given DOF of y.
Eigen::VectorXd inverse_eval(const Eigen::VectorXd &y) const override
Eval x = f^-1 (y).
Eigen::VectorXd apply_jacobian(const Eigen::VectorXd &grad, const Eigen::VectorXd &x) const override
Apply jacobian for chain rule.
int size(const int x_size) const override
Compute DOF of y given DOF of x.
Eigen::VectorXd apply_jacobian(const Eigen::VectorXd &grad, const Eigen::VectorXd &x) const override
Apply jacobian for chain rule.
Eigen::VectorXd inverse_eval(const Eigen::VectorXd &y) const override
Eval x = f^-1 (y).
int size(const int x_size) const override
Compute DOF of y given DOF of x.
Eigen::VectorXd eval(const Eigen::VectorXd &x) const override
Eval y = f(x).
int inverse_size(int y_size) const override
Compute DOF of x given DOF of y.