PolyFEM
Loading...
Searching...
No Matches
DifferentiableVarForm.hpp
Go to the documentation of this file.
1#pragma once
2
4
8
9#include <ipc/collision_mesh.hpp>
10
11#include <array>
12#include <unordered_map>
13
14namespace polyfem::mesh
15{
16 class Obstacle;
17}
18
19namespace polyfem::varform
20{
23 {
24 public:
25 virtual ~DifferentiableVarForm() = default;
26
27 virtual std::string name() const = 0;
28 virtual void solve(
29 Eigen::MatrixXd &solution,
30 const InitialConditionOverride *initial_condition_override,
31 const ForwardStepCallback &post_step,
32 bool differentiable) = 0;
33 virtual void prepare() = 0;
34 virtual void save_vtu(const std::string &path, const Eigen::MatrixXd &solution, double time, double dt) const = 0;
35
36 virtual json &get_args() = 0;
37 virtual const json &get_args() const = 0;
38 virtual const mesh::Mesh &get_mesh() const = 0;
40 virtual const assembler::Problem &get_problem() const = 0;
41 virtual const std::string &get_root_path() const = 0;
42 virtual std::string input_path(const std::string &path, bool only_if_exists = false) const = 0;
43 virtual std::string output_file_path(const std::string &path) const = 0;
44 virtual const Units &get_units() const = 0;
45 virtual bool is_contact_enabled() const = 0;
46
47 virtual const FESpace &primary_space() const = 0;
48 virtual const VarFormBoundaryState &boundary_state() const = 0;
49 virtual const assembler::Assembler &primary_assembler() const = 0;
50 virtual const assembler::Mass &mass_assembler() const = 0;
51 virtual const assembler::AssemblyValsCache &assembly_cache() const = 0;
53 virtual const StiffnessMatrix &mass_matrix() const = 0;
55 virtual const solver::SolveData *solve_data() const = 0;
56 virtual const ipc::CollisionMesh &collision_mesh() const;
57 virtual const mesh::Obstacle &get_obstacle() const;
58 virtual const assembler::ViscousDamping *damping_assembler() const { return nullptr; }
59 virtual const assembler::ViscousDampingPrev *damping_prev_assembler() const { return nullptr; }
60 virtual void initial_solution(Eigen::MatrixXd &solution, const InitialConditionOverride *override = nullptr) const;
61 virtual void initial_velocity(Eigen::MatrixXd &velocity, const InitialConditionOverride *override = nullptr) const;
62 virtual void initial_acceleration(Eigen::MatrixXd &acceleration, const InitialConditionOverride *override = nullptr) const;
63 virtual Eigen::MatrixXd displacement_gradient() const;
64
65 void get_vertices(Eigen::MatrixXd &vertices) const;
66 std::unordered_map<int, std::array<bool, 3>> boundary_conditions_ids(const std::string &bc_type) const;
67 bool is_homogenization() const;
68 bool has_periodic_boundary() const;
69 Eigen::MatrixXd periodic_tile_offsets() const;
70 bool is_adhesion_enabled() const;
71 bool is_pressure_enabled() const;
72 bool has_constraints() const;
73 bool is_problem_linear() const;
74
75 void build_stiffness_matrix(StiffnessMatrix &stiffness) const;
76 std::vector<int> primitive_to_node() const;
77 std::vector<int> node_to_primitive() const;
78 void get_elements(Eigen::MatrixXi &elements) const;
80
81 void set_vertex_positions(const Eigen::MatrixXd &vertices);
82 virtual void set_lame_parameters(const Eigen::VectorXd &lambda, const Eigen::VectorXd &mu);
83 virtual void set_friction_coefficient(double coefficient);
84 virtual void set_damping_coefficients(double psi, double phi);
85 virtual void set_dirichlet_boundary(int boundary_id, int time_step, const Eigen::VectorXd &value);
86 virtual void set_dirichlet_nodes(const Eigen::VectorXi &input_nodes, const Eigen::MatrixXd &values);
87 virtual void set_pressure_boundary(int boundary_id, int time_step, double value);
88
89 protected:
90 virtual mesh::Mesh &mutable_mesh() = 0;
93 virtual QuadratureOrders boundary_samples(int discr_order, int discr_orderq, int geometry_discr_order) const = 0;
94 };
95} // namespace polyfem::varform
Caches basis evaluation and geometric mapping at every element.
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
Optimization-facing interface implemented by differentiated VarForm adapters.
virtual const assembler::ViscousDampingPrev * damping_prev_assembler() const
virtual const assembler::ViscousDamping * damping_assembler() const
virtual const solver::SolveData * solve_data() const =0
virtual const assembler::AssemblyValsCache & assembly_cache() const =0
virtual Eigen::MatrixXd displacement_gradient() const
virtual std::string name() const =0
virtual void set_pressure_boundary(int boundary_id, int time_step, double value)
virtual void solve(Eigen::MatrixXd &solution, const InitialConditionOverride *initial_condition_override, const ForwardStepCallback &post_step, bool differentiable)=0
void build_stiffness_matrix(StiffnessMatrix &stiffness) const
virtual void set_lame_parameters(const Eigen::VectorXd &lambda, const Eigen::VectorXd &mu)
virtual const assembler::Assembler & primary_assembler() const =0
virtual const VarFormBoundaryState & boundary_state() const =0
void set_vertex_positions(const Eigen::MatrixXd &vertices)
virtual void initial_solution(Eigen::MatrixXd &solution, const InitialConditionOverride *override=nullptr) const
virtual const mesh::Mesh & get_mesh() const =0
virtual const mesh::Obstacle & get_obstacle() const
virtual void invalidate_after_parameter_update()=0
virtual const Units & get_units() const =0
virtual const StiffnessMatrix & mass_matrix() const =0
virtual solver::SolveData * solve_data()=0
void get_elements(Eigen::MatrixXi &elements) const
std::unordered_map< int, std::array< bool, 3 > > boundary_conditions_ids(const std::string &bc_type) const
virtual assembler::Problem & get_problem()=0
virtual std::string output_file_path(const std::string &path) const =0
virtual QuadratureOrders boundary_samples(int discr_order, int discr_orderq, int geometry_discr_order) const =0
virtual bool is_contact_enabled() const =0
virtual std::string input_path(const std::string &path, bool only_if_exists=false) const =0
virtual const json & get_args() const =0
virtual void set_damping_coefficients(double psi, double phi)
virtual const std::string & get_root_path() const =0
virtual void save_vtu(const std::string &path, const Eigen::MatrixXd &solution, double time, double dt) const =0
virtual void set_dirichlet_boundary(int boundary_id, int time_step, const Eigen::VectorXd &value)
virtual mesh::Mesh & mutable_mesh()=0
virtual void invalidate_after_geometry_update()=0
virtual const assembler::Problem & get_problem() const =0
virtual const FESpace & primary_space() const =0
void get_vertices(Eigen::MatrixXd &vertices) const
virtual const assembler::Mass & mass_assembler() const =0
virtual void set_dirichlet_nodes(const Eigen::VectorXi &input_nodes, const Eigen::MatrixXd &values)
virtual const assembler::AssemblyValsCache & mass_assembly_cache() const =0
virtual const ipc::CollisionMesh & collision_mesh() const
virtual void set_friction_coefficient(double coefficient)
virtual void initial_acceleration(Eigen::MatrixXd &acceleration, const InitialConditionOverride *override=nullptr) const
virtual void initial_velocity(Eigen::MatrixXd &velocity, const InitialConditionOverride *override=nullptr) const
A finite-element space for one scalar- or vector-valued field.
Definition FESpace.hpp:59
std::function< void(int step, const Eigen::MatrixXd &solution)> ForwardStepCallback
Definition VarForm.hpp:49
std::array< int, 2 > QuadratureOrders
Definition Types.hpp:19
nlohmann::json json
Definition Common.hpp:9
Eigen::SparseMatrix< double, Eigen::ColMajor > StiffnessMatrix
Definition Types.hpp:24
Temporary compatibility wrapper for boundary data belonging to one FE space.
Definition FESpace.hpp:152