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 std::unique_ptr<Elem>
side_ptr (
const unsigned int i)
const;
185 virtual void side_ptr (std::unique_ptr<Elem> & elem,
186 const unsigned int i)
override final;
191 virtual std::unique_ptr<Elem>
build_side_ptr (
const unsigned int i)
override;
197 const unsigned int i)
override;
205 virtual std::unique_ptr<Elem>
build_edge_ptr (
const unsigned int i)
override final;
212 virtual void build_edge_ptr (std::unique_ptr<Elem> & edge,
const unsigned int i)
override final;
223 virtual std::vector<unsigned int>
sides_on_edge(
const unsigned int e)
const override final;
229 const unsigned int s)
const override final;
238 virtual void permute(
unsigned int libmesh_dbg_var(perm_num))
override final
239 { libmesh_assert_equal_to(perm_num, 0); }
241 virtual bool is_flipped() const override final;
307 std::tuple<unsigned int, Real, Real, Real>
323 std::vector<std::shared_ptr<Polygon>>
side_clones()
const;
330 unsigned int min_node,
331 unsigned int max_node)
const;
358 std::vector<std::tuple<std::shared_ptr<Polygon>,
The BoundaryInfo class contains information relevant to boundary conditions including storing faces,...
The Cell is an abstract element type that lives in three dimensions.
This is the base class from which all geometric element types are derived.
virtual dof_id_type key(const unsigned int s) const =0
virtual std::unique_ptr< Elem > build_side_ptr(const unsigned int i)=0
A Point defines a location in LIBMESH_DIM dimensional Real space.
The Polyhedron is an element in 3D with an arbitrary number of polygonal faces.
virtual std::array< Point, 4 > master_subelement(unsigned int i) const
virtual unsigned int n_edges() const override final
virtual Point master_point(const unsigned int i) const override
virtual std::unique_ptr< Elem > build_side_ptr(const unsigned int i) override
Copies the Polygon side coincident with side i.
virtual bool is_child_on_side(const unsigned int c, const unsigned int s) const override
virtual std::vector< unsigned int > edges_adjacent_to_node(const unsigned int n) const override
virtual std::vector< unsigned int > sides_on_edge(const unsigned int e) const override final
virtual std::array< int, 4 > subelement(unsigned int i) const
virtual bool runtime_topology() const override
Polyhedron & operator=(const Polyhedron &)=delete
virtual std::unique_ptr< Elem > side_ptr(const unsigned int i) override final
virtual bool is_edge_on_side(const unsigned int e, const unsigned int s) const override final
virtual unsigned int n_faces() const override final
virtual void retriangulate()=0
Create a triangulation (tetrahedralization) from the current node locations and face triangulations.
virtual unsigned int opposite_side(const unsigned int s) const override final
Throws an error.
virtual dof_id_type low_order_key(const unsigned int s) const override
virtual unsigned int n_children() const override final
virtual unsigned int local_side_node(unsigned int side, unsigned int side_node) const override
virtual bool is_flipped() const override final
virtual unsigned int n_nodes() const override
unsigned int n_subelements() const
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.
static const int num_children
std::vector< Elem * > _elemlinks_data
Data for links to parent/neighbor/interior_parent elements.
virtual unsigned int n_sides() const override final
virtual void permute(unsigned int libmesh_dbg_var(perm_num)) override final
virtual dof_id_type key() const override
Polyhedron(const Polyhedron &)=delete
Polyhedron(Polyhedron &&)=delete
virtual bool on_reference_element(const Point &p, const Real eps=TOLERANCE) const override final
std::tuple< unsigned int, Real, Real, Real > subelement_coordinates(const Point &p, Real tol=TOLERANCE *TOLERANCE) const
std::vector< std::shared_ptr< Polygon > > side_clones() const
virtual void flip(BoundaryInfo *) override final
A flip is one of those general non-identity permutations we can't handle.
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...
std::vector< Node * > _nodelinks_data
Data for links to nodes.
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 ...
virtual ~Polyhedron()=default
virtual std::pair< Real, Real > qual_bounds(const ElemQuality q) const override
std::vector< std::tuple< std::shared_ptr< Polygon >, bool, std::vector< unsigned int > > > _sidelinks_data
Data for links to sides.
std::vector< std::array< int, 4 > > _triangulation
Data for a triangulation (tetrahedralization) of the polyhedron.
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...
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 ...
The libMesh namespace provides an interface to certain functionality in the library.
ElemQuality
Defines an enum for element quality metrics.
static constexpr Real TOLERANCE
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real