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.contains("contact") && args["contact"].contains("enabled") && args["contact"]["enabled"].get<bool>();
23 }
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 protected:
51 void reset() override;
52 void load_mesh(const mesh::Mesh &mesh, const json &args) override;
53 void build_basis(mesh::Mesh &mesh, const bool iso_parametric, const json &args) override;
54 void build_rhs_assembler() override;
55 void init_solve(Eigen::MatrixXd &sol, const double t);
56 void init_solve_data(Eigen::MatrixXd &sol, double t, const std::string &state_prefix);
57 void init_forms(const json &args, const int dim, Eigen::MatrixXd &sol, const double t);
58 void solve_tensor_nonlinear(int step, Eigen::MatrixXd &sol, const bool init_lagging = true);
59
60 std::shared_ptr<assembler::PressureAssembler> build_pressure_assembler() const;
61 void build_collision_mesh(const mesh::Mesh &mesh, const json &args);
64 const mesh::Mesh &mesh,
65 const int n_bases,
66 const std::vector<basis::ElementBases> &bases,
67 const std::vector<basis::ElementBases> &geom_bases,
68 const std::vector<mesh::LocalBoundary> &total_local_boundary,
70 const json &args,
71 const std::function<std::string(const std::string &)> &resolve_input_path,
72 const Eigen::VectorXi &in_node_to_node,
73 ipc::CollisionMesh &collision_mesh);
74
75 ipc::CollisionMesh collision_mesh;
76 std::shared_ptr<assembler::PressureAssembler> elasticity_pressure_assembler = nullptr;
77 std::shared_ptr<assembler::ViscousDamping> damping_assembler = nullptr;
78 std::shared_ptr<assembler::ViscousDampingPrev> damping_prev_assembler = nullptr;
79
81
83 std::vector<std::shared_ptr<solver::Form>> forms;
85
86 int n_obstacle_vertices() const override { return obstacle.n_vertices(); }
87 };
88
90 {
91 public:
92 std::string name() const override { return "NonlinearElasticTransient"; }
93
94 private:
95 void solve_problem(Eigen::MatrixXd &sol) override;
96 };
97
99 {
100 public:
101 std::string name() const override { return "NonlinearElasticStatic"; }
102
103 private:
104 void solve_problem(Eigen::MatrixXd &sol) override;
105 };
106} // 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
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 init_forms_for_embedding(Eigen::MatrixXd &solution, double t, const std::string &state_prefix="")
void advance_for_embedding(const Eigen::VectorXd &solution)
const std::vector< std::shared_ptr< solver::AugmentedLagrangianForm > > & embedding_al_forms() const
std::shared_ptr< assembler::PressureAssembler > elasticity_pressure_assembler
void init_forms(const json &args, const int dim, Eigen::MatrixXd &sol, const double t)
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::ViscousDamping > damping_assembler
void init_solve_data(Eigen::MatrixXd &sol, double t, const std::string &state_prefix)
void update_barrier_stiffness_for_embedding(const Eigen::VectorXd &solution)
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.
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
std::shared_ptr< assembler::ViscousDampingPrev > damping_prev_assembler
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 solve_tensor_nonlinear(int step, Eigen::MatrixXd &sol, const bool init_lagging=true)
bool is_contact_enabled() const override
Check if contact is enabled for the variational formulation, for output purposes.
void init_solve(Eigen::MatrixXd &sol, const double t)
const StiffnessMatrix & embedding_norm_matrix() const
void build_collision_mesh(const mesh::Mesh &mesh, const json &args)
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:1103
nlohmann::json json
Definition Common.hpp:9
Eigen::SparseMatrix< double, Eigen::ColMajor > StiffnessMatrix
Definition Types.hpp:24