Mesh Oriented datABase
(version 5.4.1)
Array-based unstructured mesh datastructure
|
#include <ReadSms.hpp>
Public Member Functions | |
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. | |
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. | |
ReadSms (Interface *impl=NULL) | |
Constructor. | |
virtual | ~ReadSms () |
Destructor. | |
Static Public Member Functions | |
static ReaderIface * | factory (Interface *) |
factory method | |
Private Member Functions | |
ErrorCode | add_entities (EntityHandle start, EntityHandle count, const Tag *file_id_tag) |
ErrorCode | load_file_impl (FILE *file, const Tag *file_id_tag) |
ErrorCode | get_set (std::vector< EntityHandle > *sets, int set_type, int set_id, Tag set_tag, EntityHandle &this_set, const Tag *file_id_tag) |
ErrorCode | read_parallel_info (FILE *file_ptr) |
Private Attributes | |
ReadUtilIface * | readMeshIface |
Interface * | mdbImpl |
interface instance | |
Tag | globalId |
Tag | paramCoords |
Tag | geomDimension |
int | setId |
Definition at line 15 of file ReadSms.hpp.
ReadSms::ReadSms | ( | Interface * | impl = NULL | ) |
Constructor.
Definition at line 56 of file ReadSms.cpp.
References mdbImpl, moab::Interface::query_interface(), and readMeshIface.
Referenced by factory().
: mdbImpl( impl ), globalId( 0 ), paramCoords( 0 ), geomDimension( 0 ), setId( 0 ) { mdbImpl->query_interface( readMeshIface ); }
ReadSms::~ReadSms | ( | ) | [virtual] |
Destructor.
Definition at line 61 of file ReadSms.cpp.
References mdbImpl, readMeshIface, and moab::Interface::release_interface().
{ if( readMeshIface ) { mdbImpl->release_interface( readMeshIface ); readMeshIface = 0; } }
ErrorCode ReadSms::add_entities | ( | EntityHandle | start, |
EntityHandle | count, | ||
const Tag * | file_id_tag | ||
) | [private] |
Definition at line 483 of file ReadSms.cpp.
References moab::ReadUtilIface::assign_ids(), moab::Range::insert(), and readMeshIface.
Referenced by load_file_impl().
{ if( !count || !file_id_tag ) return MB_FAILURE; Range range; range.insert( start, start + count - 1 ); return readMeshIface->assign_ids( *file_id_tag, range, 1 ); }
ReaderIface * ReadSms::factory | ( | Interface * | iface | ) | [static] |
factory method
Definition at line 51 of file ReadSms.cpp.
References ReadSms().
Referenced by moab::ReaderWriterSet::ReaderWriterSet().
ErrorCode ReadSms::get_set | ( | std::vector< EntityHandle > * | sets, |
int | set_type, | ||
int | set_id, | ||
Tag | set_tag, | ||
EntityHandle & | this_set, | ||
const Tag * | file_id_tag | ||
) | [private] |
Definition at line 401 of file ReadSms.cpp.
References moab::Interface::create_meshset(), ErrorCode, globalId, MB_FILE_WRITE_ERROR, MB_SUCCESS, mdbImpl, MESHSET_SET, setId, size, and moab::Interface::tag_set_data().
Referenced by load_file_impl().
{ ErrorCode result = MB_SUCCESS; if( set_dim < 0 || set_dim > 3 ) return MB_FILE_WRITE_ERROR; if( (int)sets[set_dim].size() <= set_id || !sets[set_dim][set_id] ) { if( (int)sets[set_dim].size() <= set_id ) sets[set_dim].resize( set_id + 1, 0 ); if( !sets[set_dim][set_id] ) { result = mdbImpl->create_meshset( MESHSET_SET, sets[set_dim][set_id] ); if( MB_SUCCESS != result ) return result; result = mdbImpl->tag_set_data( globalId, &sets[set_dim][set_id], 1, &set_id ); if( MB_SUCCESS != result ) return result; result = mdbImpl->tag_set_data( dim_tag, &sets[set_dim][set_id], 1, &set_dim ); if( MB_SUCCESS != result ) return result; if( file_id_tag ) { result = mdbImpl->tag_set_data( *file_id_tag, &sets[set_dim][set_id], 1, &setId ); ++setId; } } } this_set = sets[set_dim][set_id]; return result; }
ErrorCode ReadSms::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 79 of file ReadSms.cpp.
References ErrorCode, load_file_impl(), MB_FILE_DOES_NOT_EXIST, MB_SET_ERR, MB_UNSUPPORTED_OPERATION, and setId.
{ if( subset_list ) { MB_SET_ERR( MB_UNSUPPORTED_OPERATION, "Reading subset of files not supported for Sms" ); } setId = 1; // Open file FILE* file_ptr = fopen( filename, "r" ); if( !file_ptr ) { MB_SET_ERR( MB_FILE_DOES_NOT_EXIST, filename << ": " << strerror( errno ) ); } const ErrorCode result = load_file_impl( file_ptr, file_id_tag ); fclose( file_ptr ); return result; }
ErrorCode ReadSms::load_file_impl | ( | FILE * | file, |
const Tag * | file_id_tag | ||
) | [private] |
Definition at line 105 of file ReadSms.cpp.
References add_entities(), moab::Interface::add_entities(), moab::ReadUtilIface::assign_ids(), moab::Range::begin(), CHECK, CHECKN, moab::Range::clear(), moab::Interface::create_element(), ErrorCode, GEOM_DIMENSION_TAG_NAME, geomDimension, moab::Interface::get_adjacencies(), moab::ReadUtilIface::get_element_connect(), moab::ReadUtilIface::get_node_coords(), moab::ReadUtilIface::get_ordered_vertices(), get_set(), globalId, moab::Interface::globalId_tag(), moab::MAX_SUB_ENTITIES, MB_CHK_ERR, MB_FILE_WRITE_ERROR, MB_START_ID, MB_SUCCESS, MB_TAG_CREAT, MB_TAG_DENSE, MB_TAG_SPARSE, MB_TYPE_DOUBLE, MB_TYPE_INTEGER, MBEDGE, MBTRI, mdbImpl, paramCoords, read_parallel_info(), readMeshIface, moab::Range::size(), moab::Interface::tag_get_handle(), moab::Interface::tag_set_data(), and moab::CN::VerticesPerEntity().
Referenced by load_file().
{ bool warned = false; double dum_params[] = { 0.0, 0.0, 0.0 }; globalId = mdbImpl->globalId_tag(); ErrorCode result = mdbImpl->tag_get_handle( "PARAMETER_COORDS", 3, MB_TYPE_DOUBLE, paramCoords, MB_TAG_DENSE | MB_TAG_CREAT ); CHECK( "Failed to create param coords tag." ); int negone = -1; result = mdbImpl->tag_get_handle( GEOM_DIMENSION_TAG_NAME, 1, MB_TYPE_INTEGER, geomDimension, MB_TAG_SPARSE | MB_TAG_CREAT, &negone ); CHECK( "Failed to create geom dim tag." ); int n; char line[256], all_line[1024]; int file_type; if( fgets( all_line, sizeof( all_line ), file_ptr ) == NULL ) { return MB_FAILURE; } if( sscanf( all_line, "%s %d", line, &file_type ) != 2 ) { return MB_FAILURE; } if( 3 == file_type ) { result = read_parallel_info( file_ptr ); CHECK( "Failed to read parallel info." ); } int nregions, nfaces, nedges, nvertices, npoints; n = fscanf( file_ptr, "%d %d %d %d %d", &nregions, &nfaces, &nedges, &nvertices, &npoints ); CHECKN( 5 ); if( nregions < 0 || nfaces < 0 || nedges < 0 || nvertices < 0 || npoints < 0 ) return MB_FILE_WRITE_ERROR; // Create the vertices std::vector< double* > coord_arrays; EntityHandle vstart = 0; result = readMeshIface->get_node_coords( 3, nvertices, MB_START_ID, vstart, coord_arrays ); CHECK( "Failed to get node arrays." ); if( file_id_tag ) { result = add_entities( vstart, nvertices, file_id_tag );MB_CHK_ERR( result ); } EntityHandle this_gent, new_handle; std::vector< EntityHandle > gentities[4]; int gent_id, dum_int; int gent_type, num_connections; for( int i = 0; i < nvertices; i++ ) { n = fscanf( file_ptr, "%d", &gent_id ); CHECKN( 1 ); if( !gent_id ) continue; n = fscanf( file_ptr, "%d %d %lf %lf %lf", &gent_type, &num_connections, coord_arrays[0] + i, coord_arrays[1] + i, coord_arrays[2] + i ); CHECKN( 5 ); result = get_set( gentities, gent_type, gent_id, geomDimension, this_gent, file_id_tag );MB_CHK_ERR( result ); new_handle = vstart + i; result = mdbImpl->add_entities( this_gent, &new_handle, 1 ); CHECK( "Adding vertex to geom set failed." ); switch( gent_type ) { case 1: n = fscanf( file_ptr, "%le", dum_params ); CHECKN( 1 ); result = mdbImpl->tag_set_data( paramCoords, &new_handle, 1, dum_params ); CHECK( "Failed to set param coords tag for vertex." ); break; case 2: n = fscanf( file_ptr, "%le %le %d", dum_params, dum_params + 1, &dum_int ); CHECKN( 3 ); dum_params[2] = dum_int; result = mdbImpl->tag_set_data( paramCoords, &new_handle, 1, dum_params ); CHECK( "Failed to set param coords tag for vertex." ); break; default: break; } } // End of reading vertices // ******************************* // Read Edges // ******************************* int vert1, vert2, num_pts; std::vector< EntityHandle > everts( 2 ); EntityHandle estart, *connect; result = readMeshIface->get_element_connect( nedges, 2, MBEDGE, 1, estart, connect ); CHECK( "Failed to create array of edges." ); if( file_id_tag ) { result = add_entities( estart, nedges, file_id_tag ); if( MB_SUCCESS != result ) return result; } for( int i = 0; i < nedges; i++ ) { n = fscanf( file_ptr, "%d", &gent_id ); CHECKN( 1 ); if( !gent_id ) continue; n = fscanf( file_ptr, "%d %d %d %d %d", &gent_type, &vert1, &vert2, &num_connections, &num_pts ); CHECKN( 5 ); if( vert1 < 1 || vert1 > nvertices ) return MB_FILE_WRITE_ERROR; if( vert2 < 1 || vert2 > nvertices ) return MB_FILE_WRITE_ERROR; connect[0] = vstart + vert1 - 1; connect[1] = vstart + vert2 - 1; if( num_pts > 1 && !warned ) { std::cout << "Warning: num_points > 1 not supported; choosing last one." << std::endl; warned = true; } result = get_set( gentities, gent_type, gent_id, geomDimension, this_gent, file_id_tag ); CHECK( "Problem getting geom set for edge." ); new_handle = estart + i; result = mdbImpl->add_entities( this_gent, &new_handle, 1 ); CHECK( "Failed to add edge to geom set." ); connect += 2; for( int j = 0; j < num_pts; j++ ) { switch( gent_type ) { case 1: n = fscanf( file_ptr, "%le", dum_params ); CHECKN( 1 ); result = mdbImpl->tag_set_data( paramCoords, &new_handle, 1, dum_params ); CHECK( "Failed to set param coords tag for edge." ); break; case 2: n = fscanf( file_ptr, "%le %le %d", dum_params, dum_params + 1, &dum_int ); CHECKN( 3 ); dum_params[2] = dum_int; result = mdbImpl->tag_set_data( paramCoords, &new_handle, 1, dum_params ); CHECK( "Failed to set param coords tag for edge." ); break; default: break; } } } // End of reading edges // ******************************* // Read Faces // ******************************* std::vector< EntityHandle > bound_ents, bound_verts, new_faces; int bound_id; Range shverts; new_faces.resize( nfaces ); int num_bounding; for( int i = 0; i < nfaces; i++ ) { n = fscanf( file_ptr, "%d", &gent_id ); CHECKN( 1 ); if( !gent_id ) continue; n = fscanf( file_ptr, "%d %d", &gent_type, &num_bounding ); CHECKN( 2 ); result = get_set( gentities, gent_type, gent_id, geomDimension, this_gent, file_id_tag ); CHECK( "Problem getting geom set for face." ); bound_ents.resize( num_bounding + 1 ); bound_verts.resize( num_bounding ); for( int j = 0; j < num_bounding; j++ ) { n = fscanf( file_ptr, "%d ", &bound_id ); CHECKN( 1 ); if( 0 > bound_id ) bound_id = abs( bound_id ); assert( 0 < bound_id && bound_id <= nedges ); if( bound_id < 1 || bound_id > nedges ) return MB_FILE_WRITE_ERROR; bound_ents[j] = estart + abs( bound_id ) - 1; } // Convert edge-based model to vertex-based one for( int j = 0; j < num_bounding; j++ ) { if( j == num_bounding - 1 ) bound_ents[j + 1] = bound_ents[0]; result = mdbImpl->get_adjacencies( &bound_ents[j], 2, 0, false, shverts ); CHECK( "Failed to get vertices bounding edge." ); assert( shverts.size() == 1 ); bound_verts[j] = *shverts.begin(); shverts.clear(); } result = mdbImpl->create_element( (EntityType)( MBTRI + num_bounding - 3 ), &bound_verts[0], bound_verts.size(), new_faces[i] ); CHECK( "Failed to create edge." ); result = mdbImpl->add_entities( this_gent, &new_faces[i], 1 ); CHECK( "Failed to add edge to geom set." ); int num_read = fscanf( file_ptr, "%d", &num_pts ); if( !num_pts || !num_read ) continue; for( int j = 0; j < num_pts; j++ ) { switch( gent_type ) { case 1: n = fscanf( file_ptr, "%le", dum_params ); CHECKN( 1 ); result = mdbImpl->tag_set_data( paramCoords, &new_faces[i], 1, dum_params ); CHECK( "Failed to set param coords tag for face." ); break; case 2: n = fscanf( file_ptr, "%le %le %d", dum_params, dum_params + 1, &dum_int ); CHECKN( 3 ); dum_params[2] = dum_int; result = mdbImpl->tag_set_data( paramCoords, &new_faces[i], 1, dum_params ); CHECK( "Failed to set param coords tag for face." ); break; default: break; } } } // End of reading faces if( file_id_tag ) { result = readMeshIface->assign_ids( *file_id_tag, &new_faces[0], new_faces.size(), 1 ); if( MB_SUCCESS != result ) return result; } // ******************************* // Read Regions // ******************************* int sense[MAX_SUB_ENTITIES]; bound_verts.resize( MAX_SUB_ENTITIES ); std::vector< EntityHandle > regions; if( file_id_tag ) regions.resize( nregions ); for( int i = 0; i < nregions; i++ ) { n = fscanf( file_ptr, "%d", &gent_id ); CHECKN( 1 ); if( !gent_id ) continue; result = get_set( gentities, 3, gent_id, geomDimension, this_gent, file_id_tag ); CHECK( "Couldn't get geom set for region." ); n = fscanf( file_ptr, "%d", &num_bounding ); CHECKN( 1 ); bound_ents.resize( num_bounding ); for( int j = 0; j < num_bounding; j++ ) { n = fscanf( file_ptr, "%d ", &bound_id ); CHECKN( 1 ); assert( abs( bound_id ) < (int)new_faces.size() + 1 && bound_id ); if( !bound_id || abs( bound_id ) > nfaces ) return MB_FILE_WRITE_ERROR; sense[j] = ( bound_id < 0 ) ? -1 : 1; bound_ents[j] = new_faces[abs( bound_id ) - 1]; } EntityType etype; result = readMeshIface->get_ordered_vertices( &bound_ents[0], sense, num_bounding, 3, &bound_verts[0], etype ); CHECK( "Failed in get_ordered_vertices." ); // Make the element result = mdbImpl->create_element( etype, &bound_verts[0], CN::VerticesPerEntity( etype ), new_handle ); CHECK( "Failed to create region." ); result = mdbImpl->add_entities( this_gent, &new_handle, 1 ); CHECK( "Failed to add region to geom set." ); if( file_id_tag ) regions[i] = new_handle; n = fscanf( file_ptr, "%d ", &dum_int ); CHECKN( 1 ); } // End of reading regions if( file_id_tag ) { result = readMeshIface->assign_ids( *file_id_tag, ®ions[0], regions.size(), 1 ); if( MB_SUCCESS != result ) return result; } return MB_SUCCESS; }
ErrorCode ReadSms::read_parallel_info | ( | FILE * | file_ptr | ) | [private] |
Definition at line 438 of file ReadSms.cpp.
References MB_SUCCESS, and nparts.
Referenced by load_file_impl().
{ // ErrorCode result; // Read partition info int nparts, part_id, num_ifaces, num_corner_ents; int num_read = fscanf( file_ptr, "%d %d %d %d", &nparts, &part_id, &num_ifaces, &num_corner_ents ); if( !num_read ) return MB_FAILURE; // Read interfaces int iface_id, iface_dim, iface_own, num_iface_corners; // EntityHandle this_iface; std::vector< int >* iface_corners = NULL; for( int i = 0; i < num_ifaces; i++ ) { num_read = fscanf( file_ptr, "%d %d %d %d", &iface_id, &iface_dim, &iface_own, &num_iface_corners ); if( !num_read ) return MB_FAILURE; // result = get_set(sets, iface_dim, iface_id, dim_tag, iface_own, this_iface); // CHECK("Failed to make iface set."); // Read the corner ids and store them on the set for now iface_corners = new std::vector< int >( num_iface_corners ); for( int j = 0; j < num_iface_corners; j++ ) { num_read = fscanf( file_ptr, "%d", &( *iface_corners )[j] ); if( !num_read ) { delete iface_corners; return MB_FAILURE; } } // result = tag_set_data(ifaceCornerTag, &this_iface, 1, //&iface_corners); // CHECK("Failed to set iface corner tag."); delete iface_corners; iface_corners = NULL; } // Interface data has been read return MB_SUCCESS; }
ErrorCode ReadSms::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 |
||
) | [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 70 of file ReadSms.cpp.
References MB_NOT_IMPLEMENTED.
{ return MB_NOT_IMPLEMENTED; }
Tag moab::ReadSms::geomDimension [private] |
Definition at line 59 of file ReadSms.hpp.
Referenced by load_file_impl().
Tag moab::ReadSms::globalId [private] |
Definition at line 59 of file ReadSms.hpp.
Referenced by get_set(), and load_file_impl().
Interface* moab::ReadSms::mdbImpl [private] |
interface instance
Definition at line 57 of file ReadSms.hpp.
Referenced by get_set(), load_file_impl(), ReadSms(), and ~ReadSms().
Tag moab::ReadSms::paramCoords [private] |
Definition at line 59 of file ReadSms.hpp.
Referenced by load_file_impl().
ReadUtilIface* moab::ReadSms::readMeshIface [private] |
Definition at line 54 of file ReadSms.hpp.
Referenced by add_entities(), load_file_impl(), ReadSms(), and ~ReadSms().
int moab::ReadSms::setId [private] |
Definition at line 61 of file ReadSms.hpp.
Referenced by get_set(), and load_file().