Mesh Oriented datABase
(version 5.4.1)
Array-based unstructured mesh datastructure
|
#include <ReadCCMIO.hpp>
Public Types | |
typedef std::map< int, std::vector< EntityHandle > > | TupleList |
typedef std::map< int, std::vector< int > > | SenseList |
Public Member Functions | |
ReadCCMIO (Interface *impl) | |
Constructor. | |
virtual | ~ReadCCMIO () |
Destructor. | |
ErrorCode | load_file (const char *file_name, const EntityHandle *file_set, const FileOptions &opts, const SubsetList *subset_list=0, const Tag *file_id_tag=0) |
Load mesh from a file. | |
Static Public Member Functions | |
static ReaderIface * | factory (Interface *) |
Private Member Functions | |
ErrorCode | read_processor (CCMIOID rootID, CCMIOID problemID, CCMIOID processorID, CCMIOID verticesID, CCMIOID topologyID, CCMIOSize_t proc, Range *new_ents) |
ErrorCode | read_cells (CCMIOSize_t proc, CCMIOID processorID, CCMIOID verticesID, CCMIOID topologyID, TupleList &vert_map, Range *new_cells) |
ErrorCode | construct_cells (TupleList &face_map, SenseList &sense_map, TupleList &vert_map, std::map< int, int > &cell_topo_types, std::vector< EntityHandle > &new_cells) |
ErrorCode | ccmio_to_moab_type (int ccm_type, EntityType &moab_type, bool &has_mid_nodes) |
ErrorCode | create_cell_from_faces (std::vector< EntityHandle > &facehs, std::vector< int > &senses, EntityType this_type, bool has_mid_nodes, EntityHandle &cell) |
ErrorCode | read_gids_and_types (CCMIOID problemID, CCMIOID topologyID, std::vector< EntityHandle > &cells) |
ErrorCode | read_all_faces (CCMIOID topologyID, TupleList &vert_map, TupleList &face_map, SenseList &sense_map, Range *new_faces) |
ErrorCode | read_faces (CCMIOID faceID, CCMIOEntity bdy_or_int, TupleList &vert_map, TupleList &face_map, SenseList &sense_map, Range *new_faces) |
ErrorCode | make_faces (int *farray, TupleList &vert_map, std::vector< EntityHandle > &new_faces, int num_faces) |
ErrorCode | read_vertices (CCMIOSize_t proc, CCMIOID processorID, CCMIOID verticesID, CCMIOID topologyID, Range *verts, TupleList &vert_map) |
ErrorCode | get_processors (CCMIOID stateID, CCMIOID &processorID, CCMIOID &verticesID, CCMIOID &topologyID, CCMIOID &solutionID, std::vector< CCMIOSize_t > &procs, bool &has_solution) |
ErrorCode | get_state (CCMIOID rootID, CCMIOID &problemID, CCMIOID &stateID) |
ErrorCode | read_tag_values (const char *file_name, const char *tag_name, const FileOptions &opts, std::vector< int > &tag_values_out, const SubsetList *subset_list=0) |
Read tag values from a file. | |
ErrorCode | load_matset_data (CCMIOID problemID) |
ErrorCode | load_neuset_data (CCMIOID problemID) |
ErrorCode | load_metadata (CCMIOID rootID, CCMIOID problemID, CCMIOID stateID, CCMIOID processorID, const EntityHandle *file_set) |
ErrorCode | read_topology_types (CCMIOID &topologyID, std::map< int, int > &cell_topo_types) |
ErrorCode | get_int_option (const char *opt_str, EntityHandle seth, Tag &tag, CCMIOID node) |
ErrorCode | get_dbl_option (const char *opt_str, EntityHandle seth, Tag &tag, CCMIOID node) |
ErrorCode | get_str_option (const char *opt_str, EntityHandle seth, Tag &tag, CCMIOID node, const char *tag_name=NULL) |
Private Attributes | |
Tag | mMaterialSetTag |
Cached tags for reading. Note that all these tags are defined when the core is initialized. | |
Tag | mDirichletSetTag |
Tag | mNeumannSetTag |
Tag | mHasMidNodesTag |
Tag | mGlobalIdTag |
Tag | mNameTag |
Tag | mMaterialIdTag |
Tag | mMaterialTypeTag |
Tag | mRadiationTag |
Tag | mPorosityIdTag |
Tag | mSpinIdTag |
Tag | mGroupIdTag |
Tag | mColorIdxTag |
Tag | mProcessorIdTag |
Tag | mLightMaterialTag |
Tag | mFreeSurfaceMaterialTag |
Tag | mThicknessTag |
Tag | mProstarRegionNumberTag |
Tag | mBoundaryTypeTag |
Tag | mCreatingProgramTag |
Interface * | mbImpl |
ReadUtilIface * | readMeshIface |
std::map< int, EntityHandle > | newMatsets |
std::map< int, EntityHandle > | newNeusets |
bool | hasSolution |
Definition at line 27 of file ReadCCMIO.hpp.
typedef std::map< int, std::vector< int > > moab::ReadCCMIO::SenseList |
Definition at line 32 of file ReadCCMIO.hpp.
typedef std::map< int, std::vector< EntityHandle > > moab::ReadCCMIO::TupleList |
Definition at line 31 of file ReadCCMIO.hpp.
moab::ReadCCMIO::ReadCCMIO | ( | Interface * | impl | ) |
Constructor.
Get and cache predefined tag handles
Definition at line 92 of file ReadCCMIO.cpp.
References DIRICHLET_SET_TAG_NAME, ErrorCode, moab::Interface::globalId_tag(), HAS_MID_NODES_TAG_NAME, MATERIAL_SET_TAG_NAME, MB_CHK_SET_ERR_RET, MB_TAG_CREAT, MB_TAG_SPARSE, MB_TYPE_INTEGER, MB_TYPE_OPAQUE, mDirichletSetTag, mGlobalIdTag, mHasMidNodesTag, mMaterialSetTag, mNameTag, mNeumannSetTag, NAME_TAG_NAME, NAME_TAG_SIZE, NEUMANN_SET_TAG_NAME, moab::Interface::query_interface(), readMeshIface, and moab::Interface::tag_get_handle().
Referenced by factory().
: mMaterialIdTag( 0 ), mMaterialTypeTag( 0 ), mRadiationTag( 0 ), mPorosityIdTag( 0 ), mSpinIdTag( 0 ), mGroupIdTag( 0 ), mColorIdxTag( 0 ), mProcessorIdTag( 0 ), mLightMaterialTag( 0 ), mFreeSurfaceMaterialTag( 0 ), mThicknessTag( 0 ), mProstarRegionNumberTag( 0 ), mBoundaryTypeTag( 0 ), mCreatingProgramTag( 0 ), mbImpl( impl ), hasSolution( false ) { assert( impl != NULL ); impl->query_interface( readMeshIface ); // Initialize in case tag_get_handle fails below mMaterialSetTag = 0; mDirichletSetTag = 0; mNeumannSetTag = 0; mHasMidNodesTag = 0; mGlobalIdTag = 0; mNameTag = 0; //! Get and cache predefined tag handles const int negone = -1; ErrorCode result = impl->tag_get_handle( MATERIAL_SET_TAG_NAME, 1, MB_TYPE_INTEGER, mMaterialSetTag, MB_TAG_CREAT | MB_TAG_SPARSE, &negone );MB_CHK_SET_ERR_RET( result, "Failed to get MATERIAL_SET tag" ); result = impl->tag_get_handle( DIRICHLET_SET_TAG_NAME, 1, MB_TYPE_INTEGER, mDirichletSetTag, MB_TAG_CREAT | MB_TAG_SPARSE, &negone );MB_CHK_SET_ERR_RET( result, "Failed to get DIRICHLET_SET tag" ); result = impl->tag_get_handle( NEUMANN_SET_TAG_NAME, 1, MB_TYPE_INTEGER, mNeumannSetTag, MB_TAG_CREAT | MB_TAG_SPARSE, &negone );MB_CHK_SET_ERR_RET( result, "Failed to get NEUMANN_SET tag" ); const int negonearr[] = { -1, -1, -1, -1 }; result = impl->tag_get_handle( HAS_MID_NODES_TAG_NAME, 4, MB_TYPE_INTEGER, mHasMidNodesTag, MB_TAG_CREAT | MB_TAG_SPARSE, negonearr );MB_CHK_SET_ERR_RET( result, "Failed to get HAS_MID_NODES tag" ); mGlobalIdTag = impl->globalId_tag(); result = impl->tag_get_handle( NAME_TAG_NAME, NAME_TAG_SIZE, MB_TYPE_OPAQUE, mNameTag, MB_TAG_CREAT | MB_TAG_SPARSE );MB_CHK_SET_ERR_RET( result, "Failed to get NAME tag" ); }
moab::ReadCCMIO::~ReadCCMIO | ( | ) | [virtual] |
Destructor.
Definition at line 131 of file ReadCCMIO.cpp.
References mbImpl, readMeshIface, and moab::Interface::release_interface().
{ mbImpl->release_interface( readMeshIface ); }
ErrorCode moab::ReadCCMIO::ccmio_to_moab_type | ( | int | ccm_type, |
EntityType & | moab_type, | ||
bool & | has_mid_nodes | ||
) | [private] |
Definition at line 621 of file ReadCCMIO.cpp.
References MB_SUCCESS, MBEDGE, MBHEX, MBMAXTYPE, MBPOLYHEDRON, MBPRISM, MBPYRAMID, MBQUAD, MBTET, and MBVERTEX.
Referenced by construct_cells().
{ switch( ccm_type ) { case 1: moab_type = MBVERTEX; break; case 2: case 28: moab_type = MBEDGE; break; case 29: moab_type = MBMAXTYPE; break; case 3: case 4: moab_type = MBQUAD; break; case 11: case 21: moab_type = MBHEX; break; case 12: case 22: moab_type = MBPRISM; break; case 13: case 23: moab_type = MBTET; break; case 14: case 24: moab_type = MBPYRAMID; break; case 255: moab_type = MBPOLYHEDRON; break; default: moab_type = MBMAXTYPE; } switch( ccm_type ) { case 28: case 4: case 21: case 22: case 23: case 24: has_mid_nodes = true; break; default: break; } return MB_SUCCESS; }
ErrorCode moab::ReadCCMIO::construct_cells | ( | TupleList & | face_map, |
SenseList & | sense_map, | ||
TupleList & | vert_map, | ||
std::map< int, int > & | cell_topo_types, | ||
std::vector< EntityHandle > & | new_cells | ||
) | [private] |
Definition at line 552 of file ReadCCMIO.cpp.
References ccmio_to_moab_type(), create_cell_from_faces(), ErrorCode, MB_SUCCESS, mbImpl, MBMAXTYPE, mGlobalIdTag, and moab::Interface::tag_set_data().
Referenced by read_cells().
{ std::vector< EntityHandle > facehs; std::vector< int > senses; EntityHandle cell; ErrorCode tmp_rval, rval = MB_SUCCESS; EntityType this_type = MBMAXTYPE; bool has_mid_nodes = false; #ifdef TUPLE_LIST unsigned int i = 0; while( i < face_map.n ) { // Pull out face handles bounding the same cell facehs.clear(); int this_id = face_map.get_int( i ); unsigned int inext = i; while( face_map.get_int( inext ) == this_id && inext <= face_map.n ) { inext++; EntityHandle face = face_map.get_ulong( inext ); facehs.push_back( face ); senses.push_back( face_map.get_short( inext ) ); } this_type = MBMAXTYPE; has_mid_nodes = false; #else std::map< int, std::vector< EntityHandle > >::iterator fmit; std::map< int, std::vector< int > >::iterator smit; std::map< int, int >::iterator typeit; for( fmit = face_map.begin(), smit = sense_map.begin(); fmit != face_map.end(); ++fmit, ++smit ) { // Pull out face handles bounding the same cell facehs.clear(); int this_id = ( *fmit ).first; facehs = ( *fmit ).second; senses.clear(); senses = ( *smit ).second; typeit = cell_topo_types.find( this_id ); if( typeit != cell_topo_types.end() ) { rval = ccmio_to_moab_type( typeit->second, this_type, has_mid_nodes ); } else { this_type = MBMAXTYPE; has_mid_nodes = false; } #endif tmp_rval = create_cell_from_faces( facehs, senses, this_type, has_mid_nodes, cell ); if( MB_SUCCESS != tmp_rval ) rval = tmp_rval; else { new_cells.push_back( cell ); // Tag cell with global id tmp_rval = mbImpl->tag_set_data( mGlobalIdTag, &cell, 1, &this_id ); if( MB_SUCCESS != tmp_rval ) rval = tmp_rval; } } return rval; }
ErrorCode moab::ReadCCMIO::create_cell_from_faces | ( | std::vector< EntityHandle > & | facehs, |
std::vector< int > & | senses, | ||
EntityType | this_type, | ||
bool | has_mid_nodes, | ||
EntityHandle & | cell | ||
) | [private] |
Definition at line 679 of file ReadCCMIO.cpp.
References moab::Range::begin(), moab::Interface::create_element(), moab::CN::EntityTypeName(), moab::Range::erase(), ErrorCode, moab::Interface::get_adjacencies(), moab::Interface::get_connectivity(), MB_CHK_SET_ERR, MB_SET_ERR, MB_SUCCESS, MBHEX, mbImpl, MBMAXTYPE, MBPOLYHEDRON, MBPRISM, MBPYRAMID, MBQUAD, MBTET, MBTRI, moab::MeshTopoUtil::opposite_entity(), moab::Range::size(), and moab::Interface::type_from_handle().
Referenced by construct_cells().
{ ErrorCode rval; // Test up front to see if they're one type EntityType face_type = mbImpl->type_from_handle( facehs[0] ); bool same_type = true; for( std::vector< EntityHandle >::iterator vit = facehs.begin(); vit != facehs.end(); ++vit ) { if( face_type != mbImpl->type_from_handle( *vit ) ) { same_type = false; break; } } std::vector< EntityHandle > verts; EntityType input_type = this_type; std::vector< EntityHandle > storage; MeshTopoUtil mtu( mbImpl ); // Preset this to maxtype, so we get an affirmative choice in loop this_type = MBMAXTYPE; if( ( MBTET == input_type || MBMAXTYPE == input_type ) && same_type && face_type == MBTRI && facehs.size() == 4 ) { // Try to get proper connectivity for tet // Get connectivity of first face, and reverse it if sense is forward, since // base face always points into entity rval = mbImpl->get_connectivity( &facehs[0], 1, verts );MB_CHK_SET_ERR( rval, "Couldn't get connectivity" ); if( senses[0] > 0 ) std::reverse( verts.begin(), verts.end() ); // Get the 4th vertex through the next tri const EntityHandle* conn; int conn_size; rval = mbImpl->get_connectivity( facehs[1], conn, conn_size, true, &storage );MB_CHK_SET_ERR( rval, "Couldn't get connectivity" ); int i = 0; while( std::find( verts.begin(), verts.end(), conn[i] ) != verts.end() && i < conn_size ) i++; // If i is not at the end of the verts, found the apex; otherwise fall back to polyhedron if( conn_size != i ) { this_type = MBTET; verts.push_back( conn[i] ); } } else if( ( MBHEX == input_type || MBMAXTYPE == input_type ) && same_type && MBQUAD == face_type && facehs.size() == 6 ) { // Build hex from quads // Algorithm: // - verts = vertices from 1st quad // - Find quad q1 sharing verts[0] and verts[1] // - Find quad q2 sharing other 2 verts in q1 // - Find v1 = opposite vert from verts[1] in q1 , v2 = opposite from verts[0] // - Get i = offset of v1 in verts2 of q2, rotate verts2 by i // - If verts2[(i + 1) % 4] != v2, flip verts2 by switching verts2[1] and verts2[3] // - append verts2 to verts // Get the other vertices for this hex; need to find the quad with no common vertices Range tmp_faces, tmp_verts; // Get connectivity of first face, and reverse it if sense is forward, since // base face always points into entity rval = mbImpl->get_connectivity( &facehs[0], 1, verts );MB_CHK_SET_ERR( rval, "Couldn't get connectivity" ); if( senses[0] > 0 ) std::reverse( verts.begin(), verts.end() ); // Get q1, which shares 2 vertices with q0 std::copy( facehs.begin(), facehs.end(), range_inserter( tmp_faces ) ); rval = mbImpl->get_adjacencies( &verts[0], 2, 2, false, tmp_faces ); if( MB_SUCCESS != rval || tmp_faces.size() != 2 ) MB_SET_ERR( MB_FAILURE, "Couldn't get adj face" ); tmp_faces.erase( facehs[0] ); EntityHandle q1 = *tmp_faces.begin(); // Get other 2 verts of q1 rval = mbImpl->get_connectivity( &q1, 1, tmp_verts );MB_CHK_SET_ERR( rval, "Couldn't get adj verts" ); tmp_verts.erase( verts[0] ); tmp_verts.erase( verts[1] ); // Get q2 std::copy( facehs.begin(), facehs.end(), range_inserter( tmp_faces ) ); rval = mbImpl->get_adjacencies( tmp_verts, 2, false, tmp_faces ); if( MB_SUCCESS != rval || tmp_faces.size() != 2 ) MB_SET_ERR( MB_FAILURE, "Couldn't get adj face" ); tmp_faces.erase( q1 ); EntityHandle q2 = *tmp_faces.begin(); // Get verts in q2 rval = mbImpl->get_connectivity( &q2, 1, storage );MB_CHK_SET_ERR( rval, "Couldn't get adj vertices" ); // Get verts in q1 opposite from v[1] and v[0] in q0 EntityHandle v0 = 0, v1 = 0; rval = mtu.opposite_entity( q1, verts[1], v0 );MB_CHK_SET_ERR( rval, "Couldn't get the opposite side entity" ); rval = mtu.opposite_entity( q1, verts[0], v1 );MB_CHK_SET_ERR( rval, "Couldn't get the opposite side entity" ); if( v0 && v1 ) { // Offset of v0 in q2, then rotate and flip unsigned int ioff = std::find( storage.begin(), storage.end(), v0 ) - storage.begin(); if( 4 == ioff ) MB_SET_ERR( MB_FAILURE, "Trouble finding offset" ); if( storage[( ioff + 1 ) % 4] != v1 ) { std::reverse( storage.begin(), storage.end() ); ioff = std::find( storage.begin(), storage.end(), v0 ) - storage.begin(); } if( 0 != ioff ) std::rotate( storage.begin(), storage.begin() + ioff, storage.end() ); // Copy into verts, and make hex std::copy( storage.begin(), storage.end(), std::back_inserter( verts ) ); this_type = MBHEX; } } if( MBMAXTYPE == this_type && facehs.size() == 5 ) { // Some preliminaries std::vector< EntityHandle > tris, quads; for( unsigned int i = 0; i < 5; i++ ) { if( MBTRI == mbImpl->type_from_handle( facehs[i] ) ) tris.push_back( facehs[i] ); else if( MBQUAD == mbImpl->type_from_handle( facehs[i] ) ) quads.push_back( facehs[i] ); } // Check for prisms if( 2 == tris.size() && 3 == quads.size() ) { // OK, we have the right number of tris and quads; try to find the proper verts // Get connectivity of first tri, and reverse if necessary int index = std::find( facehs.begin(), facehs.end(), tris[0] ) - facehs.begin(); rval = mbImpl->get_connectivity( &tris[0], 1, verts );MB_CHK_SET_ERR( rval, "Couldn't get connectivity" ); if( senses[index] > 0 ) std::reverse( verts.begin(), verts.end() ); // Now align vertices of other tri, through a quad, similar to how we did hexes // Get q1, which shares 2 vertices with t0 Range tmp_faces, tmp_verts; std::copy( facehs.begin(), facehs.end(), range_inserter( tmp_faces ) ); rval = mbImpl->get_adjacencies( &verts[0], 2, 2, false, tmp_faces ); if( MB_SUCCESS != rval || tmp_faces.size() != 2 ) MB_SET_ERR( MB_FAILURE, "Couldn't get adj face" ); tmp_faces.erase( tris[0] ); EntityHandle q1 = *tmp_faces.begin(); // Get verts in q1 rval = mbImpl->get_connectivity( &q1, 1, storage );MB_CHK_SET_ERR( rval, "Couldn't get adj vertices" ); // Get verts in q1 opposite from v[1] and v[0] in q0 EntityHandle v0 = 0, v1 = 0; rval = mtu.opposite_entity( q1, verts[1], v0 );MB_CHK_SET_ERR( rval, "Couldn't get the opposite side entity" ); rval = mtu.opposite_entity( q1, verts[0], v1 );MB_CHK_SET_ERR( rval, "Couldn't get the opposite side entity" ); if( v0 && v1 ) { // Offset of v0 in t2, then rotate and flip storage.clear(); rval = mbImpl->get_connectivity( &tris[1], 1, storage );MB_CHK_SET_ERR( rval, "Couldn't get connectivity" ); index = std::find( facehs.begin(), facehs.end(), tris[1] ) - facehs.begin(); if( senses[index] < 0 ) std::reverse( storage.begin(), storage.end() ); unsigned int ioff = std::find( storage.begin(), storage.end(), v0 ) - storage.begin(); if( 3 == ioff ) MB_SET_ERR( MB_FAILURE, "Trouble finding offset" ); for( unsigned int i = 0; i < 3; i++ ) verts.push_back( storage[( ioff + i ) % 3] ); this_type = MBPRISM; } } else if( tris.size() == 4 && quads.size() == 1 ) { // Check for pyramid // Get connectivity of first tri, and reverse if necessary int index = std::find( facehs.begin(), facehs.end(), quads[0] ) - facehs.begin(); rval = mbImpl->get_connectivity( &quads[0], 1, verts );MB_CHK_SET_ERR( rval, "Couldn't get connectivity" ); if( senses[index] > 0 ) std::reverse( verts.begin(), verts.end() ); // Get apex node rval = mbImpl->get_connectivity( &tris[0], 1, storage );MB_CHK_SET_ERR( rval, "Couldn't get connectivity" ); for( unsigned int i = 0; i < 3; i++ ) { if( std::find( verts.begin(), verts.end(), storage[i] ) == verts.end() ) { verts.push_back( storage[i] ); break; } } if( 5 == verts.size() ) this_type = MBPYRAMID; } else { // Dummy else clause to stop in debugger this_type = MBMAXTYPE; } } if( MBMAXTYPE != input_type && input_type != this_type && this_type != MBMAXTYPE ) std::cerr << "Warning: types disagree (cell_topo_type = " << CN::EntityTypeName( input_type ) << ", faces indicate type " << CN::EntityTypeName( this_type ) << std::endl; if( MBMAXTYPE != input_type && this_type == MBMAXTYPE && input_type != MBPOLYHEDRON ) std::cerr << "Warning: couldn't find proper connectivity for specified topo_type = " << CN::EntityTypeName( input_type ) << std::endl; // Now make the element; if we fell back to polyhedron, use faces, otherwise use verts if( MBPOLYHEDRON == this_type || MBMAXTYPE == this_type ) { rval = mbImpl->create_element( MBPOLYHEDRON, &facehs[0], facehs.size(), cell );MB_CHK_SET_ERR( rval, "create_element failed" ); } else { rval = mbImpl->create_element( this_type, &verts[0], verts.size(), cell );MB_CHK_SET_ERR( rval, "create_element failed" ); } return MB_SUCCESS; }
ReaderIface * moab::ReadCCMIO::factory | ( | Interface * | iface | ) | [static] |
Definition at line 87 of file ReadCCMIO.cpp.
References ReadCCMIO().
Referenced by moab::ReaderWriterSet::ReaderWriterSet().
ErrorCode moab::ReadCCMIO::get_dbl_option | ( | const char * | opt_str, |
EntityHandle | seth, | ||
Tag & | tag, | ||
CCMIOID | node | ||
) | [private] |
Definition at line 316 of file ReadCCMIO.cpp.
References ErrorCode, MB_CHK_SET_ERR, MB_SUCCESS, MB_TAG_CREAT, MB_TAG_SPARSE, MB_TYPE_DOUBLE, mbImpl, moab::Interface::tag_get_handle(), and moab::Interface::tag_set_data().
Referenced by load_matset_data().
{ float fdum; if( kCCMIONoErr == CCMIOReadOptf( NULL, node, opt_str, &fdum ) ) { ErrorCode rval; if( !tag ) { rval = mbImpl->tag_get_handle( opt_str, 1, MB_TYPE_DOUBLE, tag, MB_TAG_SPARSE | MB_TAG_CREAT );MB_CHK_SET_ERR( rval, "Failed to get tag handle" ); } double dum_dbl = fdum; rval = mbImpl->tag_set_data( tag, &seth, 1, &dum_dbl );MB_CHK_SET_ERR( rval, "Failed to set tag data" ); } return MB_SUCCESS; }
ErrorCode moab::ReadCCMIO::get_int_option | ( | const char * | opt_str, |
EntityHandle | seth, | ||
Tag & | tag, | ||
CCMIOID | node | ||
) | [private] |
Definition at line 299 of file ReadCCMIO.cpp.
References ErrorCode, MB_CHK_SET_ERR, MB_SUCCESS, MB_TAG_CREAT, MB_TAG_SPARSE, MB_TYPE_INTEGER, mbImpl, moab::Interface::tag_get_handle(), and moab::Interface::tag_set_data().
Referenced by load_matset_data(), and load_neuset_data().
{ int idum; ErrorCode rval; if( kCCMIONoErr == CCMIOReadOpti( NULL, node, opt_str, &idum ) ) { if( !tag ) { rval = mbImpl->tag_get_handle( opt_str, 1, MB_TYPE_INTEGER, tag, MB_TAG_SPARSE | MB_TAG_CREAT );MB_CHK_SET_ERR( rval, "Failed to get tag handle" ); } rval = mbImpl->tag_set_data( tag, &seth, 1, &idum );MB_CHK_SET_ERR( rval, "Failed to set tag data" ); } return MB_SUCCESS; }
ErrorCode moab::ReadCCMIO::get_processors | ( | CCMIOID | stateID, |
CCMIOID & | processorID, | ||
CCMIOID & | verticesID, | ||
CCMIOID & | topologyID, | ||
CCMIOID & | solutionID, | ||
std::vector< CCMIOSize_t > & | procs, | ||
bool & | has_solution | ||
) | [private] |
Definition at line 1176 of file ReadCCMIO.cpp.
References CHK_SET_CCMERR, hasSolution, and MB_SUCCESS.
Referenced by load_file().
{ CCMIOSize_t proc = CCMIOSIZEC( 0 ); CCMIOError error = kCCMIONoErr; CCMIONextEntity( &error, stateID, kCCMIOProcessor, &proc, &processorID ); CHK_SET_CCMERR( error, "CCMIONextEntity() failed" ); if( CCMIOReadProcessor( NULL, processorID, &verticesID, &topologyID, NULL, &solutionID ) != kCCMIONoErr ) { // Maybe no solution; try again CCMIOReadProcessor( &error, processorID, &verticesID, &topologyID, NULL, NULL ); CHK_SET_CCMERR( error, "CCMIOReadProcessor() failed" ); hasSolution = false; } procs.push_back( proc ); return MB_SUCCESS; }
ErrorCode moab::ReadCCMIO::get_state | ( | CCMIOID | rootID, |
CCMIOID & | problemID, | ||
CCMIOID & | stateID | ||
) | [private] |
Definition at line 182 of file ReadCCMIO.cpp.
References CHK_SET_CCMERR, moab::error(), and MB_SUCCESS.
Referenced by load_file().
{ CCMIOError error = kCCMIONoErr; // First try default CCMIOGetState( &error, rootID, "default", &problemID, &stateID ); if( kCCMIONoErr != error ) { CCMIOSize_t i = CCMIOSIZEC( 0 ); CCMIOError tmp_error = kCCMIONoErr; CCMIONextEntity( &tmp_error, rootID, kCCMIOState, &i, &stateID ); if( kCCMIONoErr == tmp_error ) CCMIONextEntity( &error, rootID, kCCMIOProblemDescription, &i, &problemID ); } CHK_SET_CCMERR( error, "Couldn't find state" ); return MB_SUCCESS; }
ErrorCode moab::ReadCCMIO::get_str_option | ( | const char * | opt_str, |
EntityHandle | seth, | ||
Tag & | tag, | ||
CCMIOID | node, | ||
const char * | tag_name = NULL |
||
) | [private] |
Definition at line 334 of file ReadCCMIO.cpp.
References moab::error(), ErrorCode, MB_CHK_SET_ERR, MB_SUCCESS, MB_TAG_CREAT, MB_TAG_SPARSE, MB_TYPE_OPAQUE, mbImpl, NAME_TAG_SIZE, moab::Interface::tag_get_handle(), and moab::Interface::tag_set_data().
Referenced by load_matset_data(), load_metadata(), and load_neuset_data().
{ int len; CCMIOError error = kCCMIONoErr; std::vector< char > opt_string; if( kCCMIONoErr != CCMIOReadOptstr( NULL, node, opt_str, &len, NULL ) ) return MB_SUCCESS; opt_string.resize( len ); CCMIOReadOptstr( &error, node, opt_str, &len, &opt_string[0] ); ErrorCode rval = MB_SUCCESS; if( !tag ) { rval = mbImpl->tag_get_handle( other_tag_name ? other_tag_name : opt_str, NAME_TAG_SIZE, MB_TYPE_OPAQUE, tag, MB_TAG_SPARSE | MB_TAG_CREAT );MB_CHK_SET_ERR( rval, "Failed to get tag handle" ); } if( opt_string.size() > NAME_TAG_SIZE ) opt_string[NAME_TAG_SIZE - 1] = '\0'; else ( opt_string.resize( NAME_TAG_SIZE, '\0' ) ); rval = mbImpl->tag_set_data( tag, &seth, 1, &opt_string[0] );MB_CHK_SET_ERR( rval, "Failed to set tag data" ); return MB_SUCCESS; }
ErrorCode moab::ReadCCMIO::load_file | ( | const char * | file_name, |
const EntityHandle * | file_set, | ||
const FileOptions & | opts, | ||
const SubsetList * | subset_list = 0 , |
||
const Tag * | file_id_tag = 0 |
||
) | [virtual] |
Load mesh from a file.
Method all readers must provide to import a mesh.
file_name | The file to read. |
file_set | Optional pointer to entity set representing file. If this is not NULL, reader may optionally tag the pointed-to set with format-specific meta-data. |
subset_list | An optional struct pointer specifying the tags identifying entity sets to be read. |
file_id_tag | If specified, reader should store for each entity it reads, a unique integer ID for this tag. |
Implements moab::ReaderIface.
Definition at line 136 of file ReadCCMIO.cpp.
References moab::Interface::add_entities(), CHK_SET_CCMERR, moab::error(), ErrorCode, get_processors(), get_state(), load_metadata(), MB_CHK_SET_ERR, MB_SET_ERR, MB_UNSUPPORTED_OPERATION, mbImpl, and read_processor().
{ CCMIOID rootID, problemID, stateID, processorID, verticesID, topologyID, solutionID; CCMIOError error = kCCMIONoErr; if( subset_list ) { MB_SET_ERR( MB_UNSUPPORTED_OPERATION, "Reading subset of files not supported for CCMOI data" ); } CCMIOOpenFile( &error, file_name, kCCMIORead, &rootID ); CHK_SET_CCMERR( error, "Problem opening file" ); // Get the file state ErrorCode rval = get_state( rootID, problemID, stateID );MB_CHK_SET_ERR( rval, "Failed to get state" ); // Get processors std::vector< CCMIOSize_t > procs; bool has_solution = false; rval = get_processors( stateID, processorID, verticesID, topologyID, solutionID, procs, has_solution );MB_CHK_SET_ERR( rval, "Failed to get processors" ); std::vector< CCMIOSize_t >::iterator vit; Range new_ents, *new_ents_ptr = NULL; if( file_set ) new_ents_ptr = &new_ents; for( vit = procs.begin(); vit != procs.end(); ++vit ) { rval = read_processor( stateID, problemID, processorID, verticesID, topologyID, *vit, new_ents_ptr );MB_CHK_SET_ERR( rval, "Failed to read processors" ); } // Load some meta-data rval = load_metadata( rootID, problemID, stateID, processorID, file_set );MB_CHK_SET_ERR( rval, "Failed to load some meta-data" ); // Now, put all this into the file set, if there is one if( file_set ) { rval = mbImpl->add_entities( *file_set, new_ents );MB_CHK_SET_ERR( rval, "Failed to add new entities to file set" ); } return rval; }
ErrorCode moab::ReadCCMIO::load_matset_data | ( | CCMIOID | problemID | ) | [private] |
Definition at line 238 of file ReadCCMIO.cpp.
References moab::error(), ErrorCode, get_dbl_option(), get_int_option(), get_str_option(), MB_CHK_SET_ERR, MB_SUCCESS, mbImpl, mColorIdxTag, mFreeSurfaceMaterialTag, mGroupIdTag, mLightMaterialTag, mMaterialIdTag, mMaterialSetTag, mMaterialTypeTag, mNameTag, mPorosityIdTag, mProcessorIdTag, mRadiationTag, mSpinIdTag, mThicknessTag, NAME_TAG_SIZE, newMatsets, and moab::Interface::tag_set_data().
Referenced by load_metadata().
{ // Make sure there are matsets if( newMatsets.empty() ) return MB_SUCCESS; // ... walk through each cell type CCMIOSize_t i = CCMIOSIZEC( 0 ); CCMIOID next; CCMIOError error = kCCMIONoErr; while( CCMIONextEntity( NULL, problemID, kCCMIOCellType, &i, &next ) == kCCMIONoErr ) { // Get index, corresponding set, and label with material set tag int mindex; CCMIOGetEntityIndex( &error, next, &mindex ); std::map< int, EntityHandle >::iterator mit = newMatsets.find( mindex ); if( mit == newMatsets.end() ) // No actual faces for this matset; continue to next continue; EntityHandle dum_ent = mit->second; ErrorCode rval = mbImpl->tag_set_data( mMaterialSetTag, &dum_ent, 1, &mindex );MB_CHK_SET_ERR( rval, "Trouble setting material set tag" ); // Set name CCMIOSize_t len; CCMIOEntityLabel( &error, next, &len, NULL ); std::vector< char > opt_string2( GETINT32( len ) + 1, '\0' ); CCMIOEntityLabel( &error, next, NULL, &opt_string2[0] ); if( opt_string2.size() >= NAME_TAG_SIZE ) opt_string2[NAME_TAG_SIZE - 1] = '\0'; else ( opt_string2.resize( NAME_TAG_SIZE, '\0' ) ); rval = mbImpl->tag_set_data( mNameTag, &dum_ent, 1, &opt_string2[0] );MB_CHK_SET_ERR( rval, "Trouble setting name tag for material set" ); // Material id rval = get_int_option( "MaterialId", dum_ent, mMaterialIdTag, next );MB_CHK_SET_ERR( rval, "Trouble getting MaterialId tag" ); rval = get_str_option( "MaterialType", dum_ent, mMaterialTypeTag, next );MB_CHK_SET_ERR( rval, "Trouble getting MaterialType tag" ); rval = get_int_option( "Radiation", dum_ent, mRadiationTag, next );MB_CHK_SET_ERR( rval, "Trouble getting Radiation option" ); rval = get_int_option( "PorosityId", dum_ent, mPorosityIdTag, next );MB_CHK_SET_ERR( rval, "Trouble getting PorosityId option" ); rval = get_int_option( "SpinId", dum_ent, mSpinIdTag, next );MB_CHK_SET_ERR( rval, "Trouble getting SpinId option" ); rval = get_int_option( "GroupId", dum_ent, mGroupIdTag, next );MB_CHK_SET_ERR( rval, "Trouble getting GroupId option" ); rval = get_int_option( "ColorIdx", dum_ent, mColorIdxTag, next );MB_CHK_SET_ERR( rval, "Trouble getting ColorIdx option" ); rval = get_int_option( "ProcessorId", dum_ent, mProcessorIdTag, next );MB_CHK_SET_ERR( rval, "Trouble getting ProcessorId option" ); rval = get_int_option( "LightMaterial", dum_ent, mLightMaterialTag, next );MB_CHK_SET_ERR( rval, "Trouble getting LightMaterial option" ); rval = get_int_option( "FreeSurfaceMaterial", dum_ent, mFreeSurfaceMaterialTag, next );MB_CHK_SET_ERR( rval, "Trouble getting FreeSurfaceMaterial option" ); rval = get_dbl_option( "Thickness", dum_ent, mThicknessTag, next );MB_CHK_SET_ERR( rval, "Trouble getting Thickness option" ); } return MB_SUCCESS; }
ErrorCode moab::ReadCCMIO::load_metadata | ( | CCMIOID | rootID, |
CCMIOID | problemID, | ||
CCMIOID | stateID, | ||
CCMIOID | processorID, | ||
const EntityHandle * | file_set | ||
) | [private] |
Definition at line 200 of file ReadCCMIO.cpp.
References moab::error(), ErrorCode, get_str_option(), load_matset_data(), load_neuset_data(), MB_CHK_SET_ERR, MB_SUCCESS, MB_TAG_CREAT, MB_TAG_SPARSE, MB_TYPE_OPAQUE, mbImpl, mCreatingProgramTag, moab::Interface::tag_get_handle(), and moab::Interface::tag_set_data().
Referenced by load_file().
{ // Read the simulation title. CCMIOError error = kCCMIONoErr; ErrorCode rval = MB_SUCCESS; CCMIONode rootNode; if( kCCMIONoErr == CCMIOGetEntityNode( &error, rootID, &rootNode ) ) { char* name = NULL; CCMIOGetTitle( &error, rootNode, &name ); if( NULL != name && strlen( name ) != 0 ) { // Make a tag for it and tag the read set Tag simname; rval = mbImpl->tag_get_handle( "Title", strlen( name ), MB_TYPE_OPAQUE, simname, MB_TAG_CREAT | MB_TAG_SPARSE );MB_CHK_SET_ERR( rval, "Simulation name tag not found or created" ); EntityHandle set = file_set ? *file_set : 0; rval = mbImpl->tag_set_data( simname, &set, 1, name );MB_CHK_SET_ERR( rval, "Problem setting simulation name tag" ); } if( name ) free( name ); } // Creating program EntityHandle dumh = ( file_set ? *file_set : 0 ); rval = get_str_option( "CreatingProgram", dumh, mCreatingProgramTag, processorID );MB_CHK_SET_ERR( rval, "Trouble getting CreatingProgram tag" ); rval = load_matset_data( problemID );MB_CHK_SET_ERR( rval, "Failure loading matset data" ); rval = load_neuset_data( problemID );MB_CHK_SET_ERR( rval, "Failure loading neuset data" ); return rval; }
ErrorCode moab::ReadCCMIO::load_neuset_data | ( | CCMIOID | problemID | ) | [private] |
Definition at line 364 of file ReadCCMIO.cpp.
References moab::error(), ErrorCode, get_int_option(), get_str_option(), MB_CHK_SET_ERR, MB_SUCCESS, mbImpl, mBoundaryTypeTag, mNameTag, mNeumannSetTag, mProstarRegionNumberTag, NAME_TAG_NAME, newNeusets, and moab::Interface::tag_set_data().
Referenced by load_metadata().
{ CCMIOSize_t i = CCMIOSIZEC( 0 ); CCMIOID next; // Make sure there are matsets if( newNeusets.empty() ) return MB_SUCCESS; while( CCMIONextEntity( NULL, problemID, kCCMIOBoundaryRegion, &i, &next ) == kCCMIONoErr ) { // Get index, corresponding set, and label with neumann set tag int mindex; CCMIOError error = kCCMIONoErr; CCMIOGetEntityIndex( &error, next, &mindex ); std::map< int, EntityHandle >::iterator mit = newNeusets.find( mindex ); if( mit == newNeusets.end() ) // No actual faces for this neuset; continue to next continue; EntityHandle dum_ent = mit->second; ErrorCode rval = mbImpl->tag_set_data( mNeumannSetTag, &dum_ent, 1, &mindex );MB_CHK_SET_ERR( rval, "Trouble setting neumann set tag" ); // Set name rval = get_str_option( "BoundaryName", dum_ent, mNameTag, next, NAME_TAG_NAME );MB_CHK_SET_ERR( rval, "Trouble creating BoundaryName tag" ); // BoundaryType rval = get_str_option( "BoundaryType", dum_ent, mBoundaryTypeTag, next );MB_CHK_SET_ERR( rval, "Trouble creating BoundaryType tag" ); // ProstarRegionNumber rval = get_int_option( "ProstarRegionNumber", dum_ent, mProstarRegionNumberTag, next );MB_CHK_SET_ERR( rval, "Trouble creating ProstarRegionNumber tag" ); } return MB_SUCCESS; }
ErrorCode moab::ReadCCMIO::make_faces | ( | int * | farray, |
TupleList & | vert_map, | ||
std::vector< EntityHandle > & | new_faces, | ||
int | num_faces | ||
) | [private] |
Definition at line 1048 of file ReadCCMIO.cpp.
References moab::Interface::create_element(), ErrorCode, MB_SUCCESS, mbImpl, MBPOLYGON, MBQUAD, and MBTRI.
Referenced by read_faces().
{ std::vector< EntityHandle > verts; ErrorCode tmp_rval = MB_SUCCESS, rval = MB_SUCCESS; for( int i = 0; i < num_faces; i++ ) { int num_verts = *farray++; verts.resize( num_verts ); // Fill in connectivity by looking up by gid in vert tuple_list for( int j = 0; j < num_verts; j++ ) { #ifdef TUPLE_LIST int tindex = vert_map.find( 1, farray[j] ); if( -1 == tindex ) { tmp_rval = MB_FAILURE; break; } verts[j] = vert_map.get_ulong( tindex, 0 ); #else verts[j] = ( vert_map[farray[j]] )[0]; #endif } farray += num_verts; if( MB_SUCCESS == tmp_rval ) { // Make face EntityType ftype = ( 3 == num_verts ? MBTRI : ( 4 == num_verts ? MBQUAD : MBPOLYGON ) ); EntityHandle faceh; tmp_rval = mbImpl->create_element( ftype, &verts[0], num_verts, faceh ); if( faceh ) new_faces.push_back( faceh ); } if( MB_SUCCESS != tmp_rval ) rval = tmp_rval; } return rval; }
ErrorCode moab::ReadCCMIO::read_all_faces | ( | CCMIOID | topologyID, |
TupleList & | vert_map, | ||
TupleList & | face_map, | ||
SenseList & | sense_map, | ||
Range * | new_faces | ||
) | [private] |
Definition at line 895 of file ReadCCMIO.cpp.
References CHK_SET_CCMERR, moab::error(), ErrorCode, MB_CHK_SET_ERR, and read_faces().
Referenced by read_cells().
{ CCMIOSize_t index; CCMIOID faceID; ErrorCode rval; CCMIOError error = kCCMIONoErr; // Get total # internal/bdy faces, size the face map accordingly #ifdef TUPLE_LIST index = CCMIOSIZEC( 0 ); int nbdy_faces = 0; CCMIOSize_t nf; error = kCCMIONoErr; while( kCCMIONoErr == CCMIONextEntity( NULL, topologyID, kCCMIOBoundaryFaces, &index, &faceID ) ) { CCMIOEntitySize( &error, faceID, &nf, NULL ); nbdy_faces += nf; } CCMIOGetEntity( &error, topologyID, kCCMIOInternalFaces, 0, &faceID ); CCMIOEntitySize( &error, faceID, &nf, NULL ); int nint_faces = nf; face_map.resize( 2 * nint_faces + nbdy_faces ); #endif // Get multiple blocks of bdy faces index = CCMIOSIZEC( 0 ); while( kCCMIONoErr == CCMIONextEntity( NULL, topologyID, kCCMIOBoundaryFaces, &index, &faceID ) ) { rval = read_faces( faceID, kCCMIOBoundaryFaces, vert_map, face_map, #ifndef TUPLE_LIST sense_map, #endif new_faces );MB_CHK_SET_ERR( rval, "Trouble reading boundary faces" ); } // Now get internal faces CCMIOGetEntity( &error, topologyID, kCCMIOInternalFaces, 0, &faceID ); CHK_SET_CCMERR( error, "Couldn't get internal faces" ); rval = read_faces( faceID, kCCMIOInternalFaces, vert_map, face_map, #ifndef TUPLE_LIST sense_map, #endif new_faces );MB_CHK_SET_ERR( rval, "Trouble reading internal faces" ); return rval; }
ErrorCode moab::ReadCCMIO::read_cells | ( | CCMIOSize_t | proc, |
CCMIOID | processorID, | ||
CCMIOID | verticesID, | ||
CCMIOID | topologyID, | ||
TupleList & | vert_map, | ||
Range * | new_cells | ||
) | [private] |
Definition at line 419 of file ReadCCMIO.cpp.
References construct_cells(), ErrorCode, MB_CHK_SET_ERR, MB_SUCCESS, read_all_faces(), read_gids_and_types(), and read_topology_types().
Referenced by read_processor().
{ // Read the faces. // face_map fields: s:forward/reverse, i: cell id, ul: face handle, r: none ErrorCode rval; #ifdef TUPLE_LIST TupleList face_map( 1, 1, 1, 0, 0 ); #else TupleList face_map; SenseList sense_map; #endif rval = read_all_faces( topologyID, vert_map, face_map, #ifndef TUPLE_LIST sense_map, #endif new_ents );MB_CHK_SET_ERR( rval, "Failed to read all cells" ); // Read the cell topology types, if any exist in the file std::map< int, int > cell_topo_types; rval = read_topology_types( topologyID, cell_topo_types );MB_CHK_SET_ERR( rval, "Problem reading cell topo types" ); // Now construct the cells; sort the face map by cell ids first #ifdef TUPLE_LIST rval = face_map.sort( 1 );MB_CHK_SET_ERR( rval, "Couldn't sort face map by cell id" ); #endif std::vector< EntityHandle > new_cells; rval = construct_cells( face_map, #ifndef TUPLE_LIST sense_map, #endif vert_map, cell_topo_types, new_cells );MB_CHK_SET_ERR( rval, "Failed to construct cells" ); if( new_ents ) { Range::iterator rit = new_ents->end(); std::vector< EntityHandle >::reverse_iterator vit; for( vit = new_cells.rbegin(); vit != new_cells.rend(); ++vit ) rit = new_ents->insert( rit, *vit ); } rval = read_gids_and_types( problemID, topologyID, new_cells );MB_CHK_SET_ERR( rval, "Failed to read gids and types" ); return MB_SUCCESS; }
ErrorCode moab::ReadCCMIO::read_faces | ( | CCMIOID | faceID, |
CCMIOEntity | bdy_or_int, | ||
TupleList & | vert_map, | ||
TupleList & | face_map, | ||
SenseList & | sense_map, | ||
Range * | new_faces | ||
) | [private] |
Definition at line 950 of file ReadCCMIO.cpp.
References moab::Interface::add_entities(), CHK_SET_CCMERR, moab::Interface::create_meshset(), moab::error(), ErrorCode, make_faces(), MB_CHK_SET_ERR, MB_SET_ERR, MB_SUCCESS, mbImpl, MESHSET_SET, mGlobalIdTag, mNeumannSetTag, newNeusets, and moab::Interface::tag_set_data().
Referenced by read_all_faces().
{ if( kCCMIOInternalFaces != bdy_or_int && kCCMIOBoundaryFaces != bdy_or_int ) MB_SET_ERR( MB_FAILURE, "Face type isn't boundary or internal" ); CCMIOSize_t dum_faces; CCMIOError error = kCCMIONoErr; CCMIOEntitySize( &error, faceID, &dum_faces, NULL ); int num_faces = GETINT32( dum_faces ); // Get the size of the face connectivity array (not really a straight connect // array, has n, connect(n), ...) CCMIOSize_t farray_size = CCMIOSIZEC( 0 ); CCMIOReadFaces( &error, faceID, bdy_or_int, NULL, &farray_size, NULL, CCMIOINDEXC( kCCMIOStart ), CCMIOINDEXC( kCCMIOEnd ) ); CHK_SET_CCMERR( error, "Trouble reading face connectivity length" ); // Allocate vectors for holding farray and cells for each face; use new for finer // control of de-allocation int num_sides = ( kCCMIOInternalFaces == bdy_or_int ? 2 : 1 ); int* farray = new int[GETINT32( farray_size )]; // Read farray and make the faces CCMIOID mapID; CCMIOReadFaces( &error, faceID, bdy_or_int, &mapID, NULL, farray, CCMIOINDEXC( kCCMIOStart ), CCMIOINDEXC( kCCMIOEnd ) ); CHK_SET_CCMERR( error, "Trouble reading face connectivity" ); std::vector< EntityHandle > face_handles; ErrorCode rval = make_faces( farray, vert_map, face_handles, num_faces );MB_CHK_SET_ERR( rval, "Failed to make the faces" ); // Read face cells and make tuples int* face_cells; if( num_sides * num_faces < farray_size ) face_cells = new int[num_sides * num_faces]; else face_cells = farray; CCMIOReadFaceCells( &error, faceID, bdy_or_int, face_cells, CCMIOINDEXC( kCCMIOStart ), CCMIOINDEXC( kCCMIOEnd ) ); CHK_SET_CCMERR( error, "Trouble reading face cells" ); int* tmp_ptr = face_cells; for( unsigned int i = 0; i < face_handles.size(); i++ ) { #ifdef TUPLE_LIST short forward = 1, reverse = -1; face_map.push_back( &forward, tmp_ptr++, &face_handles[i], NULL ); if( 2 == num_sides ) face_map.push_back( &reverse, tmp_ptr++, &face_handles[i], NULL ); #else face_map[*tmp_ptr].push_back( face_handles[i] ); sense_map[*tmp_ptr++].push_back( 1 ); if( 2 == num_sides ) { face_map[*tmp_ptr].push_back( face_handles[i] ); sense_map[*tmp_ptr++].push_back( -1 ); } #endif } // Now read & set face gids, reuse face_cells 'cuz we know it's big enough CCMIOReadMap( &error, mapID, face_cells, CCMIOINDEXC( kCCMIOStart ), CCMIOINDEXC( kCCMIOEnd ) ); CHK_SET_CCMERR( error, "Trouble reading face gids" ); rval = mbImpl->tag_set_data( mGlobalIdTag, &face_handles[0], face_handles.size(), face_cells );MB_CHK_SET_ERR( rval, "Couldn't set face global ids" ); // Make a neumann set for these faces if they're all in a boundary face set if( kCCMIOBoundaryFaces == bdy_or_int ) { EntityHandle neuset; rval = mbImpl->create_meshset( MESHSET_SET, neuset );MB_CHK_SET_ERR( rval, "Failed to create neumann set" ); // Don't trust entity index passed in int index; CCMIOGetEntityIndex( &error, faceID, &index ); newNeusets[index] = neuset; rval = mbImpl->add_entities( neuset, &face_handles[0], face_handles.size() );MB_CHK_SET_ERR( rval, "Failed to add faces to neumann set" ); // Now tag as neumann set; will add id later int dum_val = 0; rval = mbImpl->tag_set_data( mNeumannSetTag, &neuset, 1, &dum_val );MB_CHK_SET_ERR( rval, "Failed to tag neumann set" ); } if( new_faces ) { std::sort( face_handles.begin(), face_handles.end() ); std::copy( face_handles.rbegin(), face_handles.rend(), range_inserter( *new_faces ) ); } return MB_SUCCESS; }
ErrorCode moab::ReadCCMIO::read_gids_and_types | ( | CCMIOID | problemID, |
CCMIOID | topologyID, | ||
std::vector< EntityHandle > & | cells | ||
) | [private] |
Definition at line 506 of file ReadCCMIO.cpp.
References moab::Interface::add_entities(), CHK_SET_CCMERR, moab::Interface::create_meshset(), moab::error(), ErrorCode, MB_CHK_SET_ERR, MB_SET_ERR, MB_SUCCESS, mbImpl, MESHSET_SET, mGlobalIdTag, newMatsets, and moab::Interface::tag_set_data().
Referenced by read_cells().
{ // Get the cells entity and number of cells CCMIOSize_t dum_cells; int num_cells; CCMIOError error = kCCMIONoErr; CCMIOID cellsID, mapID; CCMIOGetEntity( &error, topologyID, kCCMIOCells, 0, &cellsID ); CCMIOEntitySize( &error, cellsID, &dum_cells, NULL ); num_cells = GETINT32( dum_cells ); // Check the number of cells against how many are in the cell array if( num_cells != (int)cells.size() ) MB_SET_ERR( MB_FAILURE, "Number of cells doesn't agree" ); // Read the gid map and set global ids std::vector< int > cell_gids( num_cells ); CCMIOReadCells( &error, cellsID, &mapID, NULL, CCMIOINDEXC( kCCMIOStart ), CCMIOINDEXC( kCCMIOEnd ) ); CHK_SET_CCMERR( error, "Couldn't read cells" ); CCMIOReadMap( &error, mapID, &cell_gids[0], CCMIOINDEXC( kCCMIOStart ), CCMIOINDEXC( kCCMIOEnd ) ); CHK_SET_CCMERR( error, "Couldn't read cell id map" ); ErrorCode rval = mbImpl->tag_set_data( mGlobalIdTag, &cells[0], cells.size(), &cell_gids[0] );MB_CHK_SET_ERR( rval, "Couldn't set gids tag" ); // Now read cell material types; reuse cell_gids CCMIOReadCells( &error, cellsID, NULL, &cell_gids[0], CCMIOINDEXC( kCCMIOStart ), CCMIOINDEXC( kCCMIOEnd ) ); CHK_SET_CCMERR( error, "Trouble reading cell types" ); // Create the matsets std::map< int, Range > matset_ents; for( int i = 0; i < num_cells; i++ ) matset_ents[cell_gids[i]].insert( cells[i] ); for( std::map< int, Range >::iterator mit = matset_ents.begin(); mit != matset_ents.end(); ++mit ) { EntityHandle matset; rval = mbImpl->create_meshset( MESHSET_SET, matset );MB_CHK_SET_ERR( rval, "Couldn't create material set" ); newMatsets[mit->first] = matset; rval = mbImpl->add_entities( matset, mit->second );MB_CHK_SET_ERR( rval, "Couldn't add entities to material set" ); } return MB_SUCCESS; }
ErrorCode moab::ReadCCMIO::read_processor | ( | CCMIOID | rootID, |
CCMIOID | problemID, | ||
CCMIOID | processorID, | ||
CCMIOID | verticesID, | ||
CCMIOID | topologyID, | ||
CCMIOSize_t | proc, | ||
Range * | new_ents | ||
) | [private] |
Definition at line 399 of file ReadCCMIO.cpp.
References ErrorCode, MB_CHK_SET_ERR, read_cells(), and read_vertices().
Referenced by load_file().
{ ErrorCode rval; // vert_map fields: s: none, i: gid, ul: vert handle, r: none // TupleList vert_map(0, 1, 1, 0, 0); TupleList vert_map; rval = read_vertices( proc, processorID, verticesID, topologyID, new_ents, vert_map );MB_CHK_SET_ERR( rval, "Failed to read vertices" ); rval = read_cells( proc, problemID, verticesID, topologyID, vert_map, new_ents );MB_CHK_SET_ERR( rval, "Failed to read cells" ); return rval; }
ErrorCode moab::ReadCCMIO::read_tag_values | ( | const char * | file_name, |
const char * | tag_name, | ||
const FileOptions & | opts, | ||
std::vector< int > & | tag_values_out, | ||
const SubsetList * | subset_list = 0 |
||
) | [private, virtual] |
Read tag values from a file.
Read the list if all integer tag values from the file for a tag that is a single integer value per entity.
file_name | The file to read. |
tag_name | The tag for which to read values |
tag_values_out | Output: The list of tag values. |
subset_list | An array of tag name and value sets specifying the subset of the file to read. If multiple tags are specified, the sets that match all tags (intersection) should be read. |
subset_list_length | The length of the 'subset_list' array. |
Implements moab::ReaderIface.
Definition at line 1202 of file ReadCCMIO.cpp.
{
return MB_FAILURE;
}
ErrorCode moab::ReadCCMIO::read_topology_types | ( | CCMIOID & | topologyID, |
std::map< int, int > & | cell_topo_types | ||
) | [private] |
Definition at line 468 of file ReadCCMIO.cpp.
References CHK_SET_CCMERR, moab::error(), and MB_SUCCESS.
Referenced by read_cells().
{ CCMIOError error = kCCMIONoErr; CCMIOID cellID, mapID; CCMIOSize_t ncells; CCMIOGetEntity( &error, topologyID, kCCMIOCells, 0, &cellID ); CCMIOEntitySize( &error, cellID, &ncells, NULL ); int num_cells = GETINT32( ncells ); // First, do a dummy read to see if we even have topo types in this mesh int dum_int; CCMIOReadOpt1i( &error, cellID, "CellTopologyType", &dum_int, CCMIOINDEXC( kCCMIOStart ), CCMIOINDEXC( kCCMIOStart ) + 1 ); if( kCCMIONoErr != error ) return MB_SUCCESS; // OK, we have topo types; first get the map node std::vector< int > dum_ints( num_cells ); CCMIOReadCells( &error, cellID, &mapID, &dum_ints[0], CCMIOINDEXC( kCCMIOStart ), CCMIOINDEXC( kCCMIOStart ) + 1 ); CHK_SET_CCMERR( error, "Failed to get the map node" ); // Now read the map CCMIOReadMap( &error, mapID, &dum_ints[0], CCMIOINDEXC( kCCMIOStart ), CCMIOINDEXC( kCCMIOEnd ) ); CHK_SET_CCMERR( error, "Failed to get cell ids" ); int i; for( i = 0; i < num_cells; i++ ) cell_topo_types[dum_ints[i]] = 0; // Now read the cell topo types for real, reusing cell_topo_types std::vector< int > topo_types( num_cells ); CCMIOReadOpt1i( &error, cellID, "CellTopologyType", &topo_types[0], CCMIOINDEXC( kCCMIOStart ), CCMIOINDEXC( kCCMIOEnd ) ); CHK_SET_CCMERR( error, "Failed to get cell topo types" ); for( i = 0; i < num_cells; i++ ) cell_topo_types[dum_ints[i]] = topo_types[i]; return MB_SUCCESS; }
ErrorCode moab::ReadCCMIO::read_vertices | ( | CCMIOSize_t | proc, |
CCMIOID | processorID, | ||
CCMIOID | verticesID, | ||
CCMIOID | topologyID, | ||
Range * | verts, | ||
TupleList & | vert_map | ||
) | [private] |
Definition at line 1093 of file ReadCCMIO.cpp.
References CHK_SET_CCMERR, moab::error(), ErrorCode, moab::ReadUtilIface::get_node_coords(), MB_CHK_SET_ERR, MB_START_ID, MB_SUCCESS, mbImpl, moab::Range::merge(), mGlobalIdTag, readMeshIface, and moab::Interface::tag_set_data().
Referenced by read_processor().
{ CCMIOError error = kCCMIONoErr; // Pre-read the number of vertices, so we can pre-allocate & read directly in CCMIOSize_t nverts = CCMIOSIZEC( 0 ); CCMIOEntitySize( &error, verticesID, &nverts, NULL ); CHK_SET_CCMERR( error, "Couldn't get number of vertices" ); // Get # dimensions CCMIOSize_t dims; float scale; CCMIOReadVerticesf( &error, verticesID, &dims, NULL, NULL, NULL, CCMIOINDEXC( 0 ), CCMIOINDEXC( 1 ) ); CHK_SET_CCMERR( error, "Couldn't get number of dimensions" ); // Allocate vertex space EntityHandle node_handle = 0; std::vector< double* > arrays; readMeshIface->get_node_coords( 3, GETINT32( nverts ), MB_START_ID, node_handle, arrays ); // Read vertex coords CCMIOID mapID; std::vector< double > tmp_coords( GETINT32( dims ) * GETINT32( nverts ) ); CCMIOReadVerticesd( &error, verticesID, &dims, &scale, &mapID, &tmp_coords[0], CCMIOINDEXC( 0 ), CCMIOINDEXC( 0 + nverts ) ); CHK_SET_CCMERR( error, "Trouble reading vertex coordinates" ); // Copy interleaved coords into moab blocked coordinate space int i = 0, threei = 0; for( ; i < nverts; i++ ) { arrays[0][i] = tmp_coords[threei++]; arrays[1][i] = tmp_coords[threei++]; if( 3 == GETINT32( dims ) ) arrays[2][i] = tmp_coords[threei++]; else arrays[2][i] = 0.0; } // Scale, if necessary if( 1.0 != scale ) { for( i = 0; i < nverts; i++ ) { arrays[0][i] *= scale; arrays[1][i] *= scale; if( 3 == GETINT32( dims ) ) arrays[2][i] *= scale; } } // Read gids for vertices std::vector< int > gids( GETINT32( nverts ) ); CCMIOReadMap( &error, mapID, &gids[0], CCMIOINDEXC( kCCMIOStart ), CCMIOINDEXC( kCCMIOEnd ) ); CHK_SET_CCMERR( error, "Trouble reading vertex global ids" ); // Put new vertex handles into range, and set gids for them Range new_verts( node_handle, node_handle + nverts - 1 ); ErrorCode rval = mbImpl->tag_set_data( mGlobalIdTag, new_verts, &gids[0] );MB_CHK_SET_ERR( rval, "Couldn't set gids on vertices" ); // Pack vert_map with global ids and handles for these vertices #ifdef TUPLE_LIST vert_map.resize( GETINT32( nverts ) ); for( i = 0; i < GETINT32( nverts ); i++ ) { vert_map.push_back( NULL, &gids[i], &node_handle, NULL ); #else for( i = 0; i < GETINT32( nverts ); i++ ) { ( vert_map[gids[i]] ).push_back( node_handle ); #endif node_handle += 1; } if( verts ) verts->merge( new_verts ); return MB_SUCCESS; }
bool moab::ReadCCMIO::hasSolution [private] |
Definition at line 169 of file ReadCCMIO.hpp.
Referenced by get_processors().
Interface* moab::ReadCCMIO::mbImpl [private] |
Definition at line 163 of file ReadCCMIO.hpp.
Referenced by construct_cells(), create_cell_from_faces(), get_dbl_option(), get_int_option(), get_str_option(), load_file(), load_matset_data(), load_metadata(), load_neuset_data(), make_faces(), read_faces(), read_gids_and_types(), read_vertices(), and ~ReadCCMIO().
Tag moab::ReadCCMIO::mBoundaryTypeTag [private] |
Definition at line 161 of file ReadCCMIO.hpp.
Referenced by load_neuset_data().
Tag moab::ReadCCMIO::mColorIdxTag [private] |
Definition at line 159 of file ReadCCMIO.hpp.
Referenced by load_matset_data().
Tag moab::ReadCCMIO::mCreatingProgramTag [private] |
Definition at line 161 of file ReadCCMIO.hpp.
Referenced by load_metadata().
Tag moab::ReadCCMIO::mDirichletSetTag [private] |
Definition at line 153 of file ReadCCMIO.hpp.
Referenced by ReadCCMIO().
Tag moab::ReadCCMIO::mFreeSurfaceMaterialTag [private] |
Definition at line 159 of file ReadCCMIO.hpp.
Referenced by load_matset_data().
Tag moab::ReadCCMIO::mGlobalIdTag [private] |
Definition at line 156 of file ReadCCMIO.hpp.
Referenced by construct_cells(), read_faces(), read_gids_and_types(), read_vertices(), and ReadCCMIO().
Tag moab::ReadCCMIO::mGroupIdTag [private] |
Definition at line 159 of file ReadCCMIO.hpp.
Referenced by load_matset_data().
Tag moab::ReadCCMIO::mHasMidNodesTag [private] |
Definition at line 155 of file ReadCCMIO.hpp.
Referenced by ReadCCMIO().
Tag moab::ReadCCMIO::mLightMaterialTag [private] |
Definition at line 159 of file ReadCCMIO.hpp.
Referenced by load_matset_data().
Tag moab::ReadCCMIO::mMaterialIdTag [private] |
Definition at line 158 of file ReadCCMIO.hpp.
Referenced by load_matset_data().
Tag moab::ReadCCMIO::mMaterialSetTag [private] |
Cached tags for reading. Note that all these tags are defined when the core is initialized.
Definition at line 152 of file ReadCCMIO.hpp.
Referenced by load_matset_data(), and ReadCCMIO().
Tag moab::ReadCCMIO::mMaterialTypeTag [private] |
Definition at line 158 of file ReadCCMIO.hpp.
Referenced by load_matset_data().
Tag moab::ReadCCMIO::mNameTag [private] |
Definition at line 157 of file ReadCCMIO.hpp.
Referenced by load_matset_data(), load_neuset_data(), and ReadCCMIO().
Tag moab::ReadCCMIO::mNeumannSetTag [private] |
Definition at line 154 of file ReadCCMIO.hpp.
Referenced by load_neuset_data(), read_faces(), and ReadCCMIO().
Tag moab::ReadCCMIO::mPorosityIdTag [private] |
Definition at line 159 of file ReadCCMIO.hpp.
Referenced by load_matset_data().
Tag moab::ReadCCMIO::mProcessorIdTag [private] |
Definition at line 159 of file ReadCCMIO.hpp.
Referenced by load_matset_data().
Tag moab::ReadCCMIO::mProstarRegionNumberTag [private] |
Definition at line 161 of file ReadCCMIO.hpp.
Referenced by load_neuset_data().
Tag moab::ReadCCMIO::mRadiationTag [private] |
Definition at line 159 of file ReadCCMIO.hpp.
Referenced by load_matset_data().
Tag moab::ReadCCMIO::mSpinIdTag [private] |
Definition at line 159 of file ReadCCMIO.hpp.
Referenced by load_matset_data().
Tag moab::ReadCCMIO::mThicknessTag [private] |
Definition at line 161 of file ReadCCMIO.hpp.
Referenced by load_matset_data().
std::map< int, EntityHandle > moab::ReadCCMIO::newMatsets [private] |
Definition at line 167 of file ReadCCMIO.hpp.
Referenced by load_matset_data(), and read_gids_and_types().
std::map< int, EntityHandle > moab::ReadCCMIO::newNeusets [private] |
Definition at line 167 of file ReadCCMIO.hpp.
Referenced by load_neuset_data(), and read_faces().
ReadUtilIface* moab::ReadCCMIO::readMeshIface [private] |
Definition at line 165 of file ReadCCMIO.hpp.
Referenced by read_vertices(), ReadCCMIO(), and ~ReadCCMIO().