PolyFEM
Loading...
Searching...
No Matches
polyfem::mesh::SizingFieldRemesher< WMTKMesh > Class Template Reference

#include <SizingFieldRemesher.hpp>

Inheritance diagram for polyfem::mesh::SizingFieldRemesher< WMTKMesh >:
[legend]
Collaboration diagram for polyfem::mesh::SizingFieldRemesher< WMTKMesh >:
[legend]

Public Types

using Tuple = typename Super::Tuple
 
using Operations = typename Super::Operations
 
using VectorNd = typename Super::VectorNd
 
using MatrixNd = Eigen::Matrix< double, Super::DIM, Super::DIM >
 
using SparseSizingField = std::unordered_map< size_t, MatrixNd >
 
- Public Types inherited from polyfem::mesh::WildRemesher< WMTKMesh >
using VectorNd = Eigen::Matrix< double, DIM, 1 >
 
using Tuple = typename WMTKMesh::Tuple
 
- Public Types inherited from polyfem::mesh::Remesher
template<typename T >
using EdgeMap = std::unordered_map< std::array< size_t, 2 >, T, polyfem::utils::HashUnorderedArray< size_t, 2 >, polyfem::utils::EqualUnorderedArray< size_t, 2 > >
 Map from a (sorted) edge to an integer (ID)
 
template<typename T >
using FaceMap = std::unordered_map< std::array< size_t, 3 >, T, polyfem::utils::HashUnorderedArray< size_t, 3 >, polyfem::utils::EqualUnorderedArray< size_t, 3 > >
 Map from a (sorted) edge to an integer (ID)
 
template<typename T >
using TetMap = std::unordered_map< std::array< size_t, 4 >, T, polyfem::utils::HashUnorderedArray< size_t, 4 >, polyfem::utils::EqualUnorderedArray< size_t, 4 > >
 
template<typename T >
using BoundaryMap = std::variant< EdgeMap< T >, FaceMap< T > >
 

Public Member Functions

 SizingFieldRemesher (const State &state, const Eigen::MatrixXd &obstacle_displacements, const Eigen::MatrixXd &obstacle_vals, const double current_time, const double starting_energy)
 
virtual ~SizingFieldRemesher ()
 
void split_edges () override
 
bool split_edge_before (const Tuple &t) override
 
void collapse_edges () override
 
bool collapse_edge_after (const Tuple &t) override
 
SparseSizingField compute_contact_sizing_field () const
 
SparseSizingField smooth_contact_sizing_field (const SparseSizingField &sizing_field) const
 
SparseSizingField compute_elasticity_sizing_field () const
 
std::unordered_map< size_t, double > compute_edge_sizings () const
 
- Public Member Functions inherited from polyfem::mesh::WildRemesher< WMTKMesh >
 WildRemesher (const State &state, const Eigen::MatrixXd &obstacle_displacements, const Eigen::MatrixXd &obstacle_vals, const double current_time, const double starting_energy)
 Construct a new WildRemesher object.
 
virtual ~WildRemesher ()=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) override
 Initialize the mesh.
 
bool execute () override
 Execute the remeshing.
 
virtual void smooth_vertices ()
 
virtual void swap_edges ()
 
int dim () const override
 Dimension of the mesh.
 
Eigen::MatrixXd rest_positions () const override
 Exports rest positions of the stored mesh.
 
Eigen::MatrixXd displacements () const override
 Exports positions of the stored mesh.
 
Eigen::MatrixXd positions () const override
 Exports displacements of the stored mesh.
 
Eigen::MatrixXi edges () const override
 Exports edges of the stored mesh.
 
Eigen::MatrixXi elements () const override
 Exports elements of the stored mesh.
 
Eigen::MatrixXi boundary_edges () const override
 Exports boundary edges of the stored mesh.
 
Eigen::MatrixXi boundary_faces () const override
 Exports boundary faces of the stored mesh.
 
Eigen::MatrixXd projection_quantities () const override
 Exports projected quantities of the stored mesh.
 
BoundaryMap< int > boundary_ids () const override
 Exports boundary ids of the stored mesh.
 
std::vector< int > body_ids () const override
 Exports body ids of the stored mesh.
 
std::vector< int > boundary_nodes (const Eigen::VectorXi &vertex_to_basis) const override
 Get the boundary nodes of the stored mesh.
 
int n_quantities () const override
 Number of projection quantities (not including the position)
 
std::vector< Tupleget_facets () const
 Get a vector of all facets (edges or triangles)
 
