20 #ifndef LIBMESH_CELL_POLYHEDRON_H 21 #define LIBMESH_CELL_POLYHEDRON_H 25 #include "libmesh/libmesh_common.h" 26 #include "libmesh/cell.h" 51 Polyhedron (
const std::vector<std::shared_ptr<Polygon>> & sides,
116 const unsigned int s)
const override;
122 virtual unsigned int opposite_side(
const unsigned int s)
const override final;
129 const unsigned int s)
const override final;
162 unsigned int side_node)
const override;
170 unsigned int edge_node)
const override;
175 virtual std::unique_ptr<Elem>
side_ptr (
const unsigned int i)
override final;
180 virtual void side_ptr (std::unique_ptr<Elem> & elem,
181 const unsigned int i)
override final;
186 virtual std::unique_ptr<Elem>
build_side_ptr (
const unsigned int i)
override;
192 const unsigned int i)
override;
200 virtual std::unique_ptr<Elem>
build_edge_ptr (
const unsigned int i)
override final;
207 virtual void build_edge_ptr (std::unique_ptr<Elem> & edge,
const unsigned int i)
override final;
218 virtual std::vector<unsigned int>
sides_on_edge(
const unsigned int e)
const override final;
224 const unsigned int s)
const override final;
233 virtual void permute(
unsigned int libmesh_dbg_var(perm_num))
override final 234 { libmesh_assert_equal_to(perm_num, 0); }
236 virtual bool is_flipped() const override final;
302 std::tuple<unsigned int, Real, Real, Real>
318 std::vector<std::shared_ptr<Polygon>>
side_clones()
const;
325 unsigned int min_node,
326 unsigned int max_node)
const;
353 std::vector<std::tuple<std::shared_ptr<Polygon>,
382 #endif // LIBMESH_CELL_POLYHEDRON_H Polyhedron & operator=(const Polyhedron &)=delete
virtual unsigned int n_nodes() const override
std::vector< Elem * > _elemlinks_data
Data for links to parent/neighbor/interior_parent elements.
The Polyhedron is an element in 3D with an arbitrary number of polygonal faces.
virtual bool is_child_on_side(const unsigned int c, const unsigned int s) const override
virtual unsigned int n_permutations() const override
Maybe we have non-identity permutations, but trying to figure out how many is an exercise in applied ...
std::vector< Node * > _nodelinks_data
Data for links to nodes.
virtual unsigned int opposite_side(const unsigned int s) const override final
Throws an error.
virtual std::unique_ptr< Elem > build_side_ptr(const unsigned int i)=0
virtual dof_id_type key() const
virtual unsigned int local_edge_node(unsigned int edge, unsigned int edge_node) const override
Similar to Elem::local_side_node(), but instead of a side id, takes an edge id and a node id on that ...
static constexpr Real TOLERANCE
virtual std::array< Point, 4 > master_subelement(unsigned int i) const
std::vector< std::tuple< std::shared_ptr< Polygon >, bool, std::vector< unsigned int > > > _sidelinks_data
Data for links to sides.
virtual std::pair< Real, Real > qual_bounds(const ElemQuality q) const override
virtual bool on_reference_element(const Point &p, const Real eps=TOLERANCE) const override final
This is the base class from which all geometric element types are derived.
static const int num_children
Polyhedron(const std::vector< std::shared_ptr< Polygon >> &sides, Elem *p)
Arbitrary polyhedral element, takes a vector of shared pointers to sides (which should already be con...
virtual ~Polyhedron()=default
The libMesh namespace provides an interface to certain functionality in the library.
virtual unsigned int n_sides() const override final
virtual std::unique_ptr< Elem > build_edge_ptr(const unsigned int i) override final
std::vector< std::pair< unsigned int, unsigned int > > _edge_lookup
One entry for each polyhedron edge, a pair indicating the side number and the edge-of-side number whi...
bool side_has_edge_nodes(unsigned int side, unsigned int min_node, unsigned int max_node) const
Helper method for finding the non-cached side that shares an edge, by examining the local node ids th...
std::tuple< unsigned int, Real, Real, Real > subelement_coordinates(const Point &p, Real tol=TOLERANCE *TOLERANCE) const
virtual bool is_flipped() const override final
virtual bool is_edge_on_side(const unsigned int e, const unsigned int s) const override final
virtual void retriangulate()=0
Create a triangulation (tetrahedralization) from the current node locations and face triangulations...
unsigned int n_subelements() const
virtual std::array< int, 4 > subelement(unsigned int i) const
virtual dof_id_type low_order_key(const unsigned int s) const override
The Cell is an abstract element type that lives in three dimensions.
virtual void flip(BoundaryInfo *) override final
A flip is one of those general non-identity permutations we can't handle.
The BoundaryInfo class contains information relevant to boundary conditions including storing faces...
virtual unsigned int opposite_node(const unsigned int n, const unsigned int s) const override final
Throws an error - opposite_side(s) is too hard to define in general on polyhedra. ...
virtual std::unique_ptr< Elem > build_side_ptr(const unsigned int i) override
Copies the Polygon side coincident with side i.
ElemQuality
Defines an enum for element quality metrics.
virtual dof_id_type key() const override
virtual void permute(unsigned int libmesh_dbg_var(perm_num)) override final
std::vector< std::shared_ptr< Polygon > > side_clones() const
virtual Point master_point(const unsigned int i) const override
virtual unsigned int n_edges() const override final
virtual unsigned int local_side_node(unsigned int side, unsigned int side_node) const override
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
virtual std::vector< unsigned int > edges_adjacent_to_node(const unsigned int n) const override
virtual std::unique_ptr< Elem > side_ptr(const unsigned int i) override final
std::vector< std::array< int, 4 > > _triangulation
Data for a triangulation (tetrahedralization) of the polyhedron.
virtual std::vector< unsigned int > sides_on_edge(const unsigned int e) const override final
A Point defines a location in LIBMESH_DIM dimensional Real space.
virtual bool runtime_topology() const override
virtual unsigned int n_faces() const override final
virtual unsigned int n_children() const override final