PolyFEM
Loading...
Searching...
No Matches
SmoothingForms.hpp
Go to the documentation of this file.
1#pragma once
2
4
5#include <Eigen/Core>
6
7#include <memory>
8#include <set>
9#include <utility>
10#include <vector>
11
12namespace polyfem::solver
13{
15 {
16 public:
18 const VariableToSimulationGroup &variable_to_simulations,
19 std::shared_ptr<const varform::DifferentiableVarForm> varform,
20 const bool scale_invariant,
21 const int power,
22 const std::vector<int> &surface_selections,
23 const std::vector<int> &active_dims);
24
25 double value_unweighted(const Eigen::VectorXd &x) const override;
26 void compute_partial_gradient(const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override;
27
28 private:
29 std::shared_ptr<const varform::DifferentiableVarForm> varform_;
30 const bool scale_invariant_;
31 const int power_; // only if scale_invariant_ is true
32 Eigen::SparseMatrix<bool, Eigen::RowMajor> adj;
33 Eigen::SparseMatrix<double, Eigen::RowMajor> L;
34 std::set<int> surface_ids_;
35 std::vector<int> active_dims_;
36 };
37
48 {
49 public:
53 const VariableToSimulationGroup &variable_to_simulations,
54 std::shared_ptr<const varform::DifferentiableVarForm> varform,
55 const std::vector<int> &volume_selections);
56
57 std::string name() const override { return "elastic_material_smoothing"; }
58
59 double value_unweighted(const Eigen::VectorXd &x) const override;
60 void compute_partial_gradient(const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override;
61
62 private:
63 Eigen::VectorXd lame_parameters(const Eigen::VectorXd &x) const;
64
65 std::shared_ptr<const varform::DifferentiableVarForm> varform_;
67 std::vector<std::pair<int, int>> adjacent_elements_;
68 };
69} // namespace polyfem::solver
int x
Eigen::SparseMatrix< bool, Eigen::RowMajor > adj
std::shared_ptr< const varform::DifferentiableVarForm > varform_
double value_unweighted(const Eigen::VectorXd &x) const override
Compute the value of the form.
void compute_partial_gradient(const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override
Eigen::SparseMatrix< double, Eigen::RowMajor > L
Penalizes relative jumps in per-element Lamé parameters.
Eigen::VectorXd lame_parameters(const Eigen::VectorXd &x) const
void compute_partial_gradient(const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override
double value_unweighted(const Eigen::VectorXd &x) const override
Compute the value of the form.
std::vector< std::pair< int, int > > adjacent_elements_
Adjacent global element id. Contains both direction Ex. (elem a, elem b) and (elem b,...
std::shared_ptr< const varform::DifferentiableVarForm > varform_