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 void init(const std::string &formulation, const Units &units, const json &args, const std::string &out_path) override;
19
20 bool is_contact_enabled() const override
21 {
22 return args["contact"]["enabled"];
23 }
24 io::OutputSpace output_space() const override;
25 std::vector<io::OutputField> output_fields(
26 const io::OutputSample &sample,
27 const Eigen::MatrixXd &solution,
28 const io::OutputFieldOptions &options) const override;
29
34 void initial_solution_for_embedding(Eigen::MatrixXd &solution, const std::string &state_prefix = "") const;
35 void init_forms_for_embedding(Eigen::MatrixXd &solution, double t, const std::string &state_prefix = "");
36 void advance_for_embedding(const Eigen::VectorXd &solution);
37 void update_barrier_stiffness_for_embedding(const Eigen::VectorXd &solution);
39 double time, int step, double dt, const Eigen::MatrixXd &solution,
40 paraviewo::VTMWriter &vtm, const std::string &block_prefix) const;
41
42 int embedding_ndof() const;
43 const std::vector<std::shared_ptr<solver::Form>> &embedding_forms() const { return forms; }
44 const std::vector<std::shared_ptr<solver::AugmentedLagrangianForm>> &embedding_al_forms() const { return solve_data_.al_form; }
46 const std::shared_ptr<time_integrator::ImplicitTimeIntegrator> &embedding_time_integrator() const { return solve_data_.time_integrator; }
47 const FESpace &embedding_space() const { return space_; }
48
49 static void build_collision_mesh(
50 const mesh::Mesh &mesh,
51 const int n_bases,
52 const std::vector<basis::ElementBases> &bases,
53 const std::vector<basis::ElementBases> &geom_bases,
54 const std::vector<mesh::LocalBoundary> &total_local_boundary,
56 const json &args,
57 const std::function<std::string(const std::string &)> &resolve_input_path,
58 const Eigen::VectorXi &in_node_to_node,
59 ipc::CollisionMesh &collision_mesh);
60
61 protected:
62 void reset() override;
63 void load_mesh(const mesh::Mesh &mesh, const json &args) override;
64 void build_basis(mesh::Mesh &mesh, const bool iso_parametric, const json &args) override;
65 void build_rhs_assembler() override;
66 void init_solve(
67 Eigen::MatrixXd &sol,
68 double t,
69 const InitialConditionOverride *initial_condition_override);
70 void init_solve_data(
71 Eigen::MatrixXd &sol,
72 double t,
73 const std::string &state_prefix,
74 const InitialConditionOverride *initial_condition_override = nullptr);
75 virtual void init_forms(const json &args, int dim, Eigen::MatrixXd &sol, double t);
76 virtual void solve_tensor_nonlinear(int step, Eigen::MatrixXd &sol, bool init_lagging = true);
77
78 std::shared_ptr<assembler::PressureAssembler> build_pressure_assembler() const;
79 void build_collision_mesh(const mesh::Mesh &mesh, const json &args);
82
83 ipc::CollisionMesh collision_mesh_;
84 ipc::CollisionMesh periodic_collision_mesh_;
86 std::shared_ptr<assembler::PressureAssembler> elasticity_pressure_assembler = nullptr;
87 std::shared_ptr<assembler::ViscousDamping> damping_assembler_ = nullptr;
88 std::shared_ptr<assembler::ViscousDampingPrev> damping_prev_assembler_ = nullptr;
89
91
93 std::vector<std::shared_ptr<solver::Form>> forms;
95
96 int n_obstacle_vertices() const override { return obstacle.n_vertices(); }
97 };
98
100 {
101 public:
102 std::string name() const override { return "NonlinearElasticTransient"; }
103
104 private:
105 void solve_problem(
106 Eigen::MatrixXd &sol,
107 const InitialConditionOverride *initial_condition_override,
108 const ForwardStepCallback &post_step) override;
109 };
110
112 {
113 public:
114 std::string name() const override { return "NonlinearElasticStatic"; }
115
116 private:
117 void solve_problem(
118 Eigen::MatrixXd &sol,
119 const InitialConditionOverride *initial_condition_override,
120 const ForwardStepCallback &post_step) override;
121 };
122} // namespace polyfem::varform
Abstract mesh class to capture 2d/3d conforming and non-conforming meshes.
Definition Mesh.hpp:49
class to store time stepping data
Definition SolveData.hpp:55
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 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.
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 std::function< std::string(const std::string &)> &resolve_input_path, const Eigen::VectorXi &in_node_to_node, ipc::CollisionMesh &collision_mesh)
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
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::string resolve_input_path(const std::string &path, const bool only_if_exists=false) const
Definition VarForm.cpp:1105
std::function< void(int step, const Eigen::MatrixXd &solution)> ForwardStepCallback
Definition VarForm.hpp:49
nlohmann::json json
Definition Common.hpp:9
Eigen::SparseMatrix< double, Eigen::ColMajor > StiffnessMatrix
Definition Types.hpp:24