std::vector< Tupleget_elements () const
 Get a vector of all elements (triangles or tetrahedra)
 
void set_rest_positions (const Eigen::MatrixXd &positions) override
 Set rest positions of the stored mesh.
 
void set_positions (const Eigen::MatrixXd &positions) override
 Set deformed positions of the stored mesh.
 
void set_projection_quantities (const Eigen::MatrixXd &projection_quantities) override
 Set projected quantities of the stored mesh.
 
void set_fixed (const std::vector< bool > &fixed) override
 Set if a vertex is fixed.
 
void set_boundary_ids (const BoundaryMap< int > &boundary_to_id) override
 Set the boundary IDs of all edges.
 
void set_body_ids (const std::vector< int > &body_ids) override
 Set the body IDs of all elements.
 
double rest_edge_length (const Tuple &e) const
 Compute the length of an edge.
 
double deformed_edge_length (const Tuple &e) const
 
VectorNd rest_edge_center (const Tuple &e) const
 Compute the center of the edge.
 
VectorNd deformed_edge_center (const Tuple &e) const
 
Eigen::VectorXd edge_adjacent_element_volumes (const Tuple &e) const
 
double element_volume (const Tuple &e) const
 Compute the volume (area) of an tetrahedron (triangle) element.
 
bool is_boundary_vertex (const Tuple &v) const
 Is the given vertex tuple on the boundary of the mesh?
 
bool is_body_boundary_vertex (const Tuple &v) const
 Is the given vertex tuple on the boundary of a body?
 
bool is_boundary_edge (const Tuple &e) const
 Is the given edge tuple on the boundary of the mesh?
 
bool is_body_boundary_edge (const Tuple &e) const
 Is the given edge tuple on the boundary of a body?
 
bool is_boundary_facet (const Tuple &t) const
 Is the given tuple on the boundary of the mesh?
 
bool is_boundary_op () const
 Is the currently cached operation a boundary operation?
 
std::vector< Tupleboundary_facets (std::vector< int > *boundary_ids=nullptr) const
 Get the boundary facets of the mesh.
 
std::array< Tuple, DIMfacet_vertices (const Tuple &t) const
 Get the vertex tuples of a facet.
 
std::array< size_t, DIMfacet_vids (const Tuple &t) const
 Get the vertex ids of a facet.
 
std::array< Tuple, VERTICES_PER_ELEMENTelement_vertices (const Tuple &t) const
 Get the vertex tuples of an element.
 
std::array< size_t, VERTICES_PER_ELEMENTelement_vids (const Tuple &t) const
 Get the vertex ids of an element.
 
void element_aabb (const Tuple &t, polyfem::VectorNd &el_min, polyfem::VectorNd &el_max) const
 Get a AABB for an element.
 
std::array< size_t, VERTICES_PER_ELEMENTorient_preserve_element_reorder (const std::array< size_t, VERTICES_PER_ELEMENT > &conn, const size_t v0) const
 Reorder the element vertices so that the first vertex is v0.
 
std::vector< Tupleget_one_ring_elements_for_vertex (const Tuple &t) const
 Get the one ring of elements around a vertex.
 
std::vector< Tupleget_one_ring_boundary_edges_for_vertex (const Tuple &v) const
 
std::array< Tuple, 2 > get_boundary_faces_for_edge (const Tuple &e) const
 
std::vector< Tupleget_one_ring_boundary_faces_for_vertex (const Tuple &v) const
 
std::vector< Tupleget_edges_for_elements (const std::vector< Tuple > &elements) const
 
size_t facet_id (const Tuple &t) const
 Get the id of a facet (edge for triangle, triangle for tetrahedra)
 
size_t element_id (const Tuple &t) const
 Get the id of an element (triangle or tetrahedra)
 
Tuple tuple_from_element (size_t elem_id) const
 Get a tuple of an element.
 
Tuple tuple_from_facet (size_t elem_id, int local_facet_id) const
 Get a tuple of an element with a local facet.
 
std::vector< Tupleget_incident_elements_for_edge (const Tuple &t) const
 Get the incident elements for an edge.
 
void extend_local_patch (std::vector< Tuple > &patch) const
 Extend the local patch by including neighboring elements.
 
Tuple opposite_vertex_on_face (const Tuple &e) const
 Get the opposite vertex on a face.
 
CollapseEdgeTo collapse_boundary_edge_to (const Tuple &e) const
 Determine where to collapse an edge to.
 
