![]() |
Mesh Oriented datABase
(version 5.4.1)
Array-based unstructured mesh datastructure
|
#include <ReadSparseTag.h>
Public Member Functions | |
ReadSparseTag (const smoab::CellSets &mSets, const smoab::Range &cells, const smoab::Interface &interface) | |
void | fill (vtkIntArray *array, const Tag *cellTag) const |
void | fill (vtkIdTypeArray *array, const Tag *cellTag) const |
Private Member Functions | |
template<typename T > | |
void | fillRawArray (T *sparseTagArray, std::size_t length, const Tag *cellTag) const |
template<typename T > | |
void | singleSetRead (T *sparseTagArray, const std::vector< int > &values, std::size_t length) const |
template<typename T > | |
void | multiSetRead (T *sparseTagArray, const std::vector< int > &values, std::size_t length, int defaultTagValue) const |
Private Attributes | |
const smoab::Interface & | Interface |
const smoab::CellSets & | MeshSets |
const smoab::Range & | Cells |
Definition at line 17 of file ReadSparseTag.h.
smoab::detail::ReadSparseTag::ReadSparseTag | ( | const smoab::CellSets & | mSets, |
const smoab::Range & | cells, | ||
const smoab::Interface & | interface | ||
) | [inline] |
Definition at line 20 of file ReadSparseTag.h.
: Interface( interface ), MeshSets( mSets ), Cells( cells )
{
}
void smoab::detail::ReadSparseTag::fill | ( | vtkIntArray * | array, |
const Tag * | cellTag | ||
) | const |
Definition at line 49 of file ReadSparseTag.h.
References Cells, fillRawArray(), length(), and moab::Range::size().
Referenced by smoab::DataSetConverter::fill(), multiSetRead(), and singleSetRead().
{
const std::size_t length = this->Cells.size();
array->SetNumberOfValues( length );
int* raw = static_cast< int* >( array->GetVoidPointer( 0 ) );
this->fillRawArray( raw, length, cellTag );
}
void smoab::detail::ReadSparseTag::fill | ( | vtkIdTypeArray * | array, |
const Tag * | cellTag | ||
) | const |
Definition at line 58 of file ReadSparseTag.h.
References Cells, fillRawArray(), length(), and moab::Range::size().
{
const std::size_t length = this->Cells.size();
array->SetNumberOfValues( length );
vtkIdType* raw = static_cast< vtkIdType* >( array->GetVoidPointer( 0 ) );
this->fillRawArray( raw, length, cellTag );
}
void smoab::detail::ReadSparseTag::fillRawArray | ( | T * | sparseTagArray, |
std::size_t | length, | ||
const Tag * | cellTag | ||
) | const [private] |
Definition at line 68 of file ReadSparseTag.h.
References smoab::Interface::getDefaultTagVaue(), smoab::Interface::getMoabTag(), smoab::Interface::getTagData(), MeshSets, multiSetRead(), and singleSetRead().
Referenced by fill().
{
typedef std::vector< int >::const_iterator IdConstIterator;
typedef std::vector< int >::iterator IdIterator;
typedef smoab::CellSets::const_iterator CellSetIterator;
std::vector< int > sparseTagValues( this->MeshSets.size() );
//first off iterate the entities and determine which ones
//have moab material ids
//todo get proper default value from moab
//wrap this area with scope, to remove local variables
{
const moab::Tag stag = this->Interface.getMoabTag( *sparseTag );
IdIterator tagIds = sparseTagValues.begin();
for( CellSetIterator i = this->MeshSets.begin(); i != this->MeshSets.end(); ++i, ++tagIds )
{
//getTagData clobbers defaultValue
int defaultValue = this->Interface.getDefaultTagVaue< int >( stag );
*tagIds = this->Interface.getTagData( stag, i->entity(), defaultValue );
}
//now determine ids for all entities that don't have materials
IdConstIterator maxPos = std::max_element( sparseTagValues.begin(), sparseTagValues.end() );
int maxValue = *maxPos;
for( IdIterator i = sparseTagValues.begin(); i != sparseTagValues.end(); ++i )
{
if( *i == -1 )
{
*i = ++maxValue;
}
}
}
if( this->MeshSets.size() == 1 )
{
this->singleSetRead( sparseTagArray, sparseTagValues, length );
}
else
{
int defaultValue = this->Interface.getDefaultTagVaue< int >( *sparseTag );
this->multiSetRead( sparseTagArray, sparseTagValues, length, defaultValue );
}
}
void smoab::detail::ReadSparseTag::multiSetRead | ( | T * | sparseTagArray, |
const std::vector< int > & | values, | ||
std::size_t | length, | ||
int | defaultTagValue | ||
) | const [private] |
Definition at line 127 of file ReadSparseTag.h.
References moab::Range::begin(), Cells, moab::Range::end(), fill(), MeshSets, smoab::RangeToVector(), and T.
Referenced by fillRawArray().
{
typedef std::vector< smoab::EntityHandle >::const_iterator EntityHandleIterator;
typedef std::vector< int >::const_iterator IdConstIterator;
typedef smoab::CellSets::const_iterator CellSetIterator;
typedef smoab::Range::const_iterator RangeIterator;
//create the search structure as a range is really slow to search with
//lower_bounds
std::vector< smoab::EntityHandle > searchableCells;
smoab::RangeToVector( this->Cells, searchableCells );
//pre fill with -1 to mark cells we don't touch, since some cells
//might no have a default tag
T defaultValue = T( defaultTagValue );
std::fill( sparseTagArray, sparseTagArray + numCells, defaultValue );
EntityHandleIterator s_begin = searchableCells.begin();
EntityHandleIterator s_end = searchableCells.end();
IdConstIterator currentTagValue = sparseTagValues.begin();
for( CellSetIterator i = this->MeshSets.begin(); i != this->MeshSets.end(); ++i, ++currentTagValue )
{
T value = static_cast< T >( *currentTagValue );
const smoab::Range& entitiesCells = i->cells();
for( RangeIterator j = entitiesCells.begin(); j != entitiesCells.end(); ++j )
{
EntityHandleIterator result = std::lower_bound( s_begin, s_end, *j );
std::size_t newId = std::distance( s_begin, result );
sparseTagArray[newId] = value;
}
}
}
void smoab::detail::ReadSparseTag::singleSetRead | ( | T * | sparseTagArray, |
const std::vector< int > & | values, | ||
std::size_t | length | ||
) | const [private] |
Definition at line 116 of file ReadSparseTag.h.
Referenced by fillRawArray().
{
//now we set all the values as this has a single meshset so we
//have no complicated logic for mapping each cell to a meshset
T value = static_cast< T >( values[0] );
std::fill( sparseTagArray, sparseTagArray + length, value );
}
const smoab::Range& smoab::detail::ReadSparseTag::Cells [private] |
Definition at line 45 of file ReadSparseTag.h.
Referenced by fill(), and multiSetRead().
const smoab::Interface& smoab::detail::ReadSparseTag::Interface [private] |
Definition at line 43 of file ReadSparseTag.h.
const smoab::CellSets& smoab::detail::ReadSparseTag::MeshSets [private] |
Definition at line 44 of file ReadSparseTag.h.
Referenced by fillRawArray(), and multiSetRead().