MOAB: Mesh Oriented datABase  (version 5.4.1)
moab::AdjSides< CORNERS >::Side Struct Reference

Public Member Functions

bool skin () const
 Side (const EntityHandle *array, int idx, EntityHandle adj, unsigned short)
 Side (const EntityHandle *array, int idx, EntityHandle adj, unsigned short, const short *indices)
bool operator== (const Side &other) const
template<>
 Side (const EntityHandle *array, int idx, EntityHandle adj, unsigned short)
template<>
 Side (const EntityHandle *array, int idx, EntityHandle adj, unsigned short, const short *indices)
template<>
bool operator== (const Side &other) const

Public Attributes

EntityHandle handles [CORNERS-1]
 side vertices, except for implicit one
EntityHandle adj_elem
 element that this is a side of, or zero

Detailed Description

template<unsigned CORNERS>
struct moab::AdjSides< CORNERS >::Side

This struct is used to for a reduced representation of element "sides" adjacent to a give vertex. As such, it a) does not store the initial vertex that all sides are adjacent to b) orders the remaining vertices in a specific way for fast comparison.

For edge elements, only the opposite vertex is stored. For triangle elements, only the other two vertices are stored, and they are stored with the smaller of those two handles first. For quad elements, only the other three vertices are stored. They are stored such that the vertex opposite the implicit (not stored) vertex is always in slot 1. The other two vertices (in slots 0 and 2) are ordered such that the handle of the one in slot 0 is smaller than the handle in slot 2.

For each side, the adj_elem field is used to store the element that it is a side of as long as the element is considered to be on the skin. The adj_elem field is cleared (set to zero) to indicate that this side is no longer considered to be on the skin (and is the side of more than one element.)

Definition at line 1168 of file Skinner.cpp.


Constructor & Destructor Documentation

template<unsigned CORNERS>
moab::AdjSides< CORNERS >::Side::Side ( const EntityHandle array,
int  idx,
EntityHandle  adj,
unsigned  short 
) [inline]

construct from connectivity of side

Parameters:
arrayThe connectivity of the element side.
idxThe index of the implicit vertex (contained in all sides in the list.)
adjThe element that this is a side of.

Definition at line 1183 of file Skinner.cpp.

References moab::AdjSides< CORNERS >::Side::handles, and swap().

                                                                                     : adj_elem( adj )
        {
            switch( CORNERS )
            {
                case 3:
                    handles[1] = array[( idx + 2 ) % CORNERS];
                    // fall through
                case 2:
                    if( 3 == CORNERS ) handles[1] = array[( idx + 2 ) % CORNERS];
                    if( 2 <= CORNERS ) handles[0] = array[( idx + 1 ) % CORNERS];
                    break;
                default:
                    assert( false );
                    break;
            }
            if( CORNERS == 3 && handles[1] > handles[0] ) std::swap( handles[0], handles[1] );
        }
template<unsigned CORNERS>
moab::AdjSides< CORNERS >::Side::Side ( const EntityHandle array,
int  idx,
EntityHandle  adj,
unsigned  short,
const short *  indices 
) [inline]

construct from connectivity of parent element

Parameters:
arrayThe connectivity of the parent element
idxThe index of the implicit vertex (contained in all sides in the list.) This is an index into 'indices', not 'array'.
adjThe element that this is a side of.
indicesThe indices into 'array' at which the vertices representing the side occur.

Definition at line 1210 of file Skinner.cpp.

References moab::AdjSides< CORNERS >::Side::handles, and swap().

            : adj_elem( adj )
        {
            switch( CORNERS )
            {
                case 3:
                    handles[1] = array[indices[( idx + 2 ) % CORNERS]];
                    // fall through
                case 2:
                    if( 3 == CORNERS ) handles[1] = array[indices[( idx + 2 ) % CORNERS]];
                    if( 2 <= CORNERS ) handles[0] = array[indices[( idx + 1 ) % CORNERS]];
                    break;
                default:
                    assert( false );
                    break;
            }
            if( CORNERS == 3 && handles[1] > handles[0] ) std::swap( handles[0], handles[1] );
        }
