MOAB: Mesh Oriented datABase  (version 5.4.1)
moab::WriteDamsel Class Reference

#include <WriteDamsel.hpp>

+ Inheritance diagram for moab::WriteDamsel:
+ Collaboration diagram for moab::WriteDamsel:

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)

Static Public Member Functions

static WriterIfacefactory (Interface *iface)
 Factory function, for ReaderWriter.

Public Attributes

enum moab::WriteDamsel:: { ... }  DAMSEL_FLAGS

Private Member Functions

ErrorCode init_tag_info ()
ErrorCode write_subrange (RangeSeqIntersectIter &rsi)
 Write a subrange of entities/sets; just a wrapper to write_[vertices, entities, sets].
ErrorCode write_vertices (RangeSeqIntersectIter &rsi)
ErrorCode write_entities (RangeSeqIntersectIter &rsi)
ErrorCode write_sets (RangeSeqIntersectIter &rsi)
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

InterfacembImpl
 Interface instance.
WriteUtilIfacemWriteIface
 WriteUtil object used in this writer.
SequenceManagersequenceManager
 Used to initialize the RangeSeqIntersectIter.
std::string fileName
 File name.
DamselUtil dU
 Utility for storing damsel-specific stuff.

Detailed Description

Definition at line 41 of file WriteDamsel.hpp.


Member Enumeration Documentation

anonymous enum
Enumerator:
DAMSEL_IS_TRACKING 

Definition at line 73 of file WriteDamsel.hpp.


Constructor & Destructor Documentation

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 );
}

Destructor.

Definition at line 121 of file WriteDamsel.cpp.

References mbImpl, mWriteIface, and moab::Interface::release_interface().


Member Function Documentation

Factory function, for ReaderWriter.

Definition at line 69 of file WriteDamsel.cpp.

References WriteDamsel().

Referenced by moab::ReaderWriterSet::ReaderWriterSet().

{
    return new WriteDamsel( iface );
}

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;
}

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;
}

Write the entities in the model, for the handles in the specified RangeSeqIntersectIter

Parameters:
rsiRange 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

Parameters:
file_nameFilename being written
overwriteIf true and the file exists, an error is returned
optsFile options, e.g. whether and how to write in parallel
meshset_listIf non-NULL, a vector of sets defining what is to be written
num_setsThe number of sets to be written, only used if meshset_list is non-NULL
qa_recordsStrings defining provenance information
tag_listIf non-NULL, only these tags should be written
num_tagsThe number of tag handles in tag_list, used only if tag_list is non-NULL
requested_output_dimensionDimension 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, MPI_COMM_WORLD, 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;
}

Write the sets in the model, for the handles in the specified RangeSeqIntersectIter

Parameters:
rsiRange 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;
}

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;
}

Write the vertices in the model, for the handles in the specified RangeSeqIntersectIter

Parameters:
rsiRange 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;
}

Member Data Documentation

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.

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().

List of all members.


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