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 { assert(x_size == input_size()); return dependent_map.size() * dim_; }
16 int input_size() const { return n_periodic_dof_ * dim_ + dim_ * dim_; }
17 int n_periodic_dof() const { return n_periodic_dof_; }
18 int n_full_dof() const { return dependent_map.size(); }
19 int dim() const { return dim_; }
20
21 Eigen::VectorXd eval(const Eigen::VectorXd &x) const override;
22 Eigen::VectorXd inverse_eval(const Eigen::VectorXd &y) override;
23 Eigen::VectorXd apply_jacobian(const Eigen::VectorXd &grad, const Eigen::VectorXd &x) const override;
24
25 int full_to_periodic(int i) const { return dependent_map(i); }
26
27 private:
28 int dim_;
30 Eigen::VectorXi dependent_map;
31 std::array<std::set<std::array<int, 2>>, 3> periodic_dependence; // <id1, id2> for 2/3 axis
32 };
33}
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