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#include <map>
6
7namespace polyfem::mesh
8{
9 class Mesh;
10}
11
12namespace polyfem::basis
13{
14 class ElementBases;
15}
16
17namespace polyfem::solver
18{
20 {
21 public:
22 ExponentialMap(const int from = -1, const int to = -1);
23
24 int size(const int x_size) const override { return x_size; }
25 Eigen::VectorXd inverse_eval(const Eigen::VectorXd &y) 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 size(const int x_size) const override { return x_size; }
39 Eigen::VectorXd inverse_eval(const Eigen::VectorXd &y) override;
40 Eigen::VectorXd eval(const Eigen::VectorXd &x) const override;
41 Eigen::VectorXd apply_jacobian(const Eigen::VectorXd &grad, const Eigen::VectorXd &x) const override;
42
43 private:
44 const int from_, to_;
45 const double scale_;
46 };
47
49 {
50 public:
51 PowerMap(const double power = 1, const int from = -1, const int to = -1) : power_(power), from_(from), to_(to)
52 {
53 assert(from_ < to_ || from_ < 0);
54 assert(power_ > 0);
55 }
56
57 int size(const int x_size) const override { return x_size; }
58 Eigen::VectorXd inverse_eval(const Eigen::VectorXd &y) override;
59 Eigen::VectorXd eval(const Eigen::VectorXd &x) const override;
60 Eigen::VectorXd apply_jacobian(const Eigen::VectorXd &grad, const Eigen::VectorXd &x) const override;
61
62 private:
63 const double power_;
64 const int from_, to_;
65 };
66
68 {
69 public:
70 ENu2LambdaMu(const bool is_volume);
71
72 int size(const int x_size) const override { return x_size; }
73
74 Eigen::VectorXd inverse_eval(const Eigen::VectorXd &y) override;
75 Eigen::VectorXd eval(const Eigen::VectorXd &x) const override;
76 Eigen::VectorXd apply_jacobian(const Eigen::VectorXd &grad, const Eigen::VectorXd &x) const override;
77
78 private:
79 const bool is_volume_;
80 };
81
83 {
84 public:
85 PerBody2PerNode(const mesh::Mesh &mesh, const std::vector<basis::ElementBases> &bases, const int n_bases);
86
87 int size(const int x_size) const override;
88 Eigen::VectorXd eval(const Eigen::VectorXd &x) const override;
89 Eigen::VectorXd apply_jacobian(const Eigen::VectorXd &grad, const Eigen::VectorXd &x) const override;
90
91 private:
93 const std::vector<basis::ElementBases> &bases_;
96 Eigen::VectorXi node_id_to_body_id_;
97 };
98
100 {
101 public:
102 PerBody2PerElem(const mesh::Mesh &mesh);
103
104 int size(const int x_size) const override;
105 Eigen::VectorXd eval(const Eigen::VectorXd &x) const override;
106 Eigen::VectorXd apply_jacobian(const Eigen::VectorXd &grad, const Eigen::VectorXd &x) const override;
107
108 private:
112 std::map<int, std::array<int, 2>> body_id_map_; // from body_id to {elem_id, index}
113 };
114
116 {
117 public:
118 SliceMap(const int from = -1, const int to = -1, const int total = -1);
119
120 int size(const int x_size) const override { return to_ - from_; }
121
122 Eigen::VectorXd inverse_eval(const Eigen::VectorXd &y) override;
123 Eigen::VectorXd eval(const Eigen::VectorXd &x) const override;
124 Eigen::VectorXd apply_jacobian(const Eigen::VectorXd &grad, const Eigen::VectorXd &x) const override;
125
126 private:
127 const int from_, to_, total_;
128 };
129
131 {
132 public:
133 InsertConstantMap(const int size = -1, const double val = 0, const int start_index = -1);
134 InsertConstantMap(const Eigen::VectorXd &values, const int start_index = -1);
135
136 int size(const int x_size) const override;
137 Eigen::VectorXd inverse_eval(const Eigen::VectorXd &y) override;
138 Eigen::VectorXd eval(const Eigen::VectorXd &x) const override;
139 Eigen::VectorXd apply_jacobian(const Eigen::VectorXd &grad, const Eigen::VectorXd &x) const override;
140
141 private:
142 // const int size_;
143 // const double val_;
144 int start_index_ = -1;
145 Eigen::VectorXd values_;
146 };
147
149 {
150 public:
151 LinearFilter(const mesh::Mesh &mesh, const double radius);
152
153 int size(const int x_size) const override { return x_size; }
154 Eigen::VectorXd eval(const Eigen::VectorXd &x) const override;
155 Eigen::VectorXd apply_jacobian(const Eigen::VectorXd &grad, const Eigen::VectorXd &x) const override;
156
157 private:
158 Eigen::SparseMatrix<double> tt_radius_adjacency;
160 };
161
163 {
164 public:
165 ScalarVelocityParametrization(const double start_val, const double dt) : start_val_(start_val), dt_(dt) {}
166
167 int size(const int x_size) const override { return x_size; }
168 Eigen::VectorXd inverse_eval(const Eigen::VectorXd &y) override;
169 Eigen::VectorXd eval(const Eigen::VectorXd &x) const override;
170 Eigen::VectorXd apply_jacobian(const Eigen::VectorXd &grad, const Eigen::VectorXd &x) const override;
171
172 private:
173 const double start_val_;
174 const double dt_;
175 };
176} // 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:40
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.
Eigen::VectorXd inverse_eval(const Eigen::VectorXd &y) override
Eval x = f^-1 (y).
int size(const int x_size) const override
Compute DOF of y given DOF of x.
Eigen::VectorXd inverse_eval(const Eigen::VectorXd &y) override
Eval x = f^-1 (y).
Eigen::VectorXd eval(const Eigen::VectorXd &x) const override
Eval y = f(x).
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.
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) override
Eval x = f^-1 (y).
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 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 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.
std::map< int, std::array< int, 2 > > body_id_map_
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 apply_jacobian(const Eigen::VectorXd &grad, const Eigen::VectorXd &x) const override
Apply jacobian for chain rule.
const std::vector< basis::ElementBases > & bases_
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.
PowerMap(const double power=1, const int from=-1, const int to=-1)
Eigen::VectorXd inverse_eval(const Eigen::VectorXd &y) 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.
ScalarVelocityParametrization(const double start_val, const double dt)
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) override
Eval x = f^-1 (y).
Eigen::VectorXd eval(const Eigen::VectorXd &x) const override
Eval y = f(x).
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 inverse_eval(const Eigen::VectorXd &y) 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 inverse_eval(const Eigen::VectorXd &y) 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).