PolyFEM
Loading...
Searching...
No Matches
TransientForm.hpp
Go to the documentation of this file.
1#pragma once
2
5
6#include <Eigen/Core>
7
8#include <memory>
9#include <string>
10#include <vector>
11
12namespace polyfem::solver
13{
15 {
16 public:
17 TransientForm(const VariableToSimulationGroup &variable_to_simulations, const int time_steps, const double dt, const std::string &transient_integral_type, const std::vector<int> &steps, const std::shared_ptr<StaticForm> &obj) : AdjointForm(variable_to_simulations), time_steps_(time_steps), dt_(dt), steps_(steps), obj_(obj), transient_integral_type_(transient_integral_type) {}
18 virtual ~TransientForm() = default;
19
20 virtual Eigen::MatrixXd compute_adjoint_rhs(const Eigen::VectorXd &x, const State &state, const DiffCache &diff_cache) const override;
21 virtual void compute_partial_gradient(const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override;
22
23 void init(const Eigen::VectorXd &x) override;
24 bool is_step_valid(const Eigen::VectorXd &x0, const Eigen::VectorXd &x1) const override;
25 double max_step_size(const Eigen::VectorXd &x0, const Eigen::VectorXd &x1) const override;
26 void line_search_begin(const Eigen::VectorXd &x0, const Eigen::VectorXd &x1) override;
27 void line_search_end() override;
28 void post_step(const polysolve::nonlinear::PostStepData &data) override;
29 void solution_changed(const Eigen::VectorXd &new_x) override;
30 bool is_step_collision_free(const Eigen::VectorXd &x0, const Eigen::VectorXd &x1) const override;
31
32 protected:
33 virtual double value_unweighted(const Eigen::VectorXd &x) const override;
34
36 double dt_;
37 std::vector<int> steps_;
38 std::shared_ptr<StaticForm> obj_;
39
40 private:
41 std::vector<double> get_transient_quadrature_weights() const;
43 };
44
46 {
47 public:
48 ProxyTransientForm(const VariableToSimulationGroup &variable_to_simulations, const int time_steps, const double dt, const std::string &transient_integral_type, const std::vector<int> &steps, const std::shared_ptr<StaticForm> &obj) : TransientForm(variable_to_simulations, time_steps, dt, transient_integral_type, steps, obj) {}
49 virtual ~ProxyTransientForm() = default;
50
51 Eigen::MatrixXd compute_adjoint_rhs(const Eigen::VectorXd &x, const State &state, const DiffCache &diff_cache) const override;
52 void compute_partial_gradient(const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override;
53
54 protected:
55 double value_unweighted(const Eigen::VectorXd &x) const override;
56
57 private:
58 double eval(const Eigen::VectorXd &y) const;
59 Eigen::VectorXd eval_grad(const Eigen::VectorXd &y) const;
60 };
61} // namespace polyfem::solver
int y
int x
Storage for additional data required by differntial code.
Definition DiffCache.hpp:21
main class that contains the polyfem solver and all its state
Definition State.hpp:113
Eigen::MatrixXd compute_adjoint_rhs(const Eigen::VectorXd &x, const State &state, const DiffCache &diff_cache) const override
ProxyTransientForm(const VariableToSimulationGroup &variable_to_simulations, const int time_steps, const double dt, const std::string &transient_integral_type, const std::vector< int > &steps, const std::shared_ptr< StaticForm > &obj)
Eigen::VectorXd eval_grad(const Eigen::VectorXd &y) const
double eval(const Eigen::VectorXd &y) 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.
virtual double value_unweighted(const Eigen::VectorXd &x) const override
Compute the value of the form.
void solution_changed(const Eigen::VectorXd &new_x) override
Update cached fields upon a change in the solution.
double max_step_size(const Eigen::VectorXd &x0, const Eigen::VectorXd &x1) const override
Determine the maximum step size allowable between the current and next solution.
virtual Eigen::MatrixXd compute_adjoint_rhs(const Eigen::VectorXd &x, const State &state, const DiffCache &diff_cache) const override
bool is_step_collision_free(const Eigen::VectorXd &x0, const Eigen::VectorXd &x1) const override
Checks if the step is collision free.
virtual void compute_partial_gradient(const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override
virtual ~TransientForm()=default
TransientForm(const VariableToSimulationGroup &variable_to_simulations, const int time_steps, const double dt, const std::string &transient_integral_type, const std::vector< int > &steps, const std::shared_ptr< StaticForm > &obj)
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.
std::shared_ptr< StaticForm > obj_
void init(const Eigen::VectorXd &x) override
Initialize the form.
void line_search_begin(const Eigen::VectorXd &x0, const Eigen::VectorXd &x1) override
Initialize variables used during the line search.
std::vector< double > get_transient_quadrature_weights() const
void line_search_end() override
Clear variables used during the line search.
void post_step(const polysolve::nonlinear::PostStepData &data) override
Update fields after a step in the optimization.
A collection of VariableToSimulation.