PolyFEM
Loading...
Searching...
No Matches
AMIPSForm.hpp
Go to the documentation of this file.
1#pragma once
2
7#include <memory>
8#include <utility>
9
10namespace polyfem
11{
12 namespace assembler
13 {
14 class Assembler;
15 }
16} // namespace polyfem
17
18namespace polyfem::solver
19{
23 {
24 public:
25 MinJacobianForm(const VariableToSimulationGroup &variable_to_simulation, std::shared_ptr<const varform::DifferentiableVarForm> varform)
26 : AdjointForm(variable_to_simulation),
27 varform_(std::move(varform))
28 {
29 }
30
31 virtual std::string name() const override { return "min-jacobian"; }
32
33 double value_unweighted(const Eigen::VectorXd &x) const override;
34 void compute_partial_gradient(const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override;
35
36 private:
37 std::shared_ptr<const varform::DifferentiableVarForm> varform_;
38 };
39
40 class AMIPSForm : public AdjointForm
41 {
42 public:
44 const VariableToSimulationGroup &variable_to_simulation,
45 std::shared_ptr<const varform::DifferentiableVarForm> varform,
46 const io::ResourceIO &resources);
47
48 virtual std::string name() const override { return "AMIPS"; }
49
50 double value_unweighted(const Eigen::VectorXd &x) const override;
51 void compute_partial_gradient(const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override;
52 bool is_step_valid(const Eigen::VectorXd &x0, const Eigen::VectorXd &x1) const override;
53
54 private:
55 Eigen::VectorXd get_updated_mesh_nodes(const Eigen::VectorXd &x) const
56 {
57 Eigen::VectorXd X = X_rest;
59 return X;
60 }
61
62 std::shared_ptr<const varform::DifferentiableVarForm> varform_;
63
64 Eigen::VectorXd X_rest;
65 Eigen::MatrixXi F;
66 std::vector<polyfem::basis::ElementBases> init_geom_bases_;
68 // amips_energy_ is actually owned exclusively by this class.
69 std::shared_ptr<assembler::Assembler> amips_energy_;
70 };
71} // namespace polyfem::solver
int x
Caches basis evaluation and geometric mapping at every element.
Read-only interface to a hierarchical collection of simulation resources.
double value_unweighted(const Eigen::VectorXd &x) const override
Compute the value of the form.
virtual std::string name() const override
Definition AMIPSForm.hpp:48
bool is_step_valid(const Eigen::VectorXd &x0, const Eigen::VectorXd &x1) const override
Determine if a step from solution x0 to solution x1 is allowed.
Eigen::VectorXd get_updated_mesh_nodes(const Eigen::VectorXd &x) const
Definition AMIPSForm.hpp:55
std::vector< polyfem::basis::ElementBases > init_geom_bases_
Definition AMIPSForm.hpp:66
void compute_partial_gradient(const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override
std::shared_ptr< assembler::Assembler > amips_energy_
Definition AMIPSForm.hpp:69
assembler::AssemblyValsCache init_ass_vals_cache_
Definition AMIPSForm.hpp:67
std::shared_ptr< const varform::DifferentiableVarForm > varform_
Definition AMIPSForm.hpp:62
const VariableToSimulationGroup variable_to_simulations_
Compute the minimum jacobian of the mesh elements, not differentiable polygon elements not supported!
Definition AMIPSForm.hpp:23
virtual std::string name() const override
Definition AMIPSForm.hpp:31
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.
Definition AMIPSForm.cpp:84
MinJacobianForm(const VariableToSimulationGroup &variable_to_simulation, std::shared_ptr< const varform::DifferentiableVarForm > varform)
Definition AMIPSForm.hpp:25
std::shared_ptr< const varform::DifferentiableVarForm > varform_
Definition AMIPSForm.hpp:37
void compute_state_variable(ParameterType type, const varform::DifferentiableVarForm &target, const Eigen::VectorXd &x, Eigen::VectorXd &state_variable) const