PolyFEM
Loading...
Searching...
No Matches
Parametrization.cpp
Go to the documentation of this file.
1#include "Parametrization.hpp"
3
4namespace polyfem::solver
5{
6 int CompositeParametrization::size(const int x_size) const
7 {
8 int cur_size = x_size;
9 for (const auto &p : parametrizations_)
10 cur_size = p->size(cur_size);
11
12 return cur_size;
13 }
14
16 {
17 if (parametrizations_.empty())
18 {
19 return y_size;
20 };
21
22 int result = y_size;
23 for (int i = parametrizations_.size() - 1; i >= 0; i--)
24 {
25 result = parametrizations_[i]->inverse_size(result);
26 }
27 return result;
28 }
29
30 Eigen::VectorXd CompositeParametrization::inverse_eval(const Eigen::VectorXd &y) const
31 {
32 if (parametrizations_.empty())
33 {
34 return y;
35 }
36
37 Eigen::VectorXd x = y;
38 for (int i = parametrizations_.size() - 1; i >= 0; i--)
39 {
40 x = parametrizations_[i]->inverse_eval(x);
41 }
42
43 return x;
44 }
45
46 Eigen::VectorXd CompositeParametrization::eval(const Eigen::VectorXd &x) const
47 {
48 if (parametrizations_.empty())
49 return x;
50
51 Eigen::VectorXd y = x;
52 for (const auto &p : parametrizations_)
53 {
54 y = p->eval(y);
55 }
56
57 return y;
58 }
59 Eigen::VectorXd CompositeParametrization::apply_jacobian(const Eigen::VectorXd &grad_full, const Eigen::VectorXd &x) const
60 {
61 Eigen::VectorXd gradv = grad_full;
62
63 if (parametrizations_.empty())
64 return gradv;
65
66 std::vector<Eigen::VectorXd> ys;
67 auto y = x;
68 for (const auto &p : parametrizations_)
69 {
70 ys.emplace_back(y);
71 y = p->eval(y);
72 }
73
74 for (int i = parametrizations_.size() - 1; i >= 0; --i)
75 gradv = parametrizations_[i]->apply_jacobian(gradv, ys[i]);
76
77 return gradv;
78 }
79} // namespace polyfem::solver
int y
int 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_full, 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).
const std::vector< std::shared_ptr< Parametrization > > parametrizations_
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).