PolyFEM
Loading...
Searching...
No Matches
Remesher.hpp
Go to the documentation of this file.
1#pragma once
2
6
7#include <unordered_map>
8#include <variant>
9
11{
13} // namespace polyfem::time_integrator
14
15#define POLYFEM_REMESHER_SCOPED_TIMER(name) polyfem::utils::Timer __polyfem_timer(Remesher::timings[name])
16
17namespace polyfem::mesh
18{
20
22 {
23 // --------------------------------------------------------------------
24 // typedefs
25 public:
27 template <typename T>
28 using EdgeMap = std::unordered_map<
29 std::array<size_t, 2>, T,
33 template <typename T>
34 using FaceMap = std::unordered_map<
35 std::array<size_t, 3>, T,
38 template <typename T>
39 using TetMap = std::unordered_map<
40 std::array<size_t, 4>, T,
43 template <typename T>
44 using BoundaryMap = std::variant<EdgeMap<T>, FaceMap<T>>;
45
46 // --------------------------------------------------------------------
47 // constructors
48 public:
51 Remesher(const State &state,
52 const Eigen::MatrixXd &obstacle_displacements,
53 const Eigen::MatrixXd &obstacle_quantities,
54 const double current_time,
55 const double starting_energy);
56
57 virtual ~Remesher() = default;
58
66 virtual void init(
67 const Eigen::MatrixXd &rest_positions,
68 const Eigen::MatrixXd &positions,
69 const Eigen::MatrixXi &elements,
70 const Eigen::MatrixXd &projection_quantities,
71 const BoundaryMap<int> &boundary_to_id,
72 const std::vector<int> &body_ids,
73 const EdgeMap<double> &elastic_energy,
74 const EdgeMap<double> &contact_energy);
75
76 protected:
79 const size_t num_vertices,
80 const Eigen::MatrixXi &elements) = 0;
81
82 // --------------------------------------------------------------------
83 // main functions
84 public:
87 virtual bool execute() = 0;
88
89 protected:
91 void project_quantities();
92
94 void cache_before();
95
96 // --------------------------------------------------------------------
97 // getters
98 public:
100 virtual int dim() const = 0;
101
104 virtual bool is_volume() const { return dim() == 3; }
105
107 virtual Eigen::MatrixXd rest_positions() const = 0;
109 virtual Eigen::MatrixXd displacements() const = 0;
111 virtual Eigen::MatrixXd positions() const = 0;
113 virtual Eigen::MatrixXi edges() const = 0;
115 virtual Eigen::MatrixXi elements() const = 0;
117 virtual Eigen::MatrixXi boundary_edges() const = 0;
119 virtual Eigen::MatrixXi boundary_faces() const = 0;
121 virtual Eigen::MatrixXd projection_quantities() const = 0;
123 virtual BoundaryMap<int> boundary_ids() const = 0;
125 virtual std::vector<int> body_ids() const = 0;
127 virtual std::vector<int> boundary_nodes(const Eigen::VectorXi &vertex_to_basis) const = 0;
128
130 virtual int n_quantities() const = 0;
131
133 const Obstacle &obstacle() const { return state.obstacle; }
135 const Eigen::MatrixXd &obstacle_displacements() const { return m_obstacle_displacements; }
137 const Eigen::MatrixXd &obstacle_quantities() const { return m_obstacle_quantities; }
138
139 // --------------------------------------------------------------------
140 // setters
141 public:
143 virtual void set_rest_positions(const Eigen::MatrixXd &positions) = 0;
145 virtual void set_positions(const Eigen::MatrixXd &positions) = 0;
147 virtual void set_projection_quantities(const Eigen::MatrixXd &projection_quantities) = 0;
149 virtual void set_fixed(const std::vector<bool> &fixed) = 0;
151 virtual void set_boundary_ids(const BoundaryMap<int> &boundary_to_id) = 0;
153 virtual void set_body_ids(const std::vector<int> &body_ids) = 0;
154
155 // --------------------------------------------------------------------
156 // utilities
157 public:
160 void write_mesh(const std::string &path) const;
161
163 static Eigen::MatrixXd combine_time_integrator_quantities(
164 const std::shared_ptr<time_integrator::ImplicitTimeIntegrator> &time_integrator);
165
168 const Eigen::MatrixXd &quantities,
169 const int dim,
170 Eigen::MatrixXd &x_prevs,
171 Eigen::MatrixXd &v_prevs,
172 Eigen::MatrixXd &a_prevs);
173
177 void init_assembler(const std::vector<int> &body_ids) const;
178
185 static int build_bases(
186 const Mesh &mesh,
187 const std::string &assembler_formulation,
188 std::vector<polyfem::basis::ElementBases> &bases,
189 std::vector<LocalBoundary> &local_boundary,
190 Eigen::VectorXi &vertex_to_basis);
191
193 const State &state;
194
195 // --------------------------------------------------------------------
196 // members
197 public:
199
200 protected:
201 // TODO: Drop this and only use a local EdgeOperationCache
203 {
205 Eigen::MatrixXd rest_positions;
207 Eigen::MatrixXi elements;
209 Eigen::MatrixXd projection_quantities;
210 };
211
213
215 const json args;
217 const Eigen::MatrixXd m_obstacle_displacements;
219 Eigen::MatrixXd m_obstacle_quantities;
221 const double current_time;
223 const double starting_energy;
224
225 // --------------------------------------------------------------------
226 // statistics
227 public:
228 static void log_timings();
229
231 static std::unordered_map<std::string, utils::Timing> timings;
232 static double total_time; // = 0;
233 static size_t num_solves; // = 0;
234 static size_t total_ndofs; // = 0;
235 };
236
237} // namespace polyfem::mesh
main class that contains the polyfem solver and all its state
Definition State.hpp:114
mesh::Obstacle obstacle
Obstacles used in collisions.
Definition State.hpp:596
Abstract mesh class to capture 2d/3d conforming and non-conforming meshes.
Definition Mesh.hpp:41
const Eigen::MatrixXd m_obstacle_displacements
Collision obstacles' displacements.
Definition Remesher.hpp:217
const Eigen::MatrixXd & obstacle_displacements() const
Get a reference to the collision obstacles' displacements.
Definition Remesher.hpp:135
static int build_bases(const Mesh &mesh, const std::string &assembler_formulation, std::vector< polyfem::basis::ElementBases > &bases, std::vector< LocalBoundary > &local_boundary, Eigen::VectorXi &vertex_to_basis)
Build bases for a given mesh (V, F)
Definition Remesher.cpp:256
std::unordered_map< std::array< size_t, 2 >, T, polyfem::utils::HashUnorderedArray< size_t, 2 >, polyfem::utils::EqualUnorderedArray< size_t, 2 > > EdgeMap
Map from a (sorted) edge to an integer (ID)
Definition Remesher.hpp:31
virtual void set_body_ids(const std::vector< int > &body_ids)=0
Set the body IDs of all elements.
virtual void init_attributes_and_connectivity(const size_t num_vertices, const Eigen::MatrixXi &elements)=0
Create an internal mesh representation and associate attributes.
const double current_time
Current time.
Definition Remesher.hpp:221
virtual void set_projection_quantities(const Eigen::MatrixXd &projection_quantities)=0
Set projected quantities of the stored mesh.
virtual bool execute()=0
Execute the remeshing.
Eigen::MatrixXd m_obstacle_quantities
Collision obstacles' extra quantities.
Definition Remesher.hpp:219
const double starting_energy
Starting energy.
Definition Remesher.hpp:223
virtual std::vector< int > boundary_nodes(const Eigen::VectorXi &vertex_to_basis) const =0
Get the boundary nodes of the stored mesh.
const Obstacle & obstacle() const
Get a reference to the collision obstacles.
Definition Remesher.hpp:133
virtual Eigen::MatrixXd positions() const =0
Exports displacements of the stored mesh.
virtual Eigen::MatrixXd rest_positions() const =0
Exports rest positions of the stored mesh.
std::variant< EdgeMap< T >, FaceMap< T > > BoundaryMap
Definition Remesher.hpp:44
virtual Eigen::MatrixXi boundary_edges() const =0
Exports boundary edges of the stored mesh.
GlobalProjectionCache global_projection_cache
Definition Remesher.hpp:212
static double total_time
Definition Remesher.hpp:232
virtual void set_fixed(const std::vector< bool > &fixed)=0
Set if a vertex is fixed.
void project_quantities()
Update the mesh positions and other projection quantities.
Definition Remesher.cpp:94
const Eigen::MatrixXd & obstacle_quantities() const
Get a reference to the collision obstacles' extra quantities.
Definition Remesher.hpp:137
static Eigen::MatrixXd combine_time_integrator_quantities(const std::shared_ptr< time_integrator::ImplicitTimeIntegrator > &time_integrator)
Combine the quantities of a time integrator into a single matrix (one column per quantity)
Definition Remesher.cpp:377
void write_mesh(const std::string &path) const
Writes a VTU mesh file.
Definition Remesher.cpp:316
virtual bool is_volume() const
Is the mesh a volumetric mesh.
Definition Remesher.hpp:104
virtual Eigen::MatrixXi boundary_faces() const =0
Exports boundary faces of the stored mesh.
void cache_before()
Cache quantities before applying an operation.
Definition Remesher.cpp:87
virtual std::vector< int > body_ids() const =0
Exports body ids of the stored mesh.
virtual Eigen::MatrixXd displacements() const =0
Exports positions of the stored mesh.
virtual Eigen::MatrixXi edges() const =0
Exports edges of the stored mesh.
virtual Eigen::MatrixXi elements() const =0
Exports elements of the stored mesh.
const State & state
Reference to the simulation state.
Definition Remesher.hpp:193
std::unordered_map< std::array< size_t, 3 >, T, polyfem::utils::HashUnorderedArray< size_t, 3 >, polyfem::utils::EqualUnorderedArray< size_t, 3 > > FaceMap
Map from a (sorted) edge to an integer (ID)
Definition Remesher.hpp:37
static void log_timings()
Definition Remesher.cpp:416
virtual BoundaryMap< int > boundary_ids() const =0
Exports boundary ids of the stored mesh.
virtual void set_positions(const Eigen::MatrixXd &positions)=0
Set deformed positions of the stored mesh.
const json args
Copy of remesh args.
Definition Remesher.hpp:215
virtual void set_boundary_ids(const BoundaryMap< int > &boundary_to_id)=0
Set the boundary IDs of all edges.
void init_assembler(const std::vector< int > &body_ids) const
Create an assembler object.
static size_t total_ndofs
Definition Remesher.hpp:234
virtual void set_rest_positions(const Eigen::MatrixXd &positions)=0
Set rest positions of the stored mesh.
static void split_time_integrator_quantities(const Eigen::MatrixXd &quantities, const int dim, Eigen::MatrixXd &x_prevs, Eigen::MatrixXd &v_prevs, Eigen::MatrixXd &a_prevs)
Split the quantities of a time integrator into separate vectors.
Definition Remesher.cpp:398
static std::unordered_map< std::string, utils::Timing > timings
Timings for the remeshing operations.
Definition Remesher.hpp:231
std::unordered_map< std::array< size_t, 4 >, T, polyfem::utils::HashUnorderedArray< size_t, 4 >, polyfem::utils::EqualUnorderedArray< size_t, 4 > > TetMap
Definition Remesher.hpp:42
virtual int dim() const =0
Dimension of the mesh.
static size_t num_solves
Definition Remesher.hpp:233
virtual Eigen::MatrixXd projection_quantities() const =0
Exports projected quantities of the stored mesh.
virtual ~Remesher()=default
virtual void init(const Eigen::MatrixXd &rest_positions, const Eigen::MatrixXd &positions, const Eigen::MatrixXi &elements, const Eigen::MatrixXd &projection_quantities, const BoundaryMap< int > &boundary_to_id, const std::vector< int > &body_ids, const EdgeMap< double > &elastic_energy, const EdgeMap< double > &contact_energy)
Initialize the mesh.
Definition Remesher.cpp:35
virtual int n_quantities() const =0
Number of projection quantities (not including the position)
Implicit time integrator of a second order ODE (equivently a system of coupled first order ODEs).
nlohmann::json json
Definition Common.hpp:9
Eigen::MatrixXi elements
Elements before an operation.
Definition Remesher.hpp:207
Eigen::MatrixXd rest_positions
Rest positions of the mesh before an operation.
Definition Remesher.hpp:205
Eigen::MatrixXd projection_quantities
dim rows per vertex and 1 column per quantity
Definition Remesher.hpp:209
Hash function for an array where the order does not matter.
Definition HashUtils.hpp:35