PolyFEM
Loading...
Searching...
No Matches
AdjointNLProblem.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <polyfem/Common.hpp>
8
9#include <Eigen/Core>
10
11#include <functional>
12#include <memory>
13#include <vector>
14#include <fstream>
15
16namespace polyfem::solver
17{
18 class AdjointForm;
19
21 {
22 public:
23 AdjointNLProblem(std::shared_ptr<AdjointForm> form,
24 const VariableToSimulationGroup &variables_to_simulation,
25 const std::vector<std::shared_ptr<varform::DifferentiableVarForm>> &all_varforms,
26 const std::vector<std::shared_ptr<DiffCache>> &all_diff_caches,
27 const json &args,
28 std::function<bool()> remeshing_trigger = {});
29 AdjointNLProblem(std::shared_ptr<AdjointForm> form,
30 const std::vector<std::shared_ptr<AdjointForm>> &stopping_conditions,
31 const VariableToSimulationGroup &variables_to_simulation,
32 const std::vector<std::shared_ptr<varform::DifferentiableVarForm>> &all_varforms,
33 const std::vector<std::shared_ptr<DiffCache>> &all_diff_caches,
34 const json &args,
35 std::function<bool()> remeshing_trigger = {});
36
37 double value(const Eigen::VectorXd &x) override;
38
39 void gradient(const Eigen::VectorXd &x, Eigen::VectorXd &gradv) override;
40 void hessian(const Eigen::VectorXd &x, StiffnessMatrix &hessian) override;
41 void save_to_file(const int iter_num, const Eigen::VectorXd &x0);
42 bool is_step_valid(const Eigen::VectorXd &x0, const Eigen::VectorXd &x1) override;
43 bool is_step_collision_free(const Eigen::VectorXd &x0, const Eigen::VectorXd &x1) override;
44 double max_step_size(const Eigen::VectorXd &x0, const Eigen::VectorXd &x1) override;
45
46 void line_search_begin(const Eigen::VectorXd &x0, const Eigen::VectorXd &x1) override;
47 void line_search_end() override;
48 void post_step(const polysolve::nonlinear::PostStepData &data) override;
49 bool stop(const TVector &x) override;
50
51 void solution_changed(const Eigen::VectorXd &new_x) override;
52 bool after_line_search_custom_operation(const Eigen::VectorXd &x0, const Eigen::VectorXd &x1) override;
53 void solve_pde();
54
55 private:
56 std::shared_ptr<AdjointForm> form_;
58 std::vector<std::shared_ptr<varform::DifferentiableVarForm>> all_varforms_;
59 std::vector<std::shared_ptr<DiffCache>> all_diff_caches_;
60 std::vector<bool> active_varform_mask;
61 Eigen::VectorXd cur_grad;
62 Eigen::VectorXd curr_x;
63
65 std::ofstream solution_ostream;
66
69
71 std::vector<int> solve_in_order;
72
73 int save_iter = 0;
74
75 std::vector<std::shared_ptr<AdjointForm>> stopping_conditions_; // if all the stopping conditions are non-positive, stop the optimization
76 std::function<bool()> remeshing_trigger_;
77 };
78} // namespace polyfem::solver
int x
bool after_line_search_custom_operation(const Eigen::VectorXd &x0, const Eigen::VectorXd &x1) override
std::function< bool()> remeshing_trigger_
double max_step_size(const Eigen::VectorXd &x0, const Eigen::VectorXd &x1) override
void gradient(const Eigen::VectorXd &x, Eigen::VectorXd &gradv) override
void save_to_file(const int iter_num, const Eigen::VectorXd &x0)
bool stop(const TVector &x) override
bool is_step_valid(const Eigen::VectorXd &x0, const Eigen::VectorXd &x1) override
std::vector< std::shared_ptr< AdjointForm > > stopping_conditions_
std::vector< std::shared_ptr< DiffCache > > all_diff_caches_
void hessian(const Eigen::VectorXd &x, StiffnessMatrix &hessian) override
void post_step(const polysolve::nonlinear::PostStepData &data) override
std::vector< std::shared_ptr< varform::DifferentiableVarForm > > all_varforms_
void solution_changed(const Eigen::VectorXd &new_x) override
bool is_step_collision_free(const Eigen::VectorXd &x0, const Eigen::VectorXd &x1) override
VariableToSimulationGroup variables_to_simulation_
double value(const Eigen::VectorXd &x) override
std::shared_ptr< AdjointForm > form_
void line_search_begin(const Eigen::VectorXd &x0, const Eigen::VectorXd &x1) override
nlohmann::json json
Definition Common.hpp:9
Eigen::SparseMatrix< double, Eigen::ColMajor > StiffnessMatrix
Definition Types.hpp:24