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 std::string output_file_path(const std::string &path) const = 0;
42 virtual const Units &get_units() const = 0;
43 virtual bool is_contact_enabled() const = 0;
44
45 virtual const FESpace &primary_space() const = 0;
46 virtual const VarFormBoundaryState &boundary_state() const = 0;
47 virtual const assembler::Assembler &primary_assembler() const = 0;
48 virtual const assembler::Mass &mass_assembler() const = 0;
49 virtual const assembler::AssemblyValsCache &assembly_cache() const = 0;
51 virtual const StiffnessMatrix &mass_matrix() const = 0;
53 virtual const solver::SolveData *solve_data() const = 0;
54 virtual const ipc::CollisionMesh &collision_mesh() const;
55 virtual const mesh::Obstacle &get_obstacle() const;
56 virtual const assembler::ViscousDamping *damping_assembler() const { return nullptr; }
57 virtual const assembler::ViscousDampingPrev *damping_prev_assembler() const { return nullptr; }
58 virtual void initial_solution(Eigen::MatrixXd &solution, const InitialConditionOverride *override = nullptr) const;
59 virtual void initial_velocity(Eigen::MatrixXd &velocity, const InitialConditionOverride *override = nullptr) const;
60 virtual void initial_acceleration(Eigen::MatrixXd &acceleration, const InitialConditionOverride *override = nullptr) const;
61 virtual Eigen::MatrixXd displacement_gradient() const;
62
63 void get_vertices(Eigen::MatrixXd &vertices) const;
64 std::unordered_map<int, std::array<bool, 3>> boundary_conditions_ids(const std::string &bc_type) const;
65 bool is_homogenization() const;
66 bool has_periodic_boundary() const;
67 Eigen::MatrixXd periodic_tile_offsets() const;
68 bool is_adhesion_enabled() const;
69 bool is_pressure_enabled() const;
70 bool has_constraints() const;
71 bool is_problem_linear() const;
72
73 void build_stiffness_matrix(StiffnessMatrix &stiffness) const;
74 std::vector<int> primitive_to_node() const;
75 std::vector<int> node_to_primitive() const;
76 void get_elements(Eigen::MatrixXi &elements) const;
78
79 void set_vertex_positions(const Eigen::MatrixXd &vertices);
80 virtual void set_lame_parameters(const Eigen::VectorXd &lambda, const Eigen::VectorXd &mu);
81 virtual void set_friction_coefficient(double coefficient);
82 virtual void set_damping_coefficients(double psi, double phi);
83 virtual void set_dirichlet_boundary(int boundary_id, int time_step, const Eigen::VectorXd &value);
84 virtual void set_dirichlet_nodes(const Eigen::VectorXi &input_nodes, const Eigen::MatrixXd &values);
85 virtual void set_pressure_boundary(int boundary_id, int time_step, double value);
86
87 protected:
88 virtual mesh::Mesh &mutable_mesh() = 0;
91 virtual QuadratureOrders boundary_samples(int discr_order, int discr_orderq, int geometry_discr_order) const = 0;
92 };
93} // 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:50
class to store time stepping data
Definition SolveData.hpp:56
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 const json & get_args() const =0
virtual void set_damping_coefficients(double psi, double phi)
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:53
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