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 size(const int x_size) const override
16 {
17 assert(x_size == input_size());
18 return dependent_map.size() * dim_;
19 }
20 int input_size() const { return n_periodic_dof_ * dim_ + dim_ * dim_; }
21 int n_periodic_dof() const { return n_periodic_dof_; }
22 int n_full_dof() const { return dependent_map.size(); }
23 int dim() const { return dim_; }
24
25 Eigen::VectorXd eval(const Eigen::VectorXd &x) const override;
26 Eigen::VectorXd inverse_eval(const Eigen::VectorXd &y) override;
27 Eigen::VectorXd apply_jacobian(const Eigen::VectorXd &grad, const Eigen::VectorXd &x) const override;
28
29 int full_to_periodic(int i) const { return dependent_map(i); }
30
31 private:
32 int dim_;
34 Eigen::VectorXi dependent_map;
35 std::array<std::set<std::array<int, 2>>, 3> periodic_dependence; // <id1, id2> for 2/3 axis
36 };
37} // namespace polyfem::solver
int V
int y
int x
This parameterize a function f : x -> y and provides the chain rule with respect to previous gradient...
Eigen::VectorXd inverse_eval(const Eigen::VectorXd &y) override
Eigen::VectorXd eval(const Eigen::VectorXd &x) const override
Eigen::VectorXd apply_jacobian(const Eigen::VectorXd &grad, const Eigen::VectorXd &x) const override
int size(const int x_size) const override
std::array< std::set< std::array< int, 2 > >, 3 > periodic_dependence