46 #ifndef Shards_CellTopology_hpp
47 #define Shards_CellTopology_hpp
49 #ifdef HAVE_SHARDS_DEBUG
50 #define SHARDS_REQUIRE( S ) S
52 #define SHARDS_REQUIRE( S )
57 #include <Shards_CellTopologyData.h>
58 #include <Shards_BasicTopologies.hpp>
87 inline std::string ECellTypeToString(ECellType cellType) {
88 std::string retString;
90 case ALL_CELLS: retString =
"All";
break;
91 case STANDARD_CELL: retString =
"Standard";
break;
92 case NONSTANDARD_CELL: retString =
"Nonstandard";
break;
93 default: retString =
"Invalid Cell";
108 inline std::string ETopologyTypeToString(ETopologyType topologyType) {
109 std::string retString;
110 switch(topologyType){
111 case ALL_TOPOLOGIES: retString =
"All";
break;
112 case BASE_TOPOLOGY: retString =
"Base";
break;
113 case EXTENDED_TOPOLOGY: retString =
"Extended";
break;
114 default: retString =
"Invalid Topology";
129 const unsigned cellDim = 4,
130 const ECellType cellType = ALL_CELLS,
131 const ETopologyType topologyType = ALL_TOPOLOGIES);
173 void requireCell()
const ;
180 void requireDimension(
const unsigned subcellDim )
const ;
188 void requireSubcell(
const unsigned subcellDim ,
189 const unsigned subcellOrd )
const ;
198 void requireNodeMap(
const unsigned subcellDim ,
199 const unsigned subcellOrd ,
200 const unsigned nodeOrd )
const ;
202 void requireNodePermutation(
const unsigned permutationOrd ,
203 const unsigned nodeOrd )
const ;
218 SHARDS_REQUIRE( requireCell() );
230 SHARDS_REQUIRE( requireCell() );
242 SHARDS_REQUIRE( requireCell() );
255 SHARDS_REQUIRE( requireCell() );
256 return m_cell->
name ;
265 SHARDS_REQUIRE( requireCell() );
273 SHARDS_REQUIRE( requireCell() );
281 SHARDS_REQUIRE( requireCell() );
289 SHARDS_REQUIRE( requireCell() );
296 SHARDS_REQUIRE( requireCell() );
304 SHARDS_REQUIRE( requireCell() );
311 {
return m_cell != 0 ; }
322 SHARDS_REQUIRE( requireCell() );
323 return m_cell->
base ;
333 const unsigned subcell_ord )
const
335 SHARDS_REQUIRE( requireCell() );
336 SHARDS_REQUIRE( requireDimension(subcell_dim) );
337 SHARDS_REQUIRE( requireSubcell(subcell_dim,subcell_ord) );
348 const unsigned subcell_ord )
const
358 unsigned getKey(
const unsigned subcell_dim ,
359 const unsigned subcell_ord )
const
370 const char *
getName(
const unsigned subcell_dim,
371 const unsigned subcell_ord)
const
382 const unsigned subcell_ord )
const
393 const unsigned subcell_ord )
const
404 const unsigned subcell_ord )
const
415 const unsigned subcell_ord )
const
426 SHARDS_REQUIRE( requireCell() );
427 SHARDS_REQUIRE( requireDimension(subcell_dim) );
438 SHARDS_REQUIRE( requireCell() );
439 SHARDS_REQUIRE( requireDimension(subcell_dim) );
451 const unsigned subcell_ord ,
452 const unsigned subcell_node_ord )
const
454 SHARDS_REQUIRE( requireCell() );
455 SHARDS_REQUIRE( requireDimension(subcell_dim) );
456 SHARDS_REQUIRE( requireSubcell(subcell_dim,subcell_ord) );
457 SHARDS_REQUIRE( requireNodeMap(subcell_dim,subcell_ord,subcell_node_ord));
458 return m_cell->
subcell[subcell_dim][subcell_ord].
node[subcell_node_ord];
465 SHARDS_REQUIRE(requireCell());
474 const unsigned node_ord )
const
476 SHARDS_REQUIRE(requireCell());
477 SHARDS_REQUIRE(requireNodePermutation(permutation_ord,node_ord));
478 return m_cell->
permutation[permutation_ord].node[node_ord];
487 SHARDS_REQUIRE(requireCell());
488 SHARDS_REQUIRE(requireNodePermutation(permutation_ord,0));
489 return m_cell->
permutation[permutation_ord].polarity;
497 const unsigned node_ord )
const
499 SHARDS_REQUIRE(requireCell());
500 SHARDS_REQUIRE(requireNodePermutation(permutation_ord,node_ord));
501 return m_cell->permutation_inverse[permutation_ord].node[node_ord];
533 const unsigned nodeCount);
546 const unsigned vertex_count,
547 const unsigned node_count,
548 const std::vector< const CellTopologyData * > & edges ,
549 const std::vector< unsigned > & edge_node_map ,
565 const unsigned vertex_count,
566 const unsigned node_count,
567 const std::vector< const CellTopologyData * > & edges ,
568 const std::vector< unsigned > & edge_node_map ,
569 const std::vector< const CellTopologyData * > & faces ,
570 const std::vector< unsigned > & face_node_map ,
597 template<
typename id_type >
599 const id_type *
const expected_node ,
600 const id_type *
const actual_node )
605 for ( ; p < np ; ++p ) {
606 const unsigned *
const perm_node = top.
permutation[p].node ;
608 for ( ; j < nv && actual_node[j] == expected_node[ perm_node[j] ] ; ++j );
609 if ( nv == j ) break ;
611 if ( np == p ) p = -1 ;
615 template<
typename id_type >
616 int findPermutation(
const CellTopology & top ,
617 const id_type *
const expected_node ,
618 const id_type *
const actual_node )
620 return findPermutation( * top.getCellTopologyData() , expected_node , actual_node );
634 const unsigned face_count ,
635 const unsigned edge_count ,
636 const unsigned vertex_count ,
637 const unsigned node_count );
650 const unsigned face_count ,
651 const unsigned edge_count ,
652 const unsigned vertex_count ,
653 const unsigned node_count )
655 const bool bad = ( dimension >> 3 ) ||
656 ( face_count >> 6 ) ||
657 ( edge_count >> 6 ) ||
658 ( vertex_count >> 6 ) ||
659 ( node_count >> 10 );
669 const unsigned key = ( dimension << 28 ) |
670 ( face_count << 22 ) |
671 ( edge_count << 16 ) |
672 ( vertex_count << 10 ) |
679 bool operator==(
const CellTopology &left,
const CellTopology &right)
681 return left.getCellTopologyData() == right.getCellTopologyData();
685 bool operator<(
const CellTopology &left,
const CellTopology &right)
687 return left.getCellTopologyData() < right.getCellTopologyData();
693 bool operator!=(
const CellTopology &left,
const CellTopology &right) {
694 return !(left == right);
702 #undef SHARDS_REQUIRE
Provide input checked access (in debug mode) to cell topology data and a procedure to create custom c...
const CellTopologyData * getCellTopologyData(const unsigned subcell_dim, const unsigned subcell_ord) const
Raw cell topology data for a subcell of the given dimension and ordinal.
unsigned getNodeCount(const unsigned subcell_dim, const unsigned subcell_ord) const
Node count of a subcell of the given dimension and ordinal.
unsigned getSideCount() const
Side boundary subcell count of this cell topology.
bool isValid() const
This cell's raw topology data.
const char * getBaseName() const
Unique name for this cell's base topology.
const CellTopologyData * getBaseCellTopologyData() const
This cell's base cell topology's raw topology data.
const CellTopologyData * getBaseCellTopologyData(const unsigned subcell_dim, const unsigned subcell_ord) const
Raw cell topology data for the base topology of a subcell of the given dimension and ordinal.
unsigned getBaseKey() const
Unique key for this cell's base topology; under certain subcell uniformity conditions.
unsigned getSideCount(const unsigned subcell_dim, const unsigned subcell_ord) const
Side count of a subcell of the given dimension and ordinal.
unsigned getSubcellCount(const unsigned subcell_dim) const
Subcell count of subcells of the given dimension.
unsigned getEdgeCount() const
Edge boundary subcell count of this cell topology.
unsigned getNodePermutationCount() const
Number of node permutations defined for this cell.
CellTopology(const std::string &name, const unsigned vertex_count, const unsigned node_count, const std::vector< const CellTopologyData * > &edges, const std::vector< unsigned > &edge_node_map, const CellTopologyData *base=NULL)
Construct custom 2-cell (polygon) from a list of edges. The default base topology is the specified cu...
~CellTopology()
Destructor.
CellTopology(const CellTopology &right)
Copy constructor.
unsigned getNodePermutationPolarity(const unsigned permutation_ord) const
Permutation of a cell's node ordinals.
unsigned getNodeCount() const
Node count of this cell topology.
unsigned getNodeMap(const unsigned subcell_dim, const unsigned subcell_ord, const unsigned subcell_node_ord) const
Mapping from a subcell's node ordinal to a node ordinal of this parent cell topology.
CellTopology & operator=(const CellTopology &right)
Assignment operator *this = right.
CellTopology(const std::string &name, const unsigned vertex_count, const unsigned node_count, const std::vector< const CellTopologyData * > &edges, const std::vector< unsigned > &edge_node_map, const std::vector< const CellTopologyData * > &faces, const std::vector< unsigned > &face_node_map, const CellTopologyData *base=NULL)
Construct custom 3-cell (polyhedron) from a list of edges and sides. The default base topology is the...
unsigned getKey(const unsigned subcell_dim, const unsigned subcell_ord) const
Key of a subcell of the given dimension and ordinal.
CellTopology()
Default constructor initializes to NULL.
unsigned getVertexCount(const unsigned subcell_dim, const unsigned subcell_ord) const
Vertex count of a subcell of the given dimension and ordinal.
CellTopology(const CellTopologyData *cell)
Wrapper for safe access to a raw cell topology data.
CellTopology(const std::string &name, const unsigned nodeCount)
Constructs custom 1-cell (line) with base topology Line<>. Example use: the statement.
bool getSubcellHomogeneity(const unsigned subcell_dim) const
Query if all subcells of the given dimension have the same cell topology.
const CellTopologyData * getCellTopologyData() const
This cell's raw topology data.
unsigned getNodePermutationInverse(const unsigned permutation_ord, const unsigned node_ord) const
Inverse permutation of a cell's node ordinals.
unsigned getKey() const
Unique key for this cell topology; under certain subcell uniformity conditions.
unsigned getFaceCount() const
Face boundary subcell count of this cell topology.
unsigned getDimension() const
Dimension of this cell topology.
unsigned getVertexCount() const
Vertex count of this cell topology.
const char * getName(const unsigned subcell_dim, const unsigned subcell_ord) const
Name of a subcell of the given dimension and ordinal.
unsigned getEdgeCount(const unsigned subcell_dim, const unsigned subcell_ord) const
Edge count of a subcell of the given dimension and ordinal.
unsigned getNodePermutation(const unsigned permutation_ord, const unsigned node_ord) const
Permutation of a cell's node ordinals.
const char * getName() const
Unique name for this cell topology;.
unsigned cellTopologyKey(const unsigned dimension, const unsigned face_count, const unsigned edge_count, const unsigned vertex_count, const unsigned node_count)
Generate integer key from topological dimensions.
std::ostream & operator<<(std::ostream &, const CellTopology &)
Overloaded << operator for CellTopologyData objects.
void badCellTopologyKey(const unsigned dimension, const unsigned face_count, const unsigned edge_count, const unsigned vertex_count, const unsigned node_count)
Generates detailed message if one or more input parameters are out of their admissible bounds.
void getTopologies(std::vector< shards::CellTopology > &topologies, const unsigned cellDim=4, const ECellType cellType=ALL_CELLS, const ETopologyType topologyType=ALL_TOPOLOGIES)
Returns an std::vector with all cell topologies that meet the specified selection flags.
int isPredefinedCell(const CellTopology &cell)
Checks if the cell topology is predefined in shards.
const struct CellTopologyData * topology
Subcell topology.
const unsigned * node
Subcell indexing of with respect to parent cell.
A simple 'C' struct of cell topology attributes.
const char * name
Intuitive name for this topology.
unsigned node_count
Number of nodes (a.k.a. subcells).
unsigned side_count
Number of sides (a.k.a. boundary subcells).
const struct CellTopologyData * base
Base, a.k.a. not-extended, version of this topology where vertex_count == node_count.
unsigned key
Unique key for this topology.
unsigned edge_count
Number of edges (a.k.a. boundary subcells).
unsigned vertex_count
Number of vertices.
unsigned permutation_count
Number of defined permutations.
unsigned subcell_homogeneity[4]
Flag if the subcells of a given dimension are homogeneous.
const struct CellTopologyData_Subcell * subcell[4]
Array of subcells of each dimension.
const struct CellTopologyData_Permutation * permutation
Array of node permutations.
unsigned dimension
Topological dimension.
unsigned subcell_count[4]
Number of subcells of each dimension.