void write_edge_ranks_mesh (const EdgeMap< typename EdgeAttributes::EnergyRank > &elastic_ranks, const EdgeMap< typename EdgeAttributes::EnergyRank > &contact_ranks) const
 
EdgeAttributesedge_attr (const size_t e_id)
 Get a reference to an edge's attributes.
 
const EdgeAttributesedge_attr (const size_t e_id) const
 Get a const reference to an edge's attributes.
 
- Public Member Functions inherited from polyfem::mesh::Remesher
 Remesher (const State &state, const Eigen::MatrixXd &obstacle_displacements, const Eigen::MatrixXd &obstacle_quantities, const double current_time, const double starting_energy)
 Construct a new Remesher object.
 
virtual ~Remesher ()=default
 
virtual bool is_volume () const
 Is the mesh a volumetric mesh.
 
const Obstacleobstacle () const
 Get a reference to the collision obstacles.
 
const Eigen::MatrixXd & obstacle_displacements () const
 Get a reference to the collision obstacles' displacements.
 
const Eigen::MatrixXd & obstacle_quantities () const
 Get a reference to the collision obstacles' extra quantities.
 
void write_mesh (const std::string &path) const
 Writes a VTU mesh file.
 
void init_assembler (const std::vector< int > &body_ids) const
 Create an assembler object.
 

Static Public Member Functions

static SparseSizingField combine_sizing_fields (const SparseSizingField &field1, const SparseSizingField &field2)
 
- Static Public Member Functions inherited from polyfem::mesh::Remesher
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)
 
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.
 
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)
 
static void log_timings ()
 

Public Attributes

wmtk::AttributeCollection< VertexAttributesvertex_attrs
 
- Public Attributes inherited from polyfem::mesh::WildRemesher< WMTKMesh >
wmtk::AttributeCollection< VertexAttributesvertex_attrs
 
wmtk::AttributeCollection< BoundaryAttributesboundary_attrs
 
wmtk::AttributeCollection< ElementAttributeselement_attrs
 
- Public Attributes inherited from polyfem::mesh::Remesher
const Statestate
 Reference to the simulation state.
 
int max_op_attempts = 1
 

Protected Attributes

wmtk::ExecutePass< WildRemesher, EXECUTION_POLICYexecutor
 
- Protected Attributes inherited from polyfem::mesh::WildRemesher< WMTKMesh >
wmtk::ExecutePass< WildRemesher, EXECUTION_POLICYexecutor
 
int m_n_quantities
 
double total_volume
 
std::conditional< std::is_same< WMTKMesh, wmtk::TriMesh >::value, std::shared_ptr< TriOperationCache >, std::shared_ptr< TetOperationCache > >::type op_cache
 
- Protected Attributes inherited from polyfem::mesh::Remesher
GlobalProjectionCache global_projection_cache
 
const json args
 Copy of remesh args.
 
const Eigen::MatrixXd m_obstacle_displacements
 Collision obstacles' displacements.
 
Eigen::MatrixXd m_obstacle_quantities
 Collision obstacles' extra quantities.
 
const double current_time
 Current time.
 
const double starting_energy
 Starting energy.
 

Private Types

using Super = WildRemesher< WMTKMesh >
 
using This = SizingFieldRemesher< WMTKMesh >
 

Private Member Functions

template<typename Candidates >
SparseSizingField compute_contact_sizing_field_from_candidates (const Candidates &candidates, const ipc::CollisionMesh &collision_mesh, const Eigen::MatrixXd &V, const double dhat) const
 

Additional Inherited Members

- Static Public Attributes inherited from polyfem::mesh::WildRemesher< WMTKMesh >
static constexpr int DIM
 
static constexpr int VERTICES_PER_ELEMENT
 
static constexpr int EDGES_PER_ELEMENT
 
static constexpr int FACETS_PER_ELEMENT
 
static constexpr wmtk::ExecutionPolicy EXECUTION_POLICY = wmtk::ExecutionPolicy::kSeq
 Current execuation policy (sequencial or parallel)
 
- Static Public Attributes inherited from polyfem::mesh::Remesher
static std::unordered_map< std::string, utils::Timingtimings
 Timings for the remeshing operations.
 
static double total_time = 0
 
static size_t num_solves = 0
 
static size_t total_ndofs = 0
 
- Protected Types inherited from polyfem::mesh::WildRemesher< WMTKMesh >
using Operations = std::vector< std::pair< std::string, Tuple > >
 
- Protected Member Functions inherited from polyfem::mesh::WildRemesher< WMTKMesh >
void init_attributes_and_connectivity (const size_t num_vertices, const Eigen::MatrixXi &elements) override
 Create an internal mesh representation and associate attributes.
 
