![]() |
Mesh Oriented datABase
(version 5.4.1)
Array-based unstructured mesh datastructure
|
#include <WriteVtk.hpp>
Public Member Functions | |
WriteVtk (Interface *impl) | |
Constructor. | |
virtual | ~WriteVtk () |
Destructor. | |
ErrorCode | write_file (const char *file_name, const bool overwrite, const FileOptions &opts, const EntityHandle *output_list, const int num_sets, const std::vector< std::string > &qa_list, const Tag *tag_list=NULL, int num_tags=0, int export_dimension=3) |
writes out a file | |
Static Public Member Functions | |
static WriterIface * | factory (Interface *) |
Private Member Functions | |
ErrorCode | gather_mesh (const EntityHandle *set_list, int num_sets, Range &nodes, Range &elems) |
Get entities to write, given set list passed to write_file. | |
ErrorCode | write_header (std::ostream &stream) |
Write 4-line VTK file header. | |
ErrorCode | write_nodes (std::ostream &stream, const Range &nodes) |
Write node coordinates. | |
ErrorCode | write_elems (std::ostream &stream, const Range &nodes, const Range &elems) |
Write element connectivity. | |
ErrorCode | write_tags (std::ostream &stream, bool nodes, const Range &entities, const Tag *tag_list, int num_tags) |
Write all tags on either the list of nodes or the list of elements. | |
ErrorCode | write_tag (std::ostream &stream, Tag tag, const Range &entities, const Range &tagged_entities) |
Write the tad description for the passed tag and call the template write_tag function to write the tag data. | |
template<typename T > | |
ErrorCode | write_tag (std::ostream &stream, Tag tag, const Range &entities, const Range &tagged_entities, const int) |
Write tag data. | |
ErrorCode | write_bit_tag (std::ostream &stream, Tag tag, const Range &entities, const Range &tagged_entities) |
template<typename T > | |
void | write_data (std::ostream &stream, const std::vector< T > &data, unsigned vals_per_tag) |
Write a list of values. | |
Private Attributes | |
Interface * | mbImpl |
WriteUtilIface * | writeTool |
bool | mStrict |
int | freeNodes |
bool | createOneNodeCells |
Definition at line 30 of file WriteVtk.hpp.
moab::WriteVtk::WriteVtk | ( | Interface * | impl | ) |
Constructor.
Definition at line 58 of file WriteVtk.cpp.
References moab::Interface::query_interface(), and writeTool.
Referenced by factory().
: mbImpl( impl ), writeTool( 0 ), mStrict( DEFAULT_STRICT ), freeNodes( 0 ), createOneNodeCells( false )
{
assert( impl != NULL );
impl->query_interface( writeTool );
}
moab::WriteVtk::~WriteVtk | ( | ) | [virtual] |
Destructor.
Definition at line 65 of file WriteVtk.cpp.
References mbImpl, moab::Interface::release_interface(), and writeTool.
{
mbImpl->release_interface( writeTool );
}
WriterIface * moab::WriteVtk::factory | ( | Interface * | iface | ) | [static] |
Definition at line 53 of file WriteVtk.cpp.
References WriteVtk().
Referenced by moab::ReaderWriterSet::ReaderWriterSet().
{
return new WriteVtk( iface );
}
ErrorCode moab::WriteVtk::gather_mesh | ( | const EntityHandle * | set_list, |
int | num_sets, | ||
Range & | nodes, | ||
Range & | elems | ||
) | [private] |
Get entities to write, given set list passed to write_file.
Definition at line 129 of file WriteVtk.cpp.
References moab::Range::begin(), moab::Range::clear(), moab::CREATE_HANDLE(), moab::Range::empty(), moab::Range::end(), moab::Range::erase(), ErrorCode, moab::Interface::get_child_meshsets(), moab::Interface::get_connectivity(), moab::Interface::get_entities_by_handle(), moab::VtkUtil::get_vtk_type(), moab::Range::insert(), moab::Range::lower_bound(), MB_ENTITY_NOT_FOUND, MB_SET_ERR, MB_SUCCESS, MBEDGE, MBENTITYSET, mbImpl, MBVERTEX, moab::Range::merge(), and moab::CN::VerticesPerEntity().
Referenced by write_file().
{
ErrorCode rval;
int e;
if( !set_list || !num_sets )
{
Range a;
rval = mbImpl->get_entities_by_handle( 0, a );
if( MB_SUCCESS != rval ) return rval;
Range::const_iterator node_i, elem_i, set_i;
node_i = a.lower_bound( a.begin(), a.end(), CREATE_HANDLE( MBVERTEX, 0, e ) );
elem_i = a.lower_bound( node_i, a.end(), CREATE_HANDLE( MBEDGE, 0, e ) );
set_i = a.lower_bound( elem_i, a.end(), CREATE_HANDLE( MBENTITYSET, 0, e ) );
nodes.merge( node_i, elem_i );
elems.merge( elem_i, set_i );
// Filter out unsupported element types
EntityType et = MBEDGE;
for( et++; et < MBENTITYSET; et++ )
{
if( VtkUtil::get_vtk_type( et, CN::VerticesPerEntity( et ) ) ) continue;
Range::iterator eit = elems.lower_bound( elems.begin(), elems.end(), CREATE_HANDLE( et, 0, e ) ),
ep1it = elems.lower_bound( elems.begin(), elems.end(), CREATE_HANDLE( et + 1, 0, e ) );
elems.erase( eit, ep1it );
}
}
else
{
std::set< EntityHandle > visited;
std::vector< EntityHandle > sets;
sets.reserve( num_sets );
std::copy( set_list, set_list + num_sets, std::back_inserter( sets ) );
while( !sets.empty() )
{
// Get next set
EntityHandle set = sets.back();
sets.pop_back();
// Skip sets we've already done
if( !visited.insert( set ).second ) continue;
Range a;
rval = mbImpl->get_entities_by_handle( set, a );
if( MB_SUCCESS != rval ) return rval;
Range::const_iterator node_i, elem_i, set_i;
node_i = a.lower_bound( a.begin(), a.end(), CREATE_HANDLE( MBVERTEX, 0, e ) );
elem_i = a.lower_bound( node_i, a.end(), CREATE_HANDLE( MBEDGE, 0, e ) );
set_i = a.lower_bound( elem_i, a.end(), CREATE_HANDLE( MBENTITYSET, 0, e ) );
nodes.merge( node_i, elem_i );
elems.merge( elem_i, set_i );
std::copy( set_i, a.end(), std::back_inserter( sets ) );
a.clear();
rval = mbImpl->get_child_meshsets( set, a );
std::copy( a.begin(), a.end(), std::back_inserter( sets ) );
}
for( Range::const_iterator ei = elems.begin(); ei != elems.end(); ++ei )
{
std::vector< EntityHandle > connect;
rval = mbImpl->get_connectivity( &( *ei ), 1, connect );
if( MB_SUCCESS != rval ) return rval;
for( unsigned int i = 0; i < connect.size(); ++i )
nodes.insert( connect[i] );
}
}
if( nodes.empty() )
{
MB_SET_ERR( MB_ENTITY_NOT_FOUND, "Nothing to write" );
}
return MB_SUCCESS;
}
ErrorCode moab::WriteVtk::write_bit_tag | ( | std::ostream & | stream, |
Tag | tag, | ||
const Range & | entities, | ||
const Range & | tagged_entities | ||
) | [private] |
Definition at line 552 of file WriteVtk.cpp.
References moab::Range::begin(), moab::Range::end(), ErrorCode, MB_SET_ERR, MB_SUCCESS, mbImpl, moab::Range::size(), t, moab::Interface::tag_get_data(), moab::Interface::tag_get_length(), moab::Interface::tag_get_name(), and write_data().
Referenced by write_tag().
{
ErrorCode rval;
const unsigned long n = entities.size();
// Get tag properties
std::string name;
int vals_per_tag;
if( MB_SUCCESS != mbImpl->tag_get_name( tag, name ) || MB_SUCCESS != mbImpl->tag_get_length( tag, vals_per_tag ) )
return MB_FAILURE;
if( vals_per_tag > 8 )
{
MB_SET_ERR( MB_FAILURE, "Invalid tag size for bit tag \"" << name << "\"" );
}
// Get a tag value for each entity.
// Get bits for each entity and unpack into
// one integer in the 'data' array for each bit.
// Initialize 'data' to zero because we will skip
// those entities for which the tag is not set.
std::vector< unsigned short > data;
data.resize( n * vals_per_tag, 0 );
Range::const_iterator t = tagged.begin();
std::vector< unsigned short >::iterator d = data.begin();
for( Range::const_iterator i = entities.begin(); i != entities.end() && t != tagged.end(); ++i )
{
if( *i == *t )
{
++t;
unsigned char value;
rval = mbImpl->tag_get_data( tag, &( *i ), 1, &value );
for( int j = 0; j < vals_per_tag; ++j, ++d )
*d = (unsigned short)( value & ( 1 << j ) ? 1 : 0 );
if( MB_SUCCESS != rval ) return rval;
}
else
{
// If tag is not set for entity, skip values in array
d += vals_per_tag;
}
}
// Write the tag values, one entity per line.
write_data( stream, data, vals_per_tag );
return MB_SUCCESS;
}
void moab::WriteVtk::write_data | ( | std::ostream & | stream, |
const std::vector< T > & | data, | ||
unsigned | vals_per_tag | ||
) | [private] |
Write a list of values.
Definition at line 473 of file WriteVtk.cpp.
References T.
Referenced by write_bit_tag(), and write_tag().
{
typename std::vector< T >::const_iterator d = data.begin();
const unsigned long n = data.size() / vals_per_tag;
for( unsigned long i = 0; i < n; ++i )
{
for( unsigned j = 0; j < vals_per_tag; ++j, ++d )
{
if( sizeof( T ) == 1 )
stream << (unsigned int)*d << ' ';
else
stream << *d << ' ';
}
stream << std::endl;
}
}
ErrorCode moab::WriteVtk::write_elems | ( | std::ostream & | stream, |
const Range & | nodes, | ||
const Range & | elems | ||
) | [private] |
Write element connectivity.
Definition at line 234 of file WriteVtk.cpp.
References moab::Range::begin(), createOneNodeCells, moab::Range::end(), moab::CN::EntityTypeName(), ErrorCode, freeNodes, moab::Interface::get_connectivity(), moab::VtkUtil::get_vtk_type(), moab::Range::index(), MB_CHK_ERR, MB_SET_ERR, MB_SUCCESS, mbImpl, MBPOLYHEDRON, MBVERTEX, moab::Range::merge(), moab::VtkElemType::node_order, moab::Range::size(), moab::Range::subset_by_type(), moab::subtract(), t, moab::TYPE_FROM_HANDLE(), moab::Interface::type_from_handle(), moab::CN::VerticesPerEntity(), and moab::VtkElemType::vtk_type.
Referenced by write_file().
{
ErrorCode rval;
Range connectivity; // because we now support polyhedra, it could contain faces
rval = mbImpl->get_connectivity( elems, connectivity );MB_CHK_ERR( rval );
Range nodes_from_connectivity = connectivity.subset_by_type( MBVERTEX );
Range faces_from_connectivity =
subtract( connectivity, nodes_from_connectivity ); // these could be faces of polyhedra
Range connected_nodes;
rval = mbImpl->get_connectivity( faces_from_connectivity, connected_nodes );MB_CHK_ERR( rval );
connected_nodes.merge( nodes_from_connectivity );
Range free_nodes = subtract( nodes, connected_nodes );
// Get and write counts
unsigned long num_elems, num_uses;
num_elems = num_uses = elems.size();
std::map< EntityHandle, int > sizeFieldsPolyhedra;
for( Range::const_iterator i = elems.begin(); i != elems.end(); ++i )
{
EntityType type = mbImpl->type_from_handle( *i );
if( !VtkUtil::get_vtk_type( type, CN::VerticesPerEntity( type ) ) ) continue;
EntityHandle elem = *i;
const EntityHandle* connect = NULL;
int conn_len = 0;
// Dummy storage vector for structured mesh "get_connectivity" function
std::vector< EntityHandle > storage;
rval = mbImpl->get_connectivity( elem, connect, conn_len, false, &storage );MB_CHK_ERR( rval );
num_uses += conn_len;
// if polyhedra, we will count the number of nodes in each face too
if( TYPE_FROM_HANDLE( elem ) == MBPOLYHEDRON )
{
int numFields = 1; // there will be one for number of faces; forgot about this one
for( int j = 0; j < conn_len; j++ )
{
const EntityHandle* conn = NULL;
int num_nd = 0;
rval = mbImpl->get_connectivity( connect[j], conn, num_nd );MB_CHK_ERR( rval );
numFields += num_nd + 1;
}
sizeFieldsPolyhedra[elem] = numFields; // will be used later, at writing
num_uses += ( numFields - conn_len );
}
}
freeNodes = (int)free_nodes.size();
if( !createOneNodeCells ) freeNodes = 0; // do not create one node cells
stream << "CELLS " << num_elems + freeNodes << ' ' << num_uses + 2 * freeNodes << std::endl;
// Write element connectivity
std::vector< int > conn_data;
std::vector< unsigned > vtk_types( elems.size() + freeNodes );
std::vector< unsigned >::iterator t = vtk_types.begin();
for( Range::const_iterator i = elems.begin(); i != elems.end(); ++i )
{
// Get type information for element
EntityHandle elem = *i;
EntityType type = TYPE_FROM_HANDLE( elem );
// Get element connectivity
const EntityHandle* connect = NULL;
int conn_len = 0;
// Dummy storage vector for structured mesh "get_connectivity" function
std::vector< EntityHandle > storage;
rval = mbImpl->get_connectivity( elem, connect, conn_len, false, &storage );MB_CHK_ERR( rval );
// Get VTK type
const VtkElemType* vtk_type = VtkUtil::get_vtk_type( type, conn_len );
if( !vtk_type )
{
// Try connectivity with 1 fewer node
vtk_type = VtkUtil::get_vtk_type( type, conn_len - 1 );
if( vtk_type )
conn_len--;
else
{
MB_SET_ERR( MB_FAILURE, "Vtk file format does not support elements of type "
<< CN::EntityTypeName( type ) << " (" << (int)type << ") with " << conn_len
<< " nodes" );
}
}
// Save VTK type index for later
*t = vtk_type->vtk_type;
++t;
if( type != MBPOLYHEDRON )
{
// Get IDs from vertex handles
assert( conn_len > 0 );
conn_data.resize( conn_len );
for( int j = 0; j < conn_len; ++j )
conn_data[j] = nodes.index( connect[j] );
// Write connectivity list
stream << conn_len;
if( vtk_type->node_order )
for( int k = 0; k < conn_len; ++k )
stream << ' ' << conn_data[vtk_type->node_order[k]];
else
for( int k = 0; k < conn_len; ++k )
stream << ' ' << conn_data[k];
stream << std::endl;
}
else
{
// POLYHEDRON needs a special case, loop over faces to get nodes
stream << sizeFieldsPolyhedra[elem] << " " << conn_len;
for( int k = 0; k < conn_len; k++ )
{
EntityHandle face = connect[k];
const EntityHandle* conn = NULL;
int num_nodes = 0;
rval = mbImpl->get_connectivity( face, conn, num_nodes );MB_CHK_ERR( rval );
// num_uses += num_nd + 1; // 1 for number of vertices in face
conn_data.resize( num_nodes );
for( int j = 0; j < num_nodes; ++j )
conn_data[j] = nodes.index( conn[j] );
stream << ' ' << num_nodes;
for( int j = 0; j < num_nodes; ++j )
stream << ' ' << conn_data[j];
}
stream << std::endl;
}
}
if( createOneNodeCells )
for( Range::const_iterator v = free_nodes.begin(); v != free_nodes.end(); ++v, ++t )
{
EntityHandle node = *v;
stream << "1 " << nodes.index( node ) << std::endl;
*t = 1;
}
// Write element types
stream << "CELL_TYPES " << vtk_types.size() << std::endl;
for( std::vector< unsigned >::const_iterator i = vtk_types.begin(); i != vtk_types.end(); ++i )
stream << *i << std::endl;
return MB_SUCCESS;
}
ErrorCode moab::WriteVtk::write_file | ( | const char * | file_name, |
const bool | overwrite, | ||
const FileOptions & | opts, | ||
const EntityHandle * | output_list, | ||
const int | num_sets, | ||
const std::vector< std::string > & | qa_list, | ||
const Tag * | tag_list = NULL , |
||
int | num_tags = 0 , |
||
int | export_dimension = 3 |
||
) | [virtual] |
writes out a file
Implements moab::WriterIface.
Definition at line 70 of file WriteVtk.cpp.
References moab::WriteUtilIface::check_doesnt_exist(), createOneNodeCells, moab::DEFAULT_PRECISION, moab::DEFAULT_STRICT, ErrorCode, gather_mesh(), moab::FileOptions::get_int_option(), moab::FileOptions::get_null_option(), MB_FILE_WRITE_ERROR, MB_SET_ERR, MB_SUCCESS, mStrict, write_elems(), write_header(), write_nodes(), write_tags(), and writeTool.
Referenced by moab::Core::write_file().
{
ErrorCode rval;
// Get precision for node coordinates
int precision;
if( MB_SUCCESS != opts.get_int_option( "PRECISION", precision ) ) precision = DEFAULT_PRECISION;
if( MB_SUCCESS == opts.get_null_option( "STRICT" ) )
mStrict = true;
else if( MB_SUCCESS == opts.get_null_option( "RELAXED" ) )
mStrict = false;
else
mStrict = DEFAULT_STRICT;
if( MB_SUCCESS == opts.get_null_option( "CREATE_ONE_NODE_CELLS" ) ) createOneNodeCells = true;
// Get entities to write
Range nodes, elems;
rval = gather_mesh( output_list, num_sets, nodes, elems );
if( MB_SUCCESS != rval ) return rval;
// Honor overwrite flag
if( !overwrite )
{
rval = writeTool->check_doesnt_exist( file_name );
if( MB_SUCCESS != rval ) return rval;
}
// Create file
std::ofstream file( file_name );
if( !file )
{
MB_SET_ERR( MB_FILE_WRITE_ERROR, "Could not open file: " << file_name );
}
file.precision( precision );
// Write file
if( ( rval = write_header( file ) ) != MB_SUCCESS || ( rval = write_nodes( file, nodes ) ) != MB_SUCCESS ||
( rval = write_elems( file, nodes, elems ) ) != MB_SUCCESS ||
( rval = write_tags( file, true, nodes, tag_list, num_tags ) ) != MB_SUCCESS ||
( rval = write_tags( file, false, elems, tag_list, num_tags ) ) != MB_SUCCESS )
{
file.close();
remove( file_name );
return rval;
}
return MB_SUCCESS;
}
ErrorCode moab::WriteVtk::write_header | ( | std::ostream & | stream | ) | [private] |
Write 4-line VTK file header.
Definition at line 207 of file WriteVtk.cpp.
References MB_SUCCESS.
Referenced by write_file().
{
stream << "# vtk DataFile Version 3.0" << std::endl;
stream << MOAB_VERSION_STRING << std::endl;
stream << "ASCII" << std::endl;
stream << "DATASET UNSTRUCTURED_GRID" << std::endl;
return MB_SUCCESS;
}
ErrorCode moab::WriteVtk::write_nodes | ( | std::ostream & | stream, |
const Range & | nodes | ||
) | [private] |
Write node coordinates.
Definition at line 216 of file WriteVtk.cpp.
References moab::Range::begin(), moab::Range::end(), ErrorCode, moab::Interface::get_coords(), MB_SUCCESS, mbImpl, and moab::Range::size().
Referenced by write_file().
{
ErrorCode rval;
stream << "POINTS " << nodes.size() << " double" << std::endl;
double coords[3];
for( Range::const_iterator i = nodes.begin(); i != nodes.end(); ++i )
{
coords[1] = coords[2] = 0.0;
rval = mbImpl->get_coords( &( *i ), 1, coords );
if( MB_SUCCESS != rval ) return rval;
stream << coords[0] << ' ' << coords[1] << ' ' << coords[2] << std::endl;
}
return MB_SUCCESS;
}
ErrorCode moab::WriteVtk::write_tag | ( | std::ostream & | stream, |
Tag | tag, | ||
const Range & | entities, | ||
const Range & | tagged_entities | ||
) | [private] |
Write the tad description for the passed tag and call the template write_tag function to write the tag data.
Definition at line 602 of file WriteVtk.cpp.
References entities, MB_SUCCESS, MB_TYPE_BIT, MB_TYPE_DOUBLE, MB_TYPE_HANDLE, MB_TYPE_INTEGER, MB_TYPE_OPAQUE, mbImpl, moab::Interface::tag_get_data_type(), moab::Interface::tag_get_length(), moab::Interface::tag_get_name(), moab::VtkUtil::vtkTypeNames, and write_bit_tag().
Referenced by write_tags().
{
// Get tag properties
std::string name;
DataType type;
int vals_per_tag;
if( MB_SUCCESS != mbImpl->tag_get_name( tag, name ) || MB_SUCCESS != mbImpl->tag_get_length( tag, vals_per_tag ) ||
MB_SUCCESS != mbImpl->tag_get_data_type( tag, type ) )
return MB_FAILURE;
// Skip tags of type ENTITY_HANDLE
if( MB_TYPE_HANDLE == type ) return MB_FAILURE;
// Now that we're past the point where the name would be used in
// an error message, remove any spaces to conform to VTK file.
for( std::string::iterator i = name.begin(); i != name.end(); ++i )
{
if( isspace( *i ) || iscntrl( *i ) ) *i = '_';
}
// Write the tag description
if( 3 == vals_per_tag && MB_TYPE_DOUBLE == type )
s << "VECTORS " << name << ' ' << VtkUtil::vtkTypeNames[type] << std::endl;
else if( 9 == vals_per_tag )
s << "TENSORS " << name << ' ' << VtkUtil::vtkTypeNames[type] << std::endl;
else
s << "SCALARS " << name << ' ' << VtkUtil::vtkTypeNames[type] << ' ' << vals_per_tag << std::endl
<< "LOOKUP_TABLE default" << std::endl;
// Write the tag data
switch( type )
{
case MB_TYPE_OPAQUE:
return write_tag< unsigned char >( s, tag, entities, tagged, 0 );
case MB_TYPE_INTEGER:
return write_tag< int >( s, tag, entities, tagged, 0 );
case MB_TYPE_DOUBLE:
return write_tag< double >( s, tag, entities, tagged, 0 );
case MB_TYPE_BIT:
return write_bit_tag( s, tag, entities, tagged );
default:
return MB_FAILURE;
}
}
ErrorCode moab::WriteVtk::write_tag | ( | std::ostream & | stream, |
Tag | tag, | ||
const Range & | entities, | ||
const Range & | tagged_entities, | ||
const int | |||
) | [private] |
Write tag data.
Definition at line 507 of file WriteVtk.cpp.
References moab::Range::begin(), moab::Range::end(), ErrorCode, freeNodes, MB_SUCCESS, mbImpl, MBVERTEX, moab::SysUtil::setmem(), moab::Range::size(), t, T, moab::Interface::tag_get_data(), moab::Interface::tag_get_default_value(), moab::Interface::tag_get_length(), moab::Interface::tag_get_name(), moab::TYPE_FROM_HANDLE(), and write_data().
{
ErrorCode rval;
int addFreeNodes = 0;
if( TYPE_FROM_HANDLE( entities[0] ) > MBVERTEX ) addFreeNodes = freeNodes;
// we created freeNodes 1-node cells, so we have to augment cell data too
// we know that the 1 node cells are added at the end, after all other cells;
// so the default values will be set to those extra , artificial cells
const unsigned long n = entities.size() + addFreeNodes;
// Get tag properties
std::string name;
int vals_per_tag;
if( MB_SUCCESS != mbImpl->tag_get_name( tag, name ) || MB_SUCCESS != mbImpl->tag_get_length( tag, vals_per_tag ) )
return MB_FAILURE;
// Get a tag value for each entity. Do this by initializing the
// "data" vector with zero, and then filling in the values for
// the entities that actually have the tag set.
std::vector< T > data;
data.resize( n * vals_per_tag, 0 );
// If there is a default value for the tag, set the actual default value
std::vector< T > def_value( vals_per_tag );
rval = mbImpl->tag_get_default_value( tag, &( def_value[0] ) );
if( MB_SUCCESS == rval ) SysUtil::setmem( &( data[0] ), &( def_value[0] ), vals_per_tag * sizeof( T ), n );
Range::const_iterator t = tagged.begin();
typename std::vector< T >::iterator d = data.begin();
for( Range::const_iterator i = entities.begin(); i != entities.end() && t != tagged.end(); ++i, d += vals_per_tag )
{
if( *i == *t )
{
++t;
rval = mbImpl->tag_get_data( tag, &( *i ), 1, &( *d ) );
if( MB_SUCCESS != rval ) return rval;
}
}
// Write the tag values, one entity per line.
write_data( stream, data, vals_per_tag );
return MB_SUCCESS;
}
ErrorCode moab::WriteVtk::write_tags | ( | std::ostream & | stream, |
bool | nodes, | ||
const Range & | entities, | ||
const Tag * | tag_list, | ||
int | num_tags | ||
) | [private] |
Write all tags on either the list of nodes or the list of elements.
Definition at line 384 of file WriteVtk.cpp.
References moab::Range::empty(), ErrorCode, freeNodes, moab::Interface::get_entities_by_type_and_tag(), moab::WriteUtilIface::get_tag_list(), moab::intersect(), MB_SUCCESS, MB_TYPE_HANDLE, MBEDGE, MBENTITYSET, mbImpl, MBVERTEX, moab::Range::merge(), mStrict, moab::Range::size(), moab::Interface::tag_get_data_type(), moab::Interface::tag_get_length(), write_tag(), and writeTool.
Referenced by write_file().
{
ErrorCode rval;
// The #$%@#$% MOAB interface does not have a function to retrieve
// all entities with a tag, only all entities with a specified type
// and tag. Define types to loop over depending on the if vertex
// or element tag data is being written. It seems horribly inefficient
// to have the implementation subdivide the results by type and have
// to call that function once for each type just to recombine the results.
// Unfortunately, there doesn't seem to be any other way.
EntityType low_type, high_type;
if( nodes )
{
low_type = MBVERTEX;
high_type = MBEDGE;
}
else
{
low_type = MBEDGE;
high_type = MBENTITYSET;
}
// Get all defined tags
std::vector< Tag > tags;
std::vector< Tag >::iterator i;
rval = writeTool->get_tag_list( tags, tag_list, num_tags, false );
if( MB_SUCCESS != rval ) return rval;
// For each tag...
bool entities_have_tags = false;
for( i = tags.begin(); i != tags.end(); ++i )
{
// Skip tags holding entity handles -- no way to save them
DataType dtype;
rval = mbImpl->tag_get_data_type( *i, dtype );
if( MB_SUCCESS != rval ) return rval;
if( dtype == MB_TYPE_HANDLE ) continue;
// If in strict mode, don't write tags that do not fit in any
// attribute type (SCALAR : 1 to 4 values, VECTOR : 3 values, TENSOR : 9 values)
if( mStrict )
{
int count;
rval = mbImpl->tag_get_length( *i, count );
if( MB_SUCCESS != rval ) return rval;
if( count < 1 || ( count > 4 && count != 9 ) ) continue;
}
// Get subset of input entities that have the tag set
Range tagged;
for( EntityType type = low_type; type < high_type; ++type )
{
Range tmp_tagged;
rval = mbImpl->get_entities_by_type_and_tag( 0, type, &( *i ), 0, 1, tmp_tagged );
if( MB_SUCCESS != rval ) return rval;
tmp_tagged = intersect( tmp_tagged, entities );
tagged.merge( tmp_tagged );
}
// If any entities were tagged
if( !tagged.empty() )
{
// If this is the first tag being written for the
// entity type, write the label marking the beginning
// of the tag data.
if( !entities_have_tags )
{
entities_have_tags = true;
if( nodes )
stream << "POINT_DATA " << entities.size() << std::endl;
else
stream << "CELL_DATA " << entities.size() + freeNodes << std::endl;
}
// Write the tag
rval = write_tag( stream, *i, entities, tagged );
if( MB_SUCCESS != rval ) return rval;
}
}
return MB_SUCCESS;
}
bool moab::WriteVtk::createOneNodeCells [private] |
Definition at line 91 of file WriteVtk.hpp.
Referenced by write_elems(), and write_file().
int moab::WriteVtk::freeNodes [private] |
Definition at line 90 of file WriteVtk.hpp.
Referenced by write_elems(), write_tag(), and write_tags().
Interface* moab::WriteVtk::mbImpl [private] |
Definition at line 86 of file WriteVtk.hpp.
Referenced by gather_mesh(), write_bit_tag(), write_elems(), write_nodes(), write_tag(), write_tags(), and ~WriteVtk().
bool moab::WriteVtk::mStrict [private] |
Definition at line 89 of file WriteVtk.hpp.
Referenced by write_file(), and write_tags().
WriteUtilIface* moab::WriteVtk::writeTool [private] |
Definition at line 87 of file WriteVtk.hpp.
Referenced by write_file(), write_tags(), WriteVtk(), and ~WriteVtk().