PolyFEM
Loading...
Searching...
No Matches
NonlinearElasticVarForm.hpp
Go to the documentation of this file.
1#pragma once
2
4
9
10#include <ipc/collision_mesh.hpp>
11
12#include <functional>
13
14namespace polyfem::varform
15{
17 {
18 public:
19 using ElasticVarForm::ElasticVarForm;
20 void init(const std::string &formulation, const Units &units, const json &args, const std::string &out_path) override;
21
22 bool is_contact_enabled() const override
23 {
24 return args["contact"]["enabled"];
25 }
26 io::OutputSpace output_space() const override;
27 std::vector<io::OutputField> output_fields(
28 const io::OutputSample &sample,
29 const Eigen::MatrixXd &solution,
30 const io::OutputFieldOptions &options) const override;
31
36 void initial_solution_for_embedding(Eigen::MatrixXd &solution, const std::string &state_prefix = "") const;
37 void init_forms_for_embedding(Eigen::MatrixXd &solution, double t, const std::string &state_prefix = "");
38 void advance_for_embedding(const Eigen::VectorXd &solution);
39 void update_barrier_stiffness_for_embedding(const Eigen::VectorXd &solution);
41 double time, int step, double dt, const Eigen::MatrixXd &solution,
42 paraviewo::VTMWriter &vtm, const std::string &block_prefix) const;
43
44 int embedding_ndof() const;
45 const std::vector<std::shared_ptr<solver::Form>> &embedding_forms() const { return forms; }
46 const std::vector<std::shared_ptr<solver::AugmentedLagrangianForm>> &embedding_al_forms() const { return solve_data_.al_form; }
48 const std::shared_ptr<time_integrator::ImplicitTimeIntegrator> &embedding_time_integrator() const { return solve_data_.time_integrator; }
49 const FESpace &embedding_space() const { return space_; }
50
51 static void build_collision_mesh(
52 const mesh::Mesh &mesh,
53 const int n_bases,
54 const std::vector<basis::ElementBases> &bases,
55 const std::vector<basis::ElementBases> &geom_bases,
56 const std::vector<mesh::LocalBoundary> &total_local_boundary,
58 const json &args,
59 const io::ResourceIO &resources,
60 const Eigen::VectorXi &in_node_to_node,
61 ipc::CollisionMesh &collision_mesh);
62
63 protected:
64 void reset() override;
65 void set_obstacle(mesh::Obstacle &&obstacle) override;
66 void load_mesh(const mesh::Mesh &mesh, const json &args) override;
67 void build_basis(mesh::Mesh &mesh, const bool iso_parametric, const json &args) override;
68 void build_rhs_assembler() override;
69 void init_solve(
70 Eigen::MatrixXd &sol,
71 double t,
72 const InitialConditionOverride *initial_condition_override);
73 void init_solve_data(
74 Eigen::MatrixXd &sol,
75 double t,
76 const std::string &state_prefix,
77 const InitialConditionOverride *initial_condition_override = nullptr);
78 virtual void init_forms(const json &args, int dim, Eigen::MatrixXd &sol, double t);
79 bool has_macro_strain() const;
80 Eigen::VectorXd init_homogenization_solve(
81 Eigen::MatrixXd &solution,
82 double time,
83 const InitialConditionOverride *initial_condition_override);
85 int step, double time, Eigen::VectorXd &extended_solution,
86 Eigen::MatrixXd &solution, const ForwardStepCallback &post_step);
87 virtual void solve_tensor_nonlinear(int step, Eigen::MatrixXd &sol, bool init_lagging = true);
88
89 std::shared_ptr<assembler::PressureAssembler> build_pressure_assembler() const;
90 void build_collision_mesh(const mesh::Mesh &mesh, const json &args);
93
94 ipc::CollisionMesh collision_mesh_;
95 ipc::CollisionMesh periodic_collision_mesh_;
97 std::shared_ptr<assembler::PressureAssembler> elasticity_pressure_assembler = nullptr;
98 std::shared_ptr<assembler::ViscousDamping> damping_assembler_ = nullptr;
99 std::shared_ptr<assembler::ViscousDampingPrev> damping_prev_assembler_ = nullptr;
100
102
107 Eigen::MatrixXd displacement_gradient_;
109 std::vector<std::shared_ptr<solver::Form>> forms;
111
112 int n_obstacle_vertices() const override { return obstacle.n_vertices(); }
113 };
114
116 {
117 public:
118 using NonlinearElasticVarForm::NonlinearElasticVarForm;
119 std::string name() const override { return "NonlinearElasticTransient"; }
120
121 private:
122 void solve_problem(
123 Eigen::MatrixXd &sol,
124 const InitialConditionOverride *initial_condition_override,
125 const ForwardStepCallback &post_step) override;
126 };
127
129 {
130 public:
131 using NonlinearElasticVarForm::NonlinearElasticVarForm;
132 std::string name() const override { return "NonlinearElasticStatic"; }
133
134 private:
135 void solve_problem(
136 Eigen::MatrixXd &sol,
137 const InitialConditionOverride *initial_condition_override,
138 const ForwardStepCallback &post_step) override;
139 };
140} // namespace polyfem::varform
Read-only interface to a hierarchical collection of simulation resources.
Abstract mesh class to capture 2d/3d conforming and non-conforming meshes.
Definition Mesh.hpp:50
class to store time stepping data
Definition SolveData.hpp:56
std::vector< std::shared_ptr< solver::AugmentedLagrangianForm > > al_form
std::shared_ptr< time_integrator::ImplicitTimeIntegrator > time_integrator
A finite-element space for one scalar- or vector-valued field.
Definition FESpace.hpp:59
void solve_problem(Eigen::MatrixXd &sol, const InitialConditionOverride *initial_condition_override, const ForwardStepCallback &post_step) override
std::string name() const override
Get the name of the variational formulation.
std::string name() const override
Get the name of the variational formulation.
void solve_problem(Eigen::MatrixXd &sol, const InitialConditionOverride *initial_condition_override, const ForwardStepCallback &post_step) override
void init_forms_for_embedding(Eigen::MatrixXd &solution, double t, const std::string &state_prefix="")
void set_obstacle(mesh::Obstacle &&obstacle) override
void advance_for_embedding(const Eigen::VectorXd &solution)
assembler::MacroStrainValue macro_strain_constraint_
Prescribed macro displacement-gradient values and fixed components.
virtual void init_forms(const json &args, int dim, Eigen::MatrixXd &sol, double t)
const std::vector< std::shared_ptr< solver::AugmentedLagrangianForm > > & embedding_al_forms() const
std::shared_ptr< assembler::PressureAssembler > elasticity_pressure_assembler
Eigen::VectorXd init_homogenization_solve(Eigen::MatrixXd &solution, double time, const InitialConditionOverride *initial_condition_override)
Return the initial extended solution [periodic displacement fluctuation | flatten(G)].
std::vector< io::OutputField > output_fields(const io::OutputSample &sample, const Eigen::MatrixXd &solution, const io::OutputFieldOptions &options) const override
Get the output fields of the variational formulation, for output purposes.
bool save_timestep_for_embedding(double time, int step, double dt, const Eigen::MatrixXd &solution, paraviewo::VTMWriter &vtm, const std::string &block_prefix) const
Eigen::MatrixXd displacement_gradient_
For periodic structure, displacement u = periodic fluctuation ũ + macro strain GX.
std::shared_ptr< assembler::ViscousDampingPrev > damping_prev_assembler_
void update_barrier_stiffness_for_embedding(const Eigen::VectorXd &solution)
virtual void solve_tensor_nonlinear(int step, Eigen::MatrixXd &sol, bool init_lagging=true)
void init_solve(Eigen::MatrixXd &sol, double t, const InitialConditionOverride *initial_condition_override)
void solve_homogenization_step(int step, double time, Eigen::VectorXd &extended_solution, Eigen::MatrixXd &solution, const ForwardStepCallback &post_step)
void init(const std::string &formulation, const Units &units, const json &args, const std::string &out_path) override
Initialize the variational formulation with the given parameters.
std::shared_ptr< assembler::ViscousDamping > damping_assembler_
io::OutputSpace output_space() const override
Get the output space of the variational formulation, for output purposes.
void build_basis(mesh::Mesh &mesh, const bool iso_parametric, const json &args) override
const std::shared_ptr< time_integrator::ImplicitTimeIntegrator > & embedding_time_integrator() const
static void build_collision_mesh(const mesh::Mesh &mesh, const int n_bases, const std::vector< basis::ElementBases > &bases, const std::vector< basis::ElementBases > &geom_bases, const std::vector< mesh::LocalBoundary > &total_local_boundary, const mesh::Obstacle &obstacle, const json &args, const io::ResourceIO &resources, const Eigen::VectorXi &in_node_to_node, ipc::CollisionMesh &collision_mesh)
void prepare_for_embedding()
Prepare the standard nonlinear-elastic assembly state for use as a block in a larger nonlinear proble...
void load_mesh(const mesh::Mesh &mesh, const json &args) override
void initial_solution_for_embedding(Eigen::MatrixXd &solution, const std::string &state_prefix="") const
const std::vector< std::shared_ptr< solver::Form > > & embedding_forms() const
void init_solve_data(Eigen::MatrixXd &sol, double t, const std::string &state_prefix, const InitialConditionOverride *initial_condition_override=nullptr)
bool is_contact_enabled() const override
Check if contact is enabled for the variational formulation, for output purposes.
const StiffnessMatrix & embedding_norm_matrix() const
std::vector< std::shared_ptr< solver::Form > > forms
std::shared_ptr< assembler::PressureAssembler > build_pressure_assembler() const
std::function< void(int step, const Eigen::MatrixXd &solution)> ForwardStepCallback
Definition VarForm.hpp:55
nlohmann::json json
Definition Common.hpp:9
Eigen::SparseMatrix< double, Eigen::ColMajor > StiffnessMatrix
Definition Types.hpp:24