virtual bool split_edge_after (const Tuple &t) override
 
virtual bool collapse_edge_before (const Tuple &t) override
 
virtual bool swap_edge_before (const Tuple &t) override
 
virtual bool swap_edge_after (const Tuple &t) override
 
virtual bool smooth_before (const Tuple &t) override
 
virtual bool smooth_after (const Tuple &t) override
 
bool invariants (const std::vector< Tuple > &new_tris) override
 Check if invariants are satisfied.
 
bool is_rest_inverted (const Tuple &loc) const
 Check if a triangle's rest shape is inverted.
 
bool is_inverted (const Tuple &loc) const
 Check if a triangle's rest and deformed shapes are inverted.
 
virtual Operations renew_neighbor_tuples (const std::string &op, const std::vector< Tuple > &tris) const
 
void cache_split_edge (const Tuple &e)
 Cache the split edge operation.
 
void cache_collapse_edge (const Tuple &e, const CollapseEdgeTo collapse_to)
 Cache the edge collapse operation.
 
void cache_swap_edge (const Tuple &e)
 Cache the edge swap operation.
 
void map_edge_split_edge_attributes (const Tuple &t)
 
void map_edge_split_boundary_attributes (const Tuple &t)
 
void map_edge_split_element_attributes (const Tuple &t)
 
void map_edge_collapse_vertex_attributes (const Tuple &t)
 
void map_edge_collapse_boundary_attributes (const Tuple &t)
 
void map_edge_collapse_edge_attributes (const Tuple &t)
 
void map_edge_swap_edge_attributes (const Tuple &t)
 
void map_edge_swap_element_attributes (const Tuple &t)
 
- Protected Member Functions inherited from polyfem::mesh::Remesher
void project_quantities ()
 Update the mesh positions and other projection quantities.
 
void cache_before ()
 Cache quantities before applying an operation.
 

Detailed Description

template<class WMTKMesh>
class polyfem::mesh::SizingFieldRemesher< WMTKMesh >

Definition at line 8 of file SizingFieldRemesher.hpp.

Member Typedef Documentation

◆ MatrixNd

template<class WMTKMesh >
using polyfem::mesh::SizingFieldRemesher< WMTKMesh >::MatrixNd = Eigen::Matrix<double, Super::DIM, Super::DIM>

Definition at line 24 of file SizingFieldRemesher.hpp.

◆ Operations

template<class WMTKMesh >
using polyfem::mesh::SizingFieldRemesher< WMTKMesh >::Operations = typename Super::Operations

Definition at line 22 of file SizingFieldRemesher.hpp.

◆ SparseSizingField

template<class WMTKMesh >
using polyfem::mesh::SizingFieldRemesher< WMTKMesh >::SparseSizingField = std::unordered_map<size_t, MatrixNd>

Definition at line 46 of file SizingFieldRemesher.hpp.

◆ Super

template<class WMTKMesh >
using polyfem::mesh::SizingFieldRemesher< WMTKMesh >::Super = WildRemesher<WMTKMesh>
private

Definition at line 11 of file SizingFieldRemesher.hpp.

◆ This

template<class WMTKMesh >
using polyfem::mesh::SizingFieldRemesher< WMTKMesh >::This = SizingFieldRemesher<WMTKMesh>
private

Definition at line 12 of file SizingFieldRemesher.hpp.

◆ Tuple

template<class WMTKMesh >
using polyfem::mesh::SizingFieldRemesher< WMTKMesh >::Tuple = typename Super::Tuple

Definition at line 21 of file SizingFieldRemesher.hpp.

◆ VectorNd

template<class WMTKMesh >
using polyfem::mesh::SizingFieldRemesher< WMTKMesh >::VectorNd = typename Super::VectorNd

Definition at line 23 of file SizingFieldRemesher.hpp.

Constructor & Destructor Documentation

◆ SizingFieldRemesher()

template<class WMTKMesh >
polyfem::mesh::SizingFieldRemesher< WMTKMesh >::SizingFieldRemesher ( const State state,
const Eigen::MatrixXd &  obstacle_displacements,
const Eigen::MatrixXd &  obstacle_vals,
const double  current_time,
const double  starting_energy 
)
inline

Definition at line 26 of file SizingFieldRemesher.hpp.

◆ ~SizingFieldRemesher()

template<class WMTKMesh >
virtual polyfem::mesh::SizingFieldRemesher< WMTKMesh >::~SizingFieldRemesher ( )
inlinevirtual

