PolyFEM
Loading...
Searching...
No Matches
NonlinearElasticVarForm.hpp
Go to the documentation of this file.
1#pragma once
2
4
8
9#include <ipc/collision_mesh.hpp>
10
11#include <functional>
12
13namespace polyfem::varform
14{
16 {
17 public:
18 using ElasticVarForm::ElasticVarForm;
19 void init(const std::string &formulation, const Units &units, const json &args, const std::string &out_path) override;
20
21 bool is_contact_enabled() const override
22 {
23 return args["contact"]["enabled"];
24 }
25 io::OutputSpace output_space() const override;
26 std::vector<io::OutputField> output_fields(
27 const io::OutputSample &sample,
28 const Eigen::MatrixXd &solution,
29 const io::OutputFieldOptions &options) const override;
30
35 void initial_solution_for_embedding(Eigen::MatrixXd &solution, const std::string &state_prefix = "") const;
36 void init_forms_for_embedding(Eigen::MatrixXd &solution, double t, const std::string &state_prefix = "");
37 void advance_for_embedding(const Eigen::VectorXd &solution);
38 void update_barrier_stiffness_for_embedding(const Eigen::VectorXd &solution);
40 double time, int step, double dt, const Eigen::MatrixXd &solution,
41 paraviewo::VTMWriter &vtm, const std::string &block_prefix) const;
42
43 int embedding_ndof() const;
44 const std::vector<std::shared_ptr<solver::Form>> &embedding_forms() const { return forms; }
45 const std::vector<std::shared_ptr<solver::AugmentedLagrangianForm>> &embedding_al_forms() const { return solve_data_.al_form; }
47 const std::shared_ptr<time_integrator::ImplicitTimeIntegrator> &embedding_time_integrator() const { return solve_data_.time_integrator; }
48 const FESpace &embedding_space() const { return space_; }
49
50 static void build_collision_mesh(
51 const mesh::Mesh &mesh,
52 const int n_bases,
53 const std::vector<basis::ElementBases> &bases,
54 const std::vector<basis::ElementBases> &geom_bases,
55 const std::vector<mesh::LocalBoundary> &total_local_boundary,
57 const json &args,
58 const io::ResourceIO &resources,
59 const Eigen::VectorXi &in_node_to_node,
60 ipc::CollisionMesh &collision_mesh);
61
62 protected:
63 void reset() override;
64 void set_obstacle(mesh::Obstacle &&obstacle) override;
65 void load_mesh(const mesh::Mesh &mesh, const json &args) override;
66 void build_basis(mesh::Mesh &mesh, const bool iso_parametric, const json &args) override;
67 void build_rhs_assembler() override;
68 void init_solve(
69 Eigen::MatrixXd &sol,
70 double t,
71 const InitialConditionOverride *initial_condition_override);
72 void init_solve_data(
73 Eigen::MatrixXd &sol,
74 double t,
75 const std::string &state_prefix,
76 const InitialConditionOverride *initial_condition_override = nullptr);
77 virtual void init_forms(const json &args, int dim, Eigen::MatrixXd &sol, double t);
78 virtual void solve_tensor_nonlinear(int step, Eigen::MatrixXd &sol, bool init_lagging = true);
79
80 std::shared_ptr<assembler::PressureAssembler> build_pressure_assembler() const;
81 void build_collision_mesh(const mesh::Mesh &mesh, const json &args);
84
85 ipc::CollisionMesh collision_mesh_;
86 ipc::CollisionMesh periodic_collision_mesh_;
88 std::shared_ptr<assembler::PressureAssembler> elasticity_pressure_assembler = nullptr;
89 std::shared_ptr<assembler::ViscousDamping> damping_assembler_ = nullptr;
90 std::shared_ptr<assembler::ViscousDampingPrev> damping_prev_assembler_ = nullptr;
91
93
95 std::vector<std::shared_ptr<solver::Form>> forms;
97
98 int n_obstacle_vertices() const override { return obstacle.n_vertices(); }
99 };
100
102 {
103 public:
104 using NonlinearElasticVarForm::NonlinearElasticVarForm;
105 std::string name() const override { return "NonlinearElasticTransient"; }
106
107 private:
108 void solve_problem(
109 Eigen::MatrixXd &sol,
110 const InitialConditionOverride *initial_condition_override,
111 const ForwardStepCallback &post_step) override;
112 };
113
115 {
116 public:
117 using NonlinearElasticVarForm::NonlinearElasticVarForm;
118 std::string name() const override { return "NonlinearElasticStatic"; }
119
120 private:
121 void solve_problem(
122 Eigen::MatrixXd &sol,
123 const InitialConditionOverride *initial_condition_override,
124 const ForwardStepCallback &post_step) override;
125 };
126} // 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)
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
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
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 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:53
nlohmann::json json
Definition Common.hpp:9
Eigen::SparseMatrix< double, Eigen::ColMajor > StiffnessMatrix
Definition Types.hpp:24