![]() |
Mesh Oriented datABase
(version 5.4.1)
Array-based unstructured mesh datastructure
|
#include <WriteDamsel.hpp>
Public Types | |
enum | { DAMSEL_IS_TRACKING = 0x1 } |
Public Member Functions | |
WriteDamsel (Interface *impl) | |
Constructor. | |
virtual | ~WriteDamsel () |
Destructor. | |
ErrorCode | write_file (const char *file_name, const bool, const FileOptions &opts, const EntityHandle *meshset_list, const int num_sets, const std::vector< std::string > &, const Tag *=NULL, int=0, int=3) |
Primary interface function. | |
Static Public Member Functions | |
static WriterIface * | factory (Interface *iface) |
Factory function, for ReaderWriter. | |
Public Attributes | |
enum moab::WriteDamsel:: { ... } | DAMSEL_FLAGS |
Private Member Functions | |
ErrorCode | init_tag_info () |
Initialize global information about dense/sparse/conventional tags, once for entire write_file call. | |
ErrorCode | write_subrange (RangeSeqIntersectIter &rsi) |
Write a subrange of entities/sets; just a wrapper to write_[vertices, entities, sets]. | |
ErrorCode | write_vertices (RangeSeqIntersectIter &rsi) |
Write the vertices in the model, for the handles in the specified RangeSeqIntersectIter. | |
ErrorCode | write_entities (RangeSeqIntersectIter &rsi) |
Write the entities in the model, for the handles in the specified RangeSeqIntersectIter. | |
ErrorCode | write_sets (RangeSeqIntersectIter &rsi) |
Write the sets in the model, for the handles in the specified RangeSeqIntersectIter. | |
ErrorCode | map_dense_tags (RangeSeqIntersectIter &rsi, damsel_container &ent_cont) |
Map dense tags for the specified entities, using the specified damsel entity container. | |
ErrorCode | map_sparse_tags () |
Map sparse tags for all entities. | |
Private Attributes | |
Interface * | mbImpl |
Interface instance. | |
WriteUtilIface * | mWriteIface |
WriteUtil object used in this writer. | |
SequenceManager * | sequenceManager |
Used to initialize the RangeSeqIntersectIter. | |
std::string | fileName |
File name. | |
DamselUtil | dU |
Utility for storing damsel-specific stuff. |
Definition at line 41 of file WriteDamsel.hpp.
anonymous enum |
Definition at line 73 of file WriteDamsel.hpp.
{
DAMSEL_IS_TRACKING = 0x1
} DAMSEL_FLAGS;
moab::WriteDamsel::WriteDamsel | ( | Interface * | impl | ) |
Constructor.
Definition at line 74 of file WriteDamsel.cpp.
References moab::DamselUtil::collFlagsTag, dU, ErrorCode, MB_CHK_SET_ERR_CONT, MB_TAG_ANY, MB_TAG_CREAT, MB_TAG_DENSE, MB_TYPE_DOUBLE, MB_TYPE_INTEGER, mbImpl, moab::DamselUtil::moabHandleType, moab::DamselUtil::tinfo::mTagh, mWriteIface, moab::Interface::query_interface(), sequenceManager, moab::Interface::tag_get_handle(), moab::DamselUtil::tagMap, moab::DamselUtil::tinfo::tagType, moab::DamselUtil::xcoordsTag, moab::DamselUtil::ycoordsTag, and moab::DamselUtil::zcoordsTag.
Referenced by factory().
: mbImpl( impl ), mWriteIface( NULL ), sequenceManager( NULL ), dU(), DAMSEL_FLAGS( DAMSEL_IS_TRACKING )
{
assert( impl != NULL );
impl->query_interface( mWriteIface );
assert( mWriteIface );
sequenceManager = dynamic_cast< Core* >( impl )->sequence_manager();
assert( sequenceManager );
ErrorCode rval =
mbImpl->tag_get_handle( "mbdmsl_XCOORDS", 1, MB_TYPE_DOUBLE, dU.xcoordsTag.mTagh, MB_TAG_DENSE | MB_TAG_CREAT );MB_CHK_SET_ERR_CONT( rval, "Failed to create_tag mbdmsl_XCOORDS" );
dU.xcoordsTag.tagType = MB_TAG_ANY;
dU.tagMap.push_back( dU.xcoordsTag );
rval =
mbImpl->tag_get_handle( "mbdmsl_YCOORDS", 1, MB_TYPE_DOUBLE, dU.ycoordsTag.mTagh, MB_TAG_DENSE | MB_TAG_CREAT );MB_CHK_SET_ERR_CONT( rval, "Failed to create_tag mbdmsl_YCOORDS" );
dU.ycoordsTag.tagType = MB_TAG_ANY;
dU.tagMap.push_back( dU.ycoordsTag );
rval =
mbImpl->tag_get_handle( "mbdmsl_ZCOORDS", 1, MB_TYPE_DOUBLE, dU.zcoordsTag.mTagh, MB_TAG_DENSE | MB_TAG_CREAT );MB_CHK_SET_ERR_CONT( rval, "Failed to create_tag mbdmsl_ZCOORDS" );
dU.zcoordsTag.tagType = MB_TAG_ANY;
dU.tagMap.push_back( dU.zcoordsTag );
rval = mbImpl->tag_get_handle( "mbdmsl_COLL_FLAGS", 1, MB_TYPE_INTEGER, dU.collFlagsTag.mTagh,
MB_TAG_DENSE | MB_TAG_CREAT );MB_CHK_SET_ERR_CONT( rval, "Failed to create_tag mbdmsl_COLL_FLAGS" );
dU.collFlagsTag.tagType = MB_TAG_ANY;
dU.tagMap.push_back( dU.collFlagsTag );
/*
rval = mbImpl->tag_get_handle("mbdmsl_PARENTS", 1, MB_TYPE_HANDLE,
dU.parentsTag.mTagh, MB_TAG_DENSE | MB_TAG_CREAT |
MB_TAG_VARLEN);MB_CHK_SET_ERR_CONT(rval, "Failed to create_tag mbdmsl_PARENTS");
dU.parentsTag.tagType = MB_TAG_DENSE;
dU.tagMap.push_back(dU.parentsTag);
rval = mbImpl->tag_get_handle("mbdmsl_CHILDREN", 1, MB_TYPE_HANDLE,
dU.childrenTag.mTagh, MB_TAG_DENSE | MB_TAG_CREAT |
MB_TAG_VARLEN);MB_CHK_SET_ERR_CONT(rval, "Failed to create_tag mbdmsl_CHILDREN");
dU.childrenTag.tagType = MB_TAG_DENSE;
dU.tagMap.push_back(dU.childrenTag);
*/
dU.moabHandleType = ( sizeof( EntityHandle ) == 64 ? DAMSEL_HANDLE_TYPE_HANDLE64 : DAMSEL_HANDLE_TYPE_HANDLE32 );
}
moab::WriteDamsel::~WriteDamsel | ( | ) | [virtual] |
Destructor.
Definition at line 121 of file WriteDamsel.cpp.
References mbImpl, mWriteIface, and moab::Interface::release_interface().
{
if( mWriteIface ) mbImpl->release_interface( mWriteIface );
}
WriterIface * moab::WriteDamsel::factory | ( | Interface * | iface | ) | [static] |
Factory function, for ReaderWriter.
Definition at line 69 of file WriteDamsel.cpp.
References WriteDamsel().
Referenced by moab::ReaderWriterSet::ReaderWriterSet().
{
return new WriteDamsel( iface );
}
ErrorCode moab::WriteDamsel::init_tag_info | ( | ) | [private] |
Initialize global information about dense/sparse/conventional tags, once for entire write_file call.
Definition at line 194 of file WriteDamsel.cpp.
References CHK_DMSL_ERR, moab::DamselUtil::collFlagsTag, moab::DamselUtil::dmslModel, dU, ErrorCode, moab::TagInfo::get_name(), MB_CHK_SET_ERR, MB_SUCCESS, MB_TAG_ANY, MB_TAG_DENSE, MB_TAG_SPARSE, MB_TYPE_DOUBLE, MB_TYPE_INTEGER, MB_VARIABLE_DATA_LENGTH, mbImpl, moab::DamselUtil::tinfo::mTagh, moab::DamselUtil::mtod_data_type, moab::Interface::tag_get_length(), moab::Interface::tag_get_tags(), moab::DamselUtil::tagMap, moab::DamselUtil::xcoordsTag, moab::DamselUtil::ycoordsTag, and moab::DamselUtil::zcoordsTag.
Referenced by write_file().
{
// Initialize allTags and tagIndices
std::vector< Tag > tmp_mtags;
ErrorCode rval = mbImpl->tag_get_tags( tmp_mtags );MB_CHK_SET_ERR( rval, "Failed to get all tag handles." );
int dum_size;
damsel_err_t err;
// Define damsel tag handles for all dense/sparse tags
for( std::vector< Tag >::iterator vit = tmp_mtags.begin(); vit != tmp_mtags.end(); ++vit )
{
if( ( ( *vit )->get_storage_type() != MB_TAG_DENSE && ( *vit )->get_storage_type() != MB_TAG_SPARSE ) ||
mbImpl->tag_get_length( *vit, dum_size ) == MB_VARIABLE_DATA_LENGTH || dum_size != 1 )
{
std::cerr << "Warning: tag " << ( *vit )->get_name()
<< "is not of type dense or sparse, and is not currently supported by the "
"damsel writer."
<< std::endl;
continue;
}
std::vector< DamselUtil::tinfo >::iterator vit2 =
std::find_if( dU.tagMap.begin(), dU.tagMap.end(), DamselUtil::MtagP< DamselUtil::tinfo >( *vit ) );
if( vit2 != dU.tagMap.end() && ( *vit2 ).tagType == MB_TAG_ANY )
// Conventional tag - skip
continue;
else if( vit2 == dU.tagMap.end() )
{
// Create a damsel counterpart for this tag
Tag thandle = *vit;
err = DMSLtag_define( dU.dmslModel, (damsel_handle_ptr)&thandle,
DamselUtil::mtod_data_type[( *vit )->get_data_type()], ( *vit )->get_name().c_str() );
CHK_DMSL_ERR( err, "Failure to get Damsel tag for MOAB tag" );
dU.tagMap.push_back( DamselUtil::tinfo( thandle, 0, ( *vit )->get_storage_type() ) );
}
else
{
// Assert there's a corresponding moab tag handle
assert( ( *vit2 ).mTagh );
}
}
// Do the same for conventional tags:
// XCOORDS
err = DMSLtag_define( dU.dmslModel, ( damsel_handle_ptr ) & ( dU.xcoordsTag.mTagh ),
DamselUtil::mtod_data_type[MB_TYPE_DOUBLE], dU.xcoordsTag.mTagh->get_name().c_str() );
dU.tagMap.push_back( dU.xcoordsTag );
CHK_DMSL_ERR( err, "Failure to get Damsel tag for MOAB tag" );
// YCOORDS
err = DMSLtag_define( dU.dmslModel, ( damsel_handle_ptr ) & ( dU.ycoordsTag.mTagh ),
DamselUtil::mtod_data_type[MB_TYPE_DOUBLE], dU.ycoordsTag.mTagh->get_name().c_str() );
dU.tagMap.push_back( dU.ycoordsTag );
CHK_DMSL_ERR( err, "Failure to get Damsel tag for MOAB tag" );
// ZCOORDS
err = DMSLtag_define( dU.dmslModel, ( damsel_handle_ptr ) & ( dU.zcoordsTag.mTagh ),
DamselUtil::mtod_data_type[MB_TYPE_DOUBLE], dU.zcoordsTag.mTagh->get_name().c_str() );
dU.tagMap.push_back( dU.zcoordsTag );
CHK_DMSL_ERR( err, "Failure to get Damsel tag for MOAB tag" );
// COLL_FLAGS
err = DMSLtag_define( dU.dmslModel, ( damsel_handle_ptr ) & ( dU.collFlagsTag.mTagh ),
DamselUtil::mtod_data_type[MB_TYPE_INTEGER], dU.collFlagsTag.mTagh->get_name().c_str() );
dU.tagMap.push_back( dU.collFlagsTag );
CHK_DMSL_ERR( err, "Failure to get Damsel tag for MOAB tag" );
/*
SKIP PARENTS/CHILDREN FOR NOW, UNTIL WE HAVE VAR LENGTH TAGS IN DAMSEL
// PARENTS
dU.parentsTagPair.second = DMSLtag_define(dU.dmslModel,
(damsel_handle_ptr)&(dU.collFlagsTagPair.first),
DamselUtil::mtod_data_type[(dU.collFlagsTagPair.first)->get_data_type()],
(dU.parentsTagPair.first)->get_name().c_str());
if (DAMSEL_TAG_INVALID == dtag)
MB_SET_ERR(MB_FAILURE, "Failure to get Damsel tag for MOAB tag " <<
(dU.parentsTagPair.first)->get_name());
// CHILDREN
dU.childrenTagPair.second = DMSLtag_define(dU.dmslModel,
(damsel_handle_ptr)&(dU.collFlagsTagPair.first),
DamselUtil::mtod_data_type[(dU.collFlagsTagPair.first)->get_data_type()],
(dU.childrenTagPair.first)->get_name().c_str());
if (DAMSEL_TAG_INVALID == dtag)
MB_SET_ERR(MB_FAILURE, "Failure to get Damsel tag for MOAB tag " <<
(dU.childrenTagPair.first)->get_name());
*/
// Map the tag handles in one big call
int num_tags = dU.tagMap.size();
std::vector< Tag > moab_taghs;
moab_taghs.reserve( num_tags );
for( std::vector< DamselUtil::tinfo >::iterator vit = dU.tagMap.begin(); vit != dU.tagMap.end(); ++vit )
{
moab_taghs.push_back( ( *vit ).mTagh );
}
damsel_container mtags =
DMSLcontainer_create_vector( dU.dmslModel, (damsel_handle_ptr)&moab_taghs[0], moab_taghs.size() );
std::cerr << "MOAB: created model container: mtags = " << mtags << std::endl;
err = DMSLmodel_map_handles_inventing_file_handles( mtags );
CHK_DMSL_ERR( err, "Failed to map tag handles" );
err = DMSLcontainer_release( mtags );
CHK_DMSL_ERR( err, "Problem releasing tag handle container" );
return MB_SUCCESS;
}
ErrorCode moab::WriteDamsel::map_dense_tags | ( | RangeSeqIntersectIter & | rsi, |
damsel_container & | ent_cont | ||
) | [private] |
Map dense tags for the specified entities, using the specified damsel entity container.
Definition at line 417 of file WriteDamsel.cpp.
References CHK_DMSL_ERR, dU, ErrorCode, moab::DenseTag::get_array(), moab::RangeSeqIntersectIter::get_sequence(), moab::RangeSeqIntersectIter::get_start_handle(), MB_CHK_SET_ERR, MB_SUCCESS, MB_TAG_DENSE, and moab::DamselUtil::tagMap.
Referenced by write_entities(), write_sets(), and write_vertices().
{
// All dense_tags have been initialized before this, so here we just go through
// them and map data if there is any
const unsigned char* val_ptr;
ErrorCode rval = MB_SUCCESS;
std::vector< DamselUtil::tinfo >::iterator tagit;
damsel_err_t err;
for( tagit = dU.tagMap.begin(); tagit != dU.tagMap.end(); ++tagit )
{
if( ( *tagit ).tagType != MB_TAG_DENSE ) continue;
// Get a ptr to memory for this tag/sequence
DenseTag* dtag = dynamic_cast< DenseTag* >( ( *tagit ).mTagh );
assert( dtag );
rval = dtag->get_array( rsi.get_sequence(), val_ptr );MB_CHK_SET_ERR( rval, "Failed to get tag coordinates pointer for vertices starting with handle "
<< rsi.get_start_handle() );
// If ptr is NULL, no data for this tag in this sequence
if( !val_ptr ) continue;
// Else, register with damsel
err = DMSLmodel_map_tag( (void*)val_ptr, ent_cont, (damsel_handle_ptr)&dtag );
CHK_DMSL_ERR( err,
"Failed to write coordinates tag for vertices starting with handle " << rsi.get_start_handle() );
}
return rval;
}
ErrorCode moab::WriteDamsel::map_sparse_tags | ( | ) | [private] |
Map sparse tags for all entities.
Definition at line 447 of file WriteDamsel.cpp.
References moab::Range::begin(), CHK_DMSL_ERR, moab::DamselUtil::dmslModel, dU, moab::Range::empty(), moab::Range::end(), ErrorCode, moab::TagInfo::get_name(), moab::TagInfo::get_size(), moab::SparseTag::get_tagged_entities(), MB_CHK_SET_ERR, MB_SET_ERR, MB_SUCCESS, MB_TAG_SPARSE, mbImpl, sequenceManager, moab::Range::size(), moab::Interface::tag_get_data(), and moab::DamselUtil::tagMap.
Referenced by write_file().
{
// All sparse_tags have been initialized before this, so here we just go through
// them and map data if there is any
ErrorCode rval = MB_SUCCESS;
damsel_err_t err;
std::vector< DamselUtil::tinfo >::iterator tagit;
std::vector< unsigned char > tag_values;
std::vector< EntityHandle > tagged_ents;
damsel_container ent_cont;
for( tagit = dU.tagMap.begin(); tagit != dU.tagMap.end(); ++tagit )
{
if( ( *tagit ).tagType != MB_TAG_SPARSE ) continue;
// Get a ptr to memory for this tag/sequence
SparseTag* stag = dynamic_cast< SparseTag* >( ( *tagit ).mTagh );
assert( stag );
Range output_ents;
rval = stag->get_tagged_entities( sequenceManager, output_ents );MB_CHK_SET_ERR( rval, "Trouble getting tagged entities for tag " << stag->get_name() );
// If no entities have this tag set, don't map it
if( output_ents.empty() ) continue;
// Else, register with damsel
// Allocate space for and get values
tag_values.resize( stag->get_size() * output_ents.size() );
rval = mbImpl->tag_get_data( stag, output_ents, &tag_values[0] );MB_CHK_SET_ERR( rval, "Trouble getting tag values for tag " << stag->get_name() );
// Build a vector of entity handles from the range, and a container from that
tagged_ents.resize( output_ents.size() );
std::copy( output_ents.begin(), output_ents.end(), tagged_ents.begin() );
ent_cont = DMSLcontainer_create_vector( dU.dmslModel, (damsel_handle_ptr)&tagged_ents[0], tagged_ents.size() );
std::cerr << "MOAB: created model container: sparse_tag_ent_cont = " << ent_cont << std::endl;
if( DAMSEL_CONTAINER_INVALID == ent_cont )
MB_SET_ERR( MB_FAILURE, "Trouble creating entity handle container for tag " << stag->get_name() );
// Now map it
err = DMSLmodel_map_tag( (void*)&tag_values[0], ent_cont, (damsel_handle_ptr)&stag );
CHK_DMSL_ERR( err, "Failed to write tag " << stag->get_name() );
err = DMSLcontainer_release( ent_cont );
CHK_DMSL_ERR( err, "Problem releasing entity handle container" );
}
return rval;
}
ErrorCode moab::WriteDamsel::write_entities | ( | RangeSeqIntersectIter & | rsi | ) | [private] |
Write the entities in the model, for the handles in the specified RangeSeqIntersectIter.
rsi | Range sequence iterator defining range of entities/sets to be written |
Definition at line 372 of file WriteDamsel.cpp.
References moab::Range::begin(), CHK_DMSL_ERR, moab::Interface::connect_iterate(), moab::DamselUtil::dmslModel, dU, moab::Range::end(), ErrorCode, moab::RangeSeqIntersectIter::get_end_handle(), moab::RangeSeqIntersectIter::get_sequence(), moab::RangeSeqIntersectIter::get_start_handle(), map_dense_tags(), MB_CHK_ERR, MB_CHK_SET_ERR, MB_SET_ERR, MB_SUCCESS, mbImpl, MBMAXTYPE, moab::DamselUtil::mtod_entity_type, moab::Range::size(), moab::Interface::type_from_handle(), and moab::EntitySequence::values_per_entity().
Referenced by write_subrange().
{
// Write the entities; these entities will be in the same sequence and will be contiguous,
// guaranteed
EntityHandle start_ent = rsi.get_start_handle(), end_ent = rsi.get_end_handle();
// Create a damsel container for these entity handles
damsel_container ent_cont;
ent_cont = DMSLcontainer_create_sequence( dU.dmslModel, start_ent, (int)( end_ent - start_ent + 1 ), 1 );
std::cerr << "MOAB: created model container: ent_cont = " << ent_cont << std::endl;
if( DAMSEL_CONTAINER_INVALID == ent_cont ) MB_SET_ERR( MB_FAILURE, "Bad sequence returned by Damsel" );
damsel_err_t err = DMSLmodel_map_handles_inventing_file_handles( ent_cont );
CHK_DMSL_ERR( err, "Failed to map handles" );
// Get # verts per entity and entity type
EntityType etype = mbImpl->type_from_handle( start_ent );
assert( MBMAXTYPE != etype );
int num_connect = rsi.get_sequence()->values_per_entity();
assert( 0 < num_connect );
// Get the connectivity storage location and pass to damsel
Range ent_range( start_ent, end_ent );
int count;
EntityHandle* connect;
int verts_per_ent;
ErrorCode rval = mbImpl->connect_iterate( ent_range.begin(), ent_range.end(), connect, verts_per_ent, count );MB_CHK_SET_ERR( rval,
"Failed to get connect iterator for entities starting with handle " << rsi.get_start_handle() );
if( count != (int)ent_range.size() )
MB_SET_ERR( MB_FAILURE, "Entity subrange not in the same sequence for entities starting with handle "
<< rsi.get_start_handle() );
// Define the entities to damsel
err = DMSLentity_define_fast( ent_cont, DamselUtil::mtod_entity_type[etype], num_connect, (damsel_handle*)connect );
CHK_DMSL_ERR( err, "DMSLentity_define failed for entities starting with handle " << rsi.get_start_handle() );
// Write dense tags
rval = map_dense_tags( rsi, ent_cont );MB_CHK_ERR( rval );
err = DMSLcontainer_release( ent_cont );
CHK_DMSL_ERR( err, "Problem releasing entity handle container" );
return MB_SUCCESS;
}
ErrorCode moab::WriteDamsel::write_file | ( | const char * | file_name, |
const bool | , | ||
const FileOptions & | opts, | ||
const EntityHandle * | meshset_list, | ||
const int | num_sets, | ||
const std::vector< std::string > & | , | ||
const Tag * | = NULL , |
||
int | = 0 , |
||
int | = 3 |
||
) | [virtual] |
Primary interface function.
file_name | Filename being written |
overwrite | If true and the file exists, an error is returned |
opts | File options, e.g. whether and how to write in parallel |
meshset_list | If non-NULL, a vector of sets defining what is to be written |
num_sets | The number of sets to be written, only used if meshset_list is non-NULL |
qa_records | Strings defining provenance information |
tag_list | If non-NULL, only these tags should be written |
num_tags | The number of tag handles in tag_list, used only if tag_list is non-NULL |
requested_output_dimension | Dimension used for coordinates |
Implements moab::WriterIface.
Definition at line 126 of file WriteDamsel.cpp.
References moab::Range::begin(), CHK_DMSL_ERR, moab::DamselUtil::dmslLib, moab::DamselUtil::dmslModel, dU, moab::Range::empty(), moab::Range::end(), ErrorCode, moab::WriteUtilIface::gather_entities(), moab::RangeSeqIntersectIter::init(), init_tag_info(), map_sparse_tags(), MB_CHK_ERR, MB_CHK_SET_ERR, MB_ENTITY_NOT_FOUND, MB_SUCCESS, mWriteIface, sequenceManager, moab::RangeSeqIntersectIter::step(), and write_subrange().
{
// Gather all entities into one big range
Range all_ents;
ErrorCode rval;
damsel_err_t err;
dU.dmslLib = DMSLlib_init();
// Create a damsel model
dU.dmslModel =
DMSLmodel_create( sizeof( EntityHandle ) == 8 ? DAMSEL_HANDLE_TYPE_HANDLE64 : DAMSEL_HANDLE_TYPE_HANDLE32 );
// Attach to a file, since we need it for creating containers
MPI_Comm comm = MPI_COMM_WORLD;
unlink( file_name );
err = DMSLmodel_attach( dU.dmslModel, file_name, comm, NULL );
CHK_DMSL_ERR( err, "DMSLmodel_attach failed" );
rval = mWriteIface->gather_entities( all_ents, meshset_list, num_sets );MB_CHK_SET_ERR( rval, "Gather entities failed in WriteDamsel" );
if( all_ents.empty() ) return MB_SUCCESS;
// Create damsel tags for MOAB dense, sparse, and conventional tags
rval = init_tag_info();MB_CHK_ERR( rval );
// Iterate through the groups of contiguous sequences of handles
RangeSeqIntersectIter rsi( sequenceManager );
rval = rsi.init( all_ents.begin(), all_ents.end() );
while( MB_SUCCESS == rval )
{
// Write subrange of things to damsel: map handles, map entity definition data
// (connectivity/coords/set contents), map dense tags
rval = write_subrange( rsi );MB_CHK_SET_ERR( rval, "Failed to write subrange" );
rval = rsi.step();
while( MB_ENTITY_NOT_FOUND == rval )
rval = rsi.step();
}
// Write sparse tags
rval = map_sparse_tags();MB_CHK_SET_ERR( rval, "Failed to write sparse tags" );
// damsel_request_t request;
// err = DMSLmodel_transfer_async(dU.dmslModel, DAMSEL_TRANSFER_TYPE_WRITE, &request);
err = DMSLmodel_transfer_sync( dU.dmslModel, DAMSEL_TRANSFER_TYPE_WRITE );
CHK_DMSL_ERR( err, "DMSLmodel_transfer_asynch failed" );
// damsel_status_t status;
// err = DMSLmodel_wait(request, &status);CHK_DMSL_ERR(err, "DMSLmodel_wait failed");
DMSLmodel_close( dU.dmslModel );
DMSLlib_finalize( dU.dmslLib );
// We should be done
return MB_SUCCESS;
}
ErrorCode moab::WriteDamsel::write_sets | ( | RangeSeqIntersectIter & | rsi | ) | [private] |
Write the sets in the model, for the handles in the specified RangeSeqIntersectIter.
rsi | Range sequence iterator defining range of entities/sets to be written |
Definition at line 493 of file WriteDamsel.cpp.
References CHK_DMSL_ERR, moab::DamselUtil::collFlagsTag, moab::DamselUtil::dmslModel, dU, ErrorCode, moab::RangeSeqIntersectIter::get_end_handle(), moab::Interface::get_entities_by_handle(), moab::Interface::get_meshset_options(), moab::RangeSeqIntersectIter::get_start_handle(), map_dense_tags(), MB_CHK_SET_ERR, MB_SUCCESS, mbImpl, MESHSET_SET, MESHSET_TRACK_OWNER, and moab::DamselUtil::tinfo::mTagh.
{
// Write the sets
ErrorCode rval = MB_SUCCESS;
std::vector< EntityHandle > ents;
damsel_container mcont;
damsel_err_t err;
unsigned int i, num_sets = rsi.get_end_handle() - rsi.get_start_handle() + 1;
std::vector< unsigned int > set_flags( num_sets, 0 );
EntityHandle seth;
for( seth = rsi.get_start_handle(), i = 0; seth <= rsi.get_end_handle(); seth++, i++ )
{
// Get all the entities in the set
ents.clear();
rval = mbImpl->get_entities_by_handle( seth, ents );MB_CHK_SET_ERR( rval, "get_entities_by_handle failed for set " << seth );
if( !ents.empty() )
{
mcont = DMSLcontainer_create_vector( dU.dmslModel, (damsel_handle*)&ents[0], ents.size() );
}
else
{
mcont = DMSLcontainer_create_vector( dU.dmslModel, (damsel_handle*)NULL, 0 );
}
std::cerr << "MOAB: created model container: sets_cont = " << mcont << std::endl;
// Get the set type (range or set)
unsigned int opts;
rval = mbImpl->get_meshset_options( seth, opts );MB_CHK_SET_ERR( rval, "Failed to get options for meshset " << seth );
damsel_collection_type coll_type =
( opts & MESHSET_SET ? DAMSEL_HANDLE_COLLECTION_TYPE_SET : DAMSEL_HANDLE_COLLECTION_TYPE_VECTOR );
// Parents/children...
// Set flags
if( opts & MESHSET_TRACK_OWNER )
set_flags[i] |= MESHSET_TRACK_OWNER;
else
set_flags[i] &= !MESHSET_TRACK_OWNER;
// Create the collection
DMSLcoll_create( dU.dmslModel, (damsel_handle_ptr)&seth, mcont, coll_type );
// Release the container
err = DMSLcontainer_release( mcont );
CHK_DMSL_ERR( err, "Problem releasing set entity handle container" );
}
// Set the COLL_FLAGS tag, using assign (direct)
// Make a container of set handles...
mcont = DMSLcontainer_create_sequence( dU.dmslModel, rsi.get_start_handle(), num_sets, 1 );
std::cerr << "MOAB: created model container: sets_cont = " << mcont << std::endl;
// Assign the tags on them
err = DMSLmodel_map_tag( &set_flags[0], mcont, ( damsel_handle_ptr ) & ( dU.collFlagsTag.mTagh ) );
CHK_DMSL_ERR( err, "Failed to assign COLL_FLAGS tag for sets" );
// Map set handles
err = DMSLmodel_map_handles_inventing_file_handles( mcont );
CHK_DMSL_ERR( err, "Failed to map set handles" );
// Map other dense tags
rval = map_dense_tags( rsi, mcont );MB_CHK_SET_ERR( rval, "Failed to map dense tags for sets" );
return rval;
}
ErrorCode moab::WriteDamsel::write_subrange | ( | RangeSeqIntersectIter & | rsi | ) | [inline, private] |
Write a subrange of entities/sets; just a wrapper to write_[vertices, entities, sets].
Definition at line 120 of file WriteDamsel.hpp.
References ErrorCode, moab::RangeSeqIntersectIter::get_start_handle(), MB_SUCCESS, MBENTITYSET, mbImpl, MBVERTEX, moab::Interface::type_from_handle(), write_entities(), and write_vertices().
Referenced by write_file().
{
ErrorCode rval = MB_SUCCESS;
if( MBVERTEX == mbImpl->type_from_handle( rsi.get_start_handle() ) )
rval = write_vertices( rsi );
else if( MBENTITYSET > mbImpl->type_from_handle( rsi.get_start_handle() ) )
rval = write_entities( rsi );
// else
// rval = write_sets(rsi);
return rval;
}
ErrorCode moab::WriteDamsel::write_vertices | ( | RangeSeqIntersectIter & | rsi | ) | [private] |
Write the vertices in the model, for the handles in the specified RangeSeqIntersectIter.
rsi | Range sequence iterator defining range of entities/sets to be written |
Definition at line 307 of file WriteDamsel.cpp.
References CHK_DMSL_ERR, moab::Interface::coords_iterate(), moab::DamselUtil::dmslModel, dU, ErrorCode, moab::RangeSeqIntersectIter::get_end_handle(), moab::RangeSeqIntersectIter::get_start_handle(), map_dense_tags(), MB_CHK_ERR, MB_CHK_SET_ERR, MB_SET_ERR, MB_SUCCESS, mbImpl, moab::DamselUtil::tinfo::mTagh, moab::DamselUtil::xcoordsTag, moab::DamselUtil::ycoordsTag, and moab::DamselUtil::zcoordsTag.
Referenced by write_subrange().
{
// Write the vertices; these vertices will be in the same sequence and will be contiguous,
// guaranteed
EntityHandle start_vert = rsi.get_start_handle(), end_vert = rsi.get_end_handle();
// Create a damsel container for these vertex handles
damsel_container vertex_cont =
DMSLcontainer_create_sequence( dU.dmslModel, start_vert, (int)( end_vert - start_vert + 1 ), 1 );
std::cerr << "MOAB: created model container: vertex_cont = " << vertex_cont << std::endl;
if( DAMSEL_CONTAINER_INVALID == vertex_cont )
MB_SET_ERR( MB_FAILURE,
"Failed to create vertex sequence for vertices starting with handle " << rsi.get_start_handle() );
damsel_err_t err = DMSLmodel_map_handles_inventing_file_handles( vertex_cont );
CHK_DMSL_ERR( err, "Failed to map handles" );
// Define the entities to damsel
err = DMSLentity_define( vertex_cont, DAMSEL_ENTITY_TYPE_VERTEX, 1, vertex_cont );
CHK_DMSL_ERR( err, "Failure in DMSLentity_define for vertices starting with handle " << rsi.get_start_handle() );
// Get the vertex coordinates storage locations and pass to damsel
Range vert_range( start_vert, end_vert );
double *xcoords = NULL, *ycoords = NULL, *zcoords = NULL;
int count;
ErrorCode rval = mbImpl->coords_iterate( vert_range.begin(), vert_range.end(), xcoords, ycoords, zcoords, count );MB_CHK_SET_ERR( rval,
"Failed to get coordinate iterator for vertices starting with handle " << rsi.get_start_handle() );
if( count != (int)vert_range.size() )
{
MB_SET_ERR( MB_FAILURE, "Vertex subrange not in the same sequence for vertices starting with handle "
<< rsi.get_start_handle() );
}
if( xcoords && !ycoords && !zcoords )
{
// Interleaved
// Map the data to damsel
err = DMSLmodel_map_tag( xcoords, vertex_cont, (damsel_handle_ptr)&dU.xcoordsTag.mTagh );
CHK_DMSL_ERR( err, "Failed to assign vertex coordinates tag for vertices starting with handle "
<< rsi.get_start_handle() );
}
else
{
// Map the data to damsel
err = DMSLmodel_map_tag( xcoords, vertex_cont, (damsel_handle_ptr)&dU.xcoordsTag.mTagh );
CHK_DMSL_ERR( err, "Failed to assign vertex x coordinates tag for vertices starting with handle "
<< rsi.get_start_handle() );
err = DMSLmodel_map_tag( ycoords, vertex_cont, (damsel_handle_ptr)&dU.ycoordsTag.mTagh );
CHK_DMSL_ERR( err, "Failed to assign vertex y coordinates tag for vertices starting with handle "
<< rsi.get_start_handle() );
err = DMSLmodel_map_tag( zcoords, vertex_cont, (damsel_handle_ptr)&dU.zcoordsTag.mTagh );
CHK_DMSL_ERR( err, "Failed to assign vertex z coordinates tag for vertices starting with handle "
<< rsi.get_start_handle() );
}
// Write/map dense tags
rval = map_dense_tags( rsi, vertex_cont );MB_CHK_ERR( rval );
err = DMSLcontainer_release( vertex_cont );
CHK_DMSL_ERR( err, "Problem releasing vertex handle container" );
return MB_SUCCESS;
}
enum { ... } moab::WriteDamsel::DAMSEL_FLAGS |
DamselUtil moab::WriteDamsel::dU [private] |
Utility for storing damsel-specific stuff.
Definition at line 117 of file WriteDamsel.hpp.
Referenced by init_tag_info(), map_dense_tags(), map_sparse_tags(), write_entities(), write_file(), write_sets(), write_vertices(), and WriteDamsel().
std::string moab::WriteDamsel::fileName [private] |
File name.
Definition at line 114 of file WriteDamsel.hpp.
Interface* moab::WriteDamsel::mbImpl [private] |
Interface instance.
Definition at line 105 of file WriteDamsel.hpp.
Referenced by init_tag_info(), map_sparse_tags(), write_entities(), write_sets(), write_subrange(), write_vertices(), WriteDamsel(), and ~WriteDamsel().
WriteUtilIface* moab::WriteDamsel::mWriteIface [private] |
WriteUtil object used in this writer.
Definition at line 108 of file WriteDamsel.hpp.
Referenced by write_file(), WriteDamsel(), and ~WriteDamsel().
Used to initialize the RangeSeqIntersectIter.
Definition at line 111 of file WriteDamsel.hpp.
Referenced by map_sparse_tags(), write_file(), and WriteDamsel().