![]() |
Mesh Oriented datABase
(version 5.4.1)
Array-based unstructured mesh datastructure
|
#include <MixedCellConnectivity.h>
Public Member Functions | |
MixedCellConnectivity (smoab::Range const &cells, moab::Interface *moab) | |
void | compactIds (vtkIdType &numCells, vtkIdType &connectivityLength) |
void | moabPoints (smoab::Range &range) const |
void | copyConnectivity (std::vector< EntityHandle > &output) const |
void | copyToVtkCellInfo (vtkIdType *cellArray, vtkIdType *cellLocations, unsigned char *cellTypes) const |
Private Types | |
typedef std::vector < EntityHandle > ::const_iterator | EntityConstIterator |
typedef std::vector < EntityHandle * > ::const_iterator | ConnConstIterator |
typedef std::vector < detail::ContinousCellInfo > ::const_iterator | InfoConstIterator |
Private Attributes | |
std::vector< EntityHandle * > | Connectivity |
std::vector< EntityHandle > | UniquePoints |
std::vector < detail::ContinousCellInfo > | Info |
Definition at line 15 of file MixedCellConnectivity.h.
typedef std::vector< EntityHandle* >::const_iterator smoab::detail::MixedCellConnectivity::ConnConstIterator [private] |
Definition at line 197 of file MixedCellConnectivity.h.
typedef std::vector< EntityHandle >::const_iterator smoab::detail::MixedCellConnectivity::EntityConstIterator [private] |
Definition at line 196 of file MixedCellConnectivity.h.
typedef std::vector< detail::ContinousCellInfo >::const_iterator smoab::detail::MixedCellConnectivity::InfoConstIterator [private] |
Definition at line 198 of file MixedCellConnectivity.h.
smoab::detail::MixedCellConnectivity::MixedCellConnectivity | ( | smoab::Range const & | cells, |
moab::Interface * | moab | ||
) | [inline] |
Definition at line 18 of file MixedCellConnectivity.h.
References moab::Range::begin(), moab::Interface::connect_iterate(), Connectivity, moab::Range::end(), Info, moab::Range::size(), moab::Interface::type_from_handle(), and smoab::detail::vtkCellType().
: Connectivity(), UniquePoints(), Info()
{
int count = 0;
const std::size_t cellSize = cells.size();
while( count != cellSize )
{
EntityHandle* connectivity;
int numVerts = 0, iterationCount = 0;
//use the highly efficent calls, since we know that are of the same dimension
moab->connect_iterate( cells.begin() + count, cells.end(), connectivity, numVerts, iterationCount );
//if we didn't read anything, break!
if( iterationCount == 0 )
{
break;
}
//identify the cell type that we currently have,
//store that along with the connectivity in a temp storage vector
const moab::EntityType type = moab->type_from_handle( *cells.begin() + count );
//while all these cells are contiously of the same type,
//quadric hexs in vtk have 20 points, but moab has 21 so we
//need to store this difference
int numVTKVerts = numVerts;
int vtkCellType = smoab::detail::vtkCellType( type, numVTKVerts );
ContinousCellInfo info = { vtkCellType, numVerts, ( numVerts - numVTKVerts ), iterationCount };
this->Info.push_back( info );
this->Connectivity.push_back( connectivity );
count += iterationCount;
}
}
void smoab::detail::MixedCellConnectivity::compactIds | ( | vtkIdType & | numCells, |
vtkIdType & | connectivityLength | ||
) | [inline] |
Definition at line 54 of file MixedCellConnectivity.h.
References copyConnectivity(), Info, and UniquePoints.
Referenced by smoab::detail::LoadGeometry::fill().
{
//converts all the ids to be ordered starting at zero, and also
//keeping the orginal logical ordering. Stores the result of this
//operation in the unstrucutred grid that is passed in
//lets determine the total length of the connectivity
connectivityLength = 0;
numCells = 0;
for( InfoConstIterator i = this->Info.begin(); i != this->Info.end(); ++i )
{
connectivityLength += ( *i ).numCells * ( *i ).numVerts;
numCells += ( *i ).numCells;
}
this->UniquePoints.reserve( connectivityLength );
this->copyConnectivity( this->UniquePoints );
std::sort( this->UniquePoints.begin(), this->UniquePoints.end() );
typedef std::vector< EntityHandle >::iterator EntityIterator;
EntityIterator newEnd = std::unique( this->UniquePoints.begin(), this->UniquePoints.end() );
const std::size_t newSize = std::distance( this->UniquePoints.begin(), newEnd );
this->UniquePoints.resize( newSize );
}
void smoab::detail::MixedCellConnectivity::copyConnectivity | ( | std::vector< EntityHandle > & | output | ) | const [inline] |
Definition at line 91 of file MixedCellConnectivity.h.
References Connectivity, Info, and size.
Referenced by compactIds().
{
//walk the info to find the length of each sub connectivity array,
//and insert them into the vector, ordering is implied by the order
//the connecitivy sub array are added to this class
ConnConstIterator c = this->Connectivity.begin();
for( InfoConstIterator i = this->Info.begin(); i != this->Info.end(); ++i, ++c )
{
//remember our Connectivity is a vector of pointers whose
//length is held in the info vector.
const int numUnusedPoints = ( *i ).numUnusedVerts;
if( numUnusedPoints == 0 )
{
const int connLength = ( *i ).numCells * ( *i ).numVerts;
std::copy( *c, *c + connLength, std::back_inserter( output ) );
}
else
{
//we have cell connectivity that we need to skip,
//so we have to manual copy each cells connectivity
const int size = ( *i ).numCells;
const int numPoints = ( *i ).numVerts;
for( int j = 0; j < size; ++j )
{
std::copy( *c, *c + numPoints, std::back_inserter( output ) );
}
c += numPoints + ( *i ).numUnusedVerts;
}
}
}
void smoab::detail::MixedCellConnectivity::copyToVtkCellInfo | ( | vtkIdType * | cellArray, |
vtkIdType * | cellLocations, | ||
unsigned char * | cellTypes | ||
) | const [inline] |
Definition at line 124 of file MixedCellConnectivity.h.
References Connectivity, smoab::detail::FixQuadraticIdOrdering(), Info, UniquePoints, and smoab::detail::vtkCellType().
Referenced by smoab::detail::LoadGeometry::addGridsTopology().
{
vtkIdType currentVtkConnectivityIndex = 0;
ConnConstIterator c = this->Connectivity.begin();
for( InfoConstIterator i = this->Info.begin(); i != this->Info.end(); ++i, ++c )
{
//for this group of the same cell type we need to fill the cellTypes
const int numCells = ( *i ).numCells;
const int numVerts = ( *i ).numVerts;
std::fill_n( cellTypes, numCells, static_cast< unsigned char >( ( *i ).type ) );
//for each cell in this collection that have the same type
//grab the raw array now, so we can properly increment for each vert in each cell
EntityHandle* moabConnectivity = *c;
for( int j = 0; j < numCells; ++j )
{
cellLocations[j] = currentVtkConnectivityIndex;
//cell arrays start and end are different, since we
//have to account for element that states the length of each cell
cellArray[0] = numVerts;
for( int k = 0; k < numVerts; ++k, ++moabConnectivity )
{
//this is going to be a root of some failures when we start
//reading really large datasets under 32bit.
//fyi, don't use a range ds for unique points, distance
//function is horribly slow they need to override it
EntityConstIterator result =
std::lower_bound( this->UniquePoints.begin(), this->UniquePoints.end(), *moabConnectivity );
std::size_t newId = std::distance( this->UniquePoints.begin(), result );
cellArray[k + 1] = static_cast< vtkIdType >( newId );
}
//skip any extra unused points, which is currnetly only
//the extra center point in moab quadratic hex
moabConnectivity += ( *i ).numUnusedVerts;
currentVtkConnectivityIndex += numVerts + 1;
cellArray += numVerts + 1;
}
//For Tri-Quadratic-Hex and Quadratric-Wedge Moab and VTK
//Differ on the order of the edge ids. For wedge we need to swap
//indices 9,10,11 with 12,13,14 for each cell. For Hex we sawp
//12,13,14,15 with 16,17,18,19
int vtkCellType = ( *i ).type;
vtkIdType* connectivity = cellArray - ( numCells * ( numVerts + 1 ) );
if( vtkCellType == VTK_TRIQUADRATIC_HEXAHEDRON )
{
smoab::detail::QuadratricOrdering< VTK_TRIQUADRATIC_HEXAHEDRON > newOrdering;
smoab::detail::FixQuadraticIdOrdering( connectivity, numCells, newOrdering );
}
else if( vtkCellType == VTK_QUADRATIC_WEDGE )
{
smoab::detail::QuadratricOrdering< VTK_QUADRATIC_WEDGE > newOrdering;
smoab::detail::FixQuadraticIdOrdering( connectivity, numCells, newOrdering );
}
cellLocations += numCells;
cellTypes += numCells;
}
}
void smoab::detail::MixedCellConnectivity::moabPoints | ( | smoab::Range & | range | ) | const [inline] |
Definition at line 82 of file MixedCellConnectivity.h.
References UniquePoints.
Referenced by smoab::detail::LoadGeometry::addCoordinates().
{
//from the documentation a reverse iterator is the fastest way
//to insert into a range.
std::copy( this->UniquePoints.rbegin(), this->UniquePoints.rend(), moab::range_inserter( range ) );
}
std::vector< EntityHandle* > smoab::detail::MixedCellConnectivity::Connectivity [private] |
Definition at line 191 of file MixedCellConnectivity.h.
Referenced by copyConnectivity(), copyToVtkCellInfo(), and MixedCellConnectivity().
std::vector< detail::ContinousCellInfo > smoab::detail::MixedCellConnectivity::Info [private] |
Definition at line 194 of file MixedCellConnectivity.h.
Referenced by compactIds(), copyConnectivity(), copyToVtkCellInfo(), and MixedCellConnectivity().
std::vector< EntityHandle > smoab::detail::MixedCellConnectivity::UniquePoints [private] |
Definition at line 192 of file MixedCellConnectivity.h.
Referenced by compactIds(), copyToVtkCellInfo(), and moabPoints().