PolyFEM
Loading...
Searching...
No Matches
NLHomoProblem.hpp
Go to the documentation of this file.
1#pragma once
2
3#include "NLProblem.hpp"
4
5namespace polyfem
6{
7 namespace assembler
8 {
9 class MacroStrainValue;
10 }
11 namespace mesh
12 {
13 class MeshNodes;
14 }
15} // namespace polyfem
16
17namespace polyfem::solver
18{
19
31 class NLHomoProblem : public NLProblem
32 {
33 public:
34 using typename FullNLProblem::Scalar;
35 using typename FullNLProblem::THessian;
36 using typename FullNLProblem::TVector;
37
38 NLHomoProblem(const int full_size,
39 const assembler::MacroStrainValue &macro_strain_constraint,
40 int n_bases,
41 std::shared_ptr<mesh::MeshNodes> mesh_nodes,
42 double t,
43 const std::vector<std::shared_ptr<Form>> &forms,
44 const std::vector<std::shared_ptr<AugmentedLagrangianForm>> &penalty_forms,
45 bool solve_symmetric_macro_strain,
46 const std::shared_ptr<polysolve::linear::Solver> &solver,
47 double char_length,
48 double char_force,
49 StiffnessMatrix lumped_mass,
50 int dimension);
51 virtual ~NLHomoProblem() = default;
52
53 double value(const TVector &x) override;
54 void gradient(const TVector &x, TVector &gradv) override;
55 void hessian(const TVector &x, THessian &hessian) override;
56
57 void full_hessian_to_reduced_hessian(THessian &hessian) const;
58
59 int macro_reduced_size() const;
60
61 TVector full_to_reduced(const TVector &full, const Eigen::MatrixXd &disp_grad) const;
62 TVector full_to_reduced(const TVector &full) const;
63 TVector full_to_reduced_grad(const TVector &full) const override;
64 TVector full_to_reduced_diag(const TVector &full_diag) const override;
65 TVector reduced_to_full(const TVector &reduced) const override;
66
67 TVector reduced_to_extended(const TVector &reduced, bool homogeneous = false) const;
68 TVector extended_to_reduced(const TVector &extended) const;
69 TVector extended_to_reduced_grad(const TVector &extended) const;
70 void extended_hessian_to_reduced_hessian(const THessian &extended, THessian &reduced) const;
71
72 Eigen::MatrixXd reduced_to_disp_grad(const TVector &reduced, bool homogeneous = false) const;
73
74 void set_fixed_entry(const Eigen::VectorXi &fixed_entry);
75
76 void init(const TVector &x0) override;
77 bool is_step_valid(const TVector &x0, const TVector &x1) override;
78 bool is_step_collision_free(const TVector &x0, const TVector &x1) override;
79 double max_step_size(const TVector &x0, const TVector &x1) override;
80
81 void line_search_begin(const TVector &x0, const TVector &x1) override;
82 void post_step(const polysolve::nonlinear::PostStepData &data) override;
83
84 void solution_changed(const TVector &new_x) override;
85
86 void init_lagging(const TVector &x) override;
87 void update_lagging(const TVector &x, const int iter_num) override;
88
89 void update_quantities(const double t, const TVector &x) override;
90
91 void add_form(const std::shared_ptr<Form> &form) { homo_forms.push_back(form); }
92 bool has_symmetry_constraint() const { return only_symmetric; }
93
94 private:
95 void init_projection();
96 Eigen::MatrixXd constraint_grad() const;
97
98 TVector macro_full_to_reduced(const TVector &full) const;
99 Eigen::MatrixXd macro_full_to_reduced_grad(const Eigen::MatrixXd &full) const;
100 TVector macro_reduced_to_full(const TVector &reduced, bool homogeneous = false) const;
101
102 const int n_bases_;
103 const int dimension_;
104 std::shared_ptr<mesh::MeshNodes> mesh_nodes_;
105 const bool only_symmetric;
107
108 Eigen::VectorXi fixed_mask_;
111 Eigen::MatrixXd macro_mid_to_reduced_; // (dim*dim) x (dim*(dim+1)/2)
114 Eigen::MatrixXd macro_full_to_mid_;
115 Eigen::MatrixXd macro_mid_to_full_;
116
117 std::vector<std::shared_ptr<Form>> homo_forms;
118 };
119} // namespace polyfem::solver
int x
std::vector< std::shared_ptr< Form > > & forms()
For homogenization problem, u = ũ + GX u := displacement ũ := periodic fluctuation G := macro strain ...
std::shared_ptr< mesh::MeshNodes > mesh_nodes_
Eigen::MatrixXd reduced_to_disp_grad(const TVector &reduced, bool homogeneous=false) const
void gradient(const TVector &x, TVector &gradv) override
void init(const TVector &x0) override
void post_step(const polysolve::nonlinear::PostStepData &data) override
Eigen::MatrixXd macro_mid_to_reduced_
Selection matrix that maps potentially symmetric macro strain G to its free dof (reduced).
void set_fixed_entry(const Eigen::VectorXi &fixed_entry)
TVector macro_full_to_reduced(const TVector &full) const
bool is_step_valid(const TVector &x0, const TVector &x1) override
const assembler::MacroStrainValue & macro_strain_constraint_
void line_search_begin(const TVector &x0, const TVector &x1) override
void update_quantities(const double t, const TVector &x) override
Eigen::MatrixXd macro_full_to_mid_
Selection matrix that maps full macro strain G to its upper triangular dof (mid).
TVector extended_to_reduced_grad(const TVector &extended) const
void hessian(const TVector &x, THessian &hessian) override
void init_lagging(const TVector &x) override
TVector full_to_reduced_diag(const TVector &full_diag) const override
TVector reduced_to_extended(const TVector &reduced, bool homogeneous=false) const
TVector extended_to_reduced(const TVector &extended) const
virtual ~NLHomoProblem()=default
std::vector< std::shared_ptr< Form > > homo_forms
Eigen::MatrixXd constraint_grad() const
TVector reduced_to_full(const TVector &reduced) const override
Eigen::MatrixXd macro_full_to_reduced_grad(const Eigen::MatrixXd &full) const
double value(const TVector &x) override
TVector full_to_reduced(const TVector &full, const Eigen::MatrixXd &disp_grad) const
TVector full_to_reduced_grad(const TVector &full) const override
void full_hessian_to_reduced_hessian(THessian &hessian) const
void solution_changed(const TVector &new_x) override
double max_step_size(const TVector &x0, const TVector &x1) override
void extended_hessian_to_reduced_hessian(const THessian &extended, THessian &reduced) const
bool is_step_collision_free(const TVector &x0, const TVector &x1) override
void add_form(const std::shared_ptr< Form > &form)
void update_lagging(const TVector &x, const int iter_num) override
TVector macro_reduced_to_full(const TVector &reduced, bool homogeneous=false) const
Eigen::SparseMatrix< double, Eigen::ColMajor > StiffnessMatrix
Definition Types.hpp:24