template<>
moab::AdjSides::Side< 4 >::Side ( const EntityHandle array,
int  idx,
EntityHandle  adj,
unsigned  short 
)

construct from connectivity of side

Parameters:
arrayThe connectivity of the element side.
idxThe index of the implicit vertex (contained in all sides in the list.)
adjThe element that this is a side of.

Definition at line 1378 of file Skinner.cpp.

References moab::AdjSides< CORNERS >::Side::handles, and swap().

                                                                                              : adj_elem( adj )
{
    const unsigned int CORNERS = 4;
    handles[2]                 = array[( idx + 3 ) % CORNERS];
    handles[1]                 = array[( idx + 2 ) % CORNERS];
    handles[0]                 = array[( idx + 1 ) % CORNERS];
    if( handles[2] > handles[0] ) std::swap( handles[0], handles[2] );
}
template<>
moab::AdjSides::Side< 4 >::Side ( const EntityHandle array,
int  idx,
EntityHandle  adj,
unsigned  short,
const short *  indices 
)

construct from connectivity of parent element

Parameters:
arrayThe connectivity of the parent element
idxThe index of the implicit vertex (contained in all sides in the list.) This is an index into 'indices', not 'array'.
adjThe element that this is a side of.
indicesThe indices into 'array' at which the vertices representing the side occur.

Definition at line 1397 of file Skinner.cpp.

References moab::AdjSides< CORNERS >::Side::handles, and swap().

    : adj_elem( adj )
{
    const unsigned int CORNERS = 4;
    handles[2]                 = array[indices[( idx + 3 ) % CORNERS]];
    handles[1]                 = array[indices[( idx + 2 ) % CORNERS]];
    handles[0]                 = array[indices[( idx + 1 ) % CORNERS]];
    if( handles[2] > handles[0] ) std::swap( handles[0], handles[2] );
}

Member Function Documentation

template<unsigned CORNERS>
bool moab::AdjSides< CORNERS >::Side::operator== ( const Side other) const [inline]

Definition at line 1231 of file Skinner.cpp.

References moab::AdjSides< CORNERS >::Side::handles.

        {
            switch( CORNERS )
            {
                case 3:
                    return handles[0] == other.handles[0] && handles[1] == other.handles[1];
                case 2:
                    return handles[0] == other.handles[0];
                default:
                    assert( false );
                    return false;
            }
        }
template<>
bool moab::AdjSides::Side< 4 >::operator== ( const Side other) const

Definition at line 1410 of file Skinner.cpp.

References moab::AdjSides< CORNERS >::Side::handles.

{
    return handles[0] == other.handles[0] && handles[1] == other.handles[1] && handles[2] == other.handles[2];
}
template<unsigned CORNERS>
bool moab::AdjSides< CORNERS >::Side::skin ( ) const [inline]

Definition at line 1172 of file Skinner.cpp.

References moab::AdjSides< CORNERS >::Side::adj_elem.

        {
            return 0 != adj_elem;
        }

Member Data Documentation

template<unsigned CORNERS>
EntityHandle moab::AdjSides< CORNERS >::Side::adj_elem

element that this is a side of, or zero

Definition at line 1171 of file Skinner.cpp.

Referenced by moab::AdjSides< CORNERS >::Side::skin().

template<unsigned CORNERS>
EntityHandle moab::AdjSides< CORNERS >::Side::handles[CORNERS-1]

side vertices, except for implicit one

Definition at line 1170 of file Skinner.cpp.

Referenced by moab::AdjSides< CORNERS >::Side::operator==(), and moab::AdjSides< CORNERS >::Side::Side().

List of all members.


The documentation for this struct was generated from the following file:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines