PolyFEM
Loading...
Searching...
No Matches
PeriodicMeshToMesh.hpp
Go to the documentation of this file.
1#pragma once
2
3#include "Parametrization.hpp"
4#include <polyfem/Common.hpp>
5#include <set>
6
7namespace polyfem::solver
8{
9 // aux parametrization that cannot be used for optimization
11 {
12 public:
13 PeriodicMeshToMesh(const Eigen::MatrixXd &V);
14
15 int inverse_size(int y_size) const override { return input_size(); };
16 int size(const int x_size) const override
17 {
18 assert(x_size == input_size());
19 return dependent_map.size() * dim_;
20 }
21 int input_size() const { return n_periodic_dof_ * dim_ + dim_ * dim_; }
22 int n_periodic_dof() const { return n_periodic_dof_; }
23 int n_full_dof() const { return dependent_map.size(); }
24 int dim() const { return dim_; }
25
26 Eigen::VectorXd eval(const Eigen::VectorXd &x) const override;
27 Eigen::VectorXd inverse_eval(const Eigen::VectorXd &y) const override;
28 Eigen::VectorXd apply_jacobian(const Eigen::VectorXd &grad, const Eigen::VectorXd &x) const override;
29
30 int full_to_periodic(int i) const { return dependent_map(i); }
31
32 private:
33 int dim_;
35 Eigen::VectorXi dependent_map;
36 std::array<std::set<std::array<int, 2>>, 3> periodic_dependence; // <id1, id2> for 2/3 axis
37 };
38} // namespace polyfem::solver
int V
int y
int 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.
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).
std::array< std::set< std::array< int, 2 > >, 3 > periodic_dependence