Definition at line 36 of file SizingFieldRemesher.hpp.

Member Function Documentation

◆ collapse_edge_after()

template<class WMTKMesh >
bool polyfem::mesh::SizingFieldRemesher< WMTKMesh >::collapse_edge_after ( const Tuple t)
overridevirtual

Reimplemented from polyfem::mesh::WildRemesher< WMTKMesh >.

Definition at line 73 of file SizingFieldRemesher.cpp.

◆ collapse_edges()

template<class WMTKMesh >
void polyfem::mesh::SizingFieldRemesher< WMTKMesh >::collapse_edges ( )
overridevirtual

Implements polyfem::mesh::WildRemesher< WMTKMesh >.

Definition at line 40 of file SizingFieldRemesher.cpp.

References polyfem::mesh::WildRemesher< WMTKMesh >::rest_edge_length().

Here is the call graph for this function:

◆ combine_sizing_fields()

template<class WMTKMesh >
SizingFieldRemesher< WMTKMesh >::SparseSizingField polyfem::mesh::SizingFieldRemesher< WMTKMesh >::combine_sizing_fields ( const SparseSizingField field1,
const SparseSizingField field2 
)
static

Definition at line 330 of file SizingFieldRemesher.cpp.

◆ compute_contact_sizing_field()

template<class WMTKMesh >
SizingFieldRemesher< WMTKMesh >::SparseSizingField polyfem::mesh::SizingFieldRemesher< WMTKMesh >::compute_contact_sizing_field ( ) const

Definition at line 144 of file SizingFieldRemesher.cpp.

References polyfem::utils::append_rows(), polyfem::F, and V.

Here is the call graph for this function:

◆ compute_contact_sizing_field_from_candidates()

template<typename WMTKMesh >
template<typename Candidates >
SizingFieldRemesher< WMTKMesh >::SparseSizingField polyfem::mesh::SizingFieldRemesher< WMTKMesh >::compute_contact_sizing_field_from_candidates ( const Candidates &  candidates,
const ipc::CollisionMesh &  collision_mesh,
const Eigen::MatrixXd &  V,
const double  dhat 
) const
private

Definition at line 105 of file SizingFieldRemesher.cpp.

References polyfem::F, and V.

◆ compute_edge_sizings()

template<class WMTKMesh >
std::unordered_map< size_t, double > polyfem::mesh::SizingFieldRemesher< WMTKMesh >::compute_edge_sizings ( ) const

Definition at line 217 of file SizingFieldRemesher.cpp.

◆ compute_elasticity_sizing_field()

template<class WMTKMesh >
SizingFieldRemesher< WMTKMesh >::SparseSizingField polyfem::mesh::SizingFieldRemesher< WMTKMesh >::compute_elasticity_sizing_field ( ) const

Definition at line 244 of file SizingFieldRemesher.cpp.

◆ smooth_contact_sizing_field()

template<class WMTKMesh >
SizingFieldRemesher< WMTKMesh >::SparseSizingField polyfem::mesh::SizingFieldRemesher< WMTKMesh >::smooth_contact_sizing_field ( const SparseSizingField sizing_field) const

Definition at line 185 of file SizingFieldRemesher.cpp.

◆ split_edge_before()

template<class WMTKMesh >
bool polyfem::mesh::SizingFieldRemesher< WMTKMesh >::split_edge_before ( const Tuple t)
overridevirtual

Reimplemented from polyfem::mesh::WildRemesher< WMTKMesh >.

Definition at line 60 of file SizingFieldRemesher.cpp.

◆ split_edges()

template<class WMTKMesh >
void polyfem::mesh::SizingFieldRemesher< WMTKMesh >::split_edges ( )
overridevirtual

Implements polyfem::mesh::WildRemesher< WMTKMesh >.

Definition at line 13 of file SizingFieldRemesher.cpp.

References polyfem::logger().

Here is the call graph for this function:

Member Data Documentation

◆ executor

template<class WMTKMesh >
wmtk::ExecutePass<WildRemesher, EXECUTION_POLICY> polyfem::mesh::WildRemesher< WMTKMesh >::executor
protected

Definition at line 413 of file WildRemesher.hpp.

◆ vertex_attrs

template<class WMTKMesh >
wmtk::AttributeCollection<VertexAttributes> polyfem::mesh::WildRemesher< WMTKMesh >::vertex_attrs

Definition at line 408 of file WildRemesher.hpp.


The documentation for this class was generated from the following files: